Mercurial > repos > ktnyt > gembassy
diff GEMBASSY-1.0.3/gsoap/src/soapcpp2_lex.l @ 0:8300eb051bea draft
Initial upload
author | ktnyt |
---|---|
date | Fri, 26 Jun 2015 05:19:29 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GEMBASSY-1.0.3/gsoap/src/soapcpp2_lex.l Fri Jun 26 05:19:29 2015 -0400 @@ -0,0 +1,1064 @@ +/* + soapcpp2_lex.l + + Flex/Lex tokenizer. + +-------------------------------------------------------------------------------- +gSOAP XML Web services tools +Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved. +This part of the software is released under ONE of the following licenses: +GPL or Genivia's license for commercial use. +-------------------------------------------------------------------------------- +GPL license. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +Author contact information: +engelen@genivia.com / engelen@acm.org + +This program is released under the GPL with the additional exemption that +compiling, linking, and/or using OpenSSL is allowed. +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- +*/ + +%{ +#include "soapcpp2.h" + +#ifdef HAVE_CONFIG_H +#include "soapcpp2_yacc.h" +#else +#include "soapcpp2_yacc.tab.h" +#endif + +#ifdef WITH_BISON +YYSTYPE yylval; +#undef YY_INPUT +#define YY_INPUT(buf, result, max_size) \ + { \ + int c = getc(yyin); \ + result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \ + } +#endif + +#ifndef WITH_LEX +#define MAX_IMPORT_DEPTH 16 +static struct importlist { struct importlist *next; char name[1]; } *importlist = NULL; +static char fnstk[MAX_IMPORT_DEPTH][1024]; +static int lnstk[MAX_IMPORT_DEPTH]; +static char *imstk[MAX_IMPORT_DEPTH]; +static YY_BUFFER_STATE instk[MAX_IMPORT_DEPTH]; +#endif +int imports = 0; +char *imported = NULL; +static void check_id(const char*); +static Token install_id(void); +static Token install_tag(void); +static Token install_int(void); +static Token install_hex(void); +static Token install_num(void); +static Token install_chr(void); +static Token install_str(void); +static Token install_pragma(void); +static void directive(void), option(void); +static Token error_chr(void); +static Token error_str(void); +static int convchar(int*); +static int hexchar(int*); +static int octchar(int*); +static void module(const char *name, const char *fullname); +static void import(const char *file); +static int magic(const char *name); +%} +ws [ \t\v\r\f\n\x1A\xA0] +digit [0-9] +alpha [a-zA-Z_] +id ({alpha}|:{alpha})({alpha}|{digit}|::|:{alpha})* +tag `[^`\t\v\r\f\n>]+` +int {digit}+ +hex 0[xX][0-9a-fA-F]+ +num {int}(\.{int}([Ee][+-]?{int})?|(\.{int})?[Ee][+-]?{int}) +chr '(\\'|[^'\n])*' +str L?\"(\\\"|\\\n|[^"])*\" +module #module{ws}+.*\n +import #import{ws}+.*\n +%x MLCOMMENT +%% +{ws} { /* skip white space */ } +"/*" { BEGIN(MLCOMMENT); } +<MLCOMMENT>.|\n { } +<MLCOMMENT>"*/" { BEGIN(INITIAL); } +<MLCOMMENT><<EOF>> { execerror("Unclosed multiline comment at the end of file"); } +"//"\/*"gsoapopt".*\n { option(); } +"//"\/*"gsoap".*\n { directive(); } +"//".*\n { /* skip single line comment */ } +"+=" { return PA; } +"-=" { return NA; } +"*=" { return TA; } +"/=" { return DA; } +"%=" { return MA; } +"&=" { return AA; } +"^=" { return XA; } +"|=" { return OA; } +"<<=" { return LA; } +">>=" { return RA; } +"||" { return OR; } +"&&" { return AN; } +"==" { return EQ; } +"!=" { return NE; } +"<=" { return LE; } +">=" { return GE; } +"<<" { return LS; } +">>" { return RS; } +"++" { return PP; } +"--" { return NN; } +"->" { return AR; } +[;,:=|^&<>+\-*/%!?~(){}\[\].@$] { return yytext[0]; } +{id} { return install_id(); } +{tag} { return install_tag(); } +{int} { return install_int(); } +{hex} { return install_hex(); } +{num} { return install_num(); } +{chr} { return install_chr(); } +{str} { return install_str(); } +{module} { char *s, *t, buf[1024]; + s = strchr(yytext, '"'); + if (!s) + t = yytext+7; + else + { strcpy(buf, s+1); + s = strchr(buf, '"'); + *s = '\0'; + t = strchr(s+1, '"'); + if (t) + { t++; + s = strchr(t+1, '"'); + if (s) + *s = '\0'; + } + } + module(buf, t); + } +{import} { char *s, buf[1024]; + s = strchr(yytext, '"'); + if (s) + { strcpy(buf, s+1); + s = strchr(buf, '"'); + *s = '\0'; + import(buf); + } + else + lexerror("Invalid import directive"); + } +#.*\n { return install_pragma(); } +'[^'\n]*/\n { return error_chr(); } +\"[^"\n]*/\n { return error_str(); } +. { lexerror("Skipping unknown symbol"); } +<<EOF>> { /* when Lex complains: remove this line and below */ +#ifndef WITH_LEX + if (--imports < 0) + yyterminate(); + else + { yy_delete_buffer(YY_CURRENT_BUFFER); + yy_switch_to_buffer(instk[imports]); + strcpy(filename, fnstk[imports]); + yylineno = lnstk[imports]; + imported = imstk[imports]; + } +#endif + } +%% + +/* + install_id - lookup identifier in symbol table. If found, return token + and symbol table entry. If not found, create entry in symbol table and + return ID token. +*/ +static Token +install_id() +{ Symbol *p = lookup(yytext); + if (!p) + { int i, flag = 0; + p = install(yytext, ID); + /* [_](x|X)(m|M)(l|L)__ is OK */ + /* [_](x|X)(m|M)(l|L).* is not OK */ + /* .*__(x|X)(m|M)(l|L) is not OK */ + /* .*::(x|X)(m|M)(l|L) is not OK */ + for (i = 0; i < yyleng; i++) + { if ((yytext[i] == '_' && yytext[i+1] == '_') + || (yytext[i] == ':' && yytext[i+1] == ':')) + { flag = 1; + check_id(yytext + i + 2); + } + } + if (!flag && strcmp(yytext, "XML")) + check_id(yytext); + } + yylval.sym = p; + return p->token; +} + +/* + install_tag - + return TAG token. +*/ +static Token +install_tag() +{ yylval.s = emalloc(yyleng-1); /* yyleng = length(yytext) */ + strcpy(yylval.s, yytext+1); + yylval.s[yyleng-2] = '\0'; + return TAG; +} + +/* + check_id - check for (x|X)(m|M)(l|L) +*/ +static void +check_id(const char *s) +{ while (*s == '_') + s++; + if ((s[0] == 'x' || s[0] == 'X') + && (s[1] == 'm' || s[1] == 'M') + && (s[2] == 'l' || s[2] == 'L')) + { 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); + semwarn(errbuf); + } +} + +/* + install_int - convert digits to integer and return LNG token. +*/ +static Token +install_int(void) +{ + sscanf(yytext, SOAP_ULONG_FORMAT, &yylval.i); + return LNG; +} + +/* + install_hex - convert hexadecimal digits to integer and return LNG +*/ +static Token +install_hex(void) +{ + sscanf(yytext, SOAP_XLONG_FORMAT, &yylval.i); + return LNG; +} + +/* + install_num - convert digits to floating point number and return DBL +*/ +static Token +install_num(void) +{ sscanf(yytext, "%lf", &yylval.r); + return DBL; +} + +/* + install_chr - convert character constant and return CHR. +*/ +static Token +install_chr(void) +{ int i = 2; + if (yytext[1] == '\\') + yylval.c = convchar(&i); + else yylval.c = yytext[i-1]; + if (yytext[i] != '\'') + lexerror("Illegal character constant"); + return CHR; +} + +/* + install_str - convert and store string in memory. Return STR. +*/ +static Token +install_str(void) +{ int i, j = 0; + yylval.s = emalloc(yyleng-1); /* yyleng = length(yytext) */ + for (i = 1 + (yytext[0] == 'L'); i < yyleng-1; i++) + if (yytext[i] == '\\') + { if (yytext[++i] != '\n') + { yylval.s[j++] = convchar(&i); + i--; + } + } + else + yylval.s[j++] = yytext[i]; + yylval.s[j] = '\0'; + return STR; +} + +/* + install_pragma - store pragma in string. Return PRAGMA. +*/ +static Token +install_pragma(void) +{ yylval.s = emalloc(yyleng); /* yyleng = length(yytext) */ + strncpy(yylval.s, yytext, strlen(yytext)-1); + yylval.s[strlen(yytext)-1] = '\0'; + return PRAGMA; +} + +static void directive(void) +{ int i, j, k; + char *s; + Service *sp; + Method *m; + Data *d; + int service; + for (i = 7; yytext[i]; i++) + if (yytext[i] > 32) + break; + for (j = i; yytext[j]; j++) + if (yytext[j] <= 32) + break; + if (i == j) + return; + s = (char*)emalloc(j-i+1); + for (k = 0; k < j-i; k++) + { s[k] = yytext[k+i]; + if (s[k] == '_') + s[k] = '-'; + } + s[k] = '\0'; + for (sp = services; sp; sp = sp->next) + if (!strcmp(sp->ns, s)) + break; + if (!sp) + { sp = (Service*)emalloc(sizeof(Service)); + sp->next = services; + sp->ns = s; + sp->name = NULL; + sp->porttype = NULL; + sp->portname = NULL; + sp->binding = NULL; + sp->definitions = NULL; + sp->transport = NULL; + sp->URL = NULL; + sp->URI = NULL; + sp->URI2 = NULL; + sp->WSDL = NULL; + sp->style = NULL; + sp->encoding = NULL; + sp->protocol = NULL; + sp->xsi_type = 0; + sp->elementForm = NULL; + sp->attributeForm = NULL; + sp->executable = NULL; + sp->import = NULL; + sp->documentation = NULL; + sp->list = NULL; + sp->data = NULL; + services = sp; + } + for (i = j; yytext[i]; i++) + if (yytext[i] > 32) + break; + if (!strncmp(yytext+i, "service", 7) || !strncmp(yytext+i, "schema", 6)) + { service = strncmp(yytext+i, "schema", 6); + for (i += 7; yytext[i]; i++) + if (yytext[i] > 32) + break; + for (j = i; yytext[j]; j++) + if (yytext[j] <= 32) + break; + for (; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] <= 32) + break; + /* + if (j == k) + return; + */ + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + if (!strncmp(yytext+i, "name:", 5)) + { sp->name = s; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] == 10 || yytext[k] == 13) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + sp->documentation = s; + } + else if (!strncmp(yytext+i, "type:", 5) || !strncmp(yytext+i, "portType:", 9) || !strncmp(yytext+i, "interface:", 10)) + sp->porttype = s; + else if (!strncmp(yytext+i, "portName:", 9)) + sp->portname = s; + else if (!strncmp(yytext+i, "binding:", 8)) + sp->binding = s; + else if (!strncmp(yytext+i, "definitions:", 12)) + sp->definitions = s; + else if (!strncmp(yytext+i, "documentation:", 14)) + { for (k = j; yytext[k]; k++) + if (yytext[k] == 10 || yytext[k] == 13) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + sp->documentation = s; + } + else if (!strncmp(yytext+i, "transport:", 10)) + sp->transport = s; + else if (!strncmp(yytext+i, "location:", 9) || !strncmp(yytext+i, "endpoint:", 9) || !strncmp(yytext+i, "port:", 5)) + { if (sp->URL) + { char *t = (char*)emalloc(strlen(sp->URL) + strlen(s) + 2); + strcpy(t, sp->URL); + strcat(t, " "); + strcat(t, s); + sp->URL = t; + } + else + sp->URL = s; + if (!service && !sp->import) + sp->import = s; + } + else if (!strncmp(yytext+i, "executable:", 11)) + sp->executable = s; + else if (!strncmp(yytext+i, "namespace:", 10)) + { if (service) + { if (!sp->URI) + sp->URI = s; + sp->WSDL = s; + } + else if (!strcmp(sp->ns, "SOAP-ENV")) + { if (vflag > 0) + semwarn("option -1 or -2 overrides SOAP-ENV namespace"); + else + envURI = s; + sp->URI = envURI; + } + else if (!strcmp(sp->ns, "SOAP-ENC")) + { if (vflag > 0) + semwarn("option -1 or -2 overrides SOAP-ENC namespace"); + else + encURI = s; + sp->URI = encURI; + } + else + sp->URI = s; + } + else if (!strncmp(yytext+i, "namespace2:", 11)) + { sp->URI2 = s; + } + else if (!strncmp(yytext+i, "typed:", 6)) + { sp->xsi_type = (*s == 'y'); + } + else if (!strncmp(yytext+i, "form:", 5)) + { sp->elementForm = s; + sp->attributeForm = s; + } + else if (!strncmp(yytext+i, "elementForm:", 12)) + sp->elementForm = s; + else if (!strncmp(yytext+i, "attributeForm:", 14)) + sp->attributeForm = s; + else if (!strncmp(yytext+i, "import:", 7)) + { if (!sp->URI) + sp->URI = s; + sp->import = s; + } + else if (!strncmp(yytext+i, "encoding:", 9)) + { if (!strcmp(s, "encoded")) + sp->encoding = ""; + else + sp->encoding = s; + } + else if (!strncmp(yytext+i, "style:", 6)) + sp->style = s; + else if (!strncmp(yytext+i, "protocol:", 9)) + sp->protocol = s; + else if (!strncmp(yytext+i, "method-protocol:", 16)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = PROTOCOL; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] == 10 || yytext[k] == 13) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "method-style:", 13)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = STYLE; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] == 10 || yytext[k] == 13) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "method-encoding:", 16)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = ENCODING; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] == 10 || yytext[k] == 13) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + if (strcmp(s, "encoded")) + m->part = s; + else + m->part = ""; + } + else if (!strncmp(yytext+i, "method-response-encoding:", 25)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = RESPONSE_ENCODING; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] == 10 || yytext[k] == 13) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + if (strcmp(s, "encoded")) + m->part = s; + else + m->part = ""; + } + else if (!strncmp(yytext+i, "method-documentation:", 21)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = COMMENT; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] == 10 || yytext[k] == 13) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "method-action:", 14)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = ACTION; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] == 10 || yytext[k] == 13) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "method-input-action:", 20)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = REQUEST_ACTION; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] == 10 || yytext[k] == 13) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "method-output-action:", 21)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = RESPONSE_ACTION; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] == 10 || yytext[k] == 13) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "method-fault-action:", 20)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = FAULT_ACTION; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] == 10 || yytext[k] == 13) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "method-mime-type:", 17)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = MIMEIN | MIMEOUT; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] <= 32) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "method-input-mime-type:", 23)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = MIMEIN; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] <= 32) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "method-output-mime-type:", 24)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = MIMEOUT; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] <= 32) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "method-header-part:", 19)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = HDRIN | HDROUT; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] <= 32) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "method-input-header-part:", 25)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = HDRIN; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] <= 32) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "method-output-header-part:", 26)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = HDROUT; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] <= 32) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "method-fault:", 13)) + { m = (Method*)emalloc(sizeof(Method)); + m->name = s; + m->mess = FAULT; + m->part = NULL; + m->next = sp->list; + sp->list = m; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] <= 32) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + m->part = s; + } + else if (!strncmp(yytext+i, "type-documentation:", 19)) + { d = (Data*)emalloc(sizeof(Data)); + d->name = s; + d->text = NULL; + d->next = sp->data; + sp->data = d; + for (j = k; yytext[j]; j++) + if (yytext[j] > 32) + break; + for (k = j; yytext[k]; k++) + if (yytext[k] == 10 || yytext[k] == 13) + break; + if (j == k) + return; + s = (char*)emalloc(k-j+1); + strncpy(s, yytext+j, k-j); + s[k-j] = '\0'; + d->text = s; + } + else + { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext+i); + semwarn(errbuf); + } + } + else + { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext); + semwarn(errbuf); + } +} + +static void option(void) +{ int i; + if (imports) + { sprintf(errbuf, "options directive: %s ignored in imported file(s)", yytext); + semwarn(errbuf); + return; + } + for (i = 10; yytext[i]; i++) + if (yytext[i] > 32) + break; + for (; yytext[i]; i++) + switch (yytext[i]) + { case 'a': + aflag = 1; + break; + case 'c': + cflag = 1; + break; + case 'e': + eflag = 1; + break; + case 'n': + nflag = 1; + break; + case 'l': + lflag = 1; + break; + case 't': + tflag = 1; + break; + case 'w': + wflag = 1; + break; + default: + if (yytext[i] <= 32) + return; + } +} + +/* + error_chr - lexical error in character constant. Return character 0 to + allow parsing to continue +*/ +static Token +error_chr(void) +{ lexerror("Ending-' missing in character constant"); + yylval.c = '\0'; + return CHR; +} + +/* + error_str - lexical error in string. Return empty string to allow + parsing to continue +*/ +static Token +error_str(void) +{ lexerror("Ending-\" missing in string"); + yylval.s = ""; + return STR; +} + +/* + Character conversion functions +*/ +static int +convchar(int *p) +{ switch (yytext[(*p)++]) + { case 'a': return '\a'; + case 'b': return '\b'; + case 'f': return '\f'; + case 'n': return '\n'; + case 'r': return '\r'; + case 't': return '\t'; + case 'v': return '\v'; + case 'x': return hexchar(p); + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': (*p)--; + return octchar(p); + default: return yytext[*p-1]; + } +} + +static int +hexchar(int *p) +{ int i, d, c = 0; + for (i = 0; isxdigit(d = yytext[*p]) && i < 2; i++) + { c = (c << 4) + (d <= '9' ? d - '0' : toupper(d) - '7'); + (*p)++; + } + return c; +} + +static int +octchar(int *p) +{ int i, d, c = 0; + for (i = 0; (d = yytext[*p]) >= '0' && d <= '7' && i < 3; i++) + { c = (c << 3) + d - '0'; + (*p)++; + } + return c; +} + +static void module(const char *name, const char *fullname) +{ if (!fullname) + fullname = name; + if (imports) + { Pragma **pp; + char *s = emalloc(strlen(fullname)+15); + sprintf(s, "#include \"%sH.h\"", fullname); + for (pp = &pragmas; *pp; pp = &(*pp)->next) + if (!strcmp((*pp)->pragma, s)) + break; + if (!*pp) + { *pp = (Pragma*)emalloc(sizeof(Pragma)); + (*pp)->pragma = s; + (*pp)->next = NULL; + } + imported = (char*)emalloc(strlen(fullname)+1); + strcpy(imported, fullname); + fprintf(stderr, "Importing module '%s'\n\n", fullname); + } + else + { lflag = 1; + typeNO = magic(name); + prefix = (char*)emalloc(strlen(fullname)+1); + strcpy(prefix, fullname); + fprintf(stderr, "Compiling module '%s' (magic number = %d)\n\n", fullname, typeNO); + } +} + +static int magic(const char *name) +{ size_t i; + int n; + if (strlen(name) > 4) + semerror("#module name length must not exceed four characters"); + n = 0; + for (i = 0; i < strlen(name); i++) + if (name[i] >= 'a' && name[i] <= 'z') + n = 26*n + name[i] - 'a'; + else if (name[i] >= 'A' && name[i] <= 'Z') + n = 26*n + name[i] - 'A'; + else + semerror("#module name must be alphabetic and the length must not exceed four characters.\nUse '#module name longname' for longer names."); + return 4699*n + 153424; +} + +#ifdef WITH_LEX +static void import(const char *file) +{ execerror("Cannot #import: soapcpp2 not compiled with flex (replace lex with flex)"); +} +#else +static void import(const char *file) +{ char buf[1024]; + struct importlist *p; + for (p = importlist; p; p = p->next) + if (!strcmp(p->name, file)) + return; + if (imports >= MAX_IMPORT_DEPTH) + execerror("Imports nested too deep"); + instk[imports] = YY_CURRENT_BUFFER; + strcpy(fnstk[imports], filename); + lnstk[imports] = yylineno; + imstk[imports] = imported; + yylineno = 1; + /* imported = NULL; this is useful to change the semantics of #import to NOT consider non-module imports to be part of the current module */ + imports++; + if (!(yyin = fopen(file, "r"))) + { if (importpath) + { char *s, *t; + s = importpath; + do + { size_t n; + t = strstr(s, SOAP_PATHSEP); + if (t) + { if (t - s >= sizeof(buf)) + t = s + sizeof(buf) - 1; + strncpy(buf, s, t - s); + buf[t - s] = '\0'; + s = t + sizeof(SOAP_PATHSEP) - 1; + } + else + { strcpy(buf, s); + s = NULL; + } + n = strlen(buf) - 1; +#ifdef __VMS + if (buf[n] != ']' && buf[n] != ':') + strcat(buf, ":"); +#else + if (buf[n] != SOAP_PATHCAT[0]) + strcat(buf, SOAP_PATHCAT); +#endif + strcat(buf, file); + yyin = fopen(buf, "r"); + } + while (s && !yyin); + } + if (!yyin) + { sprintf(errbuf, "#import: Cannot open file \"%s\" for reading.\nHint: use option -I<path> (for example -Igsoap/import"SOAP_PATHSEP"gsoap/custom:.)", file); + execerror(errbuf); + } + } + p = (struct importlist*)malloc(sizeof(struct importlist) + strlen(file)); /* has already + 1 byte size */ + strcpy(p->name, file); + p->next = importlist; + importlist = p; + strcpy(filename, file); + yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); +} +#endif