LLVM  6.0.0svn
Classes | Macros | Functions | Variables
regcomp.c File Reference
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <limits.h>
#include <stdlib.h>
#include "regex_impl.h"
#include "regutils.h"
#include "regex2.h"
#include "regcclass.h"
#include "regcname.h"
#include "llvm/Config/config.h"
#include <stdint.h>
Include dependency graph for regcomp.c:

Go to the source code of this file.

Classes

struct  parse
 

Macros

#define NPAREN   10 /* we need to remember () 1-9 for back refs */
 
#define PEEK()   (*p->next)
 
#define PEEK2()   (*(p->next+1))
 
#define MORE()   (p->next < p->end)
 
#define MORE2()   (p->next+1 < p->end)
 
#define SEE(c)   (MORE() && PEEK() == (c))
 
#define SEETWO(a, b)   (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b))
 
#define EAT(c)   ((SEE(c)) ? (NEXT(), 1) : 0)
 
#define EATTWO(a, b)   ((SEETWO(a, b)) ? (NEXT2(), 1) : 0)
 
#define NEXT()   (p->next++)
 
#define NEXT2()   (p->next += 2)
 
#define NEXTn(n)   (p->next += (n))
 
#define GETNEXT()   (*p->next++)
 
#define SETERROR(e)   seterr(p, (e))
 
#define REQUIRE(co, e)   (void)((co) || SETERROR(e))
 
#define MUSTSEE(c, e)   (REQUIRE(MORE() && PEEK() == (c), e))
 
#define MUSTEAT(c, e)   (REQUIRE(MORE() && GETNEXT() == (c), e))
 
#define MUSTNOTSEE(c, e)   (REQUIRE(!MORE() || PEEK() != (c), e))
 
#define EMIT(op, sopnd)   doemit(p, (sop)(op), (size_t)(sopnd))
 
#define INSERT(op, pos)   doinsert(p, (sop)(op), HERE()-(pos)+1, pos)
 
#define AHEAD(pos)   dofwd(p, pos, HERE()-(pos))
 
#define ASTERN(sop, pos)   EMIT(sop, HERE()-pos)
 
#define HERE()   (p->slen)
 
#define THERE()   (p->slen - 1)
 
#define THERETHERE()   (p->slen - 2)
 
#define DROP(n)   (p->slen -= (n))
 
#define DUPMAX   255
 
#define INFINITY   (DUPMAX + 1)
 
#define never   0 /* some <assert.h>s have bugs too */
 
#define GOODFLAGS(f)   ((f)&~REG_DUMP)
 
#define BACKSL   (1<<CHAR_BIT)
 
#define N   2
 
#define INF   3
 
#define REP(f, t)   ((f)*8 + (t))
 
#define MAP(n)   (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N)
 

Functions

static void p_ere (struct parse *, int)
 
static void p_ere_exp (struct parse *)
 
static void p_str (struct parse *)
 
static void p_bre (struct parse *, int, int)
 
static int p_simp_re (struct parse *, int)
 
static int p_count (struct parse *)
 
static void p_bracket (struct parse *)
 
static void p_b_term (struct parse *, cset *)
 
static void p_b_cclass (struct parse *, cset *)
 
static void p_b_eclass (struct parse *, cset *)
 
static char p_b_symbol (struct parse *)
 
static char p_b_coll_elem (struct parse *, int)
 
static char othercase (int)
 
static void bothcases (struct parse *, int)
 
static void ordinary (struct parse *, int)
 
static void nonnewline (struct parse *)
 
static void repeat (struct parse *, sopno, int, int)
 
static int seterr (struct parse *, int)
 
static csetallocset (struct parse *)
 
static void freeset (struct parse *, cset *)
 
static int freezeset (struct parse *, cset *)
 
static int firstch (struct parse *, cset *)
 
static int nch (struct parse *, cset *)
 
static void mcadd (struct parse *, cset *, const char *)
 
static void mcinvert (struct parse *, cset *)
 
static void mccase (struct parse *, cset *)
 
