filters

PSTokenizer.cpp
1//========================================================================
2//
3// PSTokenizer.cpp
4//
5// Copyright 2002 Glyph & Cog, LLC
6//
7//========================================================================
8
9#include <aconf.h>
10
11#ifdef USE_GCC_PRAGMAS
12#pragma implementation
13#endif
14
15#include <stdio.h>
16#include <stdlib.h>
17#include "PSTokenizer.h"
18
19//------------------------------------------------------------------------
20
21// A '1' in this array means the character is white space. A '1' or
22// '2' means the character ends a name or command.
23static char specialChars[256] = {
24 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x
25 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
26 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x
27 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x
28 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x
29 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x
30 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x
31 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x
32 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
33 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
34 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax
35 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx
36 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx
37 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx
38 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex
39 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx
40};
41
42//------------------------------------------------------------------------
43
44PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) {
45 getCharFunc = getCharFuncA;
46 data = dataA;
47 charBuf = -1;
48}
49
50PSTokenizer::~PSTokenizer() {
51}
52
53GBool PSTokenizer::getToken(char *buf, int size, int *length) {
54 GBool comment, backslash;
55 int c;
56 int i;
57
58 // skip whitespace and comments
59 comment = gFalse;
60 while (1) {
61 if ((c = getChar()) == EOF) {
62 buf[0] = '\0';
63 *length = 0;
64 return gFalse;
65 }
66 if (comment) {
67 if (c == '\x0a' || c == '\x0d') {
68 comment = gFalse;
69 }
70 } else if (c == '%') {
71 comment = gTrue;
72 } else if (specialChars[c] != 1) {
73 break;
74 }
75 }
76
77 // read a token
78 i = 0;
79 buf[i++] = c;
80 if (c == '(') {
81 backslash = gFalse;
82 while ((c = lookChar()) != EOF) {
83 if (i < size - 1) {
84 buf[i++] = c;
85 }
86 getChar();
87 if (c == '\\') {
88 backslash = gTrue;
89 } else if (!backslash && c == ')') {
90 break;
91 } else {
92 backslash = gFalse;
93 }
94 }
95 } else if (c == '<') {
96 while ((c = lookChar()) != EOF) {
97 getChar();
98 if (i < size - 1) {
99 buf[i++] = c;
100 }
101 if (c == '>') {
102 break;
103 }
104 }
105 } else if (c != '[' && c != ']') {
106 while ((c = lookChar()) != EOF && !specialChars[c]) {
107 getChar();
108 if (i < size - 1) {
109 buf[i++] = c;
110 }
111 }
112 }
113 buf[i] = '\0';
114 *length = i;
115
116 return gTrue;
117}
118
119int PSTokenizer::lookChar() {
120 if (charBuf < 0) {
121 charBuf = (*getCharFunc)(data);
122 }
123 return charBuf;
124}
125
126int PSTokenizer::getChar() {
127 int c;
128
129 if (charBuf < 0) {
130 charBuf = (*getCharFunc)(data);
131 }
132 c = charBuf;
133 charBuf = -1;
134 return c;
135}