Coverage Report

Created: 2026-02-04 06:14

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
21.1k
PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) {
42
21.1k
  getCharFunc = getCharFuncA;
43
21.1k
  data = dataA;
44
21.1k
  charBuf = -1;
45
21.1k
}
46
47
21.1k
PSTokenizer::~PSTokenizer() {
48
21.1k
}
49
50
1.37M
GBool PSTokenizer::getToken(char *buf, int size, int *length) {
51
1.37M
  GBool comment, backslash;
52
1.37M
  int c;
53
1.37M
  int i;
54
55
  // skip whitespace and comments
56
1.37M
  comment = gFalse;
57
21.2M
  while (1) {
58
21.2M
    if ((c = getChar()) == EOF) {
59
24.0k
      buf[0] = '\0';
60
24.0k
      *length = 0;
61
24.0k
      return gFalse;
62
24.0k
    }
63
21.2M
    if (comment) {
64
12.4M
      if (c == '\x0a' || c == '\x0d') {
65
16.5k
  comment = gFalse;
66
16.5k
      }
67
12.4M
    } else if (c == '%') {
68
16.5k
      comment = gTrue;
69
8.75M
    } else if (specialChars[c] != 1) {
70
1.35M
      break;
71
1.35M
    }
72
21.2M
  }
73
74
  // read a token
75
1.35M
  i = 0;
76
1.35M
  buf[i++] = (char)c;
77
1.35M
  if (c == '(') {
78
2.60k
    backslash = gFalse;
79
774k
    while ((c = lookChar()) != EOF) {
80
772k
      if (i < size - 1) {
81
436k
  buf[i++] = (char)c;
82
436k
      }
83
772k
      getChar();
84
772k
      if (c == '\\') {
85
438
  backslash = gTrue;
86
772k
      } else if (!backslash && c == ')') {
87
1.17k
  break;
88
771k
      } else {
89
771k
  backslash = gFalse;
90
771k
      }
91
772k
    }
92
1.34M
  } else if (c == '<') {
93
4.32M
    while ((c = lookChar()) != EOF) {
94
4.30M
      getChar();
95
4.30M
      if (i < size - 1 && specialChars[c] != 1) {
96
3.34M
  buf[i++] = (char)c;
97
3.34M
      }
98
4.30M
      if (c == '>') {
99
166k
  break;
100
166k
      }
101
4.30M
    }
102
1.16M
  } else if (c != '[' && c != ']') {
103
5.33M
    while ((c = lookChar()) != EOF && !specialChars[c]) {
104
4.21M
      getChar();
105
4.21M
      if (i < size - 1) {
106
3.52M
  buf[i++] = (char)c;
107
3.52M
      }
108
4.21M
    }
109
1.11M
  }
110
1.35M
  buf[i] = '\0';
111
1.35M
  *length = i;
112
113
1.35M
  return gTrue;
114
1.37M
}
115
116
10.4M
int PSTokenizer::lookChar() {
117
10.4M
  if (charBuf < 0) {
118
10.4M
    charBuf = (*getCharFunc)(data);
119
10.4M
  }
120
10.4M
  return charBuf;
121
10.4M
}
122
123
30.5M
int PSTokenizer::getChar() {
124
30.5M
  int c;
125
126
30.5M
  if (charBuf < 0) {
127
20.1M
    charBuf = (*getCharFunc)(data);
128
20.1M
  }
129
30.5M
  c = charBuf;
130
30.5M
  charBuf = -1;
131
30.5M
  return c;
132
30.5M
}