/*============================================================================
  KWSys - Kitware System Library
  Copyright 2000-2009 Kitware, Inc., Insight Software Consortium

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
//
// Copyright (C) 1991 Texas Instruments Incorporated.
//
// Permission is granted to any individual or institution to use, copy, modify
// and distribute this software, provided that this complete copyright and
// permission notice is maintained, intact, in all copies and supporting
// documentation.
//
// Texas Instruments Incorporated provides this software "as is" without
// express or implied warranty.
//
//
// Created: MNF 06/13/89  Initial Design and Implementation
// Updated: LGO 08/09/89  Inherit from Generic
// Updated: MBN 09/07/89  Added conditional exception handling
// Updated: MBN 12/15/89  Sprinkled "const" qualifiers all over the place!
// Updated: DLS 03/22/91  New lite version
//

#include "kwsysPrivate.h"
#include KWSYS_HEADER(RegularExpression.hxx)

// Work-around CMake dependency scanning limitation.  This must
// duplicate the above list of headers.
#if 0
# include "RegularExpression.hxx.in"
#endif

#include <stdio.h>
#include <string.h>

namespace KWSYS_NAMESPACE
{

// RegularExpression -- Copies the given regular expression.
RegularExpression::RegularExpression (const RegularExpression& rxp) {
  if ( !rxp.program )
    {
    this->program = 0;
    return;
    }
  int ind;
  this->progsize = rxp.progsize;                // Copy regular expression size
  this->program = new char[this->progsize];     // Allocate storage
  for(ind=this->progsize; ind-- != 0;)          // Copy regular expresion
    this->program[ind] = rxp.program[ind];
  this->startp[0] = rxp.startp[0];              // Copy pointers into last
  this->endp[0] = rxp.endp[0];                  // Successful "find" operation
  this->regmust = rxp.regmust;                  // Copy field
  if (rxp.regmust != 0) {
    char* dum = rxp.program;
    ind = 0;
    while (dum != rxp.regmust) {
      ++dum;
      ++ind;
    }
    this->regmust = this->program + ind;
  }
  this->regstart = rxp.regstart;                // Copy starting index
  this->reganch = rxp.reganch;                  // Copy remaining private data
  this->regmlen = rxp.regmlen;                  // Copy remaining private data
}

// operator= -- Copies the given regular expression.
RegularExpression& RegularExpression::operator= (const RegularExpression& rxp)
{
  if(this == &rxp)
    {
    return *this;
    }
  if ( !rxp.program )
    {
    this->program = 0;
    return *this;
    }
  int ind;
  this->progsize = rxp.progsize;                // Copy regular expression size
  delete [] this->program;
  this->program = new char[this->progsize];     // Allocate storage
  for(ind=this->progsize; ind-- != 0;)          // Copy regular expresion
    this->program[ind] = rxp.program[ind];
  this->startp[0] = rxp.startp[0];              // Copy pointers into last
  this->endp[0] = rxp.endp[0];                  // Successful "find" operation
  this->regmust = rxp.regmust;                  // Copy field
  if (rxp.regmust != 0) {
    char* dum = rxp.program;
    ind = 0;
    while (dum != rxp.regmust) {
      ++dum;
      ++ind;
    }
    this->regmust = this->program + ind;
  }
  this->regstart = rxp.regstart;                // Copy starting index
  this->reganch = rxp.reganch;                  // Copy remaining private data
  this->regmlen = rxp.regmlen;                  // Copy remaining private data

  return *this;
}

// operator== -- Returns true if two regular expressions have the same
// compiled program for pattern matching.
bool RegularExpression::operator== (const RegularExpression& rxp) const {
  if (this != &rxp) {                           // Same address?
    int ind = this->progsize;                   // Get regular expression size
    if (ind != rxp.progsize)                    // If different size regexp
      return false;                             // Return failure
    while(ind-- != 0)                           // Else while still characters
      if(this->program[ind] != rxp.program[ind]) // If regexp are different
        return false;                            // Return failure
  }
  return true;                                  // Else same, return success
}


// deep_equal -- Returns true if have the same compiled regular expressions
// and the same start and end pointers.

bool RegularExpression::deep_equal (const RegularExpression& rxp) const {
  int ind = this->progsize;                     // Get regular expression size
  if (ind != rxp.progsize)                      // If different size regexp
    return false;                               // Return failure
  while(ind-- != 0)                             // Else while still characters
    if(this->program[ind] != rxp.program[ind])  // If regexp are different
      return false;                             // Return failure
  return (this->startp[0] == rxp.startp[0] &&   // Else if same start/end ptrs,
          this->endp[0] == rxp.endp[0]);        // Return true
}

// The remaining code in this file is derived from the  regular expression code
// whose  copyright statement appears  below.  It has been  changed to work
// with the class concepts of C++ and COOL.

/*
 * compile and find
 *
 *      Copyright (c) 1986 by University of Toronto.
 *      Written by Henry Spencer.  Not derived from licensed software.
 *
 *      Permission is granted to anyone to use this software for any
 *      purpose on any computer system, and to redistribute it freely,
 *      subject to the following restrictions:
 *
 *      1. The author is not responsible for the consequences of use of
 *              this software, no matter how awful, even if they arise
 *              from defects in it.
 *
 *      2. The origin of this software must not be misrepresented, either
 *              by explicit claim or by omission.
 *
 *      3. Altered versions must be plainly marked as such, and must not
 *              be misrepresented as being the original software.
 *
 * Beware that some of this code is subtly aware of the way operator
 * precedence is structured in regular expressions.  Serious changes in
 * regular-expression syntax might require a total rethink.
 */

