]> jfr.im git - irc/evilnet/x3.git/blob - rx/rxstr.c
Removed extra 'is' from CSMSG_SMURF_TARGET
[irc/evilnet/x3.git] / rx / rxstr.c
1 /* Copyright (C) 1995, 1996 Tom Lord
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU Library General Public License as published by
5 * the Free Software Foundation; either version 2, or (at your option)
6 * any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Library General Public License for more details.
12 *
13 * You should have received a copy of the GNU Library General Public License
14 * along with this software; see the file COPYING. If not, write to
15 * the Free Software Foundation, 59 Temple Place - Suite 330,
16 * Boston, MA 02111-1307, USA.
17 */
18
19
20 \f
21 #include "rxall.h"
22 #include "rxstr.h"
23
24 \f
25
26 #ifdef __STDC__
27 enum rx_answers
28 rx_str_vmfn (void * closure, unsigned const char ** burstp, int * lenp, int * offsetp, int start, int end, int need)
29 #else
30 enum rx_answers
31 rx_str_vmfn (closure, burstp, lenp, offsetp, start, end, need)
32 void * closure;
33 unsigned const char ** burstp;
34 int * lenp;
35 int * offsetp;
36 int start;
37 int end;
38 int need;
39 #endif
40 {
41 struct rx_str_closure * strc;
42 strc = (struct rx_str_closure *)closure;
43
44 if ( (need < 0)
45 || (need > strc->len))
46 return rx_no;
47
48 *burstp = strc->str;
49 *lenp = strc->len;
50 *offsetp = 0;
51 return rx_yes;
52 }
53
54 #ifdef __STDC__
55 enum rx_answers
56 rx_str_contextfn (void * closure, struct rexp_node * node, int start, int end, struct rx_registers * regs)
57 #else
58 enum rx_answers
59 rx_str_contextfn (closure, node, start, end, regs)
60 void * closure;
61 struct rexp_node * node;
62 int start;
63 int end;
64 struct rx_registers * regs;
65 #endif
66 {
67 struct rx_str_closure * strc;
68
69 strc = (struct rx_str_closure *)closure;
70 switch (node->params.intval)
71 {
72 case '1': case '2': case '3': case '4': case '5':
73 case '6': case '7': case '8': case '9':
74 {
75 int cmp;
76 int regn;
77 regn = node->params.intval - '0';
78 if ( (regs[regn].rm_so == -1)
79 || ((end - start) != (regs[regn].rm_eo - regs[regn].rm_so)))
80 return rx_no;
81 else
82 {
83 if (strc->rules.case_indep)
84 cmp = strncasecmp (strc->str + start,
85 strc->str + regs[regn].rm_so,
86 end - start);
87 else
88 cmp = strncmp (strc->str + start,
89 strc->str + regs[regn].rm_so,
90 end - start);
91
92 return (!cmp
93 ? rx_yes
94 : rx_no);
95 }
96 }
97
98 case '^':
99 {
100 return (( (start == end)
101 && ( ((start == 0) && !strc->rules.not_bol)
102 || ( (start > 0)
103 && strc->rules.newline_anchor
104 && (strc->str[start - 1] == '\n'))))
105 ? rx_yes
106 : rx_no);
107 }
108
109 case '$':
110 {
111 return (( (start == end)
112 && ( ((start == strc->len) && !strc->rules.not_eol)
113 || ( (start < strc->len)
114 && strc->rules.newline_anchor
115 && (strc->str[start] == '\n'))))
116 ? rx_yes
117 : rx_no);
118 }
119
120 case '<':
121 case '>':
122
123 case 'B':
124 case 'b':
125
126
127 default:
128 return rx_bogus;
129 }
130 }