Merge Steve Murphy's (murf) complete re-implementation of AEL, which is now no longer...
[asterisk/asterisk.git] / include / asterisk / ael_structs.h
1 #if !defined(SOLARIS) && !defined(__CYGWIN__)
2 #include <err.h>
3 #else
4 #define quad_t int64_t
5 #endif
6
7 #ifdef LONG_LONG_MIN
8 #define QUAD_MIN LONG_LONG_MIN
9 #endif
10 #ifdef LONG_LONG_MAX
11 #define QUAD_MAX LONG_LONG_MAX
12 #endif
13
14 #  if ! defined(QUAD_MIN)
15 #   define QUAD_MIN     (-0x7fffffffffffffffLL-1)
16 #  endif
17 #  if ! defined(QUAD_MAX)
18 #   define QUAD_MAX     (0x7fffffffffffffffLL)
19 #  endif
20
21
22 typedef enum 
23 {
24         PV_WORD, /* an ident, string, name, label, etc. A user-supplied string. */
25         PV_MACRO,
26         PV_CONTEXT,
27         PV_MACRO_CALL,
28         PV_APPLICATION_CALL,
29         PV_CASE,
30         PV_PATTERN,
31         PV_DEFAULT,
32         PV_CATCH,
33         PV_SWITCHES,
34         PV_ESWITCHES,
35         PV_INCLUDES,
36         PV_STATEMENTBLOCK,
37         PV_VARDEC, /* you know, var=val; */
38         PV_GOTO,
39         PV_LABEL,
40         PV_FOR,
41         PV_WHILE,
42         PV_BREAK,
43         PV_RETURN,
44         PV_CONTINUE,
45         PV_IF,
46         PV_IFTIME,
47         PV_RANDOM,
48         PV_SWITCH,
49         PV_EXTENSION,
50         PV_IGNOREPAT,
51         PV_GLOBALS,
52
53 } pvaltype;
54
55 /* why this horrible mess? It's always been a tradeoff-- tons of structs,
56    each storing it's specific lists of goodies, or a 'simple' single struct,
57    with lots of fields, that catches all uses at once. Either you have a long
58    list of struct names and subnames, or you have a long list of field names,
59    and where/how they are used. I'm going with a single struct, using unions
60    to reduce storage. Some simple generalizations, and a long list of types,
61    and a book about what is used with what types.... Sorry!
62 */
63
64 struct pval
65 {
66         pvaltype type;
67         int startline;
68         int endline;
69         int startcol;
70         int endcol;
71         char *filename;
72         
73         union
74         {
75                 char *str; /* wow, used almost everywhere! */
76                 struct pval *list; /* used in SWITCHES, ESWITCHES, INCLUDES, STATEMENTBLOCK, GOTO */
77                 struct pval *statements;/*  used in EXTENSION */
78                 char *for_init;  /* used in FOR */
79         } u1;
80         struct pval *u1_last; /* to build in-order lists -- looks like we only need one */
81         
82         union
83         {
84                 struct pval *arglist; /* used in macro_call, application_call, MACRO def, also attached to PWORD, the 4 timevals for includes  */
85                 struct pval *statements; /* used in case, default, catch, while's statement, CONTEXT elements, GLOBALS */
86                 char *val;  /* used in VARDEC */
87                 char *for_test; /* used in FOR */
88                 
89         } u2;
90         
91         union
92         {
93                 char *for_inc; /* used in FOR */
94                 struct pval *else_statements; /* used in IF */
95                 struct pval *macro_statements; /* used in MACRO */
96                 int abstract;  /* used for context */
97                 char *hints; /* used in EXTENSION */
98         } u3;
99         
100         union
101         {
102                 struct pval *for_statements; /* used in PV_FOR */
103                 int regexten;                /* used in EXTENSION */
104         } u4;
105         
106         
107         struct pval *next; /* the pval at the end of this ptr will ALWAYS be of the same type as this one! 
108                                                   EXCEPT for objects of the different types, that are in the same list, like contexts & macros, etc */
109         
110         
111 } ;
112
113
114 typedef struct pval pval;
115
116 pval *npval(pvaltype type, int first_line, int last_line, int first_column, int last_column);
117 void linku1(pval *head, pval *tail);
118 void print_pval_list(FILE *f, pval *item, int depth);
119 void print_pval(FILE *f, pval *item, int depth);
120 void ael2_semantic_check(pval *item, int *errs, int *warns, int *notes);
121 struct pval *find_label_in_current_context(char *exten, char *label);
122 struct pval *find_label_in_current_extension(char *label);
123 int count_labels_in_current_context(char *label);
124 struct pval *find_label_in_current_db(char *context, char *exten, char *label);
125 struct pval *ael2_parse(char *fname, int *errs);
126 void destroy_pval(pval *item);
127 void ael2_print(char *fname, pval *tree);
128 #ifndef YY_TYPEDEF_YY_SCANNER_T
129 #define YY_TYPEDEF_YY_SCANNER_T
130 typedef void* yyscan_t;
131 #endif
132
133 /* for passing info into and out of yyparse */
134 struct parse_io
135 {
136         struct pval *pval; /* yyparse will set this to point to the parse tree */
137         yyscan_t scanner;       /* yylex needs a scanner. Set it up, and pass it in */
138         int syntax_error_count;  /* the count of syntax errors encountered */
139 };
140
141 /* for CODE GENERATION */
142         
143 typedef enum { AEL_APPCALL, AEL_CONTROL1, AEL_FOR_CONTROL, AEL_IF_CONTROL, AEL_IFTIME_CONTROL, AEL_RAND_CONTROL, AEL_LABEL, AEL_RETURN } ael_priority_type;
144
145
146 struct ael_priority
147 {
148         int priority_num;
149         ael_priority_type type;
150         
151         char *app;
152         char *appargs;
153         
154         struct pval *origin;
155         struct ael_extension *exten;
156         
157         struct ael_priority *goto_true;
158         struct ael_priority *goto_false;
159         struct ael_priority *next;
160 };
161
162 struct ael_extension
163 {
164         char *name;
165         char *hints;
166         int regexten;
167         
168         struct ael_priority *plist;
169         struct ael_priority *plist_last;
170         struct ael_extension *next_exten;
171
172         struct ael_priority *loop_break;  /* set by latest loop for breaks */
173         struct ael_priority *loop_continue; /* set by lastest loop for continuing */
174         struct ael_priority *return_target;
175         int return_needed;
176 };
177
178