OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
Public Member Functions | Private Member Functions | Private Attributes | List of all members
ossimRegExp Class Reference

#include <ossimRegExp.h>

Public Member Functions

 ossimRegExp ()
 
 ossimRegExp (const char *)
 
 ossimRegExp (const ossimRegExp &)
 
 ~ossimRegExp ()
 
void compile (const char *)
 
bool find (const char *)
 
ossim_uint32 start () const
 
ossim_uint32 end () const
 
bool operator== (const ossimRegExp &) const
 
bool operator!= (const ossimRegExp &) const
 
bool deep_equal (const ossimRegExp &) const
 
bool is_valid () const
 
void set_invalid ()
 
ossim_uint32 start (ossim_uint32 n) const
 
ossim_uint32 end (ossim_uint32 n) const
 
std::string match (ossim_uint32 n) const
 

Private Member Functions

char * reg (int, int *)
 
char * regbranch (int *)
 
char * regpiece (int *)
 
char * regatom (int *)
 
char * regnode (char)
 
const char * regnext (const char *)
 
char * regnext (char *)
 
void regc (unsigned char)
 
void reginsert (char, char *)
 
void regtail (char *, const char *)
 
void regoptail (char *, const char *)
 
int regtry (const char *, const char **, const char **, const char *)
 
int regmatch (const char *)
 
int regrepeat (const char *)
 

Private Attributes

const char * startp [NSUBEXP]
 
const char * endp [NSUBEXP]
 
char regstart
 
char reganch
 
const char * regmust
 
ossim_uint32 regmlen
 
char * program
 
ossim_uint32 progsize
 
const char * searchstring
 
const char * regparse
 
int regnpar
 
char regdummy
 
char * regcode
 
long regsize
 
const char * reginput
 
const char * regbol
 
const char ** regstartp
 
const char ** regendp
 

Detailed Description

Definition at line 75 of file ossimRegExp.h.

Constructor & Destructor Documentation

◆ ossimRegExp() [1/3]

ossimRegExp::ossimRegExp ( )
inline

Definition at line 144 of file ossimRegExp.h.

144  :
145  regstart(0), // Internal use only
146  reganch(0), // Internal use only
147  regmust(0), // Internal use only
148  regmlen(0), // Internal use only
149  program(0),
150  progsize(0),
151  searchstring(0),
152 
153  // work variables
154  regparse(0),
155  regnpar(0), // () count.
156  regdummy(0),
157  regcode(0), // Code-emit pointer; &regdummy = don't.
158  regsize(0), // Code size.
159  reginput(0), // String-input pointer.
160  regbol(0), // Beginning of input, for ^ check.
161  regstartp(0), // Pointer to startp array.
162  regendp(0) // Ditto for endp.
163 {
164 }
const char ** regstartp
Definition: ossimRegExp.h:118
const char ** regendp
Definition: ossimRegExp.h:119
const char * regbol
Definition: ossimRegExp.h:117
const char * reginput
Definition: ossimRegExp.h:116
const char * regparse
Definition: ossimRegExp.h:111
char * program
Definition: ossimRegExp.h:106
const char * regmust
Definition: ossimRegExp.h:104
char * regcode
Definition: ossimRegExp.h:114
const char * searchstring
Definition: ossimRegExp.h:108
ossim_uint32 progsize
Definition: ossimRegExp.h:107
ossim_uint32 regmlen
Definition: ossimRegExp.h:105

◆ ossimRegExp() [2/3]

ossimRegExp::ossimRegExp ( const char *  s)
inline

Definition at line 171 of file ossimRegExp.h.

References compile(), and program.

171  :
172  regstart(0), // Internal use only
173  reganch(0), // Internal use only
174  regmust(0), // Internal use only
175  regmlen(0), // Internal use only
176  program(0),
177  progsize(0),
178  searchstring(0),
179 
180  // work variables
181  regparse(0),
182  regnpar(0), // () count.
183  regdummy(0),
184  regcode(0), // Code-emit pointer; &regdummy = don't.
185  regsize(0), // Code size.
186  reginput(0), // String-input pointer.
187  regbol(0), // Beginning of input, for ^ check.
188  regstartp(0), // Pointer to startp array.
189  regendp(0) // Ditto for endp.
190 {
191  this->program = NULL;
192  compile(s);
193 }
const char ** regstartp
Definition: ossimRegExp.h:118
const char ** regendp
Definition: ossimRegExp.h:119
const char * regbol
Definition: ossimRegExp.h:117
const char * reginput
Definition: ossimRegExp.h:116
const char * regparse
Definition: ossimRegExp.h:111
char * program
Definition: ossimRegExp.h:106
void compile(const char *)
const char * regmust
Definition: ossimRegExp.h:104
char * regcode
Definition: ossimRegExp.h:114
const char * searchstring
Definition: ossimRegExp.h:108
ossim_uint32 progsize
Definition: ossimRegExp.h:107
ossim_uint32 regmlen
Definition: ossimRegExp.h:105

◆ ossimRegExp() [3/3]

ossimRegExp::ossimRegExp ( const ossimRegExp rxp)

Definition at line 124 of file ossimRegExp.cpp.

References endp, if(), program, progsize, reganch, regmlen, regmust, regstart, and startp.

