/*
** 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.
*/

/******************************************************************************
__GLSreadStream
******************************************************************************/

typedef struct {
    FILE *channel;
    __GLSstring name;
    GLboolean opened;
    GLSreadFunc readFunc;
    GLSwriteFunc unreadFunc;
} __GLSreadStream;

extern __GLSreadStream* __glsReadStream_create(const GLubyte *inName);
extern __GLSreadStream* __glsReadStream_destroy(__GLSreadStream *inStream);
extern GLbitfield __glsReadStream_getAttrib(const __GLSreadStream *inStream);
extern size_t __glsReadStream_getByteCount(const __GLSreadStream *inStream);
extern GLuint __glsReadStream_getCRC32(const __GLSreadStream *inStream);
extern GLSenum __glsReadStream_getType(const __GLSreadStream *inStream);

/******************************************************************************
__GLSreader
******************************************************************************/

#define __GLS_GET_SPACE(inoutReader) { \
    GLboolean __comment = GL_FALSE; \
    GLubyte __spaceChar; \
    do { \
        __GLS_READ_CHAR(inoutReader, __spaceChar); \
        switch (__spaceChar) { \
            case '#': \
                __comment = GL_TRUE; \
                break; \
            case '\n': \
            case '\r': \
                __comment = GL_FALSE; \
                break; \
        } \
    } while (__GLS_CHAR_IS_SPACE(__spaceChar) || __comment); \
    __GLS_UNREAD_CHAR(inoutReader); \
}

#define __GLS_READ_CHAR(inoutReader, outChar) \
    if ( \
        inoutReader->readPtr >= inoutReader->readTail && \
        !__glsReader_fillBuf(inoutReader, 1, GL_FALSE) \
    ) { \
        outChar = 0; \
    } else { \
        outChar = *inoutReader->readPtr++; \
    }

#define __GLS_UNREAD_CHAR(inoutReader) \
    if (inoutReader->readPtr > inoutReader->buf) --inoutReader->readPtr;

typedef struct __GLSreader {
    GLubyte *buf;
    size_t bufSize;
    GLSenum error;
    GLint paramCount;
    GLubyte *readHead;
    GLubyte *readPtr;
    GLubyte *readTail;
    const __GLSreadStream *stream;
    GLSenum type;
    __GLSversion version;
} __GLSreader;

extern GLvoid* __glsReader_allocCallBuf(
    __GLSreader *inoutReader, size_t inByteCount
);

extern GLvoid* __glsReader_allocFeedbackBuf(
    __GLSreader *inoutReader, size_t inByteCount
);

extern GLvoid* __glsReader_allocSelectBuf(
    __GLSreader *inoutReader, size_t inByteCount
);

#if __GL_EXT_vertex_array
    extern GLvoid* __glsReader_allocVertexArrayBuf(
        __GLSreader *inoutReader, GLSopcode inOpcode, size_t inByteCount
    );
#endif /* __GL_EXT_vertex_array */

extern void __glsReader_call(__GLSreader *inoutReader);

extern __GLSreader* __glsReader_final(__GLSreader *inoutReader);

extern GLboolean __glsReader_fillBuf(
    __GLSreader *inoutReader, size_t inMinBytes, GLboolean inRealign
);

extern __GLSreader* __glsReader_init_array(
    __GLSreader *outReader, const GLubyte *inArray, size_t inCount
);

extern __GLSreader* __glsReader_init_stream(
    __GLSreader *outReader, const __GLSreadStream *inStream, size_t inBufSize
);

extern void __glsReader_raiseError(__GLSreader *inoutReader, GLSenum inError);

/******************************************************************************
__GLSreader binary
******************************************************************************/

extern GLboolean __glsReader_call_bin(__GLSreader *inoutReader);
extern GLboolean __glsReader_call_bin_swap(__GLSreader *inoutReader);

extern GLSenum __glsReader_readBeginGLS_bin(
    __GLSreader *inoutReader, __GLSversion *outVersion
);

/******************************************************************************
__GLSreader text
******************************************************************************/

extern GLboolean __glsReader_abortCommand_text(__GLSreader *inoutReader);

extern GLboolean __glsReader_beginCommand_text(
    __GLSreader *inoutReader, __GLSstring *outCommand
);

extern GLboolean __glsReader_call_text(__GLSreader *inoutReader);
extern GLboolean __glsReader_endCommand_text(__GLSreader *inoutReader);

extern GLboolean __glsReader_getGLSenum_text(
    __GLSreader *inoutReader, GLSenum *outVal
);