/*
 * The "internal use only" fields in regexp.h are present to pass info from
 * compile to execute that permits the execute phase to run lots faster on
 * simple cases.  They are:
 *
 * regstart     char that must begin a match; '\0' if none obvious
 * reganch      is the match anchored (at beginning-of-line only)?
 * regmust      string (pointer into program) that match must include, or NULL
 * regmlen      length of regmust string
 *
 * Regstart and reganch permit very fast decisions on suitable starting points
 * for a match, cutting down the work a lot.  Regmust permits fast rejection
 * of lines that cannot possibly match.  The regmust tests are costly enough
 * that compile() supplies a regmust only if the r.e. contains something
 * potentially expensive (at present, the only such thing detected is * or +
 * at the start of the r.e., which can involve a lot of backup).  Regmlen is
 * supplied because the test in find() needs it and compile() is computing
 * it anyway.
 */

/*
 * Structure for regexp "program".  This is essentially a linear encoding
 * of a nondeterministic finite-state machine (aka syntax charts or
 * "railroad normal form" in parsing technology).  Each node is an opcode
 * plus a "next" pointer, possibly plus an operand.  "Next" pointers of
 * all nodes except BRANCH implement concatenation; a "next" pointer with
 * a BRANCH on both ends of it is connecting two alternatives.  (Here we
 * have one of the subtle syntax dependencies:  an individual BRANCH (as
 * opposed to a collection of them) is never concatenated with anything
 * because of operator precedence.)  The operand of some types of node is
 * a literal string; for others, it is a node leading into a sub-FSM.  In
 * particular, the operand of a BRANCH node is the first node of the branch.
 * (NB this is *not* a tree structure:  the tail of the branch connects
 * to the thing following the set of BRANCHes.)  The opcodes are:
 */

// definition   number  opnd?   meaning
#define END     0               // no   End of program.
#define BOL     1               // no   Match "" at beginning of line.
#define EOL     2               // no   Match "" at end of line.
#define ANY     3               // no   Match any one character.
#define ANYOF   4               // str  Match any character in this string.
#define ANYBUT  5               // str  Match any character not in this
                                // string.
#define BRANCH  6               // node Match this alternative, or the
                                // next...
#define BACK    7               // no   Match "", "next" ptr points backward.
#define EXACTLY 8               // str  Match this string.
#define NOTHING 9               // no   Match empty string.
#define STAR    10              // node Match this (simple) thing 0 or more
                                // times.
#define PLUS    11              // node Match this (simple) thing 1 or more
                                // times.
#define OPEN    20              // no   Mark this point in input as start of
                                // #n.
// OPEN+1 is number 1, etc.
#define CLOSE   30              // no   Analogous to OPEN.

/*
 * Opcode notes:
 *
 * BRANCH       The set of branches constituting a single choice are hooked
 *              together with their "next" pointers, since precedence prevents
 *              anything being concatenated to any individual branch.  The
 *              "next" pointer of the last BRANCH in a choice points to the
 *              thing following the whole choice.  This is also where the
 *              final "next" pointer of each individual branch points; each
 *              branch starts with the operand node of a BRANCH node.
 *
 * BACK         Normal "next" pointers all implicitly point forward; BACK
 *              exists to make loop structures possible.
 *
 * STAR,PLUS    '?', and complex '*' and '+', are implemented as circular
 *              BRANCH structures using BACK.  Simple cases (one character
 *              per match) are implemented with STAR and PLUS for speed
 *              and to minimize recursive plunges.
 *
 * OPEN,CLOSE   ...are numbered at compile time.
 */

