summaryrefslogtreecommitdiff
path: root/libuxre/regcomp.c
blob: 20a197d788398fc57dfb586b458f72770d8c22c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
 * Changes by Gunnar Ritter, Freiburg i. Br., Germany, November 2002.
 *
 * Sccsid @(#)regcomp.c	1.6 (gritter) 9/22/03
 */
/*  UNIX(R) Regular Expresssion Library
 *
 *  Note: Code is released under the GNU LGPL
 *
 *  Copyright (C) 2001 Caldera International, Inc.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to:
 *        Free Software Foundation, Inc.
 *        59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/*	#include "synonyms.h"	*/
#include "re.h"

/*	#pragma weak regcomp = _regcomp	*/

int
regcomp(regex_t *ep, const char *pat, int flags)
{
	Tree *tp;
	Lex lex;

	if ((tp=libuxre_regparse(&lex, (const unsigned char *)pat, flags)) == 0)
		goto out;
	ep->re_nsub = lex.nleft;
	ep->re_flags = lex.flags & ~(REG_NOTBOL | REG_NOTEOL | REG_NONEMPTY);
	ep->re_col = lex.col;
	ep->re_mb_cur_max = lex.mb_cur_max;
	/*
	* Build the engine(s).  The factors determining which are built:
	*  1. If the pattern built insists on an NFA, then only build NFA.
	*  2. If flags include REG_NOSUB or REG_ONESUB and not (1),
	*     then only build DFA.
	*  3. Otherwise, build both.
	* Since libuxre_regdfacomp() modifies the tree and libuxre_regnfacomp()
	* doesn't, libuxre_regnfacomp() must be called first, if both are to
	* be called.
	*/
	if (ep->re_nsub != 0 && (flags & (REG_NOSUB | REG_ONESUB)) == 0
		|| lex.flags & REG_NFA)
	{
		ep->re_flags |= REG_NFA;
		if ((lex.err = libuxre_regnfacomp(ep, tp, &lex)) != 0)
			goto out;
	}
	if ((lex.flags & REG_NFA) == 0)
	{
		ep->re_flags |= REG_DFA;
		if ((lex.err = libuxre_regdfacomp(ep, tp, &lex)) != 0)
		{
			if (ep->re_flags & REG_NFA)
				libuxre_regdelnfa(ep->re_nfa);
		}
	}
out:;
	if (lex.err != 0 && lex.col != 0)
		(void)libuxre_lc_collate(lex.col);
	if (tp != 0)
		libuxre_regdeltree(tp, lex.err);
	return lex.err;
}