REGEXP(2X)                                             REGEXP(2X)

     NAME
          regcomp, regcomplit, regcompnl, regexec, regsub, rregexec,
          rregsub, regerror - regular expression

     SYNOPSIS
          #include <regexp.h>

          Reprog  *regcomp(char *exp)

          Reprog  *regcomplit(char *exp)

          Reprog  *regcompnl(char *exp)

          int     regexec(Reprog *prog, char *string, Resub *match,
          int msize)

          void    regsub(char *source, char *dest, Resub *match, int
          msize)

          int     rregexec(Reprog *prog, Rune *string, Resub *match,
          int msize)

          void    rregsub(Rune *source, Rune *dest, Resub *match, int
          msize)

          void    regerror(char *msg)

     DESCRIPTION
          Regcomp compiles a regular expression and returns a pointer
          to the generated description.  The space is allocated by
          malloc(2) and may be released by free. Regular expressions
          are exactly as in regexp(6).

          Regcomplit is like regcomp except that all characters are
          treated literally.  Regcompnl is like regcomp except that
          the . metacharacter matches all characters, including new-
          lines.

          Regexec matches a null-terminated string against the com-
          piled regular expression in prog. If it matches, regexec
          returns 1 and fills in the array match with character point-
          ers to the substrings of string that correspond to the
          parenthesized subexpressions of exp: match[i].sp points to
          the beginning and match[i].ep points just beyond the end of
          the ith substring.  (Subexpression i begins at the ith left
          parenthesis, counting from 1.)  Pointers in match[0] pick
          out the substring that corresponds to the whole regular
          expression.  Unused elements of match are filled with zeros.
          Matches involving `*', `+', and `?'  are extended as far as
          possible.  The number of array elements in match is given by

     Page 1                       Plan 9             (printed 4/20/24)

     REGEXP(2X)                                             REGEXP(2X)

          msize. The structure of elements of match is:

               typedef struct {
                       union {
                          char *sp;
                          Rune *rsp;
                       };
                       union {
                          char *ep;
                          Rune *rep;
                       };
               } Resub;

          If match[0].sp is nonzero on entry, regexec starts matching
          at that point within string. If match[0].ep is nonzero on
          entry, the last character matched is the one preceding that
          point.

          Regsub places in dest a substitution instance of source in
          the context of the last regexec performed using match. Each
          instance of \n, where n is a digit, is replaced by the
          string delimited by match[n].sp and match[n].ep.  Each
          instance of `&' is replaced by the string delimited by
          match[0].sp and match[0].ep.

          Regerror, called whenever an error is detected in regcomp,
          regexec, or regsub, writes the string msg on the standard
          error file and exits.  Regerror can be replaced to perform
          special error processing.

          Rregexp and rregsub are variants of regexec and regsub that
          use strings of Runes instead of strings of chars.  With
          these routines, the rsp and rep fields of the match array
          elements should be used.

     SEE ALSO
          grep(1)

     DIAGNOSTICS
          Regcomp returns 0 for an illegal expression or other fail-
          ure.  Regexec returns 0 if string is not matched.

     Page 2                       Plan 9             (printed 4/20/24)