124  :
125  regstart(0), // Internal use only
126  reganch(0), // Internal use only
127  regmust(0), // Internal use only
128  regmlen(0), // Internal use only
129  program(0),
130  progsize(0),
131  searchstring(0),
132 
133  // work variables
134  regparse(0),
135  regnpar(0), // () count.
136  regdummy(0),
137  regcode(0), // Code-emit pointer; &regdummy = don't.
138  regsize(0), // Code size.
139  reginput(0), // String-input pointer.
140  regbol(0), // Beginning of input, for ^ check.
141  regstartp(0), // Pointer to startp array.
142  regendp(0) // Ditto for endp.
143 {
144  if(rxp.program)
145  {
146  int ind = 0;
147  this->progsize = rxp.progsize; // Copy regular expression size
148  this->program = new char[this->progsize]; // Allocate storage
149  for(ind=this->progsize; ind-- != 0;) // Copy regular expresion
150  this->program[ind] = rxp.program[ind];
151  this->startp[0] = rxp.startp[0]; // Copy pointers into last
152  this->endp[0] = rxp.endp[0]; // Successful "find" operation
153  this->regmust = rxp.regmust; // Copy field
154  if (rxp.regmust != NULL) {
155  char* dum = rxp.program;
156  ind = 0;
157  while (dum != rxp.regmust) {
158  ++dum;
159  ++ind;
160  }
161  this->regmust = this->program + ind;
162  }
163  this->regstart = rxp.regstart; // Copy starting index
164  this->reganch = rxp.reganch; // Copy remaining private data
165  this->regmlen = rxp.regmlen; // Copy remaining private data
166  }
167 }
const char ** regstartp
Definition: ossimRegExp.h:118
const char ** regendp
Definition: ossimRegExp.h:119
const char * regbol
Definition: ossimRegExp.h:117
const char * reginput
Definition: ossimRegExp.h:116
const char * startp[NSUBEXP]
Definition: ossimRegExp.h:100
const char * regparse
Definition: ossimRegExp.h:111
char * program
Definition: ossimRegExp.h:106
if(yy_init)
const char * regmust
Definition: ossimRegExp.h:104
char * regcode
Definition: ossimRegExp.h:114
const char * searchstring
Definition: ossimRegExp.h:108
ossim_uint32 progsize
Definition: ossimRegExp.h:107
ossim_uint32 regmlen
Definition: ossimRegExp.h:105
const char * endp[NSUBEXP]
Definition: ossimRegExp.h:101

◆ ~ossimRegExp()

ossimRegExp::~ossimRegExp ( )
inline

Definition at line 197 of file ossimRegExp.h.

References program.

197  {
198 //#ifndef WIN32
199  if(program)
200  {
201  delete [] this->program;
202  this->program = 0;
203  }
204 //#endif
205 }
char * program
Definition: ossimRegExp.h:106

Member Function Documentation

◆ compile()

void ossimRegExp::compile ( const char *  exp)

Definition at line 405 of file ossimRegExp.cpp.

References BOL, END, endp, EXACTLY, MAGIC, OP, OPERAND, program, progsize, reg(), reganch, regc(), regcode, regdummy, regmlen, regmust, regnext(), regnpar, regparse, regsize, regstart, searchstring, SPSTART, and startp.

Referenced by ossimKeywordlist::add(), ossimKeywordlist::addPrefixToKeysThatMatch(), ossimTraceManager::addTrace(), ossimString::afterRegExp(), ossimString::beforeRegExp(), ossimKeywordlist::extractKeysThatMatch(), ossimDirectoryTree::findAllFilesThatMatch(), ossimDirectory::findAllFilesThatMatch(), ossimKeywordlist::findAllKeysThatMatch(), ossimString::fromRegExp(), ossimKeywordlist::getNumberOfKeysThatMatch(), ossimKeywordlist::getSubstringKeyList(), ossimString::match(), ossimRegExp(), ossimKeywordlist::removeKeysThatMatch(), ossimString::replaceAllThatMatch(), ossimString::replaceStrThatMatch(), ossimSrtmFilename::setFilename(), ossimTraceManager::setTraceFlags(), and ossimKeywordlist::stripPrefixFromAll().

405  {
406  const char* scan;
407  const char* longest;
408  unsigned long len;
409  int flags;
410 
411  if (exp == NULL) {
412  //RAISE Error, SYM(ossimRegExp), SYM(No_Expr),
413  printf ("ossimRegExp::compile(): No expression supplied.\n");
414  return;
415  }
416 
417  // First pass: determine size, legality.
418  regparse = exp;
419  regnpar = 1;
420  regsize = 0L;
421  regcode = &regdummy;
422  regc(MAGIC);
423  if(!reg(0, &flags))
424  {
425  printf ("ossimRegExp::compile(): Error in compile.\n");
426  return;
427  }
428  this->startp[0] = this->endp[0] = this->searchstring = NULL;
429 
430  // Small enough for pointer-storage convention?
431  if (regsize >= 32767L) { // Probably could be 65535L.
432  //RAISE Error, SYM(ossimRegExp), SYM(Expr_Too_Big),
433  printf ("ossimRegExp::compile(): Expression too big.\n");
434  return;
435  }
436 
437  // Allocate space.
438 //#ifndef WIN32
439  if (this->program != NULL) delete [] this->program;
440 //#endif
441  this->program = new char[regsize];
442  this->progsize = (int) regsize;
443 
444  if (this->program == NULL) {
445  //RAISE Error, SYM(ossimRegExp), SYM(Out_Of_Memory),
446  printf ("ossimRegExp::compile(): Out of memory.\n");
447  return;
448  }
449 
450  // Second pass: emit code.
451  regparse = exp;
452  regnpar = 1;
453  regcode = this->program;
454  regc(MAGIC);
455  reg(0, &flags);
456 
457  // Dig out information for optimizations.
458  this->regstart = '\0'; // Worst-case defaults.
459  this->reganch = 0;
460  this->regmust = NULL;
461  this->regmlen = 0;
462  scan = this->program + 1; // First BRANCH.
463  if (OP(regnext(scan)) == END) { // Only one top-level choice.
464  scan = OPERAND(scan);
465 
466  // Starting-point info.
467  if (OP(scan) == EXACTLY)
468  this->regstart = *OPERAND(scan);
469  else if (OP(scan) == BOL)
470  this->reganch++;
471 
472  //
473  // If there's something expensive in the r.e., find the longest
474  // literal string that must appear and make it the regmust. Resolve
475  // ties in favor of later strings, since the regstart check works
476  // with the beginning of the r.e. and avoiding duplication
477  // strengthens checking. Not a strong reason, but sufficient in the
478  // absence of others.
479  //
480  if (flags & SPSTART) {
481  longest = NULL;
482  len = 0;
483  for (; scan != NULL; scan = regnext(scan))
484  if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) {
485  longest = OPERAND(scan);
486  len = (unsigned long)strlen(OPERAND(scan));
487  }
488  this->regmust = longest;
489  this->regmlen = len;
490  }
491  }
492 }
void regc(unsigned char)
const char * regnext(const char *)
const char * startp[NSUBEXP]
Definition: ossimRegExp.h:100
const unsigned char MAGIC
#define BOL
const char * regparse
Definition: ossimRegExp.h:111
char * program
Definition: ossimRegExp.h:106
#define OPERAND(p)
#define EXACTLY
const char * regmust
Definition: ossimRegExp.h:104
char * regcode
Definition: ossimRegExp.h:114
const char * searchstring
Definition: ossimRegExp.h:108
#define END
ossim_uint32 progsize
Definition: ossimRegExp.h:107
char * reg(int, int *)
ossim_uint32 regmlen
Definition: ossimRegExp.h:105
const char * endp[NSUBEXP]
Definition: ossimRegExp.h:101
#define OP(p)
#define SPSTART

