usbmodeswitch: Updated to v.1.2.6 from shibby's branch.
[tomato.git] / release / src / router / httpd / parser.c
blob9556fc99cc09153d8ec88c9038dba95f3b0589fa
1 /*
3 Tomato Firmware
4 Copyright (C) 2006-2009 Jonathan Zarate
6 */
8 #include "tomato.h"
11 //#define DEBUG 1
14 <% ident(arg, "arg", 'arg'); %>
16 Syntax checking is very relaxed and all arguments are considered a
17 string. Example, the following are the same:
19 <% ident(foo); %>
20 <% ident('foo'); %>
23 int parse_asp(const char *path)
25 char *buffer;
26 char *cp;
27 char *a, *b, *c;
28 char x;
29 int argc;
30 char *argv[32];
31 char *ident;
32 const aspapi_t *api;
34 if (f_read_alloc_string(path, &buffer, 128 * 1024) < 0) {
35 free(buffer);
36 if (!header_sent) send_error(500, NULL, "Read error");
37 return 0;
40 if (!header_sent) send_header(200, NULL, mime_html, 0);
42 // <% id(arg, arg); %>
43 cp = buffer;
44 while (*cp) {
45 if ((b = strstr(cp, "%>")) == NULL) {
46 web_puts(cp);
47 break;
49 *b = 0;
51 //xx <% <% %>
52 //xx %>
54 a = cp;
55 while ((c = strstr(a, "<%")) != NULL) {
56 a = c + 2;
59 if (a == cp) {
60 *b = '%';
61 b += 2;
62 web_write(cp, b - cp);
63 cp = b;
64 continue;
67 web_write(cp, (a - cp) - 2);
69 cp = b + 2;
71 while (*a == ' ') ++a;
72 ident = a;
73 while (((*a >= 'a') && (*a <= 'z')) || ((*a >= 'A') && (*a <= 'Z')) || ((*a >= '0') && (*a <= '9')) || (*a == '_')) {
74 ++a;
76 if (ident == a) {
77 #ifdef DEBUG
78 syslog(LOG_WARNING, "Identifier not found in %s @%u", path, a - buffer);
79 #endif
80 continue;
82 b = a;
83 while (*a == ' ') ++a;
84 if (*a++ != '(') {
85 #ifdef DEBUG
86 syslog(LOG_WARNING, "Expecting ( in %s @%u", path, a - buffer);
87 #endif
88 continue;
90 *b = 0;
92 // <% foo(123, "arg"); %>
93 // a -----^ ^--- null
95 // printf("\n[[['%s'\n", ident);
97 argc = 0;
98 while (*a) {
99 while (*a == ' ') ++a;
100 if (*a == ')') {
101 FINAL:
102 ++a;
103 while ((*a == ' ') || (*a == ';')) ++a;
104 if (*a != 0) break;
106 for (api = aspapi; api->name; ++api) {
107 if (strcmp(api->name, ident) == 0) {
108 api->exec(argc, argv);
109 break;
113 a = NULL;
115 int z;
116 for (z = 0; z < argc; ++z) {
117 printf(" %d '%s'\n", z, argv[z]);
120 break;
123 if (argc >= 32) {
124 #ifdef DEBUG
125 syslog(LOG_WARNING, "Error while parsing arguments in %s @%u", path, a - buffer);
126 #endif
127 break;
130 if ((*a == '"') || (*a == '\'')) {
131 x = *a;
132 argv[argc++] = a + 1;
133 while ((*++a != x) && (*a != 0)) {
134 if (*a == '\\') {
135 if (*++a == 0) break;
136 *(a - 1) = *a;
139 if (*a == 0) break;
140 *a++ = 0;
142 else {
143 argv[argc++] = a;
144 while ((*a != ',') && (*a != ')') && (*a != ' ') && (*a != 0)) ++a;
146 while (*a == ' ') ++a;
147 if (*a == ')') {
148 *a = 0;
149 goto FINAL;
151 if (*a != ',') break;
152 *a++ = 0;
155 #ifdef DEBUG
156 if (a != NULL) syslog(LOG_WARNING, "Error while parsing arguments in %s @%u", path, a - buffer);
157 #endif
159 // printf("argc=%d]]]\n", argc);
163 free(buffer);
164 return 1;
167 void wo_asp(char *path)
169 parse_asp(path);