Deleted Added
full compact
re_comp.c (194793) re_comp.c (205146)
1/*-
2 * Copyright (c) 1992 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * James da Silva at the University of Maryland at College Park.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 17 unchanged lines hidden (view full) ---

26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1992 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * James da Silva at the University of Maryland at College Park.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 17 unchanged lines hidden (view full) ---

26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#include <sys/cdefs.h>
34__FBSDID("$FreeBSD: head/lib/libcompat/4.3/regex.c 194793 2009-06-23 23:20:09Z delphij $");
34__FBSDID("$FreeBSD: head/lib/libcompat/4.3/re_comp.c 205146 2010-03-14 10:18:58Z ed $");
35
36/*
37 * Compatibility routines that implement the old re_comp/re_exec interface in
38 * terms of the regcomp/regexec interface. It's possible that some programs
39 * rely on dark corners of re_comp/re_exec and won't work with this version,
40 * but most programs should be fine.
41 */
42
43#if defined(LIBC_SCCS) && !defined(lint)
44static char sccsid[] = "@(#)regex.c 5.1 (Berkeley) 3/29/92";
45#endif /* LIBC_SCCS and not lint */
46
35
36/*
37 * Compatibility routines that implement the old re_comp/re_exec interface in
38 * terms of the regcomp/regexec interface. It's possible that some programs
39 * rely on dark corners of re_comp/re_exec and won't work with this version,
40 * but most programs should be fine.
41 */
42
43#if defined(LIBC_SCCS) && !defined(lint)
44static char sccsid[] = "@(#)regex.c 5.1 (Berkeley) 3/29/92";
45#endif /* LIBC_SCCS and not lint */
46
47#include <sys/types.h>
47#include <regex.h>
48#include <stddef.h>
48#include <stddef.h>
49#include <regexp.h>
50#include <string.h>
51#include <stdlib.h>
52#include <string.h>
49#include <unistd.h>
53
50
54static regexp *re_regexp;
55static int re_goterr;
56static char *re_errstr;
51static regex_t re_regexp;
52static int re_gotexp;
53static char re_errstr[100];
57
58char *
54
55char *
59re_comp(char *s)
56re_comp(const char *s)
60{
57{
58 int rc;
59
61 if (s == NULL || *s == '\0') {
60 if (s == NULL || *s == '\0') {
62 if (re_regexp == NULL)
63 return "no previous regular expression";
61 if (!re_gotexp)
62 return __DECONST(char *,
63 "no previous regular expression");
64 return (NULL);
65 }
64 return (NULL);
65 }
66 if (re_regexp)
67 free(re_regexp);
68 if (re_errstr)
69 free(re_errstr);
70 re_goterr = 0;
71 re_regexp = regcomp(s);
72 return (re_goterr ? re_errstr : NULL);
66
67 if (re_gotexp) {
68 regfree(&re_regexp);
69 re_gotexp = 0;
70 }
71
72 rc = regcomp(&re_regexp, s, REG_EXTENDED);
73 if (rc == 0) {
74 re_gotexp = 1;
75 return (NULL);
76 }
77
78 regerror(rc, &re_regexp, re_errstr, sizeof(re_errstr));
79 re_errstr[sizeof(re_errstr) - 1] = '\0';
80 return (re_errstr);
73}
74
75int
81}
82
83int
76re_exec(char *s)
84re_exec(const char *s)
77{
78 int rc;
79
85{
86 int rc;
87
80 re_goterr = 0;
81 rc = regexec(re_regexp, s);
82 return (re_goterr ? -1 : rc);
88 if (!re_gotexp)
89 return (-1);
90 rc = regexec(&re_regexp, s, 0, NULL, 0);
91 return (rc == 0 ? 1 : 0);
83}
92}
84
85void
86regerror(const char *s)
87{
88 re_goterr = 1;
89 if (re_errstr)
90 free(re_errstr);
91 re_errstr = strdup(s);
92}