/* ** Copyright 1995-2095, Silicon Graphics, Inc. ** All Rights Reserved. ** ** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.; ** the contents of this file may not be disclosed to third parties, copied or ** duplicated in any form, in whole or in part, without the prior written ** permission of Silicon Graphics, Inc. ** ** RESTRICTED RIGHTS LEGEND: ** Use, duplication or disclosure by the Government is subject to restrictions ** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data ** and Computer Software clause at DFARS 252.227-7013, and/or in similar or ** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - ** rights reserved under the Copyright Laws of the United States. */ #include "glsutil.h" #include #include #if __GLS_PLATFORM_WIN32 #include #include #define __MAIN_LINKAGE __cdecl #else /* !__GLS_PLATFORM_WIN32 */ #define __MAIN_LINKAGE #endif /* __GLS_PLATFORM_WIN32 */ static struct { GLubyte **argv; } global; static void glscat_configStdio(void) { setbuf(stdin, GLS_NONE); setbuf(stdout, GLS_NONE); #if __GLS_PLATFORM_WIN32 _setmode(_fileno(stdin), _O_BINARY); _setmode(_fileno(stdout), _O_BINARY); _setmode(_fileno(stderr), _O_BINARY); #endif /* __GLS_PLATFORM_WIN32 */ } static void glscat_checkError(void) { const GLSenum error = glsGetError(GL_TRUE); if (error) { fprintf( stderr, "%s fatal: %s\n", global.argv[0], glsEnumString(GLS_API_GLS, error) ); exit(EXIT_FAILURE); } } static void glscat_usage(void) { fprintf( stderr, "usage: %s " "[-a] [-c] [-d dir]* [-h] [-o out] [-r] [-t type] [in]*\n" " -a: append\n" " -c: copy through context\n" " -d: prepend dir to search path\n" " -h: help\n" " -o: output stream (default: standard output)\n" " -r: recursive copy\n" " -t: type of output stream, one of:\n" " GLS_NONE (default: same as input stream)\n" " GLS_BINARY_LSB_FIRST (little-endian binary)\n" " GLS_BINARY_MSB_FIRST (big-endian binary)\n" " GLS_BINARY_SWAP0 (native binary)\n" " GLS_BINARY_SWAP1 (swapped binary)\n" " GLS_TEXT (human-editable)\n", global.argv[0] ); exit(EXIT_FAILURE); } int __MAIN_LINKAGE main(const GLsizei inArgc, GLubyte *inArgv[]) { GLint arg; GLboolean context = GL_FALSE; __GLSstring dir; __GLSstring inStream; __GLSstring outStream; GLboolean recursive = GL_FALSE; GLSenum type = GLS_NONE; GLbitfield writeFlags = GLS_NONE; glscat_configStdio(); __glsString_init(&dir); __glsString_init(&inStream); __glsString_init(&outStream); global.argv = inArgv; glsContext(glsGenContext()); for (arg = 1 ; arg < inArgc && inArgv[arg][0] == '-' ; ++arg) { if (inArgv[arg][2]) glscat_usage(); switch (inArgv[arg][1]) { case 'a': writeFlags |= GLS_WRITE_APPEND_BIT; break; case 'c': context = GL_TRUE; break; case 'd': if (++arg >= inArgc) glscat_usage(); __glsString_assign(&dir, inArgv[arg]); __glsString_appendChar(&dir, '/'); glsReadPrefix(GLS_PREPEND, dir.head); break; case 'o': if (++arg >= inArgc) glscat_usage(); __glsString_assign(&outStream, inArgv[arg]); break; case 'r': recursive = GL_TRUE; break; case 't': if (++arg >= inArgc) glscat_usage(); if ( !strcmp((const char *)inArgv[arg], "GLS_NONE") ) { type = GLS_NONE; } else if ( !strcmp((const char *)inArgv[arg], "GLS_BINARY_LSB_FIRST") ) { type = GLS_BINARY_LSB_FIRST; } else if ( !strcmp((const char *)inArgv[arg], "GLS_BINARY_MSB_FIRST") ) { type = GLS_BINARY_MSB_FIRST; } else if ( !strcmp((const char *)inArgv[arg], "GLS_BINARY_SWAP0") ) { type = glsBinary(GL_FALSE); } else if ( !strcmp((const char *)inArgv[arg], "GLS_BINARY_SWAP1") ) { type = glsBinary(GL_TRUE); } else if ( !strcmp((const char *)inArgv[arg], "GLS_TEXT") ) { type = GLS_TEXT; } else { glscat_usage(); } break; case 'h': default: glscat_usage(); } } glscat_checkError(); if (recursive) { glsCaptureFlags(GLS_OP_glsCallStream, GLS_CAPTURE_EXECUTE_BIT); } do { if (arg < inArgc) __glsString_assign(&inStream, inArgv[arg]); if (context) { GLSenum copyType = glsCopyStream( inStream.head, glsCSTR(""), GLS_CONTEXT, GLS_NONE ); if (type != GLS_NONE) copyType = type; glsCopyStream(glsCSTR(""), outStream.head, copyType, writeFlags); } else { glsCopyStream(inStream.head, outStream.head, type, writeFlags); } glscat_checkError(); writeFlags |= GLS_WRITE_APPEND_BIT; } while (++arg < inArgc); return EXIT_SUCCESS; }