static int isinsets (struct re_guts *, int)
 
static int samesets (struct re_guts *, int, int)
 
static void categorize (struct parse *, struct re_guts *)
 
static sopno dupl (struct parse *, sopno, sopno)
 
static void doemit (struct parse *, sop, size_t)
 
static void doinsert (struct parse *, sop, size_t, sopno)
 
static void dofwd (struct parse *, sopno, sop)
 
static void enlarge (struct parse *, sopno)
 
static void stripsnug (struct parse *, struct re_guts *)
 
static void findmust (struct parse *, struct re_guts *)
 
static sopno pluscount (struct parse *, struct re_guts *)
 
int llvm_regcomp (llvm_regex_t *preg, const char *pattern, int cflags)
 

Variables

static char nuls [10]
 

Macro Definition Documentation

◆ AHEAD

#define AHEAD (   pos)    dofwd(p, pos, HERE()-(pos))

Definition at line 141 of file regcomp.c.

Referenced by p_ere(), p_ere_exp(), and repeat().

◆ ASTERN

#define ASTERN (   sop,
  pos 
)    EMIT(sop, HERE()-pos)

Definition at line 142 of file regcomp.c.

Referenced by p_ere(), p_ere_exp(), p_simp_re(), and repeat().

◆ BACKSL

#define BACKSL   (1<<CHAR_BIT)

Referenced by p_simp_re().

◆ DROP

#define DROP (   n)    (p->slen -= (n))

Definition at line 146 of file regcomp.c.

Referenced by p_bre(), and repeat().

◆ DUPMAX

#define DUPMAX   255

Definition at line 151 of file regcomp.c.

Referenced by p_count().

◆ EAT

#define EAT (   c)    ((SEE(c)) ? (NEXT(), 1) : 0)

Definition at line 128 of file regcomp.c.

Referenced by p_b_term(), p_bracket(), p_bre(), p_ere(), p_ere_exp(), and p_simp_re().

◆ EATTWO

#define EATTWO (   a,
 
)    ((SEETWO(a, b)) ? (NEXT2(), 1) : 0)

Definition at line 129 of file regcomp.c.

Referenced by p_b_symbol(), p_b_term(), and p_simp_re().

◆ EMIT

#define EMIT (   op,
  sopnd 
)    doemit(p, (sop)(op), (size_t)(sopnd))

◆ GETNEXT

#define GETNEXT ( )    (*p->next++)

Definition at line 133 of file regcomp.c.

Referenced by p_b_symbol(), p_count(), p_ere_exp(), p_simp_re(), and p_str().

◆ GOODFLAGS

#define GOODFLAGS (   f)    ((f)&~REG_DUMP)

Referenced by llvm_regcomp().

◆ HERE

#define HERE ( )    (p->slen)

Definition at line 143 of file regcomp.c.

Referenced by doinsert(), dupl(), p_bre(), p_ere(), p_ere_exp(), p_simp_re(), and repeat().

◆ INF

#define INF   3

Referenced by repeat().

◆ INFINITY

#define INFINITY   (DUPMAX + 1)

Definition at line 153 of file regcomp.c.

Referenced by p_ere_exp(), p_simp_re(), and false::LibCallsShrinkWrap::perform().

◆ INSERT

#define INSERT (   op,
  pos 
)    doinsert(p, (sop)(op), HERE()-(pos)+1, pos)

Definition at line 140 of file regcomp.c.

Referenced by p_ere(), p_ere_exp(), p_simp_re(), and repeat().

◆ MAP

#define MAP (   n)    (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N)

◆ MORE

#define MORE ( )    (p->next < p->end)

◆ MORE2

#define MORE2 ( )    (p->next+1 < p->end)

Definition at line 125 of file regcomp.c.

Referenced by p_b_term(), and p_ere_exp().

◆ MUSTEAT

#define MUSTEAT (   c,
 
)    (REQUIRE(MORE() && GETNEXT() == (c), e))

Definition at line 137 of file regcomp.c.

Referenced by p_bracket(), and p_ere_exp().

