00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifdef __GNUC__
00010 #pragma implementation
00011 #endif
00012
00013 #include <stdio.h>
00014 #include <stdlib.h>
00015 #include "PSTokenizer.h"
00016
00017
00018
00019
00020
00021 static char specialChars[256] = {
00022 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,
00023 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00024 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2,
00025 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0,
00026 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00027 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,
00028 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00029 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,
00030 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00031 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00032 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00033 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00034 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00035 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00036 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00037 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
00038 };
00039
00040
00041
00042 PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) {
00043 getCharFunc = getCharFuncA;
00044 data = dataA;
00045 charBuf = -1;
00046 }
00047
00048 PSTokenizer::~PSTokenizer() {
00049 }
00050
00051 GBool PSTokenizer::getToken(char *buf, int size, int *length) {
00052 GBool comment, backslash;
00053 int c;
00054 int i;
00055
00056
00057 comment = gFalse;
00058 while (1) {
00059 if ((c = getChar()) == EOF) {
00060 buf[0] = '\0';
00061 *length = 0;
00062 return gFalse;
00063 }
00064 if (comment) {
00065 if (c == '\x0a' || c == '\x0d') {
00066 comment = gFalse;
00067 }
00068 } else if (c == '%') {
00069 comment = gTrue;
00070 } else if (specialChars[c] != 1) {
00071 break;
00072 }
00073 }
00074
00075
00076 i = 0;
00077 buf[i++] = c;
00078 if (c == '(') {
00079 backslash = gFalse;
00080 while ((c = lookChar()) != EOF) {
00081 if (i < size - 1) {
00082 buf[i++] = c;
00083 }
00084 getChar();
00085 if (c == '\\') {
00086 backslash = gTrue;
00087 } else if (!backslash && c == ')') {
00088 break;
00089 } else {
00090 backslash = gFalse;
00091 }
00092 }
00093 } else if (c == '<') {
00094 while ((c = lookChar()) != EOF) {
00095 getChar();
00096 if (i < size - 1) {
00097 buf[i++] = c;
00098 }
00099 if (c == '>') {
00100 break;
00101 }
00102 }
00103 } else if (c != '[' && c != ']') {
00104 while ((c = lookChar()) != EOF && !specialChars[c]) {
00105 getChar();
00106 if (i < size - 1) {
00107 buf[i++] = c;
00108 }
00109 }
00110 }
00111 buf[i] = '\0';
00112 *length = i;
00113
00114 return gTrue;
00115 }
00116
00117 int PSTokenizer::lookChar() {
00118 if (charBuf < 0) {
00119 charBuf = (*getCharFunc)(data);
00120 }
00121 return charBuf;
00122 }
00123
00124 int PSTokenizer::getChar() {
00125 int c;
00126
00127 if (charBuf < 0) {
00128 charBuf = (*getCharFunc)(data);
00129 }
00130 c = charBuf;
00131 charBuf = -1;
00132 return c;
00133 }