/*
 * A node is one char of opcode followed by two chars of "next" pointer.
 * "Next" pointers are stored as two 8-bit pieces, high order first.  The
 * value is a positive offset from the opcode of the node containing it.
 * An operand, if any, simply follows the node.  (Note that much of the
 * code generation knows about this implicit relationship.)
 *
 * Using two bytes for the "next" pointer is vast overkill for most things,
 * but allows patterns to get big without disasters.
 */

#define OP(p)           (*(p))
#define NEXT(p)         (((*((p)+1)&0377)<<8) + (*((p)+2)&0377))
#define OPERAND(p)      ((p) + 3)

const unsigned char MAGIC = 0234;
/*
 * Utility definitions.
 */

#define UCHARAT(p)      (reinterpret_cast<const unsigned char*>(p))[0]


#define FAIL(m) { regerror(m); return(0); }
#define ISMULT(c)       ((c) == '*' || (c) == '+' || (c) == '?')
#define META    "^$.[()|?+*\\"


/*
 * Flags to be passed up and down.
 */
#define HASWIDTH        01      // Known never to match null string.
#define SIMPLE          02      // Simple enough to be STAR/PLUS operand.
#define SPSTART         04      // Starts with * or +.
#define WORST           0       // Worst case.



/////////////////////////////////////////////////////////////////////////
//
//  COMPILE AND ASSOCIATED FUNCTIONS
//
/////////////////////////////////////////////////////////////////////////


/*
 * Global work variables for compile().
 */
static const char* regparse;    // Input-scan pointer.
static       int   regnpar;     // () count.
static       char  regdummy;
static       char* regcode;     // Code-emit pointer; &regdummy = don't.
static       long  regsize;     // Code size.

/*
 * Forward declarations for compile()'s friends.
 */
// #ifndef static
// #define      static  static
// #endif
static       char* reg (int, int*);
static       char* regbranch (int*);
static       char* regpiece (int*);
static       char* regatom (int*);
static       char* regnode (char);
static const char* regnext (const char*);
static       char* regnext (char*);
static void        regc (char);
static void        reginsert (char, char*);
static void        regtail (char*, const char*);
static void        regoptail (char*, const char*);

#ifdef STRCSPN
static int strcspn ();
#endif



/*
 * We can't allocate space until we know how big the compiled form will be,
 * but we can't compile it (and thus know how big it is) until we've got a
 * place to put the code.  So we cheat:  we compile it twice, once with code
 * generation turned off and size counting turned on, and once "for real".
 * This also means that we don't allocate space until we are sure that the
 * thing really will compile successfully, and we never have to move the
 * code and thus invalidate pointers into it.  (Note that it has to be in
 * one piece because free() must be able to free it all.)
 *
 * Beware that the optimization-preparation code in here knows about some
 * of the structure of the compiled regexp.
 */


// compile -- compile a regular expression into internal code
// for later pattern matching.