◆ deep_equal()

bool ossimRegExp::deep_equal ( const ossimRegExp rxp) const

Definition at line 189 of file ossimRegExp.cpp.

References endp, program, progsize, and startp.

189  {
190  ossim_uint32 ind = this->progsize; // Get regular expression size
191  if (ind != rxp.progsize) // If different size regexp
192  return false; // Return failure
193  while(ind-- != 0) // Else while still characters
194  if(this->program[ind] != rxp.program[ind]) // If regexp are different
195  return false; // Return failure
196  return (this->startp[0] == rxp.startp[0] && // Else if same start/end ptrs,
197  this->endp[0] == rxp.endp[0]); // Return true
198 }
const char * startp[NSUBEXP]
Definition: ossimRegExp.h:100
unsigned int ossim_uint32
char * program
Definition: ossimRegExp.h:106
ossim_uint32 progsize
Definition: ossimRegExp.h:107
const char * endp[NSUBEXP]
Definition: ossimRegExp.h:101

◆ end() [1/2]

ossim_uint32 ossimRegExp::end ( ) const
inline

◆ end() [2/2]

ossim_uint32 ossimRegExp::end ( ossim_uint32  n) const
inline

Definition at line 253 of file ossimRegExp.h.

References endp, n, and searchstring.

254 {
255  return this->endp[n] - searchstring;
256 }
os2<< "> n<< " > nendobj n
const char * searchstring
Definition: ossimRegExp.h:108
const char * endp[NSUBEXP]
Definition: ossimRegExp.h:101

◆ find()

bool ossimRegExp::find ( const char *  string)

Definition at line 948 of file ossimRegExp.cpp.

References endp, MAGIC, program, reganch, regbol, regmlen, regmust, regstart, regtry(), searchstring, startp, and UCHARAT.

Referenced by ossimKeywordlist::add(), ossimKeywordlist::addPrefixToKeysThatMatch(), ossimTraceManager::addTrace(), ossimString::afterRegExp(), ossimString::beforeRegExp(), ossimFilename::drive(), ossimString::expandEnvironmentVariable(), ossimKeywordlist::extractKeysThatMatch(), ossimDirectoryTree::findAllFilesThatMatch(), ossimDirectory::findAllFilesThatMatch(), ossimKeywordlist::findAllKeysThatMatch(), ossimString::fromRegExp(), ossimKeywordlist::getNumberOfKeysThatMatch(), ossimKeywordlist::getSubstringKeyList(), ossimFilename::isRelative(), ossimString::match(), ossimDtedInfo::open(), ossimKeywordlist::removeKeysThatMatch(), ossimString::replaceAllThatMatch(), ossimString::replaceStrThatMatch(), ossimSrtmFilename::setFilename(), ossimTraceManager::setTraceFlags(), ossimKeywordlist::stripPrefixFromAll(), and ossimKeywordlist::writeToStream().

948  {
949  const char* s = 0;
950 
951  if(!string) return false;
952  this->searchstring = string;
953 
954  // Check validity of program.
955  if (!this->program || UCHARAT(this->program) != MAGIC) {
956  //RAISE Error, SYM(ossimRegExp), SYM(Internal_Error),
957  printf ("ossimRegExp::find(): Compiled regular expression corrupted.\n");
958  return 0;
959  }
960 
961  // If there is a "must appear" string, look for it.
962  if (this->regmust != NULL) {
963  s = string;
964  while ((s = strchr(s, this->regmust[0])) != NULL) {
965  if (strncmp(s, this->regmust, this->regmlen) == 0)
966  break; // Found it.
967  s++;
968  }
969  if (s == NULL) // Not present.
970  return (0);
971  }
972 
973  // Mark beginning of line for ^ .
974  regbol = string;
975 
976  // Simplest case: anchored match need be tried only once.
977  if (this->reganch)
978  return (regtry(string, this->startp, this->endp, this->program));
979 
980  // Messy cases: unanchored match.
981  s = string;
982  if (this->regstart != '\0')
983  // We know what char it must start with.
984  while ((s = strchr(s, this->regstart)) != NULL) {
985  if (regtry(s, this->startp, this->endp, this->program))
986  return (1);
987  s++;
988 
989  }
990  else
991  // We don't -- general case.
992  do {
993  if (regtry(s, this->startp, this->endp, this->program))
994  return (1);
995  } while (*s++ != '\0');
996 
997  // Failure.
998  return (0);
999 }
const char * regbol
Definition: ossimRegExp.h:117
#define UCHARAT(p)
int regtry(const char *, const char **, const char **, const char *)
const char * startp[NSUBEXP]
Definition: ossimRegExp.h:100
const unsigned char MAGIC
char * program
Definition: ossimRegExp.h:106
const char * regmust
Definition: ossimRegExp.h:104
const char * searchstring
Definition: ossimRegExp.h:108
ossim_uint32 regmlen
Definition: ossimRegExp.h:105
const char * endp[NSUBEXP]
Definition: ossimRegExp.h:101

◆ is_valid()

bool ossimRegExp::is_valid ( ) const
inline

Definition at line 232 of file ossimRegExp.h.

References program.

Referenced by ossimString::replaceAllThatMatch(), and ossimString::replaceStrThatMatch().

232  {
233  return (this->program != NULL);
234 }
char * program
Definition: ossimRegExp.h:106

◆ match()

