Coverage Report

Created: 2025-07-11 07:47

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