OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [newlib-1.17.0/] [newlib/] [libc/] [posix/] [regexec.c] - Blame information for rev 823

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 148 jeremybenn
/*-
2
 * Copyright (c) 1992, 1993, 1994 Henry Spencer.
3
 * Copyright (c) 1992, 1993, 1994
4
 *      The Regents of the University of California.  All rights reserved.
5
 *
6
 * This code is derived from software contributed to Berkeley by
7
 * Henry Spencer.
8
 *
9
 * Redistribution and use in source and binary forms, with or without
10
 * modification, are permitted provided that the following conditions
11
 * are met:
12
 * 1. Redistributions of source code must retain the above copyright
13
 *    notice, this list of conditions and the following disclaimer.
14
 * 2. Redistributions in binary form must reproduce the above copyright
15
 *    notice, this list of conditions and the following disclaimer in the
16
 *    documentation and/or other materials provided with the distribution.
17
 * 4. Neither the name of the University nor the names of its contributors
18
 *    may be used to endorse or promote products derived from this software
19
 *    without specific prior written permission.
20
 *
21
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31
 * SUCH DAMAGE.
32
 *
33
 *      @(#)regexec.c   8.3 (Berkeley) 3/20/94
34
 */
35
 
36
#ifndef _NO_REGEX
37
 
38
#if defined(LIBC_SCCS) && !defined(lint)
39
static char sccsid[] = "@(#)regexec.c   8.3 (Berkeley) 3/20/94";
40
#endif /* LIBC_SCCS and not lint */
41
#include <sys/cdefs.h>
42
 
43
/*
44
 * the outer shell of regexec()
45
 *
46
 * This file includes engine.c *twice*, after muchos fiddling with the
47
 * macros that code uses.  This lets the same code operate on two different
48
 * representations for state sets.
49
 */
50
#include <sys/types.h>
51
#include <stdio.h>
52
#include <stdlib.h>
53
#include <string.h>
54
#include <limits.h>
55
#include <ctype.h>
56
#include <regex.h>
57
 
58
#include "utils.h"
59
#include "regex2.h"
60
 
61
static int nope = 0;             /* for use in asserts; shuts lint up */
62
 
63
/* macros for manipulating states, small version */
64
#define states  long
65
#define states1 states          /* for later use in regexec() decision */
66
#define CLEAR(v)        ((v) = 0)
67
#define SET0(v, n)      ((v) &= ~((unsigned long)1 << (n)))
68
#define SET1(v, n)      ((v) |= (unsigned long)1 << (n))
69
#define ISSET(v, n)     (((v) & ((unsigned long)1 << (n))) != 0)
70
#define ASSIGN(d, s)    ((d) = (s))
71
#define EQ(a, b)        ((a) == (b))
72
#define STATEVARS       long dummy      /* dummy version */
73
#define STATESETUP(m, n)        /* nothing */
74
#define STATETEARDOWN(m)        /* nothing */
75
#define SETUP(v)        ((v) = 0)
76
#define onestate        long
77
#define INIT(o, n)      ((o) = (unsigned long)1 << (n))
78
#define INC(o)  ((o) <<= 1)
79
#define ISSTATEIN(v, o) (((v) & (o)) != 0)
80
/* some abbreviations; note that some of these know variable names! */
81
/* do "if I'm here, I can also be there" etc without branches */
82
#define FWD(dst, src, n)        ((dst) |= ((unsigned long)(src)&(here)) << (n))
83
#define BACK(dst, src, n)       ((dst) |= ((unsigned long)(src)&(here)) >> (n))
84
#define ISSETBACK(v, n) (((v) & ((unsigned long)here >> (n))) != 0)
85
/* function names */
86
#define SNAMES                  /* engine.c looks after details */
87
 
88
#include "engine.c"
89
 
