source: trunk/poppler/mypoppler/poppler/PSTokenizer.cc @ 2

Last change on this file since 2 was 2, checked in by Eugene Romanenko, 15 years ago

First import

File size: 3.2 KB
RevLine 
[2]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.
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}
Note: See TracBrowser for help on using the repository browser.