bool RegularExpression::compile (const char* exp) {
    const char* scan;
    const char* longest;
    size_t      len;
    int         flags;

    if (exp == 0) {
      //RAISE Error, SYM(RegularExpression), SYM(No_Expr),
      printf ("RegularExpression::compile(): No expression supplied.\n");
      return false;
    }

    // First pass: determine size, legality.
    regparse = exp;
    regnpar = 1;
    regsize = 0L;
    regcode = &regdummy;
    regc(static_cast<char>(MAGIC));
    if(!reg(0, &flags))
      {
        printf ("RegularExpression::compile(): Error in compile.\n");
        return false;
      }
    this->startp[0] = this->endp[0] = this->searchstring = 0;

    // Small enough for pointer-storage convention?
    if (regsize >= 32767L) {    // Probably could be 65535L.
      //RAISE Error, SYM(RegularExpression), SYM(Expr_Too_Big),
      printf ("RegularExpression::compile(): Expression too big.\n");
      return false;
    }

    // Allocate space.
//#ifndef WIN32
    if (this->program != 0) delete [] this->program;
//#endif
    this->program = new char[regsize];
    this->progsize = static_cast<int>(regsize);

    if (this->program == 0) {
      //RAISE Error, SYM(RegularExpression), SYM(Out_Of_Memory),
      printf ("RegularExpression::compile(): Out of memory.\n");
      return false;
    }

    // Second pass: emit code.
    regparse = exp;
    regnpar = 1;
    regcode = this->program;
    regc(static_cast<char>(MAGIC));
    reg(0, &flags);

    // Dig out information for optimizations.
    this->regstart = '\0';              // Worst-case defaults.
    this->reganch = 0;
    this->regmust = 0;
    this->regmlen = 0;
    scan = this->program + 1;   // First BRANCH.
    if (OP(regnext(scan)) == END) {     // Only one top-level choice.
        scan = OPERAND(scan);

        // Starting-point info.
        if (OP(scan) == EXACTLY)
            this->regstart = *OPERAND(scan);
        else if (OP(scan) == BOL)
            this->reganch++;

         //
         // If there's something expensive in the r.e., find the longest
         // literal string that must appear and make it the regmust.  Resolve
         // ties in favor of later strings, since the regstart check works
         // with the beginning of the r.e. and avoiding duplication
         // strengthens checking.  Not a strong reason, but sufficient in the
         // absence of others.
         //
        if (flags & SPSTART) {
            longest = 0;
            len = 0;
            for (; scan != 0; scan = regnext(scan))
                if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) {
                    longest = OPERAND(scan);
                    len = strlen(OPERAND(scan));
                }
            this->regmust = longest;
            this->regmlen = len;
        }
    }
    return true;
}


/*
 - reg - regular expression, i.e. main body or parenthesized thing
 *
 * Caller must absorb opening parenthesis.
 *
 * Combining parenthesis handling with the base level of regular expression
 * is a trifle forced, but the need to tie the tails of the branches to what
 * follows makes it hard to avoid.
 */
static char* reg (int paren, int *flagp) {
    char* ret;
    char* br;
    char* ender;
    int   parno =0;
    int   flags;

    *flagp = HASWIDTH;          // Tentatively.

    // Make an OPEN node, if parenthesized.
    if (paren) {
        if (regnpar >=  RegularExpression::NSUBEXP) {
          //RAISE Error, SYM(RegularExpression), SYM(Too_Many_Parens),
          printf ("RegularExpression::compile(): Too many parentheses.\n");
          return 0;
        }
        parno = regnpar;
        regnpar++;
        ret = regnode(static_cast<char>(OPEN + parno));
    }
    else
        ret = 0;

    // Pick up the branches, linking them together.
    br = regbranch(&flags);
    if (br == 0)
        return (0);
    if (ret != 0)
        regtail(ret, br);       // OPEN -> first.
    else
        ret = br;
    if (!(flags & HASWIDTH))
        *flagp &= ~HASWIDTH;
    *flagp |= flags & SPSTART;
    while (*regparse == '|') {
        regparse++;
        br = regbranch(&flags);
        if (br == 0)
            return (0);
        regtail(ret, br);       // BRANCH -> BRANCH.
        if (!(flags & HASWIDTH))
            *flagp &= ~HASWIDTH;
        *flagp |= flags & SPSTART;
      }

    // Make a closing node, and hook it on the end.
    ender = regnode(static_cast<char>((paren) ? CLOSE + parno : END));
    regtail(ret, ender);

    // Hook the tails of the branches to the closing node.
    for (br = ret; br != 0; br = regnext(br))
        regoptail(br, ender);

    // Check for proper termination.
    if (paren && *regparse++ != ')') {
        //RAISE Error, SYM(RegularExpression), SYM(Unmatched_Parens),
        printf ("RegularExpression::compile(): Unmatched parentheses.\n");
        return 0;
    }
    else if (!paren && *regparse != '\0') {
        if (*regparse == ')') {
            //RAISE Error, SYM(RegularExpression), SYM(Unmatched_Parens),
            printf ("RegularExpression::compile(): Unmatched parentheses.\n");
            return 0;
        }
        else {
            //RAISE Error, SYM(RegularExpression), SYM(Internal_Error),
            printf ("RegularExpression::compile(): Internal error.\n");
            return 0;
        }
        // NOTREACHED
    }
    return (ret);
}


/*
 - regbranch - one alternative of an | operator
 *
 * Implements the concatenation operator.
 */
