tools/pcre/pcrecpparg.h.in
author Asher Baker <asherkin@gmail.com>
Thu Apr 26 16:58:18 2012 +0100 (2012-04-26)
changeset 3488 bee90c8ef6c3
parent 2762 d2d467bf1b5a
permissions -rw-r--r--
Fixed client serials not being unique on Windows (bug 5285, r=psychonic).
dvander@2762
     1
// Copyright (c) 2005, Google Inc.
dvander@2762
     2
// All rights reserved.
dvander@2762
     3
//
dvander@2762
     4
// Redistribution and use in source and binary forms, with or without
dvander@2762
     5
// modification, are permitted provided that the following conditions are
dvander@2762
     6
// met:
dvander@2762
     7
//
dvander@2762
     8
//     * Redistributions of source code must retain the above copyright
dvander@2762
     9
// notice, this list of conditions and the following disclaimer.
dvander@2762
    10
//     * Redistributions in binary form must reproduce the above
dvander@2762
    11
// copyright notice, this list of conditions and the following disclaimer
dvander@2762
    12
// in the documentation and/or other materials provided with the
dvander@2762
    13
// distribution.
dvander@2762
    14
//     * Neither the name of Google Inc. nor the names of its
dvander@2762
    15
// contributors may be used to endorse or promote products derived from
dvander@2762
    16
// this software without specific prior written permission.
dvander@2762
    17
//
dvander@2762
    18
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dvander@2762
    19
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dvander@2762
    20
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dvander@2762
    21
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dvander@2762
    22
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dvander@2762
    23
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dvander@2762
    24
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dvander@2762
    25
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dvander@2762
    26
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dvander@2762
    27
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dvander@2762
    28
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dvander@2762
    29
//
dvander@2762
    30
// Author: Sanjay Ghemawat
dvander@2762
    31
dvander@2762
    32
#ifndef _PCRECPPARG_H
dvander@2762
    33
#define _PCRECPPARG_H
dvander@2762
    34
dvander@2762
    35
#include <stdlib.h>    // for NULL
dvander@2762
    36
#include <string>
dvander@2762
    37
dvander@2762
    38
#include <pcre.h>
dvander@2762
    39
dvander@2762
    40
namespace pcrecpp {
dvander@2762
    41
dvander@2762
    42
class StringPiece;
dvander@2762
    43
dvander@2762
    44
// Hex/Octal/Binary?
dvander@2762
    45
dvander@2762
    46
// Special class for parsing into objects that define a ParseFrom() method
dvander@2762
    47
template <class T>
dvander@2762
    48
class _RE_MatchObject {
dvander@2762
    49
 public:
dvander@2762
    50
  static inline bool Parse(const char* str, int n, void* dest) {
dvander@2762
    51
    if (dest == NULL) return true;
dvander@2762
    52
    T* object = reinterpret_cast<T*>(dest);
dvander@2762
    53
    return object->ParseFrom(str, n);
dvander@2762
    54
  }
dvander@2762
    55
};
dvander@2762
    56
dvander@2762
    57
class PCRECPP_EXP_DEFN Arg {
dvander@2762
    58
 public:
dvander@2762
    59
  // Empty constructor so we can declare arrays of Arg
dvander@2762
    60
  Arg();
dvander@2762
    61
dvander@2762
    62
  // Constructor specially designed for NULL arguments
dvander@2762
    63
  Arg(void*);
dvander@2762
    64
dvander@2762
    65
  typedef bool (*Parser)(const char* str, int n, void* dest);
dvander@2762
    66
dvander@2762
    67
// Type-specific parsers
dvander@2762
    68
#define PCRE_MAKE_PARSER(type,name)                             \
dvander@2762
    69
  Arg(type* p) : arg_(p), parser_(name) { }                     \
dvander@2762
    70
  Arg(type* p, Parser parser) : arg_(p), parser_(parser) { }
dvander@2762
    71
dvander@2762
    72
dvander@2762
    73
  PCRE_MAKE_PARSER(char,               parse_char);
dvander@2762
    74
  PCRE_MAKE_PARSER(unsigned char,      parse_uchar);
dvander@2762
    75
  PCRE_MAKE_PARSER(short,              parse_short);
dvander@2762
    76
  PCRE_MAKE_PARSER(unsigned short,     parse_ushort);
dvander@2762
    77
  PCRE_MAKE_PARSER(int,                parse_int);
dvander@2762
    78
  PCRE_MAKE_PARSER(unsigned int,       parse_uint);
dvander@2762
    79
  PCRE_MAKE_PARSER(long,               parse_long);
dvander@2762
    80
  PCRE_MAKE_PARSER(unsigned long,      parse_ulong);
dvander@2762
    81
#if @pcre_have_long_long@
dvander@2762
    82
  PCRE_MAKE_PARSER(long long,          parse_longlong);
dvander@2762
    83
#endif
dvander@2762
    84
#if @pcre_have_ulong_long@
dvander@2762
    85
  PCRE_MAKE_PARSER(unsigned long long, parse_ulonglong);
dvander@2762
    86
#endif
dvander@2762
    87
  PCRE_MAKE_PARSER(float,              parse_float);
dvander@2762
    88
  PCRE_MAKE_PARSER(double,             parse_double);
dvander@2762
    89
  PCRE_MAKE_PARSER(std::string,        parse_string);
dvander@2762
    90
  PCRE_MAKE_PARSER(StringPiece,        parse_stringpiece);
dvander@2762
    91
dvander@2762
    92
#undef PCRE_MAKE_PARSER
dvander@2762
    93
dvander@2762
    94
  // Generic constructor
dvander@2762
    95
  template <class T> Arg(T*, Parser parser);
dvander@2762
    96
  // Generic constructor template
dvander@2762
    97
  template <class T> Arg(T* p)
dvander@2762
    98
    : arg_(p), parser_(_RE_MatchObject<T>::Parse) {
dvander@2762
    99
  }
dvander@2762
   100
dvander@2762
   101
  // Parse the data
dvander@2762
   102
  bool Parse(const char* str, int n) const;
dvander@2762
   103
dvander@2762
   104
 private:
dvander@2762
   105
  void*         arg_;
dvander@2762
   106
  Parser        parser_;
dvander@2762
   107
dvander@2762
   108
  static bool parse_null          (const char* str, int n, void* dest);
dvander@2762
   109
  static bool parse_char          (const char* str, int n, void* dest);
dvander@2762
   110
  static bool parse_uchar         (const char* str, int n, void* dest);
dvander@2762
   111
  static bool parse_float         (const char* str, int n, void* dest);
dvander@2762
   112
  static bool parse_double        (const char* str, int n, void* dest);
dvander@2762
   113
  static bool parse_string        (const char* str, int n, void* dest);
dvander@2762
   114
  static bool parse_stringpiece   (const char* str, int n, void* dest);
dvander@2762
   115
dvander@2762
   116
#define PCRE_DECLARE_INTEGER_PARSER(name)                                   \
dvander@2762
   117
 private:                                                                   \
dvander@2762
   118
  static bool parse_ ## name(const char* str, int n, void* dest);           \
dvander@2762
   119
  static bool parse_ ## name ## _radix(                                     \
dvander@2762
   120
    const char* str, int n, void* dest, int radix);                         \
dvander@2762
   121
 public:                                                                    \
dvander@2762
   122
  static bool parse_ ## name ## _hex(const char* str, int n, void* dest);   \
dvander@2762
   123
  static bool parse_ ## name ## _octal(const char* str, int n, void* dest); \
dvander@2762
   124
  static bool parse_ ## name ## _cradix(const char* str, int n, void* dest)
dvander@2762
   125
dvander@2762
   126
  PCRE_DECLARE_INTEGER_PARSER(short);
dvander@2762
   127
  PCRE_DECLARE_INTEGER_PARSER(ushort);
dvander@2762
   128
  PCRE_DECLARE_INTEGER_PARSER(int);
dvander@2762
   129
  PCRE_DECLARE_INTEGER_PARSER(uint);
dvander@2762
   130
  PCRE_DECLARE_INTEGER_PARSER(long);
dvander@2762
   131
  PCRE_DECLARE_INTEGER_PARSER(ulong);
dvander@2762
   132
  PCRE_DECLARE_INTEGER_PARSER(longlong);
dvander@2762
   133
  PCRE_DECLARE_INTEGER_PARSER(ulonglong);
dvander@2762
   134
dvander@2762
   135
#undef PCRE_DECLARE_INTEGER_PARSER
dvander@2762
   136
};
dvander@2762
   137
