Merged revisions 87168 via svnmerge from
[asterisk/asterisk.git] / include / asterisk / pval.h
1 #ifndef _ASTERISK_PVAL_H
2 #define _ASTERISK_PVAL_H
3
4
5 typedef enum 
6 {
7         PV_WORD, /* an ident, string, name, label, etc. A user-supplied string. */ /* 0 */
8         PV_MACRO,             /* 1 */
9         PV_CONTEXT,           /* 2 */
10         PV_MACRO_CALL,        /* 3 */
11         PV_APPLICATION_CALL,  /* 4 */
12         PV_CASE,              /* 5 */
13         PV_PATTERN,           /* 6 */
14         PV_DEFAULT,           /* 7 */
15         PV_CATCH,             /* 8 */
16         PV_SWITCHES,          /* 9 */
17         PV_ESWITCHES,         /* 10 */
18         PV_INCLUDES,          /* 11 */
19         PV_STATEMENTBLOCK,    /* 12 */
20         PV_VARDEC, /* you know, var=val; */  /* 13 */
21         PV_GOTO,              /* 14 */
22         PV_LABEL,             /* 15 */
23         PV_FOR,               /* 16 */
24         PV_WHILE,             /* 17 */
25         PV_BREAK,             /* 18 */
26         PV_RETURN,            /* 19 */
27         PV_CONTINUE,          /* 20 */
28         PV_IF,                /* 21 */
29         PV_IFTIME,            /* 22 */
30         PV_RANDOM,            /* 23 */
31         PV_SWITCH,            /* 24 */
32         PV_EXTENSION,         /* 25 */
33         PV_IGNOREPAT,         /* 26 */
34         PV_GLOBALS,           /* 27 */
35         PV_LOCALVARDEC,       /* 28 */
36 } pvaltype;
37
38 /* why this horrible mess? It's always been a tradeoff-- tons of structs,
39    each storing it's specific lists of goodies, or a 'simple' single struct,
40    with lots of fields, that catches all uses at once. Either you have a long
41    list of struct names and subnames, or you have a long list of field names,
42    and where/how they are used. I'm going with a single struct, using unions
43    to reduce storage. Some simple generalizations, and a long list of types,
44    and a book about what is used with what types.... Sorry!
45 */
46
47 struct pval
48 {
49         pvaltype type;
50         int startline;
51         int endline;
52         int startcol;
53         int endcol;
54         char *filename;
55         
56         union
57         {
58                 char *str; /* wow, used almost everywhere! */
59                 struct pval *list; /* used in SWITCHES, ESWITCHES, INCLUDES, STATEMENTBLOCK, GOTO */
60                 struct pval *statements;/*  used in EXTENSION */
61                 char *for_init;  /* used in FOR */
62         } u1;
63         struct pval *u1_last; /* to build in-order lists -- looks like we only need one */
64         
65         union
66         {
67                 struct pval *arglist; /* used in macro_call, application_call, MACRO def, also attached to PWORD, the 4 timevals for includes  */
68                 struct pval *statements; /* used in case, default, catch, while's statement, CONTEXT elements, GLOBALS */
69                 char *val;  /* used in VARDEC */
70                 char *for_test; /* used in FOR */
71                 int label_in_case; /* a boolean for LABELs */
72                 struct pval *goto_target;  /* used in GOTO */
73         } u2;
74         
75         union
76         {
77                 char *for_inc; /* used in FOR */
78                 struct pval *else_statements; /* used in IF */
79                 struct pval *macro_statements; /* used in MACRO */
80                 int abstract;  /* used for context 1=abstract; 2=extend; 3=both */
81                 char *hints; /* used in EXTENSION */
82                 int goto_target_in_case; /* used in GOTO */
83                 struct ael_extension *compiled_label;
84                 struct pval *extend; /* to link extended contexts to the 'original' */
85         } u3;
86         
87         union
88         {
89                 struct pval *for_statements; /* used in PV_FOR */
90                 int regexten;                /* used in EXTENSION */
91         } u4;
92         
93         struct pval *next; /* the pval at the end of this ptr will ALWAYS be of the same type as this one! 
94                                                   EXCEPT for objects of the different types, that are in the same list, like contexts & macros, etc */
95         
96         struct pval *dad; /* the 'container' of this struct instance */
97         struct pval *prev; /* the opposite of the 'next' pointer */
98 } ;
99
100
101 typedef struct pval pval;
102
103 #ifndef AAL_ARGCHECK
104 /* for the time being, short circuit all the AAL related structures
105    without permanently removing the code; after/during the AAL 
106    development, this code can be properly re-instated 
107 */
108
109 /* null definitions for structs passed down the infrastructure */
110 struct argapp
111 {
112         struct argapp *next;
113 };
114
115 #endif
116
117 struct ast_context;
118
119 #ifdef AAL_ARGCHECK
120 int option_matches_j( struct argdesc *should, pval *is, struct argapp *app);
121 int option_matches( struct argdesc *should, pval *is, struct argapp *app);
122 int ael_is_funcname(char *name);
123 #endif
124
125 int do_pbx_load_module(void);
126 int count_labels_in_current_context(char *label);
127 int check_app_args(pval *appcall, pval *arglist, struct argapp *app);
128 void check_pval(pval *item, struct argapp *apps, int in_globals);
129 void check_pval_item(pval *item, struct argapp *apps, int in_globals);
130 void check_switch_expr(pval *item, struct argapp *apps);
131 void ast_expr_register_extra_error_info(char *errmsg);
132 void ast_expr_clear_extra_error_info(void);
133 int  ast_expr(char *expr, char *buf, int length, struct ast_channel *chan);
134 struct pval *find_macro(char *name);
135 struct pval *find_context(char *name);
136 struct pval *find_context(char *name);
137 struct pval *find_macro(char *name);
138 struct ael_priority *new_prio(void);
139 struct ael_extension *new_exten(void);
140 void linkprio(struct ael_extension *exten, struct ael_priority *prio);
141 void destroy_extensions(struct ael_extension *exten);
142 /* static void linkexten(struct ael_extension *exten, struct ael_extension *add);
143    static void gen_prios(struct ael_extension *exten, char *label, pval *statement, struct ael_extension *mother_exten, struct ast_context *context ); */
144 void set_priorities(struct ael_extension *exten);
145 void add_extensions(struct ael_extension *exten);
146 void ast_compile_ael2(struct ast_context **local_contexts, struct pval *root);
147 void destroy_pval(pval *item);
148 void destroy_pval_item(pval *item);
149 int is_float(char *arg );
150 int is_int(char *arg );
151 int is_empty(char *arg);
152
153 /* PVAL PI */
154
155
156 pval *pvalCreateNode( pvaltype type );
157 pvaltype pvalObjectGetType( pval *p );
158
159 void pvalWordSetString( pval *p, char *str);
160 char *pvalWordGetString( pval *p );
161
162 void pvalMacroSetName( pval *p, char *name);
163 char *pvalMacroGetName( pval *p );
164 void pvalMacroSetArglist( pval *p, pval *arglist );
165 void pvalMacroAddArg( pval *p, pval *arg );
166 pval *pvalMacroWalkArgs( pval *p, pval **arg );
167 void pvalMacroAddStatement( pval *p, pval *statement );
168 pval *pvalMacroWalkStatements( pval *p, pval **next_statement );
169
170 void pvalContextSetName( pval *p, char *name);
171 char *pvalContextGetName( pval *p );
172 void pvalContextSetAbstract( pval *p );
173 void pvalContextUnsetAbstract( pval *p );
174 int  pvalContextGetAbstract( pval *p );
175 void pvalContextAddStatement( pval *p, pval *statement);
176 pval *pvalContextWalkStatements( pval *p, pval **statements );
177
178 void pvalMacroCallSetMacroName( pval *p, char *name );
179 char* pvalMacroCallGetMacroName( pval *p );
180 void pvalMacroCallSetArglist( pval *p, pval *arglist );
181 void pvalMacroCallAddArg( pval *p, pval *arg );
182 pval *pvalMacroCallWalkArgs( pval *p, pval **args );
183
184 void pvalAppCallSetAppName( pval *p, char *name );
185 char* pvalAppCallGetAppName( pval *p );
186 void pvalAppCallSetArglist( pval *p, pval *arglist );
187 void pvalAppCallAddArg( pval *p, pval *arg );
188 pval *pvalAppCallWalkArgs( pval *p, pval **args );
189
190 void pvalCasePatSetVal( pval *p, char *val );
191 char* pvalCasePatGetVal( pval *p );
192 void pvalCasePatDefAddStatement( pval *p, pval *statement );
193 pval *pvalCasePatDefWalkStatements( pval *p, pval **statement );
194
195 void pvalCatchSetExtName( pval *p, char *name );
196 char* pvalCatchGetExtName( pval *p );
197 void pvalCatchSetStatement( pval *p, pval *statement );
198 pval *pvalCatchGetStatement( pval *p );
199
200 void pvalSwitchesAddSwitch( pval *p, char *name );
201 char* pvalSwitchesWalkNames( pval *p, pval **next_item );
202 void pvalESwitchesAddSwitch( pval *p, char *name );
203 char* pvalESwitchesWalkNames( pval *p, pval **next_item );
204
205 void pvalIncludesAddInclude( pval *p, const char *include );
206
207 void pvalIncludesAddIncludeWithTimeConstraints( pval *p, const char *include, char *hour_range, char *dom_range, char *dow_range, char *month_range );
208 void pvalIncludeGetTimeConstraints( pval *p, char **hour_range, char **dom_range, char **dow_range, char **month_range );
209 char* pvalIncludesWalk( pval *p, pval **next_item );
210
211 void pvalStatementBlockAddStatement( pval *p, pval *statement);
212 pval *pvalStatementBlockWalkStatements( pval *p, pval **next_statement);
213
214 void pvalVarDecSetVarname( pval *p, char *name );
215 void pvalVarDecSetValue( pval *p, char *value );
216 char* pvalVarDecGetVarname( pval *p );
217 char* pvalVarDecGetValue( pval *p );
218
219 void pvalGotoSetTarget( pval *p, char *context, char *exten, char *label );
220 void pvalGotoGetTarget( pval *p, char **context, char **exten, char **label );
221
222 void pvalLabelSetName( pval *p, char *name );
223 char* pvalLabelGetName( pval *p );
224
225 void pvalForSetInit( pval *p, char *init );
226 void pvalForSetTest( pval *p, char *test );
227 void pvalForSetInc( pval *p, char *inc );
228 void pvalForSetStatement( pval *p, pval *statement );
229 char* pvalForGetInit( pval *p );
230 char* pvalForGetTest( pval *p );
231 char* pvalForGetInc( pval *p );
232 pval* pvalForGetStatement( pval *p );
233
234
235 void pvalIfSetCondition( pval *p, char *expr );
236 char* pvalIfGetCondition( pval *p );
237 void pvalIfTimeSetCondition( pval *p, char *hour_range, char *dow_range, char *dom_range, char *mon_range );  /* time range format: 24-hour format begin-end|dow range|dom range|month range */
238 void pvalIfTimeGetCondition( pval *p, char **hour_range, char **dow_range, char **dom_range, char **month_range );
239 void pvalRandomSetCondition( pval *p, char *percent );
240 char* pvalRandomGetCondition( pval *p );
241 void pvalConditionalSetThenStatement( pval *p, pval *statement );
242 void pvalConditionalSetElseStatement( pval *p, pval *statement );
243 pval* pvalConditionalGetThenStatement( pval *p );
244 pval* pvalConditionalGetElseStatement( pval *p );
245
246 void pvalSwitchSetTestexpr( pval *p, char *expr );
247 char* pvalSwitchGetTestexpr( pval *p );
248 void pvalSwitchAddCase( pval *p, pval *Case );
249 pval* pvalSwitchWalkCases( pval *p, pval **next_case );
250
251 void pvalExtenSetName( pval *p, char *name );
252 char *pvalExtenGetName( pval *p );
253 void pvalExtenSetRegexten( pval *p );
254 void pvalExtenUnSetRegexten( pval *p );
255 int pvalExtenGetRegexten( pval *p );
256 void pvalExtenSetHints( pval *p, char *hints );
257 char* pvalExtenGetHints( pval *p );
258 void pvalExtenSetStatement( pval *p, pval *statement );
259 pval* pvalExtenGetStatement( pval *p );
260
261 void pvalIgnorePatSetPattern( pval *p, char *pat );
262 char* pvalIgnorePatGetPattern( pval *p );
263
264 void pvalGlobalsAddStatement( pval *p, pval *statement );
265 pval* pvalGlobalsWalkStatements( pval *p, pval **next_statement );
266
267 void pvalTopLevAddObject( pval *p, pval *contextOrObj );
268 pval* pvalTopLevWalkObjects( pval *p, pval **next_obj );
269
270 int  pvalCheckType( pval *p, char *funcname, pvaltype type );
271
272
273 #endif