00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef _REG_EXB_H
00043 #define _REG_EXB_H
00044
00050 #include <support/Debug.h>
00051 #include <support/SupportDefs.h>
00052
00053 #if _SUPPORTS_NAMESPACE
00054 namespace palmos {
00055 namespace support {
00056 #endif
00057
00062 class SString;
00063
00064 const int32_t kSubExpressionMax = 10;
00065
00066 struct regexp
00067 {
00068 const char *startp[kSubExpressionMax];
00069 const char *endp[kSubExpressionMax];
00070 char regstart;
00071 char reganch;
00072 const char *regmust;
00073 int regmlen;
00074 char program[1];
00075 };
00076
00077 class SRegExp
00078 {
00079
00080 public:
00081 SRegExp();
00082 SRegExp(const char *);
00083 SRegExp(const SString &);
00084 ~SRegExp();
00085
00086 status_t InitCheck() const;
00087
00088 status_t SetTo(const char*);
00089 status_t SetTo(const SString &);
00090
00091 bool Matches(const char *string) const;
00092 bool Matches(const SString &) const;
00093
00094 bool Search(const char *text, int32_t searchStart, int32_t *matchStart, int32_t *matchEnd);
00095
00096 int32_t RunMatcher(regexp *, const char *) const;
00097 regexp *Compile(const char *);
00098 regexp *Expression() const;
00099 const char *ErrorString() const;
00100
00101 #if DEBUG
00102 void Dump();
00103 #endif
00104
00105 private:
00106
00107 void SetError(status_t error) const;
00108
00109
00110 char *Reg(int32_t, int32_t *);
00111 char *Branch(int32_t *);
00112 char *Piece(int32_t *);
00113 char *Atom(int32_t *);
00114 char *Node(char);
00115 char *Next(char *);
00116 const char *Next(const char *) const;
00117 void EmitChar(char);
00118 void Insert(char, char *);
00119 void Tail(char *, char *);
00120 void OpTail(char *, char *);
00121
00122
00123 int32_t Try(regexp *, const char *) const;
00124 int32_t Match(const char *) const;
00125 int32_t Repeat(const char *) const;
00126
00127
00128 #if DEBUG
00129 char *Prop(const char *) const;
00130 void RegExpError(const char *) const;
00131 #endif
00132 inline int32_t UCharAt(const char *p) const;
00133 inline char *Operand(char* p) const;
00134 inline const char *Operand(const char* p) const;
00135 inline bool IsMult(char c) const;
00136
00137
00138
00139 mutable status_t fError;
00140 regexp *fRegExp;
00141
00142
00143
00144 const char *fInputScanPointer;
00145 int32_t fParenthesisCount;
00146 char fDummy;
00147 char *fCodeEmitPointer;
00148 long fCodeSize;
00149
00150
00151
00152 mutable const char *fStringInputPointer;
00153 mutable const char *fRegBol;
00154 mutable const char **fStartPArrayPointer;
00155 mutable const char **fEndPArrayPointer;
00156 };
00157
00160 #if _SUPPORTS_NAMESPACE
00161 } }
00162 #endif
00163
00164 #endif