#include <config.h>
#ifdef USE_GCC_PRAGMAS
#pragma implementation
#endif
#include <stdio.h>
#include <stdlib.h>
#include "PSTokenizer.h"
static char specialChars[256] = {
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) {
getCharFunc = getCharFuncA;
data = dataA;
charBuf = -1;
}
PSTokenizer::~PSTokenizer() {
}
GBool PSTokenizer::getToken(char *buf, int size, int *length) {
GBool comment, backslash;
int c;
int i;
comment = gFalse;
while (1) {
if ((c = getChar()) == EOF) {
buf[0] = '\0';
*length = 0;
return gFalse;
}
if (comment) {
if (c == '\x0a' || c == '\x0d') {
comment = gFalse;
}
} else if (c == '%') {
comment = gTrue;
} else if (specialChars[c] != 1) {
break;
}
}
i = 0;
buf[i++] = c;
if (c == '(') {
backslash = gFalse;
while ((c = lookChar()) != EOF) {
if (i < size - 1) {
buf[i++] = c;
}
getChar();
if (c == '\\') {
backslash = gTrue;
} else if (!backslash && c == ')') {
break;
} else {
backslash = gFalse;
}
}
} else if (c == '<') {
while ((c = lookChar()) != EOF) {
getChar();
if (i < size - 1) {
buf[i++] = c;
}
if (c == '>') {
break;
}
}
} else if (c != '[' && c != ']') {
while ((c = lookChar()) != EOF && !specialChars[c]) {
getChar();
if (i < size - 1) {
buf[i++] = c;
}
}
}
buf[i] = '\0';
*length = i;
return gTrue;
}
int PSTokenizer::lookChar() {
if (charBuf < 0) {
charBuf = (*getCharFunc)(data);
}
return charBuf;
}
int PSTokenizer::getChar() {
int c;
if (charBuf < 0) {
charBuf = (*getCharFunc)(data);
}
c = charBuf;
charBuf = -1;
return c;
}