static char* regbranch (int *flagp) {
    char* ret;
    char* chain;
    char* latest;
    int   flags;

    *flagp = WORST;             // Tentatively.

    ret = regnode(BRANCH);
    chain = 0;
    while (*regparse != '\0' && *regparse != '|' && *regparse != ')') {
        latest = regpiece(&flags);
        if (latest == 0)
            return (0);
        *flagp |= flags & HASWIDTH;
        if (chain == 0) // First piece.
            *flagp |= flags & SPSTART;
        else
            regtail(chain, latest);
        chain = latest;
    }
    if (chain == 0)             // Loop ran zero times.
        regnode(NOTHING);

    return (ret);
}


/*
 - regpiece - something followed by possible [*+?]
 *
 * Note that the branching code sequences used for ? and the general cases
 * of * and + are somewhat optimized:  they use the same NOTHING node as
 * both the endmarker for their branch list and the body of the last branch.
 * It might seem that this node could be dispensed with entirely, but the
 * endmarker role is not redundant.
 */
static char* regpiece (int *flagp) {
    char* ret;
    char  op;
    char* next;
    int   flags;

    ret = regatom(&flags);
    if (ret == 0)
        return (0);

    op = *regparse;
    if (!ISMULT(op)) {
        *flagp = flags;
        return (ret);
    }

    if (!(flags & HASWIDTH) && op != '?') {
        //RAISE Error, SYM(RegularExpression), SYM(Empty_Operand),
        printf ("RegularExpression::compile() : *+ operand could be empty.\n");
        return 0;
    }
    *flagp = (op != '+') ? (WORST | SPSTART) : (WORST | HASWIDTH);

    if (op == '*' && (flags & SIMPLE))
        reginsert(STAR, ret);
    else if (op == '*') {
        // Emit x* as (x&|), where & means "self".
        reginsert(BRANCH, ret); // Either x
        regoptail(ret, regnode(BACK));  // and loop
        regoptail(ret, ret);    // back
        regtail(ret, regnode(BRANCH));  // or
        regtail(ret, regnode(NOTHING)); // null.
    }
    else if (op == '+' && (flags & SIMPLE))
        reginsert(PLUS, ret);
    else if (op == '+') {
        // Emit x+ as x(&|), where & means "self".
        next = regnode(BRANCH); // Either
        regtail(ret, next);
        regtail(regnode(BACK), ret);    // loop back
        regtail(next, regnode(BRANCH)); // or
        regtail(ret, regnode(NOTHING)); // null.
    }
    else if (op == '?') {
        // Emit x? as (x|)
        reginsert(BRANCH, ret); // Either x
        regtail(ret, regnode(BRANCH));  // or
        next = regnode(NOTHING);// null.
        regtail(ret, next);
        regoptail(ret, next);
    }
    regparse++;
    if (ISMULT(*regparse)) {
        //RAISE Error, SYM(RegularExpression), SYM(Nested_Operand),
        printf ("RegularExpression::compile(): Nested *?+.\n");
        return 0;
    }
    return (ret);
}


/*
 - regatom - the lowest level
 *
 * Optimization:  gobbles an entire sequence of ordinary characters so that
 * it can turn them into a single node, which is smaller to store and
 * faster to run.  Backslashed characters are exceptions, each becoming a
 * separate node; the code is simpler that way and it's not worth fixing.
 */