std::string ossimRegExp::match ( ossim_uint32  n) const
inline

Definition at line 259 of file ossimRegExp.h.

References endp, and startp.

260 {
261  return std::string(this->startp[n], this->endp[n] - this->startp[n]);
262 }
const char * startp[NSUBEXP]
Definition: ossimRegExp.h:100
os2<< "> n<< " > nendobj n
const char * endp[NSUBEXP]
Definition: ossimRegExp.h:101

◆ operator!=()

bool ossimRegExp::operator!= ( const ossimRegExp r) const
inline

Definition at line 224 of file ossimRegExp.h.

224  {
225  return(!(*this == r));
226 }

◆ operator==()

bool ossimRegExp::operator== ( const ossimRegExp rxp) const

Definition at line 173 of file ossimRegExp.cpp.

References program, and progsize.

173  {
174  if (this != &rxp) { // Same address?
175  ossim_uint32 ind = this->progsize; // Get regular expression size
176  if (ind != rxp.progsize) // If different size regexp
177  return false; // Return failure
178  while(ind-- != 0) // Else while still characters
179  if(this->program[ind] != rxp.program[ind]) // If regexp are different
180  return false; // Return failure
181  }
182  return true; // Else same, return success
183 }
unsigned int ossim_uint32
char * program
Definition: ossimRegExp.h:106
ossim_uint32 progsize
Definition: ossimRegExp.h:107

◆ reg()

char * ossimRegExp::reg ( int  paren,
int *  flagp 
)
private

Definition at line 504 of file ossimRegExp.cpp.

References CLOSE, END, HASWIDTH, NSUBEXP, OPEN, regbranch(), regnext(), regnode(), regnpar, regoptail(), regparse, regtail(), and SPSTART.

Referenced by compile(), and regatom().

504  {
505  char* ret;
506  char* br;
507  char* ender;
508  int parno =0;
509  int flags;
510 
511  *flagp = HASWIDTH; // Tentatively.
512 
513  // Make an OPEN node, if parenthesized.
514  if (paren) {
515  if (regnpar >= NSUBEXP) {
516  //RAISE Error, SYM(ossimRegExp), SYM(Too_Many_Parens),
517  printf ("ossimRegExp::compile(): Too many parentheses.\n");
518  return 0;
519  }
520  parno = regnpar;
521  regnpar++;
522  ret = regnode(OPEN + parno);
523  }
524  else
525  ret = NULL;
526 
527  // Pick up the branches, linking them together.
528  br = regbranch(&flags);
529  if (br == NULL)
530  return (NULL);
531  if (ret != NULL)
532  regtail(ret, br); // OPEN -> first.
533  else
534  ret = br;
535  if (!(flags & HASWIDTH))
536  *flagp &= ~HASWIDTH;
537  *flagp |= flags & SPSTART;
538  while (*regparse == '|') {
539  regparse++;
540  br = regbranch(&flags);
541  if (br == NULL)
542  return (NULL);
543  regtail(ret, br); // BRANCH -> BRANCH.
544  if (!(flags & HASWIDTH))
545  *flagp &= ~HASWIDTH;
546  *flagp |= flags & SPSTART;
547  }
548 
549  // Make a closing node, and hook it on the end.
550  ender = regnode((paren) ? CLOSE + parno : END);
551  regtail(ret, ender);
552 
553  // Hook the tails of the branches to the closing node.
554  for (br = ret; br != NULL; br = regnext(br))
555  regoptail(br, ender);
556 
557  // Check for proper termination.
558  if (paren && *regparse++ != ')') {
559  //RAISE Error, SYM(ossimRegExp), SYM(Unmatched_Parens),
560  printf ("ossimRegExp::compile(): Unmatched parentheses.\n");
561  return 0;
562  }
563  else if (!paren && *regparse != '\0') {
564  if (*regparse == ')') {
565  //RAISE Error, SYM(ossimRegExp), SYM(Unmatched_Parens),
566  printf ("ossimRegExp::compile(): Unmatched parentheses.\n");
567  return 0;
568  }
569  else {
570  //RAISE Error, SYM(ossimRegExp), SYM(Internal_Error),
571  printf ("ossimRegExp::compile(): Internal error.\n");
572  return 0;
573  }
574  // NOTREACHED
575  }
576  return (ret);
577 }
void regtail(char *, const char *)
char * regbranch(int *)
void regoptail(char *, const char *)
const char * regnext(const char *)
#define HASWIDTH
const char * regparse
Definition: ossimRegExp.h:111
#define OPEN
char * regnode(char)
#define CLOSE
const int NSUBEXP
Definition: ossimRegExp.h:72
#define END
#define SPSTART

◆ regatom()

char * ossimRegExp::regatom ( int *  flagp)
private

Definition at line 691 of file ossimRegExp.cpp.

References ANY, ANYBUT, ANYOF, BOL, EOL, EXACTLY, HASWIDTH, ISMULT, META, reg(), regc(), regnode(), regparse, SIMPLE, SPSTART, UCHARAT, and WORST.

Referenced by regpiece().