extern GLboolean __glsReader_getGLSimageFlags_text(
    __GLSreader *inoutReader, GLbitfield *outVal
);

extern GLboolean __glsReader_getGLSopcode_text(
    __GLSreader *inoutReader, GLSopcode *outVal
);

extern GLboolean __glsReader_getGLattribMask_text(
    __GLSreader *inoutReader, GLbitfield *outVal
);

extern GLboolean __glsReader_getGLblendingFactor_text(
    __GLSreader *inoutReader, GLenum *outVal
);

extern GLboolean __glsReader_getGLboolean_text(
    __GLSreader *inoutReader, GLboolean *outVal
);

extern GLboolean __glsReader_getGLbooleanv_text(
    __GLSreader *inoutReader, GLuint inCount, GLboolean *outVec
);

extern GLboolean __glsReader_getGLbyte_text(
    __GLSreader *inoutReader, GLbyte *outVal
);

extern GLboolean __glsReader_getGLbytev_text(
    __GLSreader *inoutReader, GLuint inCount, GLbyte *outVec
);

extern GLboolean __glsReader_getGLcharv_text(
    __GLSreader *inoutReader, __GLSstring *outString
);

extern GLboolean __glsReader_getGLclearBufferMask_text(
    __GLSreader *inoutReader, GLbitfield *outVal
);

extern GLboolean __glsReader_getGLcompv_text(
    __GLSreader *inoutReader, GLenum inType, GLuint inBytes, GLvoid *outVec
);

extern GLboolean __glsReader_getGLdouble_text(
    __GLSreader *inoutReader, GLdouble *outVal
);

extern GLboolean __glsReader_getGLdoublev_text(
    __GLSreader *inoutReader, GLuint inCount, GLdouble *outVec
);

extern GLboolean __glsReader_getGLdrawBufferMode_text(
    __GLSreader *inoutReader, GLenum *outVal
);

extern GLboolean __glsReader_getGLenum_text(
    __GLSreader *inoutReader, GLenum *outVal
);

extern GLboolean __glsReader_getGLfloat_text(
    __GLSreader *inoutReader, GLfloat *outVal
);

extern GLboolean __glsReader_getGLfloatv_text(
    __GLSreader *inoutReader, GLuint inCount, GLfloat *outVec
);

extern GLboolean __glsReader_getGLint_text(
    __GLSreader *inoutReader, GLint *outVal
);

extern GLboolean __glsReader_getGLintv_text(
    __GLSreader *inoutReader, GLuint inCount, GLint *outVec
);

extern GLboolean __glsReader_getGLlong_text(
    __GLSreader *inoutReader, GLlong *outVal
);

extern GLboolean __glsReader_getGLlongv_text(
    __GLSreader *inoutReader, GLuint inCount, GLlong *outVec
);

extern GLboolean __glsReader_getGLshort_text(
    __GLSreader *inoutReader, GLshort *outVal
);

extern GLboolean __glsReader_getGLshortv_text(
    __GLSreader *inoutReader, GLuint inCount, GLshort *outVec
);

extern GLboolean __glsReader_getGLstencilOp_text(
    __GLSreader *inoutReader, GLenum *outVal
);

extern GLboolean __glsReader_getGLtextureComponentCount_text(
    __GLSreader *inoutReader, GLint *outVal
);

extern GLboolean __glsReader_getGLubyte_text(
    __GLSreader *inoutReader, GLubyte *outVal
);

extern GLboolean __glsReader_getGLubytev_text(
    __GLSreader *inoutReader, GLuint inCount, GLubyte *outVec
);

extern GLboolean __glsReader_getGLuint_text(
    __GLSreader *inoutReader, GLuint *outVal
);

extern GLboolean __glsReader_getGLuintv_text(
    __GLSreader *inoutReader, GLuint inCount, GLuint *outVec
);

extern GLboolean __glsReader_getGLulong_text(
    __GLSreader *inoutReader, GLulong *outVal
);

extern GLboolean __glsReader_getGLulongv_text(
    __GLSreader *inoutReader, GLuint inCount, GLulong *outVec
);

extern GLboolean __glsReader_getGLushort_text(
    __GLSreader *inoutReader, GLushort *outVal
);

extern GLboolean __glsReader_getGLushortv_text(
    __GLSreader *inoutReader, GLuint inCount, GLushort *outVec
);

extern GLboolean __glsReader_nextList_text(__GLSreader *inoutReader);

extern GLSenum __glsReader_readBeginGLS_text(
    __GLSreader *inoutReader, __GLSversion *outVersion
);