several more bugfixes.
[swftools.git] / pdf2swf / xpdf / PSTokenizer.cc
1 //========================================================================
2 //
3 // PSTokenizer.cc
4 //
5 // Copyright 2002-2003 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.
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 }