static char* regatom (int *flagp) {
    char* ret;
    int   flags;

    *flagp = WORST;             // Tentatively.

    switch (*regparse++) {
        case '^':
            ret = regnode(BOL);
            break;
        case '$':
            ret = regnode(EOL);
            break;
        case '.':
            ret = regnode(ANY);
            *flagp |= HASWIDTH | SIMPLE;
            break;
        case '[':{
                int    rxpclass;
                int    rxpclassend;

                if (*regparse == '^') { // Complement of range.
                    ret = regnode(ANYBUT);
                    regparse++;
                }
                else
                    ret = regnode(ANYOF);
                if (*regparse == ']' || *regparse == '-')
                    regc(*regparse++);
                while (*regparse != '\0' && *regparse != ']') {
                    if (*regparse == '-') {
                        regparse++;
                        if (*regparse == ']' || *regparse == '\0')
                            regc('-');
                        else {
                            rxpclass = UCHARAT(regparse - 2) + 1;
                            rxpclassend = UCHARAT(regparse);
                            if (rxpclass > rxpclassend + 1) {
                               //RAISE Error, SYM(RegularExpression), SYM(Invalid_Range),
                               printf ("RegularExpression::compile(): Invalid range in [].\n");
                               return 0;
                            }
                            for (; rxpclass <= rxpclassend; rxpclass++)
                              regc(static_cast<char>(rxpclass));
                            regparse++;
                        }
                    }
                    else
                        regc(*regparse++);
                }
                regc('\0');
                if (*regparse != ']') {
                    //RAISE Error, SYM(RegularExpression), SYM(Unmatched_Bracket),
                    printf ("RegularExpression::compile(): Unmatched [].\n");
                    return 0;
                }
                regparse++;
                *flagp |= HASWIDTH | SIMPLE;
            }
            break;
        case '(':
            ret = reg(1, &flags);
            if (ret == 0)
                return (0);
            *flagp |= flags & (HASWIDTH | SPSTART);
            break;
        case '\0':
        case '|':
        case ')':
            //RAISE Error, SYM(RegularExpression), SYM(Internal_Error),
            printf ("RegularExpression::compile(): Internal error.\n"); // Never here
            return 0;
        case '?':
        case '+':
        case '*':
            //RAISE Error, SYM(RegularExpression), SYM(No_Operand),
            printf ("RegularExpression::compile(): ?+* follows nothing.\n");
            return 0;
        case '\\':
            if (*regparse == '\0') {
                //RAISE Error, SYM(RegularExpression), SYM(Trailing_Backslash),
                printf ("RegularExpression::compile(): Trailing backslash.\n");
                return 0;
            }
            ret = regnode(EXACTLY);
            regc(*regparse++);
            regc('\0');
            *flagp |= HASWIDTH | SIMPLE;
            break;
        default:{
                int    len;
                char   ender;

                regparse--;
                len = int(strcspn(regparse, META));
                if (len <= 0) {
                    //RAISE Error, SYM(RegularExpression), SYM(Internal_Error),
                    printf ("RegularExpression::compile(): Internal error.\n");
                    return 0;
                }
                ender = *(regparse + len);
                if (len > 1 && ISMULT(ender))
                    len--;      // Back off clear of ?+* operand.
                *flagp |= HASWIDTH;
                if (len == 1)
                    *flagp |= SIMPLE;
                ret = regnode(EXACTLY);
                while (len > 0) {
                    regc(*regparse++);
                    len--;
                }
                regc('\0');
            }
            break;
    }
    return (ret);
}


/*
 - regnode - emit a node
   Location.
 */
static char* regnode (char op) {
    char* ret;
    char* ptr;

    ret = regcode;
    if (ret == &regdummy) {
        regsize += 3;
        return (ret);
    }

    ptr = ret;
    *ptr++ = op;
    *ptr++ = '\0';              // Null "next" pointer.
    *ptr++ = '\0';
    regcode = ptr;

    return (ret);
}


/*
 - regc - emit (if appropriate) a byte of code
 */
static void regc (char b) {
    if (regcode != &regdummy)
        *regcode++ = b;
    else
        regsize++;
}


/*
 - reginsert - insert an operator in front of already-emitted operand
 *
 * Means relocating the operand.
 */
static void reginsert (char op, char* opnd) {
    char* src;
    char* dst;
    char* place;

    if (regcode == &regdummy) {
        regsize += 3;
        return;
    }

    src = regcode;
    regcode += 3;
    dst = regcode;
    while (src > opnd)
        *--dst = *--src;

    place = opnd;               // Op node, where operand used to be.
    *place++ = op;
    *place++ = '\0';
    *place = '\0';
}


/*
 - regtail - set the next-pointer at the end of a node chain
 */
static void regtail (char* p, const char* val) {
    char* scan;
    char* temp;
    int   offset;

    if (p == &regdummy)
        return;

    // Find last node.
    scan = p;
    for (;;) {
        temp = regnext(scan);
        if (temp == 0)
            break;
        scan = temp;
    }

    if (OP(scan) == BACK)
        offset = int(scan - val);
    else
        offset = int(val - scan);
    *(scan + 1) = static_cast<char>((offset >> 8) & 0377);
    *(scan + 2) = static_cast<char>(offset & 0377);
}


/*
 - regoptail - regtail on operand of first argument; nop if operandless
 */
static void regoptail (char* p, const char* val) {
    // "Operandless" and "op != BRANCH" are synonymous in practice.
    if (p == 0 || p == &regdummy || OP(p) != BRANCH)
        return;
    regtail(OPERAND(p), val);
}



////////////////////////////////////////////////////////////////////////
// 
//  find and friends
// 
////////////////////////////////////////////////////////////////////////


/*
 * Global work variables for find().
 */