691  {
692  char* ret;
693  int flags;
694 
695  *flagp = WORST; // Tentatively.
696 
697  switch (*regparse++) {
698  case '^':
699  ret = regnode(BOL);
700  break;
701  case '$':
702  ret = regnode(EOL);
703  break;
704  case '.':
705  ret = regnode(ANY);
706  *flagp |= HASWIDTH | SIMPLE;
707  break;
708  case '[':{
709  int rxpclass;
710  int rxpclassend;
711 
712  if (*regparse == '^') { // Complement of range.
713  ret = regnode(ANYBUT);
714  regparse++;
715  }
716  else
717  ret = regnode(ANYOF);
718  if (*regparse == ']' || *regparse == '-')
719  regc(*regparse++);
720  while (*regparse != '\0' && *regparse != ']') {
721  if (*regparse == '-') {
722  regparse++;
723  if (*regparse == ']' || *regparse == '\0')
724  regc('-');
725  else {
726  rxpclass = UCHARAT(regparse - 2) + 1;
727  rxpclassend = UCHARAT(regparse);
728  if (rxpclass > rxpclassend + 1) {
729  //RAISE Error, SYM(ossimRegExp), SYM(Invalid_Range),
730  printf ("ossimRegExp::compile(): Invalid range in [].\n");
731  return 0;
732  }
733  for (; rxpclass <= rxpclassend; rxpclass++)
734  regc(rxpclass);
735  regparse++;
736  }
737  }
738  else
739  regc(*regparse++);
740  }
741  regc('\0');
742  if (*regparse != ']') {
743  //RAISE Error, SYM(ossimRegExp), SYM(Unmatched_Bracket),
744  printf ("ossimRegExp::compile(): Unmatched [].\n");
745  return 0;
746  }
747  regparse++;
748  *flagp |= HASWIDTH | SIMPLE;
749  }
750  break;
751  case '(':
752  ret = reg(1, &flags);
753  if (ret == NULL)
754  return (NULL);
755  *flagp |= flags & (HASWIDTH | SPSTART);
756  break;
757  case '\0':
758  case '|':
759  case ')':
760  //RAISE Error, SYM(ossimRegExp), SYM(Internal_Error),
761  printf ("ossimRegExp::compile(): Internal error.\n"); // Never here
762  return 0;
763  case '?':
764  case '+':
765  case '*':
766  //RAISE Error, SYM(ossimRegExp), SYM(No_Operand),
767  printf ("ossimRegExp::compile(): ?+* follows nothing.\n");
768  return 0;
769  case '\\':
770  if (*regparse == '\0') {
771  //RAISE Error, SYM(ossimRegExp), SYM(Trailing_Backslash),
772  printf ("ossimRegExp::compile(): Trailing backslash.\n");
773  return 0;
774  }
775  ret = regnode(EXACTLY);
776  regc(*regparse++);
777  regc('\0');
778  *flagp |= HASWIDTH | SIMPLE;
779  break;
780  default:{
781  int len;
782  char ender;
783 
784  regparse--;
785  len = (int)strcspn(regparse, META);
786  if (len <= 0) {
787  //RAISE Error, SYM(ossimRegExp), SYM(Internal_Error),
788  printf ("ossimRegExp::compile(): Internal error.\n");
789  return 0;
790  }
791  ender = *(regparse + len);
792  if (len > 1 && ISMULT(ender))
793  len--; // Back off clear of ?+* operand.
794  *flagp |= HASWIDTH;
795  if (len == 1)
796  *flagp |= SIMPLE;
797  ret = regnode(EXACTLY);
798  while (len > 0) {
799  regc(*regparse++);
800  len--;
801  }
802  regc('\0');
803  }
804  break;
805  }
806  return (ret);
807 }
#define ISMULT(c)
#define UCHARAT(p)
void regc(unsigned char)
#define EOL
#define SIMPLE
#define ANY
#define BOL
#define HASWIDTH
const char * regparse
Definition: ossimRegExp.h:111
#define META
#define ANYBUT
char * regnode(char)
#define EXACTLY
char * reg(int, int *)
#define WORST
#define SPSTART
#define ANYOF

◆ regbranch()

char * ossimRegExp::regbranch ( int *  flagp)
private

Definition at line 585 of file ossimRegExp.cpp.

References BRANCH, HASWIDTH, NOTHING, regnode(), regparse, regpiece(), regtail(), SPSTART, and WORST.

Referenced by reg().

585  {
586  char* ret;
587  char* chain;
588  char* latest;
589  int flags;
590 
591  *flagp = WORST; // Tentatively.
592 
593  ret = regnode(BRANCH);
594  chain = NULL;
595  while (*regparse != '\0' && *regparse != '|' && *regparse != ')') {
596  latest = regpiece(&flags);
597  if (latest == NULL)
598  return (NULL);
599  *flagp |= flags & HASWIDTH;
600  if (chain == NULL) // First piece.
601  *flagp |= flags & SPSTART;
602  else
603  regtail(chain, latest);
604  chain = latest;
605  }
606  if (chain == NULL) // Loop ran zero times.
607  regnode(NOTHING);
608 
609  return (ret);
610 }
void regtail(char *, const char *)
#define NOTHING
#define BRANCH
#define HASWIDTH
const char * regparse
Definition: ossimRegExp.h:111
char * regnode(char)
char * regpiece(int *)
#define WORST
#define SPSTART

◆ regc()

void ossimRegExp::regc ( unsigned char  b)
private

Definition at line 837 of file ossimRegExp.cpp.

References regcode, regdummy, and regsize.

Referenced by compile(), and regatom().

837  {
838  if (regcode != &regdummy)
839  *regcode++ = b;
840  else
841  regsize++;
842 }
char * regcode
Definition: ossimRegExp.h:114

◆ reginsert()

void ossimRegExp::reginsert ( char  op,
char *  opnd 
)
private

Definition at line 850 of file ossimRegExp.cpp.

References regcode, regdummy, and regsize.

Referenced by regpiece().

850  {
851  char* src;
852  char* dst;
853  char* place;
854 
855  if (regcode == &regdummy) {
856  regsize += 3;
857  return;
858  }
859 
860  src = regcode;
861  regcode += 3;
862  dst = regcode;
863  while (src > opnd)
864  *--dst = *--src;
865 
866  place = opnd; // Op node, where operand used to be.
867  *place++ = op;
868  *place++ = '\0';
869  *place++ = '\0';
870 }
char * regcode
Definition: ossimRegExp.h:114

◆ regmatch()

int ossimRegExp::regmatch ( const char *  prog)
private

Definition at line 1043 of file ossimRegExp.cpp.

References ANY, ANYBUT, ANYOF, BACK, BOL, BRANCH, CLOSE, END, EOL, EXACTLY, NOTHING, OP, OPEN, OPERAND, PLUS, regbol, regendp, reginput, regnext(), regrepeat(), regstartp, and STAR.

Referenced by regtry().

