summaryrefslogtreecommitdiff
path: root/src/lib/libast/comp/re_comp.c
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2012-06-24 22:28:35 +0000
committerIgor Pashev <pashev.igor@gmail.com>2012-06-24 22:28:35 +0000
commit3950ffe2a485479f6561c27364d3d7df5a21d124 (patch)
tree468c6e14449d1b1e279222ec32f676b0311917d2 /src/lib/libast/comp/re_comp.c
downloadksh-upstream.tar.gz
Imported Upstream version 93u+upstream
Diffstat (limited to 'src/lib/libast/comp/re_comp.c')
-rw-r--r--src/lib/libast/comp/re_comp.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/lib/libast/comp/re_comp.c b/src/lib/libast/comp/re_comp.c
new file mode 100644
index 0000000..ad31f24
--- /dev/null
+++ b/src/lib/libast/comp/re_comp.c
@@ -0,0 +1,81 @@
+/***********************************************************************
+* *
+* This software is part of the ast package *
+* Copyright (c) 1985-2011 AT&T Intellectual Property *
+* and is licensed under the *
+* Eclipse Public License, Version 1.0 *
+* by AT&T Intellectual Property *
+* *
+* A copy of the License is available at *
+* http://www.eclipse.org/org/documents/epl-v10.html *
+* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
+* *
+* Information and Software Systems Research *
+* AT&T Research *
+* Florham Park NJ *
+* *
+* Glenn Fowler <gsf@research.att.com> *
+* David Korn <dgk@research.att.com> *
+* Phong Vo <kpv@research.att.com> *
+* *
+***********************************************************************/
+#pragma prototyped
+/*
+ * re_comp implementation
+ */
+
+#include <ast.h>
+#include <re_comp.h>
+#include <regex.h>
+
+#undef error
+#undef valid
+
+static struct
+{
+ char error[64];
+ regex_t re;
+ int valid;
+} state;
+
+char*
+re_comp(const char* pattern)
+{
+ register int r;
+
+ if (!pattern || !*pattern)
+ {
+ if (state.valid)
+ return 0;
+ r = REG_BADPAT;
+ }
+ else
+ {
+ if (state.valid)
+ {
+ state.valid = 0;
+ regfree(&state.re);
+ }
+ if (!(r = regcomp(&state.re, pattern, REG_LENIENT|REG_NOSUB|REG_NULL)))
+ {
+ state.valid = 1;
+ return 0;
+ }
+ }
+ regerror(r, &state.re, state.error, sizeof(state.error));
+ return state.error;
+}
+
+int
+re_exec(const char* subject)
+{
+ if (state.valid && subject)
+ switch (regexec(&state.re, subject, 0, NiL, 0))
+ {
+ case 0:
+ return 1;
+ case REG_NOMATCH:
+ return 0;
+ }
+ return -1;
+}