static const char*  reginput;   // String-input pointer.
static const char*  regbol;     // Beginning of input, for ^ check.
static const char* *regstartp;  // Pointer to startp array.
static const char* *regendp;    // Ditto for endp.

/*
 * Forwards.
 */
static int regtry (const char*, const char* *,
                   const char* *, const char*);
static int regmatch (const char*);
static int regrepeat (const char*);

#ifdef DEBUG
int          regnarrate = 0;
void         regdump ();
static char* regprop ();
#endif

bool RegularExpression::find (kwsys_stl::string const& s) 
{
  return find(s.c_str());
}



// find -- Matches the regular expression to the given string.
// Returns true if found, and sets start and end indexes accordingly.

bool RegularExpression::find (const char* string) {
    const char* s;

    this->searchstring = string;

    if (!this->program)
      {
      return false;
      }

    // Check validity of program.
    if (UCHARAT(this->program) != MAGIC) {
        //RAISE Error, SYM(RegularExpression), SYM(Internal_Error),
        printf ("RegularExpression::find(): Compiled regular expression corrupted.\n");
        return 0;
    }

    // If there is a "must appear" string, look for it.
    if (this->regmust != 0) {
        s = string;
        while ((s = strchr(s, this->regmust[0])) != 0) {
            if (strncmp(s, this->regmust, this->regmlen) == 0)
                break;          // Found it.
            s++;
        }
        if (s == 0)             // Not present.
            return (0);
    }

    // Mark beginning of line for ^ .
    regbol = string;

    // Simplest case:  anchored match need be tried only once.
    if (this->reganch)
        return (regtry(string, this->startp, this->endp, this->program) != 0);

    // Messy cases:  unanchored match.
    s = string;
    if (this->regstart != '\0')
        // We know what char it must start with.
        while ((s = strchr(s, this->regstart)) != 0) {
            if (regtry(s, this->startp, this->endp, this->program))
                return (1);
            s++;

        }
    else
        // We don't -- general case.
        do {
            if (regtry(s, this->startp, this->endp, this->program))
                return (1);
        } while (*s++ != '\0');

    // Failure.
    return (0);
}


/*
 - regtry - try match at specific point
   0 failure, 1 success
 */
static int regtry (const char* string, const char* *start,
                   const char* *end, const char* prog) {
                   int    i;
                   const char* *sp1;
                   const char* *ep;

    reginput = string;
    regstartp = start;
    regendp = end;

    sp1 = start;
    ep = end;
    for (i = RegularExpression::NSUBEXP; i > 0; i--) {
        *sp1++ = 0;
        *ep++ = 0;
    }
    if (regmatch(prog + 1)) {
        start[0] = string;
        end[0] = reginput;
        return (1);
    }
    else
        return (0);
}


/*
 - regmatch - main matching routine
 *
 * Conceptually the strategy is simple:  check to see whether the current
 * node matches, call self recursively to see whether the rest matches,
 * and then act accordingly.  In practice we make some effort to avoid
 * recursion, in particular by going through "ordinary" nodes (that don't
 * need to know whether the rest of the match failed) by a loop instead of
 * by recursion.
 * 0 failure, 1 success
 */
static int regmatch (const char* prog) {
    const char* scan;  // Current node.
    const char* next;  // Next node.

    scan = prog;

    while (scan != 0) {

        next = regnext(scan);

        switch (OP(scan)) {
            case BOL:
                if (reginput != regbol)
                    return (0);
                break;
            case EOL:
                if (*reginput != '\0')
                    return (0);
                break;
            case ANY:
                if (*reginput == '\0')
                    return (0);
                reginput++;
                break;
            case EXACTLY:{
                    size_t len;
                    const char* opnd;

                    opnd = OPERAND(scan);
                    // Inline the first character, for speed.
                    if (*opnd != *reginput)
                        return (0);
                    len = strlen(opnd);
                    if (len > 1 && strncmp(opnd, reginput, len) != 0)
                        return (0);
                    reginput += len;
                }
                break;
            case ANYOF:
                if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) == 0)
                    return (0);
                reginput++;
                break;
            case ANYBUT:
                if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) != 0)
                    return (0);
                reginput++;
                break;
            case NOTHING:
                break;
            case BACK:
                break;
            case OPEN + 1:
            case OPEN + 2:
            case OPEN + 3:
            case OPEN + 4:
            case OPEN + 5:
            case OPEN + 6:
            case OPEN + 7:
            case OPEN + 8:
            case OPEN + 9:{
                    int    no;
                    const char* save;

                    no = OP(scan) - OPEN;
                    save = reginput;

                    if (regmatch(next)) {

                        //
                        // Don't set startp if some later invocation of the
                        // same parentheses already has.
                        //
                        if (regstartp[no] == 0)
                            regstartp[no] = save;
                        return (1);
                    }
                    else
                        return (0);
                }