1043  {
1044  const char* scan; // Current node.
1045  const char* next; // Next node.
1046 
1047  scan = prog;
1048 
1049  while (scan != NULL) {
1050 
1051  next = regnext(scan);
1052 
1053  switch (OP(scan)) {
1054  case BOL:
1055  if (reginput != regbol)
1056  return (0);
1057  break;
1058  case EOL:
1059  if (*reginput != '\0')
1060  return (0);
1061  break;
1062  case ANY:
1063  if (*reginput == '\0')
1064  return (0);
1065  reginput++;
1066  break;
1067  case EXACTLY:{
1068  int len;
1069  const char* opnd;
1070 
1071  opnd = OPERAND(scan);
1072  // Inline the first character, for speed.
1073  if (*opnd != *reginput)
1074  return (0);
1075  len = (int)strlen(opnd);
1076  if (len > 1 && strncmp(opnd, reginput, len) != 0)
1077  return (0);
1078  reginput += len;
1079  }
1080  break;
1081  case ANYOF:
1082  if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) == NULL)
1083  return (0);
1084  reginput++;
1085  break;
1086  case ANYBUT:
1087  if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) != NULL)
1088  return (0);
1089  reginput++;
1090  break;
1091  case NOTHING:
1092  break;
1093  case BACK:
1094  break;
1095  case OPEN + 1:
1096  case OPEN + 2:
1097  case OPEN + 3:
1098  case OPEN + 4:
1099  case OPEN + 5:
1100  case OPEN + 6:
1101  case OPEN + 7:
1102  case OPEN + 8:
1103  case OPEN + 9:{
1104  int no;
1105  const char* save;
1106 
1107  no = OP(scan) - OPEN;
1108  save = reginput;
1109 
1110  if (regmatch(next)) {
1111 
1112  //
1113  // Don't set startp if some later invocation of the
1114  // same parentheses already has.
1115  //
1116  if (regstartp[no] == NULL)
1117  regstartp[no] = save;
1118  return (1);
1119  }
1120  else
1121  return (0);
1122  }
1123 // break;
1124  case CLOSE + 1:
1125  case CLOSE + 2:
1126  case CLOSE + 3:
1127  case CLOSE + 4:
1128  case CLOSE + 5:
1129  case CLOSE + 6:
1130  case CLOSE + 7:
1131  case CLOSE + 8:
1132  case CLOSE + 9:{
1133  int no;
1134  const char* save;
1135 
1136  no = OP(scan) - CLOSE;
1137  save = reginput;
1138 
1139  if (regmatch(next)) {
1140 
1141  //
1142  // Don't set endp if some later invocation of the
1143  // same parentheses already has.
1144  //
1145  if (regendp[no] == NULL)
1146  regendp[no] = save;
1147  return (1);
1148  }
1149  else
1150  return (0);
1151  }
1152 // break;
1153  case BRANCH:{
1154 
1155  const char* save;
1156 
1157  if (OP(next) != BRANCH) // No choice.
1158  next = OPERAND(scan); // Avoid recursion.
1159  else {
1160  do {
1161  save = reginput;
1162  if (regmatch(OPERAND(scan)))
1163  return (1);
1164  reginput = save;
1165  scan = regnext(scan);
1166  } while (scan != NULL && OP(scan) == BRANCH);
1167  return (0);
1168  // NOTREACHED
1169  }
1170  }
1171  break;
1172  case STAR:
1173  case PLUS:{
1174  char nextch;
1175  int no;
1176  const char* save;
1177  int min_no;
1178 
1179  //
1180  // Lookahead to avoid useless match attempts when we know
1181  // what character comes next.
1182  //
1183  nextch = '\0';
1184  if (OP(next) == EXACTLY)
1185  nextch = *OPERAND(next);
1186  min_no = (OP(scan) == STAR) ? 0 : 1;
1187  save = reginput;
1188  no = regrepeat(OPERAND(scan));
1189  while (no >= min_no) {
1190  // If it could work, try it.
1191  if (nextch == '\0' || *reginput == nextch)
1192  if (regmatch(next))
1193  return (1);
1194  // Couldn't or didn't -- back up.
1195  no--;
1196  reginput = save + no;
1197  }
1198  return (0);
1199  }
1200 // break;
1201  case END:
1202  return (1); // Success!
1203 
1204  default:
1205  //RAISE Error, SYM(ossimRegExp), SYM(Internal_Error),
1206  printf ("ossimRegExp::find(): Internal error -- memory corrupted.\n");
1207  return 0;
1208  }
1209  scan = next;
1210  }
1211 
1212  //
1213  // We get here only if there's trouble -- normally "case END" is the
1214  // terminating point.
1215  //
1216  //RAISE Error, SYM(ossimRegExp), SYM(Internal_Error),
1217  printf ("ossimRegExp::find(): Internal error -- corrupted pointers.\n");
1218  return (0);
1219 }
const char ** regstartp
Definition: ossimRegExp.h:118
const char ** regendp
Definition: ossimRegExp.h:119
const char * regbol
Definition: ossimRegExp.h:117
#define PLUS
#define STAR
#define NOTHING
int regmatch(const char *)
const char * regnext(const char *)
int regrepeat(const char *)
#define EOL
const char * reginput
Definition: ossimRegExp.h:116
#define ANY
#define BRANCH
#define BOL
#define OPEN
#define ANYBUT
#define OPERAND(p)
#define EXACTLY
#define BACK
#define CLOSE
#define END
#define OP(p)
#define ANYOF

◆ regnext() [1/2]

const char * ossimRegExp::regnext ( const char *  p)
private

Definition at line 1268 of file ossimRegExp.cpp.

References BACK, NEXT, OP, and regdummy.

Referenced by compile(), reg(), regmatch(), and regtail().

1268  {
1269  int offset;
1270 
1271  if (p == &regdummy)
1272  return (NULL);
1273 
1274  offset = NEXT(p);
1275  if (offset == 0)
1276  return (NULL);
1277 
1278  if (OP(p) == BACK)
1279  return (p - offset);
1280  else
1281  return (p + offset);
1282 }
#define NEXT(p)
#define BACK
#define OP(p)

◆ regnext() [2/2]

char * ossimRegExp::regnext ( char *  p)
private

Definition at line 1285 of file ossimRegExp.cpp.

References BACK, NEXT, OP, and regdummy.

