components/apache2/mod_sed/regexp.c
changeset 5172 2ac937ed383b
parent 5171 4e8b3c0ea78c
child 5173 fe10c87a291e
--- a/components/apache2/mod_sed/regexp.c	Tue Dec 08 14:36:41 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,601 +0,0 @@
-/*
- * Copyright (c) 2005, 2008 Sun Microsystems, Inc. All Rights Reserved.
- * Use is subject to license terms.
- *
- *	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	
- *	  All Rights Reserved  	
- *
- * University Copyright- Copyright (c) 1982, 1986, 1988
- * The Regents of the University of California
- * All Rights Reserved
- *
- * University Acknowledgment- Portions of this document are derived from
- * software developed by the University of California, Berkeley, and its
- * contributors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *  http://www.apache.org/licenses/LICENSE-2.0. 
- * 
- * Unless required by applicable law or agreed to in writing, software 
- * distributed under the License is distributed on an "AS IS" BASIS, 
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 
- * or implied. 
- * See the License for the specific language governing permissions and
- * limitations under the License. 
- */
-
-/* Code moved from regexp.h */
-
-#include "apr.h"
-#include "apr_lib.h"
-#ifdef APR_HAVE_LIMITS_H
-#include <limits.h>
-#endif
-#if APR_HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#include "libsed.h"
-#include "regexp.h"
-#include "sed.h"
-
-#define GETC() ((unsigned char)*sp++)
-#define PEEKC() ((unsigned char)*sp)
-#define UNGETC(c) (--sp)
-#define SEDCOMPILE_ERROR(c) { \
-            regerrno = c; \
-            goto out; \
-            }
-#define ecmp(s1, s2, n)    (strncmp(s1, s2, n) == 0)
-#define uletter(c) (isalpha(c) || c == '_')
-
-
-static unsigned char bittab[] = { 1, 2, 4, 8, 16, 32, 64, 128 };
-
-static int regerr(sed_commands_t *commands, int err);
-static void comperr(sed_commands_t *commands, char *msg);
-static void getrnge(char *str, step_vars_storage *vars);
-static int _advance(char *, char *, step_vars_storage *);
-extern int sed_step(char *p1, char *p2, int circf, step_vars_storage *vars);
-
-
-static void comperr(sed_commands_t *commands, char *msg)
-{
-    command_errf(commands, msg, commands->linebuf);
-}
-
-/*
-*/
-static int regerr(sed_commands_t *commands, int err)
-{
-    switch(err) {
-    case 0:
-        /* No error */
-        break;
-    case 11:
-        comperr(commands, "Range endpoint too large: %s");
-        break;
-
-    case 16:
-        comperr(commands, "Bad number: %s");
-        break;
-
-    case 25:
-        comperr(commands, "``\\digit'' out of range: %s");
-        break;
-
-    case 36:
-        comperr(commands, "Illegal or missing delimiter: %s");
-        break;
-
-    case 41:
-        comperr(commands, "No remembered search string: %s");
-        break;
-
-    case 42:
-        comperr(commands, "\\( \\) imbalance: %s");
-        break;
-
-    case 43:
-        comperr(commands, "Too many \\(: %s");
-        break;
-
-    case 44:
-        comperr(commands, "More than 2 numbers given in \\{ \\}: %s");
-        break;
-
-    case 45:
-        comperr(commands, "} expected after \\: %s");
-        break;
-
-    case 46:
-        comperr(commands, "First number exceeds second in \\{ \\}: %s");
-        break;
-
-    case 49:
-        comperr(commands, "[ ] imbalance: %s");
-        break;
-
-    case 50:
-        comperr(commands, SEDERR_TMMES);
-        break;
-
-    default:
-        comperr(commands, "Unknown regexp error code %s\n");
-        break;
-    }
-    return (0);
-}
-
-
-char *sed_compile(sed_commands_t *commands, sed_comp_args *compargs,
-                  char *ep, char *endbuf, int seof)
-{
-    int c;
-    int eof = seof;
-    char *lastep;
-    int cclcnt;
-    char bracket[NBRA], *bracketp;
-    int closed;
-    int neg;
-    int lc;
-    int i, cflg;
-    int iflag; /* used for non-ascii characters in brackets */
-    int nodelim = 0;
-    char *sp = commands->cp;
-    int regerrno = 0;
-
-    lastep = 0;
-    if ((c = GETC()) == eof || c == '\n') {
-        if (c == '\n') {
-            UNGETC(c);
-            nodelim = 1;
-        }
-        commands->cp = sp;
-        goto out;
-    }
-    bracketp = bracket;
-    compargs->circf = closed = compargs->nbra = 0;
-    if (c == '^')
-        compargs->circf++;
-    else
-        UNGETC(c);
-    while (1) {
-        if (ep >= endbuf)
-            SEDCOMPILE_ERROR(50);
-        c = GETC();
-        if (c != '*' && ((c != '\\') || (PEEKC() != '{')))
-            lastep = ep;
-        if (c == eof) {
-            *ep++ = CCEOF;
-            if (bracketp != bracket)
-                SEDCOMPILE_ERROR(42);
-            commands->cp = sp;
-            goto out;
-        }
-        switch (c) {
-
-        case '.':
-            *ep++ = CDOT;
-            continue;
-
-        case '\n':
-            SEDCOMPILE_ERROR(36);
-            commands->cp = sp;
-            goto out;
-        case '*':
-            if (lastep == 0 || *lastep == CBRA || *lastep == CKET)
-                goto defchar;
-            *lastep |= STAR;
-            continue;
-
-        case '$':
-            if (PEEKC() != eof && PEEKC() != '\n')
-                goto defchar;
-            *ep++ = CDOL;
-            continue;
-
-        case '[':
-            if (&ep[17] >= endbuf)
-                SEDCOMPILE_ERROR(50);
-
-            *ep++ = CCL;
-            lc = 0;
-            for (i = 0; i < 16; i++)
-                ep[i] = 0;
-
-            neg = 0;
-            if ((c = GETC()) == '^') {
-                neg = 1;
-                c = GETC();
-            }
-            iflag = 1;
-            do {
-                c &= 0377;
-                if (c == '\0' || c == '\n')
-                    SEDCOMPILE_ERROR(49);
-                if ((c & 0200) && iflag) {
-                    iflag = 0;
-                    if (&ep[32] >= endbuf)
-                        SEDCOMPILE_ERROR(50);
-                    ep[-1] = CXCL;
-                    for (i = 16; i < 32; i++)
-                        ep[i] = 0;
-                }
-                if (c == '-' && lc != 0) {
-                    if ((c = GETC()) == ']') {
-                        PLACE('-');
-                        break;
-                    }
-                    if ((c & 0200) && iflag) {
-                        iflag = 0;
-                        if (&ep[32] >= endbuf)
-                            SEDCOMPILE_ERROR(50);
-                        ep[-1] = CXCL;
-                        for (i = 16; i < 32; i++)
-                            ep[i] = 0;
-                    }
-                    while (lc < c) {
-                        PLACE(lc);
-                        lc++;
-                    }
-                }
-                lc = c;
-                PLACE(c);
-            } while ((c = GETC()) != ']');
-
-            if (iflag)
-                iflag = 16;
-            else
-                iflag = 32;
-
-            if (neg) {
-                if (iflag == 32) {
-                    for (cclcnt = 0; cclcnt < iflag;
-                        cclcnt++)
-                        ep[cclcnt] ^= 0377;
-                    ep[0] &= 0376;
-                } else {
-                    ep[-1] = NCCL;
-                    /* make nulls match so test fails */
-                    ep[0] |= 01;
-                }
-            }
-
-            ep += iflag;
-
-            continue;
-
-        case '\\':
-            switch (c = GETC()) {
-
-            case '(':
-                if (compargs->nbra >= NBRA)
-                    SEDCOMPILE_ERROR(43);
-                *bracketp++ = compargs->nbra;
-                *ep++ = CBRA;
-                *ep++ = compargs->nbra++;
-                continue;
-
-            case ')':
-                if (bracketp <= bracket)
-                    SEDCOMPILE_ERROR(42);
-                *ep++ = CKET;
-                *ep++ = *--bracketp;
-                closed++;
-                continue;
-
-            case '{':
-                if (lastep == (char *) 0)
-                    goto defchar;
-                *lastep |= RNGE;
-                cflg = 0;
-            nlim:
-                c = GETC();
-                i = 0;
-                do {
-                    if ('0' <= c && c <= '9')
-                        i = 10 * i + c - '0';
-                    else
-                        SEDCOMPILE_ERROR(16);
-                } while (((c = GETC()) != '\\') && (c != ','));
-                if (i >= 255)
-                    SEDCOMPILE_ERROR(11);
-                *ep++ = i;
-                if (c == ',') {
-                    if (cflg++)
-                        SEDCOMPILE_ERROR(44);
-                    if ((c = GETC()) == '\\')
-                        *ep++ = (char) 255;
-                    else {
-                        UNGETC(c);
-                        goto nlim;
-                        /* get 2'nd number */
-                    }
-                }
-                if (GETC() != '}')
-                    SEDCOMPILE_ERROR(45);
-                if (!cflg)    /* one number */
-                    *ep++ = i;
-                else if ((ep[-1] & 0377) < (ep[-2] & 0377))
-                    SEDCOMPILE_ERROR(46);
-                continue;
-
-            case '\n':
-                SEDCOMPILE_ERROR(36);
-
-            case 'n':
-                c = '\n';
-                goto defchar;
-
-            default:
-                if (c >= '1' && c <= '9') {
-                    if ((c -= '1') >= closed)
-                        SEDCOMPILE_ERROR(25);
-                    *ep++ = CBACK;
-                    *ep++ = c;
-                    continue;
-                }
-            }
-    /* Drop through to default to use \ to turn off special chars */
-
-        defchar:
-        default:
-            lastep = ep;
-            *ep++ = CCHR;
-            *ep++ = c;
-        }
-    }
-out:
-    if (regerrno) {
-        regerr(commands, regerrno);
-        return (char*) NULL;
-    }
-    /* XXX : Basant : what extra */
-    /* int reglength = (int)(ep - expbuf); */
-    return ep;
-}
-
-int sed_step(char *p1, char *p2, int circf, step_vars_storage *vars)
-{
-    int c;
-
-
-    if (circf) {
-        vars->loc1 = p1;
-        return (_advance(p1, p2, vars));
-    }
-    /* fast check for first character */
-    if (*p2 == CCHR) {
-        c = p2[1];
-        do {
-            if (*p1 != c)
-                continue;
-            if (_advance(p1, p2, vars)) {
-                vars->loc1 = p1;
-                return (1);
-            }
-        } while (*p1++);
-        return (0);
-    }
-        /* regular algorithm */
-    do {
-        if (_advance(p1, p2, vars)) {
-            vars->loc1 = p1;
-            return (1);
-        }
-    } while (*p1++);
-    return (0);
-}
-
-static int _advance(char *lp, char *ep, step_vars_storage *vars)
-{
-    char *curlp;
-    int c;
-    char *bbeg;
-    char neg;
-    int ct;
-    int epint; /* int value of *ep */
-
-    while (1) {
-        neg = 0;
-        switch (*ep++) {
-
-        case CCHR:
-            if (*ep++ == *lp++)
-                continue;
-            return (0);
-
-        case CDOT:
-            if (*lp++)
-                continue;
-            return (0);
-
-        case CDOL:
-            if (*lp == 0)
-                continue;
-            return (0);
-
-        case CCEOF:
-            vars->loc2 = lp;
-            return (1);
-
-        case CXCL:
-            c = (unsigned char)*lp++;
-            if (ISTHERE(c)) {
-                ep += 32;
-                continue;
-            }
-            return (0);
-
-        case NCCL:
-            neg = 1;
-
-        case CCL:
-            c = *lp++;
-            if (((c & 0200) == 0 && ISTHERE(c)) ^ neg) {
-                ep += 16;
-                continue;
-            }
-            return (0);
-
-        case CBRA:
-            epint = (int) *ep;
-            vars->braslist[epint] = lp;
-            ep++;
-            continue;
-
-        case CKET:
-            epint = (int) *ep;
-            vars->braelist[epint] = lp;
-            ep++;
-            continue;
-
-        case CCHR | RNGE:
-            c = *ep++;
-            getrnge(ep, vars);
-            while (vars->low--)
-                if (*lp++ != c)
-                    return (0);
-            curlp = lp;
-            while (vars->size--)
-                if (*lp++ != c)
-                    break;
-            if (vars->size < 0)
-                lp++;
-            ep += 2;
-            goto star;
-
-        case CDOT | RNGE:
-            getrnge(ep, vars);
-            while (vars->low--)
-                if (*lp++ == '\0')
-                    return (0);
-            curlp = lp;
-            while (vars->size--)
-                if (*lp++ == '\0')
-                    break;
-            if (vars->size < 0)
-                lp++;
-            ep += 2;
-            goto star;
-
-        case CXCL | RNGE:
-            getrnge(ep + 32, vars);
-            while (vars->low--) {
-                c = (unsigned char)*lp++;
-                if (!ISTHERE(c))
-                    return (0);
-            }
-            curlp = lp;
-            while (vars->size--) {
-                c = (unsigned char)*lp++;
-                if (!ISTHERE(c))
-                    break;
-            }
-            if (vars->size < 0)
-                lp++;
-            ep += 34;        /* 32 + 2 */
-            goto star;
-
-        case NCCL | RNGE:
-            neg = 1;
-
-        case CCL | RNGE:
-            getrnge(ep + 16, vars);
-            while (vars->low--) {
-                c = *lp++;
-                if (((c & 0200) || !ISTHERE(c)) ^ neg)
-                    return (0);
-            }
-            curlp = lp;
-            while (vars->size--) {
-                c = *lp++;
-                if (((c & 0200) || !ISTHERE(c)) ^ neg)
-                    break;
-            }
-            if (vars->size < 0)
-                lp++;
-            ep += 18;         /* 16 + 2 */
-            goto star;
-
-        case CBACK:
-            epint = (int) *ep;
-            bbeg = vars->braslist[epint];
-            ct = vars->braelist[epint] - bbeg;
-            ep++;
-
-            if (ecmp(bbeg, lp, ct)) {
-                lp += ct;
-                continue;
-            }
-            return (0);
-
-        case CBACK | STAR:
-            epint = (int) *ep;
-            bbeg = vars->braslist[epint];
-            ct = vars->braelist[epint] - bbeg;
-            ep++;
-            curlp = lp;
-            while (ecmp(bbeg, lp, ct))
-                lp += ct;
-
-            while (lp >= curlp) {
-                if (_advance(lp, ep, vars))
-                    return (1);
-                lp -= ct;
-            }
-            return (0);
-
-
-        case CDOT | STAR:
-            curlp = lp;
-            while (*lp++);
-            goto star;
-
-        case CCHR | STAR:
-            curlp = lp;
-            while (*lp++ == *ep);
-            ep++;
-            goto star;
-
-        case CXCL | STAR:
-            curlp = lp;
-            do {
-                c = (unsigned char)*lp++;
-            } while (ISTHERE(c));
-            ep += 32;
-            goto star;
-
-        case NCCL | STAR:
-            neg = 1;
-
-        case CCL | STAR:
-            curlp = lp;
-            do {
-                c = *lp++;
-            } while (((c & 0200) == 0 && ISTHERE(c)) ^ neg);
-            ep += 16;
-            goto star;
-
-        star:
-            do {
-                if (--lp == vars->locs)
-                    break;
-                if (_advance(lp, ep, vars))
-                    return (1);
-            } while (lp > curlp);
-            return (0);
-
-        }
-    }
-}
-
-static void getrnge(char *str, step_vars_storage *vars)
-{
-    vars->low = *str++ & 0377;
-    vars->size = ((*str & 0377) == 255)? 20000: (*str &0377) - vars->low;
-}
-
-