summaryrefslogtreecommitdiffstats
path: root/rx/rxstr.c
diff options
context:
space:
mode:
Diffstat (limited to 'rx/rxstr.c')
-rw-r--r--rx/rxstr.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/rx/rxstr.c b/rx/rxstr.c
new file mode 100644
index 00000000..c3ccb036
--- /dev/null
+++ b/rx/rxstr.c
@@ -0,0 +1,130 @@
+/* Copyright (C) 1995, 1996 Tom Lord
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+
+#include "rxall.h"
+#include "rxstr.h"
+
+
+
+#ifdef __STDC__
+enum rx_answers
+rx_str_vmfn (void * closure, unsigned const char ** burstp, int * lenp, int * offsetp, int start, int end, int need)
+#else
+enum rx_answers
+rx_str_vmfn (closure, burstp, lenp, offsetp, start, end, need)
+ void * closure;
+ unsigned const char ** burstp;
+ int * lenp;
+ int * offsetp;
+ int start;
+ int end;
+ int need;
+#endif
+{
+ struct rx_str_closure * strc;
+ strc = (struct rx_str_closure *)closure;
+
+ if ( (need < 0)
+ || (need > strc->len))
+ return rx_no;
+
+ *burstp = strc->str;
+ *lenp = strc->len;
+ *offsetp = 0;
+ return rx_yes;
+}
+
+#ifdef __STDC__
+enum rx_answers
+rx_str_contextfn (void * closure, struct rexp_node * node, int start, int end, struct rx_registers * regs)
+#else
+enum rx_answers
+rx_str_contextfn (closure, node, start, end, regs)
+ void * closure;
+ struct rexp_node * node;
+ int start;
+ int end;
+ struct rx_registers * regs;
+#endif
+{
+ struct rx_str_closure * strc;
+
+ strc = (struct rx_str_closure *)closure;
+ switch (node->params.intval)
+ {
+ case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ {
+ int cmp;
+ int regn;
+ regn = node->params.intval - '0';
+ if ( (regs[regn].rm_so == -1)
+ || ((end - start) != (regs[regn].rm_eo - regs[regn].rm_so)))
+ return rx_no;
+ else
+ {
+ if (strc->rules.case_indep)
+ cmp = strncasecmp (strc->str + start,
+ strc->str + regs[regn].rm_so,
+ end - start);
+ else
+ cmp = strncmp (strc->str + start,
+ strc->str + regs[regn].rm_so,
+ end - start);
+
+ return (!cmp
+ ? rx_yes
+ : rx_no);
+ }
+ }
+
+ case '^':
+ {
+ return (( (start == end)
+ && ( ((start == 0) && !strc->rules.not_bol)
+ || ( (start > 0)
+ && strc->rules.newline_anchor
+ && (strc->str[start - 1] == '\n'))))
+ ? rx_yes
+ : rx_no);
+ }
+
+ case '$':
+ {
+ return (( (start == end)
+ && ( ((start == strc->len) && !strc->rules.not_eol)
+ || ( (start < strc->len)
+ && strc->rules.newline_anchor
+ && (strc->str[start] == '\n'))))
+ ? rx_yes
+ : rx_no);
+ }
+
+ case '<':
+ case '>':
+
+ case 'B':
+ case 'b':
+
+
+ default:
+ return rx_bogus;
+ }
+}