◆ MUSTNOTSEE

#define MUSTNOTSEE (   c,
 
)    (REQUIRE(!MORE() || PEEK() != (c), e))

Definition at line 138 of file regcomp.c.

◆ MUSTSEE

#define MUSTSEE (   c,
 
)    (REQUIRE(MORE() && PEEK() == (c), e))

Definition at line 136 of file regcomp.c.

◆ N

#define N   2

Referenced by repeat().

◆ never

#define never   0 /* some <assert.h>s have bugs too */

Definition at line 158 of file regcomp.c.

Referenced by firstch().

◆ NEXT

#define NEXT ( )    (p->next++)

Definition at line 130 of file regcomp.c.

Referenced by p_b_cclass(), p_b_coll_elem(), p_b_term(), p_ere_exp(), and p_simp_re().

◆ NEXT2

#define NEXT2 ( )    (p->next += 2)

Definition at line 131 of file regcomp.c.

Referenced by p_b_term().

◆ NEXTn

#define NEXTn (   n)    (p->next += (n))

Definition at line 132 of file regcomp.c.

Referenced by p_bracket().

◆ NPAREN

#define NPAREN   10 /* we need to remember () 1-9 for back refs */

Definition at line 73 of file regcomp.c.

Referenced by doinsert(), llvm_regcomp(), p_ere_exp(), and p_simp_re().

◆ PEEK

#define PEEK ( )    (*p->next)

Definition at line 122 of file regcomp.c.

Referenced by p_b_cclass(), p_b_term(), p_bracket(), p_count(), p_ere(), p_ere_exp(), and p_simp_re().

◆ PEEK2

#define PEEK2 ( )    (*(p->next+1))

Definition at line 123 of file regcomp.c.

Referenced by p_b_term(), and p_ere_exp().

◆ REP

#define REP (   f,
  t 
)    ((f)*8 + (t))

Referenced by repeat().

◆ REQUIRE

#define REQUIRE (   co,
 
)    (void)((co) || SETERROR(e))

Definition at line 135 of file regcomp.c.

Referenced by p_b_symbol(), p_b_term(), p_bre(), p_count(), p_ere(), p_ere_exp(), p_simp_re(), and p_str().

◆ SEE

#define SEE (   c)    (MORE() && PEEK() == (c))

Definition at line 126 of file regcomp.c.

Referenced by p_b_term(), p_ere(), and p_ere_exp().

◆ SEETWO

#define SEETWO (   a,
 
)    (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b))

Definition at line 127 of file regcomp.c.

Referenced by p_b_coll_elem(), p_bracket(), p_bre(), and p_simp_re().

◆ SETERROR

#define SETERROR (   e)    seterr(p, (e))

◆ THERE

#define THERE ( )    (p->slen - 1)

Definition at line 144 of file regcomp.c.

Referenced by llvm_regcomp(), p_ere(), p_ere_exp(), and repeat().

◆ THERETHERE

#define THERETHERE ( )    (p->slen - 2)

Definition at line 145 of file regcomp.c.

Referenced by p_ere_exp(), and repeat().

Function Documentation

◆ allocset()

static cset * allocset ( struct parse p)
static

◆ bothcases()

static void bothcases ( struct parse p,
int  ch 
)
static

Definition at line 919 of file regcomp.c.

References assert(), parse::end, parse::next, othercase(), and p_bracket().

Referenced by ordinary().

◆ categorize()

static void categorize ( struct parse p,
struct re_guts g 
)
static

Definition at line 1296 of file regcomp.c.

References re_guts::categories, parse::error, isinsets(), re_guts::ncategories, and samesets().

Referenced by llvm_regcomp().

◆ doemit()

static void doemit ( struct parse p,
sop  op,
size_t  opnd 
)
static

Definition at line 1347 of file regcomp.c.

References assert(), enlarge(), parse::error, OPSHIFT, parse::slen, SOP, parse::ssize, and parse::strip.

◆ dofwd()

static void dofwd ( struct parse p,
sopno  pos,
sop  value 
)
static