1285  {
1286  int offset;
1287 
1288  if (p == &regdummy)
1289  return (NULL);
1290 
1291  offset = NEXT(p);
1292  if (offset == 0)
1293  return (NULL);
1294 
1295  if (OP(p) == BACK)
1296  return (p - offset);
1297  else
1298  return (p + offset);
1299 }
#define NEXT(p)
#define BACK
#define OP(p)

◆ regnode()

char * ossimRegExp::regnode ( char  op)
private

Definition at line 814 of file ossimRegExp.cpp.

References regcode, regdummy, and regsize.

Referenced by reg(), regatom(), regbranch(), and regpiece().

814  {
815  char* ret;
816  char* ptr;
817 
818  ret = regcode;
819  if (ret == &regdummy) {
820  regsize += 3;
821  return (ret);
822  }
823 
824  ptr = ret;
825  *ptr++ = op;
826  *ptr++ = '\0'; // Null "next" pointer.
827  *ptr++ = '\0';
828  regcode = ptr;
829 
830  return (ret);
831 }
char * regcode
Definition: ossimRegExp.h:114

◆ regoptail()

void ossimRegExp::regoptail ( char *  p,
const char *  val 
)
private

Definition at line 905 of file ossimRegExp.cpp.

References BRANCH, OP, OPERAND, regdummy, and regtail().

Referenced by reg(), and regpiece().

905  {
906  // "Operandless" and "op != BRANCH" are synonymous in practice.
907  if (p == NULL || p == &regdummy || OP(p) != BRANCH)
908  return;
909  regtail(OPERAND(p), val);
910 }
void regtail(char *, const char *)
#define BRANCH
#define OPERAND(p)
#define OP(p)

◆ regpiece()

char * ossimRegExp::regpiece ( int *  flagp)
private

Definition at line 622 of file ossimRegExp.cpp.

References BACK, BRANCH, HASWIDTH, ISMULT, NOTHING, PLUS, regatom(), reginsert(), regnode(), regoptail(), regparse, regtail(), SIMPLE, SPSTART, STAR, and WORST.

Referenced by regbranch().

622  {
623  char* ret;
624  char op;
625  char* next;
626  int flags;
627 
628  ret = regatom(&flags);
629  if (ret == NULL)
630  return (NULL);
631 
632  op = *regparse;
633  if (!ISMULT(op)) {
634  *flagp = flags;
635  return (ret);
636  }
637 
638  if (!(flags & HASWIDTH) && op != '?') {
639  //RAISE Error, SYM(ossimRegExp), SYM(Empty_Operand),
640  printf ("ossimRegExp::compile() : *+ operand could be empty.\n");
641  return 0;
642  }
643  *flagp = (op != '+') ? (WORST | SPSTART) : (WORST | HASWIDTH);
644 
645  if (op == '*' && (flags & SIMPLE))
646  reginsert(STAR, ret);
647  else if (op == '*') {
648  // Emit x* as (x&|), where & means "self".
649  reginsert(BRANCH, ret); // Either x
650  regoptail(ret, regnode(BACK)); // and loop
651  regoptail(ret, ret); // back
652  regtail(ret, regnode(BRANCH)); // or
653  regtail(ret, regnode(NOTHING)); // null.
654  }
655  else if (op == '+' && (flags & SIMPLE))
656  reginsert(PLUS, ret);
657  else if (op == '+') {
658  // Emit x+ as x(&|), where & means "self".
659  next = regnode(BRANCH); // Either
660  regtail(ret, next);
661  regtail(regnode(BACK), ret); // loop back
662  regtail(next, regnode(BRANCH)); // or
663  regtail(ret, regnode(NOTHING)); // null.
664  }
665  else if (op == '?') {
666  // Emit x? as (x|)
667  reginsert(BRANCH, ret); // Either x
668  regtail(ret, regnode(BRANCH)); // or
669  next = regnode(NOTHING);// null.
670  regtail(ret, next);
671  regoptail(ret, next);
672  }
673  regparse++;
674  if (ISMULT(*regparse)) {
675  //RAISE Error, SYM(ossimRegExp), SYM(Nested_Operand),
676  printf ("ossimRegExp::compile(): Nested *?+.\n");
677  return 0;
678  }
679  return (ret);
680 }
void regtail(char *, const char *)
#define ISMULT(c)
#define PLUS
#define STAR
#define NOTHING
void regoptail(char *, const char *)
#define SIMPLE
#define BRANCH
#define HASWIDTH
const char * regparse
Definition: ossimRegExp.h:111
char * regnode(char)
char * regatom(int *)
#define BACK
void reginsert(char, char *)
#define WORST
#define SPSTART

◆ regrepeat()

int ossimRegExp::regrepeat ( const char *  p)
private

Definition at line 1225 of file ossimRegExp.cpp.

References ANY, ANYBUT, ANYOF, EXACTLY, OP, OPERAND, and reginput.

Referenced by regmatch().

1225  {
1226  int count = 0;
1227  const char* scan;
1228  const char* opnd;
1229 
1230  scan = reginput;
1231  opnd = OPERAND(p);
1232  switch (OP(p)) {
1233  case ANY:
1234  count = (int)strlen(scan);
1235  scan += count;
1236  break;
1237  case EXACTLY:
1238  while (*opnd == *scan) {
1239  count++;
1240  scan++;
1241  }
1242  break;
1243  case ANYOF:
1244  while (*scan != '\0' && strchr(opnd, *scan) != NULL) {
1245  count++;
1246  scan++;
1247  }
1248  break;
1249  case ANYBUT:
1250  while (*scan != '\0' && strchr(opnd, *scan) == NULL) {
1251  count++;
1252  scan++;
1253  }
1254  break;
1255  default: // Oh dear. Called inappropriately.
1256  //RAISE Error, SYM(ossimRegExp), SYM(Internal_Error),
1257  printf ("ossimRegExp::find(): Internal error.\n");
1258  return 0;
1259  }
1260  reginput = scan;
1261  return (count);
1262 }
const char * reginput
Definition: ossimRegExp.h:116
#define ANY
#define ANYBUT
#define OPERAND(p)
#define EXACTLY
#define OP(p)
#define ANYOF

◆ regtail()

void ossimRegExp::regtail ( char *  p,
const char *  val 
)
private

