]> git.ipfire.org Git - thirdparty/cups.git/blob - pdftops/PSTokenizer.cxx
Load cups into easysw/current.
[thirdparty/cups.git] / pdftops / PSTokenizer.cxx
1 //========================================================================
2 //
3 // PSTokenizer.cc
4 //
5 // Copyright 2002-2003 Glyph & Cog, LLC
6 //
7 //========================================================================
8
9 #include <config.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.
23 static 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
44 PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) {
45 getCharFunc = getCharFuncA;
46 data = dataA;
47 charBuf = -1;
48 }
49
50 PSTokenizer::~PSTokenizer() {
51 }
52
53 GBool 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
119 int PSTokenizer::lookChar() {
120 if (charBuf < 0) {
121 charBuf = (*getCharFunc)(data);
122 }
123 return charBuf;
124 }
125
126 int 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 }