Bringing apdf from vendor into main branch.
[AROS-Contrib.git] / apdf / xpdf / PSTokenizer.cc
bloba65c3241c0f04edb2ab3150ed92aa9093275f71c
1 //========================================================================
2 //
3 // PSTokenizer.cc
4 //
5 // Copyright 2002-2003 Glyph & Cog, LLC
6 //
7 //========================================================================
9 #include <aconf.h>
11 #ifdef USE_GCC_PRAGMAS
12 #pragma implementation
13 #endif
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include "PSTokenizer.h"
19 //------------------------------------------------------------------------
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
42 //------------------------------------------------------------------------
44 PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) {
45 getCharFunc = getCharFuncA;
46 data = dataA;
47 charBuf = -1;
50 PSTokenizer::~PSTokenizer() {
53 GBool PSTokenizer::getToken(char *buf, int size, int *length) {
54 GBool comment, backslash;
55 int c;
56 int i;
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;
66 if (comment) {
67 if (c == '\x0a' || c == '\x0d') {
68 comment = gFalse;
70 } else if (c == '%') {
71 comment = gTrue;
72 } else if (specialChars[c] != 1) {
73 break;
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;
86 getChar();
87 if (c == '\\') {
88 backslash = gTrue;
89 } else if (!backslash && c == ')') {
90 break;
91 } else {
92 backslash = gFalse;
95 } else if (c == '<') {
96 while ((c = lookChar()) != EOF) {
97 getChar();
98 if (i < size - 1) {
99 buf[i++] = c;
101 if (c == '>') {
102 break;
105 } else if (c != '[' && c != ']') {
106 while ((c = lookChar()) != EOF && !specialChars[c]) {
107 getChar();
108 if (i < size - 1) {
109 buf[i++] = c;
113 buf[i] = '\0';
114 *length = i;
116 return gTrue;
119 int PSTokenizer::lookChar() {
120 if (charBuf < 0) {
121 charBuf = (*getCharFunc)(data);
123 return charBuf;
126 int PSTokenizer::getChar() {
127 int c;
129 if (charBuf < 0) {
130 charBuf = (*getCharFunc)(data);
132 c = charBuf;
133 charBuf = -1;
134 return c;