Commit 0a745021e7d6676ded2a344134b68b180fb3be60

Authored by Jay Berkenbilt
1 parent 8740b380

Remove PCRE from QPDFTokenizer

Showing 1 changed file with 47 additions and 4 deletions
libqpdf/QPDFTokenizer.cc
... ... @@ -4,7 +4,6 @@
4 4 // it's not worth the risk of including it in case it may accidentally
5 5 // be used.
6 6  
7   -#include <qpdf/PCRE.hh>
8 7 #include <qpdf/QTC.hh>
9 8 #include <qpdf/QPDFExc.hh>
10 9  
... ... @@ -20,6 +19,52 @@ static bool is_space(char ch)
20 19 {
21 20 return (strchr(" \f\n\r\t\v", ch) != 0);
22 21 }
  22 +static bool is_digit(char ch)
  23 +{
  24 + return ((ch >= '0') && (ch <= '9'));
  25 +}
  26 +static bool
  27 +is_number(std::string const& str)
  28 +{
  29 + // ^[\+\-]?(\.\d+|\d+(\.\d+)?)$
  30 + char const* p = str.c_str();
  31 + if (! *p)
  32 + {
  33 + return false;
  34 + }
  35 + if ((*p == '-') || (*p == '+'))
  36 + {
  37 + ++p;
  38 + }
  39 + bool found_dot = false;
  40 + bool found_digit = false;
  41 + for (; *p; ++p)
  42 + {
  43 + if (*p == '.')
  44 + {
  45 + if (found_dot)
  46 + {
  47 + // only one dot
  48 + return false;
  49 + }
  50 + if (! *(p+1))
  51 + {
  52 + // dot can't be last
  53 + return false;
  54 + }
  55 + found_dot = true;
  56 + }
  57 + else if (is_digit(*p))
  58 + {
  59 + found_digit = true;
  60 + }
  61 + else
  62 + {
  63 + return false;
  64 + }
  65 + }
  66 + return found_digit;
  67 +}
23 68  
24 69 QPDFTokenizer::QPDFTokenizer() :
25 70 pound_special_in_name(true),
... ... @@ -59,8 +104,6 @@ QPDFTokenizer::reset()
59 104 void
60 105 QPDFTokenizer::resolveLiteral()
61 106 {
62   - PCRE num_re("^[\\+\\-]?(?:\\.\\d+|\\d+(?:\\.\\d+)?)$");
63   -
64 107 if ((val.length() > 0) && (val.at(0) == '/'))
65 108 {
66 109 type = tt_name;
... ... @@ -110,7 +153,7 @@ QPDFTokenizer::resolveLiteral()
110 153 }
111 154 val = nval;
112 155 }
113   - else if (num_re.match(val.c_str()))
  156 + else if (is_number(val))
114 157 {
115 158 if (val.find('.') != std::string::npos)
116 159 {
... ...