dvander@2762
   138
inline Arg::Arg() : arg_(NULL), parser_(parse_null) { }
dvander@2762
   139
inline Arg::Arg(void* p) : arg_(p), parser_(parse_null) { }
dvander@2762
   140
dvander@2762
   141
inline bool Arg::Parse(const char* str, int n) const {
dvander@2762
   142
  return (*parser_)(str, n, arg_);
dvander@2762
   143
}
dvander@2762
   144
dvander@2762
   145
// This part of the parser, appropriate only for ints, deals with bases
dvander@2762
   146
#define MAKE_INTEGER_PARSER(type, name) \
dvander@2762
   147
  inline Arg Hex(type* ptr) { \
dvander@2762
   148
    return Arg(ptr, Arg::parse_ ## name ## _hex); } \
dvander@2762
   149
  inline Arg Octal(type* ptr) { \
dvander@2762
   150
    return Arg(ptr, Arg::parse_ ## name ## _octal); } \
dvander@2762
   151
  inline Arg CRadix(type* ptr) { \
dvander@2762
   152
    return Arg(ptr, Arg::parse_ ## name ## _cradix); }
dvander@2762
   153
dvander@2762
   154
MAKE_INTEGER_PARSER(short,              short)     /*                        */
dvander@2762
   155
MAKE_INTEGER_PARSER(unsigned short,     ushort)    /*                        */
dvander@2762
   156
MAKE_INTEGER_PARSER(int,                int)       /* Don't use semicolons   */
dvander@2762
   157
MAKE_INTEGER_PARSER(unsigned int,       uint)      /* after these statement  */
dvander@2762
   158
MAKE_INTEGER_PARSER(long,               long)      /* because they can cause */
dvander@2762
   159
MAKE_INTEGER_PARSER(unsigned long,      ulong)     /* compiler warnings if   */
dvander@2762
   160
#if @pcre_have_long_long@                          /* the checking level is  */
dvander@2762
   161
MAKE_INTEGER_PARSER(long long,          longlong)  /* turned up high enough. */
dvander@2762
   162
#endif                                             /*                        */
dvander@2762
   163
#if @pcre_have_ulong_long@                         /*                        */
dvander@2762
   164
MAKE_INTEGER_PARSER(unsigned long long, ulonglong) /*                        */
dvander@2762
   165
#endif
dvander@2762
   166
dvander@2762
   167
#undef PCRE_IS_SET
dvander@2762
   168
#undef PCRE_SET_OR_CLEAR
dvander@2762
   169
#undef MAKE_INTEGER_PARSER
dvander@2762
   170
dvander@2762
   171
}   // namespace pcrecpp
dvander@2762
   172
dvander@2762
   173
dvander@2762
   174
#endif /* _PCRECPPARG_H */