Definition at line 1404 of file regcomp.c.

References assert(), parse::error, OP, OPSHIFT, and parse::strip.

◆ doinsert()

static void doinsert ( struct parse p,
sop  op,
size_t  opnd,
sopno  pos 
)
static

Definition at line 1369 of file regcomp.c.

References assert(), EMIT, parse::error, HERE, NPAREN, parse::pbegin, parse::pend, and parse::strip.

◆ dupl()

static sopno dupl ( struct parse p,
sopno  start,
sopno  finish 
)
static

Definition at line 1321 of file regcomp.c.

References assert(), enlarge(), HERE, parse::slen, parse::ssize, and parse::strip.

Referenced by p_ere_exp(), p_simp_re(), and repeat().

◆ enlarge()

static void enlarge ( struct parse p,
sopno  size 
)
static

Definition at line 1418 of file regcomp.c.

References REG_ESPACE, SETERROR, parse::ssize, and parse::strip.

Referenced by doemit(), and dupl().

◆ findmust()

static void findmust ( struct parse p,
struct re_guts g 
)
static

◆ firstch()

static int firstch ( struct parse p,
cset cs 
)
static

Definition at line 1180 of file regcomp.c.

References assert(), CHIN, re_guts::csetsize, for(), parse::g, and never.

Referenced by p_bracket().

◆ freeset()

static void freeset ( struct parse p,
cset cs 
)
static

Definition at line 1127 of file regcomp.c.

References CHsub, re_guts::csetsize, for(), parse::g, re_guts::ncsets, and re_guts::sets.

Referenced by freezeset(), and p_bracket().

◆ freezeset()

static int freezeset ( struct parse p,
cset cs 
)
static

Definition at line 1149 of file regcomp.c.

References CHIN, re_guts::csetsize, for(), freeset(), parse::g, cset::hash, re_guts::ncsets, and re_guts::sets.

Referenced by p_bracket().

◆ isinsets()

static int isinsets ( struct re_guts g,
int  c 
)
static

Definition at line 1261 of file regcomp.c.

References re_guts::ncsets, and re_guts::setbits.

Referenced by categorize().

◆ llvm_regcomp()

int llvm_regcomp ( llvm_regex_t preg,
const char pattern,
int  cflags 
)

◆ mcadd()

static void mcadd ( struct parse p,
cset cs,
const char cp 
)
static

Definition at line 1212 of file regcomp.c.

References llvm_strlcpy(), cset::multis, REG_ESPACE, SETERROR, and cset::smultis.

◆ mccase()

static void mccase ( struct parse p,
cset cs 
)
static

Definition at line 1252 of file regcomp.c.

References assert(), and cset::multis.

Referenced by p_bracket().

◆ mcinvert()

static void mcinvert ( struct parse p,
cset cs 
)
static

Definition at line 1239 of file regcomp.c.

References assert(), and cset::multis.

Referenced by p_bracket().

◆ nch()

static int nch ( struct parse p,
cset cs 
)
static

Definition at line 1196 of file regcomp.c.

References CHIN, re_guts::csetsize, for(), and parse::g.

Referenced by p_bracket().

◆ nonnewline()

static void nonnewline ( struct parse p)
static

Definition at line 961 of file regcomp.c.

References assert(), parse::end, parse::next, and p_bracket().

Referenced by p_ere_exp(), and p_simp_re().

◆ ordinary()

static void ordinary ( struct parse p,
int  ch 
)
static

◆ othercase()

static char othercase ( int  ch)
static

Definition at line 901 of file regcomp.c.

References assert().

Referenced by bothcases(), ordinary(), and p_bracket().

◆ p_b_cclass()

static void p_b_cclass ( struct parse p,
cset cs 
)
static

Definition at line 811 of file regcomp.c.

References cclasses, CHadd, cclass::chars, MCadd, MORE, cclass::multis, cclass::name, parse::next, NEXT, PEEK, REG_ECTYPE, and SETERROR.

Referenced by p_b_term().

