Coverage Report

Created: 2026-07-04 07:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/xpdf-4.06/xpdf/PSTokenizer.cc
Line
Count
Source
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
9.59k
PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) {
42
9.59k
  getCharFunc = getCharFuncA;
43
9.59k
  data = dataA;
44
9.59k
  charBuf = -1;
45
9.59k
}
46
47
9.59k
PSTokenizer::~PSTokenizer() {
48
9.59k
}
49
50
1.02M
GBool PSTokenizer::getToken(char *buf, int size, int *length) {
51
1.02M
  GBool comment, backslash;
52
1.02M
  int c;
53
1.02M
  int i;
54
55
  // skip whitespace and comments
56
1.02M
  comment = gFalse;
57
2.54M
  while (1) {
58
2.54M
    if ((c = getChar()) == EOF) {
59
16.4k
      buf[0] = '\0';
60
16.4k
      *length = 0;
61
16.4k
      return gFalse;
62
16.4k
    }
63
2.52M
    if (comment) {
64
431k
      if (c == '\x0a' || c == '\x0d') {
65
11.5k
  comment = gFalse;
66
11.5k
      }
67
2.09M
    } else if (c == '%') {
68
11.5k
      comment = gTrue;
69
2.08M
    } else if (specialChars[c] != 1) {
70
1.00M
      break;
71
1.00M
    }
72
2.52M
  }
73
74
  // read a token
75
1.00M
  i = 0;
76
1.00M
  buf[i++] = (char)c;
77
1.00M
  if (c == '(') {
78
4.43k
    backslash = gFalse;
79
1.14M
    while ((c = lookChar()) != EOF) {
80
1.14M
      if (i < size - 1) {
81
322k
  buf[i++] = (char)c;
82
322k
      }
83
1.14M
      getChar();
84
1.14M
      if (c == '\\') {
85
1.12k
  backslash = gTrue;
86
1.13M
      } else if (!backslash && c == ')') {
87
3.84k
  break;
88
1.13M
      } else {
89
1.13M
  backslash = gFalse;
90
1.13M
      }
91
1.14M
    }
92
999k
  } else if (c == '<') {
93
3.76M
    while ((c = lookChar()) != EOF) {
94
3.76M
      getChar();
95
3.76M
      if (i < size - 1 && specialChars[c] != 1) {
96
3.23M
  buf[i++] = (char)c;
97
3.23M
      }
98
3.76M
      if (c == '>') {
99
464k
  break;
100
464k
      }
101
3.76M
    }
102
533k
  } else if (c != '[' && c != ']') {
103
3.18M
    while ((c = lookChar()) != EOF && !specialChars[c]) {
104
2.66M
      getChar();
105
2.66M
      if (i < size - 1) {
106
2.63M
  buf[i++] = (char)c;
107
2.63M
      }
108
2.66M
    }
109
521k
  }
110
1.00M
  buf[i] = '\0';
111
1.00M
  *length = i;
112
113
1.00M
  return gTrue;
114
1.02M
}
115
116
8.08M
int PSTokenizer::lookChar() {
117
8.08M
  if (charBuf < 0) {
118
8.08M
    charBuf = (*getCharFunc)(data);
119
8.08M
  }
120
8.08M
  return charBuf;
121
8.08M
}
122
123
10.1M
int PSTokenizer::getChar() {
124
10.1M
  int c;
125
126
10.1M
  if (charBuf < 0) {
127
2.02M
    charBuf = (*getCharFunc)(data);
128
2.02M
  }
129
10.1M
  c = charBuf;
130
10.1M
  charBuf = -1;
131
10.1M
  return c;
132
10.1M
}