]> jfr.im git - irc/evilnet/x3.git/blame - rx/rxnode.h
Couple of srvx updates.
[irc/evilnet/x3.git] / rx / rxnode.h
CommitLineData
d76ed9a9 1/* classes: h_files */
2
3#ifndef RXNODEH
4#define RXNODEH
5/* Copyright (C) 1995, 1996 Tom Lord
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Library General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Library General Public License for more details.
16 *
17 * You should have received a copy of the GNU Library General Public License
18 * along with this software; see the file COPYING. If not, write to
19 * the Free Software Foundation, 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
21 */
22
23
24\f
25/*
26 * Tom Lord (lord@cygnus.com, lord@gnu.ai.mit.edu)
27 */
28
29\f
30#include "rxbitset.h"
31#include "rxcset.h"
32
33\f
34
35enum rexp_node_type
36{
37 r_cset = 0, /* Match from a character set. `a' or `[a-z]'*/
38 r_concat = 1, /* Concat two subexpressions. `ab' */
39 r_alternate = 2, /* Choose one of two subexpressions. `a\|b' */
40 r_opt = 3, /* Optional subexpression. `a?' */
41 r_star = 4, /* Repeated subexpression. `a*' */
42 r_plus = 5, /* Nontrivially repeated subexpression. `a+' */
43 r_string = 6, /* Shorthand for a concatenation of characters */
44 r_cut = 7, /* Generates a tagged, final nfa state. */
45
46 /* see RX_regular_node_type */
47
48 r_interval = 8, /* Counted subexpression. `a{4, 1000}' */
49 r_parens = 9, /* Parenthesized subexpression */
50 r_context = 10 /* Context-sensative operator such as "^" */
51};
52
53#define RX_regular_node_type(T) ((T) <= r_interval)
54
55
56
57struct rx_string
58{
59 unsigned long len;
60 unsigned long reallen;
61 unsigned char *contents;
62};
63
64struct rexp_node
65{
66 int refs;
67 enum rexp_node_type type;
68 struct
69 {
70 int cset_size;
71 rx_Bitset cset;
72 int intval;
73 int intval2;
74 struct
75 {
76 struct rexp_node *left;
77 struct rexp_node *right;
78 } pair;
79 struct rx_string cstr;
80 } params;
81 int id;
82 int len;
83 int observed;
84 struct rexp_node * simplified;
85 struct rx_cached_rexp * cr;
86};
87
88
89\f
90#ifdef __STDC__
91extern int rx_adjoin_string (struct rx_string *str, char c);
92extern struct rexp_node * rexp_node (int type);
93extern struct rexp_node * rx_mk_r_cset (int type, int size, rx_Bitset b);
94extern struct rexp_node * rx_mk_r_int (int type, int intval);
95extern struct rexp_node * rx_mk_r_str (int type, char c);
96extern struct rexp_node * rx_mk_r_binop (int type, struct rexp_node * a, struct rexp_node * b);
97extern struct rexp_node * rx_mk_r_monop (int type, struct rexp_node * a);
98extern void rx_free_rexp (struct rexp_node * node);
99extern void rx_save_rexp (struct rexp_node * node);
100extern struct rexp_node * rx_copy_rexp (int cset_size, struct rexp_node *node);
101extern struct rexp_node * rx_shallow_copy_rexp (int cset_size, struct rexp_node *node);
102extern int rx_rexp_equal (struct rexp_node * a, struct rexp_node * b);
103extern unsigned long rx_rexp_hash (struct rexp_node * node, unsigned long seed);
104
105#else /* STDC */
106extern int rx_adjoin_string ();
107extern struct rexp_node * rexp_node ();
108extern struct rexp_node * rx_mk_r_cset ();
109extern struct rexp_node * rx_mk_r_int ();
110extern struct rexp_node * rx_mk_r_str ();
111extern struct rexp_node * rx_mk_r_binop ();
112extern struct rexp_node * rx_mk_r_monop ();
113extern void rx_free_rexp ();
114extern void rx_save_rexp ();
115extern struct rexp_node * rx_copy_rexp ();
116extern struct rexp_node * rx_shallow_copy_rexp ();
117extern int rx_rexp_equal ();
118extern unsigned long rx_rexp_hash ();
119
120#endif /* STDC */
121
122
123
124
125#endif /* RXNODEH */