Mercurial > repos > ktnyt > gembassy
comparison GEMBASSY-1.0.3/gsoap/src/soapcpp2_lex.l @ 2:8947fca5f715 draft default tip
Uploaded
author | ktnyt |
---|---|
date | Fri, 26 Jun 2015 05:21:44 -0400 |
parents | 84a17b3fad1f |
children |
comparison
equal
deleted
inserted
replaced
1:84a17b3fad1f | 2:8947fca5f715 |
---|---|
1 /* | |
2 soapcpp2_lex.l | |
3 | |
4 Flex/Lex tokenizer. | |
5 | |
6 -------------------------------------------------------------------------------- | |
7 gSOAP XML Web services tools | |
8 Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved. | |
9 This part of the software is released under ONE of the following licenses: | |
10 GPL or Genivia's license for commercial use. | |
11 -------------------------------------------------------------------------------- | |
12 GPL license. | |
13 | |
14 This program is free software; you can redistribute it and/or modify it under | |
15 the terms of the GNU General Public License as published by the Free Software | |
16 Foundation; either version 2 of the License, or (at your option) any later | |
17 version. | |
18 | |
19 This program is distributed in the hope that it will be useful, but WITHOUT ANY | |
20 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A | |
21 PARTICULAR PURPOSE. See the GNU General Public License for more details. | |
22 | |
23 You should have received a copy of the GNU General Public License along with | |
24 this program; if not, write to the Free Software Foundation, Inc., 59 Temple | |
25 Place, Suite 330, Boston, MA 02111-1307 USA | |
26 | |
27 Author contact information: | |
28 engelen@genivia.com / engelen@acm.org | |
29 | |
30 This program is released under the GPL with the additional exemption that | |
31 compiling, linking, and/or using OpenSSL is allowed. | |
32 -------------------------------------------------------------------------------- | |
33 A commercial use license is available from Genivia, Inc., contact@genivia.com | |
34 -------------------------------------------------------------------------------- | |
35 */ | |
36 | |
37 %{ | |
38 #include "soapcpp2.h" | |
39 | |
40 #ifdef HAVE_CONFIG_H | |
41 #include "soapcpp2_yacc.h" | |
42 #else | |
43 #include "soapcpp2_yacc.tab.h" | |
44 #endif | |
45 | |
46 #ifdef WITH_BISON | |
47 YYSTYPE yylval; | |
48 #undef YY_INPUT | |
49 #define YY_INPUT(buf, result, max_size) \ | |
50 { \ | |
51 int c = getc(yyin); \ | |
52 result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \ | |
53 } | |
54 #endif | |
55 | |
56 #ifndef WITH_LEX | |
57 #define MAX_IMPORT_DEPTH 16 | |
58 static struct importlist { struct importlist *next; char name[1]; } *importlist = NULL; | |
59 static char fnstk[MAX_IMPORT_DEPTH][1024]; | |
60 static int lnstk[MAX_IMPORT_DEPTH]; | |
61 static char *imstk[MAX_IMPORT_DEPTH]; | |
62 static YY_BUFFER_STATE instk[MAX_IMPORT_DEPTH]; | |
63 #endif | |
64 int imports = 0; | |
65 char *imported = NULL; | |
66 static void check_id(const char*); | |
67 static Token install_id(void); | |
68 static Token install_tag(void); | |
69 static Token install_int(void); | |
70 static Token install_hex(void); | |
71 static Token install_num(void); | |
72 static Token install_chr(void); | |
73 static Token install_str(void); | |
74 static Token install_pragma(void); | |
75 static void directive(void), option(void); | |
76 static Token error_chr(void); | |
77 static Token error_str(void); | |
78 static int convchar(int*); | |
79 static int hexchar(int*); | |
80 static int octchar(int*); | |
81 static void module(const char *name, const char *fullname); | |
82 static void import(const char *file); | |
83 static int magic(const char *name); | |
84 %} | |
85 ws [ \t\v\r\f\n\x1A\xA0] | |
86 digit [0-9] | |
87 alpha [a-zA-Z_] | |
88 id ({alpha}|:{alpha})({alpha}|{digit}|::|:{alpha})* | |
89 tag `[^`\t\v\r\f\n>]+` | |
90 int {digit}+ | |
91 hex 0[xX][0-9a-fA-F]+ | |
92 num {int}(\.{int}([Ee][+-]?{int})?|(\.{int})?[Ee][+-]?{int}) | |
93 chr '(\\'|[^'\n])*' | |
94 str L?\"(\\\"|\\\n|[^"])*\" | |
95 module #module{ws}+.*\n | |
96 import #import{ws}+.*\n | |
97 %x MLCOMMENT | |
98 %% | |
99 {ws} { /* skip white space */ } | |
100 "/*" { BEGIN(MLCOMMENT); } | |
101 <MLCOMMENT>.|\n { } | |
102 <MLCOMMENT>"*/" { BEGIN(INITIAL); } | |
103 <MLCOMMENT><<EOF>> { execerror("Unclosed multiline comment at the end of file"); } | |
104 "//"\/*"gsoapopt".*\n { option(); } | |
105 "//"\/*"gsoap".*\n { directive(); } | |
106 "//".*\n { /* skip single line comment */ } | |
107 "+=" { return PA; } | |
108 "-=" { return NA; } | |
109 "*=" { return TA; } | |
110 "/=" { return DA; } | |
111 "%=" { return MA; } | |
112 "&=" { return AA; } | |
113 "^=" { return XA; } | |
114 "|=" { return OA; } | |
115 "<<=" { return LA; } | |
116 ">>=" { return RA; } | |
117 "||" { return OR; } | |
118 "&&" { return AN; } | |
119 "==" { return EQ; } | |
120 "!=" { return NE; } | |
121 "<=" { return LE; } | |
122 ">=" { return GE; } | |
123 "<<" { return LS; } | |
124 ">>" { return RS; } | |
125 "++" { return PP; } | |
126 "--" { return NN; } | |
127 "->" { return AR; } | |
128 [;,:=|^&<>+\-*/%!?~(){}\[\].@$] { return yytext[0]; } | |
129 {id} { return install_id(); } | |
130 {tag} { return install_tag(); } | |
131 {int} { return install_int(); } | |
132 {hex} { return install_hex(); } | |
133 {num} { return install_num(); } | |
134 {chr} { return install_chr(); } | |
135 {str} { return install_str(); } | |
136 {module} { char *s, *t, buf[1024]; | |
137 s = strchr(yytext, '"'); | |
138 if (!s) | |
139 t = yytext+7; | |
140 else | |
141 { strcpy(buf, s+1); | |
142 s = strchr(buf, '"'); | |
143 *s = '\0'; | |
144 t = strchr(s+1, '"'); | |
145 if (t) | |
146 { t++; | |
147 s = strchr(t+1, '"'); | |
148 if (s) | |
149 *s = '\0'; | |
150 } | |
151 } | |
152 module(buf, t); | |
153 } | |
154 {import} { char *s, buf[1024]; | |
155 s = strchr(yytext, '"'); | |
156 if (s) | |
157 { strcpy(buf, s+1); | |
158 s = strchr(buf, '"'); | |
159 *s = '\0'; | |
160 import(buf); | |
161 } | |
162 else | |
163 lexerror("Invalid import directive"); | |
164 } | |
165 #.*\n { return install_pragma(); } | |
166 '[^'\n]*/\n { return error_chr(); } | |
167 \"[^"\n]*/\n { return error_str(); } | |
168 . { lexerror("Skipping unknown symbol"); } | |
169 <<EOF>> { /* when Lex complains: remove this line and below */ | |
170 #ifndef WITH_LEX | |
171 if (--imports < 0) | |
172 yyterminate(); | |
173 else | |
174 { yy_delete_buffer(YY_CURRENT_BUFFER); | |
175 yy_switch_to_buffer(instk[imports]); | |
176 strcpy(filename, fnstk[imports]); | |
177 yylineno = lnstk[imports]; | |
178 imported = imstk[imports]; | |
179 } | |
180 #endif | |
181 } | |
182 %% | |
183 | |
184 /* | |
185 install_id - lookup identifier in symbol table. If found, return token | |
186 and symbol table entry. If not found, create entry in symbol table and | |
187 return ID token. | |
188 */ | |
189 static Token | |
190 install_id() | |
191 { Symbol *p = lookup(yytext); | |
192 if (!p) | |
193 { int i, flag = 0; | |
194 p = install(yytext, ID); | |
195 /* [_](x|X)(m|M)(l|L)__ is OK */ | |
196 /* [_](x|X)(m|M)(l|L).* is not OK */ | |
197 /* .*__(x|X)(m|M)(l|L) is not OK */ | |
198 /* .*::(x|X)(m|M)(l|L) is not OK */ | |
199 for (i = 0; i < yyleng; i++) | |
200 { if ((yytext[i] == '_' && yytext[i+1] == '_') | |
201 || (yytext[i] == ':' && yytext[i+1] == ':')) | |
202 { flag = 1; | |
203 check_id(yytext + i + 2); | |
204 } | |
205 } | |
206 if (!flag && strcmp(yytext, "XML")) | |
207 check_id(yytext); | |
208 } | |
209 yylval.sym = p; | |
210 return p->token; | |
211 } | |
212 | |
213 /* | |
214 install_tag - | |
215 return TAG token. | |
216 */ | |
217 static Token | |
218 install_tag() | |
219 { yylval.s = emalloc(yyleng-1); /* yyleng = length(yytext) */ | |
220 strcpy(yylval.s, yytext+1); | |
221 yylval.s[yyleng-2] = '\0'; | |
222 return TAG; | |
223 } | |
224 | |
225 /* | |
226 check_id - check for (x|X)(m|M)(l|L) | |
227 */ | |
228 static void | |
229 check_id(const char *s) | |
230 { while (*s == '_') | |
231 s++; | |
232 if ((s[0] == 'x' || s[0] == 'X') | |
233 && (s[1] == 'm' || s[1] == 'M') | |
234 && (s[2] == 'l' || s[2] == 'L')) | |
235 { sprintf(errbuf, "identifier '%s' starts with or embeds '%3.3s' character sequence exclusively reserved for the XML standard (for enum constants: please ignore this warning)", yytext, s); | |
236 semwarn(errbuf); | |
237 } | |
238 } | |
239 | |
240 /* | |
241 install_int - convert digits to integer and return LNG token. | |
242 */ | |
243 static Token | |
244 install_int(void) | |
245 { | |
246 sscanf(yytext, SOAP_ULONG_FORMAT, &yylval.i); | |
247 return LNG; | |
248 } | |
249 | |
250 /* | |
251 install_hex - convert hexadecimal digits to integer and return LNG | |
252 */ | |
253 static Token | |
254 install_hex(void) | |
255 { | |
256 sscanf(yytext, SOAP_XLONG_FORMAT, &yylval.i); | |
257 return LNG; | |
258 } | |
259 | |
260 /* | |
261 install_num - convert digits to floating point number and return DBL | |
262 */ | |
263 static Token | |
264 install_num(void) | |
265 { sscanf(yytext, "%lf", &yylval.r); | |
266 return DBL; | |
267 } | |
268 | |
269 /* | |
270 install_chr - convert character constant and return CHR. | |
271 */ | |
272 static Token | |
273 install_chr(void) | |
274 { int i = 2; | |
275 if (yytext[1] == '\\') | |
276 yylval.c = convchar(&i); | |
277 else yylval.c = yytext[i-1]; | |
278 if (yytext[i] != '\'') | |
279 lexerror("Illegal character constant"); | |
280 return CHR; | |
281 } | |
282 | |
283 /* | |
284 install_str - convert and store string in memory. Return STR. | |
285 */ | |
286 static Token | |
287 install_str(void) | |
288 { int i, j = 0; | |
289 yylval.s = emalloc(yyleng-1); /* yyleng = length(yytext) */ | |
290 for (i = 1 + (yytext[0] == 'L'); i < yyleng-1; i++) | |
291 if (yytext[i] == '\\') | |
292 { if (yytext[++i] != '\n') | |
293 { yylval.s[j++] = convchar(&i); | |
294 i--; | |
295 } | |
296 } | |
297 else | |
298 yylval.s[j++] = yytext[i]; | |
299 yylval.s[j] = '\0'; | |
300 return STR; | |
301 } | |
302 | |
303 /* | |
304 install_pragma - store pragma in string. Return PRAGMA. | |
305 */ | |
306 static Token | |
307 install_pragma(void) | |
308 { yylval.s = emalloc(yyleng); /* yyleng = length(yytext) */ | |
309 strncpy(yylval.s, yytext, strlen(yytext)-1); | |
310 yylval.s[strlen(yytext)-1] = '\0'; | |
311 return PRAGMA; | |
312 } | |
313 | |
314 static void directive(void) | |
315 { int i, j, k; | |
316 char *s; | |
317 Service *sp; | |
318 Method *m; | |
319 Data *d; | |
320 int service; | |
321 for (i = 7; yytext[i]; i++) | |
322 if (yytext[i] > 32) | |
323 break; | |
324 for (j = i; yytext[j]; j++) | |
325 if (yytext[j] <= 32) | |
326 break; | |
327 if (i == j) | |
328 return; | |
329 s = (char*)emalloc(j-i+1); | |
330 for (k = 0; k < j-i; k++) | |
331 { s[k] = yytext[k+i]; | |
332 if (s[k] == '_') | |
333 s[k] = '-'; | |
334 } | |
335 s[k] = '\0'; | |
336 for (sp = services; sp; sp = sp->next) | |
337 if (!strcmp(sp->ns, s)) | |
338 break; | |
339 if (!sp) | |
340 { sp = (Service*)emalloc(sizeof(Service)); | |
341 sp->next = services; | |
342 sp->ns = s; | |
343 sp->name = NULL; | |
344 sp->porttype = NULL; | |
345 sp->portname = NULL; | |
346 sp->binding = NULL; | |
347 sp->definitions = NULL; | |
348 sp->transport = NULL; | |
349 sp->URL = NULL; | |
350 sp->URI = NULL; | |
351 sp->URI2 = NULL; | |
352 sp->WSDL = NULL; | |
353 sp->style = NULL; | |
354 sp->encoding = NULL; | |
355 sp->protocol = NULL; | |
356 sp->xsi_type = 0; | |
357 sp->elementForm = NULL; | |
358 sp->attributeForm = NULL; | |
359 sp->executable = NULL; | |
360 sp->import = NULL; | |
361 sp->documentation = NULL; | |
362 sp->list = NULL; | |
363 sp->data = NULL; | |
364 services = sp; | |
365 } | |
366 for (i = j; yytext[i]; i++) | |
367 if (yytext[i] > 32) | |
368 break; | |
369 if (!strncmp(yytext+i, "service", 7) || !strncmp(yytext+i, "schema", 6)) | |
370 { service = strncmp(yytext+i, "schema", 6); | |
371 for (i += 7; yytext[i]; i++) | |
372 if (yytext[i] > 32) | |
373 break; | |
374 for (j = i; yytext[j]; j++) | |
375 if (yytext[j] <= 32) | |
376 break; | |
377 for (; yytext[j]; j++) | |
378 if (yytext[j] > 32) | |
379 break; | |
380 for (k = j; yytext[k]; k++) | |
381 if (yytext[k] <= 32) | |
382 break; | |
383 /* | |
384 if (j == k) | |
385 return; | |
386 */ | |
387 s = (char*)emalloc(k-j+1); | |
388 strncpy(s, yytext+j, k-j); | |
389 s[k-j] = '\0'; | |
390 if (!strncmp(yytext+i, "name:", 5)) | |
391 { sp->name = s; | |
392 for (j = k; yytext[j]; j++) | |
393 if (yytext[j] > 32) | |
394 break; | |
395 for (k = j; yytext[k]; k++) | |
396 if (yytext[k] == 10 || yytext[k] == 13) | |
397 break; | |
398 if (j == k) | |
399 return; | |
400 s = (char*)emalloc(k-j+1); | |
401 strncpy(s, yytext+j, k-j); | |
402 s[k-j] = '\0'; | |
403 sp->documentation = s; | |
404 } | |
405 else if (!strncmp(yytext+i, "type:", 5) || !strncmp(yytext+i, "portType:", 9) || !strncmp(yytext+i, "interface:", 10)) | |
406 sp->porttype = s; | |
407 else if (!strncmp(yytext+i, "portName:", 9)) | |
408 sp->portname = s; | |
409 else if (!strncmp(yytext+i, "binding:", 8)) | |
410 sp->binding = s; | |
411 else if (!strncmp(yytext+i, "definitions:", 12)) | |
412 sp->definitions = s; | |
413 else if (!strncmp(yytext+i, "documentation:", 14)) | |
414 { for (k = j; yytext[k]; k++) | |
415 if (yytext[k] == 10 || yytext[k] == 13) | |
416 break; | |
417 if (j == k) | |
418 return; | |
419 s = (char*)emalloc(k-j+1); | |
420 strncpy(s, yytext+j, k-j); | |
421 s[k-j] = '\0'; | |
422 sp->documentation = s; | |
423 } | |
424 else if (!strncmp(yytext+i, "transport:", 10)) | |
425 sp->transport = s; | |
426 else if (!strncmp(yytext+i, "location:", 9) || !strncmp(yytext+i, "endpoint:", 9) || !strncmp(yytext+i, "port:", 5)) | |
427 { if (sp->URL) | |
428 { char *t = (char*)emalloc(strlen(sp->URL) + strlen(s) + 2); | |
429 strcpy(t, sp->URL); | |
430 strcat(t, " "); | |
431 strcat(t, s); | |
432 sp->URL = t; | |
433 } | |
434 else | |
435 sp->URL = s; | |
436 if (!service && !sp->import) | |
437 sp->import = s; | |
438 } | |
439 else if (!strncmp(yytext+i, "executable:", 11)) | |
440 sp->executable = s; | |
441 else if (!strncmp(yytext+i, "namespace:", 10)) | |
442 { if (service) | |
443 { if (!sp->URI) | |
444 sp->URI = s; | |
445 sp->WSDL = s; | |
446 } | |
447 else if (!strcmp(sp->ns, "SOAP-ENV")) | |
448 { if (vflag > 0) | |
449 semwarn("option -1 or -2 overrides SOAP-ENV namespace"); | |
450 else | |
451 envURI = s; | |
452 sp->URI = envURI; | |
453 } | |
454 else if (!strcmp(sp->ns, "SOAP-ENC")) | |
455 { if (vflag > 0) | |
456 semwarn("option -1 or -2 overrides SOAP-ENC namespace"); | |
457 else | |
458 encURI = s; | |
459 sp->URI = encURI; | |
460 } | |
461 else | |
462 sp->URI = s; | |
463 } | |
464 else if (!strncmp(yytext+i, "namespace2:", 11)) | |
465 { sp->URI2 = s; | |
466 } | |
467 else if (!strncmp(yytext+i, "typed:", 6)) | |
468 { sp->xsi_type = (*s == 'y'); | |
469 } | |
470 else if (!strncmp(yytext+i, "form:", 5)) | |
471 { sp->elementForm = s; | |
472 sp->attributeForm = s; | |
473 } | |
474 else if (!strncmp(yytext+i, "elementForm:", 12)) | |
475 sp->elementForm = s; | |
476 else if (!strncmp(yytext+i, "attributeForm:", 14)) | |
477 sp->attributeForm = s; | |
478 else if (!strncmp(yytext+i, "import:", 7)) | |
479 { if (!sp->URI) | |
480 sp->URI = s; | |
481 sp->import = s; | |
482 } | |
483 else if (!strncmp(yytext+i, "encoding:", 9)) | |
484 { if (!strcmp(s, "encoded")) | |
485 sp->encoding = ""; | |
486 else | |
487 sp->encoding = s; | |
488 } | |
489 else if (!strncmp(yytext+i, "style:", 6)) | |
490 sp->style = s; | |
491 else if (!strncmp(yytext+i, "protocol:", 9)) | |
492 sp->protocol = s; | |
493 else if (!strncmp(yytext+i, "method-protocol:", 16)) | |
494 { m = (Method*)emalloc(sizeof(Method)); | |
495 m->name = s; | |
496 m->mess = PROTOCOL; | |
497 m->part = NULL; | |
498 m->next = sp->list; | |
499 sp->list = m; | |
500 for (j = k; yytext[j]; j++) | |
501 if (yytext[j] > 32) | |
502 break; | |
503 for (k = j; yytext[k]; k++) | |
504 if (yytext[k] == 10 || yytext[k] == 13) | |
505 break; | |
506 if (j == k) | |
507 return; | |
508 s = (char*)emalloc(k-j+1); | |
509 strncpy(s, yytext+j, k-j); | |
510 s[k-j] = '\0'; | |
511 m->part = s; | |
512 } | |
513 else if (!strncmp(yytext+i, "method-style:", 13)) | |
514 { m = (Method*)emalloc(sizeof(Method)); | |
515 m->name = s; | |
516 m->mess = STYLE; | |
517 m->part = NULL; | |
518 m->next = sp->list; | |
519 sp->list = m; | |
520 for (j = k; yytext[j]; j++) | |
521 if (yytext[j] > 32) | |
522 break; | |
523 for (k = j; yytext[k]; k++) | |
524 if (yytext[k] == 10 || yytext[k] == 13) | |
525 break; | |
526 if (j == k) | |
527 return; | |
528 s = (char*)emalloc(k-j+1); | |
529 strncpy(s, yytext+j, k-j); | |
530 s[k-j] = '\0'; | |
531 m->part = s; | |
532 } | |
533 else if (!strncmp(yytext+i, "method-encoding:", 16)) | |
534 { m = (Method*)emalloc(sizeof(Method)); | |
535 m->name = s; | |
536 m->mess = ENCODING; | |
537 m->part = NULL; | |
538 m->next = sp->list; | |
539 sp->list = m; | |
540 for (j = k; yytext[j]; j++) | |
541 if (yytext[j] > 32) | |
542 break; | |
543 for (k = j; yytext[k]; k++) | |
544 if (yytext[k] == 10 || yytext[k] == 13) | |
545 break; | |
546 if (j == k) | |
547 return; | |
548 s = (char*)emalloc(k-j+1); | |
549 strncpy(s, yytext+j, k-j); | |
550 s[k-j] = '\0'; | |
551 if (strcmp(s, "encoded")) | |
552 m->part = s; | |
553 else | |
554 m->part = ""; | |
555 } | |
556 else if (!strncmp(yytext+i, "method-response-encoding:", 25)) | |
557 { m = (Method*)emalloc(sizeof(Method)); | |
558 m->name = s; | |
559 m->mess = RESPONSE_ENCODING; | |
560 m->part = NULL; | |
561 m->next = sp->list; | |
562 sp->list = m; | |
563 for (j = k; yytext[j]; j++) | |
564 if (yytext[j] > 32) | |
565 break; | |
566 for (k = j; yytext[k]; k++) | |
567 if (yytext[k] == 10 || yytext[k] == 13) | |
568 break; | |
569 if (j == k) | |
570 return; | |
571 s = (char*)emalloc(k-j+1); | |
572 strncpy(s, yytext+j, k-j); | |
573 s[k-j] = '\0'; | |
574 if (strcmp(s, "encoded")) | |
575 m->part = s; | |
576 else | |
577 m->part = ""; | |
578 } | |
579 else if (!strncmp(yytext+i, "method-documentation:", 21)) | |
580 { m = (Method*)emalloc(sizeof(Method)); | |
581 m->name = s; | |
582 m->mess = COMMENT; | |
583 m->part = NULL; | |
584 m->next = sp->list; | |
585 sp->list = m; | |
586 for (j = k; yytext[j]; j++) | |
587 if (yytext[j] > 32) | |
588 break; | |
589 for (k = j; yytext[k]; k++) | |
590 if (yytext[k] == 10 || yytext[k] == 13) | |
591 break; | |
592 if (j == k) | |
593 return; | |
594 s = (char*)emalloc(k-j+1); | |
595 strncpy(s, yytext+j, k-j); | |
596 s[k-j] = '\0'; | |
597 m->part = s; | |
598 } | |
599 else if (!strncmp(yytext+i, "method-action:", 14)) | |
600 { m = (Method*)emalloc(sizeof(Method)); | |
601 m->name = s; | |
602 m->mess = ACTION; | |
603 m->part = NULL; | |
604 m->next = sp->list; | |
605 sp->list = m; | |
606 for (j = k; yytext[j]; j++) | |
607 if (yytext[j] > 32) | |
608 break; | |
609 for (k = j; yytext[k]; k++) | |
610 if (yytext[k] == 10 || yytext[k] == 13) | |
611 break; | |
612 if (j == k) | |
613 return; | |
614 s = (char*)emalloc(k-j+1); | |
615 strncpy(s, yytext+j, k-j); | |
616 s[k-j] = '\0'; | |
617 m->part = s; | |
618 } | |
619 else if (!strncmp(yytext+i, "method-input-action:", 20)) | |
620 { m = (Method*)emalloc(sizeof(Method)); | |
621 m->name = s; | |
622 m->mess = REQUEST_ACTION; | |
623 m->part = NULL; | |
624 m->next = sp->list; | |
625 sp->list = m; | |
626 for (j = k; yytext[j]; j++) | |
627 if (yytext[j] > 32) | |
628 break; | |
629 for (k = j; yytext[k]; k++) | |
630 if (yytext[k] == 10 || yytext[k] == 13) | |
631 break; | |
632 if (j == k) | |
633 return; | |
634 s = (char*)emalloc(k-j+1); | |
635 strncpy(s, yytext+j, k-j); | |
636 s[k-j] = '\0'; | |
637 m->part = s; | |
638 } | |
639 else if (!strncmp(yytext+i, "method-output-action:", 21)) | |
640 { m = (Method*)emalloc(sizeof(Method)); | |
641 m->name = s; | |
642 m->mess = RESPONSE_ACTION; | |
643 m->part = NULL; | |
644 m->next = sp->list; | |
645 sp->list = m; | |
646 for (j = k; yytext[j]; j++) | |
647 if (yytext[j] > 32) | |
648 break; | |
649 for (k = j; yytext[k]; k++) | |
650 if (yytext[k] == 10 || yytext[k] == 13) | |
651 break; | |
652 if (j == k) | |
653 return; | |
654 s = (char*)emalloc(k-j+1); | |
655 strncpy(s, yytext+j, k-j); | |
656 s[k-j] = '\0'; | |
657 m->part = s; | |
658 } | |
659 else if (!strncmp(yytext+i, "method-fault-action:", 20)) | |
660 { m = (Method*)emalloc(sizeof(Method)); | |
661 m->name = s; | |
662 m->mess = FAULT_ACTION; | |
663 m->part = NULL; | |
664 m->next = sp->list; | |
665 sp->list = m; | |
666 for (j = k; yytext[j]; j++) | |
667 if (yytext[j] > 32) | |
668 break; | |
669 for (k = j; yytext[k]; k++) | |
670 if (yytext[k] == 10 || yytext[k] == 13) | |
671 break; | |
672 if (j == k) | |
673 return; | |
674 s = (char*)emalloc(k-j+1); | |
675 strncpy(s, yytext+j, k-j); | |
676 s[k-j] = '\0'; | |
677 m->part = s; | |
678 } | |
679 else if (!strncmp(yytext+i, "method-mime-type:", 17)) | |
680 { m = (Method*)emalloc(sizeof(Method)); | |
681 m->name = s; | |
682 m->mess = MIMEIN | MIMEOUT; | |
683 m->part = NULL; | |
684 m->next = sp->list; | |
685 sp->list = m; | |
686 for (j = k; yytext[j]; j++) | |
687 if (yytext[j] > 32) | |
688 break; | |
689 for (k = j; yytext[k]; k++) | |
690 if (yytext[k] <= 32) | |
691 break; | |
692 if (j == k) | |
693 return; | |
694 s = (char*)emalloc(k-j+1); | |
695 strncpy(s, yytext+j, k-j); | |
696 s[k-j] = '\0'; | |
697 m->part = s; | |
698 } | |
699 else if (!strncmp(yytext+i, "method-input-mime-type:", 23)) | |
700 { m = (Method*)emalloc(sizeof(Method)); | |
701 m->name = s; | |
702 m->mess = MIMEIN; | |
703 m->part = NULL; | |
704 m->next = sp->list; | |
705 sp->list = m; | |
706 for (j = k; yytext[j]; j++) | |
707 if (yytext[j] > 32) | |
708 break; | |
709 for (k = j; yytext[k]; k++) | |
710 if (yytext[k] <= 32) | |
711 break; | |
712 if (j == k) | |
713 return; | |
714 s = (char*)emalloc(k-j+1); | |
715 strncpy(s, yytext+j, k-j); | |
716 s[k-j] = '\0'; | |
717 m->part = s; | |
718 } | |
719 else if (!strncmp(yytext+i, "method-output-mime-type:", 24)) | |
720 { m = (Method*)emalloc(sizeof(Method)); | |
721 m->name = s; | |
722 m->mess = MIMEOUT; | |
723 m->part = NULL; | |
724 m->next = sp->list; | |
725 sp->list = m; | |
726 for (j = k; yytext[j]; j++) | |
727 if (yytext[j] > 32) | |
728 break; | |
729 for (k = j; yytext[k]; k++) | |
730 if (yytext[k] <= 32) | |
731 break; | |
732 if (j == k) | |
733 return; | |
734 s = (char*)emalloc(k-j+1); | |
735 strncpy(s, yytext+j, k-j); | |
736 s[k-j] = '\0'; | |
737 m->part = s; | |
738 } | |
739 else if (!strncmp(yytext+i, "method-header-part:", 19)) | |
740 { m = (Method*)emalloc(sizeof(Method)); | |
741 m->name = s; | |
742 m->mess = HDRIN | HDROUT; | |
743 m->part = NULL; | |
744 m->next = sp->list; | |
745 sp->list = m; | |
746 for (j = k; yytext[j]; j++) | |
747 if (yytext[j] > 32) | |
748 break; | |
749 for (k = j; yytext[k]; k++) | |
750 if (yytext[k] <= 32) | |
751 break; | |
752 if (j == k) | |
753 return; | |
754 s = (char*)emalloc(k-j+1); | |
755 strncpy(s, yytext+j, k-j); | |
756 s[k-j] = '\0'; | |
757 m->part = s; | |
758 } | |
759 else if (!strncmp(yytext+i, "method-input-header-part:", 25)) | |
760 { m = (Method*)emalloc(sizeof(Method)); | |
761 m->name = s; | |
762 m->mess = HDRIN; | |
763 m->part = NULL; | |
764 m->next = sp->list; | |
765 sp->list = m; | |
766 for (j = k; yytext[j]; j++) | |
767 if (yytext[j] > 32) | |
768 break; | |
769 for (k = j; yytext[k]; k++) | |
770 if (yytext[k] <= 32) | |
771 break; | |
772 if (j == k) | |
773 return; | |
774 s = (char*)emalloc(k-j+1); | |
775 strncpy(s, yytext+j, k-j); | |
776 s[k-j] = '\0'; | |
777 m->part = s; | |
778 } | |
779 else if (!strncmp(yytext+i, "method-output-header-part:", 26)) | |
780 { m = (Method*)emalloc(sizeof(Method)); | |
781 m->name = s; | |
782 m->mess = HDROUT; | |
783 m->part = NULL; | |
784 m->next = sp->list; | |
785 sp->list = m; | |
786 for (j = k; yytext[j]; j++) | |
787 if (yytext[j] > 32) | |
788 break; | |
789 for (k = j; yytext[k]; k++) | |
790 if (yytext[k] <= 32) | |
791 break; | |
792 if (j == k) | |
793 return; | |
794 s = (char*)emalloc(k-j+1); | |
795 strncpy(s, yytext+j, k-j); | |
796 s[k-j] = '\0'; | |
797 m->part = s; | |
798 } | |
799 else if (!strncmp(yytext+i, "method-fault:", 13)) | |
800 { m = (Method*)emalloc(sizeof(Method)); | |
801 m->name = s; | |
802 m->mess = FAULT; | |
803 m->part = NULL; | |
804 m->next = sp->list; | |
805 sp->list = m; | |
806 for (j = k; yytext[j]; j++) | |
807 if (yytext[j] > 32) | |
808 break; | |
809 for (k = j; yytext[k]; k++) | |
810 if (yytext[k] <= 32) | |
811 break; | |
812 if (j == k) | |
813 return; | |
814 s = (char*)emalloc(k-j+1); | |
815 strncpy(s, yytext+j, k-j); | |
816 s[k-j] = '\0'; | |
817 m->part = s; | |
818 } | |
819 else if (!strncmp(yytext+i, "type-documentation:", 19)) | |
820 { d = (Data*)emalloc(sizeof(Data)); | |
821 d->name = s; | |
822 d->text = NULL; | |
823 d->next = sp->data; | |
824 sp->data = d; | |
825 for (j = k; yytext[j]; j++) | |
826 if (yytext[j] > 32) | |
827 break; | |
828 for (k = j; yytext[k]; k++) | |
829 if (yytext[k] == 10 || yytext[k] == 13) | |
830 break; | |
831 if (j == k) | |
832 return; | |
833 s = (char*)emalloc(k-j+1); | |
834 strncpy(s, yytext+j, k-j); | |
835 s[k-j] = '\0'; | |
836 d->text = s; | |
837 } | |
838 else | |
839 { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext+i); | |
840 semwarn(errbuf); | |
841 } | |
842 } | |
843 else | |
844 { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext); | |
845 semwarn(errbuf); | |
846 } | |
847 } | |
848 | |
849 static void option(void) | |
850 { int i; | |
851 if (imports) | |
852 { sprintf(errbuf, "options directive: %s ignored in imported file(s)", yytext); | |
853 semwarn(errbuf); | |
854 return; | |
855 } | |
856 for (i = 10; yytext[i]; i++) | |
857 if (yytext[i] > 32) | |
858 break; | |
859 for (; yytext[i]; i++) | |
860 switch (yytext[i]) | |
861 { case 'a': | |
862 aflag = 1; | |
863 break; | |
864 case 'c': | |
865 cflag = 1; | |
866 break; | |
867 case 'e': | |
868 eflag = 1; | |
869 break; | |
870 case 'n': | |
871 nflag = 1; | |
872 break; | |
873 case 'l': | |
874 lflag = 1; | |
875 break; | |
876 case 't': | |
877 tflag = 1; | |
878 break; | |
879 case 'w': | |
880 wflag = 1; | |
881 break; | |
882 default: | |
883 if (yytext[i] <= 32) | |
884 return; | |
885 } | |
886 } | |
887 | |
888 /* | |
889 error_chr - lexical error in character constant. Return character 0 to | |
890 allow parsing to continue | |
891 */ | |
892 static Token | |
893 error_chr(void) | |
894 { lexerror("Ending-' missing in character constant"); | |
895 yylval.c = '\0'; | |
896 return CHR; | |
897 } | |
898 | |
899 /* | |
900 error_str - lexical error in string. Return empty string to allow | |
901 parsing to continue | |
902 */ | |
903 static Token | |
904 error_str(void) | |
905 { lexerror("Ending-\" missing in string"); | |
906 yylval.s = ""; | |
907 return STR; | |
908 } | |
909 | |
910 /* | |
911 Character conversion functions | |
912 */ | |
913 static int | |
914 convchar(int *p) | |
915 { switch (yytext[(*p)++]) | |
916 { case 'a': return '\a'; | |
917 case 'b': return '\b'; | |
918 case 'f': return '\f'; | |
919 case 'n': return '\n'; | |
920 case 'r': return '\r'; | |
921 case 't': return '\t'; | |
922 case 'v': return '\v'; | |
923 case 'x': return hexchar(p); | |
924 case '0': | |
925 case '1': | |
926 case '2': | |
927 case '3': | |
928 case '4': | |
929 case '5': | |
930 case '6': | |
931 case '7': (*p)--; | |
932 return octchar(p); | |
933 default: return yytext[*p-1]; | |
934 } | |
935 } | |
936 | |
937 static int | |
938 hexchar(int *p) | |
939 { int i, d, c = 0; | |
940 for (i = 0; isxdigit(d = yytext[*p]) && i < 2; i++) | |
941 { c = (c << 4) + (d <= '9' ? d - '0' : toupper(d) - '7'); | |
942 (*p)++; | |
943 } | |
944 return c; | |
945 } | |
946 | |
947 static int | |
948 octchar(int *p) | |
949 { int i, d, c = 0; | |
950 for (i = 0; (d = yytext[*p]) >= '0' && d <= '7' && i < 3; i++) | |
951 { c = (c << 3) + d - '0'; | |
952 (*p)++; | |
953 } | |
954 return c; | |
955 } | |
956 | |
957 static void module(const char *name, const char *fullname) | |
958 { if (!fullname) | |
959 fullname = name; | |
960 if (imports) | |
961 { Pragma **pp; | |
962 char *s = emalloc(strlen(fullname)+15); | |
963 sprintf(s, "#include \"%sH.h\"", fullname); | |
964 for (pp = &pragmas; *pp; pp = &(*pp)->next) | |
965 if (!strcmp((*pp)->pragma, s)) | |
966 break; | |
967 if (!*pp) | |
968 { *pp = (Pragma*)emalloc(sizeof(Pragma)); | |
969 (*pp)->pragma = s; | |
970 (*pp)->next = NULL; | |
971 } | |
972 imported = (char*)emalloc(strlen(fullname)+1); | |
973 strcpy(imported, fullname); | |
974 fprintf(stderr, "Importing module '%s'\n\n", fullname); | |
975 } | |
976 else | |
977 { lflag = 1; | |
978 typeNO = magic(name); | |
979 prefix = (char*)emalloc(strlen(fullname)+1); | |
980 strcpy(prefix, fullname); | |
981 fprintf(stderr, "Compiling module '%s' (magic number = %d)\n\n", fullname, typeNO); | |
982 } | |
983 } | |
984 | |
985 static int magic(const char *name) | |
986 { size_t i; | |
987 int n; | |
988 if (strlen(name) > 4) | |
989 semerror("#module name length must not exceed four characters"); | |
990 n = 0; | |
991 for (i = 0; i < strlen(name); i++) | |
992 if (name[i] >= 'a' && name[i] <= 'z') | |
993 n = 26*n + name[i] - 'a'; | |
994 else if (name[i] >= 'A' && name[i] <= 'Z') | |
995 n = 26*n + name[i] - 'A'; | |
996 else | |
997 semerror("#module name must be alphabetic and the length must not exceed four characters.\nUse '#module name longname' for longer names."); | |
998 return 4699*n + 153424; | |
999 } | |
1000 | |
1001 #ifdef WITH_LEX | |
1002 static void import(const char *file) | |
1003 { execerror("Cannot #import: soapcpp2 not compiled with flex (replace lex with flex)"); | |
1004 } | |
1005 #else | |
1006 static void import(const char *file) | |
1007 { char buf[1024]; | |
1008 struct importlist *p; | |
1009 for (p = importlist; p; p = p->next) | |
1010 if (!strcmp(p->name, file)) | |
1011 return; | |
1012 if (imports >= MAX_IMPORT_DEPTH) | |
1013 execerror("Imports nested too deep"); | |
1014 instk[imports] = YY_CURRENT_BUFFER; | |
1015 strcpy(fnstk[imports], filename); | |
1016 lnstk[imports] = yylineno; | |
1017 imstk[imports] = imported; | |
1018 yylineno = 1; | |
1019 /* imported = NULL; this is useful to change the semantics of #import to NOT consider non-module imports to be part of the current module */ | |
1020 imports++; | |
1021 if (!(yyin = fopen(file, "r"))) | |
1022 { if (importpath) | |
1023 { char *s, *t; | |
1024 s = importpath; | |
1025 do | |
1026 { size_t n; | |
1027 t = strstr(s, SOAP_PATHSEP); | |
1028 if (t) | |
1029 { if (t - s >= sizeof(buf)) | |
1030 t = s + sizeof(buf) - 1; | |
1031 strncpy(buf, s, t - s); | |
1032 buf[t - s] = '\0'; | |
1033 s = t + sizeof(SOAP_PATHSEP) - 1; | |
1034 } | |
1035 else | |
1036 { strcpy(buf, s); | |
1037 s = NULL; | |
1038 } | |
1039 n = strlen(buf) - 1; | |
1040 #ifdef __VMS | |
1041 if (buf[n] != ']' && buf[n] != ':') | |
1042 strcat(buf, ":"); | |
1043 #else | |
1044 if (buf[n] != SOAP_PATHCAT[0]) | |
1045 strcat(buf, SOAP_PATHCAT); | |
1046 #endif | |
1047 strcat(buf, file); | |
1048 yyin = fopen(buf, "r"); | |
1049 } | |
1050 while (s && !yyin); | |
1051 } | |
1052 if (!yyin) | |
1053 { sprintf(errbuf, "#import: Cannot open file \"%s\" for reading.\nHint: use option -I<path> (for example -Igsoap/import"SOAP_PATHSEP"gsoap/custom:.)", file); | |
1054 execerror(errbuf); | |
1055 } | |
1056 } | |
1057 p = (struct importlist*)malloc(sizeof(struct importlist) + strlen(file)); /* has already + 1 byte size */ | |
1058 strcpy(p->name, file); | |
1059 p->next = importlist; | |
1060 importlist = p; | |
1061 strcpy(filename, file); | |
1062 yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); | |
1063 } | |
1064 #endif |