Coverage Report

Created: 2026-09-03 07:21

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
19.5k
PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) {
42
19.5k
  getCharFunc = getCharFuncA;
43
19.5k
  data = dataA;
44
19.5k
  charBuf = -1;
45
19.5k
}
46
47
19.5k
PSTokenizer::~PSTokenizer() {
48
19.5k
}
49
50
3.58M
GBool PSTokenizer::getToken(char *buf, int size, int *length) {
51
3.58M
  GBool comment, backslash;
52
3.58M
  int c;
53
3.58M
  int i;
54
55
  // skip whitespace and comments
56
3.58M
  comment = gFalse;
57
7.33M
  while (1) {
58
7.33M
    if ((c = getChar()) == EOF) {
59
34.6k
      buf[0] = '\0';
60
34.6k
      *length = 0;
61
34.6k
      return gFalse;
62
34.6k
    }
63
7.29M
    if (comment) {
64
191k
      if (c == '\x0a' || c == '\x0d') {
65
4.84k
  comment = gFalse;
66
4.84k
      }
67
7.10M
    } else if (c == '%') {
68
4.84k
      comment = gTrue;
69
7.10M
    } else if (specialChars[c] != 1) {
70
3.55M
      break;
71
3.55M
    }
72
7.29M
  }
73
74
  // read a token
75
3.55M
  i = 0;
76
3.55M
  buf[i++] = (char)c;
77
3.55M
  if (c == '(') {
78
27.0k
    backslash = gFalse;
79
3.26M
    while ((c = lookChar()) != EOF) {
80
3.26M
      if (i < size - 1) {
81
744k
  buf[i++] = (char)c;
82
744k
      }
83
3.26M
      getChar();
84
3.26M
      if (c == '\\') {
85
704
  backslash = gTrue;
86
3.26M
      } else if (!backslash && c == ')') {
87
24.9k
  break;
88
3.24M
      } else {
89
3.24M
  backslash = gFalse;
90
3.24M
      }
91
3.26M
    }
92
3.52M
  } else if (c == '<') {
93
12.5M
    while ((c = lookChar()) != EOF) {
94
12.5M
      getChar();
95
12.5M
      if (i < size - 1 && specialChars[c] != 1) {
96
11.9M
  buf[i++] = (char)c;
97
11.9M
      }
98
12.5M
      if (c == '>') {
99
2.55M
  break;
100
2.55M
      }
101
12.5M
    }
102
2.55M
  } else if (c != '[' && c != ']') {
103
5.45M
    while ((c = lookChar()) != EOF && !specialChars[c]) {
104
4.49M
      getChar();
105
4.49M
      if (i < size - 1) {
106
4.49M
  buf[i++] = (char)c;
107
4.49M
      }
108
4.49M
    }
109
958k
  }
110
3.55M
  buf[i] = '\0';
111
3.55M
  *length = i;
112
113
3.55M
  return gTrue;
114
3.58M
}
115
116
21.2M
int PSTokenizer::lookChar() {
117
21.2M
  if (charBuf < 0) {
118
21.2M
    charBuf = (*getCharFunc)(data);
119
21.2M
  }
120
21.2M
  return charBuf;
121
21.2M
}
122
123
27.6M
int PSTokenizer::getChar() {
124
27.6M
  int c;
125
126
27.6M
  if (charBuf < 0) {
127
6.37M
    charBuf = (*getCharFunc)(data);
128
6.37M
  }
129
27.6M
  c = charBuf;
130
27.6M
  charBuf = -1;
131
27.6M
  return c;
132
27.6M
}