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);
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;
140 searchLimit = (
char *) text + index;
141 searchStart = (
char *) searchLimit + range;
143 forwardSearch =
true;
144 searchStart = (
char *) text + index;
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) {
213 char save = *(text+length);
214 *(
char*)(text+length) =
'\0';
219 *(
char*)(text+length) =
save;
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) 359 #define RE_CHARBITS 0xff 362 #define UCHARAT(p) ((int)*(p)&RE_CHARBITS) 364 #define FAIL(m) { regerror(m); return(nil); } 365 #define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?') 366 #define META "^$.[()|?+*\\" 409 FAIL(
"nil argument");
417 if (
reg(0, &flags) ==
nil)
422 FAIL(
"regexp too big");
432 if (
reg(0, &flags) ==
nil) {
449 else if (
OP(scan) ==
BOL)
486 reg(
int paren,
int* flagp) {
522 if (!(flags&HASWIDTH))
537 FAIL(
"unmatched ()");
538 }
else if (!paren && *
regparse !=
'\0') {
540 FAIL(
"unmatched ()");
613 FAIL(
"*+ operand could be empty");
616 if (op ==
'*' && (flags&
SIMPLE))
618 else if (op ==
'*') {
625 }
else if (op ==
'+' && (flags&SIMPLE))
627 else if (op ==
'+') {
634 }
else if (op ==
'?') {
694 if (classbeg > classend+1)
695 FAIL(
"invalid [] range");
696 for (; classbeg <= classend; classbeg++)
705 FAIL(
"unmatched []");
712 FAIL(
"internal urp");
717 FAIL(
"?+* follows nothing");
724 ret =
reg(1, &flags);
742 FAIL(
"internal disaster");
744 if (len > 1 &&
ISMULT(ender))
849 *(scan+1) = (offset>>8)&0377;
850 *(scan+2) = offset&0377;
884 if (prog ==
nil ||
string ==
nil) {
898 while ((s = strchr(s, prog->
regmust[0])) !=
nil) {
912 return(
regtry(prog,
string));
928 }
while (*s++ !=
'\0');
949 for (i =
NSUBEXP; i > 0; i--) {
977 while (scan !=
nil) {
1003 if (len > 1 && strncmp(opnd,
reginput, len) != 0)
1114 min = (
OP(scan) ==
STAR) ? 0 : 1;
1119 if (nextch ==
'\0' || *
reginput == nextch)
1160 count = strlen(scan);
1164 while (*opnd == *scan) {
1170 while (*scan !=
'\0' && strchr(opnd, *scan) !=
nil) {
1176 while (*scan !=
'\0' && strchr(opnd, *scan) ==
nil) {
1213 std::cerr <<
"regexp: " << s <<
"\n";
static char * regnode(char op)
static int regrepeat(char *p)
static regexp * regcomp(const char *exp)
static void reginsert(char op, char *opnd)
static void regtail(char *p, char *val)
static void regerror(const char *s)
static int regexec(regexp *prog, char *string)
static int regtry(regexp *prog, char *string)
static void regoptail(char *p, char *val)
static int regmatch(char *prog)
static char * reg(int paren, int *flagp)
static char * regnext(char *p)
static char * regbranch(int *flagp)
int BeginningOfMatch(int subexp=0)
char * FindNewline(char *s)
static double save(void *v)
const char * pattern() const
static const char * regparse
static char * regpiece(int *flagp)
static struct @32 flags[]
int Match(const char *text, int length, int index)
int Search(const char *text, int length, int index, int range)
int EndOfMatch(int subexp=0)
static char * regatom(int *flagp)