uncomment some functions in the flex code that were actually
[asterisk/asterisk.git] / utils / ael_main.c
1 #include <sys/types.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <locale.h>
6 #include <ctype.h>
7 #if !defined(SOLARIS) && !defined(__CYGWIN__)
8 #include <err.h>
9 #endif
10 #include <errno.h>
11 #include <regex.h>
12 #include <limits.h>
13 #include "asterisk/ast_expr.h"
14 #include "asterisk/logger.h"
15 #include "asterisk/module.h"
16 #include "asterisk/channel.h"
17 #include "asterisk/app.h"
18 #include "asterisk/ael_structs.h"
19 #define AST_CONFIG_MAX_PATH 255
20
21 int conts=0, extens=0, priors=0;
22 char last_exten[18000];
23 char ast_config_AST_CONFIG_DIR[AST_CONFIG_MAX_PATH];
24 char ast_config_AST_VAR_DIR[AST_CONFIG_MAX_PATH];
25
26 void ast_cli_register_multiple(void);
27 void ast_register_file_version(void);
28 void ast_unregister_file_version(void);
29 int ast_add_extension2(void *con,
30                                            int replace, const char *extension, int priority, const char *label, const char *callerid,
31                                                 const char *application, void *data, void (*datad)(void *),
32                                            const char *registrar);
33 void pbx_builtin_setvar(void *chan, void *data);
34 void ast_context_create(void **extcontexts, const char *name, const char *registrar);
35 void ast_context_add_ignorepat2(void *con, const char *value, const char *registrar);
36 void ast_context_add_include2(void *con, const char *value, const char *registrar);
37 void ast_context_add_switch2(void *con, const char *value, const char *data, int eval, const char *registrar);
38 void ast_merge_contexts_and_delete(void);
39 void ast_context_verify_includes(void);
40 struct ast_context * ast_walk_contexts(void);
41 void ast_cli_unregister_multiple(void);
42 void ast_context_destroy(void);
43 void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...);
44 char *ast_process_quotes_and_slashes(char *start, char find, char replace_with);
45 void ast_verbose(const char *fmt, ...);
46 struct ast_app *pbx_findapp(const char *app);
47 static int no_comp = 0;
48 static int use_curr_dir = 0;
49
50
51 struct ast_app *pbx_findapp(const char *app)
52 {
53         return (struct ast_app*)1; /* so as not to trigger an error */
54 }
55
56
57 void ast_copy_string(char *dst, const char *src, size_t size)
58 {
59         while (*src && size) {
60                 *dst++ = *src++;
61                 size--;
62         }
63         if (__builtin_expect(!size, 0))
64                 dst--;
65         *dst = '\0';
66 }
67
68 void ast_cli_register_multiple(void)
69 {
70         if(!no_comp)
71         printf("Executed ast_cli_register_multiple();\n");
72 }
73
74 void ast_register_file_version(void)
75 {
76         if(!no_comp)
77         printf("Executed ast_register_file_version();\n");
78 }
79
80 void ast_unregister_file_version(void)
81 {
82         if(!no_comp)
83         printf("Executed ast_unregister_file_version();\n");
84
85 }
86 int ast_add_extension2(void *con,
87                                                 int replace, const char *extension, int priority, const char *label, const char *callerid,
88                                                 const char *application, void *data, void (*datad)(void *),
89                                                 const char *registrar)
90 {
91         priors++;
92         if (strcmp(extension,last_exten) != 0) {
93                 extens++;
94                 strcpy(last_exten, extension);
95         }
96         if (!label) {
97                 label = "(null)";
98         }
99         if (!callerid) {
100                 callerid = "(null)";
101         }
102         if (!application) {
103                 application = "(null)";
104         }
105         if(!no_comp)
106         printf("Executed ast_add_extension2(con, rep=%d, exten=%s, priority=%d, label=%s, callerid=%s, appl=%s, data=%s, FREE, registrar=%s);\n",
107                 replace, extension, priority, label, callerid, application, (data?(char*)data:"(null)"), registrar);
108
109         /* since add_extension2 is responsible for the malloc'd data stuff */
110         if( data )
111                 free(data);
112         return 0;
113 }
114
115 void pbx_builtin_setvar(void *chan, void *data)
116 {
117         if(!no_comp)
118         printf("Executed pbx_builtin_setvar(chan, data=%s);\n", (char*)data);
119 }
120         
121
122 void ast_context_create(void **extcontexts, const char *name, const char *registrar)
123 {
124         if(!no_comp)
125         printf("Executed ast_context_create(conts, name=%s, registrar=%s);\n", name, registrar);
126         conts++;
127 }
128
129 void ast_context_add_ignorepat2(void *con, const char *value, const char *registrar)
130 {
131         if(!no_comp)
132         printf("Executed ast_context_add_ignorepat2(con, value=%s, registrar=%s);\n", value, registrar);
133 }
134
135 void ast_context_add_include2(void *con, const char *value, const char *registrar)
136 {
137         if(!no_comp)
138         printf("Executed ast_context_add_include2(con, value=%s, registrar=%s);\n", value, registrar);
139 }
140
141 void ast_context_add_switch2(void *con, const char *value, const char *data, int eval, const char *registrar)
142 {
143         if(!no_comp)
144         printf("Executed ast_context_add_switch2(con, value=%s, data=%s, eval=%d, registrar=%s);\n", value, data, eval, registrar);
145 }
146
147 void ast_merge_contexts_and_delete(void)
148 {
149         if(!no_comp)
150         printf("Executed ast_merge_contexts_and_delete();\n");
151 }
152
153 void ast_context_verify_includes(void)
154 {
155         if(!no_comp)
156         printf("Executed ast_context_verify_includes();\n");
157 }
158
159 struct ast_context * ast_walk_contexts(void)
160 {
161         if(!no_comp)
162         printf("Executed ast_walk_contexts();\n");
163         return 0;
164 }
165
166 void ast_cli_unregister_multiple(void)
167 {
168         if(!no_comp)
169         printf("Executed ast_cli_unregister_multiple();\n");
170 }
171
172 void ast_context_destroy(void)
173 {
174         printf("Executed ast_context_destroy();\n");
175 }
176
177 void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...)
178 {
179         va_list vars;
180         va_start(vars,fmt);
181
182         printf("LOG: lev:%d file:%s  line:%d func: %s  ",
183                    level, file, line, function);
184         vprintf(fmt, vars);
185         fflush(stdout);
186         va_end(vars);
187 }
188
189 void ast_verbose(const char *fmt, ...)
190 {
191         va_list vars;
192         va_start(vars,fmt);
193
194         printf("VERBOSE: ");
195         vprintf(fmt, vars);
196         fflush(stdout);
197         va_end(vars);
198 }
199
200 char *ast_process_quotes_and_slashes(char *start, char find, char replace_with)
201 {
202         char *dataPut = start;
203         int inEscape = 0;
204         int inQuotes = 0;
205
206         for (; *start; start++) {
207                 if (inEscape) {
208                         *dataPut++ = *start;       /* Always goes verbatim */
209                         inEscape = 0;
210                 } else {
211                         if (*start == '\\') {
212                                 inEscape = 1;      /* Do not copy \ into the data */
213                         } else if (*start == '\'') {
214                                 inQuotes = 1-inQuotes;   /* Do not copy ' into the data */
215                         } else {
216                                 /* Replace , with |, unless in quotes */
217                                 *dataPut++ = inQuotes ? *start : ((*start==find) ? replace_with : *start);
218                         }
219                 }
220         }
221         if (start != dataPut)
222                 *dataPut = 0;
223         return dataPut;
224 }
225
226 extern struct module_symbols mod_data;
227
228
229 int main(int argc, char **argv)
230 {
231         int i;
232         
233         for(i=1;i<argc;i++)
234         {
235                 if( argv[i][0] == '-' && argv[i][1] == 'n' )
236                         no_comp =1;
237                 if( argv[i][0] == '-' && argv[i][1] == 'd' )
238                         use_curr_dir =1;
239         }
240         
241                 
242         if( !no_comp )
243                 printf("\n(You can use the -n option if you aren't interested in seeing all the instructions generated by the compiler)\n\n");
244         if( !use_curr_dir )
245                 printf("\n(You can use the -d option if you want to use the current working directory as the CONFIG_DIR. I will look in this dir for extensions.ael* and its included files)\n\n");
246         
247         if( use_curr_dir )
248         {
249                 strcpy(ast_config_AST_CONFIG_DIR, ".");
250         }
251         else
252         {
253                 strcpy(ast_config_AST_CONFIG_DIR, "/etc/asterisk");
254         }
255         strcpy(ast_config_AST_VAR_DIR, "/var/lib/asterisk");
256         
257         mod_data.load_module(0);
258         
259         ast_log(4, "ael2_parse", __LINE__, "main", "%d contexts, %d extensions, %d priorities\n", conts, extens, priors);
260         
261     return 0;
262 }