90
/* now undo things */
91
#undef  states
92
#undef  CLEAR
93
#undef  SET0
94
#undef  SET1
95
#undef  ISSET
96
#undef  ASSIGN
97
#undef  EQ
98
#undef  STATEVARS
99
#undef  STATESETUP
100
#undef  STATETEARDOWN
101
#undef  SETUP
102
#undef  onestate
103
#undef  INIT
104
#undef  INC
105
#undef  ISSTATEIN
106
#undef  FWD
107
#undef  BACK
108
#undef  ISSETBACK
109
#undef  SNAMES
110
 
111
/* macros for manipulating states, large version */
112
#define states  char *
113
#define CLEAR(v)        memset(v, 0, m->g->nstates)
114
#define SET0(v, n)      ((v)[n] = 0)
115
#define SET1(v, n)      ((v)[n] = 1)
116
#define ISSET(v, n)     ((v)[n])
117
#define ASSIGN(d, s)    memcpy(d, s, m->g->nstates)
118
#define EQ(a, b)        (memcmp(a, b, m->g->nstates) == 0)
119
#define STATEVARS       long vn; char *space
120
#define STATESETUP(m, nv)       { (m)->space = malloc((nv)*(m)->g->nstates); \
121
                                if ((m)->space == NULL) return(REG_ESPACE); \
122
                                (m)->vn = 0; }
123
#define STATETEARDOWN(m)        { free((m)->space); }
124
#define SETUP(v)        ((v) = &m->space[m->vn++ * m->g->nstates])
125
#define onestate        long
126
#define INIT(o, n)      ((o) = (n))
127
#define INC(o)  ((o)++)
128
#define ISSTATEIN(v, o) ((v)[o])
129
/* some abbreviations; note that some of these know variable names! */
130
/* do "if I'm here, I can also be there" etc without branches */
131
#define FWD(dst, src, n)        ((dst)[here+(n)] |= (src)[here])
132
#define BACK(dst, src, n)       ((dst)[here-(n)] |= (src)[here])
133
#define ISSETBACK(v, n) ((v)[here - (n)])
134
/* function names */
135
#define LNAMES                  /* flag */
136
 
137
#include "engine.c"
138
 
139
/*
140
 - regexec - interface for matching
141
 = extern int regexec(const regex_t *, const char *, size_t, \
142
 =                                      regmatch_t [], int);
143
 = #define      REG_NOTBOL      00001
144
 = #define      REG_NOTEOL      00002
145
 = #define      REG_STARTEND    00004
146
 = #define      REG_TRACE       00400   // tracing of execution
147
 = #define      REG_LARGE       01000   // force large representation
148
 = #define      REG_BACKR       02000   // force use of backref code
149
 *
150
 * We put this here so we can exploit knowledge of the state representation
151
 * when choosing which matcher to call.  Also, by this point the matchers
152
 * have been prototyped.
153
 */
154
int                             /* 0 success, REG_NOMATCH failure */
155
regexec(preg, string, nmatch, pmatch, eflags)
156
const regex_t *preg;
157
const char *string;
158
size_t nmatch;
159
regmatch_t pmatch[];
160
int eflags;
161
{
162
        struct re_guts *g = preg->re_g;
163
#ifdef REDEBUG
164
#       define  GOODFLAGS(f)    (f)
165
#else
166
#       define  GOODFLAGS(f)    ((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND))
167
#endif
168
 
169
        if (preg->re_magic != MAGIC1 || g->magic != MAGIC2)
170
                return(REG_BADPAT);
171
        assert(!(g->iflags&BAD));
172
        if (g->iflags&BAD)              /* backstop for no-debug case */
173
                return(REG_BADPAT);
174
        eflags = GOODFLAGS(eflags);
175
 
176
        if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags&REG_LARGE))
177
                return(smatcher(g, (char *)string, nmatch, pmatch, eflags));
178
        else
179
                return(lmatcher(g, (char *)string, nmatch, pmatch, eflags));
180
}
181
 
182
#endif /* !_NO_REGEX  */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.