#include <malloc.h>
#include "sexp.h"
+/*@access sexpOutputStream @*/
+
/*@unchecked@*/ /*@observer@*/
static char *hexDigits = "0123456789ABCDEF";
* Puts the character c out on the output stream os.
* Keeps track of the "column" the next output char will go to.
*/
-void putChar(sexpOutputStream *os, int c)
+void putChar(sexpOutputStream os, int c)
{
(void) putc(c,os->outputFile);
os->column++;
/* varPutChar(os,c)
* putChar with variable sized output bytes considered.
*/
-void varPutChar(sexpOutputStream *os, int c)
+void varPutChar(sexpOutputStream os, int c)
{
c &= 0xFF;
os->bits = (os->bits << 8) | c;
* Change os->byteSize to newByteSize
* record mode in output stream for automatic line breaks
*/
-void changeOutputByteSize(sexpOutputStream *os, int newByteSize, int mode)
+void changeOutputByteSize(sexpOutputStream os, int newByteSize, int mode)
{
if (newByteSize != 4 && newByteSize !=6 && newByteSize !=8)
ErrorMessage(ERROR,"Illegal output base %d.",newByteSize);
/* flushOutput(os)
* flush out any remaining bits
*/
-void flushOutput(sexpOutputStream * os)
+void flushOutput(sexpOutputStream os)
{ if (os->nBits > 0)
{
if (os->byteSize == 4)
* indentation level (but never indents more than half of maxcolumn).
* Resets column for next output character.
*/
-void newLine(sexpOutputStream *os, int mode)
+void newLine(sexpOutputStream os, int mode)
{ int i;
if (mode == ADVANCED || mode == BASE64)
{ os->putChar(os,'\n');
/* newSexpOutputStream()
* Creates and initializes new sexpOutputStream object.
*/
-sexpOutputStream *newSexpOutputStream(void)
+sexpOutputStream newSexpOutputStream(void)
{
- sexpOutputStream *os;
- os = (sexpOutputStream *) sexpAlloc(sizeof(*os));
+ sexpOutputStream os;
+ os = (sexpOutputStream) sexpAlloc(sizeof(*os));
os->column = 0;
os->maxcolumn = DEFAULTLINELENGTH;
os->indent = 0;
os->byteSize = 8;
os->bits = 0;
os->nBits = 0;
+/*@-assignexpose@*/
os->outputFile = stdout;
+/*@=assignexpose@*/
os->mode = CANONICAL;
return os;
}
/* printDecimal(os,n)
* print out n in decimal to output stream os
*/
-void printDecimal(sexpOutputStream *os, long int n)
+void printDecimal(sexpOutputStream os, long int n)
{ char buffer[50];
int i;
/*@-bufferoverflowhigh@*/
/* canonicalPrintVerbatimSimpleString(os,ss)
* Print out simple string ss on output stream os as verbatim string.
*/
-void canonicalPrintVerbatimSimpleString(sexpOutputStream *os, sexpSimpleString *ss)
+void canonicalPrintVerbatimSimpleString(sexpOutputStream os, sexpSimpleString *ss)
{
long int len = simpleStringLength(ss);
long int i;
/* canonicalPrintString(os,s)
* Prints out sexp string s onto output stream os
*/
-void canonicalPrintString(sexpOutputStream *os, sexpString *s)
+void canonicalPrintString(sexpOutputStream os, sexpString *s)
{ sexpSimpleString *ph, *ss;
ph = sexpStringPresentationHint(s);
if (ph != NULL) {
/* canonicalPrintList(os,list)
* Prints out the list "list" onto output stream os
*/
-void canonicalPrintList(sexpOutputStream *os, sexpList *list)
+void canonicalPrintList(sexpOutputStream os, sexpList *list)
{ sexpIter iter;
sexpObject *object;
varPutChar(os,'(');
* Prints out object on output stream os
* Note that this uses the common "type" field of lists and strings.
*/
-void canonicalPrintObject(sexpOutputStream *os, sexpObject *object)
+void canonicalPrintObject(sexpOutputStream os, sexpObject *object)
{
if (isObjectString(object))
canonicalPrintString(os,(sexpString *)object);
/* *************/
/* Same as canonical, except all characters get put out as base 64 ones */
-void base64PrintWholeObject(sexpOutputStream *os, sexpObject *object)
+void base64PrintWholeObject(sexpOutputStream os, sexpObject *object)
{
changeOutputByteSize(os,8,BASE64);
varPutChar(os,'{');
* Returns TRUE if simple string ss can be printed as a token.
* Doesn't begin with a digit, and all characters are tokenchars.
*/
-int canPrintAsToken(sexpOutputStream *os, sexpSimpleString *ss)
+int canPrintAsToken(sexpOutputStream os, sexpSimpleString *ss)
{
int i;
octet *c;
* Prints out simple string ss as a token (assumes that this is OK).
* May run over max-column, but there is no fragmentation allowed...
*/
-void advancedPrintTokenSimpleString(sexpOutputStream *os, sexpSimpleString *ss)
+void advancedPrintTokenSimpleString(sexpOutputStream os, sexpSimpleString *ss)
{ int i;
long int len;
octet *c;
* Print out simple string ss on output stream os as verbatim string.
* Again, can't fragment string, so max-column is just a suggestion...
*/
-void advancedPrintVerbatimSimpleString(sexpOutputStream *os, sexpSimpleString *ss)
+void advancedPrintVerbatimSimpleString(sexpOutputStream os, sexpSimpleString *ss)
{
long int len = simpleStringLength(ss);
long int i;
/* advancedPrintBase64SimpleString(os,ss)
* Prints out simple string ss as a base64 value.
*/
-void advancedPrintBase64SimpleString(sexpOutputStream *os, sexpSimpleString *ss)
+void advancedPrintBase64SimpleString(sexpOutputStream os, sexpSimpleString *ss)
{
long int i,len;
octet *c = simpleStringString(ss);
/* advancedPrintHexSimpleString(os,ss)
* Prints out simple string ss as a hexadecimal value.
*/
-void advancedPrintHexSimpleString(sexpOutputStream *os, sexpSimpleString *ss)
+void advancedPrintHexSimpleString(sexpOutputStream os, sexpSimpleString *ss)
{
long int i,len;
octet *c = simpleStringString(ss);
* so no escape sequences need to be generated.
* May run over max-column, but there is no fragmentation allowed...
*/
-void advancedPrintQuotedStringSimpleString(sexpOutputStream *os, sexpSimpleString *ss)
+void advancedPrintQuotedStringSimpleString(sexpOutputStream os, sexpSimpleString *ss)
{ long int i;
long int len = simpleStringLength(ss);
octet *c = simpleStringString(ss);
/* advancedPrintSimpleString(os,ss)
* Prints out simple string ss onto output stream ss
*/
-void advancedPrintSimpleString(sexpOutputStream *os, sexpSimpleString *ss)
+void advancedPrintSimpleString(sexpOutputStream os, sexpSimpleString *ss)
{ long int len = simpleStringLength(ss);
if (canPrintAsToken(os,ss))
advancedPrintTokenSimpleString(os,ss);
/* advancedPrintString(os,s)
* Prints out sexp string s onto output stream os
*/
-void advancedPrintString(sexpOutputStream *os, sexpString *s)
+void advancedPrintString(sexpOutputStream os, sexpString *s)
{
sexpSimpleString *ph = sexpStringPresentationHint(s);
sexpSimpleString *ss = sexpStringString(s);
/* advancedLengthSimpleString(os,ss)
* Returns length of printed image of s
*/
-int advancedLengthSimpleString(sexpOutputStream *os, sexpSimpleString *ss)
+int advancedLengthSimpleString(sexpOutputStream os, sexpSimpleString *ss)
{ long int len = simpleStringLength(ss);
if (canPrintAsToken(os,ss))
return advancedLengthSimpleStringToken(ss);
/* advancedLengthString(os,s)
* Returns length of printed image of string s
*/
-int advancedLengthString(sexpOutputStream *os, sexpString *s)
+int advancedLengthString(sexpOutputStream os, sexpString *s)
{ int len = 0;
sexpSimpleString *ph = sexpStringPresentationHint(s);
sexpSimpleString *ss = sexpStringString(s);
/* advancedLengthList(os,list)
* Returns length of printed image of list given as iterator
*/
-int advancedLengthList(sexpOutputStream *os, sexpList *list)
+int advancedLengthList(sexpOutputStream os, sexpList *list)
{ int len = 1; /* for left paren */
sexpIter iter;
sexpObject *object;
* written out in "vertical" mode, with items of the list starting in
* the same column on successive lines.
*/
-void advancedPrintList(sexpOutputStream *os, sexpList *list)
+void advancedPrintList(sexpOutputStream os, sexpList *list)
{ int vertical = FALSE;
int firstelement = TRUE;
sexpIter iter;
/* advancedPrintObject(os,object)
* Prints out object on output stream os
*/
-void advancedPrintObject(sexpOutputStream *os, sexpObject *object)
+void advancedPrintObject(sexpOutputStream os, sexpObject *object)
{
if (os->maxcolumn>0 && os->column>os->maxcolumn-4)
os->newLine(os,ADVANCED);
-/* SEXP standard header file: sexp.h \r
- * Ronald L. Rivest\r
- * 6/29/1997\r
- */\r
-\r
-/* GLOBAL DECLARATIONS */\r
-#define TRUE 1\r
-#define FALSE 0\r
-\r
-/* PRINTING MODES */\r
-#define CANONICAL 1 /* standard for hashing and tranmission */\r
-#define BASE64 2 /* base64 version of canonical */\r
-#define ADVANCED 3 /* pretty-printed */\r
-\r
-/* ERROR MESSAGE LEVELS */\r
-#define WARNING 1\r
-#define ERROR 2\r
-\r
-#define DEFAULTLINELENGTH 75\r
-\r
-typedef unsigned char octet;\r
-\r
-/* TYPES OF OBJECTS */\r
-#define SEXP_STRING 1\r
-#define SEXP_LIST 2\r
-\r
-/* sexpSimpleString */\r
-typedef struct sexp_simplestring { \r
- long int length;\r
- long int allocatedLength;\r
-/*@null@*/\r
- octet *string;\r
-} sexpSimpleString;\r
-\r
-/* sexpString */\r
-typedef struct sexp_string {\r
- int type;\r
-/*@null@*/\r
- sexpSimpleString *presentationHint;\r
-/*@null@*/\r
- sexpSimpleString *string;\r
-} sexpString;\r
-\r
-/* sexpList */\r
-/* If first is NULL, then rest must also be NULL; this is empty list */\r
-typedef struct sexp_list { \r
- char type;\r
-/*@null@*/\r
- union sexp_object *first;\r
-/*@null@*/\r
- struct sexp_list *rest;\r
-} sexpList;\r
-\r
-/* sexpObject */\r
-/* so we can have a pointer to something of either type */\r
-typedef union sexp_object {\r
-/*@unused@*/\r
- sexpString string;\r
-/*@unused@*/\r
- sexpList list;\r
-} sexpObject;\r
-\r
-/* sexpIter */\r
-/* an "iterator" for going over lists */\r
-/* In this implementation, it is the same as a list */\r
-typedef /*@abstract@*/ sexpList * sexpIter;\r
-\r
-typedef struct sexp_inputstream {\r
- int nextChar; /* character currently being scanned */\r
- int byteSize; /* 4 or 6 or 8 == currently scanning mode */\r
- int bits; /* Bits waiting to be used */\r
- int nBits; /* number of such bits waiting to be used */\r
- void (*getChar)();\r
- int count; /* number of 8-bit characters output by getChar */\r
-/*@shared@*/ /*@relnull@*/\r
- FILE *inputFile; /* where to get input, if not stdin */\r
-} sexpInputStream;\r
-\r
-typedef struct sexp_outputstream {\r
- long int column; /* column where next character will go */\r
- long int maxcolumn; /* max usable column, or -1 if no maximum */\r
- long int indent; /* current indentation level (starts at 0) */\r
- void (*putChar)(); /* output a character */\r
- void (*newLine)(); /* go to next line (and indent) */\r
- int byteSize; /* 4 or 6 or 8 depending on output mode */\r
- int bits; /* bits waiting to go out */\r
- int nBits; /* number of bits waiting to go out */\r
- long int base64Count; /* number of hex or base64 chars printed \r
- this region */\r
- int mode; /* BASE64, ADVANCED, or CANONICAL */\r
-/*@shared@*/ /*@relnull@*/\r
- FILE *outputFile; /* where to put output, if not stdout */\r
-} sexpOutputStream;\r
-\r
-/* Function prototypes */\r
-\r
-/* sexp-basic */\r
-/*@mayexit@*/ /*@printflike@*/\r
-void ErrorMessage(int level, const char *fmt, ...)\r
- /*@globals fileSystem @*/\r
- /*@modifies fileSystem @*/;\r
-void initializeMemory(void)\r
- /*@*/;\r
-char *sexpAlloc(int n)\r
- /*@globals fileSystem @*/\r
- /*@modifies fileSystem @*/;\r
-sexpSimpleString *newSimpleString(void)\r
- /*@globals fileSystem @*/\r
- /*@modifies fileSystem @*/;\r
-long int simpleStringLength(sexpSimpleString *ss)\r
- /*@*/;\r
-/*@null@*/\r
-octet *simpleStringString(sexpSimpleString *ss)\r
- /*@*/;\r
-/*@null@*/\r
-sexpSimpleString *reallocateSimpleString(sexpSimpleString *ss)\r
- /*@globals fileSystem @*/\r
- /*@modifies ss, fileSystem @*/;\r
-void appendCharToSimpleString(int c, sexpSimpleString *ss)\r
- /*@globals fileSystem @*/\r
- /*@modifies ss, fileSystem @*/;\r
-sexpString *newSexpString(void)\r
- /*@globals fileSystem @*/\r
- /*@modifies fileSystem @*/;\r
-/*@null@*/\r
-sexpSimpleString *sexpStringPresentationHint(sexpString *s)\r
- /*@*/;\r
-void setSexpStringPresentationHint(sexpString *s, sexpSimpleString *ss)\r
- /*@modifies s @*/;\r
-void setSexpStringString(sexpString *s, sexpSimpleString *ss)\r
- /*@modifies s @*/;\r
-/*@null@*/\r
-sexpSimpleString *sexpStringString(sexpString *s)\r
- /*@*/;\r
-void closeSexpString(sexpString *s)\r
- /*@*/;\r
-sexpList *newSexpList(void)\r
- /*@globals fileSystem @*/\r
- /*@modifies fileSystem @*/;\r
-void sexpAddSexpListObject(sexpList *list, sexpObject *object)\r
- /*@globals fileSystem @*/\r
- /*@modifies list, fileSystem @*/;\r
-void closeSexpList(sexpList *list)\r
- /*@*/;\r
-/*@observer@*/\r
-sexpIter sexpListIter(sexpList *list)\r
- /*@*/;\r
-/*@exposed@*/ /*@observer@*/ /*@null@*/\r
-sexpIter sexpIterNext(sexpIter iter)\r
- /*@*/;\r
-/*@exposed@*/ /*@observer@*/ /*@null@*/\r
-sexpObject *sexpIterObject(sexpIter iter)\r
- /*@*/;\r
-int isObjectString(sexpObject *object)\r
- /*@*/;\r
-int isObjectList(sexpObject *object)\r
- /*@*/;\r
-\r
-/* sexp-input */\r
-void initializeCharacterTables(void)\r
- /*@globals internalState @*/\r
- /*@modifies internalState @*/;\r
-int isWhiteSpace(int c)\r
- /*@*/;\r
-int isDecDigit(int c)\r
- /*@*/;\r
-int isHexDigit(int c)\r
- /*@*/;\r
-int isBase64Digit(int c)\r
- /*@*/;\r
-int isTokenChar(int c)\r
- /*@*/;\r
-/*@unused@*/\r
-int isAlpha(int c)\r
- /*@*/;\r
-void changeInputByteSize(sexpInputStream *is, int newByteSize)\r
- /*@modifies is @*/;\r
-void getChar(sexpInputStream *is)\r
- /*@globals fileSystem @*/\r
- /*@modifies is, fileSystem @*/;\r
-sexpInputStream *newSexpInputStream(void)\r
- /*@globals fileSystem @*/\r
- /*@modifies fileSystem @*/;\r
-void skipWhiteSpace(sexpInputStream *is)\r
- /*@modifies is @*/;\r
-void skipChar(sexpInputStream *is, int c)\r
- /*@globals fileSystem @*/\r
- /*@modifies is, fileSystem @*/;\r
-void scanToken(sexpInputStream *is, sexpSimpleString *ss)\r
- /*@globals fileSystem @*/\r
- /*@modifies is, ss, fileSystem @*/;\r
-sexpObject *scanToEOF(sexpInputStream *is)\r
- /*@globals fileSystem @*/\r
- /*@modifies is, fileSystem @*/;\r
-unsigned long int scanDecimal(sexpInputStream *is)\r
- /*@globals fileSystem @*/\r
- /*@modifies is, fileSystem @*/;\r
-void scanVerbatimString(sexpInputStream *is, sexpSimpleString *ss, long int length)\r
- /*@globals fileSystem @*/\r
- /*@modifies is, ss, fileSystem @*/;\r
-void scanQuotedString(sexpInputStream *is, sexpSimpleString *ss, long int length)\r
- /*@globals fileSystem @*/\r
- /*@modifies is, ss, fileSystem @*/;\r
-void scanHexString(sexpInputStream *is, sexpSimpleString *ss, long int length)\r
- /*@globals fileSystem @*/\r
- /*@modifies is, ss, fileSystem @*/;\r
-void scanBase64String(sexpInputStream *is, sexpSimpleString *ss, long int length)\r
- /*@globals fileSystem @*/\r
- /*@modifies is, ss, fileSystem @*/;\r
-sexpSimpleString *scanSimpleString(sexpInputStream *is)\r
- /*@globals fileSystem @*/\r
- /*@modifies is, fileSystem @*/;\r
-sexpString *scanString(sexpInputStream *is)\r
- /*@globals fileSystem @*/\r
- /*@modifies is, fileSystem @*/;\r
-sexpList *scanList(sexpInputStream *is)\r
- /*@globals fileSystem @*/\r
- /*@modifies is, fileSystem @*/;\r
-sexpObject *scanObject(sexpInputStream *is)\r
- /*@globals fileSystem @*/\r
- /*@modifies is, fileSystem @*/;\r
-\r
-/* sexp-output */\r
-void putChar(sexpOutputStream *os, int c)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
-void varPutChar(sexpOutputStream *os, int c)\r
- /*@modifies os @*/;\r
-void changeOutputByteSize(sexpOutputStream *os, int newByteSize, int mode)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
-void flushOutput(sexpOutputStream * os)\r
- /*@modifies os @*/;\r
-void newLine(sexpOutputStream *os, int mode)\r
- /*@modifies os @*/;\r
-sexpOutputStream *newSexpOutputStream(void)\r
- /*@globals fileSystem @*/\r
- /*@modifies fileSystem @*/;\r
-void printDecimal(sexpOutputStream *os, long int n)\r
- /*@modifies os @*/;\r
-void canonicalPrintVerbatimSimpleString(sexpOutputStream *os, sexpSimpleString *ss)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
-void canonicalPrintString(sexpOutputStream *os, sexpString *s)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
-void canonicalPrintList(sexpOutputStream *os, sexpList *list)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
-void canonicalPrintObject(sexpOutputStream *os, sexpObject *object)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
-void base64PrintWholeObject(sexpOutputStream *os, sexpObject *object)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
-int canPrintAsToken(sexpOutputStream *os, sexpSimpleString *ss)\r
- /*@*/;\r
-void advancedPrintTokenSimpleString(sexpOutputStream *os, sexpSimpleString *ss)\r
- /*@modifies os @*/;\r
-int advancedLengthSimpleStringToken(sexpSimpleString *ss)\r
- /*@*/;\r
-/*@unused@*/\r
-void advancedPrintVerbatimSimpleString(sexpOutputStream *os, sexpSimpleString *ss)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
-/*@unused@*/\r
-int advancedLengthSimpleStringVerbatim(sexpSimpleString *ss)\r
- /*@*/;\r
-void advancedPrintBase64SimpleString(sexpOutputStream *os, sexpSimpleString *ss)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
-void advancedPrintHexSimpleString(sexpOutputStream *os, sexpSimpleString *ss)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
-int advancedLengthSimpleStringHexadecimal(sexpSimpleString *ss)\r
- /*@*/;\r
-int canPrintAsQuotedString(sexpSimpleString *ss)\r
- /*@*/;\r
-void advancedPrintQuotedStringSimpleString(sexpOutputStream *os, sexpSimpleString *ss)\r
- /*@modifies os @*/;\r
-int advancedLengthSimpleStringQuotedString(sexpSimpleString *ss)\r
- /*@*/;\r
-void advancedPrintSimpleString(sexpOutputStream *os, sexpSimpleString *ss)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
-void advancedPrintString(sexpOutputStream *os, sexpString *s)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
-int advancedLengthSimpleStringBase64(sexpSimpleString *ss)\r
- /*@*/;\r
-int advancedLengthSimpleString(sexpOutputStream *os, sexpSimpleString *ss)\r
- /*@*/;\r
-int advancedLengthString(sexpOutputStream *os, sexpString *s)\r
- /*@*/;\r
-int advancedLengthList(sexpOutputStream *os, sexpList *list)\r
- /*@*/;\r
-void advancedPrintList(sexpOutputStream *os, sexpList *list)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
-void advancedPrintObject(sexpOutputStream *os, sexpObject *object)\r
- /*@globals fileSystem @*/\r
- /*@modifies os, fileSystem @*/;\r
+/* SEXP standard header file: sexp.h
+ * Ronald L. Rivest
+ * 6/29/1997
+ */
+
+/* GLOBAL DECLARATIONS */
+#define TRUE 1
+#define FALSE 0
+
+/* PRINTING MODES */
+#define CANONICAL 1 /* standard for hashing and tranmission */
+#define BASE64 2 /* base64 version of canonical */
+#define ADVANCED 3 /* pretty-printed */
+
+/* ERROR MESSAGE LEVELS */
+#define WARNING 1
+#define ERROR 2
+
+#define DEFAULTLINELENGTH 75
+
+typedef unsigned char octet;
+
+/* TYPES OF OBJECTS */
+#define SEXP_STRING 1
+#define SEXP_LIST 2
+
+/* sexpSimpleString */
+typedef struct sexp_simplestring {
+ long int length;
+ long int allocatedLength;
+/*@null@*/
+ octet *string;
+} sexpSimpleString;
+
+/* sexpString */
+typedef struct sexp_string {
+ int type;
+/*@null@*/
+ sexpSimpleString *presentationHint;
+/*@null@*/
+ sexpSimpleString *string;
+} sexpString;
+
+/* sexpList */
+/* If first is NULL, then rest must also be NULL; this is empty list */
+typedef struct sexp_list {
+ char type;
+/*@null@*/
+ union sexp_object *first;
+/*@null@*/
+ struct sexp_list *rest;
+} sexpList;
+
+/* sexpObject */
+/* so we can have a pointer to something of either type */
+typedef union sexp_object {
+/*@unused@*/
+ sexpString string;
+/*@unused@*/
+ sexpList list;
+} sexpObject;
+
+/* sexpIter */
+/* an "iterator" for going over lists */
+/* In this implementation, it is the same as a list */
+typedef /*@abstract@*/ sexpList * sexpIter;
+
+typedef /*@abstract@*/ struct sexp_inputstream {
+ int nextChar; /* character currently being scanned */
+ int byteSize; /* 4 or 6 or 8 == currently scanning mode */
+ int bits; /* Bits waiting to be used */
+ int nBits; /* number of such bits waiting to be used */
+ void (*getChar)();
+ int count; /* number of 8-bit characters output by getChar */
+/*@shared@*/ /*@relnull@*/
+ FILE *inputFile; /* where to get input, if not stdin */
+} * sexpInputStream;
+
+typedef /*@abstract@*/ struct sexp_outputstream {
+ long int column; /* column where next character will go */
+ long int maxcolumn; /* max usable column, or -1 if no maximum */
+ long int indent; /* current indentation level (starts at 0) */
+ void (*putChar)(); /* output a character */
+ void (*newLine)(); /* go to next line (and indent) */
+ int byteSize; /* 4 or 6 or 8 depending on output mode */
+ int bits; /* bits waiting to go out */
+ int nBits; /* number of bits waiting to go out */
+ long int base64Count; /* number of hex or base64 chars printed
+ this region */
+ int mode; /* BASE64, ADVANCED, or CANONICAL */
+/*@shared@*/ /*@relnull@*/
+ FILE *outputFile; /* where to put output, if not stdout */
+} * sexpOutputStream;
+
+/* Function prototypes */
+
+/* sexp-basic */
+/*@mayexit@*/ /*@printflike@*/
+void ErrorMessage(int level, const char *fmt, ...)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/;
+void initializeMemory(void)
+ /*@*/;
+char *sexpAlloc(int n)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/;
+sexpSimpleString *newSimpleString(void)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/;
+long int simpleStringLength(sexpSimpleString *ss)
+ /*@*/;
+/*@null@*/
+octet *simpleStringString(sexpSimpleString *ss)
+ /*@*/;
+/*@null@*/
+sexpSimpleString *reallocateSimpleString(sexpSimpleString *ss)
+ /*@globals fileSystem @*/
+ /*@modifies ss, fileSystem @*/;
+void appendCharToSimpleString(int c, sexpSimpleString *ss)
+ /*@globals fileSystem @*/
+ /*@modifies ss, fileSystem @*/;
+sexpString *newSexpString(void)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/;
+/*@null@*/
+sexpSimpleString *sexpStringPresentationHint(sexpString *s)
+ /*@*/;
+void setSexpStringPresentationHint(sexpString *s, sexpSimpleString *ss)
+ /*@modifies s @*/;
+void setSexpStringString(sexpString *s, sexpSimpleString *ss)
+ /*@modifies s @*/;
+/*@null@*/
+sexpSimpleString *sexpStringString(sexpString *s)
+ /*@*/;
+void closeSexpString(sexpString *s)
+ /*@*/;
+sexpList *newSexpList(void)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/;
+void sexpAddSexpListObject(sexpList *list, sexpObject *object)
+ /*@globals fileSystem @*/
+ /*@modifies list, fileSystem @*/;
+void closeSexpList(sexpList *list)
+ /*@*/;
+/*@observer@*/
+sexpIter sexpListIter(sexpList *list)
+ /*@*/;
+/*@exposed@*/ /*@observer@*/ /*@null@*/
+sexpIter sexpIterNext(sexpIter iter)
+ /*@*/;
+/*@exposed@*/ /*@observer@*/ /*@null@*/
+sexpObject *sexpIterObject(sexpIter iter)
+ /*@*/;
+int isObjectString(sexpObject *object)
+ /*@*/;
+int isObjectList(sexpObject *object)
+ /*@*/;
+
+/* sexp-input */
+void initializeCharacterTables(void)
+ /*@globals internalState @*/
+ /*@modifies internalState @*/;
+int isWhiteSpace(int c)
+ /*@*/;
+int isDecDigit(int c)
+ /*@*/;
+int isHexDigit(int c)
+ /*@*/;
+int isBase64Digit(int c)
+ /*@*/;
+int isTokenChar(int c)
+ /*@*/;
+/*@unused@*/
+int isAlpha(int c)
+ /*@*/;
+void changeInputByteSize(sexpInputStream is, int newByteSize)
+ /*@modifies is @*/;
+void getChar(sexpInputStream is)
+ /*@globals fileSystem @*/
+ /*@modifies is, fileSystem @*/;
+sexpInputStream newSexpInputStream(void)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/;
+void skipWhiteSpace(sexpInputStream is)
+ /*@modifies is @*/;
+void skipChar(sexpInputStream is, int c)
+ /*@globals fileSystem @*/
+ /*@modifies is, fileSystem @*/;
+void scanToken(sexpInputStream is, sexpSimpleString *ss)
+ /*@globals fileSystem @*/
+ /*@modifies is, ss, fileSystem @*/;
+sexpObject *scanToEOF(sexpInputStream is)
+ /*@globals fileSystem @*/
+ /*@modifies is, fileSystem @*/;
+unsigned long int scanDecimal(sexpInputStream is)
+ /*@globals fileSystem @*/
+ /*@modifies is, fileSystem @*/;
+void scanVerbatimString(sexpInputStream is, sexpSimpleString *ss, long int length)
+ /*@globals fileSystem @*/
+ /*@modifies is, ss, fileSystem @*/;
+void scanQuotedString(sexpInputStream is, sexpSimpleString *ss, long int length)
+ /*@globals fileSystem @*/
+ /*@modifies is, ss, fileSystem @*/;
+void scanHexString(sexpInputStream is, sexpSimpleString *ss, long int length)
+ /*@globals fileSystem @*/
+ /*@modifies is, ss, fileSystem @*/;
+void scanBase64String(sexpInputStream is, sexpSimpleString *ss, long int length)
+ /*@globals fileSystem @*/
+ /*@modifies is, ss, fileSystem @*/;
+sexpSimpleString *scanSimpleString(sexpInputStream is)
+ /*@globals fileSystem @*/
+ /*@modifies is, fileSystem @*/;
+sexpString *scanString(sexpInputStream is)
+ /*@globals fileSystem @*/
+ /*@modifies is, fileSystem @*/;
+sexpList *scanList(sexpInputStream is)
+ /*@globals fileSystem @*/
+ /*@modifies is, fileSystem @*/;
+sexpObject *scanObject(sexpInputStream is)
+ /*@globals fileSystem @*/
+ /*@modifies is, fileSystem @*/;
+
+/* sexp-output */
+void putChar(sexpOutputStream os, int c)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;
+void varPutChar(sexpOutputStream os, int c)
+ /*@modifies os @*/;
+void changeOutputByteSize(sexpOutputStream os, int newByteSize, int mode)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;
+void flushOutput(sexpOutputStream os)
+ /*@modifies os @*/;
+void newLine(sexpOutputStream os, int mode)
+ /*@modifies os @*/;
+sexpOutputStream newSexpOutputStream(void)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/;
+void printDecimal(sexpOutputStream os, long int n)
+ /*@modifies os @*/;
+void canonicalPrintVerbatimSimpleString(sexpOutputStream os, sexpSimpleString *ss)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;
+void canonicalPrintString(sexpOutputStream os, sexpString *s)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;
+void canonicalPrintList(sexpOutputStream os, sexpList *list)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;
+void canonicalPrintObject(sexpOutputStream os, sexpObject *object)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;
+void base64PrintWholeObject(sexpOutputStream os, sexpObject *object)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;
+int canPrintAsToken(sexpOutputStream os, sexpSimpleString *ss)
+ /*@*/;
+void advancedPrintTokenSimpleString(sexpOutputStream os, sexpSimpleString *ss)
+ /*@modifies os @*/;
+int advancedLengthSimpleStringToken(sexpSimpleString *ss)
+ /*@*/;
+/*@unused@*/
+void advancedPrintVerbatimSimpleString(sexpOutputStream os, sexpSimpleString *ss)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;
+/*@unused@*/
+int advancedLengthSimpleStringVerbatim(sexpSimpleString *ss)
+ /*@*/;
+void advancedPrintBase64SimpleString(sexpOutputStream os, sexpSimpleString *ss)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;
+void advancedPrintHexSimpleString(sexpOutputStream os, sexpSimpleString *ss)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;
+int advancedLengthSimpleStringHexadecimal(sexpSimpleString *ss)
+ /*@*/;
+int canPrintAsQuotedString(sexpSimpleString *ss)
+ /*@*/;
+void advancedPrintQuotedStringSimpleString(sexpOutputStream os, sexpSimpleString *ss)
+ /*@modifies os @*/;
+int advancedLengthSimpleStringQuotedString(sexpSimpleString *ss)
+ /*@*/;
+void advancedPrintSimpleString(sexpOutputStream os, sexpSimpleString *ss)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;
+void advancedPrintString(sexpOutputStream os, sexpString *s)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;
+int advancedLengthSimpleStringBase64(sexpSimpleString *ss)
+ /*@*/;
+int advancedLengthSimpleString(sexpOutputStream os, sexpSimpleString *ss)
+ /*@*/;
+int advancedLengthString(sexpOutputStream os, sexpString *s)
+ /*@*/;
+int advancedLengthList(sexpOutputStream os, sexpList *list)
+ /*@*/;
+void advancedPrintList(sexpOutputStream os, sexpList *list)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;
+void advancedPrintObject(sexpOutputStream os, sexpObject *object)
+ /*@globals fileSystem @*/
+ /*@modifies os, fileSystem @*/;