windows-nt/Source/XPSP1/NT/multimedia/opengl/gls/cmd/glscat.c
2020-09-26 16:20:57 +08:00

175 lines
5.7 KiB
C

/*
** 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 <stdlib.h>
#include <string.h>
#if __GLS_PLATFORM_WIN32
#include <fcntl.h>
#include <io.h>
#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;
}