◆ p_b_coll_elem()

static char p_b_coll_elem ( struct parse p,
int  endc 
)
static

Definition at line 874 of file regcomp.c.

References cnames, cname::code, MORE, cname::name, parse::next, NEXT, REG_EBRACK, REG_ECOLLATE, SEETWO, and SETERROR.

Referenced by p_b_eclass(), and p_b_symbol().

◆ p_b_eclass()

static void p_b_eclass ( struct parse p,
cset cs 
)
static

Definition at line 844 of file regcomp.c.

References CHadd, and p_b_coll_elem().

Referenced by p_b_term().

◆ p_b_symbol()

static char p_b_symbol ( struct parse p)
static

Definition at line 856 of file regcomp.c.

References EATTWO, GETNEXT, MORE, p_b_coll_elem(), REG_EBRACK, REG_ECOLLATE, and REQUIRE.

Referenced by p_b_term().

◆ p_b_term()

static void p_b_term ( struct parse p,
cset cs 
)
static

◆ p_bracket()

static void p_bracket ( struct parse p)
static

◆ p_bre()

static void p_bre ( struct parse p,
int  end1,
int  end2 
)
static

◆ p_count()

static int p_count ( struct parse p)
static

Definition at line 648 of file regcomp.c.

References llvm::count(), DUPMAX, GETNEXT, MORE, PEEK, REG_BADBR, and REQUIRE.

Referenced by p_ere_exp(), and p_simp_re().

◆ p_ere()

static void p_ere ( struct parse p,
int  stop 
)
static

Definition at line 265 of file regcomp.c.

References AHEAD, assert(), ASTERN, EAT, EMIT, first, HERE, INSERT, MORE, O_CH, OCH_, OOR1, OOR2, p_ere_exp(), PEEK, REG_EMPTY, REQUIRE, SEE, and THERE.

Referenced by llvm_regcomp(), and p_ere_exp().

◆ p_ere_exp()

static void p_ere_exp ( struct parse p)
static

◆ p_simp_re()

static int p_simp_re ( struct parse p,
int  starordinary 
)
static

◆ p_str()

static void p_str ( struct parse p)
static

Definition at line 483 of file regcomp.c.

References GETNEXT, MORE, ordinary(), REG_EMPTY, and REQUIRE.

Referenced by llvm_regcomp().

◆ pluscount()

static sopno pluscount ( struct parse p,
struct re_guts g 
)
static

Definition at line 1547 of file regcomp.c.

References parse::error, re_guts::iflags, O_PLUS, OEND, OP, OPLUS_, REGEX_BAD, scan(), and re_guts::strip.

Referenced by llvm_regcomp().

◆ repeat()

static void repeat ( struct parse p,
sopno  start,
int  from,
int  to 
)
static

Definition at line 983 of file regcomp.c.

References AHEAD, assert(), ASTERN, DROP, dupl(), EMIT, parse::error, HERE, INF, INSERT, MAP, N, O_CH, O_PLUS, OCH_, OOR1, OOR2, OPLUS_, REG_ASSERT, REP, SETERROR, THERE, and THERETHERE.

Referenced by p_ere_exp(), and p_simp_re().

◆ samesets()

static int samesets ( struct re_guts g,
int  c1,
int  c2 
)
static

Definition at line 1278 of file regcomp.c.

References re_guts::ncsets, and re_guts::setbits.

Referenced by categorize().

◆ seterr()

static int seterr ( struct parse p,
int  e 
)
static

Definition at line 1053 of file regcomp.c.

References parse::end, parse::error, parse::next, and nuls.

◆ stripsnug()

static void stripsnug ( struct parse p,
struct re_guts g 
)
static

Definition at line 1443 of file regcomp.c.

References re_guts::nstates, REG_ESPACE, SETERROR, parse::slen, parse::strip, and re_guts::strip.

Referenced by llvm_regcomp().

Variable Documentation

◆ nuls

char nuls[10]
static

Definition at line 116 of file regcomp.c.

Referenced by seterr().