Definition at line 876 of file ossimRegExp.cpp.

References BACK, OP, regdummy, and regnext().

Referenced by reg(), regbranch(), regoptail(), and regpiece().

876  {
877  char* scan;
878  char* temp;
879  int offset;
880 
881  if (p == &regdummy)
882  return;
883 
884  // Find last node.
885  scan = p;
886  for (;;) {
887  temp = regnext(scan);
888  if (temp == NULL)
889  break;
890  scan = temp;
891  }
892 
893  if (OP(scan) == BACK)
894  offset = (const char*)scan - val;
895  else
896  offset = val - scan;
897  *(scan + 1) = (offset >> 8) & 0377;
898  *(scan + 2) = offset & 0377;
899 }
const char * regnext(const char *)
#define BACK
#define OP(p)

◆ regtry()

int ossimRegExp::regtry ( const char *  string,
const char **  start,
const char **  end,
const char *  prog 
)
private

Definition at line 1006 of file ossimRegExp.cpp.

References end(), NSUBEXP, regendp, reginput, regmatch(), regstartp, and start().

Referenced by find().

1007  {
1008  int i;
1009  const char* *sp1;
1010  const char* *ep;
1011 
1012  reginput = string;
1013  regstartp = start;
1014  regendp = end;
1015 
1016  sp1 = start;
1017  ep = end;
1018  for (i = NSUBEXP; i > 0; i--) {
1019  *sp1++ = NULL;
1020  *ep++ = NULL;
1021  }
1022  if (regmatch(prog + 1)) {
1023  start[0] = string;
1024  end[0] = reginput;
1025  return (1);
1026  }
1027  else
1028  return (0);
1029 }
const char ** regstartp
Definition: ossimRegExp.h:118
const char ** regendp
Definition: ossimRegExp.h:119
int regmatch(const char *)
const char * reginput
Definition: ossimRegExp.h:116
ossim_uint32 start() const
Definition: ossimRegExp.h:209
ossim_uint32 end() const
Definition: ossimRegExp.h:217
const int NSUBEXP
Definition: ossimRegExp.h:72

◆ set_invalid()

void ossimRegExp::set_invalid ( )
inline

Definition at line 239 of file ossimRegExp.h.

References program.

239  {
240 //#ifndef WIN32
241  delete [] this->program;
242 //#endif
243  this->program = NULL;
244 }
char * program
Definition: ossimRegExp.h:106

◆ start() [1/2]

ossim_uint32 ossimRegExp::start ( ) const
inline

◆ start() [2/2]

ossim_uint32 ossimRegExp::start ( ossim_uint32  n) const
inline

Definition at line 247 of file ossimRegExp.h.

References n, searchstring, and startp.

248 {
249  return this->startp[n] - searchstring;
250 }
const char * startp[NSUBEXP]
Definition: ossimRegExp.h:100
os2<< "> n<< " > nendobj n
const char * searchstring
Definition: ossimRegExp.h:108

Member Data Documentation

◆ endp

const char* ossimRegExp::endp[NSUBEXP]
private

Definition at line 101 of file ossimRegExp.h.

Referenced by compile(), deep_equal(), end(), find(), match(), and ossimRegExp().

◆ program

char* ossimRegExp::program
private

◆ progsize

ossim_uint32 ossimRegExp::progsize
private

Definition at line 107 of file ossimRegExp.h.

Referenced by compile(), deep_equal(), operator==(), and ossimRegExp().

◆ reganch

char ossimRegExp::reganch
private

Definition at line 103 of file ossimRegExp.h.

Referenced by compile(), find(), and ossimRegExp().

◆ regbol

const char* ossimRegExp::regbol
private

Definition at line 117 of file ossimRegExp.h.

Referenced by find(), and regmatch().

◆ regcode

char* ossimRegExp::regcode
mutableprivate

Definition at line 114 of file ossimRegExp.h.

Referenced by compile(), regc(), reginsert(), and regnode().

◆ regdummy

char ossimRegExp::regdummy
mutableprivate

Definition at line 113 of file ossimRegExp.h.

Referenced by compile(), regc(), reginsert(), regnext(), regnode(), regoptail(), and regtail().

◆ regendp

const char* * ossimRegExp::regendp
private

Definition at line 119 of file ossimRegExp.h.

Referenced by regmatch(), and regtry().

◆ reginput

const char* ossimRegExp::reginput
private

Definition at line 116 of file ossimRegExp.h.

Referenced by regmatch(), regrepeat(), and regtry().

◆ regmlen

ossim_uint32 ossimRegExp::regmlen
private

Definition at line 105 of file ossimRegExp.h.

Referenced by compile(), find(), and ossimRegExp().

◆ regmust

const char* ossimRegExp::regmust
private

Definition at line 104 of file ossimRegExp.h.

Referenced by compile(), find(), and ossimRegExp().

◆ regnpar

int ossimRegExp::regnpar
mutableprivate

Definition at line 112 of file ossimRegExp.h.

Referenced by compile(), and reg().

◆ regparse

const char* ossimRegExp::regparse
mutableprivate

Definition at line 111 of file ossimRegExp.h.

Referenced by compile(), reg(), regatom(), regbranch(), and regpiece().

◆ regsize

long ossimRegExp::regsize
mutableprivate

Definition at line 115 of file ossimRegExp.h.

Referenced by compile(), regc(), reginsert(), and regnode().

◆ regstart

char ossimRegExp::regstart
private

Definition at line 102 of file ossimRegExp.h.

Referenced by compile(), find(), and ossimRegExp().

◆ regstartp

const char* * ossimRegExp::regstartp
private

Definition at line 118 of file ossimRegExp.h.

Referenced by regmatch(), and regtry().

◆ searchstring

const char* ossimRegExp::searchstring
private

Definition at line 108 of file ossimRegExp.h.

Referenced by compile(), end(), find(), and start().

◆ startp

const char* ossimRegExp::startp[NSUBEXP]
private

Definition at line 100 of file ossimRegExp.h.

Referenced by compile(), deep_equal(), find(), match(), ossimRegExp(), and start().


The documentation for this class was generated from the following files: