Mercurial > repos > ktnyt > gembassy
diff 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 |
line wrap: on
line diff
--- a/GEMBASSY-1.0.3/gsoap/src/soapcpp2_lex.l Fri Jun 26 05:20:29 2015 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1064 +0,0 @@ -/* - 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