You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.2 KiB
135 lines
3.2 KiB
//========================================================================
|
|
//
|
|
// PSTokenizer.cc
|
|
//
|
|
// Copyright 2002-2003 Glyph & Cog, LLC
|
|
//
|
|
//========================================================================
|
|
|
|
#include <aconf.h>
|
|
|
|
#ifdef USE_GCC_PRAGMAS
|
|
#pragma implementation
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "PSTokenizer.h"
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
// A '1' in this array means the character is white space. A '1' or
|
|
// '2' means the character ends a name or command.
|
|
static char specialChars[256] = {
|
|
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
|
|
1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx
|
|
};
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
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;
|
|
|
|
// skip whitespace and comments
|
|
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;
|
|
}
|
|
}
|
|
|
|
// read a token
|
|
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 && specialChars[c] != 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;
|
|
}
|
|
|