2 #include <../../nrnconf.h>
46 static char*
reg(
int paren,
int* flagp);
49 static char*
regatom(
int* flagp);
52 static void regc(
char b);
53 static void reginsert(
char op,
char* opnd);
54 static void regtail(
char*
p,
char* val);
65 return strchr(s,
'\n');
78 int length = strlen(pat);
117 char* endOfLine =
nil;
118 char* lastMatch =
nil;
126 if (
index + range > length) {
127 range = length -
index;
139 forwardSearch =
false;
141 searchStart = (
char *) searchLimit + range;
143 forwardSearch =
true;
145 searchLimit = (
char *) searchStart + range;
149 char save = *searchLimit;
154 if (frontAnchored && (searchStart !=
text || searchStart[-1] ==
'\n')) {
155 searchStart =
NextLine(searchStart);
158 while (searchStart && searchStart < searchLimit) {
161 if (endAnchored && (endOfLine =
FindNewline(searchStart)) !=
nil) {
179 searchStart =
NextLine(searchStart);
184 if (frontAnchored || endAnchored)
185 searchStart =
NextLine(searchStart);
190 if (!forwardSearch && lastMatch) {
214 *(
char*)(
text+length) =
'\0';
228 if (subexp < 0 || subexp >
NSUBEXP ||
235 if (subexp < 0 || subexp >
NSUBEXP ||
352 #define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377))
353 #define OPERAND(p) ((p) + 3)
368 #define FAIL(m) { regerror(m); return(nil); }
369 #define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?')
370 #define META "^$.[()|?+*\\"
413 FAIL(
"nil argument");
421 if (
reg(0, &flags) ==
nil)
426 FAIL(
"regexp too big");
436 if (
reg(0, &flags) ==
nil) {
453 else if (
OP(scan) ==
BOL)
490 reg(
int paren,
int* flagp) {
541 FAIL(
"unmatched ()");
542 }
else if (!paren && *
regparse !=
'\0') {
544 FAIL(
"unmatched ()");
617 FAIL(
"*+ operand could be empty");
620 if (op ==
'*' && (flags&
SIMPLE))
622 else if (op ==
'*') {
629 }
else if (op ==
'+' && (flags&
SIMPLE))
631 else if (op ==
'+') {
638 }
else if (op ==
'?') {
698 if (classbeg > classend+1)
699 FAIL(
"invalid [] range");
700 for (; classbeg <= classend; classbeg++)
709 FAIL(
"unmatched []");
716 FAIL(
"internal urp");
721 FAIL(
"?+* follows nothing");
746 FAIL(
"internal disaster");
748 if (len > 1 &&
ISMULT(ender))
853 *(scan+1) = (offset>>8)&0377;
854 *(scan+2) = offset&0377;
902 while ((s = strchr(s,
prog->regmust[0])) !=
nil) {
903 if (strncmp(s,
prog->regmust,
prog->regmlen) == 0)
920 if (
prog->regstart !=
'\0')
922 while ((s = strchr(s,
prog->regstart)) !=
nil) {
932 }
while (*s++ !=
'\0');
958 prog->startp[0] = string;
981 while (scan !=
nil) {
1007 if (len > 1 && strncmp(opnd,
reginput, len) != 0)
1123 if (nextch ==
'\0' || *
reginput == nextch)
1164 count = strlen(scan);
1168 while (*opnd == *scan) {
1174 while (*scan !=
'\0' && strchr(opnd, *scan) !=
nil) {
1180 while (*scan !=
'\0' && strchr(opnd, *scan) ==
nil) {
1217 std::cerr <<
"regexp: " << s <<
"\n";
int Match(const char *text, int length, int index)
int EndOfMatch(int subexp=0)
int BeginningOfMatch(int subexp=0)
int Search(const char *text, int length, int index, int range)
const char * pattern() const
static char * regnode(char op)
static char * regpiece(int *flagp)
static regexp * regcomp(const char *exp)
static int regtry(regexp *prog, char *string)
static void regtail(char *p, char *val)
static char * regnext(char *p)
char * FindNewline(char *s)
static void reginsert(char op, char *opnd)
int UCHARAT(const char *p)
This replaces a macro of the same name with some bit manipulation magic in it.
static char * regbranch(int *flagp)
static void regerror(const char *s)
static int regrepeat(char *p)
static char * reg(int paren, int *flagp)
static const char * regparse
static char * regatom(int *flagp)
static int regexec(regexp *prog, char *string)
static void regoptail(char *p, char *val)
static int regmatch(char *prog)
static double save(void *v)