//              break;
            case CLOSE + 1:
            case CLOSE + 2:
            case CLOSE + 3:
            case CLOSE + 4:
            case CLOSE + 5:
            case CLOSE + 6:
            case CLOSE + 7:
            case CLOSE + 8:
            case CLOSE + 9:{
                    int    no;
                    const char* save;

                    no = OP(scan) - CLOSE;
                    save = reginput;

                    if (regmatch(next)) {

                        //
                        // Don't set endp if some later invocation of the
                        // same parentheses already has.
                        //
                        if (regendp[no] == 0)
                            regendp[no] = save;
                        return (1);
                    }
                    else
                        return (0);
                }
//              break;
            case BRANCH:{

              const char* save;

                    if (OP(next) != BRANCH)     // No choice.
                        next = OPERAND(scan);   // Avoid recursion.
                    else {
                        do {
                            save = reginput;
                            if (regmatch(OPERAND(scan)))
                                return (1);
                            reginput = save;
                            scan = regnext(scan);
                        } while (scan != 0 && OP(scan) == BRANCH);
                        return (0);
                        // NOTREACHED
                    }
                }
                break;
            case STAR:
            case PLUS:{
                    char   nextch;
                    int        no;
                    const char* save;
                    int        min_no;

                    //
                    // Lookahead to avoid useless match attempts when we know
                    // what character comes next.
                    //
                    nextch = '\0';
                    if (OP(next) == EXACTLY)
                        nextch = *OPERAND(next);
                    min_no = (OP(scan) == STAR) ? 0 : 1;
                    save = reginput;
                    no = regrepeat(OPERAND(scan));
                    while (no >= min_no) {
                        // If it could work, try it.
                        if (nextch == '\0' || *reginput == nextch)
                            if (regmatch(next))
                                return (1);
                        // Couldn't or didn't -- back up.
                        no--;
                        reginput = save + no;
                    }
                    return (0);
                }
//              break;
            case END:
                return (1);     // Success!

            default:
                //RAISE Error, SYM(RegularExpression), SYM(Internal_Error),
                printf ("RegularExpression::find(): Internal error -- memory corrupted.\n");
                return 0;
        }
        scan = next;
    }

    //
    //  We get here only if there's trouble -- normally "case END" is the
    //  terminating point.
    //
    //RAISE Error, SYM(RegularExpression), SYM(Internal_Error),
    printf ("RegularExpression::find(): Internal error -- corrupted pointers.\n");
    return (0);
}


/*
 - regrepeat - repeatedly match something simple, report how many
 */
static int regrepeat (const char* p) {
    int         count = 0;
    const char* scan;
    const char* opnd;

    scan = reginput;
    opnd = OPERAND(p);
    switch (OP(p)) {
        case ANY:
            count = int(strlen(scan));
            scan += count;
            break;
        case EXACTLY:
            while (*opnd == *scan) {
                count++;
                scan++;
            }
            break;
        case ANYOF:
            while (*scan != '\0' && strchr(opnd, *scan) != 0) {
                count++;
                scan++;
            }
            break;
        case ANYBUT:
            while (*scan != '\0' && strchr(opnd, *scan) == 0) {
                count++;
                scan++;
            }
            break;
        default:                // Oh dear.  Called inappropriately.
            //RAISE Error, SYM(RegularExpression), SYM(Internal_Error),
            printf ("cm RegularExpression::find(): Internal error.\n");
            return 0;
    }
    reginput = scan;
    return (count);
}


/*
 - regnext - dig the "next" pointer out of a node
 */
static const char* regnext (const char* p) {
    int offset;

    if (p == &regdummy)
        return (0);

    offset = NEXT(p);
    if (offset == 0)
        return (0);

    if (OP(p) == BACK)
        return (p - offset);
    else
        return (p + offset);
}

static char* regnext (char* p) {
    int offset;

    if (p == &regdummy)
        return (0);

    offset = NEXT(p);
    if (offset == 0)
        return (0);

    if (OP(p) == BACK)
        return (p - offset);
    else
        return (p + offset);
}

} // namespace KWSYS_NAMESPACE
