Mercurial > repos > ktnyt > gembassy
diff GEMBASSY-1.0.3/gsoap/src/symbol2.c @ 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/symbol2.c Fri Jun 26 05:20:29 2015 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12970 +0,0 @@ -/* - symbol2.c - - Symbol table handling, type analysis, and code generation. - --------------------------------------------------------------------------------- -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 - -char *envURI = "http://schemas.xmlsoap.org/soap/envelope/"; -char *encURI = "http://schemas.xmlsoap.org/soap/encoding/"; -char *rpcURI = "http://www.w3.org/2003/05/soap-rpc"; -char *xsiURI = "http://www.w3.org/2001/XMLSchema-instance"; -char *xsdURI = "http://www.w3.org/2001/XMLSchema"; -char *tmpURI = "http://tempuri.org"; - -static Symbol *symlist = (Symbol*) 0; /* pointer to linked list of symbols */ -static Symbol *nslist = (Symbol*) 0; /* pointer to linked list of namespace prefix symbols */ - -static Tnode *Tptr[TYPES]; - -Service *services = NULL; - -FILE *fout, *fhead, *fclient, *fserver, *fheader, *flib, *fmatlab, *fmheader; - -int partnum = 0; - -int typeNO = 1; /* unique no. assigned to all types */ - -static int is_anytype_flag = 0; /* anytype is used */ -static int has_nsmap = 0; - -int tagcmp(const char *s, const char *t); -int tagncmp(const char *s, const char *t, size_t n); - -long minlen(Tnode *typ); -long maxlen(Tnode *typ); - -int is_soap12(const char*); -int has_detail_string(void); -int has_Detail_string(void); - -void needs_lang(Entry *e); - -int is_mutable(Tnode *typ); -int is_header_or_fault(Tnode *typ); -int is_body(Tnode *typ); -int is_volatile(Tnode* typ); -int is_untyped(Tnode* typ); -int is_primclass(Tnode* typ); -int is_imported(Tnode* typ); -int is_template(Tnode* typ); -int is_mask(Tnode* typ); -int is_attachment(Tnode* typ); -int has_attachment(Tnode* typ); -int is_void(Tnode* typ); -int has_external(Tnode *typ); -int has_volatile(Tnode *typ); - -int is_invisible(const char *name); -int is_invisible_empty(Tnode *p); - -int is_eq_nons(const char *s, const char *t); -int is_eq(const char *s, const char *t); - -int is_item(Entry *p); -int is_self(Entry *p); - -const char *cstring(const char*); -const char *xstring(const char*); - -/* -install - add new symbol -*/ -Symbol * -install(const char *name, Token token) -{ Symbol *p; - p = (Symbol*)emalloc(sizeof(Symbol)); - p->name = emalloc(strlen(name)+1); - strcpy(p->name, name); - p->token = token; - p->next = symlist; - symlist = p; - return p; -} - -/* -lookup - search for an identifier's name. If found, return pointer to symbol table entry. Return pointer 0 if not found. -*/ -Symbol * -lookup(const char *name) -{ Symbol *p; - for (p = symlist; p; p = p->next) - if (!strcmp(p->name, name)) - return p; - return NULL; -} - -/* -gensymidx - generate new symbol from base name and index -*/ -Symbol * -gensymidx(const char *base, int idx) -{ char buf[1024]; - Symbol *s; - sprintf(buf, "%s_%d", base, idx); - s = lookup(buf); - if (s) - return s; - return install(buf, ID); -} - -/* -gensym - generate new symbol from base name -*/ -Symbol * -gensym(const char *base) -{ static int num = 1; - return gensymidx(base, num++); -} - -/* -mktable - make a new symbol table with a pointer to a previous table -*/ -Table * -mktable(Table *table) -{ Table *p; - p = (Table*)emalloc(sizeof(Table)); - p->sym = lookup("/*?*/"); - p->list = (Entry*) 0; - if (table == (Table*) 0) - p->level = INTERNAL; - else p->level = table->level+1; - p->prev = table; - return p; -} - -/* -mkmethod - make a new method by calling mktype -*/ -Tnode * -mkmethod(Tnode *ret, Table *args) -{ FNinfo *fn = (FNinfo*)emalloc(sizeof(FNinfo)); - fn->ret = ret; - fn->args = args; - return mktype(Tfun, fn, 0); -} - -/* -freetable - free space by removing a table -*/ -void -freetable(Table *table) -{ Entry *p, *q; - if (table == (Table*) 0) - return; - for (p = table->list; p != (Entry*) 0; p = q) { - q = p->next; - free(p); - } - free(table); -} - -/* -unlinklast - unlink last entry added to table -*/ -Entry * -unlinklast(Table *table) -{ Entry **p, *q; - if (table == (Table*)0) - return (Entry*)0; - for (p = &table->list; *p != (Entry*)0 && (*p)->next != (Entry*)0; - p = &(*p)->next); - q = *p; - *p = (Entry*)0; - return q; -} - -/* -enter - enter a symbol in a table. Error if already in the table -*/ -Entry * -enter(Table *table, Symbol *sym) -{ Entry *p, *q = NULL; -again: - for (p = table->list; p; q = p, p = p->next) - { if (p->sym == sym && p->info.typ->type != Tfun) - { char *s; - sprintf(errbuf, "Duplicate declaration of '%s' (already declared at line %d), changing conflicting identifier name to new name '%s_'. Note: this problem may be caused by importing invalid XML schemas", sym->name, p->lineno, sym->name); - semwarn(errbuf); - s = (char*)emalloc(strlen(sym->name) + 2); - strcpy(s, sym->name); - strcat(s, "_"); - sym = lookup(s); - if (!sym) - sym = install(s, ID); - free(s); - goto again; - } - } - p = (Entry*)emalloc(sizeof(Entry)); - p->sym = sym; - p->tag = NULL; - p->info.typ = NULL; - p->info.sto = Snone; - p->info.hasval = False; - p->info.minOccurs = 1; - p->info.maxOccurs = 1; - p->info.offset = 0; - p->level = table->level; - p->lineno = yylineno; - p->next = NULL; - if (!q) - table->list = p; - else - q->next = p; - return p; -} - -/* -entry - return pointer to table entry of a symbol -*/ -Entry * -entry(Table *table, Symbol *sym) -{ Table *t; - Entry *p; - for (t = table; t; t = t->prev) - for (p = t->list; p; p = p->next) - if (p->sym == sym) - return p; - return NULL; -} - -/* -reenter - re-enter a symbol in a table. -*/ -Entry * -reenter(Table *table, Symbol *sym) -{ Entry *p, *q = NULL; - for (p = table->list; p; q = p, p = p->next) - if (p->sym == sym) - break; - if (p && p->next) - { if (q) - q->next = p->next; - else - table->list = p->next; - for (q = p->next; q->next; q = q->next) - ; - q->next = p; - p->next = NULL; - } - return p; -} - -/* -merge - append two tables if members are not duplicated -*/ -int -merge(Table *dest, Table *src) -{ Entry *p, *q; - for (p = src->list; p; p = p->next) - { q = entry(dest, p->sym); - if (!q || q->info.typ != p->info.typ) - { q = enter(dest, p->sym); - q->info = p->info; - } - } - return 0; -} - -Entry * -enumentry(Symbol *sym) -{ Table *t; - Entry *p, *q; - for (t = enumtable; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { q = entry((Table*)p->info.typ->ref, sym); - if (q) - return q; - } - } - return NULL; -} - -char *get_mxClassID(Tnode*); -char *t_ident(Tnode*); -char *c_ident(Tnode*); -char *ident(char*); -char *soap_type(Tnode*); -char *c_storage(Storage); -char *c_init(Entry*); -char *c_type(Tnode*); -char *c_type_id(Tnode*, char*); -char *xsi_type_cond(Tnode*, int); -char *xsi_type(Tnode*); -char *xsi_type_cond_u(Tnode*, int); -char *xsi_type_u(Tnode*); -char *the_type(Tnode*); -char *wsdl_type(Tnode*, char*); -char *base_type(Tnode*, char*); -char *xml_tag(Tnode*); -char *ns_qualifiedElement(Tnode*); -char *ns_qualifiedAttribute(Tnode*); -char *ns_convert(char*); -char *field(Entry *p, char *ns); -char *field_overridden(Table *t, Entry *p, char *ns); -char *ns_add(Entry *p, char *ns); -char *ns_addx(char *tag, char *ns); -char *ns_add_overridden(Table *t, Entry *p, char *ns); -char *ns_remove(char*); -char *ns_remove1(char*); -char *ns_remove2(char*); -char *res_remove(char*); -char *ns_name(char*); -char *ns_cname(char*, char*); -char *ns_fname(char*); - -int has_class(Tnode*); -int has_constructor(Tnode*); -int has_destructor(Tnode*); -int has_getter(Tnode*); -int has_setter(Tnode*); -int has_ns(Tnode*); -int has_ns_t(Tnode*); -int has_ns_eq(char*, char*); -char *strict_check(void); -char *ns_of(char*); -int eq_ns(char*, char*); -char *prefix_of(char*); -int has_offset(Tnode*); -int reflevel(Tnode *typ); -Tnode* reftype(Tnode *typ); -int is_response(Tnode*); -int is_XML(Tnode*); -int is_stdXML(Tnode *p); -Entry *get_response(Tnode*); -int is_primitive_or_string(Tnode*); -int is_primitive(Tnode*); -Entry *is_discriminant(Tnode*); -Entry *is_dynamic_array(Tnode*); -int is_transient(Tnode*); -int is_external(Tnode*); -int is_anyType(Tnode*); -int is_anyAttribute(Tnode*); -int is_binary(Tnode*); -int is_hexBinary(Tnode*); -int is_fixedstring(Tnode*); -int is_string(Tnode*); -int is_wstring(Tnode*); -int is_stdstring(Tnode*); -int is_stdwstring(Tnode*); -int is_stdstr(Tnode*); -int is_typedef(Tnode*); -int get_dimension(Tnode*); -char *has_soapref(Tnode*); -int is_document(const char*); -int is_literal(const char*); -int is_keyword(const char *); - -int is_repetition(Entry*); -int is_choice(Entry*); -int is_sequence(Entry*); -int is_anytype(Entry*); - -char *xsi_type_Tarray(Tnode*); -char *xsi_type_Darray(Tnode*); - -void matlab_def_table(Table*); -void def_table(Table*); -void generate(Tnode *); -int no_of_var(Tnode*); -char *pointer_stuff(Tnode*); -void in_defs(Table*); -void in_defs2(Table*); -void in_defs3(Table*); -void out_defs(Table*); -void mark_defs(Table*); -void in_attach(Table*); -void out_attach(Table*); -void soap_serialize(Tnode*); -void soap_traverse(Tnode*); -void soap_default(Tnode*); -void soap_put(Tnode*); -void soap_out(Tnode*); -void soap_out_Darray(Tnode *); -void soap_get(Tnode*); -void soap_in(Tnode*); -void soap_in_Darray(Tnode *); -void soap_instantiate_class(Tnode *); -int get_Darraydims(Tnode *typ); -const char *nillable(Tnode *typ); - -void soap_serve(Table*); -void generate_proto(Table*, Entry*); -/* -void generate_call(Table*, Entry*); -void generate_server(Table*, Entry*); -*/ -void generate_header(Table*); -void get_namespace_prefixes(void); -void generate_schema(Table*); -void gen_schema(FILE*,Table*,char*,char*,int,int,char*,char*,char*,char*); -void gen_type_documentation(FILE *fd, Entry *type, char *ns); -int gen_member_documentation(FILE *fd, Symbol *type, Entry *member, char *ns); -void gen_schema_elements_attributes(FILE *fd, Table *t, char *ns, char *ns1, char *encoding, char *style); -void gen_schema_elements(FILE *fd, Tnode *p, char *ns, char *ns1); -int gen_schema_element(FILE *fd, Tnode *p, Entry *q, char *ns, char *ns1); -void gen_schema_attributes(FILE *fd, Tnode *p, char *ns, char *ns1); -void gen_wsdl(FILE*,Table*,char*,char*,char*,char*,char*,char*,char*,char*); -void gen_nsmap(FILE*,Symbol*,char*); - -void gen_proxy(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); -void gen_object(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); -void gen_proxy_header(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); -void gen_proxy_code(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); -void gen_object_header(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); -void gen_object_code(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*); -void gen_method(FILE *fd, Table *table, Entry *method, int server); -void gen_params(FILE *fd, Table *params, Entry *result, int flag); -void gen_args(FILE *fd, Table *params, Entry *result, int flag); -void gen_query_url(FILE *fd, Table *params); -void gen_query_form(FILE *fd, Table *params); -const char* gen_format(FILE *fd, Tnode *typ); -void gen_call_method(FILE *fd, Table *table, Entry *method, char *name); -void gen_serve_method(FILE *fd, Table *table, Entry *param, char *name); - -void gen_data(char*,Table*,char*,char*,char*,char*,char*,char*); -FILE *gen_env(char*,char*,int,Table*,char*,char*,char*,char*,char*,char*,int); -void gen_xmlns(FILE*); -void gen_field(FILE*,int,Entry*,char*,char*,char*); -void gen_val(FILE*,int,Tnode*,char*,char*,char*); -void gen_atts(FILE*,int,Table*,char*); - -/* -mktype - make a (new) type with a reference to additional information and the -width in bytes required to store objects of that type. A pointer to the -type is returned which can be compared to check if types are identical. -*/ -Tnode * -mktype(Type type, void *ref, int width) -{ Tnode *p; - int t = 0; - if (transient != -2 || type > Ttime) - t = transient; - if (type != Tstruct && type != Tclass && type != Tunion && (type != Tenum || ref)) - { for (p = Tptr[type]; p; p = p->next) - { if (p->ref == ref && p->sym == (Symbol*) 0 && p->width == width && p->transient == t) - { if (imported && !p->imported) - p->imported = imported; - return p; /* type alrady exists in table */ - } - } - } - p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ - p->type = type; - p->ref = ref; - p->id = lookup("/*?*/"); - p->base = NULL; - p->sym = (Symbol*)0; - p->response = (Entry*)0; - p->width = width; - p->generated = False; - p->classed = False; - p->wsdl = False; - p->next = Tptr[type]; - p->transient = t; - p->imported = imported; - p->pattern = NULL; - p->minLength = MINLONG64; - p->maxLength = MAXLONG64; - p->num = typeNO++; - Tptr[type] = p; - DBGLOG(fprintf(stderr, "New type %s %s\n", c_type(p), p->imported)); - if (type == Tpointer && ((Tnode*)ref)->imported && (((Tnode*)ref)->type == Tenum || ((Tnode*)ref)->type == Tstruct || ((Tnode*)ref)->type == Tclass)) - p->imported = ((Tnode*)ref)->imported; - else if (lflag && !is_transient(p) && (type == Tenum || type == Tstruct || type == Tclass)) - mkpointer(p); - return p; -} - -Tnode * -mksymtype(Tnode *typ, Symbol *sym) -{ Tnode *p; - p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ - p->type = typ->type; - p->ref = typ->ref; - if (typ->id == lookup("/*?*/")) - p->id = sym; - else - p->id = typ->id; - p->sym = sym; - p->response = (Entry*)0; - p->width = typ->width; - p->generated = False; - p->classed = True; /* copy of existing (generated) type */ - p->wsdl = False; - p->next = Tptr[typ->type]; - p->transient = transient; - p->imported = imported; - p->pattern = NULL; - p->minLength = MINLONG64; - p->maxLength = MAXLONG64; - p->num = typeNO++; - Tptr[typ->type] = p; - DBGLOG(fprintf(stderr, "New typedef %s %s\n", c_type(p), p->imported)); - return p; -} - -Tnode * -mktemplate(Tnode *typ, Symbol *id) -{ Tnode *p; - for (p = Tptr[Ttemplate]; p; p = p->next) - if (p->ref == typ && p->id == id && p->transient == transient) - { if (imported && !p->imported) - p->imported = imported; - return p; /* type alrady exists in table */ - } - p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ - p->type = Ttemplate; - p->ref = typ; - p->id = id; - p->sym = NULL; - p->response = (Entry*)0; - p->width = 0; - p->generated = False; - p->classed = False; /* copy of existing (generated) type */ - p->wsdl = False; - p->next = Tptr[Ttemplate]; - p->transient = transient; - p->imported = imported; - p->pattern = NULL; - p->minLength = MINLONG64; - p->maxLength = MAXLONG64; - p->num = typeNO++; - Tptr[Ttemplate] = p; - return p; -} - -/* DO NOT REMOVE OR ALTER (SEE LICENCE AGREEMENT AND COPYING.txt) */ -void -copyrightnote(FILE *fd, char *fn) -{ fprintf(fd, "\ -/* %s\n Generated by gSOAP "VERSION" from %s\n\ -\n\ -Copyright(C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ -The generated code is released under one of the following licenses:\n\ -GPL or Genivia's license for commercial use.\n\ -This program is released under the GPL with the additional exemption that\n\ -compiling, linking, and/or using OpenSSL is allowed.\n\ -*/", fn, filename); -} - -void -banner(FILE *fd, const char *text) -{ int i; - fprintf(fd, "\n\n/"); - for (i = 0; i < 78; i++) - fputc('*', fd); - fprintf(fd, "\\\n *%76s*\n * %-75s*\n *%76s*\n\\", "", text, ""); - for (i = 0; i < 78; i++) - fputc('*', fd); - fprintf(fd, "/\n"); -} - -void -identify(FILE *fd, char *fn) -{ time_t t = time(NULL), *p = &t; - char tmp[256]; - strftime(tmp, 256, "%Y-%m-%d %H:%M:%S GMT", gmtime(p)); - fprintf(fd, "\n\nSOAP_SOURCE_STAMP(\"@(#) %s ver "VERSION" %s\")\n", fn, tmp); -} - -void -compile(Table *table) -{ Entry *p; - Tnode *typ; - Pragma *pragma; - int classflag = 0; - int found; - int filenum; - char *s; - char base[1024]; - char soapStub[1024]; - char soapH[1024]; - char soapC[1024]; - char soapClient[1024]; - char soapServer[1024]; - char soapClientLib[1024]; - char soapServerLib[1024]; - char pathsoapStub[1024]; - char pathsoapH[1024]; - char pathsoapC[1024]; - char pathsoapClient[1024]; - char pathsoapServer[1024]; - char pathsoapClientLib[1024]; - char pathsoapServerLib[1024]; - char soapMatlab[1024]; - char pathsoapMatlab[1024]; - char soapMatlabHdr[1024]; - char pathsoapMatlabHdr[1024]; - - found = 0; - for (p = table->list; p; p = p->next) - if (p->info.typ->type == Tfun && !(p->info.sto & Sextern)) - found = 1; - if (!found) - Sflag = Cflag = Lflag = 1; /* no service operations were found */ - - if (*dirpath) - fprintf(fmsg, "Using project directory path: %s\n", dirpath); - - if (namespaceid) - { prefix = namespaceid; - fprintf(fmsg, "Using code namespace: %s\n", namespaceid); - } - strcpy(base, prefix); - if (cflag) - s = ".c"; - else - s = ".cpp"; - - strcpy(soapMatlab, base); - strcat(soapMatlab, "Matlab.c"); - strcpy(pathsoapMatlab, dirpath); - strcat(pathsoapMatlab, soapMatlab ); - - strcpy(soapMatlabHdr, base); - strcat(soapMatlabHdr, "Matlab.h"); - strcpy(pathsoapMatlabHdr, dirpath); - strcat(pathsoapMatlabHdr, soapMatlabHdr); - - strcpy(soapStub, base); - strcat(soapStub, "Stub.h"); - strcpy(pathsoapStub, dirpath); - strcat(pathsoapStub, soapStub); - strcpy(soapH, base); - strcat(soapH, "H.h"); - strcpy(pathsoapH, dirpath); - strcat(pathsoapH, soapH); - strcpy(soapC, base); - if (fflag) - strcat(soapC, "C_nnn"); - else - strcat(soapC, "C"); - strcat(soapC, s); - strcpy(pathsoapC, dirpath); - strcat(pathsoapC, soapC); - strcpy(soapClient, base); - strcat(soapClient, "Client"); - strcat(soapClient, s); - strcpy(pathsoapClient, dirpath); - strcat(pathsoapClient, soapClient); - strcpy(soapServer, base); - strcat(soapServer, "Server"); - strcat(soapServer, s); - strcpy(pathsoapServer, dirpath); - strcat(pathsoapServer, soapServer); - strcpy(soapClientLib, base); - strcat(soapClientLib, "ClientLib"); - strcat(soapClientLib, s); - strcpy(pathsoapClientLib, dirpath); - strcat(pathsoapClientLib, soapClientLib); - strcpy(soapServerLib, base); - strcat(soapServerLib, "ServerLib"); - strcat(soapServerLib, s); - strcpy(pathsoapServerLib, dirpath); - strcat(pathsoapServerLib, soapServerLib); - - if (mflag) - { fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlab); - fmatlab=fopen(pathsoapMatlab, "w"); - if (!fmatlab) - execerror("Cannot write to file"); - copyrightnote(fmatlab, soapMatlab); - fprintf(fmatlab,"\n#include \"%s\"\n", soapMatlabHdr); - fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlabHdr); - fmheader=fopen(pathsoapMatlabHdr, "w"); - if (!fmheader) - execerror("Cannot write to file"); - copyrightnote(fmheader, soapMatlabHdr); - fprintf(fmheader,"\n#include \"mex.h\"\n#include \"%s\"\n", soapStub); - } - - fprintf(fmsg, "Saving %s annotated copy of the source input\n", pathsoapStub); - fheader=fopen(pathsoapStub, "w"); - if (!fheader) - execerror("Cannot write to file"); - copyrightnote(fheader, soapStub); - fprintf(fheader,"\n\n#ifndef %sStub_H\n#define %sStub_H", prefix, prefix); - for (pragma = pragmas; pragma; pragma = pragma->next) - fprintf(fheader,"\n%s", pragma->pragma); - if (nflag) - fprintf(fheader,"\n#ifndef WITH_NONAMESPACES\n#define WITH_NONAMESPACES\n#endif"); - if (namespaceid) - { fprintf(fheader,"\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); - } - fprintf(fheader,"\n#include \"stdsoap2.h\""); - fprintf(fheader,"\n#if GSOAP_VERSION != %d\n# error \"GSOAP VERSION MISMATCH IN GENERATED CODE: PLEASE REINSTALL PACKAGE\"\n#endif\n", GSOAP_VERSION); - if (cflag) - fprintf(fheader,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); - if (namespaceid) - fprintf(fheader,"\n\nnamespace %s {", namespaceid); - - fprintf(fmsg, "Saving %s interface declarations\n", pathsoapH); - fhead=fopen(pathsoapH,"w"); - if (!fhead) - execerror("Cannot write to file"); - copyrightnote(fhead, soapH); - fprintf(fhead,"\n\n#ifndef %sH_H\n#define %sH_H", prefix, prefix); - fprintf(fhead,"\n#include \"%s\"", soapStub); - if (cflag) - fprintf(fhead,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); - if (namespaceid) - fprintf(fhead,"\n\nnamespace %s {", namespaceid); - fprintf(fhead, "\n#ifndef WITH_NOIDREF"); - if (!cflag && !namespaceid) - fprintf(fhead,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); - fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int);"); - if (!cflag && !namespaceid) - fprintf(fhead,"\n\n#ifdef __cplusplus\n}\n#endif"); - fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*);"); - fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*);"); - fprintf(fhead, "\n#endif"); - if (!cflag && !namespaceid) - fprintf(fhead,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); - fprintf(fhead, "\nSOAP_FMAC3 void *SOAP_FMAC4 soap_getelement(struct soap*, int*);"); - fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int);"); - if (!cflag && !namespaceid) - fprintf(fhead,"\n\n#ifdef __cplusplus\n}\n#endif"); - fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*);"); - - generate_header(table); - generate_schema(table); - - if (!Sflag && !iflag && !jflag) - { fprintf(fmsg, "Saving %s client calling stubs\n", pathsoapClient); - fclient=fopen(pathsoapClient,"w"); - if (!fclient) - execerror("Cannot write to file"); - copyrightnote(fclient, soapClient); - fprintf(fclient,"\n\n#if defined(__BORLANDC__)"); - fprintf(fclient,"\n#pragma option push -w-8060"); - fprintf(fclient,"\n#pragma option push -w-8004"); - fprintf(fclient,"\n#endif"); - fprintf(fclient,"\n#include \"%sH.h\"", prefix); - if (cflag) - fprintf(fclient,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); - if (namespaceid) - fprintf(fclient,"\n\nnamespace %s {", namespaceid); - identify(fclient, soapClient); - - if (!Lflag) - { flib=fopen(pathsoapClientLib,"w"); - if (!flib) - execerror("Cannot write to file"); - copyrightnote(flib, soapClientLib); - fprintf(fmsg, "Saving %s client stubs with serializers (use only for libs)\n", pathsoapClientLib); - fprintf(flib, "\n\n/** Use this file in your project build instead of the two files %s and %s. This hides the serializer functions and avoids linking problems when linking multiple clients and servers. */\n", soapC, soapClient); - fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); - fprintf(flib, "\n#define SOAP_FMAC3 static"); - fprintf(flib, "\n#include \"%s\"", soapC); - fprintf(flib, "\n#include \"%s\"", soapClient); - fprintf(flib, "\n\n/* End of %s */\n", soapClientLib); - fclose(flib); - } - } - if (!Cflag && !iflag && !jflag) - { fprintf(fmsg, "Saving %s server request dispatcher\n", pathsoapServer); - fserver=fopen(pathsoapServer,"w"); - if (!fserver) - execerror("Cannot write to file"); - copyrightnote(fserver, soapServer); - fprintf(fserver,"\n\n#if defined(__BORLANDC__)"); - fprintf(fserver,"\n#pragma option push -w-8060"); - fprintf(fserver,"\n#pragma option push -w-8004"); - fprintf(fserver,"\n#endif"); - fprintf(fserver,"\n#include \"%sH.h\"", prefix); - if (cflag) - fprintf(fserver,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); - if (namespaceid) - fprintf(fserver,"\n\nnamespace %s {", namespaceid); - identify(fserver, soapServer); - - if (!Lflag) - { flib = fopen(pathsoapServerLib,"w"); - if (!flib) - execerror("Cannot write to file"); - copyrightnote(flib, soapServerLib); - fprintf(fmsg, "Saving %s server request dispatcher with serializers (use only for libs)\n", pathsoapServerLib); - fprintf(flib, "\n\n/** Use this file in your project build instead of the two files %s and %s. This hides the serializer functions and avoids linking problems when linking multiple clients and servers. */\n", soapC, soapServer); - fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); - fprintf(flib, "\n#define SOAP_FMAC3 static"); - fprintf(flib, "\n#include \"%s\"", soapC); - fprintf(flib, "\n#include \"%s\"", soapServer); - fprintf(flib, "\n\n/* End of %s */\n", soapServerLib); - fclose(flib); - } - } - - if (!iflag && !jflag) - soap_serve(table); - - classflag = 0; - for (p = classtable->list; p; p = p->next) - { if (p->info.typ->type == Tclass && p->info.typ->transient <= 0) - { classflag = 1; - break; - } - } - if (classflag || Tptr[Ttemplate]) - { if (cflag) - semwarn("Option -c conflicts with the use of classes"); - } - - for (filenum = 1; partnum == 0; filenum++) - { - if (fflag) - { char *t = strrchr(pathsoapC, '.'); - sprintf(t-3, "%03d", filenum); - *t = '.'; - fprintf(fmsg, "Saving %s serializers (part %d)\n", pathsoapC, filenum); - partnum = fflag; /* number of defs per file */ - } - else - { fprintf(fmsg, "Saving %s serializers\n", pathsoapC); - partnum = 1; - } - fout=fopen(pathsoapC,"w"); - if (!fout) - execerror("Cannot write to file"); - copyrightnote(fout, soapC); - fprintf(fout,"\n\n#if defined(__BORLANDC__)"); - fprintf(fout,"\n#pragma option push -w-8060"); - fprintf(fout,"\n#pragma option push -w-8004"); - fprintf(fout,"\n#endif"); - - fprintf(fout,"\n\n#include \"%sH.h\"", prefix); - if (cflag) - fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); - if (namespaceid) - fprintf(fout,"\n\nnamespace %s {", namespaceid); - identify(fout, soapC); - - if (filenum == 1) - { - - if (!lflag) - { - fprintf(fout,"\n\n#ifndef WITH_NOGLOBAL"); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap *soap)\n{\n\tsoap->part = SOAP_IN_HEADER;\n\tsoap->header = soap_in_SOAP_ENV__Header(soap, \"SOAP-ENV:Header\", soap->header, NULL);\n\tsoap->part = SOAP_END_HEADER;\n\treturn soap->header == NULL;\n}"); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t{\tsoap->part = SOAP_IN_HEADER;\n\t\tif (soap_out_SOAP_ENV__Header(soap, \"SOAP-ENV:Header\", 0, soap->header, NULL))\n\t\t\treturn soap->error;\n\t\tsoap->part = SOAP_END_HEADER;\n\t}\n\treturn SOAP_OK;\n}"); - if (cflag) - { fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap_serialize_SOAP_ENV__Header(soap, soap->header);\n}"); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header))))\n\t\t\tsoap_default_SOAP_ENV__Header(soap, soap->header);\n\t}\n}"); - } - else if ((p = entry(classtable, lookup("SOAP_ENV__Header"))) && p->info.typ->type == Tstruct) - { fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap_serialize_SOAP_ENV__Header(soap, soap->header);\n}"); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = soap_new_SOAP_ENV__Header(soap, -1)))\n\t\t\tsoap_default_SOAP_ENV__Header(soap, soap->header);\n\t}\n}"); - } - else - { fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap->header->soap_serialize(soap);\n}"); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = soap_new_SOAP_ENV__Header(soap, -1)))\n\t\t\tsoap->header->soap_default(soap);\n\t}\n}"); - } - if (cflag) - { fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)\n{\n\tif (soap->fault == NULL)\n\t{\tsoap->fault = (struct SOAP_ENV__Fault*)soap_malloc(soap, sizeof(struct SOAP_ENV__Fault));\n\t\tif (soap->fault == NULL)\n\t\t\treturn;\n\t\tsoap_default_SOAP_ENV__Fault(soap, soap->fault);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Code)\n\t{\tsoap->fault->SOAP_ENV__Code = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code));\n\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)\n\t{\tsoap->fault->SOAP_ENV__Reason = (struct SOAP_ENV__Reason*)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason));\n\t\tsoap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);\n\t}\n}"); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tif (soap->fault)\n\t\tsoap_serialize_SOAP_ENV__Fault(soap, soap->fault);\n}"); - } - else if ((p = entry(classtable, lookup("SOAP_ENV__Fault"))) && p->info.typ->type == Tstruct) - { fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)\n{\n\tif (soap->fault == NULL)\n\t{\tsoap->fault = soap_new_SOAP_ENV__Fault(soap, -1);\n\t\tif (soap->fault == NULL)\n\t\t\treturn;\n\t\tsoap_default_SOAP_ENV__Fault(soap, soap->fault);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Code)\n\t{\tsoap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap, -1);\n\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)\n\t{\tsoap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap, -1);\n\t\tsoap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);\n\t}\n}"); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\tsoap_serialize_SOAP_ENV__Fault(soap, soap->fault);\n}"); - } - else - { fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)\n{\n\tif (soap->fault == NULL)\n\t{\tsoap->fault = soap_new_SOAP_ENV__Fault(soap, -1);\n\t\tsoap->fault->soap_default(soap);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Code)\n\t{\tsoap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap, -1);\n\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)\n\t{\tsoap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap, -1);\n\t\tsoap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);\n\t}\n}"); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\tsoap->fault->soap_serialize(soap);\n}"); - } - if ((p = entry(classtable, lookup("SOAP_ENV__Fault"))) && p->info.typ->type == Tstruct) - { fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap)\n{\n\tif (soap->fault)\n\t\treturn soap_put_SOAP_ENV__Fault(soap, soap->fault, \"SOAP-ENV:Fault\", NULL);\n\treturn SOAP_OK;\n}"); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap)\n{\n\treturn (soap->fault = soap_get_SOAP_ENV__Fault(soap, NULL, \"SOAP-ENV:Fault\", NULL)) == NULL;\n}"); - } - else - { fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\treturn soap->fault->soap_put(soap, \"SOAP-ENV:Fault\", NULL);\n\treturn SOAP_EOM;\n}"); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\treturn soap->fault->soap_get(soap, \"SOAP-ENV:Fault\", NULL) == NULL;\n\treturn SOAP_EOM;\n}"); - } - fprintf(fhead,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap);"); - fprintf(fout,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Code)\n\t\treturn (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value;\n\treturn (const char**)&soap->fault->faultcode;\n}"); - if (cflag) - fprintf(fout,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code));\n\t\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode);\n\t\t}\n\t\treturn (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;\n\t}\n\treturn (const char**)&soap->fault->faultcode;\n}"); - else - fprintf(fout,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = soap_new_SOAP_ENV__Code(soap, -1);\n\t\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode);\n\t\t}\n\t\treturn (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;\n\t}\n\treturn (const char**)&soap->fault->faultcode;\n}"); - fprintf(fout,"\n\nSOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultsubcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Code && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode)\n\t\t\treturn soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;\n\t\treturn NULL;\n\t}\n\treturn soap->fault->faultcode;\n}"); - fprintf(fout,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t\treturn (const char**)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text;\n\treturn (const char**)&soap->fault->faultstring;\n}"); - fprintf(fout,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap)\n{\n\tsoap_fault(soap);"); - if (has_Detail_string()) - { if (cflag) - fprintf(fout,"\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Detail == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail));\n\t\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail);\n\t\t}\n\t\treturn (const char**)&soap->fault->SOAP_ENV__Detail->__any;\n\t}"); - else - fprintf(fout,"\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Detail == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Detail = soap_new_SOAP_ENV__Detail(soap, -1);\n\t\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail);\n\t\t}\n\t\treturn (const char**)&soap->fault->SOAP_ENV__Detail->__any;\n\t}"); - } - if (has_detail_string()) - { if (cflag) - fprintf(fout,"\n\tif (soap->fault->detail == NULL)\n\t{\tsoap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail));\n\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->detail);\n\t}\n\treturn (const char**)&soap->fault->detail->__any;\n}"); - else - fprintf(fout,"\n\tif (soap->fault->detail == NULL)\n\t{\tsoap->fault->detail = soap_new_SOAP_ENV__Detail(soap, -1);\n\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->detail);\n\t}\n\treturn (const char**)&soap->fault->detail->__any;\n}"); - } - if (!has_detail_string() && !has_Detail_string()) - fprintf(fout,"\n\treturn NULL;\n}"); - fprintf(fout,"\n\nSOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultdetail(struct soap *soap)\n{\n\tsoap_fault(soap);"); - if (has_Detail_string()) - fprintf(fout,"\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Detail)\n\t\treturn soap->fault->SOAP_ENV__Detail->__any;"); - if (has_detail_string()) - fprintf(fout,"\n\tif (soap->fault->detail)\n\t\treturn soap->fault->detail->__any;"); - fprintf(fout,"\n\treturn NULL;\n}"); - fprintf(fout,"\n\n#endif"); - - fprintf(fout,"\n\n#ifndef WITH_NOIDREF"); - fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap)\n{"); - fprintf(fout,"\n\tint t;\n\tif (soap->version == 1)\n\t{\tfor (;;)\n\t\t{\tif (!soap_getelement(soap, &t))\n\t\t\t\tif (soap->error || soap_ignore_element(soap))\n\t\t\t\t\tbreak;\n\t\t}\n\t}"); - fprintf(fout,"\n\tif (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF)"); - fprintf(fout,"\n\t\tsoap->error = SOAP_OK;"); - fprintf(fout,"\n\treturn soap->error;"); - fprintf(fout,"\n}\n#endif"); - - if (!cflag && !namespaceid) - fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); - fprintf(fout,"\nSOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type)\n{\t(void)type;"); - fprintf(fout,"\n\tif (soap_peek_element(soap))\n\t\treturn NULL;"); - fprintf(fout,"\n#ifndef WITH_NOIDREF\n\tif (!*soap->id || !(*type = soap_lookup_type(soap, soap->id)))\n\t\t*type = soap_lookup_type(soap, soap->href);"); - fprintf(fout,"\n\tswitch (*type)\n\t{"); - DBGLOG(fprintf(stderr,"\n Calling in_defs( ).")); - fflush(fout); - in_defs(table); - DBGLOG(fprintf(stderr,"\n Completed in_defs( ).")); - fprintf(fout,"\n\tdefault:\n#else\n\t*type = 0;\n#endif"); - fprintf(fout,"\n\t{\tconst char *t = soap->type;\n\t\tif (!*t)\n\t\t\tt = soap->tag;"); - fflush(fout); - in_defs2(table); - fprintf(fout,"\n\t\tt = soap->tag;"); - in_defs3(table); - fprintf(fout,"\n#ifndef WITH_NOIDREF\n\t}\n#endif\n\t}\n\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}"); - if (!cflag && !namespaceid) - fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif"); - - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap)\n{"); - fprintf(fout,"\n\tif (!soap_peek_element(soap))"); - fprintf(fout,"\n\t{\tint t;"); - fprintf(fout,"\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Unexpected element '%%s' in input (level=%%u, %%d)\\n\", soap->tag, soap->level, soap->body));"); - fprintf(fout,"\n\t\tif (soap->mustUnderstand && !soap->other)"); - fprintf(fout,"\n\t\t\treturn soap->error = SOAP_MUSTUNDERSTAND;"); - fprintf(fout,"\n\t\tif (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, \"SOAP-ENV:\"))\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"REJECTING element '%%s'\\n\", soap->tag));\n\t\t\treturn soap->error = SOAP_TAG_MISMATCH;\n\t\t}"); - fprintf(fout,"\n\t\tif (!*soap->id || !soap_getelement(soap, &t))"); - fprintf(fout,"\n\t\t{\tsoap->peeked = 0;"); - fprintf(fout,"\n\t\t\tif (soap->fignore)\n\t\t\t\tsoap->error = soap->fignore(soap, soap->tag);\n\t\t\telse\n\t\t\t\tsoap->error = SOAP_OK;"); - fprintf(fout,"\n\t\t\tDBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, \"IGNORING element '%%s'\\n\", soap->tag));"); - fprintf(fout,"\n\t\t\tif (!soap->error && soap->body)"); - fprintf(fout,"\n\t\t\t{\tsoap->level++;"); - fprintf(fout,"\n\t\t\t\twhile (!soap_ignore_element(soap))"); - fprintf(fout,"\n\t\t\t\t\t;"); - fprintf(fout,"\n\t\t\t\tif (soap->error == SOAP_NO_TAG)"); - fprintf(fout,"\n\t\t\t\t\tsoap->error = soap_element_end_in(soap, NULL);"); - fprintf(fout,"\n\t\t\t}"); - fprintf(fout,"\n\t\t}"); - fprintf(fout,"\n\t}"); - fprintf(fout,"\n\treturn soap->error;"); - fprintf(fout,"\n}"); - - fprintf(fout,"\n\n#ifndef WITH_NOIDREF"); - fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap *soap)\n{\n\tint i;\n\tstruct soap_plist *pp;"); - fprintf(fout,"\n\tif (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH)))"); - fprintf(fout,"\n\t\tfor (i = 0; i < SOAP_PTRHASH; i++)"); - fprintf(fout,"\n\t\t\tfor (pp = soap->pht[i]; pp; pp = pp->next)"); - fprintf(fout,"\n\t\t\t\tif (pp->mark1 == 2 || pp->mark2 == 2)"); - fprintf(fout,"\n\t\t\t\t\tif (soap_putelement(soap, pp->ptr, \"id\", pp->id, pp->type))\n\t\t\t\t\t\treturn soap->error;"); - fprintf(fout,"\n\treturn SOAP_OK;\n}\n#endif"); - - if (!cflag && !namespaceid) - fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); - fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap *soap, const void *ptr, const char *tag, int id, int type)\n{\t(void)tag;"); - fprintf(fout,"\n\tswitch (type)\n\t{"); - fflush(fout); - out_defs(table); - fprintf(fout,"\n\t}\n\treturn SOAP_OK;\n}"); - if (!cflag && !namespaceid) - fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif"); - - fprintf(fout,"\n\n#ifndef WITH_NOIDREF"); - if (!cflag && !namespaceid) - fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); - if (is_anytype_flag) - { fprintf(fout,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{"); - fprintf(fout,"\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */"); - fprintf(fout,"\n\tswitch (type)\n\t{"); - fflush(fout); - mark_defs(table); - fprintf(fout,"\n\t}\n}"); - } - else - { fprintf(fout,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{"); - fprintf(fout,"\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */"); - fprintf(fout,"\n}"); - } - if (!cflag && !namespaceid) - fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif"); - fprintf(fout,"\n#endif"); - - } - - if (!cflag) - { - fprintf(fhead,"\n\nSOAP_FMAC3 void * SOAP_FMAC4 %s_instantiate(struct soap*, int, const char*, const char*, size_t*);", prefix); - fprintf(fout,"\n\nSOAP_FMAC3 void * SOAP_FMAC4 %s_instantiate(struct soap *soap, int t, const char *type, const char *arrayType, size_t *n)\n{\t(void)type;\n\tswitch (t)\n\t{", prefix); - if (classtable) - for (p = classtable->list; p; p = p->next) - if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) - { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) - fprintf(fout,"\n#ifndef WITH_NOGLOBAL"); - fprintf(fout,"\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(p->info.typ), c_ident(p->info.typ)); - if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) - fprintf(fout,"\n#endif"); - } - if (typetable) - for (p = typetable->list; p; p = p->next) - if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) - { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) - fprintf(fout,"\n#ifndef WITH_NOGLOBAL"); - fprintf(fout,"\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(p->info.typ), c_ident(p->info.typ)); - if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) - fprintf(fout,"\n#endif"); - } - for (typ = Tptr[Ttemplate]; typ; typ = typ->next) - if (typ->ref && !is_transient(typ)) - fprintf(fout,"\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(typ), c_ident(typ)); - - fprintf(fout,"\n\t}\n\treturn NULL;\n}"); - - fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap_clist*);", prefix); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap_clist *p)", prefix); - fprintf(fout,"\n{\tswitch (p->type)\n\t{"); - if (classtable) - { for (p = classtable->list; p; p = p->next) - if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) - { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) - fprintf(fout,"\n#ifndef WITH_NOGLOBAL"); - fprintf(fout,"\n\tcase %s:", soap_type(p->info.typ)); - fprintf(fout,"\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE((%s*)p->ptr);\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY((%s*)p->ptr);\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); - if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) - fprintf(fout,"\n#endif"); - } - } - if (typetable) - { for (p = typetable->list; p; p = p->next) - if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct) /* && is_external(p->info.typ)) */ - { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) - fprintf(fout,"\n#ifndef WITH_NOGLOBAL"); - fprintf(fout,"\n\tcase %s:", soap_type(p->info.typ)); - fprintf(fout,"\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE((%s*)p->ptr);\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY((%s*)p->ptr);\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); - if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) - fprintf(fout,"\n#endif"); - } - } - for (typ = Tptr[Ttemplate]; typ; typ = typ->next) - { if (typ->ref && !is_transient(typ)) - { fprintf(fout,"\n\tcase %s:", soap_type(typ)); - fprintf(fout,"\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE((%s*)p->ptr);\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY((%s*)p->ptr);\n\t\tbreak;", c_type(typ), c_type(typ)); - } - } - fprintf(fout,"\n\tdefault:\treturn SOAP_ERR;"); - fprintf(fout,"\n\t}\n\treturn SOAP_OK;"); - fprintf(fout,"\n}"); - - fprintf(fhead,"\nSOAP_FMAC3 void* SOAP_FMAC4 soap_class_id_enter(struct soap*, const char*, void*, int, size_t, const char*, const char*);"); - if (!lflag) - { - fprintf(fout,"\n\nSOAP_FMAC3 void* SOAP_FMAC4 soap_class_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType)"); - fprintf(fout, "\n{\treturn soap_id_enter(soap, id, p, t, n, 0, type, arrayType, %s_instantiate);\n}", prefix); - } - - if (Tptr[Ttemplate]) - { - fprintf(fhead, "\n\nSOAP_FMAC3 void* SOAP_FMAC4 soap_container_id_forward(struct soap*, const char*, void*, size_t, int, int, size_t, unsigned int);"); - if (!lflag) - { - fprintf(fout, "\n\nSOAP_FMAC3 void* SOAP_FMAC4 soap_container_id_forward(struct soap *soap, const char *href, void *p, size_t len, int st, int tt, size_t n, unsigned int k)"); - fprintf(fout, "\n{\treturn soap_id_forward(soap, href, p, len, st, tt, n, k, %s_container_insert);\n}", prefix); - } - - fprintf(fhead, "\n\nSOAP_FMAC3 void SOAP_FMAC4 %s_container_insert(struct soap*, int, int, void*, size_t, const void*, size_t);", prefix); - if (!lflag) - { - fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 %s_container_insert(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n)", prefix); - fprintf(fout, "\n#ifdef WIN32\n#pragma warning(push)\n#pragma warning(disable:4065)\n#endif"); - fprintf(fout,"\n{\n\t(void)soap; (void)st; (void)p; (void)len; (void)q; (void)n; /* appease -Wall -Werror */"); - fprintf(fout, "\n\tswitch (tt)\n\t{"); - for (typ = Tptr[Ttemplate]; typ; typ = typ->next) - { if (typ->ref && !is_transient(typ)) - { fprintf(fout, "\n\tcase %s:", soap_type(typ)); - fprintf(fout, "\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Container %s_container_insert type=%%d in %%d location=%%p object=%%p len=%%lu\\n\", st, tt, p, q, (unsigned long)len));", prefix); - if (!strcmp(typ->id->name, "std::vector") || !strcmp(typ->id->name, "std::deque")) - fprintf(fout, "\n\t\t(*(%s)p)[len] = *(%s)q;", c_type_id(typ, "*"), c_type_id((Tnode*)typ->ref, "*")); - else - fprintf(fout, "\n\t\t((%s)p)->insert(((%s)p)->end(), *(%s)q);", c_type_id(typ, "*"), c_type_id(typ, "*"), c_type_id((Tnode*)typ->ref, "*")); - fprintf(fout, "\n\t\tbreak;"); - } - } - fprintf(fout, "\n\tdefault:\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Could not insert type=%%d in %%d\\n\", st, tt));"); - fprintf(fout, "\n\t}"); - fprintf(fout, "\n#ifdef WIN32\n#pragma warning(pop)\n#endif"); - fprintf(fout, "\n}"); - } - } - } - } - - def_table(table); - - if (namespaceid) - fprintf(fout,"\n\n} // namespace %s\n", namespaceid); - if (cflag) - fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif"); - fprintf(fout,"\n\n#if defined(__BORLANDC__)"); - fprintf(fout,"\n#pragma option pop"); - fprintf(fout,"\n#pragma option pop"); - fprintf(fout,"\n#endif"); - fprintf(fout, "\n\n/* End of %s */\n", soapC); - fclose(fout); - } - - if (namespaceid) - fprintf(fhead,"\n\n} // namespace %s\n", namespaceid); - if (cflag) - fprintf(fhead,"\n\n#ifdef __cplusplus\n}\n#endif"); - fprintf(fhead, "\n\n#endif"); - fprintf(fhead, "\n\n/* End of %s */\n", soapH); - fclose(fhead); - - if (namespaceid) - fprintf(fheader,"\n\n} // namespace %s\n", namespaceid); - if (cflag) - fprintf(fheader,"\n\n#ifdef __cplusplus\n}\n#endif"); - fprintf(fheader, "\n\n#endif"); - fprintf(fheader, "\n\n/* End of %s */\n", soapStub); - fclose(fheader); - - if (mflag) - { DBGLOG(fprintf(stderr,"\n Calling matlab_def_table( ).")); - matlab_def_table(table); - DBGLOG(fprintf(stderr,"\n Completed matlab_def_table( ).")); - fclose(fmatlab); - fclose(fmheader); - } - - if (!Sflag && !iflag && !jflag) - { if (namespaceid) - fprintf(fclient,"\n\n} // namespace %s\n", namespaceid); - if (cflag) - fprintf(fclient,"\n\n#ifdef __cplusplus\n}\n#endif"); - fprintf(fclient,"\n\n#if defined(__BORLANDC__)"); - fprintf(fclient,"\n#pragma option pop"); - fprintf(fclient,"\n#pragma option pop"); - fprintf(fclient,"\n#endif"); - fprintf(fclient, "\n\n/* End of %s */\n", soapClient); - fclose(fclient); - } - - if (!Cflag && !iflag && !jflag) - { if (namespaceid) - fprintf(fserver,"\n\n} // namespace %s\n", namespaceid); - if (cflag) - fprintf(fserver,"\n\n#ifdef __cplusplus\n}\n#endif"); - fprintf(fserver,"\n\n#if defined(__BORLANDC__)"); - fprintf(fserver,"\n#pragma option pop"); - fprintf(fserver,"\n#pragma option pop"); - fprintf(fserver,"\n#endif"); - fprintf(fserver, "\n\n/* End of %s */\n", soapServer); - fclose(fserver); - } -} - -void -gen_class(FILE *fd, Entry *p) -{ Entry *Eptr; - Tnode *typ = p->info.typ; - char *x; - x = xsi_type(typ); - if (!x || !*x) - x = wsdl_type(typ, ""); - typ->classed = True; - if (is_header_or_fault(typ) || is_body(typ)) - fprintf(fd, "\n\n#ifndef WITH_NOGLOBAL"); - if (typ->ref) - { fprintf(fd, "\n\n#ifndef %s", soap_type(typ)); - fprintf(fd, "\n#define %s (%d)\n",soap_type(typ),typ->num); - } - else - fprintf(fd, "\n\n"); - if (is_volatile(typ)) - fprintf(fd, "#if 0 /* volatile type: do not declare here, declared elsewhere */\n"); - else if (is_transient(typ) && typ->ref) - fprintf(fd, "/* Transient type: */\n"); - else if (is_invisible(typ->id->name) && typ->ref) - fprintf(fd, "/* Operation wrapper: */\n"); - else if (is_hexBinary(typ)) - fprintf(fd, "/* hexBinary schema type: */\n"); - else if (is_binary(typ)) - fprintf(fd, "/* Base64 schema type: */\n"); - else if (is_discriminant(typ)) - fprintf(fd, "/* Choice: */\n"); - else if (is_dynamic_array(typ)) - { Eptr = ((Table*)typ->ref)->list; - if (has_ns(typ) || is_untyped(typ)) - fprintf(fd, "/* Sequence of %s schema type: */\n", x); - else - { if (!eflag) - { sprintf(errbuf, "array '%s' is not compliant with WS-I Basic Profile 1.0a, reason: SOAP encoded array", c_type(typ)); - compliancewarn(errbuf); - } - fprintf(fd, "/* SOAP encoded array of %s schema type: */\n", x); - } - } - else if (is_primclass(typ)) - fprintf(fd, "/* Primitive %s schema type: */\n", x); - else if (!strcmp(typ->id->name, "SOAP_ENV__Header")) - fprintf(fd, "/* SOAP Header: */\n"); - else if (!strcmp(typ->id->name, "SOAP_ENV__Fault")) - fprintf(fd, "/* SOAP Fault: */\n"); - else if (!strcmp(typ->id->name, "SOAP_ENV__Code")) - fprintf(fd, "/* SOAP Fault Code: */\n"); - else if (x && *x && typ->ref) - fprintf(fd, "/* %s */\n", x); - fflush(fd); - if (typ->type == Tstruct) - { DBGLOG(fprintf(stderr,"\nstruct %s\n", typ->id->name)); - if (typ->ref) - { int permission = -1; - fprintf(fd, "struct %s\n{", ident(typ->id->name)); - for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) - { if (!cflag && permission != (Eptr->info.sto & (Sprivate | Sprotected))) - { if (Eptr->info.sto & Sprivate) - fprintf(fd, "\nprivate:"); - else if (Eptr->info.sto & Sprotected) - fprintf(fd, "\nprotected:"); - else - fprintf(fd, "\npublic:"); - permission = (Eptr->info.sto & (Sprivate | Sprotected)); - } - if (cflag && Eptr->info.typ->type == Tfun) - continue; - if (cflag && (Eptr->info.sto & Stypedef)) - continue; - fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto)); - /*if (Eptr->info.typ->type == Tclass && !is_external(Eptr->info.typ) && Eptr->info.typ->classed == False || (Eptr->info.typ->type == Tpointer || Eptr->info.typ->type == Treference) && Eptr->info.typ->ref && ((Tnode*)Eptr->info.typ->ref)->type == Tclass && !is_external(Eptr->info.typ->ref) && ((Tnode*)Eptr->info.typ->ref)->classed == False) - fprintf(fd, "class "); - */ - if (Eptr->sym == typ->id && Eptr->info.typ->type == Tfun) /* a hack to emit constructor in a struct, where constructor has no return value */ - ((FNinfo*)Eptr->info.typ->ref)->ret = mknone(); - fprintf(fd, "%s", c_type_id(Eptr->info.typ,Eptr->sym->name)); - if (Eptr->info.sto & Sconst) - fprintf(fd, "%s;", c_init(Eptr)); - else if (Eptr->info.sto & Sconstobj) - fprintf(fd, " const;"); - else - fprintf(fd, ";"); - if (Eptr->info.sto & Sreturn) - fprintf(fd, "\t/* SOAP 1.2 RPC return element (when namespace qualified) */"); - if (is_external(Eptr->info.typ)) - fprintf(fd, "\t/* external */"); - if (is_transient(Eptr->info.typ)) - fprintf(fd, "\t/* transient */"); - if (is_imported(Eptr->info.typ)) - fprintf(fd, "\t/* type imported from %s */", Eptr->info.typ->imported); - if (Eptr->info.sto & Sattribute) - { if (Eptr->info.minOccurs >= 1) - fprintf(fd, "\t/* required attribute of type %s */", wsdl_type(Eptr->info.typ, "")); - else - fprintf(fd, "\t/* optional attribute of type %s */", wsdl_type(Eptr->info.typ, "")); - } - if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fd, "\t/* not serialized */"); - else if (Eptr->info.sto & SmustUnderstand) - fprintf(fd, "\t/* mustUnderstand */"); - else if (!is_dynamic_array(typ) && is_repetition(Eptr)) - { if (Eptr->info.maxOccurs > 1) - fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements <%s> */", Eptr->info.minOccurs, Eptr->info.maxOccurs, ns_convert(Eptr->next->sym->name)); - else - fprintf(fd, "\t/* sequence of elements <%s> */", ns_convert(Eptr->next->sym->name)); - } - else if (is_anytype(Eptr)) - fprintf(fd, "\t/* any type of element <%s> (defined below) */", ns_convert(Eptr->next->sym->name)); - else if (is_choice(Eptr)) - fprintf(fd, "\t/* union discriminant (of union defined below) */"); - else if (Eptr->info.typ->type != Tfun && !(Eptr->info.sto & (Sconst | Sprivate | Sprotected)) && !(Eptr->info.sto & Sattribute) && !is_transient(Eptr->info.typ) && !is_external(Eptr->info.typ) && strncmp(Eptr->sym->name, "__", 2)) - { if (Eptr->info.maxOccurs > 1) - fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements of type %s */", Eptr->info.minOccurs, Eptr->info.maxOccurs, wsdl_type(Eptr->info.typ, "")); - else if (Eptr->info.minOccurs >= 1) - fprintf(fd, "\t/* required element of type %s */", wsdl_type(Eptr->info.typ, "")); - else - fprintf(fd, "\t/* optional element of type %s */", wsdl_type(Eptr->info.typ, "")); - } - if (!is_dynamic_array(typ) && !is_primclass(typ)) - { if (!strncmp(Eptr->sym->name, "__size", 6)) - { if (!Eptr->next || Eptr->next->info.typ->type != Tpointer) - { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in struct '%s'", Eptr->sym->name, typ->id->name); - semwarn(errbuf); - } - } - else if (!strncmp(Eptr->sym->name, "__type", 6)) - { if (!Eptr->next || ((Eptr->next->info.typ->type != Tpointer || ((Tnode*)Eptr->next->info.typ->ref)->type != Tvoid))) - { sprintf(errbuf, "Member field '%s' is not followed by a void pointer or union member field in struct '%s'", Eptr->sym->name, typ->id->name); - semwarn(errbuf); - } - } - } - } - if (!cflag && !is_transient(typ) && !is_volatile(typ)) - { fprintf(fd,"\npublic:\n\tint soap_type() const { return %d; } /* = unique type id %s */", typ->num, soap_type(typ)); -#if 0 - /* ctor not allowed in unions, so keep things simple for structs */ - if (!has_constructor(typ)) - { fprintf(fd,"\n\t %s()", ident(typ->id->name)); - fprintf(fd, " { void soap_default_%s(struct soap*, %s); soap_default_%s(NULL, this); }", c_ident(typ), c_type_id(typ, "*"), c_ident(typ)); - } - if (!has_destructor(typ)) - fprintf(fd,"\n\tvirtual ~%s() { }", ident(typ->id->name)); -#endif - } - if (!((Table*)typ->ref)->list) - { if (cflag) - fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\n\tchar dummy;\t/* dummy member to enable compilation */\n#endif"); - else - fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\nprivate:\n\tchar dummy;\t/* dummy member to enable compilation */\n#endif"); - } - fprintf(fd, "\n};"); - } - else if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ)) - { sprintf(errbuf, "struct '%s' is empty", typ->id->name); - semwarn(errbuf); - } - } - else if (typ->type == Tclass) - { DBGLOG(fprintf(stderr,"\nclass %s\n", typ->id->name)); - if (typ->ref) - { int permission = -1; - fprintf(fd,"class SOAP_CMAC %s", ident(typ->id->name)); - if (typ->base) - fprintf(fd," : public %s", ident(typ->base->name)); - fprintf(fd,"\n{"); - for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) - { if (permission != (Eptr->info.sto & (Sprivate | Sprotected))) - { if (Eptr->info.sto & Sprivate) - fprintf(fd, "\nprivate:"); - else if (Eptr->info.sto & Sprotected) - fprintf(fd, "\nprotected:"); - else - fprintf(fd, "\npublic:"); - permission = (Eptr->info.sto & (Sprivate | Sprotected)); - } - fprintf(fd,"\n\t%s", c_storage(Eptr->info.sto)); - /* if (Eptr->info.typ->type == Tclass && !is_external(Eptr->info.typ) && Eptr->info.typ->classed == False || (Eptr->info.typ->type == Tpointer || Eptr->info.typ->type == Treference) && Eptr->info.typ->ref && ((Tnode*)Eptr->info.typ->ref)->type == Tclass && !is_external(Eptr->info.typ->ref) && ((Tnode*)Eptr->info.typ->ref)->classed == False) - fprintf(fd, "class "); - */ - fprintf(fd,"%s", c_type_id(Eptr->info.typ,Eptr->sym->name)); - if (Eptr->info.sto & Sconstobj) - fprintf(fd, " const"); - if (Eptr->info.sto & Sconst) - fprintf(fd, "%s;", c_init(Eptr)); - else if (Eptr->info.sto & Sabstract) - fprintf(fd, " = 0;"); - else - fprintf(fd, ";"); - if (Eptr->info.sto & Sreturn) - fprintf(fd, "\t/* SOAP 1.2 RPC return element (when namespace qualified) */"); - if (is_external(Eptr->info.typ)) - fprintf(fd, "\t/* external */"); - if (is_transient(Eptr->info.typ)) - fprintf(fd, "\t/* transient */"); - if (is_imported(Eptr->info.typ)) - fprintf(fd, "\t/* type imported from %s */", Eptr->info.typ->imported); - if (Eptr->info.sto & Sattribute) - { if (Eptr->info.minOccurs >= 1) - fprintf(fd, "\t/* required attribute */"); - else - fprintf(fd, "\t/* optional attribute */"); - } - if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fd, "\t/* not serialized */"); - else if (Eptr->info.sto & SmustUnderstand) - fprintf(fd, "\t/* mustUnderstand */"); - else if (!is_dynamic_array(typ) && is_repetition(Eptr)) - { if (Eptr->info.maxOccurs > 1) - fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements <%s> */", Eptr->info.minOccurs, Eptr->info.maxOccurs, ns_convert(Eptr->next->sym->name)); - else - fprintf(fd, "\t/* sequence of elements <%s> */", ns_convert(Eptr->next->sym->name)); - } - else if (is_anytype(Eptr)) - fprintf(fd, "\t/* any type of element <%s> (defined below) */", ns_convert(Eptr->next->sym->name)); - else if (is_choice(Eptr)) - fprintf(fd, "\t/* union discriminant (of union defined below) */"); - else if (Eptr->info.typ->type != Tfun && !(Eptr->info.sto & (Sconst | Sprivate | Sprotected)) && !(Eptr->info.sto & Sattribute) && !is_transient(Eptr->info.typ) && !is_external(Eptr->info.typ) && strncmp(Eptr->sym->name, "__", 2)) - { if (Eptr->info.maxOccurs > 1) - fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements */", Eptr->info.minOccurs, Eptr->info.maxOccurs); - else if (Eptr->info.minOccurs >= 1) - fprintf(fd, "\t/* required element of type %s */", wsdl_type(Eptr->info.typ, "")); - else - fprintf(fd, "\t/* optional element of type %s */", wsdl_type(Eptr->info.typ, "")); - } - if (!is_dynamic_array(typ) && !is_primclass(typ)) - { if (!strncmp(Eptr->sym->name, "__size", 6)) - { if (!Eptr->next || Eptr->next->info.typ->type != Tpointer) - { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in struct '%s'", Eptr->sym->name, typ->id->name); - semwarn(errbuf); - } - } - else if (!strncmp(Eptr->sym->name, "__type", 6)) - { if (!Eptr->next || ((Eptr->next->info.typ->type != Tpointer || ((Tnode*)Eptr->next->info.typ->ref)->type != Tvoid))) - { sprintf(errbuf, "Member field '%s' is not followed by a void pointer or union member field in struct '%s'", Eptr->sym->name, typ->id->name); - semwarn(errbuf); - } - } - } - } - if (!is_transient(typ) && !is_volatile(typ)) - { fprintf(fd,"\npublic:\n\tvirtual int soap_type() const { return %d; } /* = unique type id %s */", typ->num, soap_type(typ)); - fprintf(fd,"\n\tvirtual void soap_default(struct soap*);"); - fprintf(fd,"\n\tvirtual void soap_serialize(struct soap*) const;"); - if (kflag) - fprintf(fd,"\n\tvirtual void soap_traverse(struct soap*, const char *s, soap_walker, soap_walker);"); - fprintf(fd,"\n\tvirtual int soap_put(struct soap*, const char*, const char*) const;"); - fprintf(fd,"\n\tvirtual int soap_out(struct soap*, const char*, int, const char*) const;"); - fprintf(fd,"\n\tvirtual void *soap_get(struct soap*, const char*, const char*);"); - fprintf(fd,"\n\tvirtual void *soap_in(struct soap*, const char*, const char*);"); - if (!has_constructor(typ)) - { fprintf(fd,"\n\t %s()", ident(typ->id->name)); - fprintf(fd, " { %s::soap_default(NULL); }", ident(typ->id->name)); - } - if (!has_destructor(typ)) - fprintf(fd,"\n\tvirtual ~%s() { }", ident(typ->id->name)); - /* the use of 'friend' causes problems linking static functions. Adding these friends could enable serializing protected/private members (which is not implemented) - fprintf(fd,"\n\tfriend %s *soap_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", typ->id->name, typ->id->name); - fprintf(fd,"\n\tfriend %s *soap_in_%s(struct soap*, const char*, %s*, const char*);", typ->id->name, typ->id->name, typ->id->name); - fprintf(fd,"\n\tfriend int soap_out_%s(struct soap*, const char*, int, const %s*, const char*);", typ->id->name, typ->id->name); - */ - } - else if (!((Table*)typ->ref)->list) - fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\nprivate:\n\tchar dummy;\t/* dummy member to enable compilation */\n#endif"); - fprintf(fd,"\n};"); - } - else if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ)) - { sprintf(errbuf, "class '%s' is empty", typ->id->name); - semwarn(errbuf); - } - } - else if (typ->type == Tunion) - { int i = 1; - if (typ->ref) - { fprintf(fd, "union %s\n{", ident(typ->id->name)); - for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) - { fprintf(fd, "\n#define SOAP_UNION_%s_%s\t(%d)", c_ident(typ), ident(Eptr->sym->name), i); - i++; - fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto)); - fprintf(fd, "%s;", c_type_id(Eptr->info.typ,Eptr->sym->name)); - if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fd, "\t/* const field cannot be deserialized */"); - if (is_external(Eptr->info.typ)) - fprintf(fd, "\t/* external */"); - if (is_transient(Eptr->info.typ)) - fprintf(fd, "\t/* transient */"); - if (Eptr->info.sto & Sattribute) - { fprintf(fd, "\t/* attribute not allowed in union */"); - sprintf(errbuf, "union '%s' contains attribute declarations", typ->id->name); - semwarn(errbuf); - } - if (Eptr->info.sto & SmustUnderstand) - fprintf(fd, "\t/* mustUnderstand */"); - } - fprintf(fd, "\n};"); - } - else if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ)) - { sprintf(errbuf, "union '%s' is empty", typ->id->name); - semwarn(errbuf); - } - } - if (is_volatile(typ)) - fprintf(fd, "\n#endif"); - if ((typ->type == Tstruct || typ->type == Tunion) && p->sym->token == TYPE) - fprintf(fd, "\ntypedef %s %s;", c_type(typ), ident(p->sym->name)); - if (typ->ref) - fprintf(fd, "\n#endif"); - if (is_header_or_fault(typ) || is_body(typ)) - fprintf(fd, "\n\n#endif"); - fflush(fd); -} - -void -generate_header(Table *t) -{ Entry *p, *q; - banner(fheader, "Enumerations"); - fflush(fheader); - if (enumtable) - for (p = enumtable->list; p; p = p->next) - { char *x; - if (is_imported(p->info.typ) || (is_transient(p->info.typ) && !p->info.typ->ref)) - continue; - x = xsi_type(p->info.typ); - if (!x || !*x) - x = wsdl_type(p->info.typ, ""); - fprintf(fheader, "\n\n#ifndef %s", soap_type(p->info.typ)); - fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num); - if (is_volatile(p->info.typ)) - fprintf(fheader, "\n#if 0 /* volatile type: do not redeclare here */"); - if (is_mask(p->info.typ)) - fprintf(fheader, "\n/* Bitmask %s */", x); - else - fprintf(fheader, "\n/* %s */", x); - fprintf(fheader, "\nenum %s { ", ident(p->info.typ->id->name)); - if ((Table*)p->info.typ->ref) - { const char *c = ""; - for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) - { if (q->info.val.i <= 0x7FFFLL && q->info.val.i >= -0x8000LL) - fprintf(fheader, "%s%s = " SOAP_LONG_FORMAT, c, ident(q->sym->name), q->info.val.i); - else - fprintf(fheader, "%s%s = " SOAP_LONG_FORMAT "LL", c, ident(q->sym->name), q->info.val.i); - c = ", "; - } - } - fprintf(fheader, " };"); - if (p->sym->token == TYPE) - fprintf(fheader, "\ntypedef %s %s;", c_type(p->info.typ), ident(p->sym->name)); - if (is_volatile(p->info.typ)) - fprintf(fheader, "\n#endif"); - fprintf(fheader, "\n#endif"); - } - banner(fheader, "Types with Custom Serializers"); - fflush(fheader); - if (typetable) - for (p = typetable->list; p; p = p->next) - { if (is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_imported(p->info.typ)) - { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); - fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num); - fprintf(fheader, "\n%s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); - fprintf(fheader, "\n#endif"); - } - } - if (typetable) - for (p = typetable->list; p; p = p->next) - { if (p->info.typ->type == Tclass && is_eq(p->info.typ->sym->name, "xsd__QName") && !is_external(p->info.typ) && !is_imported(p->info.typ)) - { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); - fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num); - fprintf(fheader,"\n%sstd::string %s;", c_storage(p->info.sto), p->sym->name); - fprintf(fheader, "\n#endif\n"); - } - } - banner(fheader, "Classes and Structs"); - fflush(fheader); - if (classtable) - for (p = classtable->list; p; p = p->next) - { if (!is_imported(p->info.typ)) - gen_class(fheader, p); - } - banner(fheader, "Typedefs"); - fflush(fheader); - if (typetable) - for (p = typetable->list; p; p = p->next) - { if (!is_primitive_or_string(p->info.typ) && !is_external(p->info.typ) && !is_XML(p->info.typ) && !is_transient(p->info.typ) && !has_ns_t(p->info.typ) && !is_imported(p->info.typ) && !is_template(p->info.typ)) - { sprintf(errbuf, "typedef '%s' is not namespace qualified: schema definition for '%s' in WSDL file output may be invalid", p->sym->name, p->sym->name); - semwarn(errbuf); - } - if (p->info.typ->type == Tclass && is_eq(p->info.typ->sym->name, "xsd__QName") && !is_external(p->info.typ) && !is_imported(p->info.typ)) - continue; - if (!is_external(p->info.typ) && !is_imported(p->info.typ)) - { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); - fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num); - fprintf(fheader,"\n%s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); - fprintf(fheader, "\n#endif\n"); - } - } - banner(fheader, "Externals"); - fflush(fheader); - if (t) - for (p = t->list; p; p = p->next) - if (p->info.typ->type != Tfun || p->info.sto & Sextern) - { fprintf(fheader,"\n\nextern %s", c_storage(p->info.sto)); - fprintf(fheader,"%s;", c_type_id(p->info.typ, p->sym->name)); - } - fflush(fheader); -} - -void -get_namespace_prefixes(void) -{ Symbol *p, *q; - int i, n; - char *s, buf[256]; - if (nslist) - return; - for (p = symlist; p; p = p->next) - { if (*p->name != '~') - { s = p->name; - while (*s == '_') - s++; - n = (int)(strlen(s) - 2); - for (i = 1; i < n; i++) - { if (s[i] == ':' - || (s[i-1] != '_' && s[i] == '_' && s[i+1] == '_' && s[i+2] && s[i+2] != '_') - || (s[i-1] != '_' && (!strncmp(s+i, "___DOT", 6) - || !strncmp(s+i, "___USCORE", 9) - || (!strncmp(s+i, "___x", 4) && isxdigit(s[i+4]) && isxdigit(s[i+5]) && isxdigit(s[i+6]) && isxdigit(s[i+7]))))) - { if (s[i+1] == ':') - { i++; - continue; - } - strncpy(buf, s, i); - buf[i] = '\0'; - if (!strcmp(buf, "SOAP_ENV") || !strcmp(buf, "SOAP_ENC") || !strcmp(buf, "xsd") || !strcmp(buf, "xsi") || !strcmp(buf, "xml") || !strcmp(buf, "std") || !strncmp(buf, "soap_", 5)) - goto nsnext; - for (q = nslist; q; q = q->next) - if (!strcmp(q->name, buf)) - goto nsnext; - q = (Symbol*)emalloc(sizeof(Symbol)); - q->name = (char*)emalloc(i+1); - strcpy(q->name, buf); - q->name[i] = '\0'; - q->next = nslist; - nslist = q; - break; - } - } - } -nsnext: - ; - } - q = (Symbol*)emalloc(sizeof(Symbol)); - q->name = "xsd"; - q->next = nslist; - nslist = q; - q = (Symbol*)emalloc(sizeof(Symbol)); - q->name = "xsi"; - q->next = nslist; - nslist = q; - q = (Symbol*)emalloc(sizeof(Symbol)); - q->name = "SOAP-ENC"; - q->next = nslist; - nslist = q; - q = (Symbol*)emalloc(sizeof(Symbol)); - q->name = "SOAP-ENV"; - q->next = nslist; - nslist = q; -} - -void -generate_schema(Table *t) -{ Entry *p; - Symbol *ns; - char *name = NULL; - char *URL = NULL; - char *executable = NULL; - char *URI = NULL; - char *style = NULL; - char *encoding = NULL; - char *protocol = NULL; - char *import = NULL; - Service *sp = NULL; - char buf[1024]; - FILE *fd; - int flag = 0; - get_namespace_prefixes(); - for (ns = nslist; ns; ns = ns->next) - { if (!strcmp(ns->name, "SOAP-ENV") || !strcmp(ns->name, "SOAP-ENC") || !strcmp(ns->name, "xsi") || !strcmp(ns->name, "xsd")) - continue; - name = NULL; - URL = NULL; - executable = NULL; - URI = NULL; - style = NULL; - encoding = NULL; - import = NULL; - for (sp = services; sp; sp = sp->next) - { if (!tagcmp(sp->ns, ns->name)) - { name = ns_cname(sp->name, NULL); - URL = sp->URL; - executable = sp->executable; - URI = sp->URI; - style = sp->style; - encoding = sp->encoding; - protocol = sp->protocol; - import = sp->import; - break; - } - } - if (!URI) - { URI = emalloc(strlen(tmpURI) + strlen(ns->name) + 6); - sprintf(URI, "%s/%s.xsd", tmpURI, ns_convert(ns->name)); - } - if (vflag >= 0 && is_document(style) && encoding && !*encoding) - { semwarn("Cannot use document style with SOAP encoding"); - encoding = NULL; - } - if (!name) - name = "Service"; - if (!URL) - URL = "http://localhost:80"; - if (!import) - flag = 1; - if (t) - { for (p = t->list; p; p = p->next) - { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name)) - { if (name) - fprintf(fmsg, "Using %s service name: %s\n", ns->name, name); - if (protocol) - fprintf(fmsg, "Using %s service protocol: %s\n", ns->name, protocol); - if (style && vflag >= 0) - fprintf(fmsg, "Using %s service style: %s\n", ns->name, style); - else if (!eflag && vflag >= 0) - fprintf(fmsg, "Using %s service style: document\n", ns->name); - if (encoding && *encoding) - fprintf(fmsg, "Using %s service encoding: %s\n", ns->name, encoding); - else if (encoding && !*encoding && vflag >= 0) - fprintf(fmsg, "Using %s service encoding: encoded\n", ns->name); - else if (!eflag && vflag >= 0) - fprintf(fmsg, "Using %s service encoding: literal\n", ns->name); - if (URL) - fprintf(fmsg, "Using %s service location: %s\n", ns->name, URL); - if (executable) - fprintf(fmsg, "Using %s service executable: %s\n", ns->name, executable); - if (import) - fprintf(fmsg, "Using %s schema import: %s\n", ns->name, import); - else if (URI) - fprintf(fmsg, "Using %s schema namespace: %s\n", ns->name, URI); - if (sp && sp->name) - sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(name, NULL)); - else - sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(ns->name, NULL)); - if (!wflag && !import) - { fprintf(fmsg, "Saving %s Web Service description\n", buf); - fd = fopen(buf, "w"); - if (!fd) - execerror("Cannot write WSDL file"); - gen_wsdl(fd, t, ns->name, name, URL, executable, URI, style, encoding, protocol); - fclose(fd); - } - if (!cflag) - { if (iflag || jflag) - { char *sname; - if (sp && sp->name) - sname = sp->name; - else - sname = ""; - if (!Sflag) - { char *name1 = ns_cname(sname, "Proxy"); - sprintf(buf, "%s%s%s.h", dirpath, prefix, name1); - fprintf(fmsg, "Saving %s client proxy class\n", buf); - fd = fopen(buf, "w"); - if (!fd) - execerror("Cannot write proxy class file"); - sprintf(buf, "%s%s.h", prefix, name1); - copyrightnote(fd, buf); - gen_proxy_header(fd, t, ns, name1, URL, executable, URI, encoding); - fclose(fd); - sprintf(buf, "%s%s%s.cpp", dirpath, prefix, name1); - fprintf(fmsg, "Saving %s client proxy class\n", buf); - fd = fopen(buf, "w"); - if (!fd) - execerror("Cannot write proxy class file"); - sprintf(buf, "%s%s.cpp", prefix, name1); - copyrightnote(fd, buf); - gen_proxy_code(fd, t, ns, name1, URL, executable, URI, encoding); - fclose(fd); - } - if (!Cflag) - { char *name1 = ns_cname(sname, "Service"); - sprintf(buf, "%s%s%s.h", dirpath, prefix, name1); - fprintf(fmsg, "Saving %s service class\n", buf); - fd = fopen(buf, "w"); - if (!fd) - execerror("Cannot write service class file"); - sprintf(buf, "%s%s.h", prefix, name1); - copyrightnote(fd, buf); - gen_object_header(fd, t, ns, name1, URL, executable, URI, encoding); - fclose(fd); - sprintf(buf, "%s%s%s.cpp", dirpath, prefix, name1); - fprintf(fmsg, "Saving %s service class\n", buf); - fd = fopen(buf, "w"); - if (!fd) - execerror("Cannot write service class file"); - sprintf(buf, "%s%s.cpp", prefix, name1); - copyrightnote(fd, buf); - gen_object_code(fd, t, ns, name1, URL, executable, URI, encoding); - fclose(fd); - } - } - else if (zflag == 1) - { if (!Sflag && sp && sp->name) - { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Proxy")); - fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); - fd = fopen(buf, "w"); - if (!fd) - execerror("Cannot write proxy file"); - sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Proxy")); - copyrightnote(fd, buf); - gen_proxy(fd, t, ns, name, URL, executable, URI, encoding); - fclose(fd); - } - else if (!Sflag) - { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Proxy")); - fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); - fd = fopen(buf, "w"); - if (!fd) - execerror("Cannot write proxy file"); - sprintf(buf, "%s.h", ns_cname(prefix, "Proxy")); - copyrightnote(fd, buf); - gen_proxy(fd, t, ns, "Service", URL, executable, URI, encoding); - fclose(fd); - } - if (!Cflag && sp && sp->name) - { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Object")); - fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); - fd = fopen(buf, "w"); - if (!fd) - execerror("Cannot write server object file"); - sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Object")); - copyrightnote(fd, buf); - gen_object(fd, t, ns, name, URL, executable, URI, encoding); - fclose(fd); - } - else if (!Cflag) - { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Object")); - fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); - fd = fopen(buf, "w"); - if (!fd) - execerror("Cannot write server object file"); - sprintf(buf, "%s.h", ns_cname(prefix, "Object")); - copyrightnote(fd, buf); - gen_object(fd, t, ns, "Service", URL, executable, URI, encoding); - fclose(fd); - } - } - } - if (!xflag) - { strcpy(buf, dirpath); - if (sp && sp->name) - strcat(buf, ns_fname(name)); - else - strcat(buf, ns_fname(ns->name)); - strcat(buf, "."); - gen_data(buf, t, ns->name, name, URL, executable, URI, encoding); - } - break; - } - } - if (sp && sp->name) - { has_nsmap = 1; - if (nflag) - sprintf(buf, "%s%s.nsmap", dirpath, prefix); - else - sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(name, NULL)); - fprintf(fmsg, "Saving %s namespace mapping table\n", buf); - fd = fopen(buf, "w"); - if (!fd) - execerror("Cannot write nsmap file"); - fprintf(fd, "\n#include \"%sH.h\"", prefix); - if (nflag) - fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] =\n", prefix); - else - fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] =\n"); - gen_nsmap(fd, ns, URI); - fclose(fd); - - if (Tflag && !Cflag) - { Entry *method; - char soapTester[1024]; - char pathsoapTester[1024]; - char *name1 = NULL; - Tflag = 0; - strcpy(soapTester, prefix); - strcat(soapTester, "Tester"); - if (cflag) - strcat(soapTester, ".c"); - else - strcat(soapTester, ".cpp"); - strcpy(pathsoapTester, dirpath); - strcat(pathsoapTester, soapTester); - fprintf(fmsg, "Saving %s server auto-test code\n", pathsoapTester); - fd = fopen(pathsoapTester,"w"); - if (!fd) - execerror("Cannot write to file"); - copyrightnote(fd, soapTester); - fprintf(fd, "\n/*\n Stand-alone server auto-test code:\n Takes request from standard input or over TCP/IP socket and returns\nresponse to standard output or socket\n\n Compile:\n cc soapTester.c soapServer.c soapC.c stdsoap2.c\n\n Command line usage with redirect over stdin/out:\n > ./a.out < SomeTest.req.xml\n > ./a.out 12288 < SomeTest.req.xml\n Note: 12288 = SOAP_XML_INDENT | SOAP_XML_STRICT (see codes in stdsoap2.h)\n Command line usage to start server at port 8080:\n > a.out 12288 8080\n*/\n\n#include \""); - if (iflag || jflag) - { char *sname; - if (sp && sp->name) - sname = sp->name; - else - sname = ""; - name1 = ns_cname(sname, "Service"); - fprintf(fd, "%s%s%s.h\"\n\n#ifndef SOAP_DEFMAIN\n# define SOAP_DEFMAIN main\t/* redefine to use your own main() */\n#endif\n\nint SOAP_DEFMAIN(int argc, char **argv)\n{\n\t%s service(argc > 1 ? atoi(argv[1]) : 0);\n\tif (argc <= 2)\n\t\treturn service.serve();\n\treturn service.run(atoi(argv[2]));\n}\n", dirpath, prefix, name1, name1); - } - else - fprintf(fd, "%s%s.nsmap\"\n\n#ifndef SOAP_DEFMAIN\n# define SOAP_DEFMAIN main\t/* redefine to use your own main() */\n#endif\n\nint SOAP_DEFMAIN(int argc, char **argv)\n{\n\tstruct soap *soap = soap_new1(argc > 1 ? atoi(argv[1]) : 0);\n\tif (argc <= 2)\n\t\treturn %s_serve(soap);\n\tif (soap_valid_socket(soap_bind(soap, NULL, atoi(argv[2]), 100)))\n\t\twhile (soap_valid_socket(soap_accept(soap)))\n\t\t{\t%s_serve(soap);\n\t\t\tsoap_destroy(soap);\n\t\t\tsoap_end(soap);\n\t\t}\n\tsoap_free(soap);\n\treturn 0;\n}\n", dirpath, nflag?prefix:ns_cname(name, NULL), nflag?prefix:"soap", nflag?prefix:"soap"); - for (method = t->list; method; method = method->next) - { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) - { Entry *p, *q = entry(t, method->sym); - Table *r; - if (q) - p = (Entry*)q->info.typ->ref; - else - { fprintf(stderr, "Internal error: no table entry\n"); - return; - } - q = entry(classtable, method->sym); - r = (Table*)q->info.typ->ref; - if (iflag || jflag) - fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s::%s(", method->sym->name, name1, ns_cname(method->sym->name, NULL)); - else - fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s(struct soap *soap", method->sym->name, ident(method->sym->name)); - gen_params(fd, r, p, !iflag && !jflag); - /* single param to single param echo */ - if (p && r && r->list && r->list->info.typ == p->info.typ) - fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t*%s = *%s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); - else if (p && r && r->list && p->info.typ->type == Tpointer && r->list->info.typ == (Tnode*)p->info.typ->ref) - fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t*%s = %s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); - else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ == (Tnode*)p->info.typ->ref) - fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t%s = %s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); - else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ->type == Tpointer && r->list->info.typ->ref == (Tnode*)p->info.typ->ref) - fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t%s = *%s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); - /* params to wrapped params echo */ - else - { fprintf(fd, "\n{\t"); - if (r && p && p->info.typ->ref && ((Tnode*)p->info.typ->ref)->ref && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass)) - { const char *s, *a; - int d = 1; - s = ident(p->sym->name); - if (p->info.typ->type == Treference) - a = "."; - else - a = "->"; - for (p = ((Table*)((Tnode*)p->info.typ->ref)->ref)->list, q = r->list; p && q; p = p->next, q = q->next) - { if (p->info.typ == q->info.typ) - fprintf(fd, "\n\t%s%s%s = %s;", s, a, ident(p->sym->name), ident(q->sym->name)); - else if (q->info.typ->type == Tpointer && p->info.typ == (Tnode*)q->info.typ->ref) - fprintf(fd, "\n\t%s%s%s = *%s;", s, a, ident(p->sym->name), ident(q->sym->name)); - else - d = 0; - } - if (!d) - fprintf(fd, "\n\t/* Return incomplete response with default data values */"); - } - fprintf(fd, "\n\treturn SOAP_OK;\n}\n"); - } - fflush(fd); - } - } - fclose(fd); - } - } - } - if (!wflag && !import) - { sprintf(buf, "%s%s.xsd", dirpath, ns_cname(ns->name, NULL)); - fprintf(fmsg, "Saving %s XML schema\n", buf); - fd = fopen(buf, "w"); - if (!fd) - execerror("Cannot write schema file"); - fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); - if (t) - for (p = t->list; p; p = p->next) - if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name)) - { gen_schema(fd, t, ns->name, ns->name, 0, 1, URL, URI, style, encoding); - break; - } - if (!t || !p) - gen_schema(fd, t, ns->name, ns->name, 0, 0, URL, URI, style, encoding); - fclose(fd); - } - } - if (!has_nsmap && flag) - { if (Tflag && !Cflag && !iflag && !jflag) - fprintf(fmsg, "Warning: cannot save soapTester, need directive //gsoap service name\n"); - for (ns = nslist; ns; ns = ns->next) - if (strcmp(ns->name, "SOAP-ENV") && strcmp(ns->name, "SOAP-ENC") && strcmp(ns->name, "xsi") && strcmp(ns->name, "xsd")) - break; - if (nflag) - sprintf(buf, "%s%s.nsmap", dirpath, prefix); - else if (ns && ns->name) - sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(ns->name, NULL)); - else - sprintf(buf, "%ssoap.nsmap", dirpath); - fprintf(fmsg, "Saving %s namespace mapping table\n", buf); - fd = fopen(buf, "w"); - if (!fd) - execerror("Cannot write nsmap file"); - fprintf(fd, "\n#include \"%sH.h\"", prefix); - if (nflag) - fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] =\n", prefix); - else - fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] =\n"); - gen_nsmap(fd, ns, URI); - fclose(fd); - } -} - -int -chkhdr(char *part) -{ Entry *p; - p = entry(classtable, lookup("SOAP_ENV__Header")); - if (p) - for (p = ((Table*)p->info.typ->ref)->list; p; p = p->next) - if (has_ns_eq(NULL, p->sym->name) && (!strcmp(part, p->sym->name) || is_eq_nons(part, p->sym->name))) - return 1; - sprintf(errbuf, "Cannot define method-header-part in WSDL: SOAP_ENV__Header \"%s\" member field is not qualified", part); - semwarn(errbuf); - return 0; -} - -void -gen_wsdl(FILE *fd, Table *t, char *ns, char *name, char *URL, char *executable, char *URI, char *style, char *encoding, char *protocol) -{ Entry *p, *q, *r; - Symbol *s; - Service *sp, *sp2; - Method *m; - const char *mimein = NULL, *mimeout = NULL; - int prot, mask = 0x0; /* 0x1 = SOAP, 0x2 = GET, 0x4 = PUT, 0x8 = POST */ - char *action, *comment, *method_style = NULL, *method_encoding = NULL, *method_response_encoding = NULL; - char *portname; - char *binding; - fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); - for (sp = services; sp; sp = sp->next) - if (!tagcmp(sp->ns, ns)) - break; - if (sp && sp->definitions) - fprintf(fd, "<definitions name=\"%s\"\n", sp->definitions); - else - fprintf(fd, "<definitions name=\"%s\"\n", name); - if (sp && sp->WSDL) - fprintf(fd, " targetNamespace=\"%s\"\n xmlns:tns=\"%s\"", sp->WSDL, sp->WSDL); - else - fprintf(fd, " targetNamespace=\"%s/%s.wsdl\"\n xmlns:tns=\"%s/%s.wsdl\"", URI, name, URI, name); - if (sp && sp->binding) - binding = ns_cname(sp->binding, NULL); - else - binding = name; - if (sp && sp->portname) - portname = ns_cname(sp->portname, NULL); - else - portname = name; - for (s = nslist; s; s = s->next) - { for (sp2 = services; sp2; sp2 = sp2->next) - if (!tagcmp(sp2->ns, s->name) && sp2->URI) - break; - if (sp2) - fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); - else if (!strcmp(s->name, "SOAP-ENV")) - fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); - else if (!strcmp(s->name, "SOAP-ENC")) - fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); - else if (!strcmp(s->name, "xsi")) - fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); - else if (!strcmp(s->name, "xsd")) - fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); - else - fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); - } - if (is_soap12(encoding)) - fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap12/\""); - else - fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap/\""); - fprintf(fd, "\n xmlns:HTTP=\"http://schemas.xmlsoap.org/wsdl/http/\""); - fprintf(fd, "\n xmlns:MIME=\"http://schemas.xmlsoap.org/wsdl/mime/\""); - fprintf(fd, "\n xmlns:DIME=\"http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/\""); - fprintf(fd, "\n xmlns:WSDL=\"http://schemas.xmlsoap.org/wsdl/\""); - fprintf(fd, "\n xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n\n"); - fprintf(fd, "<types>\n\n"); - for (s = nslist; s; s = s->next) - gen_schema(fd, t, ns, s->name, !strcmp(s->name, ns), 1, URL, URI, style, encoding); - fprintf(fd, "</types>\n\n"); - fflush(fd); - if (t) - { for (p = t->list; p; p = p->next) - { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) - { mimein = NULL; - mimeout = NULL; - comment = NULL; - method_style = style; - method_encoding = encoding; - method_response_encoding = NULL; - if (sp) - { for (m = sp->list; m; m = m->next) - { if (is_eq_nons(m->name, p->sym->name)) - { if (m->mess&MIMEIN) - mimein = m->part; - if (m->mess&MIMEOUT) - mimeout = m->part; - if (m->mess == ENCODING) - method_encoding = m->part; - else if (m->mess == RESPONSE_ENCODING) - method_response_encoding = m->part; - else if (m->mess == STYLE) - method_style = m->part; - else if (m->mess == COMMENT) - comment = m->part; - } - } - } - if (!method_response_encoding) - method_response_encoding = method_encoding; - if (get_response(p->info.typ)) - fprintf(fd, "<message name=\"%sRequest\">\n", ns_remove(p->sym->name)); - else - fprintf(fd, "<message name=\"%s\">\n", ns_remove(p->sym->name)); - fflush(fd); - if (is_document(method_style)) - { if (is_invisible(p->sym->name)) - { q = entry(classtable, p->sym); - if (q) - { q = ((Table*)q->info.typ->ref)->list; - if (q) - { if (is_invisible(q->sym->name)) - { r = entry(classtable, q->sym); - if (r) - { r = ((Table*)r->info.typ->ref)->list; - if (r) - { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(r, ns)); - if (gen_member_documentation(fd, p->sym, r, ns)) - fprintf(fd, " </part>\n"); - } - } - } - else - { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(q, ns)); - if (gen_member_documentation(fd, p->sym, q, ns)) - fprintf(fd, " </part>\n"); - } - } - } - } - else - { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(p, ns)); - if (gen_member_documentation(fd, p->sym, p, ns)) - fprintf(fd, " </part>\n"); - } - } - else - { q = entry(classtable, p->sym); - if (q) - { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) - { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) - { if (is_literal(method_encoding)) - { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns)); - if (gen_member_documentation(fd, p->sym, q, ns)) - fprintf(fd, " </part>\n"); - } - else if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) - fprintf(fd, " <part name=\"Body\" type=\"xsd:anyType\"/>\n"); - else - { fprintf(fd, " <part name=\"%s\" type=\"%s\"", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns)); - if (gen_member_documentation(fd, p->sym, q, ns)) - fprintf(fd, " </part>\n"); - } - } - } - } - } - if (mimein) - fprintf(fd, " <part name=\"Attachments\" type=\"xsd:base64Binary\"/>\n"); - fprintf(fd, "</message>\n\n"); - fflush(fd); - q = (Entry*)p->info.typ->ref; - for (r = t->list; r; r = r->next) - if (r != p && r->info.typ->type == Tfun && !(r->info.sto & Sextern) && q == (Entry*)r->info.typ->ref) - q = NULL; - if (q && is_transient(q->info.typ)) - ; - else if (q && !is_response(q->info.typ)) - { fprintf(fd, "<message name=\"%sResponse\">\n", ns_remove(p->sym->name)); - if (is_document(method_style)) - fprintf(fd, " <part name=\"Body\" element=\"%sResponse\"/>\n", ns_add(p, ns)); - else if (is_literal(method_response_encoding)) - { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns)); - if (gen_member_documentation(fd, p->sym, q, ns)) - fprintf(fd, " </part>\n"); - } - else if (is_XML((Tnode*)q->info.typ->ref) || is_stdXML((Tnode*)q->info.typ->ref)) - fprintf(fd, " <part name=\"Body\" type=\"xsd:anyType\"/>\n"); - else - { fprintf(fd, " <part name=\"%s\" type=\"%s\"", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns)); - if (gen_member_documentation(fd, p->sym, q, ns)) - fprintf(fd, " </part>\n"); - } - if (mimeout) - fprintf(fd, " <part name=\"Attachments\" type=\"xsd:base64Binary\"/>\n"); - fprintf(fd, "</message>\n\n"); - } - else if (q && q->info.typ->wsdl == False) - { q->info.typ->wsdl = True; - fprintf(fd, "<message name=\"%s\">\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); - if (is_document(method_style)) - { if (has_ns_eq(NULL, ((Entry*)p->info.typ->ref)->sym->name)) - fprintf(fd, " <part name=\"Body\" element=\"%s\"/>\n", ns_convert(((Entry*)p->info.typ->ref)->sym->name)); - else if (is_invisible(((Tnode*)q->info.typ->ref)->id->name)) - { r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; - if (r) - { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(r, ns)); - if (gen_member_documentation(fd, p->sym, r, ns)) - fprintf(fd, " </part>\n"); - } - } - else - { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_convert(((Tnode*)q->info.typ->ref)->id->name)); - if (gen_member_documentation(fd, p->sym, q, ns)) - fprintf(fd, " </part>\n"); - } - } - else - { if (((Tnode*)q->info.typ->ref)->ref) - { for (q = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; q; q = q->next) - { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) - { if (is_literal(method_response_encoding)) - { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns)); - if (gen_member_documentation(fd, p->sym, q, ns)) - fprintf(fd, " </part>\n"); - } - else if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) - fprintf(fd, " <part name=\"Body\" type=\"xsd:anyType\"/>\n"); - else - { fprintf(fd, " <part name=\"%s\" type=\"%s\"", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns)); - if (gen_member_documentation(fd, p->sym, q, ns)) - fprintf(fd, " </part>\n"); - } - } - } - } - } - if (mimeout) - fprintf(fd, " <part name=\"Attachments\" type=\"xsd:base64Binary\"/>\n"); - fprintf(fd, "</message>\n\n"); - } - fflush(fd); - } - } - if (custom_header) - { Table *r; - fprintf(fd, "<message name=\"%sHeader\">\n", name); - r = (Table*)entry(classtable, lookup("SOAP_ENV__Header"))->info.typ->ref; - if (r) - { for (q = r->list; q; q = q->next) - { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) - fprintf(fd, " <part name=\"%s\" element=\"%s\"/>\n", ns_remove(q->sym->name), ns_add(q, ns)); - } - } - fprintf(fd, "</message>\n\n"); - } - if (custom_fault) - { Table *r; - fprintf(fd, "<message name=\"%sFault\">\n", name); - r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; - if (r) - for (q = r->list; q; q = q->next) - if (!is_transient(q->info.typ) && !is_repetition(q) && !is_anytype(q) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && has_ns_eq(NULL, q->sym->name)) - { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns)); - if (gen_member_documentation(fd, q->sym, q, ns)) - fprintf(fd, " </part>\n"); - } - fprintf(fd, "</message>\n\n"); - } - if (sp) - { for (m = sp->list; m; m = m->next) - { if (m->mess&FAULT && m->part) - { Method *m2; - int flag = 0; - for (m2 = sp->list; m2 && m2 != m; m2 = m2->next) - if (m2->mess&FAULT && !strcmp(m2->part, m->part)) - flag = 1; - if (!flag) - { if (typetable) - for (p = typetable->list; p; p = p->next) - if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->sym->name)) - break; - if (!p && classtable) - for (p = classtable->list; p; p = p->next) - if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->id->name)) - break; - if (p) - { fprintf(fd, "<message name=\"%sFault\">\n", ns_remove(m->part)); - fprintf(fd, " <part name=\"Fault\" element=\"%s\"/>\n", ns_convert(m->part)); - fprintf(fd, "</message>\n\n"); - flag = 0; - if (custom_fault) - { Table *r; - r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; - if (r) - for (q = r->list; q; q = q->next) - if (!is_transient(q->info.typ) && !is_repetition(q) && !is_anytype(q) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && (!strcmp(q->sym->name, m->part) || !strcmp(q->sym->name + 1, m->part))) - { flag = 1; - break; - } - } - if (!flag) - { sprintf(errbuf, "//gsoap %s method-fault %s %s directive does not refer to a member of struct SOAP_ENV__Detail: suggest to define struct SOAP_ENV__Detail with member %s", sp->ns, m->name, m->part, m->part); - semwarn(errbuf); - } - } - else - { sprintf(errbuf, "//gsoap %s method-fault %s %s directive does not refer to struct/class or typedef: should globablly define fault %s as type (typedef or struct/class)", sp->ns, m->name, m->part, m->part); - semwarn(errbuf); - } - } - } - } - } - fflush(fd); - if (sp && sp->porttype) - fprintf(fd, "<portType name=\"%s\">\n", sp->porttype); - else - fprintf(fd, "<portType name=\"%s\">\n", ns_cname(name, "PortType")); - if (protocol) - { if (strncmp(protocol, "SOAP", 4)) - { if (strstr(protocol, "GET")) - mask = 0x2; - else if (strstr(protocol, "PUT")) - mask = 0x4; - else /* POST */ - mask = 0x8; - } - else - mask = 0x1; - } - for (p = t->list; p; p = p->next) - { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) - { comment = NULL; - if (sp) - { for (m = sp->list; m; m = m->next) - { if (m->mess == COMMENT && is_eq_nons(m->name, p->sym->name)) - comment = m->part; - else if (m->mess == PROTOCOL) - { if (strncmp(m->part, "SOAP", 4)) - { if (strstr(m->part, "GET")) - mask |= 0x2; - else if (strstr(m->part, "PUT")) - mask |= 0x4; - else /* POST */ - mask |= 0x8; - } - else - mask |= 0x1; - } - } - } - if (!mask) - { if (vflag < 0) - mask = 0x8; /* -0 option: use POST */ - else - mask = 0x1; - } - fprintf(fd, " <operation name=\"%s\">\n", ns_remove(p->sym->name)); - if (comment) - fprintf(fd, " <documentation>%s</documentation>\n", comment); - else - fprintf(fd, " <documentation>Service definition of function %s</documentation>\n", p->sym->name); - if (get_response(p->info.typ)) - fprintf(fd, " <input message=\"tns:%sRequest\"/>\n", ns_remove(p->sym->name)); - else - fprintf(fd, " <input message=\"tns:%s\"/>\n", ns_remove(p->sym->name)); - q = (Entry*)p->info.typ->ref; - if (q && is_transient(q->info.typ)) - ; - else if (q && !is_response(q->info.typ)) - fprintf(fd, " <output message=\"tns:%sResponse\"/>\n", ns_remove(p->sym->name)); - else if (q) - fprintf(fd, " <output message=\"tns:%s\"/>\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); - if (sp) - for (m = sp->list; m; m = m->next) - if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) - fprintf(fd, " <fault name=\"%s\" message=\"tns:%sFault\"/>\n", ns_remove(m->part), ns_remove(m->part)); - fprintf(fd, " </operation>\n"); - } - } - fprintf(fd, "</portType>\n\n"); - for (prot = 0x1; prot <= 0x8; prot <<= 1) - { if ((prot & mask)) - { const char *v = "", *b = ""; - switch (prot) - { case 0x1: v = ""; b = "SOAP"; break; - case 0x2: v = "GET"; b = "HTTP"; break; - case 0x4: v = "PUT"; b = "HTTP"; break; - case 0x8: v = "POST"; b = "HTTP"; break; - } - fprintf(fd, "<binding name=\"%s%s\" ", binding, v); - if (prot == 0x1) - { if (is_document(style)) - { if (sp && sp->porttype) - fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"document\"", sp->porttype); - else - fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"document\"", ns_cname(name, "PortType")); - } - else - { if (sp && sp->porttype) - fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"rpc\"", sp->porttype); - else - fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"rpc\"", ns_cname(name, "PortType")); - } - if (sp && sp->transport) - fprintf(fd, " transport=\"%s\"/>\n", sp->transport); - else - fprintf(fd, " transport=\"http://schemas.xmlsoap.org/soap/http\"/>\n"); - } - else - { if (sp && sp->porttype) - fprintf(fd, "type=\"tns:%s\">\n <HTTP:binding verb=\"%s\"/>\n", sp->porttype, v); - else - fprintf(fd, "type=\"tns:%s\">\n <HTTP:binding verb=\"%s\"/>\n", ns_cname(name, "PortType"), v); - } - fflush(fd); - for (p = t->list; p; p = p->next) - { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) - { action = ""; - mimein = NULL; - mimeout = NULL; - method_style = style; - method_encoding = encoding; - method_response_encoding = NULL; - if (sp) - { int v = 0x1; - if (sp->protocol) - { if (strncmp(sp->protocol, "SOAP", 4)) - { if (strstr(sp->protocol, "GET")) - v = 0x2; - else if (strstr(sp->protocol, "PUT")) - v = 0x4; - else /* POST */ - v = 0x8; - } - } - for (m = sp->list; m; m = m->next) - { if (is_eq_nons(m->name, p->sym->name)) - { if (m->mess&MIMEIN) - mimein = m->part; - if (m->mess&MIMEOUT) - mimeout = m->part; - if (m->mess == ENCODING) - method_encoding = m->part; - else if (m->mess == RESPONSE_ENCODING) - method_response_encoding = m->part; - else if (m->mess == STYLE) - method_style = m->part; - else if (m->mess == ACTION || m->mess == REQUEST_ACTION) - action = m->part; - else if (m->mess == RESPONSE_ACTION) - action = m->part; - else if (m->mess == PROTOCOL) - { if (strncmp(m->part, "SOAP", 4)) - { if (strstr(m->part, "GET")) - v = 0x2; - else if (strstr(m->part, "PUT")) - v = 0x4; - else /* POST */ - v = 0x8; - } - else - v = 0x1; - } - } - } - if (vflag < 0) - v = 0x8; - if (prot != v) - continue; - } - if (!method_response_encoding) - method_response_encoding = method_encoding; - fprintf(fd, " <operation name=\"%s\">\n", ns_remove(p->sym->name)); - if (prot == 0x1) - { if (is_document(style)) - { if (is_document(method_style)) - { if (is_soap12(encoding) && !*action) - fprintf(fd, " <SOAP:operation/>\n"); - else if (*action == '"') - fprintf(fd, " <SOAP:operation soapAction=%s/>\n", action); - else - fprintf(fd, " <SOAP:operation soapAction=\"%s\"/>\n", action); - } - else if (is_soap12(encoding) && !*action) - fprintf(fd, " <SOAP:operation style=\"rpc\"/>\n"); - else if (*action == '"') - fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=%s/>\n", action); - else - fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=\"%s\"/>\n", action); - } - else - { if (is_document(method_style)) - { if (is_soap12(encoding) && !*action) - fprintf(fd, " <SOAP:operation style=\"document\"/>\n"); - else if (*action == '"') - fprintf(fd, " <SOAP:operation style=\"document\" soapAction=%s/>\n", action); - else - fprintf(fd, " <SOAP:operation style=\"document\" soapAction=\"%s\"/>\n", action); - } - else if (is_soap12(encoding) && !*action) - fprintf(fd, " <SOAP:operation style=\"rpc\"/>\n"); - else if (*action == '"') - fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=%s/>\n", action); - else - fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=\"%s\"/>\n", action); - } - } - else - { if (!*action) - fprintf(fd, " <HTTP:operation/>\n"); - else if (*action == '"') - fprintf(fd, " <HTTP:operation location=%s/>\n", action); - else - fprintf(fd, " <HTTP:operation location=\"%s\"/>\n", action); - } - fprintf(fd, " <input>\n"); - q = entry(classtable, p->sym); - if (prot == 0x1) - { if (mimein) - fprintf(fd, " <MIME:multipartRelated>\n <MIME:part>\n"); - if (is_literal(method_encoding) || (q && (q = (((Table*)q->info.typ->ref)->list)) && q && is_XML(q->info.typ))) - { if (is_document(method_style)) - fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\"/>\n"); - else - fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\" namespace=\"%s\"/>\n", URI); - } - else - { if (encoding && *encoding) - fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encoding); - else if (method_encoding && *method_encoding) - fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, method_encoding); - else - fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encURI); - if (!eflag) - { sprintf(errbuf, "operation '%s' is not compliant with WS-I Basic Profile 1.0a, reason: uses SOAP encoding", p->sym->name); - compliancewarn(errbuf); - } - } - if (custom_header) - { m = NULL; - if (sp) - { for (m = sp->list; m; m = m->next) - if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDRIN)) - { if (chkhdr(m->part)) - fprintf(fd, " <SOAP:header use=\"literal\" message=\"tns:%sHeader\" part=\"%s\"/>\n", name, ns_remove(m->part)); - } - } - } - if (mimein) - { if (sp) - { for (m = sp->list; m; m = m->next) - { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEIN)) - fprintf(fd, " </MIME:part>\n <MIME:part>\n <MIME:content part=\"Attachments\" type=\"%s\"/>\n", m->part); - } - } - fprintf(fd, " </MIME:part>\n </MIME:multipartRelated>\n"); - } - } - else if (prot == 0x2) - fprintf(fd, " <HTTP:urlEncoded/>\n"); - else - { if (mimein) - fprintf(fd, " <MIME:content type=\"%s\"/>\n", mimein); - else if (!q || is_document(method_style)) - fprintf(fd, " <MIME:mimeXml part=\"Body\"/>\n"); - else - fprintf(fd, " <MIME:mimeXml part=\"%s\"/>\n", ns_remove(q->sym->name)); - } - fprintf(fd, " </input>\n"); - - q = (Entry*)p->info.typ->ref; - if (!q || !q->info.typ->ref) - { fprintf(fd, " </operation>\n"); - continue; - } - if (prot != 0x4) - { fprintf(fd, " <output>\n"); - if (prot == 0x1) - { if (mimeout) - fprintf(fd, " <MIME:multipartRelated>\n <MIME:part>\n"); - if (is_literal(method_response_encoding) || is_XML((Tnode*)q->info.typ->ref)) - { if (is_document(method_style)) - fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\"/>\n"); - else - fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\" namespace=\"%s\"/>\n", URI); - } - else if (encoding && *encoding) - fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encoding); - else if (method_response_encoding && *method_response_encoding) - fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, method_response_encoding); - else - fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encURI); - if (custom_header) - { if (sp) - for (m = sp->list; m; m = m->next) - if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDROUT)) - { if (chkhdr(m->part)) - fprintf(fd, " <SOAP:header use=\"literal\" message=\"tns:%sHeader\" part=\"%s\"/>\n", name, ns_remove(m->part)); - } - } - if (mimeout) - { if (sp) - { for (m = sp->list; m; m = m->next) - { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEOUT)) - fprintf(fd, " </MIME:part>\n <MIME:part>\n <MIME:content part=\"Attachments\" type=\"%s\"/>\n", m->part); - } - } - fprintf(fd, " </MIME:part>\n </MIME:multipartRelated>\n"); - } - } - else - { q = (Entry*)p->info.typ->ref; - if (is_document(method_style)) - fprintf(fd, " <MIME:mimeXml part=\"Body\"/>\n"); - else if (q && !is_transient(q->info.typ) && !is_response(q->info.typ) && is_literal(method_response_encoding)) - fprintf(fd, " <MIME:mimeXml part=\"%s\"/>\n", ns_remove(q->sym->name)); - else - fprintf(fd, " <MIME:mimeXml part=\"Body\"/>\n"); - } - fprintf(fd, " </output>\n"); - } - if (sp) - for (m = sp->list; m; m = m->next) - if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) - fprintf(fd, " <fault name=\"%s\">\n <SOAP:fault name=\"%s\" use=\"literal\"/>\n </fault>\n", ns_remove(m->part), ns_remove(m->part)); - fprintf(fd, " </operation>\n"); - fflush(fd); - } - } - fprintf(fd, "</binding>\n\n"); - } - } - } - fprintf(fd, "<service name=\"%s\">\n", name); - if (sp && sp->documentation) - fprintf(fd, " <documentation>%s</documentation>\n", sp->documentation); - else - fprintf(fd, " <documentation>gSOAP "VERSION" generated service definition</documentation>\n"); - if (executable) - fprintf(fd, " <port name=\"%s\" binding=\"tns:%s\">\n <SOAP:address location=\"%s/%s\"/>\n </port>", portname, binding, URL, executable); - for (prot = 0x1; prot <= 0x8; prot <<= 1) - { if ((prot & mask)) - { const char *s, *t, *v = "", *b = ""; - switch (prot) - { case 0x1: v = ""; b = "SOAP"; break; - case 0x2: v = "GET"; b = "HTTP"; break; - case 0x4: v = "PUT"; b = "HTTP"; break; - case 0x8: v = "POST"; b = "HTTP"; break; - } - fprintf(fd, " <port name=\"%s%s\" binding=\"tns:%s%s\">\n", portname, v, binding, v); - for (s = URL; s; s = t) - { int n; - t = strchr(s, ' '); - if (t) - { n = (int)(t - s); - t++; - } - else - n = (int)strlen(s); - fprintf(fd, " <%s:address location=\"%.*s\"/>\n", b, n, s); - } - fprintf(fd, " </port>\n"); - } - } - fprintf(fd, "</service>\n\n</definitions>\n"); -} - -char * -default_value(Entry *e, const char *a) -{ Entry *q; - static char buf[1024]; - buf[0] = '\0'; - if (e->info.hasval) - switch (e->info.typ->type) - { case Tchar: - case Twchar: - case Tuchar: - case Tshort: - case Tushort: - case Tint: - case Tuint: - case Tlong: - case Tllong: - case Tulong: - case Tullong: - sprintf(buf, " %s=\"" SOAP_LONG_FORMAT "\"", a, e->info.val.i); - break; - case Tfloat: - case Tdouble: - case Tldouble: - sprintf(buf, " %s=\"%g\"", a, e->info.val.r); - break; - case Ttime: - break; /* should get value? */ - case Tenum: - for (q = ((Table*)e->info.typ->ref)->list; q; q = q->next) - if (q->info.val.i == e->info.val.i) - { sprintf(buf, " %s=\"%s\"", a, ns_convert(q->sym->name)); - break; - } - break; - default: - if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-12) - sprintf(buf, " %s=\"%s\"", a, xstring(e->info.val.s)); - break; - } - return buf; -} - -const char * -nillable(Tnode *typ) -{ if (typ->type == Tpointer) - return "true"; - return "false"; -} - -void -gen_schema(FILE *fd, Table *t, char *ns1, char *ns, int all, int wsdl, char *URL, char *URI, char *style, char *encoding) -{ int i, d; - char cbuf[4]; - Entry *p, *q, *r; - Tnode *n; - Symbol *s; - Service *sp, *sp2; - Method *m; - int flag; - if (!strcmp(ns, "SOAP-ENV") || !strcmp(ns, "SOAP-ENC") || !strcmp(ns, "xsi") || !strcmp(ns, "xsd")) - return; - for (sp = services; sp; sp = sp->next) - if (!tagcmp(sp->ns, ns) && sp->URI) - break; - if (sp && sp->import) - return; - fprintf(fd, " <schema "); - if (sp) - fprintf(fd, "targetNamespace=\"%s\"", sp->URI); - else - fprintf(fd, "targetNamespace=\"%s/%s.xsd\"", tmpURI, ns_convert(ns)); - for (s = nslist; s; s = s->next) - { for (sp2 = services; sp2; sp2 = sp2->next) - if (!tagcmp(sp2->ns, s->name) && sp2->URI) - break; - if (sp2) - fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); - else if (!strcmp(s->name, "SOAP-ENV")) - fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); - else if (!strcmp(s->name, "SOAP-ENC")) - fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); - else if (!strcmp(s->name, "xsi")) - fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); - else if (!strcmp(s->name, "xsd")) - fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); - else - fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); - } - fprintf(fd, "\n xmlns=\"%s\"\n", xsdURI); - if (sp && (sp->elementForm || sp->attributeForm)) - fprintf(fd, " elementFormDefault=\"%s\"\n attributeFormDefault=\"%s\">\n", sp->elementForm?sp->elementForm:"unqualified", sp->attributeForm?sp->attributeForm:"unqualified"); - else if (style && !strcmp(style, "document")) - fprintf(fd, " elementFormDefault=\"qualified\"\n attributeFormDefault=\"unqualified\">\n"); - else - fprintf(fd, " elementFormDefault=\"unqualified\"\n attributeFormDefault=\"unqualified\">\n"); - fflush(fd); - flag = 0; - for (s = nslist; s; s = s->next) - { for (sp2 = services; sp2; sp2 = sp2->next) - if (sp2 != sp && !tagcmp(sp2->ns, s->name) && sp2->URI) - break; - if (sp2) - { fprintf(fd, " <import namespace=\"%s\"", sp2->URI); - if (sp2->import) - fprintf(fd, " schemaLocation=\"%s\"", sp2->import); - fprintf(fd, "/>\n"); - if (!strcmp(sp2->URI, encURI)) - flag = 1; - } - } - if (!flag) - fprintf(fd, " <import namespace=\"%s\"/>", encURI); - fprintf(fd, "\n"); - fflush(fd); - if (typetable) - { for (p = typetable->list; p; p = p->next) - { if (p->info.typ->type != Ttemplate && !is_transient(p->info.typ) && !is_invisible(p->sym->name) && (!is_external(p->info.typ) || is_volatile(p->info.typ)) && ((has_ns_eq(ns, p->sym->name)))) - { /* typedefs that are used for SOAP Fault details */ - m = NULL; - if (p->info.typ->type != Tstruct && p->info.typ->type != Tclass) - { for (sp2 = services; sp2 && !m; sp2 = sp2->next) - { for (m = sp2->list; m; m = m->next) - { if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) - break; - } - } - } - if (m) - { if (!uflag) - fprintf(fd, " <!-- fault element -->\n"); - fprintf(fd, " <element name=\"%s\" type=\"%s\">\n", ns_remove(p->sym->name), base_type(p->info.typ, ns1)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " </element>\n"); - continue; - } - if (is_primitive_or_string(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive_or_string((Tnode*)p->info.typ->ref))) - { fprintf(fd, " <simpleType name=\"%s\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <restriction base=\"%s\">\n", base_type(p->info.typ, ns1)); - if (p->info.typ->pattern) - fprintf(fd, " <pattern value=\"%s\"/>\n", p->info.typ->pattern); - if (is_primitive(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive((Tnode*)p->info.typ->ref) && !is_string(p->info.typ) && !is_wstring(p->info.typ))) - { if (p->info.typ->minLength != MINLONG64) - fprintf(fd, " <minInclusive value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); - if (p->info.typ->maxLength != MAXLONG64) - fprintf(fd, " <maxInclusive value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->maxLength); - } - else - { if (p->info.typ->maxLength > 0 && p->info.typ->minLength == p->info.typ->maxLength) - fprintf(fd, " <length value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); - else - { if (p->info.typ->minLength > 0) - fprintf(fd, " <minLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); - if (p->info.typ->maxLength != MAXLONG64) - fprintf(fd, " <maxLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->maxLength); - } - } - fprintf(fd, " </restriction>\n </simpleType>\n"); - } - else - { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <complexContent>\n <restriction base=\"%s\">\n", base_type(p->info.typ, ns1)); - fprintf(fd, " </restriction>\n </complexContent>\n </complexType>\n"); - } - } - } - } - fflush(fd); - if (enumtable) - { for (p = enumtable->list; p; p = p->next) - { if (!is_transient(p->info.typ) && !is_invisible(p->sym->name) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) - { if (is_mask(p->info.typ)) - { fprintf(fd, " <simpleType name=\"%s\">", wsdl_type(p->info.typ, NULL)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <list>\n"); - q = p; - if ((Table*)p->info.typ->ref) - { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) - if (!has_ns_eq(NULL, ns_remove1(((Table*)p->info.typ->ref)->list->sym->name))) - break; - } - if (q) - fprintf(fd, " <restriction base=\"xsd:string\">\n"); - else - fprintf(fd, " <restriction base=\"xsd:QName\">\n"); - if ((Table*)p->info.typ->ref) - { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) - { fprintf(fd, " <enumeration value=\"%s\"", ns_remove2(q->sym->name)); - if (gen_member_documentation(fd, p->sym, q, ns)) - fprintf(fd, " </enumeration>"); - if (!uflag) - fprintf(fd, " <!-- = " SOAP_LONG_FORMAT " -->", q->info.val.i); - fprintf(fd, "\n"); - } - } - fprintf(fd, " </restriction>\n </list>\n </simpleType>\n"); - } - else - { fprintf(fd, " <simpleType name=\"%s\">", wsdl_type(p->info.typ, NULL)); - gen_type_documentation(fd, p, ns); - q = p; - if ((Table*)p->info.typ->ref) - { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) - if (!has_ns_eq(NULL, ns_remove1(((Table*)p->info.typ->ref)->list->sym->name))) - break; - } - if (q) - fprintf(fd, " <restriction base=\"xsd:string\">\n"); - else - fprintf(fd, " <restriction base=\"xsd:QName\">\n"); - if ((Table*)p->info.typ->ref) - { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) - { fprintf(fd, " <enumeration value=\"%s\"", ns_remove2(q->sym->name)); - if (gen_member_documentation(fd, p->sym, q, ns)) - fprintf(fd, " </enumeration>"); - if (!uflag) - fprintf(fd, " <!-- = " SOAP_LONG_FORMAT " -->", q->info.val.i); - fprintf(fd, "\n"); - } - } - fprintf(fd, " </restriction>\n </simpleType>\n"); - } - } - } - } - fflush(fd); - if (classtable) - { for (p = classtable->list; p; p = p->next) - { if (is_transient(p->info.typ) || is_invisible(p->sym->name)) - continue; - for (q = t->list; q; q = q->next) - if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && p == get_response(q->info.typ)) - break; - /* omit the auto-generated and user-defined response struct/class (when necessary) */ - if (!q) - for (q = t->list; q; q = q->next) - if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && !has_ns_eq(NULL, ((Entry*)q->info.typ->ref)->sym->name)) - { r = entry(t, q->sym); - if (r && r->info.typ->ref && is_response(((Entry*)r->info.typ->ref)->info.typ) && p->info.typ == (Tnode*)((Entry*)r->info.typ->ref)->info.typ->ref) - break; - } - if (q) - continue; - /* classes that are used for SOAP Fault details */ - m = NULL; - for (sp2 = services; sp2 && !m; sp2 = sp2->next) - for (m = sp2->list; m; m = m->next) - if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) - break; - if (m) - { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) - { if (!uflag) - fprintf(fd, " <!-- fault element and type -->\n"); - fprintf(fd, " <element name=\"%s\" type=\"%s\">\n", ns_remove(p->sym->name), base_type(p->info.typ, ns1)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " </element>\n"); - } - } - if (p->info.typ->ref && is_binary(p->info.typ)) - { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) - { if (is_attachment(p->info.typ)) - { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <simpleContent>\n <extension base=\"xsd:base64Binary\">\n"); - if (!eflag) - fprintf(fd, " <attribute name=\"href\" type=\"xsd:anyURI\" use=\"optional\"/>\n"); - gen_schema_attributes(fd, p->info.typ, ns, ns1); - fprintf(fd, " </extension>\n </simpleContent>\n </complexType>\n"); - } - else - { fprintf(fd, " <simpleType name=\"%s\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <restriction base=\"xsd:base64Binary\">\n"); - if (p->info.typ->maxLength > 0 && p->info.typ->minLength == p->info.typ->maxLength) - fprintf(fd, " <length value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); - else - { if (p->info.typ->minLength > 0) - fprintf(fd, " <minLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength); - if (p->info.typ->maxLength != MAXLONG64) - fprintf(fd, " <maxLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->maxLength); - } - fprintf(fd, " </restriction>\n </simpleType>\n"); - } - } - } - else if (p->info.typ->ref && !is_transient(p->info.typ) && is_primclass(p->info.typ)) - { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) - { q = ((Table*)p->info.typ->ref)->list; - if (q && strncmp(q->sym->name, "xsd__anyType", 12)) - { if (is_string(q->info.typ) || is_wstring(q->info.typ) || is_stdstring(q->info.typ) || is_stdwstring(q->info.typ)) - { fprintf(fd, " <complexType name=\"%s\" mixed=\"true\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <simpleContent>\n <extension base=\"%s\">\n", wsdl_type(q->info.typ, ns1)); - gen_schema_attributes(fd, p->info.typ, ns, ns1); - fprintf(fd, " </extension>\n </simpleContent>\n </complexType>\n"); - } - else if (is_primitive(q->info.typ)) - { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <simpleContent>\n <extension base=\"%s\">\n", wsdl_type(q->info.typ, ns1)); - gen_schema_attributes(fd, p->info.typ, ns, ns1); - fprintf(fd, " </extension>\n </simpleContent>\n </complexType>\n"); - } - else - { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n", wsdl_type(q->info.typ, ns1)); - gen_schema_attributes(fd, p->info.typ, ns, ns1); - fprintf(fd, " </extension>\n </complexContent>\n </complexType>\n"); - } - } - } - } - else if (p->info.typ->ref && !is_transient(p->info.typ)) - { q = ((Table*)p->info.typ->ref)->list; - if (entry(t, p->sym) && (!q || !is_XML(q->info.typ))) - ; - else if (is_dynamic_array(p->info.typ)) - { if (eflag || (!has_ns(p->info.typ) && !is_untyped(p->info.typ))) - { if (all) - { d = get_Darraydims(p->info.typ)-1; - for (i = 0; i < d; i++) - cbuf[i] = ','; - cbuf[i] = '\0'; - if (q->info.maxOccurs == 1) - fprintf(fd, " <complexType name=\"%s\">\n <complexContent>\n <restriction base=\"SOAP-ENC:Array\">\n <sequence>\n <element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"%s\"/>\n </sequence>\n <attribute ref=\"SOAP-ENC:arrayType\" WSDL:arrayType=\"%s[%s]\"/>\n </restriction>\n </complexContent>\n </complexType>\n", wsdl_type(p->info.typ, NULL), q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), nillable((Tnode*)q->info.typ->ref), wsdl_type(q->info.typ, ns1), cbuf); - else - fprintf(fd, " <complexType name=\"%s\">\n <complexContent>\n <restriction base=\"SOAP-ENC:Array\">\n <sequence>\n <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"%s\"/>\n </sequence>\n <attribute ref=\"SOAP-ENC:arrayType\" WSDL:arrayType=\"%s[%s]\"/>\n </restriction>\n </complexContent>\n </complexType>\n", wsdl_type(p->info.typ, NULL), q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable((Tnode*)q->info.typ->ref), wsdl_type(q->info.typ, ns1), cbuf); - } - } - else if (p->info.typ->ref && ((Table*)p->info.typ->ref)->prev && !is_transient(entry(classtable, ((Table*)p->info.typ->ref)->prev->sym)->info.typ) && strncmp(((Table*)p->info.typ->ref)->prev->sym->name, "xsd__anyType", 12)) - { if (q->info.maxOccurs == 1) - { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n <sequence>\n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); - fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\"/>\n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1)); - fprintf(fd, " </sequence>\n </extension>\n </complexContent>\n"); - gen_schema_attributes(fd, p->info.typ, ns, ns1); - fprintf(fd, " </complexType>\n"); - } - else - { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n <sequence>\n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); - fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"%s\"/>\n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable((Tnode*)q->info.typ->ref)); - fprintf(fd, " </sequence>\n </extension>\n </complexContent>\n"); - gen_schema_attributes(fd, p->info.typ, ns, ns1); - fprintf(fd, " </complexType>\n"); - } - } - else - { if (q->info.maxOccurs == 1) - { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <sequence>\n <element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"%s\"/>\n </sequence>\n </complexType>\n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), nillable((Tnode*)q->info.typ->ref)); - } - else - { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <sequence>\n <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"%s\"/>\n </sequence>\n </complexType>\n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable((Tnode*)q->info.typ->ref)); - } - } - } - else if (is_discriminant(p->info.typ) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) - { if (p->info.typ->ref) - { fprintf(fd, " <complexType name=\"%s\">\n", ns_remove(p->sym->name)); - gen_schema_elements(fd, p->info.typ, ns, ns1); - fprintf(fd, " </complexType>\n"); - } - } - else if (p->info.typ->type == Tstruct && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) - { if (p->info.typ->ref) - { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <sequence>\n"); - gen_schema_elements(fd, p->info.typ, ns, ns1); - fprintf(fd, " </sequence>\n"); - gen_schema_attributes(fd, p->info.typ, ns, ns1); - fprintf(fd, " </complexType>\n"); - } - } - else if (p->info.typ->type == Tclass && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) - { if (p->info.typ->ref) - { if (((Table*)p->info.typ->ref)->prev && !is_transient(entry(classtable, ((Table*)p->info.typ->ref)->prev->sym)->info.typ) && strncmp(((Table*)p->info.typ->ref)->prev->sym->name, "xsd__anyType", 12)) - { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n <sequence>\n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); - gen_schema_elements(fd, p->info.typ, ns, ns1); - fprintf(fd, " </sequence>\n </extension>\n </complexContent>\n"); - gen_schema_attributes(fd, p->info.typ, ns, ns1); - fprintf(fd, " </complexType>\n"); - } - else - { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name)); - gen_type_documentation(fd, p, ns); - fprintf(fd, " <sequence>\n"); - gen_schema_elements(fd, p->info.typ, ns, ns1); - fprintf(fd, " </sequence>\n"); - gen_schema_attributes(fd, p->info.typ, ns, ns1); - fprintf(fd, " </complexType>\n"); - } - } - } - } - } - } - fflush(fd); - for (n = Tptr[Tarray]; n; n = n->next) - { if (is_transient(n) || is_fixedstring(n)) - continue; - if (1 /* wsdl */) - fprintf(fd, " <complexType name=\"%s\">\n <complexContent>\n <restriction base=\"SOAP-ENC:Array\">\n <attribute ref=\"SOAP-ENC:arrayType\" WSDL:arrayType=\"%s[]\"/>\n </restriction>\n </complexContent>\n </complexType>\n", c_ident(n), wsdl_type((Tnode*)n->ref, ns1)); - else - fprintf(fd, " <complexType name=\"%s\">\n <complexContent>\n <restriction base=\"SOAP-ENC:Array\">\n <element name=\"item\" type=\"%s\" maxOccurs=\"unbounded\"/>\n </restriction>\n </complexContent>\n </complexType>\n", c_ident(n), xsi_type((Tnode*)n->ref)); - fflush(fd); - } - gen_schema_elements_attributes(fd, t, ns, ns1, style, encoding); - fprintf(fd, " </schema>\n\n"); -} - -void -gen_schema_elements(FILE *fd, Tnode *p, char *ns, char *ns1) -{ Entry *q; - for (q = ((Table*)p->ref)->list; q; q = q->next) - if (gen_schema_element(fd, p, q, ns, ns1)) - q = q->next; -} - -int -gen_schema_element(FILE *fd, Tnode *p, Entry *q, char *ns, char *ns1) -{ char *s, *t; - if (is_transient(q->info.typ) || (q->info.sto & Sattribute) || q->info.typ->type == Tfun || q->info.typ->type == Tunion) - return 0; - if (is_repetition(q)) - { if (is_sequence(q->next)) - { fprintf(fd, " <sequence minOccurs=\"0\" maxOccurs=\"unbounded\">\n"); - if (q->next->info.typ->ref) - gen_schema_elements(fd, (Tnode*)q->next->info.typ->ref, ns, ns1); - fprintf(fd, " </sequence>\n"); - return 1; - } - t = ns_convert(q->next->sym->name); - if (*t == '-') - fprintf(fd, " <any processContents=\"lax\" minOccurs=\"0\" maxOccurs=\"unbounded\"/><!-- %s -->\n", q->next->sym->name); - else if ((s = strchr(t+1, ':')) && (!strchr(q->next->sym->name+1, ':') || !has_ns_eq(ns, q->next->sym->name))) - { if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) - if (q->info.maxOccurs == 1) - fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs); - else - fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); - else if (q->info.maxOccurs == 1) - fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs); - else - fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); - if (gen_member_documentation(fd, p->id, q, ns)) - fprintf(fd, " </element>\n"); - } - else - { const char *form = ""; - if (!s) - { s = t; - if (*s == ':') - { s++; - form = " form=\"unqualified\""; - } - } - else - { s++; - form = " form=\"qualified\""; - } - if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) - if (q->info.maxOccurs == 1) - fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\" nillable=\"true\"%s", s, wsdl_type((Tnode*)q->next->info.typ->ref, ns1), q->info.minOccurs, form); - else - fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"true\"%s", s, wsdl_type((Tnode*)q->next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); - else if (q->info.maxOccurs == 1) - fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"%s", s, wsdl_type((Tnode*)q->next->info.typ->ref, ns1), q->info.minOccurs, form); - else - fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"%s", s, wsdl_type((Tnode*)q->next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); - if (gen_member_documentation(fd, p->id, q, ns)) - fprintf(fd, " </element>\n"); - } - return 1; - } - else if (q->info.typ->type == Ttemplate || (q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Ttemplate) || (q->info.typ->type == Treference && ((Tnode*)q->info.typ->ref)->type == Ttemplate)) - { t = ns_convert(q->sym->name); - if (*t == '-') - fprintf(fd, " <any processContents=\"lax\" minOccurs=\"0\" maxOccurs=\"unbounded\"/><!-- %s -->\n", q->sym->name); - else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) - { if (((Tnode*)q->info.typ->ref)->type == Tpointer) - if (q->info.maxOccurs == 1) - fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs); - else - fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); - else if (q->info.maxOccurs == 1) - fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs); - else - fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); - if (gen_member_documentation(fd, p->id, q, ns)) - fprintf(fd, " </element>\n"); - } - else - { const char *form = ""; - if (!s) - { s = t; - if (*s == ':') - { s++; - form = " form=\"unqualified\""; - } - } - else - { s++; - form = " form=\"qualified\""; - } - if (((Tnode*)q->info.typ->ref)->type == Tpointer) - if (q->info.maxOccurs == 1) - fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\" nillable=\"true\"%s", s, wsdl_type((Tnode*)q->info.typ->ref, ns1), q->info.minOccurs, form); - else - fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"true\"%s", s, wsdl_type((Tnode*)q->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); - else if (q->info.maxOccurs == 1) - fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"%s", s, wsdl_type((Tnode*)q->info.typ->ref, ns1), q->info.minOccurs, form); - else - fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"%s", s, wsdl_type((Tnode*)q->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); - if (gen_member_documentation(fd, p->id, q, ns)) - fprintf(fd, " </element>\n"); - } - } - else if (is_anytype(q)) /* ... maybe need to show all possible types rather than xsd:anyType */ - { fprintf(fd, " <element name=\"%s\" type=\"xsd:anyType\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"true\"/>\n", ns_convert(q->next->sym->name), q->info.minOccurs, q->info.maxOccurs); - return 1; - } - else if (is_choice(q)) - { if (q->info.minOccurs == 0) - fprintf(fd, " <choice minOccurs=\"0\" maxOccurs=\"1\">\n"); - else - fprintf(fd, " <choice>\n"); - if (q->next->info.typ->ref) - gen_schema_elements(fd, q->next->info.typ, ns, ns1); - fprintf(fd, " </choice>\n"); - return 1; - } - else if (is_sequence(q)) - { if (q->info.minOccurs == 0) - fprintf(fd, " <sequence minOccurs=\"0\" maxOccurs=\"1\">\n"); - else - fprintf(fd, " <sequence>\n"); - if (q->info.typ->type == Tpointer) - gen_schema_elements(fd, (Tnode*)q->info.typ->ref, ns, ns1); - else if (q->info.typ->ref) - gen_schema_elements(fd, q->info.typ, ns, ns1); - fprintf(fd, " </sequence>\n"); - return 0; - } - else - { t = ns_convert(q->sym->name); - if (*t == '-') - fprintf(fd, " <any processContents=\"lax\" minOccurs=\"0\" maxOccurs=\"1\"/><!-- %s -->\n", q->sym->name); - else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) - { if (q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ)) - fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); - else - fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs); - if (gen_member_documentation(fd, p->id, q, ns)) - fprintf(fd, " </element>\n"); - } - else - { const char *form = ""; - if (!s) - { s = t; - if (*s == ':') - { s++; - form = " form=\"unqualified\""; - } - } - else - { s++; - form = " form=\"qualified\""; - } - if (q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ)) - fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\" nillable=\"true\"%s%s", s, wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, default_value(q, "default"), form); - else - fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"%s%s", s, wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, default_value(q, "default"), form); - if (gen_member_documentation(fd, p->id, q, ns)) - fprintf(fd, " </element>\n"); - } - } - fflush(fd); - return 0; -} - -void -gen_schema_elements_attributes(FILE *fd, Table *t, char *ns, char *ns1, char *style, char *encoding) -{ Entry *p, *q, *e; - Table *r; - Service *sp; - Method *m; - char *method_style, *method_encoding, *method_response_encoding; - int all = !strcmp(ns, ns1); - r = mktable(NULL); - for (p = classtable->list; p; p = p->next) - { if (!p->info.typ->ref || /* is_invisible(p->info.typ->id->name) || */ is_transient(p->info.typ) || is_primclass(p->info.typ) || is_dynamic_array(p->info.typ)) - continue; - for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) - { if (!is_repetition(q) && !is_anytype(q) && (!strchr(q->sym->name+1, ':') || !eq_ns(p->sym->name, q->sym->name)) && has_ns_eq(ns, q->sym->name) && !is_transient(q->info.typ) && q->info.typ->type != Tfun) - { Service *sp2; - Method *m; - m = NULL; - for (sp2 = services; sp2 && !m; sp2 = sp2->next) - for (m = sp2->list; m; m = m->next) - if ((m->mess&FAULT) && m->part && is_eq(m->part, q->sym->name)) - break; - if (m) - continue; /* already generated element for fault */ - e = entry(r, q->sym); - if (e) - { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute) || reftype(e->info.typ) != reftype(q->info.typ)) - { sprintf(errbuf, "Field '%s' of type '%s' at line %d has a type that does not correspond to the required unique type '%s' defined for elements '<%s>' in the WSDL namespace based on literal encoding: use SOAP RPC encoding or rename or use a namespace qualifier", q->sym->name, c_type(q->info.typ), q->lineno, c_type(e->info.typ), ns_convert(q->sym->name)); - semwarn(errbuf); - } - } - else - { if (q->info.sto & Sattribute) - fprintf(fd, " <attribute name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); - else - fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); - e = enter(r, q->sym); - e->info = q->info; - } - } - } - } - if (t && all) - { for (p = t->list; p; p = p->next) - { if (p->info.typ->type == Tfun && !is_invisible(p->sym->name) && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) - { method_encoding = encoding; - method_response_encoding = NULL; - method_style = style; - for (sp = services; sp; sp = sp->next) - { if (!tagcmp(sp->ns, ns)) - { for (m = sp->list; m; m = m->next) - { if (is_eq_nons(m->name, p->sym->name)) - { if (m->mess == ENCODING) - method_encoding = m->part; - else if (m->mess == RESPONSE_ENCODING) - method_response_encoding = m->part; - else if (m->mess == STYLE) - method_style = m->part; - } - } - } - } - if (!eflag) - { if (!method_response_encoding) - method_response_encoding = method_encoding; - q = entry(classtable, p->sym); - if (q) - { if (is_document(method_style)) - { if (!uflag) - fprintf(fd, " <!-- operation request element -->\n"); - fprintf(fd, " <element name=\"%s\">\n <complexType>\n <sequence>\n", ns_remove(p->sym->name)); - gen_schema_elements(fd, q->info.typ, ns, ns1); - fprintf(fd, " </sequence>\n"); - gen_schema_attributes(fd, q->info.typ, ns, ns1); - fprintf(fd, " </complexType>\n </element>\n"); - } - else if (is_literal(method_encoding)) - { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) - { if (!is_repetition(q) && !is_anytype(q) && !has_ns_eq(NULL, q->sym->name) && !is_transient(q->info.typ) && q->info.typ->type != Tfun && !(q->info.sto & Sattribute)) - { e = entry(r, q->sym); - if (e) - { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute)|| reftype(e->info.typ) != reftype(q->info.typ)) - { sprintf(errbuf, "Parameter '%s' of type '%s' at line %d has a type that does not correspond to the required unique type '%s' defined for elements '<%s>' in the WSDL namespace based on literal encoding: use SOAP RPC encoding or rename or use a namespace qualifier", q->sym->name, c_type(q->info.typ), q->lineno, c_type(e->info.typ), ns_convert(q->sym->name)); - semwarn(errbuf); - } - } - else - { if (!uflag) - fprintf(fd, " <!-- operation request element -->\n"); - fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); - e = enter(r, q->sym); - e->info = q->info; - } - } - } - } - q = (Entry*)p->info.typ->ref; - for (e = t->list; e; e = e->next) - if (e != p && e->info.typ->type == Tfun && !(e->info.sto & Sextern) && q == (Entry*)e->info.typ->ref) - q = NULL; - if (q && !is_transient(q->info.typ)) - { if (!is_response(q->info.typ)) - { if (is_document(method_style)) - { if (!uflag) - fprintf(fd, " <!-- operation response element -->\n"); - fprintf(fd, " <element name=\"%sResponse\">\n <complexType>\n", ns_remove(p->sym->name)); - fprintf(fd, " <sequence>\n"); - gen_schema_element(fd, p->info.typ, q, ns, ns1); - fprintf(fd, " </sequence>\n"); - fprintf(fd, " </complexType>\n </element>\n"); - } - else if (is_literal(method_response_encoding)) - { e = entry(r, q->sym); - if (e) - { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute)|| reftype(e->info.typ) != reftype(q->info.typ)) - { sprintf(errbuf, "Qualified member field '%s' has a type that does not correspond to the unique type '%s' defined for elements '<%s>'", q->sym->name, c_type(q->info.typ), ns_convert(q->sym->name)); - semwarn(errbuf); - } - } - else - { if (!uflag) - fprintf(fd, " <!-- operation response element -->\n"); - fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); - e = enter(r, q->sym); - e->info = q->info; - } - } - } - else if (((Tnode*)q->info.typ->ref)->ref) - { if (is_document(method_style)) - { if (!has_ns_eq(NULL, q->sym->name)) - { e = entry(r, ((Tnode*)q->info.typ->ref)->id); - if (!e) - { if (!uflag) - fprintf(fd, " <!-- operation response element -->\n"); - fprintf(fd, " <element name=\"%s\">\n <complexType>\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); - fprintf(fd, " <sequence>\n"); - gen_schema_elements(fd, (Tnode*)q->info.typ->ref, ns, ns1); - fprintf(fd, " </sequence>\n"); - gen_schema_attributes(fd, (Tnode*)q->info.typ->ref, ns, ns1); - fprintf(fd, " </complexType>\n </element>\n"); - e = enter(r, ((Tnode*)q->info.typ->ref)->id); - e->info = q->info; - } - } - } - else if (is_literal(method_response_encoding)) - { for (q = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; q; q = q->next) - { if (!is_repetition(q) && !is_anytype(q) && !has_ns_eq(NULL, q->sym->name) && !is_transient(q->info.typ) && q->info.typ->type != Tfun && !(q->info.sto & Sattribute)) - { e = entry(r, q->sym); - if (e) - { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute)|| reftype(e->info.typ) != reftype(q->info.typ)) - { sprintf(errbuf, "Qualified member field '%s' has a type that does not correspond to the unique type '%s' defined for elements '<%s>'", q->sym->name, c_type(q->info.typ), ns_convert(q->sym->name)); - semwarn(errbuf); - } - } - else - { if (!uflag) - fprintf(fd, " <!-- operation response element -->\n"); - fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); - e = enter(r, q->sym); - e->info = q->info; - } - } - } - } - } - } - } - } - } - } - } - if (t) - { for (p = t->list; p; p = p->next) - { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && !eflag) - { q = (Entry*)p->info.typ->ref; - if (q && !is_transient(q->info.typ)) - { if (is_response(q->info.typ)) - { if (has_ns_eq(ns, q->sym->name)) - { e = entry(r, q->sym); - if (!e) - { if (!uflag) - fprintf(fd, " <!-- operation response element -->\n"); - fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); - e = enter(r, q->sym); - e->info = q->info; - } - } - } - } - } - } - } - freetable(r); -} - -void -gen_schema_attributes(FILE *fd, Tnode *p, char *ns, char *ns1) -{ Entry *q; - char *t, *s, *r; - for (q = ((Table*)p->ref)->list; q; q = q->next) - { if (q->info.sto & Sattribute) - { r = default_value(q, "default"); - t = ns_convert(q->sym->name); - if (*t == '-' || is_anyAttribute(q->info.typ)) - fprintf(fd, " <anyAttribute processContents=\"lax\"/><!-- %s -->\n", q->sym->name); - else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) - { if (r && *r) - fprintf(fd, " <attribute ref=\"%s\" use=\"default\"%s/>\n", t, r); - else if (q->info.typ->type != Tpointer || q->info.minOccurs) - fprintf(fd, " <attribute ref=\"%s\" use=\"required\"/>\n", t); - else if (q->info.maxOccurs == 0) - fprintf(fd, " <attribute ref=\"%s\" use=\"prohibited\"/>\n", t); - else - fprintf(fd, " <attribute ref=\"%s\" use=\"optional\"/>\n", t); - } - else - { const char *form = ""; - if (!s) - { s = t; - if (*s == ':') - { s++; - form = " form=\"unqualified\""; - } - } - else - { s++; - form = " form=\"qualified\""; - } - if (r && *r) - fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"default\"%s%s", s, wsdl_type(q->info.typ, ns1), r, form); - else if ((q->info.typ->type != Tpointer && !is_stdstring(q->info.typ) && !is_stdwstring(q->info.typ)) || q->info.minOccurs) - fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"required\"%s", s, wsdl_type(q->info.typ, ns1), form); - else if (q->info.maxOccurs == 0) - fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"prohibited\"", s, wsdl_type(q->info.typ, ns1)); - else - fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"optional\"%s", s, wsdl_type(q->info.typ, ns1), form); - if (gen_member_documentation(fd, p->id, q, ns)) - fprintf(fd, " </attribute>\n"); - } - fflush(fd); - } - } -} - -void -gen_type_documentation(FILE *fd, Entry *type, char *ns) -{ Service *sp; - Data *d; - if (!type->sym) - { fprintf(fd, "\n"); - return; - } - for (sp = services; sp; sp = sp->next) - { if (!tagcmp(sp->ns, ns)) - { for (d = sp->data; d; d = d->next) - { if (!strstr(d->name, "::") && is_eq_nons(d->name, type->sym->name)) - { fprintf(fd, "\n <annotation>\n <documentation>%s</documentation>\n </annotation>\n", d->text); - return; - } - } - } - } - if (!uflag) - fprintf(fd, "<!-- %s -->\n", type->sym->name); - fprintf(fd, "\n"); -} - -int -gen_member_documentation(FILE *fd, Symbol *type, Entry *member, char *ns) -{ Service *sp; - Data *d; - char *t; - if (!type || !member->sym) - { fprintf(fd, "/>\n"); - return 0; - } - t = ns_remove(type->name); - for (sp = services; sp; sp = sp->next) - { if (!tagcmp(sp->ns, ns)) - { for (d = sp->data; d; d = d->next) - { char *s = strstr(d->name, "::"); - if (s && !strncmp(t, d->name, s-d->name) && !strcmp(s + 2, member->sym->name)) - { fprintf(fd, ">\n <annotation>\n <documentation>%s</documentation>\n </annotation>\n", d->text); - return 1; - } - } - } - } - fprintf(fd, "/>"); - if (!uflag) - fprintf(fd, "<!-- %s::%s -->", type->name, member->sym->name); - fprintf(fd, "\n"); - return 0; -} - -void -gen_nsmap(FILE *fd, Symbol *ns, char *URI) -{ Symbol *ns1; - Service *sp; - fprintf(fd, "{\n"); - for (ns1 = nslist; ns1; ns1 = ns1->next) - { for (sp = services; sp; sp = sp->next) - if (!tagcmp(sp->ns, ns1->name) && sp->URI) - break; - if (sp) - { if (!strcmp(ns1->name, "SOAP-ENV")) - { if (vflag < 0) - fprintf(fd, "\t{\"SOAP-ENV\", NULL, NULL, NULL},\n"); - else - fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : envURI); - } - else if (!strcmp(ns1->name, "SOAP-ENC")) - { if (vflag < 0) - fprintf(fd, "\t{\"SOAP-ENC\", NULL, NULL, NULL},\n"); - else - fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : encURI); - } - else if (sp->URI2) - fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2); - else - fprintf(fd, "\t{\"%s\", \"%s\", NULL, NULL},\n", ns_convert(ns1->name), sp->URI); - } - else if (!strcmp(ns1->name, "SOAP-ENV")) - { if (vflag < 0) - fprintf(fd, "\t{\"SOAP-ENV\", NULL, NULL, NULL},\n"); - else if (is_soap12(NULL)) - fprintf(fd, "\t{\"SOAP-ENV\", \"%s\", \"http://schemas.xmlsoap.org/soap/envelope/\", NULL},\n", envURI); - else - fprintf(fd, "\t{\"SOAP-ENV\", \"%s\", \"http://www.w3.org/*/soap-envelope\", NULL},\n", envURI); - } - else if (!strcmp(ns1->name, "SOAP-ENC")) - { if (vflag < 0) - fprintf(fd, "\t{\"SOAP-ENC\", NULL, NULL, NULL},\n"); - else if (is_soap12(NULL)) - fprintf(fd, "\t{\"SOAP-ENC\", \"%s\", \"http://schemas.xmlsoap.org/soap/encoding/\", NULL},\n", encURI); - else - fprintf(fd, "\t{\"SOAP-ENC\", \"%s\", \"http://www.w3.org/*/soap-encoding\", NULL},\n", encURI); - } - else if (!strcmp(ns1->name, "xsi")) - fprintf(fd, "\t{\"xsi\", \"%s\", \"http://www.w3.org/*/XMLSchema-instance\", NULL},\n", xsiURI); - else if (!strcmp(ns1->name, "xsd")) - fprintf(fd, "\t{\"xsd\", \"%s\", \"http://www.w3.org/*/XMLSchema\", NULL},\n", xsdURI); - else - fprintf(fd, "\t{\"%s\", \"%s/%s.xsd\", NULL, NULL},\n", ns_convert(ns1->name), tmpURI, ns_convert(ns1->name)); - } - fprintf(fd, "\t{NULL, NULL, NULL, NULL}\n};\n"); -} - -void -gen_proxy(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) -{ Entry *p, *q, *r; - Table *t, *output; - Service *sp; - int flag; - char *name1; - name1 = ns_cname(name, NULL); - for (sp = services; sp; sp = sp->next) - if (!tagcmp(sp->ns, ns->name)) - break; - fprintf(fd, "\n\n#ifndef %s%sProxy_H\n#define %s%sProxy_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); - if (nflag) - fprintf(fd, "\nextern SOAP_NMAC struct Namespace %s_namespaces[];", prefix); - if (namespaceid) - fprintf(fd,"\n\nnamespace %s {", namespaceid); - fprintf(fd, "\nclass %s\n{ public:\n\t/// Runtime engine context allocated in constructor\n\tstruct soap *soap;\n\t/// Endpoint URL of service '%s' (change as needed)\n\tconst char *endpoint;\n\t/// Constructor allocates soap engine context, sets default endpoint URL, and sets namespace mapping table\n", name1, name); - if (nflag) - fprintf(fd, "\t%s() { soap = soap_new(); if (soap) soap->namespaces = %s_namespaces; endpoint = \"%s\"; };\n", name1, prefix, URL); - else - { fprintf(fd, "\t%s()\n\t{ soap = soap_new(); endpoint = \"%s\"; if (soap && !soap->namespaces) { static const struct Namespace namespaces[] = \n", name1, URL); - gen_nsmap(fd, ns, URI); - fprintf(fd, "\tsoap->namespaces = namespaces; } };\n"); - } - fprintf(fd, "\t/// Destructor frees deserialized data and soap engine context\n\tvirtual ~%s() { if (soap) { soap_destroy(soap); soap_end(soap); soap_free(soap); } };\n", name1); - fflush(fd); - for (r = table->list; r; r = r->next) - if (r->info.typ->type == Tfun && !(r->info.sto & Sextern) && has_ns_eq(ns->name, r->sym->name)) - { p = entry(table, r->sym); - if (p) - q = (Entry*)p->info.typ->ref; - else - { fprintf(stderr, "Internal error: no table entry\n"); - return; - } - p = entry(classtable, r->sym); - if (!p) - { fprintf(stderr, "Internal error: no parameter table entry\n"); - return; - } - output = (Table*)p->info.typ->ref; - /* - if ((s = strstr(r->sym->name, "__"))) - s += 2; - else - s = r->sym->name; - fprintf(fd, "\tvirtual int %s(", s); - */ - fprintf(fd, "\t/// Invoke '%s' of service '%s' and return error code (or SOAP_OK)\n", ns_remove(r->sym->name), name); - fprintf(fd, "\tvirtual int %s(", ident(r->sym->name)); - flag = 0; - for (t = output; t; t = t->prev) - { p = t->list; - if (p) - { fprintf(fd, "%s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); - for (p = p->next; p; p = p->next) - fprintf(fd, ", %s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); - flag = 1; - } - } - if (is_transient(q->info.typ)) - fprintf(fd,") { return soap ? soap_send_%s(soap, endpoint, NULL", ident(r->sym->name)); - else if (flag) - fprintf(fd,", %s%s) { return soap ? soap_call_%s(soap, endpoint, NULL", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name), ident(r->sym->name)); - else - fprintf(fd,"%s%s) { return soap ? soap_call_%s(soap, endpoint, NULL", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name), ident(r->sym->name)); - /* the action is now handled by the soap_call/soap_send operation when we pass NULL */ - #if 0 - m = NULL; - if (sp && (s = strstr(r->sym->name, "__"))) - for (m = sp->list; m; m = m->next) - if (m->part && m->mess == ACTION && !strcmp(m->name, s+2)) - { if (*m->part == '"') - fprintf(fd, "%s", m->part); - else - fprintf(fd, "\"%s\"", m->part); - break; - } - if (!m) - fprintf(fd, "NULL"); - #endif - for (t = output; t; t = t->prev) - for (p = t->list; p; p = p->next) - fprintf(fd, ", %s", ident(p->sym->name)); - if (is_transient(q->info.typ)) - fprintf(fd,") : SOAP_EOM; };\n"); - else - fprintf(fd,", %s) : SOAP_EOM; };\n", ident(q->sym->name)); - fflush(fd); - } - fprintf(fd, "};"); - if (namespaceid) - fprintf(fd,"\n\n} // namespace %s\n", namespaceid); - fprintf(fd, "\n#endif\n"); -} - -void -gen_object(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) -{ char *name1; - Entry *method; - name1 = ns_cname(name, NULL); - fprintf(fd, "\n\n#ifndef %s%sObject_H\n#define %s%sObject_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); - banner(fd, "Service Object"); - if (namespaceid) - fprintf(fd,"\n\nnamespace %s {", namespaceid); - fprintf(fd, "\nclass %sService : public soap\n{ public:", name1); - fprintf(fd, "\n\t%sService()\n\t{ static const struct Namespace namespaces[] =\n", name1); - gen_nsmap(fd, ns, URI); - fprintf(fd, "\n\tthis->namespaces = namespaces; };"); - fprintf(fd, "\n\tvirtual ~%sService() { };", name1); - fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)"); - fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog) { return soap_bind(this, host, port, backlog); };"); - fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)"); - fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept() { return soap_accept(this); };"); - fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); - fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used"); - fprintf(fd, "\n\tvirtual\tint ssl_accept() { return soap_ssl_accept(this); };"); - fprintf(fd, "\n#endif"); - fprintf(fd, "\n\t/// Serve this request (returns error code or SOAP_OK)"); - if (nflag) - fprintf(fd, "\n\tvirtual\tint serve() { return %s_serve(this); };", prefix); - else - fprintf(fd, "\n\tvirtual\tint serve() { return soap_serve(this); };"); - fprintf(fd, "\n};"); - banner(fd, "Service Operations (you should define these globally)"); - for (method = table->list; method; method = method->next) - { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) - { Entry *p, *q=entry(table, method->sym); - Table *output; - if (q) - p = (Entry*)q->info.typ->ref; - else - { fprintf(stderr, "Internal error: no table entry\n"); - return; - } - q = entry(classtable, method->sym); - output = (Table*)q->info.typ->ref; - fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(method->sym->name)); - gen_params(fd, output, p, 1); - fprintf(fd, ";"); - } - } - if (namespaceid) - fprintf(fd,"\n\n} // namespace %s\n", namespaceid); - fprintf(fd, "\n\n#endif\n"); -} - -void -gen_proxy_header(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) -{ Entry *p, *method; - Table *t; - fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); - if (namespaceid) - fprintf(fd,"\n\nnamespace %s {", namespaceid); - if (iflag) - fprintf(fd, "\n\nclass SOAP_CMAC %s : public soap\n{ public:", name); - else - fprintf(fd, "\n\nclass SOAP_CMAC %s\n{ public:", name); - if (!iflag) - fprintf(fd, "\n\tstruct soap *soap;\n\tbool own;"); - fprintf(fd, "\n\t/// Endpoint URL of service '%s' (change as needed)", name); - fprintf(fd, "\n\tconst char *soap_endpoint;"); - fprintf(fd, "\n\t/// Constructor"); - fprintf(fd, "\n\t%s();", name); - if (iflag) - { fprintf(fd, "\n\t/// Construct from another engine state"); - fprintf(fd, "\n\t%s(const struct soap&);", name); - } - else - { fprintf(fd, "\n\t/// Constructor to use/share an engine state"); - fprintf(fd, "\n\t%s(struct soap*);", name); - } - fprintf(fd, "\n\t/// Constructor with endpoint URL"); - fprintf(fd, "\n\t%s(const char *url);", name); - fprintf(fd, "\n\t/// Constructor with engine input+output mode control"); - fprintf(fd, "\n\t%s(soap_mode iomode);", name); - fprintf(fd, "\n\t/// Constructor with URL and input+output mode control"); - fprintf(fd, "\n\t%s(const char *url, soap_mode iomode);", name); - fprintf(fd, "\n\t/// Constructor with engine input and output mode control"); - fprintf(fd, "\n\t%s(soap_mode imode, soap_mode omode);", name); - fprintf(fd, "\n\t/// Destructor frees deserialized data"); - fprintf(fd, "\n\tvirtual\t~%s();", name); - fprintf(fd, "\n\t/// Initializer used by constructors"); - fprintf(fd, "\n\tvirtual\tvoid %s_init(soap_mode imode, soap_mode omode);", name); - fprintf(fd, "\n\t/// Delete all deserialized data (with soap_destroy and soap_end)"); - fprintf(fd, "\n\tvirtual\tvoid destroy();"); - fprintf(fd, "\n\t/// Delete all deserialized data and reset to default"); - fprintf(fd, "\n\tvirtual\tvoid reset();"); - fprintf(fd, "\n\t/// Disables and removes SOAP Header from message"); - fprintf(fd, "\n\tvirtual\tvoid soap_noheader();"); - if (!namespaceid) - { - p = entry(classtable, lookup("SOAP_ENV__Header")); - if (p) - { t = (Table*)p->info.typ->ref; - if (t && t->list && !is_void(t->list->info.typ)) - { fprintf(fd, "\n\t/// Put SOAP Header in message"); - fprintf(fd, "\n\tvirtual\tvoid soap_header("); - gen_params(fd, t, NULL, 0); - fprintf(fd, ";"); - } - } - } - fprintf(fd, "\n\t/// Get SOAP Header structure (NULL when absent)"); - fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Header *soap_header();"); - fprintf(fd, "\n\t/// Get SOAP Fault structure (NULL when absent)"); - fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Fault *soap_fault();"); - fprintf(fd, "\n\t/// Get SOAP Fault string (NULL when absent)"); - fprintf(fd, "\n\tvirtual\tconst char *soap_fault_string();"); - fprintf(fd, "\n\t/// Get SOAP Fault detail as string (NULL when absent)"); - fprintf(fd, "\n\tvirtual\tconst char *soap_fault_detail();"); - fprintf(fd, "\n\t/// Close connection (normally automatic, except for send_X ops)"); - fprintf(fd, "\n\tvirtual\tint soap_close_socket();"); - fprintf(fd, "\n\t/// Force close connection (can kill a thread blocked on IO)"); - fprintf(fd, "\n\tvirtual\tint soap_force_close_socket();"); - fprintf(fd, "\n\t/// Print fault"); - fprintf(fd, "\n\tvirtual\tvoid soap_print_fault(FILE*);"); - fprintf(fd, "\n#ifndef WITH_LEAN\n\t/// Print fault to stream"); - fprintf(fd, "\n#ifndef WITH_COMPAT"); - fprintf(fd, "\n\tvirtual\tvoid soap_stream_fault(std::ostream&);"); - fprintf(fd, "\n#endif\n"); - fprintf(fd, "\n\t/// Put fault into buffer"); - fprintf(fd, "\n\tvirtual\tchar *soap_sprint_fault(char *buf, size_t len);\n#endif"); - for (method = table->list; method; method = method->next) - if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) - gen_method(fd, table, method, 0); - fprintf(fd, "\n};"); - if (namespaceid) - fprintf(fd,"\n\n} // namespace %s\n", namespaceid); - fprintf(fd, "\n#endif\n"); -} - -void -gen_proxy_code(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) -{ Entry *p, *method, *param; - Table *t; - char *soap; - if (iflag) - soap = "this"; - else - soap = "this->soap"; - fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); - if (namespaceid) - fprintf(fd,"\n\nnamespace %s {", namespaceid); - if (iflag) - { fprintf(fd, "\n\n%s::%s()\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); - fprintf(fd, "\n\n%s::%s(const char *url)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n\tsoap_endpoint = url;\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(const char *url, soap_mode iomode)\n{\t%s_init(iomode, iomode);\n\tsoap_endpoint = url;\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\t%s_init(imode, omode);\n}", name, name, name); - fprintf(fd, "\n\n%s::~%s()\n{ }", name, name); - } - else - { fprintf(fd, "\n\n%s::%s()\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(struct soap *_soap)\n{\tthis->soap = _soap;\n\tthis->own = false;\n\t%s_init(_soap->imode, _soap->omode);\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(const char *url)\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n\tsoap_endpoint = url;\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(iomode, iomode);\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(const char *url, soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(iomode, iomode);\n\tsoap_endpoint = url;\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(imode, omode);\n}", name, name, name); - fprintf(fd, "\n\n%s::~%s()\n{\tif (this->own)\n\t\tsoap_free(this->soap);\n}", name, name); - } - fprintf(fd, "\n\nvoid %s::%s_init(soap_mode imode, soap_mode omode)\n{\tsoap_imode(%s, imode);\n\tsoap_omode(%s, omode);\n\tsoap_endpoint = NULL;\n\tstatic const struct Namespace namespaces[] =\n", name, name, soap, soap); - gen_nsmap(fd, ns, URI); - fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); - fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); - fprintf(fd, "\n\nvoid %s::reset()\n{\tdestroy();\n\tsoap_done(%s);\n\tsoap_initialize(%s);\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, soap, soap, name); - fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); - if (!namespaceid) - { - p = entry(classtable, lookup("SOAP_ENV__Header")); - if (p) - { t = (Table*)p->info.typ->ref; - if (t && t->list && !is_void(t->list->info.typ)) - { fprintf(fd, "\n\nvoid %s::soap_header(", name); - gen_params(fd, t, NULL, 0); - fprintf(fd, "\n{\t::soap_header(%s);", soap); - for (param = t->list; param; param = param->next) - { if (namespaceid) - fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); - else - fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); - } - fprintf(fd, "\n}"); - } - } - } - fprintf(fd, "\n\nconst SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); - fprintf(fd, "\n\nconst SOAP_ENV__Fault *%s::soap_fault()\n{\treturn %s->fault;\n}", name, soap); - fprintf(fd, "\n\nconst char *%s::soap_fault_string()\n{\treturn *soap_faultstring(%s);\n}", name, soap); - fprintf(fd, "\n\nconst char *%s::soap_fault_detail()\n{\treturn *soap_faultdetail(%s);\n}", name, soap); - fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap); - fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap); - fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); - fprintf(fd, "\n\n#ifndef WITH_LEAN\n#ifndef WITH_COMPAT\nvoid %s::soap_stream_fault(std::ostream& os)\n{\t::soap_stream_fault(%s, os);\n}\n#endif", name, soap); - fprintf(fd, "\n\nchar *%s::soap_sprint_fault(char *buf, size_t len)\n{\treturn ::soap_sprint_fault(%s, buf, len);\n}\n#endif", name, soap); - for (method = table->list; method; method = method->next) - if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) - gen_call_method(fd, table, method, name); - if (namespaceid) - fprintf(fd,"\n\n} // namespace %s\n", namespaceid); - fprintf(fd,"\n/* End of client proxy code */\n"); -} - -void -gen_object_header(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) -{ Entry *p, *method; - Table *t; - fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); - if (namespaceid) - fprintf(fd,"\n\nnamespace %s {", namespaceid); - if (iflag) - fprintf(fd, "\nclass SOAP_CMAC %s : public soap\n{ public:", name); - else - { fprintf(fd, "\nclass SOAP_CMAC %s\n{ public:", name); - fprintf(fd, "\n\tstruct soap *soap;\n\tbool own;"); - } - fprintf(fd, "\n\t/// Constructor"); - fprintf(fd, "\n\t%s();", name); - if (iflag) - { fprintf(fd, "\n\t/// Construct from another engine state"); - fprintf(fd, "\n\t%s(const struct soap&);", name); - } - else - { fprintf(fd, "\n\t/// Constructor to use/share an engine state"); - fprintf(fd, "\n\t%s(struct soap*);", name); - } - fprintf(fd, "\n\t/// Constructor with engine input+output mode control"); - fprintf(fd, "\n\t%s(soap_mode iomode);", name); - fprintf(fd, "\n\t/// Constructor with engine input and output mode control"); - fprintf(fd, "\n\t%s(soap_mode imode, soap_mode omode);", name); - fprintf(fd, "\n\t/// Destructor, also frees all deserialized data"); - fprintf(fd, "\n\tvirtual ~%s();", name); - fprintf(fd, "\n\t/// Delete all deserialized data (with soap_destroy and soap_end)"); - fprintf(fd, "\n\tvirtual\tvoid destroy();"); - fprintf(fd, "\n\t/// Delete all deserialized data and reset to defaults"); - fprintf(fd, "\n\tvirtual\tvoid reset();"); - fprintf(fd, "\n\t/// Initializer used by constructor"); - fprintf(fd, "\n\tvirtual\tvoid %s_init(soap_mode imode, soap_mode omode);", name); - fprintf(fd, "\n\t/// Create a copy"); - fprintf(fd, "\n\tvirtual\t%s *copy() SOAP_PURE_VIRTUAL;", name); - fprintf(fd, "\n\t/// Close connection (normally automatic)"); - fprintf(fd, "\n\tvirtual\tint soap_close_socket();"); - fprintf(fd, "\n\t/// Force close connection (can kill a thread blocked on IO)"); - fprintf(fd, "\n\tvirtual\tint soap_force_close_socket();"); - fprintf(fd, "\n\t/// Return sender-related fault to sender"); - fprintf(fd, "\n\tvirtual\tint soap_senderfault(const char *string, const char *detailXML);"); - fprintf(fd, "\n\t/// Return sender-related fault with SOAP 1.2 subcode to sender"); - fprintf(fd, "\n\tvirtual\tint soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML);"); - fprintf(fd, "\n\t/// Return receiver-related fault to sender"); - fprintf(fd, "\n\tvirtual\tint soap_receiverfault(const char *string, const char *detailXML);"); - fprintf(fd, "\n\t/// Return receiver-related fault with SOAP 1.2 subcode to sender"); - fprintf(fd, "\n\tvirtual\tint soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML);"); - fprintf(fd, "\n\t/// Print fault"); - fprintf(fd, "\n\tvirtual\tvoid soap_print_fault(FILE*);"); - fprintf(fd, "\n#ifndef WITH_LEAN\n\t/// Print fault to stream"); - fprintf(fd, "\n#ifndef WITH_COMPAT"); - fprintf(fd, "\n\tvirtual\tvoid soap_stream_fault(std::ostream&);"); - fprintf(fd, "\n#endif"); - fprintf(fd, "\n\t/// Put fault into buffer"); - fprintf(fd, "\n\tvirtual\tchar *soap_sprint_fault(char *buf, size_t len);\n#endif"); - fprintf(fd, "\n\t/// Disables and removes SOAP Header from message"); - fprintf(fd, "\n\tvirtual\tvoid soap_noheader();"); - if (!namespaceid) - { - p = entry(classtable, lookup("SOAP_ENV__Header")); - if (p) - { t = (Table*)p->info.typ->ref; - if (t && t->list && !is_void(t->list->info.typ)) - { fprintf(fd, "\n\t/// Put SOAP Header in message"); - fprintf(fd, "\n\tvirtual\tvoid soap_header("); - gen_params(fd, t, NULL, 0); - fprintf(fd, ";"); - } - } - } - fprintf(fd, "\n\t/// Get SOAP Header structure (NULL when absent)"); - fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Header *soap_header();"); - fprintf(fd, "\n\t/// Run simple single-thread iterative service on port until a connection error occurs (returns error code or SOAP_OK), use this->bind_flag = SO_REUSEADDR to rebind for a rerun"); - fprintf(fd, "\n\tvirtual\tint run(int port);"); - fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)"); - fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog);"); - fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)"); - fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept();"); - fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); - fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used"); - fprintf(fd, "\n\tvirtual\tint ssl_accept();"); - fprintf(fd, "\n#endif"); - fprintf(fd, "\n\t/// Serve this request (returns error code or SOAP_OK)"); - fprintf(fd, "\n\tvirtual\tint serve();"); - fprintf(fd, "\n\t/// Used by serve() to dispatch a request (returns error code or SOAP_OK)"); - fprintf(fd, "\n\tvirtual\tint dispatch();"); - fprintf(fd, "\n\n\t///\n\t/// Service operations (you should define these):\n\t/// Note: compile with -DWITH_PURE_VIRTUAL for pure virtual methods\n\t///"); - for (method = table->list; method; method = method->next) - if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) - gen_method(fd, table, method, 1); - fprintf(fd, "\n};"); - if (namespaceid) - fprintf(fd,"\n\n} // namespace %s\n", namespaceid); - fprintf(fd, "\n#endif\n"); -} - -void -gen_method(FILE *fd, Table *table, Entry *method, int server) -{ Table *params; - Entry *result, *p; - char *soap; - if (iflag) - soap = "this"; - else - soap = "this->soap"; - result = (Entry*)method->info.typ->ref; - p = entry(classtable, method->sym); - if (!p) - execerror("no table entry"); - params = (Table*)p->info.typ->ref; - if (server || !is_transient(result->info.typ)) - { if (is_transient(result->info.typ)) - fprintf(fd, "\n\n\t/// Web service one-way operation '%s' (return error code, SOAP_OK (no response), or send_%s_empty_response())", ns_remove(method->sym->name), ns_remove(method->sym->name)); - else - fprintf(fd, "\n\n\t/// Web service operation '%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); - fprintf(fd, "\n\tvirtual\tint %s(", ns_cname(method->sym->name, NULL)); - gen_params(fd, params, result, 0); - if (!server) - { fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); - gen_args(fd, params, result, 1); - fprintf(fd, "; }"); - fprintf(fd, "\n\tvirtual\tint %s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); - gen_params(fd, params, result, 1); - } - if (server) - fprintf(fd, " SOAP_PURE_VIRTUAL;"); - else - fprintf(fd, ";"); - if (is_transient(result->info.typ)) - fprintf(fd, "\n\tvirtual\tint send_%s_empty_response(int httpcode) { return soap_send_empty_response(%s, httpcode); }", ns_cname(method->sym->name, NULL), soap); - } - else - { fprintf(fd, "\n\n\t/// Web service one-way send operation 'send_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); - fprintf(fd, "\n\tvirtual\tint send_%s(", ns_cname(method->sym->name, NULL)); - gen_params(fd, params, result, 0); - fprintf(fd, " { return this->send_%s(NULL, NULL", ns_cname(method->sym->name, NULL)); - gen_args(fd, params, result, 1); - fprintf(fd, "; }"); - fprintf(fd, "\n\tvirtual\tint send_%s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); - gen_params(fd, params, result, 1); - fprintf(fd, ";\n\t/// Web service one-way receive operation 'recv_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); - fprintf(fd, ";\n\tvirtual\tint recv_%s(", ns_cname(method->sym->name, NULL)); - fprintf(fd, "struct %s&);", ident(method->sym->name)); - fprintf(fd, "\n\t/// Web service receive of HTTP Accept acknowledgment for one-way send operation 'send_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); - fprintf(fd, "\n\tvirtual\tint recv_%s_empty_response() { return soap_recv_empty_response(%s); }", ns_cname(method->sym->name, NULL), soap); - fprintf(fd, "\n\t/// Web service one-way synchronous send operation '%s' with HTTP Accept/OK response receive (returns error code or SOAP_OK)", ns_remove(method->sym->name)); - fprintf(fd, "\n\tvirtual\tint %s(", ns_cname(method->sym->name, NULL)); - gen_params(fd, params, result, 0); - fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); - gen_args(fd, params, result, 1); - fprintf(fd, "; }"); - fprintf(fd, "\n\tvirtual\tint %s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); - gen_params(fd, params, result, 1); - fprintf(fd, " { if (this->send_%s(endpoint, soap_action", ns_cname(method->sym->name, NULL)); - gen_args(fd, params, result, 1); - fprintf(fd, " || soap_recv_empty_response(%s)) return %s->error; return SOAP_OK; }", soap, soap); - } -} - -void -gen_params(FILE *fd, Table *params, Entry *result, int flag) -{ Entry *param; - for (param = params->list; param; param = param->next) - fprintf(fd, "%s%s%s", flag || param != params->list ? ", " : "", c_storage(param->info.sto), c_type_id(param->info.typ, param->sym->name)); - if (!result || is_transient(result->info.typ)) - fprintf(fd, ")"); - else - fprintf(fd, "%s%s%s)", flag || params->list ? ", " : "", c_storage(result->info.sto), c_type_id(result->info.typ, result->sym->name)); -} - -void -gen_args(FILE *fd, Table *params, Entry *result, int flag) -{ Entry *param; - for (param = params->list; param; param = param->next) - fprintf(fd, "%s%s", flag || param != params->list ? ", " : "", param->sym->name); - if (!result || is_transient(result->info.typ)) - fprintf(fd, ")"); - else - fprintf(fd, "%s%s)", flag || params->list ? ", " : "", result->sym->name); -} - -void -gen_query_url(FILE *fd, Table *params) -{ Entry *param; - int flag = 0; - fprintf(fd, "\n\tif (\n#ifdef HAVE_SNPRINTF\n\tsoap_snprintf(soap->msgbuf, sizeof(soap->msgbuf),\n#else\n\tsprintf(soap->msgbuf,\n#endif\n\t\t\"%%s?"); - for (param = params->list; param; param = param->next) - if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) - fprintf(fd, "%s%s=%s", flag++ ? "&" : "", ns_remove(param->sym->name), gen_format(fd, param->info.typ)); - fprintf(fd, "\", soap_endpoint"); - for (param = params->list; param; param = param->next) - { if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) - { if (is_stdstring(param->info.typ)) - fprintf(fd, ", soap_encode_url_string(soap, %s.c_str())", ident(param->sym->name)); - else if (is_string(param->info.typ)) - fprintf(fd, ", soap_encode_url_string(soap, %s)", ident(param->sym->name)); - else if (is_primitive(param->info.typ)) - fprintf(fd, ", %s", ident(param->sym->name)); - } - } - fprintf(fd, ") < 0)\n\t{\tsoap->error = SOAP_EOM;\n\t\treturn soap_closesock(soap);\n\t}"); -} - -void -gen_query_form(FILE *fd, Table *params) -{ Entry *param; - int flag = 0; - fprintf(fd, "\n\tif ("); - for (param = params->list; param; param = param->next) - { if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) - { fprintf(fd, "soap_send(soap, \"%s%s=\")", flag++ ? "&" : "", ns_remove(param->sym->name)); - if (is_stdstring(param->info.typ)) - fprintf(fd, " || soap_send(soap, soap_encode_url_string(soap, %s.c_str()))\n\t || ", ident(param->sym->name)); - else if (is_string(param->info.typ)) - fprintf(fd, " || soap_send(soap_encode_url_string(soap, %s))\n\t || ", ident(param->sym->name)); - else if (is_primitive(param->info.typ)) - fprintf(fd, " || soap_send(soap, soap_%s2s(soap, %s))\n\t || ", c_ident(param->info.typ), ident(param->sym->name)); - } - } -} - -const char* -gen_format(FILE *fd, Tnode *typ) -{ if (is_string(typ) || is_stdstring(typ)) - return "%s"; - switch (typ->type) - { case Tchar: return "%hhd"; - case Tshort: return "%hd"; - case Tint: return "%d"; - case Tlong: return "%ld"; - case Tllong: return SOAP_LONG_FORMAT; - case Tfloat: return "%.9G"; - case Tdouble: return "%.17lG"; - case Tuchar: return "%hhu"; - case Tushort: return "%hu"; - case Tuint: return "%u"; - case Tulong: return "%lu"; - case Tullong: return SOAP_ULONG_FORMAT; - default: return ""; - } -} - -void -gen_call_method(FILE *fd, Table *table, Entry *method, char *name) -{ Service *sp; - Method *m; - int soap = (vflag >= 0); - int version = vflag; - int get = 0; - int put = 0; - int post = 0; - int mime = 0; - const char *style, *encoding; - const char *xtag, *xtyp; - const char *action = NULL, *method_encoding = NULL, *method_response_encoding = NULL; - Table *params; - Entry *param, *result, *p, *response = NULL; - result = (Entry*)method->info.typ->ref; - p = entry(classtable, method->sym); - if (!p) - execerror("no table entry"); - params = (Table*)p->info.typ->ref; - if (!is_response(result->info.typ) && !is_XML(result->info.typ)) - response = get_response(method->info.typ); - if (name) - { if (!is_transient(result->info.typ)) - fprintf(fd, "\n\nint %s::%s(const char *endpoint, const char *soap_action", name, ns_cname(method->sym->name, NULL)); - else - fprintf(fd, "\n\nint %s::send_%s(const char *endpoint, const char *soap_action", name, ns_cname(method->sym->name, NULL)); - gen_params(fd, params, result, 1); - } - else if (!is_transient(result->info.typ)) - { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_call_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); - gen_params(fheader, params, result, 1); - fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_call_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); - gen_params(fd, params, result, 1); - } - else - { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); - gen_params(fheader, params, result, 1); - fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); - gen_params(fd, params, result, 1); - } - if (name) - { if (iflag) - fprintf(fd, "\n{\tstruct soap *soap = this;\n"); - else - fprintf(fd, "\n{\tstruct soap *soap = this->soap;\n"); - } - else - { fprintf(fheader, ";"); - fprintf(fd, "\n{"); - } - for (sp = services; sp; sp = sp->next) - { if (has_ns_eq(sp->ns, method->sym->name)) - { style = sp->style; - encoding = sp->encoding; - method_encoding = encoding; - method_response_encoding = NULL; - if (sp->protocol) - { if (strstr(sp->protocol, "GET")) - get = 1; - else if (strstr(sp->protocol, "POST")) - post = 1; - else if (strstr(sp->protocol, "PUT")) - put = 1; - if (strncmp(sp->protocol, "SOAP", 4)) - soap = 0; - else if (strlen(sp->protocol) > 6) - version = sp->protocol[6] - '0'; - } - for (m = sp->list; m; m = m->next) - { if (is_eq_nons(m->name, method->sym->name)) - { if (m->mess == ACTION || m->mess == REQUEST_ACTION) - action = m->part; - else if (m->mess == ENCODING) - method_encoding = m->part; - else if (m->mess == RESPONSE_ENCODING) - method_response_encoding = m->part; - else if (m->mess == PROTOCOL) - { if (strstr(m->part, "GET")) - get = 1; - else if (strstr(m->part, "POST")) - post = 1; - else if (strstr(m->part, "PUT")) - put = 1; - if (strncmp(m->part, "SOAP", 4)) - soap = 0; - else if (strlen(m->part) > 6) - version = m->part[6] - '0'; - } - else if (m->mess&MIMEIN && !strcmp(m->part, "application/x-www-form-urlencoded")) - mime = 1; - } - } - break; - } - } - if (!get && !mime) - fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(method->sym->name), ident(method->sym->name)); - if (response) - fprintf(fd, "\n\tstruct %s *soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); - if (name) - fprintf(fd, "\n\tif (endpoint)\n\t\tsoap_endpoint = endpoint;"); - if (sp && sp->URL) - fprintf(fd, "\n\tif (soap_endpoint == NULL)\n\t\tsoap_endpoint = \"%s\";", sp->URL); - if (action) - { fprintf(fd, "\n\tif (soap_action == NULL)\n\t\tsoap_action = "); - if (*action == '"') - fprintf(fd, "%s;", action); - else - fprintf(fd, "\"%s\";", action); - } - if (!method_response_encoding) - method_response_encoding = method_encoding; - if (!get && !mime) - { fprintf(fd, "\n\tsoap_begin(soap);"); - if (soap && sp && sp->URI && method_encoding) - { if (is_literal(method_encoding)) - fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); - else if (method_encoding) - fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", method_encoding); - } - else if (!soap || !eflag) - fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); - for (param = params->list; param; param = param->next) - { if (param->info.typ->type == Tarray) - fprintf(fd, "\n\tmemcpy(soap_tmp_%s.%s, %s, sizeof(%s));", ident(method->sym->name), ident(param->sym->name), ident(param->sym->name), c_type(param->info.typ)); - else - fprintf(fd, "\n\tsoap_tmp_%s.%s = %s;", ident(method->sym->name), ident(param->sym->name), ident(param->sym->name)); - } - if (!soap) - fprintf(fd, "\n\tsoap_set_version(soap, 0); /* no SOAP */"); - else if (version) - fprintf(fd, "\n\tsoap_set_version(soap, %d); /* SOAP1.%d */", version, version); - if (soap) - fprintf(fd, "\n\tsoap_serializeheader(soap);"); - fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", ident(method->sym->name), ident(method->sym->name)); - fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); - fprintf(fd, "\n\tif (soap->mode & SOAP_IO_LENGTH)"); - fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); - if (soap) - { fprintf(fd, "\n\t\t || soap_putheader(soap)"); - fprintf(fd, "\n\t\t || soap_body_begin_out(soap)"); - } - fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", ident(method->sym->name), ident(method->sym->name), ns_convert(method->sym->name)); - if (soap) - fprintf(fd, "\n\t\t || soap_body_end_out(soap)"); - fprintf(fd, "\n\t\t || soap_envelope_end_out(soap))"); - fprintf(fd, "\n\t\t\t return soap->error;"); - fprintf(fd, "\n\t}"); - fprintf(fd, "\n\tif (soap_end_count(soap))\n\t\treturn soap->error;"); - if (soap) - fprintf(fd, "\n\tif (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action)"); - else - { fprintf(fd, "\n\tsoap->http_content = \"text/xml\";"); - if (put) - fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_PUT, soap_url(soap, soap_endpoint, soap_action), soap_action)"); - else - fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_POST_FILE, soap_url(soap, soap_endpoint, soap_action), soap_action)"); - } - fprintf(fd, "\n\t || soap_envelope_begin_out(soap)"); - if (soap) - { fprintf(fd, "\n\t || soap_putheader(soap)"); - fprintf(fd, "\n\t || soap_body_begin_out(soap)"); - } - fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", ident(method->sym->name), ident(method->sym->name), ns_convert(method->sym->name)); - if (soap) - fprintf(fd, "\n\t || soap_body_end_out(soap)"); - fprintf(fd, "\n\t || soap_envelope_end_out(soap)"); - fprintf(fd, "\n\t || soap_end_send(soap))"); - fprintf(fd, "\n\t\treturn soap_closesock(soap);"); - } - else if (get) - { if (params->list) - { gen_query_url(fd, params); - fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap->msgbuf, soap_action))"); - } - else if (soap) - fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap_url(soap, soap_endpoint, NULL), soap_action))"); - else - fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap_url(soap, soap_endpoint, soap_action), soap_action))"); - fprintf(fd, "\n\t\treturn soap_closesock(soap);"); - } - else if (mime) - { fprintf(fd, "\n\tsoap->http_content = \"application/x-www-form-urlencoded\";"); - if (post) - fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_POST_FILE, soap_url(soap, soap_endpoint, soap_action), soap_action))"); - else if (put) - fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_PUT, soap_url(soap, soap_endpoint, soap_action), soap_action))"); - fprintf(fd, "\n\t\treturn soap_closesock(soap);"); - gen_query_form(fd, params); - fprintf(fd, "soap_end_send(soap))\n\t\treturn soap_closesock(soap);"); - } - if (is_transient(result->info.typ)) - { fprintf(fd, "\n\treturn SOAP_OK;\n}"); - if (name) - { fprintf(fd, "\n\nint %s::recv_%s(", name, ns_cname(method->sym->name, NULL)); - fprintf(fd, "struct %s& tmp)", ident(method->sym->name)); - if (iflag) - fprintf(fd, "\n{\tstruct soap *soap = this;\n"); - else - fprintf(fd, "\n{\tstruct soap *soap = this->soap;\n"); - fprintf(fd, "\n\tstruct %s *%s = &tmp;", ident(method->sym->name), ident(result->sym->name)); - } - else - { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name)); - fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name)); - fprintf(fheader, "struct %s *%s);\n", ident(method->sym->name), ident(result->sym->name)); - fprintf(fd, "struct %s *%s)\n{", ident(method->sym->name), ident(result->sym->name)); - } - fprintf(fd, "\n\tsoap_default_%s(soap, %s);", ident(method->sym->name), ident(result->sym->name)); - fprintf(fd, "\n\tsoap_begin(soap);"); - } - else if (result->info.typ->type == Tarray) - fprintf(fd, "\n\tsoap_default_%s(soap, %s);", c_ident(result->info.typ), ident(result->sym->name)); - else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref)) - fprintf(fd, "\n\tif (!&%s)\n\t\treturn soap_closesock(soap);\n\t%s.soap_default(soap);", ident(result->sym->name), ident(result->sym->name)); - else if (((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref)) - fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t%s->soap_default(soap);", ident(result->sym->name), ident(result->sym->name)); - else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tpointer) - fprintf(fd, "\n\t%s = NULL;", ident(result->sym->name)); - else if (((Tnode*)result->info.typ->ref)->type == Tpointer) - fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t*%s = NULL;", ident(result->sym->name), ident(result->sym->name)); - else if (result->info.typ->type == Treference) - fprintf(fd, "\n\tif (!&%s)\n\t\treturn soap_closesock(soap);\n\tsoap_default_%s(soap, &%s);", ident(result->sym->name), c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name)); - else if (!is_void(result->info.typ)) - fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\tsoap_default_%s(soap, %s);", ident(result->sym->name), c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name)); - fprintf(fd,"\n\tif (soap_begin_recv(soap)"); - fprintf(fd,"\n\t || soap_envelope_begin_in(soap)"); - fprintf(fd,"\n\t || soap_recv_header(soap)"); - fprintf(fd,"\n\t || soap_body_begin_in(soap))"); - fprintf(fd,"\n\t\treturn soap_closesock(soap);"); - if (is_transient(result->info.typ)) - { fprintf(fd,"\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", ident(method->sym->name), ident(result->sym->name), ns_convert(method->sym->name)); - fprintf(fd,"\n\tif (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)\n\t\tsoap->error = SOAP_OK;"); - fprintf(fd,"\n\tif (soap->error"); - fprintf(fd,"\n\t || soap_body_end_in(soap)"); - fprintf(fd,"\n\t || soap_envelope_end_in(soap)"); - fprintf(fd,"\n\t || soap_end_recv(soap))"); - fprintf(fd,"\n\t\treturn soap_closesock(soap);"); - fprintf(fd,"\n\treturn soap_closesock(soap);\n}"); - fflush(fd); - return; - } - /* With RPC encoded responses, try to parse the fault first */ - if (!is_literal(method_response_encoding)) - { fprintf(fd,"\n\tif (soap_recv_fault(soap, 1))\n\t\treturn soap->error;"); - xtag = xtyp = ""; - } - else if (has_ns_eq(NULL, result->sym->name)) - { if (response) - xtag = xml_tag(response->info.typ); - else - xtag = ns_convert(result->sym->name); - xtyp = xsi_type(result->info.typ); - } - else - { if (response) - xtag = xml_tag(response->info.typ); - else - xtag = xml_tag(result->info.typ); - xtyp = ""; - } - if (response) - { fprintf(fd,"\n\tsoap_tmp_%s = soap_get_%s(soap, NULL, \"%s\", \"%s\");", c_ident(response->info.typ), c_ident(response->info.typ), xtag, xtyp); - fprintf(fd,"\n\tif (!soap_tmp_%s || soap->error)\n\t\treturn soap_recv_fault(soap, 0);", c_ident(response->info.typ)); - } - else if ((result->info.typ->type == Treference || result->info.typ->type == Tpointer) && !is_invisible_empty(result->info.typ->ref)) - { if (result->info.typ->type == Treference && ((Tnode *) result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) - fprintf(fd,"\n\t%s.soap_get(soap, \"%s\", \"%s\");", ident(result->sym->name), xtag, xtyp); - else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) - fprintf(fd,"\n\t%s->soap_get(soap, \"%s\", \"%s\");", ident(result->sym->name), xtag, xtyp); - else if (result->info.typ->type == Treference && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) - { fprintf(fd,"\n\tsoap_get_%s(soap, &%s, \"%s\", \"%s\");", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag, xtyp); - } - else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)result->info.typ->ref)) - { - fprintf(fd,"\n\tsoap_get_%s(soap, %s, \"%s\", \"%s\");", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag, xtyp); - } - else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) - { fprintf(fd,"\n\tsoap_inliteral(soap, NULL, %s);", ident(result->sym->name)); - } - else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) - { fprintf(fd,"\n\tsoap_inliteral(soap, NULL, &%s);", ident(result->sym->name)); - } - else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) - { fprintf(fd,"\n\tsoap_inwliteral(soap, NULL, %s);", ident(result->sym->name)); - } - else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) - { fprintf(fd,"\n\tsoap_inwliteral(soap, NULL, &%s);", ident(result->sym->name)); - } - else if (result->info.typ->type == Treference) - { fprintf(fd,"\n\tsoap_get_%s(soap, &%s, \"%s\", \"%s\");", c_ident(result->info.typ), ident(result->sym->name), xtag, xtyp); - } - else - { fprintf(fd,"\n\tsoap_get_%s(soap, %s, \"%s\", \"%s\");", c_ident(result->info.typ), ident(result->sym->name), xtag, xtyp); - } - fprintf(fd,"\n\tif (soap->error)\n\t\treturn soap_recv_fault(soap, 0);"); - } - fflush(fd); - fprintf(fd,"\n\tif (soap_body_end_in(soap)"); - fprintf(fd,"\n\t || soap_envelope_end_in(soap)"); - fprintf(fd,"\n\t || soap_end_recv(soap))"); - fprintf(fd,"\n\t\treturn soap_closesock(soap);"); - if (response) - { if (result->info.typ->type == Tarray) - fprintf(fd,"\n\tmemcpy(%s, soap_tmp_%s->%s, sizeof(%s));", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name), ident(result->sym->name)); - else if (result->info.typ->type == Treference) - fprintf(fd,"\n\t%s = soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); - else if (!is_external((Tnode*)result->info.typ->ref)) - { fprintf(fd,"\n\tif (%s && soap_tmp_%s->%s)", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); - fprintf(fd,"\n\t\t*%s = *soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); - } - } - fprintf(fd,"\n\treturn soap_closesock(soap);"); - fprintf(fd ,"\n}"); - fflush(fd); -} - -void -gen_serve_method(FILE *fd, Table *table, Entry *param, char *name) -{ Service *sp = NULL; - char *style, *encoding; - Entry *result, *p, *q, *pin, *pout, *response = NULL; - Table *input; - char *xtag; - Method *m; - char *method_encoding = NULL, *method_response_encoding = NULL; - result = (Entry*)param->info.typ->ref; - p = entry(classtable, param->sym); - if (!p) - execerror("no table entry"); - if (!is_response(result->info.typ) && !is_XML(result->info.typ)) - response = get_response(param->info.typ); - q = entry(table, param->sym); - if (!q) - execerror("no table entry"); - pout = (Entry*)q->info.typ->ref; - if (name) - { if (iflag) - fprintf(fd, "\n\nstatic int serve_%s(%s *soap)\n{", ident(param->sym->name), name); - else - fprintf(fd, "\n\nstatic int serve_%s(%s *service)\n{\tstruct soap *soap = service->soap;\n", ident(param->sym->name), name); - } - else - { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap*);", ident(param->sym->name)); - fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap *soap)\n{", ident(param->sym->name)); - } - fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(param->sym->name), ident(param->sym->name)); - for (sp = services; sp; sp = sp->next) - if (has_ns_eq(sp->ns, param->sym->name)) - { style = sp->style; - encoding = sp->encoding; - method_encoding = encoding; - method_response_encoding = NULL; - for (m = sp->list; m; m = m->next) - { if (is_eq_nons(m->name, param->sym->name)) - { if (m->mess == ENCODING) - method_encoding = m->part; - else if (m->mess == RESPONSE_ENCODING) - method_response_encoding = m->part; - } - } - break; - } - if (!method_response_encoding) - method_response_encoding = method_encoding; - fflush(fd); - if (!is_transient(pout->info.typ)) - { if (pout->info.typ->type == Tarray && response) - { fprintf(fd,"\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); - fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); - } - else if (pout->info.typ->type == Tpointer && !is_stdstring(pout->info.typ) && !is_stdwstring(pout->info.typ) && response) - { fprintf(fd,"\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); - fprintf(fd,"\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); - fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); - if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_external((Tnode*)pout->info.typ->ref) && !is_volatile((Tnode*)pout->info.typ->ref) && !is_typedef((Tnode*)pout->info.typ->ref)) - fprintf(fd,"\n\tsoap_tmp_%s.soap_default(soap);", c_ident((Tnode*)pout->info.typ->ref)); - else if (((Tnode*)pout->info.typ->ref)->type == Tpointer) - fprintf(fd,"\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); - else - fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); - fprintf(fd,"\n\tsoap_tmp_%s.%s = &soap_tmp_%s;", c_ident(response->info.typ), ident(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); - } - else if (response) - { fprintf(fd,"\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); - fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); - } - else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); - fprintf(fd,"\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); - } - else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); - fprintf(fd,"\n\t%s.soap_default(soap);", ident(pout->sym->name)); - } - else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); - fprintf(fd,"\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode *)pout->info.typ->ref), ident(pout->sym->name)); - } - else - { fprintf(fd,"\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); - if (is_string((Tnode*)pout->info.typ->ref) || is_wstring((Tnode*)pout->info.typ->ref)) - fprintf(fd,"\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); - else - fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); - } - } - fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", ident(param->sym->name), ident(param->sym->name)); - fflush(fd); - q = entry(classtable, param->sym); - if (!is_invisible_empty(q->info.typ)) - { fprintf(fd,"\n\tif (!soap_get_%s(soap, &soap_tmp_%s, \"%s\", NULL))", ident(param->sym->name), ident(param->sym->name), ns_convert(param->sym->name)); - fprintf(fd,"\n\t\treturn soap->error;"); - } - fprintf(fd,"\n\tif (soap_body_end_in(soap)"); - fprintf(fd,"\n\t || soap_envelope_end_in(soap)"); - fprintf(fd,"\n\t || soap_end_recv(soap))\n\t\treturn soap->error;"); - if (name) - { if (iflag) - fprintf(fd, "\n\tsoap->error = soap->%s(", ns_cname(param->sym->name, NULL)); - else - fprintf(fd, "\n\tsoap->error = service->%s(", ns_cname(param->sym->name, NULL)); - } - else - fprintf(fd, "\n\tsoap->error = %s(soap", ident(param->sym->name)); - fflush(fd); - input = (Table*) q->info.typ->ref; - for (pin = input->list; pin; pin = pin->next) - fprintf(fd, "%ssoap_tmp_%s.%s", !name || pin != input->list ? ", " : "", ident(param->sym->name), ident(pin->sym->name)); - if (is_transient(pout->info.typ)) - fprintf(fd, ");"); - else - { if (!name || input->list) - fprintf(fd, ", "); - if (response) - fprintf(fd, "soap_tmp_%s.%s);", c_ident(response->info.typ), ident(pout->sym->name)); - else if (pout->info.typ->type == Treference && (((Tnode*)pout->info.typ->ref)->type == Tstruct || ((Tnode*)pout->info.typ->ref)->type == Tclass) && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - fprintf(fd, "%s);", ident(pout->sym->name)); - else if ((((Tnode*)pout->info.typ->ref)->type == Tstruct || ((Tnode*)pout->info.typ->ref)->type == Tclass) && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - fprintf(fd, "&%s);", ident(pout->sym->name)); - else if(pout->info.typ->type == Treference) - fprintf(fd, "soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); - else - fprintf(fd, "&soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); - } - fprintf(fd,"\n\tif (soap->error)\n\t\treturn soap->error;"); - if (!is_transient(pout->info.typ)) - { if (sp && sp->URI && method_response_encoding) - { if (is_literal(method_response_encoding)) - fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); - else if (sp->encoding) - fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", sp->encoding); - else if (method_response_encoding) - fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", method_response_encoding); - else if (!eflag) - fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); - } - else if (!eflag) - fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); - fprintf(fd,"\n\tsoap_serializeheader(soap);"); - if (pout->info.typ->type == Tarray && response) - fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); - else if (response) - fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); - else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); - else if(((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - fprintf(fd, "\n\t%s.soap_serialize(soap);", ident(pout->sym->name)); - else if(((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); - else if (!is_XML((Tnode*)pout->info.typ->ref)) - fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); - if (has_ns_eq(NULL, pout->sym->name)) - xtag = ns_convert(pout->sym->name); - else - xtag = xml_tag(pout->info.typ); - fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); - fprintf(fd, "\n\tif (soap->mode & SOAP_IO_LENGTH)"); - fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); - fprintf(fd,"\n\t\t || soap_putheader(soap)"); - fprintf(fd,"\n\t\t || soap_body_begin_out(soap)"); - if (response) - fprintf(fd,"\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(response->info.typ), c_ident(response->info.typ), xml_tag(response->info.typ)); - else if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), ns_convert(pout->sym->name)); - else if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - fprintf(fd, "\n\t\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); - else if (((Tnode*)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); - else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) - fprintf(fd,"\n\t\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); - else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) - fprintf(fd,"\n\t\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); - else - fprintf(fd,"\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(pout->info.typ), c_ident((Tnode*)pout->info.typ->ref), ns_convert(pout->sym->name)); - fprintf(fd,"\n\t\t || soap_body_end_out(soap)"); - fprintf(fd,"\n\t\t || soap_envelope_end_out(soap))"); - fprintf(fd,"\n\t\t\t return soap->error;"); - fprintf(fd,"\n\t};"); - fprintf(fd,"\n\tif (soap_end_count(soap)"); - fprintf(fd,"\n\t || soap_response(soap, SOAP_OK)"); - fprintf(fd,"\n\t || soap_envelope_begin_out(soap)"); - fprintf(fd,"\n\t || soap_putheader(soap)"); - fprintf(fd,"\n\t || soap_body_begin_out(soap)"); - if (response) - fprintf(fd,"\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(response->info.typ), c_ident(response->info.typ), xml_tag(response->info.typ)); - else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), ns_convert(pout->sym->name)); - else if(((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - fprintf(fd, "\n\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); - else if(((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) - fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); - else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) - fprintf(fd,"\n\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); - else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) - fprintf(fd,"\n\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); - else - fprintf(fd,"\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(pout->info.typ), c_ident((Tnode*)pout->info.typ->ref), ns_convert(pout->sym->name)); - fprintf(fd,"\n\t || soap_body_end_out(soap)"); - fprintf(fd,"\n\t || soap_envelope_end_out(soap)"); - fprintf(fd,"\n\t || soap_end_send(soap))"); - fprintf(fd, "\n\t\treturn soap->error;"); - } - fprintf(fd,"\n\treturn soap_closesock(soap);"); - fprintf(fd,"\n}"); - fflush(fd); -} - -void -gen_object_code(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding) -{ Entry *p, *method, *catch_method, *param; - Table *t; - char *soap, *catch_action; - if (iflag) - soap = "this"; - else - soap = "this->soap"; - fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); - if (namespaceid) - fprintf(fd,"\n\nnamespace %s {", namespaceid); - if (iflag) - { fprintf(fd, "\n\n%s::%s()\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); - fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\t%s_init(imode, omode);\n}", name, name, name); - fprintf(fd, "\n\n%s::~%s()\n{ }", name, name); - } - else - { fprintf(fd, "\n\n%s::%s()\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(struct soap *_soap)\n{\tthis->soap = _soap;\n\tthis->own = false;\n\t%s_init(_soap->imode, _soap->omode);\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(iomode, iomode);\n}", name, name, name); - fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\tthis->soap = soap_new();\n\tthis->own = true;\n\t%s_init(imode, omode);\n}", name, name, name); - fprintf(fd, "\n\n%s::~%s()\n{\tif (this->own)\n\t\tsoap_free(this->soap);\n}", name, name); - } - fprintf(fd, "\n\nvoid %s::%s_init(soap_mode imode, soap_mode omode)\n{\tsoap_imode(%s, imode);\n\tsoap_omode(%s, omode);\n\tstatic const struct Namespace namespaces[] =\n", name, name, soap, soap); - gen_nsmap(fd, ns, URI); - fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); - fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); - fprintf(fd, "\n\nvoid %s::reset()\n{\tdestroy();\n\tsoap_done(%s);\n\tsoap_initialize(%s);\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, soap, soap, name); - if (iflag) - fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_COPY(%s(*(struct soap*)%s));\n\treturn dup;\n}\n#endif", name, name, name, name, soap); - else - fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_COPY(%s);\n\tif (dup)\n\t\tsoap_copy_context(dup->soap, this->soap);\n\treturn dup;\n}\n#endif", name, name, name, name); - fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap); - fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap); - fprintf(fd, "\n\nint %s::soap_senderfault(const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault(%s, string, detailXML);\n}", name, soap); - fprintf(fd, "\n\nint %s::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault_subcode(%s, subcodeQName, string, detailXML);\n}", name, soap); - fprintf(fd, "\n\nint %s::soap_receiverfault(const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault(%s, string, detailXML);\n}", name, soap); - fprintf(fd, "\n\nint %s::soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault_subcode(%s, subcodeQName, string, detailXML);\n}", name, soap); - fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); - fprintf(fd, "\n\n#ifndef WITH_LEAN\n#ifndef WITH_COMPAT\nvoid %s::soap_stream_fault(std::ostream& os)\n{\t::soap_stream_fault(%s, os);\n}\n#endif", name, soap); - fprintf(fd, "\n\nchar *%s::soap_sprint_fault(char *buf, size_t len)\n{\treturn ::soap_sprint_fault(%s, buf, len);\n}\n#endif", name, soap); - fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); - if (!namespaceid) - { - p = entry(classtable, lookup("SOAP_ENV__Header")); - if (p) - { t = (Table*)p->info.typ->ref; - if (t && t->list && !is_void(t->list->info.typ)) - { fprintf(fd, "\n\nvoid %s::soap_header(", name); - gen_params(fd, t, NULL, 0); - fprintf(fd, "\n{\t::soap_header(%s);", soap); - for (param = t->list; param; param = param->next) - { if (namespaceid) - fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); - else - fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); - } - fprintf(fd, "\n}"); - } - } - } - fprintf(fd, "\n\nconst SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); - fprintf(fd, "\n\nint %s::run(int port)\n{\tif (soap_valid_socket(%s->master) || soap_valid_socket(bind(NULL, port, 100)))\n\t{\tfor (;;)\n\t\t{\tif (!soap_valid_socket(accept()) || serve())\n\t\t\t\treturn %s->error;\n\t\t\tsoap_destroy(%s);\n\t\t\tsoap_end(%s);\n\t\t}\n\t}\n\telse\n\t\treturn %s->error;\n\treturn SOAP_OK;\n}", name, soap, soap, soap, soap, soap); - fprintf(fd, "\n\nSOAP_SOCKET %s::bind(const char *host, int port, int backlog)\n{\treturn soap_bind(%s, host, port, backlog);\n}", name, soap); - fprintf(fd, "\n\nSOAP_SOCKET %s::accept()\n{\treturn soap_accept(%s);\n}", name, soap); - fprintf(fd, "\n\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); - fprintf(fd, "\nint %s::ssl_accept()\n{\treturn soap_ssl_accept(%s);\n}", name, soap); - fprintf(fd, "\n#endif"); - fprintf(fd, "\n\nint %s::serve()", name); - fprintf(fd, "\n{\n#ifndef WITH_FASTCGI\n\tunsigned int k = %s->max_keep_alive;\n#endif\n\tdo\n\t{", soap); - fprintf(fd,"\n\n#ifndef WITH_FASTCGI\n\t\tif (%s->max_keep_alive > 0 && !--k)\n\t\t\t%s->keep_alive = 0;\n#endif", soap, soap); - fprintf(fd,"\n\n\t\tif (soap_begin_serve(%s))\n\t\t{\tif (%s->error >= SOAP_STOP)\n\t\t\t\tcontinue;\n\t\t\treturn %s->error;\n\t\t}", soap, soap, soap); - fprintf(fd,"\n\t\tif (dispatch() || (%s->fserveloop && %s->fserveloop(%s)))\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(%s);\n#else\n\t\t\treturn soap_send_fault(%s);\n#endif\n\t\t}", soap, soap, soap, soap, soap); - fprintf(fd,"\n\n#ifdef WITH_FASTCGI\n\t\tsoap_destroy(%s);\n\t\tsoap_end(%s);\n\t} while (1);\n#else\n\t} while (%s->keep_alive);\n#endif", soap, soap, soap); - fprintf(fd, "\n\treturn SOAP_OK;"); - fprintf(fd, "\n}\n"); - for (method = table->list; method; method = method->next) - if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) - fprintf(fd, "\nstatic int serve_%s(%s*);", ident(method->sym->name), name); - fprintf(fd, "\n\nint %s::dispatch()\n{", name); - if (!iflag) - fprintf(fd, "\t%s_init(this->soap->imode, this->soap->omode);\n", name); - fprintf(fd, "\tsoap_peek_element(%s);", soap); - catch_method = NULL; - catch_action = NULL; - for (method = table->list; method; method = method->next) - { char *action = NULL; - if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) - { if (aflag) - { Service *sp; - for (sp = services; sp; sp = sp->next) - { if (has_ns_eq(sp->ns, method->sym->name)) - { Method *m; - for (m = sp->list; m; m = m->next) - { if (is_eq_nons(m->name, method->sym->name)) - { if (m->mess == ACTION || m->mess == REQUEST_ACTION) - action = m->part; - } - } - } - } - } - if (is_invisible(method->sym->name)) - { Entry *param = entry(classtable, method->sym); - if (param) - param = ((Table*)param->info.typ->ref)->list; - if (action) - { if (*action == '"') - { fprintf(fd, "\n\tif ("); - if (param && !Aflag) - fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(param->sym->name)); - else - { catch_method = method; - catch_action = action; - } - fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, action); - } - else - { fprintf(fd, "\n\tif ("); - if (param && !Aflag) - fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(param->sym->name)); - else - { catch_method = method; - catch_action = action; - } - fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, action); - } - fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); - } - else - { if (Aflag) - compliancewarn("Option -A requires a SOAPAction where none is defined"); - if (param) - { fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(param->sym->name)); - fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); - } - else - { catch_method = method; - catch_action = action; - } - } - } - else - { if (action) - { if (*action == '"') - { fprintf(fd, "\n\tif ("); - if (!Aflag) - fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(method->sym->name)); - fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, action); - } - else - { fprintf(fd, "\n\tif ("); - if (!Aflag) - fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(method->sym->name)); - fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, action); - } - } - else - { if (Aflag) - compliancewarn("Option -A requires a SOAPAction where none is defined"); - fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(method->sym->name)); - } - fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); - } - } - } - if (catch_method) - { if (Aflag && catch_action) - { if (*catch_action == '"') - { fprintf(fd, "\n\tif ("); - fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, catch_action); - fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(catch_method->sym->name)); - } - else - { fprintf(fd, "\n\tif ("); - fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, catch_action); - fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(catch_method->sym->name)); - } - fprintf(fd,"\n\treturn %s->error = SOAP_NO_METHOD;", soap); - } - fprintf(fd, "\n\treturn serve_%s(this);\n}", ident(catch_method->sym->name)); - } - else - fprintf(fd, "\n\treturn %s->error = SOAP_NO_METHOD;\n}", soap); - for (method = table->list; method; method = method->next) - if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) - gen_serve_method(fd, table, method, name); - if (namespaceid) - fprintf(fd,"\n\n} // namespace %s\n", namespaceid); - fprintf(fd,"\n/* End of server object code */\n"); -} - -void -gen_response_begin(FILE *fd, int n, char *s) -{ if (!is_invisible(s)) - { fprintf(fd, "%*s<%sResponse", n, "", s); - if (vflag < 0) - gen_xmlns(fd); - fprintf(fd, ">\n"); - } -} - -void -gen_response_end(FILE *fd, int n, char *s) -{ if (!is_invisible(s)) - fprintf(fd, "%*s</%sResponse>\n", n, "", s); -} - -void -gen_element_begin(FILE *fd, int n, char *s, char *t) -{ if (!is_invisible(s)) - { if (tflag && t && *t) - fprintf(fd, "%*s<%s xsi:type=\"%s\"", n, "", s, t); - else - fprintf(fd, "%*s<%s", n, "", s); - } -} - -void -gen_element_end(FILE *fd, int n, char *s) -{ if (!is_invisible(s)) - fprintf(fd, "%*s</%s>\n", n, "", s); - else - fprintf(fd, "\n"); -} - -void -gen_data(char *buf, Table *t, char *ns, char *name, char *URL, char *executable, char *URI, char *encoding) -{ Entry *p, *q, *r; - FILE *fd; - char *method_encoding = NULL; - char *method_response_encoding = NULL; - if (t) - { for (p = t->list; p; p = p->next) - if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) - { int get = 0, soap = 1, mime = 0; - Service *sp; - Method *m; - char *nse = ns_qualifiedElement(p->info.typ); - char *nsa = ns_qualifiedAttribute(p->info.typ); - method_encoding = encoding; - method_response_encoding = NULL; - for (sp = services; sp; sp = sp->next) - { if (!tagcmp(sp->ns, ns)) - { for (m = sp->list; m; m = m->next) - { if (is_eq_nons(m->name, p->sym->name)) - { if (m->mess == ENCODING) - method_encoding = m->part; - else if (m->mess == RESPONSE_ENCODING) - method_response_encoding = m->part; - else if (m->mess&MIMEIN && !strcmp(m->part, "application/x-www-form-urlencoded")) - mime = 1; - else if (m->mess == PROTOCOL) - { if (strncmp(m->part, "SOAP", 4)) - soap = 0; - if (strstr(m->part, "GET")) - get = 1; - } - } - } - } - } - if (!method_response_encoding) - method_response_encoding = method_encoding; - /* request */ - if (!get && !mime) - { fd = gen_env(buf, ns_remove(p->sym->name), 0, t, ns, name, URL, executable, URI, method_encoding, soap); - if (!fd) - return; - q = entry(classtable, p->sym); - if (yflag) - { fprintf(fd, "%*s<!-- %s(...", 2, "", ident(p->sym->name)); - if (q) - { Table *r = (Table*)q->info.typ->ref; - while (r) - { Entry *e; - for (e = r->list; e; e = e->next) - fprintf(fd, ", %s", c_type_id(e->info.typ, e->sym->name)); - r = r->prev; - } - } - fprintf(fd, ", ...) -->\n"); - } - gen_element_begin(fd, 2, ns_convert(p->sym->name), NULL); - if (q) - { if (!is_invisible(p->sym->name)) - { if (soap && vflag < 0) - gen_xmlns(fd); - gen_atts(fd, 2, (Table*)q->info.typ->ref, nsa); - fprintf(fd, "\n"); - } - for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) - gen_field(fd, 3, q, nse, nsa, method_encoding); - } - gen_element_end(fd, 2, ns_convert(p->sym->name)); - if (soap && vflag >= 0) - fprintf(fd, " </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>\n"); - fclose(fd); - } - /* response */ - q = (Entry*)p->info.typ->ref; - if (!mime && q && !is_transient(q->info.typ)) - { fd = gen_env(buf, ns_remove(p->sym->name), 1, t, ns, name, URL, executable, URI, method_response_encoding, soap); - if (!fd) - return; - if (q && !is_response(q->info.typ)) - { if (is_XML((Tnode*)q->info.typ->ref)) - { gen_response_begin(fd, 2, ns_convert(p->sym->name)); - gen_response_end(fd, 2, ns_convert(p->sym->name)); - } - else - { gen_response_begin(fd, 2, ns_convert(p->sym->name)); - gen_field(fd, 3, q, nse, nsa, method_response_encoding); - gen_response_end(fd, 2, ns_convert(p->sym->name)); - } - } - else if (q && q->info.typ->ref && ((Tnode*)q->info.typ->ref)->ref) - { char *xtag; - nse = ns_qualifiedElement((Tnode*)q->info.typ->ref); - nsa = ns_qualifiedAttribute((Tnode*)q->info.typ->ref); - if (has_ns_eq(NULL, q->sym->name)) - xtag = q->sym->name; - else - xtag = ((Tnode*)q->info.typ->ref)->id->name; - if (yflag) - fprintf(fd, "%*s<!-- %s(..., %s) -->\n", 2, "", ident(p->sym->name), c_type_id(q->info.typ, q->sym->name)); - gen_element_begin(fd, 2, ns_addx(xtag, nse), NULL); - if (!is_invisible(xtag)) - { if (soap && vflag < 0) - gen_xmlns(fd); - gen_atts(fd, 2, ((Tnode*)q->info.typ->ref)->ref, nsa); - fprintf(fd, "\n"); - } - for (r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; r; r = r->next) - gen_field(fd, 3, r, nse, nsa, method_response_encoding); - gen_element_end(fd, 2, ns_addx(xtag, nse)); - } - fflush(fd); - if (soap && vflag >= 0) - fprintf(fd, " </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>\n"); - fclose(fd); - } - } - } -} - -void -gen_field(FILE *fd, int n, Entry *p, char *nse, char *nsa, char *encoding) -{ Entry *q; - char tmp[32]; - LONG64 i; - int d; - if (!(p->info.sto & (Sattribute | Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && p->info.typ->type != Tfun && strncmp(p->sym->name, "__size", 6) && strncmp(p->sym->name, "__type", 6) && !is_choice(p)) - { if (is_soap12(encoding) && (p->info.sto & Sreturn) && (nse || has_ns_eq(NULL, p->sym->name)) && !is_literal(encoding)) - fprintf(fd, "%*s<SOAP-RPC:result xmlns:SOAP-RPC=\"%s\">%s</SOAP-RPC:result>\n", n, "", rpcURI, ns_add(p, nse)); - if (is_XML(p->info.typ)) - { if (yflag) - fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); - gen_element_begin(fd, n, ns_add(p, nse), NULL); - if (!is_invisible(p->sym->name)) - fprintf(fd, ">"); - else - fprintf(fd, "%*s<!-- extensibility element(s) -->\n", n, ""); - gen_element_end(fd, n, ns_add(p, nse)); - } - else - { if (!is_string(p->info.typ) && n >= 10 && p->info.minOccurs <= 0) - { /* Do not generate nil, since some tools don't accept it: - if (!is_invisible(p->sym->name)) - { gen_element_begin(fd, n, ns_add(p->sym->name, nse), NULL); - fprintf(fd, " xsi:nil=\"true\"/>"); - } - */ - return; - } - else if (n >= 20) - { fprintf(fd, "%*s<!-- WARNING max depth exceeded: schema appears to incorrectly define infinitely large documents in recursion over mandatory elements with minOccurs>0 -->\n", n, ""); - return; - } - else if (is_fixedstring(p->info.typ)) - { if (yflag) - fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); - gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ)); - fprintf(fd, ">"); - fflush(fd); - if (p->info.hasval) - fprintf(fd, "%s", xstring(p->info.val.s)); - else - gen_val(fd, n, p->info.typ, nse, nsa, encoding); - } - else if (p->info.typ->type == Tarray) - { i = ((Tnode*) p->info.typ->ref)->width; - if (i) - { i = p->info.typ->width / i; - if (i > 4) - i = 2; - } - if (yflag) - fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); - gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); - fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "]\">", xsi_type_Tarray(p->info.typ), i); - fflush(fd); - gen_val(fd, n, p->info.typ, nse, nsa, encoding); - } - else if (is_dynamic_array(p->info.typ) && !is_binary(p->info.typ)) - { if (!eflag && (has_ns(p->info.typ) || is_untyped(p->info.typ))) - { if (yflag) - fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); - gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ)); - gen_atts(fd, n, (Table*)p->info.typ->ref, nsa); - } - else - { d = get_Darraydims(p->info.typ); - if (d) - { for (i = 0; i < d-1; i++) - { tmp[2*i] = ','; - tmp[2*i+1] = '1'; - } - tmp[2*d-2] = '\0'; - } - else - *tmp = '\0'; - if (yflag) - fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); - gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); - if (((Table*)p->info.typ->ref)->list->info.minOccurs > 0) - fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "%s]\">", wsdl_type(((Table*)p->info.typ->ref)->list->info.typ, ""), ((Table*)p->info.typ->ref)->list->info.minOccurs, tmp); - else - fprintf(fd, " SOAP-ENC:arrayType=\"%s[1%s]\">", wsdl_type(((Table*)p->info.typ->ref)->list->info.typ, ""), tmp); - } - fflush(fd); - gen_val(fd, n, p->info.typ, nse, nsa, encoding); - } - else if ((p->info.typ->type == Tpointer || p->info.typ->type == Treference) && is_dynamic_array((Tnode*)p->info.typ->ref) && !is_binary((Tnode*)p->info.typ->ref)) - { if (!eflag && (has_ns((Tnode*)p->info.typ->ref) || is_untyped((Tnode*)p->info.typ->ref))) - { if (yflag) - fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); - gen_element_begin(fd, n, ns_add(p, nse), xsi_type((Tnode*)p->info.typ->ref)); - gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); - } - else - { d = get_Darraydims((Tnode*)p->info.typ->ref); - if (d) - { for (i = 0; i < d-1; i++) - { tmp[2*i] = ','; - tmp[2*i+1] = '1'; - } - tmp[2*d-2] = '\0'; - } - else - *tmp = '\0'; - if (yflag) - fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); - gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); - if ((((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass) && ((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.minOccurs > 0) - fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "%s]\">", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), ((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.minOccurs, tmp); - else - fprintf(fd, " SOAP-ENC:arrayType=\"%s[1%s]\">", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), tmp); - } - fflush(fd); - gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding); - } - else if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) - { /* - if (!is_primclass(p->info.typ)) - { char *nse1 = ns_qualifiedElement(p->info.typ); - char *nsa1 = ns_qualifiedAttribute(p->info.typ); - if (nse1) - nse = nse1; - if (nsa1) - nsa = nsa1; - } - */ - if (!is_invisible(p->sym->name)) - { if (yflag) - fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); - gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); - gen_atts(fd, n, (Table*)p->info.typ->ref, nsa); - } - else if (is_anyType(p->info.typ)) - fprintf(fd, "%*s<!-- extensibility element(s) -->\n", n, ""); - } - else if ((p->info.typ->type == Tpointer || p->info.typ->type == Treference) - && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass)) - { /* - if (!is_primclass(p->info.typ->ref)) - { char *nse1 = ns_qualifiedElement(p->info.typ->ref); - char *nsa1 = ns_qualifiedAttribute(p->info.typ->ref); - if (nse1) - nse = nse1; - if (nsa1) - nsa = nsa1; - } - */ - if (!is_invisible(p->sym->name)) - { if (yflag) - fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); - gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); - gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); - } - else if (is_anyType(p->info.typ)) - fprintf(fd, "%*s<!-- extensibility element(s) -->\n", n, ""); - } - else if (p->info.typ->type != Tunion) - { if (!is_invisible(p->sym->name)) - { if (yflag) - fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); - gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); - if (p->info.typ->type == Ttemplate) - { if (((Tnode*)p->info.typ->ref)->type == Tpointer - && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass - || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct)) - gen_atts(fd, n, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nsa); - else if (((Tnode*)p->info.typ->ref)->type == Tclass - || ((Tnode*)p->info.typ->ref)->type == Tstruct) - gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); - else - fprintf(fd, ">"); - } - else - fprintf(fd, ">"); - } - } - switch (p->info.typ->type) - { case Tchar: - case Tshort: - case Tint: - case Tlong: - case Tllong: - case Tuchar: - case Tushort: - case Tuint: - case Tulong: - case Tullong: - if (p->info.hasval) - fprintf(fd, SOAP_LONG_FORMAT, p->info.val.i); - else - fprintf(fd, "0"); - break; - case Tfloat: - case Tdouble: - case Tldouble: - if (p->info.hasval) - fprintf(fd, "%g", p->info.val.r); - else - fprintf(fd, "0.0"); - break; - case Ttime: - { char tmp[256]; - time_t t = time(NULL), *p = &t; - strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(p)); - fprintf(fd, "%s", tmp); - } - break; - case Tenum: - if (p->info.hasval && p->info.typ->ref) - { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) - if (p->info.val.i == q->info.val.i) - { fprintf(fd, "%s", ns_remove2(q->sym->name)); - break; - } - } - else - gen_val(fd, n+1, p->info.typ, nse, nsa, encoding); - break; - case Tpointer: - case Treference: - if (is_string(p->info.typ) || is_wstring(p->info.typ)) - { if (p->info.hasval) - fprintf(fd, "%s", xstring(p->info.val.s)); - else - gen_val(fd, n, p->info.typ, nse, nsa, encoding); - } - else - gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding); - break; - case Tclass: - if (is_stdstr(p->info.typ)) - { if (p->info.hasval) - fprintf(fd, "%s", xstring(p->info.val.s)); - else - gen_val(fd, n, p->info.typ, nse, nsa, encoding); - break; - } - case Tstruct: - if (!is_dynamic_array(p->info.typ)) - gen_val(fd, n, p->info.typ, nse, nsa, encoding); - break; - case Tunion: - gen_val(fd, n, p->info.typ, nse, nsa, encoding); - break; - case Ttemplate: - i = p->info.maxOccurs; - if (i <= 1 || i > 4) - i = p->info.minOccurs; - if (i <= 1) - i = 2; - do - { /* a bit of a hack, I don't like the copy of the code above */ - { gen_val(fd, n, p->info.typ, nse, nsa, encoding); - if (i > 1) - { gen_element_end(fd, 0, ns_add(p, nse)); - if (!is_invisible(p->sym->name)) - { if (yflag) - fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name)); - gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); - if (p->info.typ->type == Ttemplate) - { if (((Tnode*)p->info.typ->ref)->type == Tpointer - && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass - || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct)) - gen_atts(fd, n, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nsa); - else if (((Tnode*)p->info.typ->ref)->type == Tclass - || ((Tnode*)p->info.typ->ref)->type == Tstruct) - gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); - else - fprintf(fd, ">"); - } - else - fprintf(fd, ">"); - } - } - fflush(fd); - } - } while (--i); - break; - default: - break; - } - if (p->info.typ->type != Tunion) - gen_element_end(fd, 0, ns_add(p, nse)); - fflush(fd); - } - } -} - -void -gen_atts(FILE *fd, int n, Table *t, char *nsa) -{ static unsigned long idnum = 0; - Entry *q, *r; - Tnode *p; - int i; - for (; t; t = t->prev) - { - for (q = t->list; q; q = q->next) - { if (q->info.sto & Sattribute && !is_invisible(q->sym->name) && q->info.maxOccurs != 0) - { fprintf(fd, " %s=\"", ns_add(q, nsa)); - if ((q->info.typ->type == Tpointer || q->info.typ->type == Treference) && !is_string(q->info.typ)) - p = (Tnode*)q->info.typ->ref; - else - p = q->info.typ; - if (is_eq(q->sym->name, "id")) - fprintf(fd, "%lu", ++idnum); /* id="#" should be unique */ - else - switch (p->type) - { case Tchar: - case Tshort: - case Tint: - case Tuchar: - case Tushort: - case Tuint: - case Tlong: - case Tulong: - case Tllong: - case Tullong: - if (q->info.hasval) - fprintf(fd, SOAP_LONG_FORMAT, q->info.val.i); - else - fprintf(fd, "0"); - break; - case Tfloat: - case Tdouble: - case Tldouble: - if (q->info.hasval) - fprintf(fd, "%g", q->info.val.r); - else - fprintf(fd, "0.0"); - break; - case Ttime: - { char tmp[256]; - time_t T = time(NULL); - strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); - fprintf(fd, "%s", tmp); - } - break; - case Tenum: - if (q->info.hasval && p->ref) - { for (r = ((Table*)p->ref)->list; r; r = r->next) - { if (r->info.val.i == q->info.val.i) - { fprintf(fd, "%s", ns_remove2(r->sym->name)); - break; - } - } - } - else if (p->ref) - fprintf(fd, "%s", ns_remove2((((Table*)p->ref)->list)->sym->name)); - else - fprintf(fd, "0"); - break; - case Tpointer: - case Treference: - if (is_string(p)) - { if (q->info.hasval) - fprintf(fd, "%s", xstring(q->info.val.s)); - else if (q->info.typ->minLength > 0 && q->info.typ->minLength < 10000) - for (i = 0; i < (int)q->info.typ->minLength; i++) - fprintf(fd, "X"); - } - break; - case Tclass: - if (is_stdstr(p)) - { if (q->info.hasval) - fprintf(fd, "%s", xstring(q->info.val.s)); - else if (q->info.typ->minLength > 0 && q->info.typ->minLength < 10000) - for (i = 0; i < (int)q->info.typ->minLength; i++) - fprintf(fd, "X"); - } - break; - default: - break; - } - if (yflag) - fprintf(fd, " // %s //", c_type_id(q->info.typ, q->sym->name)); - fprintf(fd, "\""); - } - } - } - fprintf(fd, ">"); - fflush(fd); -} - -void -gen_val(FILE *fd, int n, Tnode *p, char *nse, char *nsa, char *encoding) -{ Entry *q; - LONG64 i; - if (!is_transient(p) && p->type != Tfun && !is_XML(p)) - { if (is_fixedstring(p)) - { for (i = 0; i < p->width / ((Tnode*)p->ref)->width - 1; i++) - fprintf(fd, "X"); - } - else if (p->type == Tarray) - { i = ((Tnode*) p->ref)->width; - if (i) - { i = p->width / i; - if (i > 4) - i = 2; - fprintf(fd, "\n"); - for (; i > 0; i--) - { fprintf(fd, "%*s<item>", n+1, ""); - gen_val(fd, n+1, (Tnode*)p->ref, nse, nsa, encoding); - fprintf(fd, "</item>\n"); - } - fprintf(fd, "%*s", n, ""); - } - } - else if (is_dynamic_array(p)) - { if (!is_binary(p)) - { Table *t; - fprintf(fd, "\n"); - for (t = (Table*)p->ref; t && !t->list; t = t->prev) - ; - if (t) - gen_field(fd, n+1, t->list, nse, nsa, encoding); - fprintf(fd, "%*s", n, ""); - } - } - switch (p->type) - { case Tchar: - case Tshort: - case Tint: - case Tlong: - case Tllong: - case Tuchar: - case Tushort: - case Tuint: - case Tulong: - case Tullong: - fprintf(fd, "0"); - break; - case Tfloat: - case Tdouble: - case Tldouble: - fprintf(fd, "0.0"); - break; - case Ttime: - { char tmp[256]; - time_t T = time(NULL); - strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); - fprintf(fd, "%s", tmp); - } - break; - case Tenum: - if (p->ref && (q = ((Table*)p->ref)->list)) - fprintf(fd, "%s", ns_remove2(q->sym->name)); - else - fprintf(fd, "0"); - break; - case Tpointer: - case Treference: - if (is_string(p) || is_wstring(p)) - { if (p->minLength > 0 && p->minLength < 10000) - for (i = 0; i < (int)p->minLength; i++) - fprintf(fd, "X"); - } - else - gen_val(fd, n, (Tnode*)p->ref, nse, nsa, encoding); - break; - case Tclass: - case Tstruct: - nse = ns_qualifiedElement(p); - nsa = ns_qualifiedAttribute(p); - if (is_stdstr(p)) - { if (p->minLength > 0 && p->minLength < 10000) - for (i = 0; i < (int)p->minLength; i++) - fprintf(fd, "X"); - } - else if (is_primclass(p)) - { Table *t; - for (t = (Table*)p->ref; t; t = t->prev) - { Entry *r = entry(classtable, t->sym); - r = t->list; - if (r && is_item(r)) - { gen_val(fd, n, r->info.typ, nse, nsa, encoding); - return; - } - } - } - else if (!is_dynamic_array(p) && p->ref) - { Table *t; - fprintf(fd, "\n"); - for (t = (Table*)p->ref; t; t = t->prev) - { for (q = t->list; q; q = q->next) - { if (is_repetition(q)) - { i = q->info.maxOccurs; - if (i <= 1 || i > 4) - i = q->info.minOccurs; - if (i <= 1) - i = 2; - do - gen_field(fd, n+1, q->next, nse, nsa, encoding); - while (--i); - q = q->next; - } - else - gen_field(fd, n+1, q, nse, nsa, encoding); - } - } - fprintf(fd, "%*s", n, ""); - } - break; - case Tunion: - if (((Table*)p->ref)->list) - gen_field(fd, n, ((Table*)p->ref)->list, nse, nsa, encoding); - break; - case Ttemplate: - gen_val(fd, n, (Tnode*)p->ref, nse, nsa, encoding); - break; - default: - break; - } - } -} - -void -gen_header(FILE *fd, char *method, int response, char *encoding) -{ if (custom_header) - { Service *sp; - Method *m = NULL; - Entry *q; - Table *r; - if (yflag) - { if (cflag) - fprintf(fd, " <!-- struct SOAP_ENV__Header -->\n"); - else - fprintf(fd, " <!-- SOAP_ENV__Header *soap::header -->\n"); - } - fprintf(fd, " <SOAP-ENV:Header>\n"); - q = entry(classtable, lookup("SOAP_ENV__Header")); - if (q) - { r = (Table*)q->info.typ->ref; - if (r) - { for (q = r->list; q; q = q->next) - { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun) - { for (sp = services; sp; sp = sp->next) - for (m = sp->list; m; m = m->next) - if (is_eq(m->name, method) && (!strcmp(m->part, q->sym->name) || is_eq_nons(m->part, q->sym->name)) && ((!response && (m->mess&HDRIN)) || (response && (m->mess&HDROUT)))) - { gen_field(fd, 2, q, NULL, NULL, encoding); - break; - } - } - } - fprintf(fd, " </SOAP-ENV:Header>\n"); - } - } - } -} - -FILE * -gen_env(char *buf, char *method, int response, Table *t, char *ns, char *name, char *URL, char *executable, char *URI, char *encoding, int soap) -{ char tmp[1024]; - FILE *fd; - strcpy(tmp, buf); - if (!soap) - strcat(tmp, "REST."); -#ifdef __vms - if (!response) - { sprintf(strrchr(tmp, '.'), "_%s_req.xml", method); - fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); - } - else - { sprintf(strrchr(tmp, '.'), "_%s_res.xml", method); - fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); - } -#else - strcpy(strrchr(tmp, '.')+1, method); - if (!response) - { strcat(tmp, ".req.xml"); - fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); - } - else - { strcat(tmp, ".res.xml"); - fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); - } -#endif - fd = fopen(tmp, "w"); - if (!fd) - execerror("Cannot write XML file"); - fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); - if (soap && vflag >= 0) - { fprintf(fd, "<SOAP-ENV:Envelope"); - gen_xmlns(fd); - fprintf(fd, ">\n"); - gen_header(fd, method, response, encoding); - fprintf(fd, " <SOAP-ENV:Body"); - if (eflag && !encoding) - fprintf(fd, " SOAP-ENV:encodingStyle=\"%s\"", encURI); - else if (encoding && !*encoding) - fprintf(fd, " SOAP-ENV:encodingStyle=\"%s\"", encURI); - else if (encoding && strcmp(encoding, "literal")) - fprintf(fd, " SOAP-ENV:encodingStyle=\"%s\"", encoding); - fprintf(fd, ">\n"); - } - return fd; -} - -void -gen_xmlns(FILE *fd) -{ Symbol *s; - Service *sp = NULL; - for (s = nslist; s; s = s->next) - { for (sp = services; sp; sp = sp->next) - if (!tagcmp(sp->ns, s->name) && sp->URI) - break; - if (sp) - fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp->URI); - else if (!strcmp(s->name, "SOAP-ENV")) - { if (vflag >= 0) - fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); - } - else if (!strcmp(s->name, "SOAP-ENC")) - { if (vflag >= 0) - fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); - } - else if (!strcmp(s->name, "xsi")) - fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); - else if (!strcmp(s->name, "xsd")) - fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); - else - fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); - } -} - -char * -emalloc(size_t n) -{ char *p; - if ((p = (char*)malloc(n)) == NULL) - execerror("out of memory"); - return p; -} - -void -soap_serve(Table *table) -{ Entry *method, *catch_method = NULL; - char *catch_action = NULL; - if (!Cflag) - { - fprintf(fserver,"\n\n"); - if (!cflag && !namespaceid) - fprintf(fserver,"extern \"C\" "); - fprintf(fserver,"SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap *soap)", nflag?prefix:"soap"); - - fprintf(fserver,"\n{\n#ifndef WITH_FASTCGI\n\tunsigned int k = soap->max_keep_alive;\n#endif\n\tdo\n\t{"); - fprintf(fserver,"\n#ifndef WITH_FASTCGI\n\t\tif (soap->max_keep_alive > 0 && !--k)\n\t\t\tsoap->keep_alive = 0;\n#endif"); - fprintf(fserver,"\n\t\tif (soap_begin_serve(soap))\n\t\t{\tif (soap->error >= SOAP_STOP)\n\t\t\t\tcontinue;\n\t\t\treturn soap->error;\n\t\t}"); - if (namespaceid) - fprintf(fserver,"\n\t\tif (%s::%s_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap)))\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(soap);\n#else\n\t\t\treturn soap_send_fault(soap);\n#endif\n\t\t}", namespaceid, nflag?prefix:"soap"); - else - fprintf(fserver,"\n\t\tif (%s_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap)))\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(soap);\n#else\n\t\t\treturn soap_send_fault(soap);\n#endif\n\t\t}", nflag?prefix:"soap"); - fprintf(fserver,"\n\n#ifdef WITH_FASTCGI\n\t\tsoap_destroy(soap);\n\t\tsoap_end(soap);\n\t} while (1);\n#else\n\t} while (soap->keep_alive);\n#endif"); - - fprintf(fserver,"\n\treturn SOAP_OK;"); - fprintf(fserver,"\n}"); - - fprintf(fserver,"\n\n#ifndef WITH_NOSERVEREQUEST\n"); - if (!cflag && !namespaceid) - fprintf(fserver,"extern \"C\" "); - fprintf(fserver,"SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap *soap)\n{", nflag?prefix:"soap"); - fprintf(fserver, "\n\tsoap_peek_element(soap);"); - for (method = table->list; method; method = method->next) - { char *action = NULL; - if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) - { if (aflag) - { Service *sp; - for (sp = services; sp; sp = sp->next) - { if (has_ns_eq(sp->ns, method->sym->name)) - { Method *m; - for (m = sp->list; m; m = m->next) - { if (is_eq_nons(m->name, method->sym->name)) - { if (m->mess == ACTION || m->mess == REQUEST_ACTION) - action = m->part; - } - } - } - } - } - if (is_invisible(method->sym->name)) - { Entry *param = entry(classtable, method->sym); - if (param) - param = ((Table*)param->info.typ->ref)->list; - if (action) - { if (*action == '"') - { fprintf(fserver, "\n\tif ("); - if (param && !Aflag) - fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(param->sym->name)); - else - { catch_method = method; - catch_action = action; - } - fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", action); - } - else - { fprintf(fserver, "\n\tif ("); - if (param && !Aflag) - fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(param->sym->name)); - else - { catch_method = method; - catch_action = action; - } - fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", action); - } - fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); - } - else - { if (Aflag) - compliancewarn("Option -A requires a SOAPAction where none is defined"); - if (param) - { fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\")", ns_convert(param->sym->name)); - fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); - } - else - { catch_method = method; - catch_action = action; - } - } - } - else - { if (action) - { if (*action == '"') - { fprintf(fserver, "\n\tif ("); - if (!Aflag) - fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(method->sym->name)); - fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", action); - } - else - { fprintf(fserver, "\n\tif ("); - if (!Aflag) - fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(method->sym->name)); - fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", action); - } - } - else - { if (Aflag) - compliancewarn("Option -A requires a SOAPAction where none is defined"); - fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\")", ns_convert(method->sym->name)); - } - fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); - } - } - } - if (catch_method) - { if (Aflag && catch_action) - { if (*catch_action == '"') - { fprintf(fserver, "\n\tif ("); - fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", catch_action); - fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); - } - else - { fprintf(fserver, "\n\tif ("); - fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", catch_action); - fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); - } - fprintf(fserver,"\n\treturn soap->error = SOAP_NO_METHOD;"); - } - else - fprintf(fserver, "\n\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); - } - else - fprintf(fserver,"\n\treturn soap->error = SOAP_NO_METHOD;"); - - fprintf(fserver,"\n}\n#endif"); - - banner(fheader, "Server-Side Operations"); - for (method = table->list; method; method = method->next) - if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) - generate_proto(table, method); - - banner(fheader, "Server-Side Skeletons to Invoke Service Operations"); - fprintf(fheader, "\n"); - if (!cflag && !namespaceid) - fprintf(fheader,"extern \"C\" "); - fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap*);", nflag?prefix:"soap"); - fprintf(fheader, "\n\n"); - if (!cflag && !namespaceid) - fprintf(fheader,"extern \"C\" "); - fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap*);", nflag?prefix:"soap"); - for (method = table->list; method; method = method->next) - if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) - gen_serve_method(fserver, table, method, NULL); - - } - - if (!Sflag) - { banner(fheader, "Client-Side Call Stubs"); - for (method = table->list; method; method = method->next) - if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) - gen_call_method(fclient, table, method, NULL); - } - -} - -void -generate_proto(Table *table, Entry *param) -{ Entry *q, *pout; - Table *output; - q = entry(table, param->sym); - if (q) - pout = (Entry*)q->info.typ->ref; - else - { fprintf(stderr, "Internal error: no table entry\n"); - return; - } - q = entry(classtable, param->sym); - output = (Table*)q->info.typ->ref; - fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(param->sym->name)); - gen_params(fheader, output, pout, 1); - fprintf(fheader, ";"); -} - -int -tagcmp(const char *s, const char *t) -{ size_t i, n; - n = strlen(s); - for (i = 0; i < n; i++) - { int c = t[i]; - if (c == '_' && s[i] != '_') - c = '-'; - if (s[i] > c) - return 1; - if (s[i] < c) - return -1; - } - return -(t[i] != 0); -} - -int -tagncmp(const char *s, const char *t, size_t n) -{ size_t i; - for (i = 0; i < n; i++) - { int c = t[i]; - if (c == '_' && s[i] != '_') - c = '-'; - if (s[i] > c) - return 1; - if (s[i] < c) - return -1; - } - return 0; -} - -int -is_qname(Tnode *p) -{ if (p->sym && is_string(p) && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) - return 1; - return p->id && is_string(p) && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); -} - -int -is_stdqname(Tnode *p) -{ if (p->sym && p->type == Tclass && is_volatile(p) && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) - return 1; - return p->id && p->type == Tclass && is_volatile(p) && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); -} - -int -is_XML(Tnode *p) -{ return (p->sym && (is_string(p) || is_wstring(p)) && is_eq(p->sym->name, "XML")) || ((p->type == Tpointer || p->type == Treference) && is_XML((Tnode*)p->ref)); -} - -int -is_stdXML(Tnode *p) -{ return p->sym && (is_stdstring(p) || is_stdwstring(p)) && is_eq(p->sym->name, "XML"); -} - -int -is_response(Tnode *p) -{ return (p->type == Tpointer || p->type == Treference) - && p->ref - && has_ns((Tnode*)p->ref) - && ((((Tnode*)p->ref)->type == Tstruct || ((Tnode*)p->ref)->type == Tclass) && !is_primclass((Tnode*)p->ref) && !is_dynamic_array((Tnode*)p->ref) && !is_stdstring((Tnode*)p->ref) && !is_stdwstring((Tnode*)p->ref)); -} - -Entry* -get_response(Tnode *p) -{ if (p->type == Tfun) - return p->response; - return 0; -} - -int -is_unmatched(Symbol *sym) -{ return sym->name[0] == '_' - && sym->name[1] != '_' - && strncmp(sym->name, "_DOT", 4) - && strncmp(sym->name, "_USCORE", 7) - && (strncmp(sym->name, "_x", 2) || !isxdigit(sym->name[2]) || !isxdigit(sym->name[3]) || !isxdigit(sym->name[4]) || !isxdigit(sym->name[5])); -} - -int -is_invisible(const char *name) -{ return name[0] == '-' || (name[0] == '_' && name[1] == '_' && strncmp(name, "__ptr", 5)); -} - -int -is_invisible_empty(Tnode *p) -{ if (p->type == Tstruct || p->type == Tclass) - if (is_invisible(p->id->name)) - if (!p->ref || !((Table*)p->ref)->list) - return 1; - return 0; -} - -int -is_element(Tnode *typ) -{ if (is_XML(typ) || is_stdXML(typ) || is_qname(typ) || is_stdqname(typ)) - return 0; - if (typ->sym) - return is_unmatched(typ->sym); - if (typ->type == Tstruct || typ->type == Tclass) - return is_unmatched(typ->id); - return 0; -} - -int -is_untyped(Tnode *typ) -{ Tnode *p; - if (typ->sym) - return is_unmatched(typ->sym); - if (typ->type == Tpointer || typ->type == Treference || typ->type == Tarray) - return is_untyped((Tnode*)typ->ref); - if (typ->type == Tstruct || typ->type == Tclass) - { if (is_dynamic_array(typ) && !has_ns(typ) && !is_binary(typ)) - { p = (Tnode*)((Table*)typ->ref)->list->info.typ->ref; - return is_untyped(p); - } - else - return is_unmatched(typ->id); - } - return 0; -} - -int -is_primclass(Tnode *typ) -{ Table *t; - if (typ->type == Tstruct || typ->type == Tclass) - { if (!is_dynamic_array(typ)) - { t = (Table*)typ->ref; - while (t) - { if (t->list && is_item(t->list)) - break; - t = t->prev; - } - if (!t) - return 0; - t = (Table*)typ->ref; - while (t) - { Entry *p; - for (p = t->list; p; p = p->next) - if (!is_item(p)) - if (p->info.typ->type != Tfun && !is_transient(p->info.typ) && p->info.sto != Sattribute && p->info.sto != Sprivate && p->info.sto != Sprotected) - return 0; - t = t->prev; - } - return 1; - } - } - else if (typ->type == Tpointer || typ->type == Treference) - return is_primclass((Tnode*)typ->ref); - return 0; -} - -int -is_mask(Tnode *typ) -{ return (typ->type == Tenum && typ->width == 8); -} - -int -is_void(Tnode *typ) -{ if (!typ) - return 1; - if (typ->type == Tvoid) - return 1; - if (typ->type == Tpointer) - return is_void((Tnode*)typ->ref); - if (typ->type == Treference) - return is_void((Tnode*)typ->ref); - if (typ->type == Tarray) - return is_void((Tnode*)typ->ref); - if (typ->type == Ttemplate) - return is_void((Tnode*)typ->ref); - return 0; -} - -int -is_transient(Tnode *typ) -{ if (!typ) - return 1; - if (typ->type == Tstruct && typ->id == lookup("soap")) - return 1; - if (is_external(typ) || is_volatile(typ)) - return 0; - if (typ->transient > 0) - return 1; - switch (typ->type) - { case Tpointer: - case Treference: - case Tarray: - case Ttemplate: - return is_transient((Tnode*)typ->ref); - case Tnone: - case Tvoid: - return 1; - default: - break; - } - return 0; -} - -int -is_imported(Tnode* typ) -{ return typ->imported != NULL; -} - -int -is_external(Tnode* typ) -{ return typ->transient == -1; -} - -int -is_anyType(Tnode* typ) -{ if (typ->type == Tpointer) - return is_anyType((Tnode*)typ->ref); - return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_element"); -} - -int -is_anyAttribute(Tnode* typ) -{ if (typ->type == Tpointer) - return is_anyAttribute((Tnode*)typ->ref); - return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_attribute"); -} - -int -is_volatile(Tnode* typ) -{ return typ->transient == -2; -} - -int -is_template(Tnode *p) -{ if (p->type == Tpointer) - return is_template((Tnode*)p->ref); - return p->type == Ttemplate; -} - -int -is_repetition(Entry *p) -{ if (p) - return p->next && p->next->info.typ->type == Tpointer && (p->info.typ->type == Tint || p->info.typ->type == Tuint) && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__size", 6)); - return 0; -} - -int -is_item(Entry *p) -{ if (p) - return !strcmp(p->sym->name, "__item"); - return 0; -} - -int -is_self(Entry *p) -{ if (p) - return !strcmp(p->sym->name, "__self"); - return 0; -} - -int -is_choice(Entry *p) -{ if (p) - if (p->next && p->next->info.typ->type == Tunion && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__union", 7))) - return 1; - return 0; -} - -int -is_sequence(Entry *p) -{ if (p) - { Tnode *q = p->info.typ; - if (q->type == Tpointer) - q = (Tnode*)q->ref; - if (q->type == Tstruct && is_invisible(p->sym->name) && is_invisible(q->id->name) && !is_transient(q)) - return 1; - } - return 0; -} - - -int -is_anytype(Entry *p) -{ if (p) - if (p->next && p->next->info.typ->type == Tpointer && ((Tnode*)p->next->info.typ->ref)->type == Tvoid && p->info.typ->type == Tint && !strncmp(p->sym->name, "__type", 6)) - { is_anytype_flag = 1; - return 1; - } - return 0; -} - -int -is_keyword(const char *name) -{ Symbol *s = lookup(name); - if (s) - return s->token != ID; - return 0; -} - - -int -has_ptr(Tnode *typ) -{ Tnode *p; - if (typ->type == Tpointer || typ->type == Treference) - return 0; - for (p = Tptr[Tpointer]; p; p = p->next) - if ((Tnode*)p->ref == typ && p->transient != 1) - return 1; - return 0; -} - -int -has_detail_string(void) -{ Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); - if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) - { Entry *e = entry((Table*)p->info.typ->ref, lookup("detail")); - if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) - { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); - return e2 && is_string(e2->info.typ); - } - } - return 0; -} - -int -has_Detail_string(void) -{ Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); - if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) - { Entry *e = entry((Table*)p->info.typ->ref, lookup("SOAP_ENV__Detail")); - if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) - { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); - return e2 && is_string(e2->info.typ); - } - } - return 0; -} - -int -has_class(Tnode *typ) -{ Entry *p; - if (typ->type == Tstruct && typ->ref) - { for (p = ((Table*)typ->ref)->list; p; p = p->next) - { if (p->info.sto & Stypedef) - continue; - if (p->info.typ->type == Tclass || p->info.typ->type == Ttemplate) - return 1; - if (p->info.typ->type == Tstruct && has_class(p->info.typ)) - return 1; - } - } - return 0; -} - -int -has_external(Tnode *typ) -{ Entry *p; - if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) - { for (p = ((Table*)typ->ref)->list; p; p = p->next) - { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) - { if (is_external(p->info.typ) || has_external(p->info.typ)) - return 1; - } - } - } - return 0; -} - -int -has_volatile(Tnode *typ) -{ Entry *p; - if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) - { for (p = ((Table*)typ->ref)->list; p; p = p->next) - { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) - { if (is_volatile(p->info.typ) || has_volatile(p->info.typ)) - if (!is_stdstr(p->info.typ)) - return 1; - } - } - } - return 0; -} - -int -has_ns(Tnode *typ) -{ if (typ->type == Tstruct || typ->type == Tclass || typ->type == Tenum) - return has_ns_eq(NULL, typ->id->name); - return 0; -} - -int -has_ns_t(Tnode *typ) -{ char *s; - if (typ->sym) - { s = strstr(typ->sym->name + 1, "__"); - if (!s) - { s = strchr(typ->sym->name, ':'); - if (s && s[1] == ':') - s = NULL; - } - return s && s[1] && s[2] && (s[2] != '_' - || (s[2] == '_' && s[3] == 'x' && isxdigit(s[4]) && isxdigit(s[5]) && isxdigit(s[6]) && isxdigit(s[7])) - || !strncmp(s+2, "_DOT", 4) - || !strncmp(s+2, "_USCORE", 7)); - } - return has_ns(typ); -} - -/* needs_lang adds xml:lang attribute to matching struct/class member name - we should use an annotation for soapcpp2's input this in the future instead - of a hard-coded member name */ -void -needs_lang(Entry *e) -{ if (!strcmp(e->sym->name, "SOAP_ENV__Text")) - fprintf(fout, "\n\tif (soap->lang)\n\t\tsoap_set_attr(soap, \"xml:lang\", soap->lang, 1);"); -} - -int -is_eq_nons(const char *s, const char *t) -{ size_t n, m; - char *r; - while (*s == '_' || *s == ':') - s++; - while (*t == '_' || *t == ':') - t++; - if (!*s || !*t) - return 0; - r = strstr(t, "__"); - if (r) - t = r + 2; - n = strlen(s) - 1; - m = strlen(t) - 1; -#ifdef SOAP_OLD_DIRECTIVE_NAME_MATCHING - while (n > 0 && s[n] == '_') - n--; - while (m > 0 && t[m] == '_') - m--; -#endif - if (n != m) - return 0; - return !strncmp(s, t, n + 1); -} - -int -is_eq(const char *s, const char *t) -{ size_t n, m; - while (*s == '_' || *s == ':') - s++; - while (*t == '_' || *t == ':') - t++; - if (!*s || !*t) - return 0; - for (n = strlen(s) - 1; n && s[n] == '_'; n--) - ; - for (m = strlen(t) - 1; m && t[m] == '_'; m--) - ; - if (n != m) - return 0; - return !strncmp(s, t, n + 1); -} - -int -has_ns_eq(char *ns, char *s) -{ size_t n; - while (*s == '_' || *s == ':') - s++; - if (!ns) - { char *t = strstr(s + 1, "__"); - if (!t - || (t[2] == 'x' && isxdigit(t[3]) && isxdigit(t[4]) && isxdigit(t[5]) && isxdigit(t[6])) - || !strncmp(t+2, "DOT", 3) - || !strncmp(t+2, "USCORE", 6)) - { t = strchr(s, ':'); - if (t && t[1] == ':') - t = NULL; - } - return t && t[1] && t[2] && t[2] != '_'; - } - if ((n = strlen(ns)) < strlen(s)) - return ((s[n] == '_' && s[n+1] == '_') || (s[n] == ':' && s[n+1] != ':')) && !tagncmp(ns, s, n); - return 0; -} - -char * -strict_check(void) -{ if (sflag) - return ""; - return "(soap->mode & SOAP_XML_STRICT) && "; -} - -char * -ns_of(char *name) -{ Service *sp; - for (sp = services; sp; sp = sp->next) - if (has_ns_eq(sp->ns, name)) - break; - if (sp) - return sp->URI; - return NULL; -} - -int -eq_ns(char *s, char *t) -{ return ns_of(s) == ns_of(t); -} - -char * -prefix_of(char *s) -{ char *t; - while (*s == '_' || *s == ':') - s++; - t = strstr(s + 1, "__"); - if (!t) - { t = strchr(s, ':'); - if (t && t[1] == ':') - t = NULL; - } - if (t && t[1] && t[2] && t[2] != '_') - { char *r = (char*)emalloc(t - s + 1); - strncpy(r, s, t - s); - r[t - s] = '\0'; - return r; - } - return s; -} - -char * -ns_add_overridden(Table *t, Entry *p, char *ns) -{ Entry *q; - Symbol *s = t->sym; - if (s) - { do - { for (q = t->list; q; q = q->next) - if (!strcmp(q->sym->name, p->sym->name)) - return ns_add(p, ns ? prefix_of(t->sym->name) : NULL); - } while ((t = t->prev) != NULL); - } - return ns_add(p, ns); -} - - -char * -c_ident(Tnode *typ) -{ if (typ->sym && strcmp(typ->sym->name, "/*?*/")) - return res_remove(typ->sym->name); - return t_ident(typ); -} - -char * -soap_type(Tnode *typ) -{ char *s, *t = c_ident(typ); - if (namespaceid) - { s = (char*)emalloc(strlen(t) + strlen(namespaceid) + 12); - strcpy(s, "SOAP_TYPE_"); - strcat(s, namespaceid); - strcat(s, "_"); - } - else - { s = (char*)emalloc(strlen(t) + 11); - strcpy(s, "SOAP_TYPE_"); - } - strcat(s, t); - return s; -} - -char * -ident(char *name) -{ char *s = strrchr(name, ':'); - if (s && *(s+1) && *(s-1) != ':') - return s+1; - return name; -} - -/*t_ident gives the name of a type in identifier format*/ -char * -t_ident(Tnode *typ) -{ char *p, *q; - switch(typ->type) - { - case Tnone: - return ""; - case Tvoid: - return "void"; - case Tchar: - return "byte"; - case Twchar: - return "wchar"; - case Tshort: - return "short"; - case Tint: - return "int"; - case Tlong: - return "long"; - case Tllong: - return "LONG64"; - case Tfloat: - return "float"; - case Tdouble: - return "double"; - case Tldouble: - return "decimal"; - case Tuchar: - return "unsignedByte"; - case Tushort: - return "unsignedShort"; - case Tuint: - return "unsignedInt"; - case Tulong: - return "unsignedLong"; - case Tullong: - return "unsignedLONG64"; - case Ttime: - return "time"; - case Tstruct: - case Tclass: - case Tunion: - case Tenum: - if ((Table*)typ->ref == booltable) - return "bool"; - return res_remove(typ->id->name); - case Treference: - return c_ident((Tnode*)typ->ref); - case Tpointer: - if (is_string(typ)) - return "string"; - if (is_wstring(typ)) - return "wstring"; - p=(char*) emalloc((10+strlen(q = c_ident((Tnode*)typ->ref)))*sizeof(char)); - strcpy(p,"PointerTo"); - strcat(p,q); - return p; - case Tarray: - p=(char*) emalloc((16+strlen(c_ident((Tnode*)typ->ref)))*sizeof(char)); - if (((Tnode*)typ->ref)->width) - sprintf(p, "Array%dOf%s",typ->width / ((Tnode*) typ->ref)->width,c_ident(typ->ref)); - else - sprintf(p, "ArrayOf%s", c_ident((Tnode*)typ->ref)); - return p; - case Ttemplate: - if (typ->ref) - { p=(char*) emalloc((11+strlen(res_remove(typ->id->name))+strlen(q = c_ident((Tnode*)typ->ref)))*sizeof(char)); - strcpy(p, res_remove(typ->id->name)); - strcat(p, "TemplateOf"); - strcat(p, q); - return p; - } - case Tfun: - return "Function"; - } - return "anyType"; -} - -void -utf8(char **t, long c) -{ if (c < 0x0080) - *(*t)++ = (char)c; - else - { if (c < 0x0800) - *(*t)++ = (char)(0xC0 | ((c >> 6) & 0x1F)); - else - { if (c < 0x010000) - *(*t)++ = (char)(0xE0 | ((c >> 12) & 0x0F)); - else - { if (c < 0x200000) - *(*t)++ = (char)(0xF0 | ((c >> 18) & 0x07)); - else - { if (c < 0x04000000) - *(*t)++ = (char)(0xF8 | ((c >> 24) & 0x03)); - else - { *(*t)++ = (char)(0xFC | ((c >> 30) & 0x01)); - *(*t)++ = (char)(0x80 | ((c >> 24) & 0x3F)); - } - *(*t)++ = (char)(0x80 | ((c >> 18) & 0x3F)); - } - *(*t)++ = (char)(0x80 | ((c >> 12) & 0x3F)); - } - *(*t)++ = (char)(0x80 | ((c >> 6) & 0x3F)); - } - *(*t)++ = (char)(0x80 | (c & 0x3F)); - } - *(*t) = '\0'; -} - -char * -ns_convert(char *tag) -{ char *t, *s; - size_t i, n; - if (*tag == '_') - { if (!strncmp(tag, "__ptr", 5)) - { if (tag[5]) - tag += 5; - else - tag = "item"; - } - else if (strncmp(tag, "_DOT", 4) - && strncmp(tag, "_USCORE", 7) - && (strncmp(tag, "_x", 2) || !isxdigit(tag[2]) || !isxdigit(tag[3]) || !isxdigit(tag[4]) || !isxdigit(tag[5]))) - tag++; /* skip leading _ */ - } - for (n = strlen(tag); n > 0; n--) - { if (tag[n-1] != '_') - break; - } - s = t = (char*)emalloc(n+1); - for (i = 0; i < n; i++) - { if (tag[i] == '_') - { if (tag[i+1] == '_' && !(tag[i+2] == 'x' && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5]) && isxdigit(tag[i+6]))) - break; - else if (!strncmp(tag+i, "_DOT", 4)) - { *s++ = '.'; - i += 3; - } - else if (!strncmp(tag+i, "_USCORE", 7)) - { *s++ = '_'; - i += 6; - } - else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) - { char d[5]; - strncpy(d, tag+i+2, 4); - d[4] = '\0'; - utf8(&s, strtoul(d, NULL, 16)); - i += 5; - } - else - *s++ = '-'; - } - else if (tag[i] == ':' && tag[i+1] == ':') - break; - else - *s++ = tag[i]; - } - if (i < n) - { *s++ = ':'; - for (i += 2; i < n; i++) - { if (tag[i] == '_') - { if (!strncmp(tag+i, "_DOT", 4)) - { *s++ = '.'; - i += 3; - } - else if (!strncmp(tag+i, "_USCORE", 7)) - { *s++ = '_'; - i += 6; - } - else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) - { char d[5]; - strncpy(d, tag+i+2, 4); - d[4] = '\0'; - utf8(&s, strtoul(d, NULL, 16)); - i += 5; - } - else - *s++ = '-'; - } - else - *s++ = tag[i]; - } - } - *s = '\0'; - return t; -} - -char * -res_remove(char *tag) -{ char *s, *t; - if (!(s = strchr(tag, ':'))) - return tag; - if (s[1] != ':') - tag = s + 1; - if (!strchr(tag, ':')) - return tag; - s = emalloc(strlen(tag) + 1); - strcpy(s, tag); - while ((t = strchr(s, ':'))) - *t = '_'; - return s; -} - -char * -ns_qualifiedElement(Tnode *typ) -{ Service *sp; - char *s = NULL; - if (typ->sym) - s = prefix_of(typ->sym->name); - if (!s && typ->id) - s = prefix_of(typ->id->name); - if (!s) - return NULL; - for (sp = services; sp; sp = sp->next) - { if (sp->elementForm && !tagcmp(sp->ns, s)) - { if (!strcmp(sp->elementForm, "qualified")) - return s; - return NULL; - } - } - for (sp = services; sp; sp = sp->next) - if (!tagcmp(sp->ns, s)) - if (sp->style && !strcmp(sp->style, "document")) - return s; - return NULL; -} - -char * -ns_qualifiedAttribute(Tnode *typ) -{ Service *sp; - char *s = NULL; - if (typ->sym) - s = prefix_of(typ->sym->name); - if (!s && typ->id) - s = prefix_of(typ->id->name); - if (!s) - return NULL; - for (sp = services; sp; sp = sp->next) - { if (sp->attributeForm && !tagcmp(sp->ns, s)) - { if (!strcmp(sp->attributeForm, "qualified")) - return s; - return NULL; - } - } - return NULL; -} - -char * -field(Entry *p, char *ns) -{ char *r, *s; - if (is_self(p)) - return "tag"; - r = ns_add(p, ns); - s = emalloc(strlen(r) + 3); - strcpy(s, "\""); - strcat(s, r); - strcat(s, "\""); - return s; -} - -char * -field_overridden(Table *t, Entry *p, char *ns) -{ char *r, *s; - if (is_self(p)) - return "tag"; - r = ns_add_overridden(t, p, ns); - s = emalloc(strlen(r) + 3); - strcpy(s, "\""); - strcat(s, r); - strcat(s, "\""); - return s; -} - -char * -ns_add(Entry *p, char *ns) -{ if (p->tag) - return ns_addx(p->tag, ns); - return ns_addx(p->sym->name, ns); -} - -char * -ns_addx(char *tag, char *ns) -{ char *n, *t, *s = ns_convert(tag); - if (*s == ':') - return s+1; - if (!ns || *s == '-' || (t = strchr(s, ':'))) - return s; - n = ns_convert(ns); - t = emalloc(strlen(n) + strlen(s) + 2); - strcpy(t, n); - strcat(t, ":"); - strcat(t, s); - return t; -} - -char * -ns_name(char *tag) -{ char *t, *r, *s = tag; - if (*s) - { for (r = s+strlen(s)-1; r > s; r--) - if (*r != '_') - break; - for (t = s + 1; t < r; t++) - { if (t[0] == '_' && t[1] == '_') - { s = t + 2; - t++; - } - else if (t[0] == ':' && t[1] != ':') - { s = t + 1; - t++; - } - } - } - return s; -} - -char * -ns_cname(char *tag, char *suffix) -{ char *s, *t; - size_t i, n; - if (!tag) - return NULL; - t = ns_name(tag); - n = strlen(t); - if (suffix) - s = emalloc(n + strlen(suffix) + 2); - else - s = emalloc(n + 2); - for (i = 0; i < n; i++) - { if (!isalnum(t[i])) - s[i] = '_'; - else - s[i] = t[i]; - } - s[i] = '\0'; - if (suffix) - strcat(s, suffix); - if (is_keyword(t)) - strcat(s, "_"); - return s; -} - -char * -ns_fname(char *tag) -{ char *s; - size_t i; - s = emalloc(strlen(tag) + 1); - strcpy(s, tag); - for (i = 0; s[i]; i++) - if (!isalnum(s[i])) - s[i] = '_'; - return s; -} - -char * -ns_remove(char *tag) -{ return ns_convert(ns_name(tag)); -} - -char * -ns_remove1(char *tag) -{ char *t, *s = tag; - int n = 2; - /* handle 'enum_xx__yy' generated by wsdl2h - if (!strncmp(s, "enum_", 5)) - n = 1; - */ - if (*s) - { for (t = s + 1; *t && n; t++) - if (t[0] == '_' && t[1] == '_') - { s = t + 2; - t++; - n--; - } - if (n || (s[0] == '_' && s[1] != 'x' && strncmp(s, "_USCORE", 7)) || !*s) - s = tag; - } - return s; -} - -char * -ns_remove2(char *tag) -{ return ns_convert(ns_remove1(tag)); -} - -char * -xsi_type_cond(Tnode *typ, int flag) -{ if (flag) - return xsi_type(typ); - return ""; -} - -char * -xsi_type_cond_u(Tnode *typ, int flag) -{ if (flag) - return xsi_type_u(typ); - return ""; -} - -char * -xsi_type_u(Tnode *typ) -{ Service *sp; - char *s = NULL; - if (tflag) - return xsi_type(typ); - if (typ->sym) - s = prefix_of(typ->sym->name); - if (!s && typ->id) - s = prefix_of(typ->id->name); - if (!s) - return ""; - s = xsi_type(typ); - for (sp = services; sp; sp = sp->next) - if (sp->xsi_type && has_ns_eq(sp->ns, s)) - return s; - return ""; -} - -char * -xsi_type(Tnode *typ) -{ if (!typ) - return "NULL"; - if (is_dynamic_array(typ) && !has_ns(typ)) - return xsi_type_Darray(typ); - if (typ->type == Tarray) - return xsi_type_Tarray(typ); - if (is_untyped(typ)) - return ""; - if (typ->sym) - { if (!strncmp(typ->sym->name, "SOAP_ENV__", 10)) - return ""; - if (is_XML(typ)) - return "xsd:anyType"; - if (typ->type != Ttemplate) - return ns_convert(typ->sym->name); - } - if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) - return "xsd:string"; - switch(typ->type){ - case Tchar: - return "xsd:byte"; - case Twchar: - return "wchar"; - case Tshort: - return "xsd:short"; - case Tint: - return "xsd:int"; - case Tlong: - case Tllong: - return "xsd:long"; - case Tfloat: - return "xsd:float"; - case Tdouble: - return "xsd:double"; - case Tldouble: - return "xsd:decimal"; - case Tuchar: - return "xsd:unsignedByte"; - case Tushort: - return "xsd:unsignedShort"; - case Tuint: - return "xsd:unsignedInt"; - case Tulong: - case Tullong: - return "xsd:unsignedLong"; - case Ttime: - return "xsd:dateTime"; - case Tpointer: - case Treference: - return xsi_type((Tnode*)typ->ref); - case Tenum: - if ((Table*)typ->ref == booltable) - return "xsd:boolean"; - case Tstruct: - case Tclass: - if (!strncmp(typ->id->name, "SOAP_ENV__", 10)) - return ""; - return ns_convert(typ->id->name); - case Ttemplate: - if ((Tnode*)typ->ref) - return xsi_type((Tnode*)typ->ref); - break; - default: - break; - } - return ""; -} - -char * -xml_tag(Tnode *typ) -{ if (!typ) - return "NULL"; - if (typ->type == Tpointer || typ->type == Treference) - return xml_tag((Tnode*)typ->ref); - if (typ->sym) - return ns_convert(typ->sym->name); - return the_type(typ); -} - -char * -wsdl_type(Tnode *typ, char *ns) -{ if (!typ) - return "NULL"; - if ((is_qname(typ) || is_stdqname(typ)) && ns) - return "xsd:QName"; - if (typ->sym) - { if (is_XML(typ)) - return "xsd:anyType"; - else if (ns) - return ns_convert(typ->sym->name); - else - return ns_remove(typ->sym->name); - } - return base_type(typ, ns); -} - -char * -base_type(Tnode *typ, char *ns) -{ int d; - char *s, *t; - if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) - { if (ns) - return "xsd:string"; - return "string"; - } - if (is_dynamic_array(typ) && !is_binary(typ) && !has_ns(typ) && !is_untyped(typ)) - { s = ns_remove(wsdl_type(((Table*)typ->ref)->list->info.typ, NULL)); - if (ns && *ns) - { t = (char*)emalloc(strlen(s)+strlen(ns_convert(ns))+13); - strcpy(t, ns_convert(ns)); - strcat(t, ":"); - strcat(t, "ArrayOf"); - } - else - { t = (char*)emalloc(strlen(s)+12); - strcpy(t, "ArrayOf"); - } - strcat(t, s); - d = get_Darraydims(typ); - if (d) - sprintf(t+strlen(t), "%dD", d); - return t; - } - switch (typ->type){ - case Tchar : - if (ns) - return "xsd:byte"; - return "byte"; - case Twchar : - if (ns) - return "xsd:wchar"; - return "wchar"; - case Tshort : - if (ns) - return "xsd:short"; - return "short"; - case Tint : - if (ns) - return "xsd:int"; - return "int"; - case Tlong : - case Tllong : - if (ns) - return "xsd:long"; - return "long"; - case Tfloat: - if (ns) - return "xsd:float"; - return "float"; - case Tdouble: - if (ns) - return "xsd:double"; - return "double"; - case Tldouble: - if (ns) - return "xsd:decimal"; - return "decimal"; - case Tuchar: - if (ns) - return "xsd:unsignedByte"; - return "unsignedByte"; - case Tushort: - if (ns) - return "xsd:unsignedShort"; - return "unsignedShort"; - case Tuint: - if (ns) - return "xsd:unsignedInt"; - return "unsignedInt"; - case Tulong: - case Tullong: - if (ns) - return "xsd:unsignedLong"; - return "unsignedLong"; - case Ttime: - if (ns) - return "xsd:dateTime"; - return "dateTime"; - case Tpointer: - case Treference: - return wsdl_type((Tnode*)typ->ref, ns); - case Tarray: - if (is_fixedstring(typ)) - { if (typ->sym) - { if (ns) - return ns_convert(typ->sym->name); - return ns_remove(typ->sym->name); - } - if (ns) - return "xsd:string"; - return "string"; - } - if (ns && *ns) - { s = (char*)emalloc((strlen(ns_convert(ns))+strlen(c_ident(typ))+2)*sizeof(char)); - strcpy(s, ns_convert(ns)); - strcat(s, ":"); - strcat(s, c_ident(typ)); - return s; - } - else - return c_ident(typ); - case Tenum: - if ((Table*)typ->ref == booltable) - { if (ns) - return "xsd:boolean"; - return "boolean"; - } - case Tstruct: - case Tclass: - if (!has_ns(typ) && ns && *ns) - { s = (char*)emalloc((strlen(ns_convert(ns))+strlen(typ->id->name)+2)*sizeof(char)); - strcpy(s, ns_convert(ns)); - strcat(s, ":"); - strcat(s, ns_convert(typ->id->name)); - return s; - } - else if (ns) - return ns_convert(typ->id->name); - else - return ns_remove(typ->id->name); - case Tunion: - if (ns) - return "xsd:choice"; - return "choice"; - case Ttemplate: - if ((Tnode*)typ->ref) - return wsdl_type((Tnode*)typ->ref, ns); - break; - default: - break; - } - return ""; -} - -char * -the_type(Tnode *typ) -{ if (!typ) - return "NULL"; - if (typ->type == Tarray || (is_dynamic_array(typ) && (eflag || (!has_ns(typ) && !is_untyped(typ))))) - return "SOAP-ENC:Array"; - if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) - return "string"; - switch (typ->type) - { - case Tchar: - return "byte"; - case Twchar: - return "wchar"; - case Tshort: - return "short"; - case Tint : - return "int"; - case Tlong : - case Tllong : - return "long"; - case Tfloat: - return "float"; - case Tdouble: - return "double"; - case Tldouble: - return "decimal"; - case Tuchar: - return "unsignedByte"; - case Tushort: - return "unsignedShort"; - case Tuint: - return "unsignedInt"; - case Tulong: - case Tullong: - return "unsignedLong"; - case Ttime: - return "dateTime"; - case Tpointer: - case Treference: - return the_type((Tnode*)typ->ref); - case Tarray: - return "SOAP-ENC:Array"; - case Tenum: - if ((Table*)typ->ref == booltable) - return "boolean"; - case Tstruct: - case Tclass: - return ns_convert(typ->id->name); - default: - break; - } - return ""; -} - -/* c_type returns the type to be used in parameter declaration*/ -char * -c_type(Tnode *typ) -{ - char *p, *q, tempBuf[10]; - Tnode *temp; - if (typ==0) - return "NULL"; - switch(typ->type){ - case Tnone: - return ""; - case Tvoid: - return "void"; - case Tchar: - return "char"; - case Twchar: - return "wchar_t"; - case Tshort: - return "short"; - case Tint : - return "int"; - case Tlong : - return "long"; - case Tllong : - return "LONG64"; - case Tfloat: - return "float"; - case Tdouble: - return "double"; - case Tldouble: - return "long double"; - case Tuchar: - return "unsigned char"; - case Tushort: - return "unsigned short"; - case Tuint: - return "unsigned int"; - case Tulong: - return "unsigned long"; - case Tullong: - return "ULONG64"; - case Ttime: - return "time_t"; - case Tstruct: - p = (char*) emalloc((8+strlen(ident(typ->id->name))) *sizeof(char)); - strcpy(p, "struct "); - strcat(p, ident(typ->id->name)); - break; - case Tclass: - p = ident(typ->id->name); - break; - case Tunion: p=(char*) emalloc((7+strlen(ident(typ->id->name))) *sizeof(char)); - strcpy(p, "union "); - strcat(p, ident(typ->id->name)); - break; - case Tenum: - if ((Table*)typ->ref == booltable) - return "bool"; - p=(char*) emalloc((6+strlen(ident(typ->id->name))) *sizeof(char)); - strcpy(p, "enum "); - strcat(p, ident(typ->id->name)); - break; - case Tpointer: - p = c_type_id((Tnode*)typ->ref, "*"); - break; - case Treference: - p = c_type_id((Tnode*)typ->ref, "&"); - break; - case Tarray: - temp = typ; - while(((Tnode*) (typ->ref))->type==Tarray){ - typ = (Tnode*)typ->ref; - } - p=(char*) emalloc((12+strlen(q = c_type((Tnode*)typ->ref))) *sizeof(char)); - if (((Tnode*)typ->ref)->type == Tpointer) - sprintf(p,"%s",c_type((Tnode*)typ->ref)); - else - strcpy(p, q); - typ = temp; - while(typ->type==Tarray){ - if (((Tnode*) typ->ref)->width) - { sprintf(tempBuf,"[%d]",(typ->width / ((Tnode*) typ->ref)->width)); - strcat(p,tempBuf); - } - typ = (Tnode*)typ->ref; - } - break; - case Ttemplate: - if (typ->ref) - { p=(char*)emalloc((strlen(q = c_type((Tnode*)typ->ref))+strlen(ident(typ->id->name))+4) *sizeof(char)); - strcpy(p, ident(typ->id->name)); - strcat(p, "<"); - strcat(p, q); - strcat(p, " >"); - break; - } - default: - return "UnknownType"; - } - return p; -} - -char * -c_storage(Storage sto) -{ char *p; - static char buf[256]; - if (sto & Sconst) - { p = c_storage(sto & ~Sconst); - strcat(p, "const "); - return p; - } - if (sto & Sconstptr) - { p = c_storage(sto & ~Sconstptr); - strcat(p, "const "); - return p; - } - if (sto & Sauto) - { p = c_storage(sto & ~Sauto); - strcat(p, "auto "); - return p; - } - if (sto & Sregister) - { p = c_storage(sto & ~Sregister); - strcat(p, "register "); - return p; - } - if (sto & Sstatic) - { p = c_storage(sto & ~Sstatic); - strcat(p, "static "); - return p; - } - if (sto & Sexplicit) - { p = c_storage(sto & ~Sexplicit); - strcat(p, "explicit "); - return p; - } - if (sto & Sextern) - { p = c_storage(sto & ~Sextern); - return p; - } - if (sto & Stypedef) - { p = c_storage(sto & ~Stypedef); - strcat(p, "typedef "); - return p; - } - if (sto & Svirtual) - { p = c_storage(sto & ~Svirtual); - strcat(p, "virtual "); - return p; - } - if (sto & Sfriend) - { p = c_storage(sto & ~Sfriend); - strcat(p, "friend "); - return p; - } - if (sto & Sinline) - { p = c_storage(sto & ~Sinline); - strcat(p, "inline "); - return p; - } - buf[0]= '\0'; - return buf; -} - -char * -c_init(Entry *e) -{ static char buf[1024]; - buf[0] = '\0'; - if (e && e->info.hasval) - { switch (e->info.typ->type) - { case Tchar: - case Twchar: - case Tuchar: - case Tshort: - case Tushort: - case Tint: - case Tuint: - case Ttime: - sprintf(buf, " = " SOAP_LONG_FORMAT, e->info.val.i); - break; - case Tlong: - sprintf(buf, " = " SOAP_LONG_FORMAT "L", e->info.val.i); - break; - case Tulong: - sprintf(buf, " = " SOAP_LONG_FORMAT "UL", e->info.val.i); - break; - case Tllong: - sprintf(buf, " = " SOAP_LONG_FORMAT "LL", e->info.val.i); - break; - case Tullong: - sprintf(buf, " = " SOAP_LONG_FORMAT "ULL", e->info.val.i); - break; - case Tfloat: - case Tdouble: - sprintf(buf, " = %g", e->info.val.r); - break; - case Tldouble: - sprintf(buf, " = %gL", e->info.val.r); - break; - case Tenum: - if (e->info.val.i <= 0x7FFFLL && e->info.val.i >= -0x8000LL) - sprintf(buf, " = (%s)" SOAP_LONG_FORMAT, c_type(e->info.typ), e->info.val.i); - else - sprintf(buf, " = (%s)" SOAP_LONG_FORMAT "LL", c_type(e->info.typ), e->info.val.i); - break; - default: - if (is_stdstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) - sprintf(buf, " = \"%s\"", cstring(e->info.val.s)); - else if (is_stdwstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) - sprintf(buf, " = L\"%s\"", cstring(e->info.val.s)); - else if (is_wstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) - sprintf(buf, " = (wchar_t*)L\"%s\"", cstring(e->info.val.s)); - else if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) - sprintf(buf, " = (char*)\"%s\"", cstring(e->info.val.s)); - else if (e->info.typ->type == Tpointer) - sprintf(buf, " = NULL"); - break; - } - } - return buf; -} - -/* c_type_id returns the type to be used in parameter declaration */ -char * -c_type_id(Tnode *typ, char *name) -{ - char *id,*p,*q,tempBuf[10]; - Tnode *temp; - Entry *e; - if (!typ) - return "NULL"; - id = ident(name); - switch(typ->type) - { - case Tnone: - p = id; - break; - case Tvoid: - p = (char*)emalloc(6+strlen(id)); - strcpy(p, "void "); - strcat(p, id); - break; - case Tchar: - p = (char*)emalloc(6+strlen(id)); - strcpy(p, "char "); - strcat(p, id); - break; - case Twchar: - p = (char*)emalloc(9+strlen(id)); - strcpy(p, "wchar_t "); - strcat(p, id); - break; - case Tshort: - p = (char*)emalloc(7+strlen(id)); - strcpy(p, "short "); - strcat(p, id); - break; - case Tint : - p = (char*)emalloc(5+strlen(id)); - strcpy(p, "int "); - strcat(p, id); - break; - case Tlong : - p = (char*)emalloc(6+strlen(id)); - strcpy(p, "long "); - strcat(p, id); - break; - case Tllong : - p = (char*)emalloc(8+strlen(id)); - strcpy(p, "LONG64 "); - strcat(p, id); - break; - case Tfloat: - p = (char*)emalloc(7+strlen(id)); - strcpy(p, "float "); - strcat(p, id); - break; - case Tdouble: - p = (char*)emalloc(8+strlen(id)); - strcpy(p, "double "); - strcat(p, id); - break; - case Tldouble: - p = (char*)emalloc(13+strlen(id)); - strcpy(p, "long double "); - strcat(p, id); - break; - case Tuchar: - p = (char*)emalloc(15+strlen(id)); - strcpy(p, "unsigned char "); - strcat(p, id); - break; - case Tushort: - p = (char*)emalloc(16+strlen(id)); - strcpy(p, "unsigned short "); - strcat(p, id); - break; - case Tuint: - p = (char*)emalloc(14+strlen(id)); - strcpy(p, "unsigned int "); - strcat(p, id); - break; - case Tulong: - p = (char*)emalloc(15+strlen(id)); - strcpy(p, "unsigned long "); - strcat(p, id); - break; - case Tullong: - p = (char*)emalloc(9+strlen(id)); - strcpy(p, "ULONG64 "); - strcat(p, id); - break; - case Ttime: - p = (char*)emalloc(8+strlen(id)); - strcpy(p, "time_t "); - strcat(p, id); - break; - case Tstruct: - p=(char*) emalloc((9+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); - strcpy(p, "struct "); - strcat(p, ident(typ->id->name)); - strcat(p, " "); - strcat(p, id); - break; - case Tclass: - if (!typ->classed && !is_imported(typ)) - { p=(char*) emalloc((8+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); - strcpy(p, "class "); - strcat(p, ident(typ->id->name)); - typ->classed = True; - } - else - { p=(char*) emalloc((2+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); - strcpy(p, ident(typ->id->name)); - } - strcat(p, " "); - strcat(p, id); - break; - case Tunion: - p=(char*) emalloc((8+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); - strcpy(p, "union "); - strcat(p, ident(typ->id->name)); - strcat(p, " "); - strcat(p, id); - break; - case Tenum: - if ((Table*)typ->ref == booltable) - { p = (char*)emalloc((strlen(id)+6)*sizeof(char)); - strcpy(p, "bool "); - strcat(p, id); - return p; - } - p=(char*) emalloc((7+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char)); - strcpy(p, "enum "); - strcat(p, ident(typ->id->name)); - strcat(p, " "); - strcat(p, id); - break; - case Tpointer: - p = (char*)emalloc(strlen(id)+2); - strcpy(p+1, id); - p[0] = '*'; - p = c_type_id((Tnode*)typ->ref, p); - break; - case Treference: - p = (char*)emalloc(strlen(id)+2); - strcpy(p+1, id); - p[0] = '&'; - p = c_type_id((Tnode*)typ->ref, p); - break; - case Tarray: - temp = typ; - while(((Tnode*) (typ->ref))->type==Tarray){ - typ = (Tnode*)typ->ref; - } - p=(char*) emalloc((12+strlen(q = c_type_id((Tnode*)typ->ref, id))) *sizeof(char)); - strcpy(p, q); - typ = temp; - while(typ->type==Tarray){ - if (((Tnode*) typ->ref)->width) - { sprintf(tempBuf,"[%d]",(typ->width / ((Tnode*) typ->ref)->width)); - strcat(p,tempBuf); - } - typ = (Tnode*)typ->ref; - } - /*if(((Tnode*) (typ->ref))->type==Tarray){ - sprintf(p,"%s [%d]",c_type((Tnode*)typ->ref),(typ->width / ((Tnode*) typ->ref)->width)); - }else - sprintf(p,"%s a[%d]",c_type((Tnode*)typ->ref),(typ->width /((Tnode*) typ->ref)->width));*/ - break; - case Tfun: - if (strncmp(id, "operator ", 9)) - q = c_type_id(((FNinfo*)typ->ref)->ret, id); - else - q = id; - p = (char*)emalloc(1024); - strcpy(p, q); - strcat(p, "("); - for (e = ((FNinfo*)typ->ref)->args->list; e; e = e->next) - { strcat(p, c_storage(e->info.sto)); - if (e->info.typ->type != Tvoid) - { strcat(p, c_type_id(e->info.typ, e->sym->name)); - strcat(p, c_init(e)); - } - else - strcat(p, "void"); - if (e->next) - strcat(p, ", "); - } - strcat(p, ")"); - break; - case Ttemplate: - if (typ->ref) - { p=(char*)emalloc((strlen(q = c_type((Tnode*)typ->ref))+strlen(ident(typ->id->name))+strlen(id)+4) *sizeof(char)); - strcpy(p, ident(typ->id->name)); - strcat(p, "<"); - strcat(p, q); - strcat(p, " >"); - strcat(p, id); - break; - } - default: - return "UnknownType"; - } - return p; -} - -char * -xsi_type_Tarray(Tnode *typ) -{ Tnode *t; - int cardinality; - char *p, *s; - t = (Tnode*)typ->ref; - if (is_fixedstring(typ)) - { if (typ->sym) - return ns_convert(typ->sym->name); - return "xsd:string"; - } - cardinality = 1; - while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(typ))) - { if( t->type == Tarray) - t = (Tnode*)t->ref; - else - t = (Tnode*)((Table*)t->ref)->list->info.typ->ref; - cardinality++; - } - s = xsi_type(t); - if (!*s) - s = wsdl_type(t, ""); - p = (char*)emalloc(strlen(s)+cardinality+3); - strcpy(p, s); - if (cardinality > 1) - { strcat(p, "["); - for (; cardinality > 2; cardinality--) - strcat(p, ","); - strcat(p, "]"); - } - return p; -} - -char * -xsi_type_Darray(Tnode *typ) -{ Tnode *t; - Entry *q; - int cardinality; - char *p, *s; - if (!typ->ref) - return ""; - q = ((Table*)typ->ref)->list; - while (q && q->info.typ->type == Tfun) - q = q->next; - t = (Tnode*)q->info.typ->ref; - cardinality = 1; - while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(typ))) - { if (t->type == Tarray) - t = (Tnode*)t->ref; - else - { q = ((Table*)t->ref)->list; - while (q && q->info.typ->type == Tfun) - q = q->next; - t = (Tnode*)q->info.typ->ref; - } - cardinality++; - } - s = xsi_type(t); - if (!*s) - s = wsdl_type(t, ""); - p = (char*)emalloc(strlen(s)+cardinality*2+1); - strcpy(p, s); - if (cardinality > 1) - { strcat(p, "["); - for (; cardinality > 2; cardinality--) - strcat(p, ","); - strcat(p, "]"); - } - return p; -} - -void -generate(Tnode *typ) -{ - if (kflag && is_XML(typ)) - { soap_traverse(typ); - return; - } - if (is_transient(typ) || typ->type == Twchar || is_XML(typ) || is_void(typ)) - return; - - if (lflag && typ->type == Tint && !typ->sym) - { fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); - fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); - fprintf(fhead,"\n#endif"); - fprintf(fhead,"\n\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_int(struct soap*, int*);"); - fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_int(struct soap*, const char*, int, const int*, const char*);"); - fprintf(fhead,"\nSOAP_FMAC1 int* SOAP_FMAC2 soap_in_int(struct soap*, const char*, int*, const char*);"); - return; /* do not generate int serializers in libs */ - } - else if (is_imported(typ) && (typ->type != Tint || typ->sym)) - return; - if (is_typedef(typ) && is_element(typ)) - fprintf(fhead,"\n\n/* %s is a typedef element/attribute synonym for %s */", c_ident(typ), t_ident(typ)); - if (is_primitive(typ) || is_string(typ) || is_wstring(typ)) - { if (!Qflag && is_external(typ) && namespaceid) - { char *id = namespaceid; - fprintf(fhead,"\n\n}"); - fprintf(fout,"\n\n}"); - namespaceid = NULL; - fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); - fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); - fprintf(fhead,"\n#endif"); - namespaceid = id; - } - fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); - fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); - fprintf(fhead,"\n#endif"); - fflush(fhead); - soap_default(typ); - soap_serialize(typ); - if (kflag) - soap_traverse(typ); - soap_out(typ); - soap_in(typ); - if (!Qflag && is_external(typ) && namespaceid) - { fprintf(fhead,"\n\nnamespace %s {", namespaceid); - fprintf(fout,"\n\nnamespace %s {", namespaceid); - } - soap_put(typ); - soap_get(typ); - return; - } - switch(typ->type) - { - case Ttemplate: - case Tenum: - case Tpointer: - case Tarray: - case Tstruct: - case Tclass: - case Tunion: - if (is_header_or_fault(typ) || is_body(typ)) - { fprintf(fhead,"\n\n#ifndef WITH_NOGLOBAL"); - fprintf(fout,"\n\n#ifndef WITH_NOGLOBAL"); - } - if (!Qflag && is_external(typ) && namespaceid) - { char *id = namespaceid; - fprintf(fhead,"\n\n}"); - fprintf(fout,"\n\n}"); - namespaceid = NULL; - fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); - fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); - fprintf(fhead,"\n#endif"); - namespaceid = id; - } - fprintf(fhead,"\n\n#ifndef %s",soap_type(typ)); - fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num); - fprintf(fhead,"\n#endif"); - fflush(fhead); - soap_default(typ); - soap_serialize(typ); - if (kflag) - soap_traverse(typ); - soap_out(typ); - soap_in(typ); - if (!Qflag && is_external(typ) && namespaceid) - { fprintf(fhead,"\n\nnamespace %s {", namespaceid); - fprintf(fout,"\n\nnamespace %s {", namespaceid); - } - soap_put(typ); - soap_get(typ); - if (typ->type == Tstruct || typ->type == Tclass || typ->type == Ttemplate) - soap_instantiate_class(typ); - if (is_header_or_fault(typ) || is_body(typ)) - { fprintf(fhead,"\n\n#endif"); - fprintf(fout,"\n\n#endif"); - } - break; - default: - break; - } -} - -void -matlab_gen_sparseStruct(void) -{ - fprintf(fmheader,"\nstruct soapSparseArray{\n"); - fprintf(fmheader," int *ir;\n"); - fprintf(fmheader," int *jc;\n"); - fprintf(fmheader," double *pr;\n"); - fprintf(fmheader," int num_columns;\n"); - fprintf(fmheader," int num_rows;\n"); - fprintf(fmheader," int nzmax;\n"); - fprintf(fmheader,"};\n"); -} - -void -matlab_c_to_mx_sparse(void) -{ - fprintf(fmheader,"\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray);\n"); - fprintf(fmatlab,"\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray a)\n"); - fprintf(fmatlab,"{\n"); - fprintf(fmatlab," mxArray *b;\n"); - fprintf(fmatlab," b = mxCreateSparse(a.num_rows, a.num_columns, a.nzmax, mxREAL);\n"); - fprintf(fmatlab," mxSetIr(b,a.ir);\n"); - fprintf(fmatlab," mxSetJc(b,a.jc);\n"); - fprintf(fmatlab," mxSetPr(b,a.pr);\n"); - fprintf(fmatlab," return b;\n"); - fprintf(fmatlab,"}\n"); -} - -void -matlab_mx_to_c_sparse(void) -{ - fprintf(fmheader,"\nmxArray* mx_to_c_soapSparseArray(const mxArray *, struct soapSparseArray *);\n"); - fprintf(fmatlab,"\nmxArray* mx_to_c_soapSparseArray(const mxArray *a, struct soapSparseArray *b)\n"); - fprintf(fmatlab,"{\n"); - fprintf(fmatlab," if(!mxIsSparse(a))\n"); - fprintf(fmatlab," {\n"); - fprintf(fmatlab," mexErrMsgTxt(\"Input should be a sparse array.\");\n"); - fprintf(fmatlab," }\n"); - - fprintf(fmatlab," /* Get the starting positions of the data in the sparse array. */ \n"); - fprintf(fmatlab," b->pr = mxGetPr(a);\n"); - fprintf(fmatlab," b->ir = mxGetIr(a);\n"); - fprintf(fmatlab," b->jc = mxGetJc(a);\n"); - fprintf(fmatlab," b->num_columns = mxGetN(a);\n"); - fprintf(fmatlab," b->num_rows = mxGetM(a);\n"); - fprintf(fmatlab," b->nzmax = mxGetNzmax(a);\n"); - fprintf(fmatlab,"}\n"); -} - -void -matlab_mx_to_c_dynamicArray(Tnode* typ) -{ - int d; - Entry *p; - - p = is_dynamic_array(typ); - - fprintf(fmatlab,"{\n"); - fprintf(fmatlab,"\tint i, numdims;\n"); - fprintf(fmatlab,"\tconst int *dims;\n"); - fprintf(fmatlab,"\tdouble *temp;\n"); - fprintf(fmatlab,"\tint size = 1;\n"); - fprintf(fmatlab,"\tint ret;\n"); - fprintf(fmatlab,"\tnumdims = mxGetNumberOfDimensions(a);\n"); - fprintf(fmatlab,"\tdims = mxGetDimensions(a);\n"); - - d = get_Darraydims(typ); - fprintf(fmatlab,"\tif (numdims != %d)\n", d); - fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Incompatible array specifications in C and mx.\");\n"); - - /* - fprintf(fmatlab,"\tfor(i=0;i<numdims; i++) {\n"); - fprintf(fmatlab,"\t b->__size[i] = dims[i];\n"); - fprintf(fmatlab,"\t}\n"); - */ - - if((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) - { - fprintf(fmatlab,"\ttemp = (double*)mxGetPr(a);\n"); - fprintf(fmatlab,"\tif (!temp)\n\t\tmexErrMsgTxt(\"mx_to_c_ArrayOfdouble: Pointer to data is NULL\");\n"); - } - - fprintf(fmatlab,"\tfor (i = 0; i < numdims; i++) {\n"); - fprintf(fmatlab,"\t\tif (b->__size[i] < dims[i])\n"); - fprintf(fmatlab,"\t\t\tmexErrMsgTxt(\"Incompatible array dimensions in C and mx.\");\n"); - fprintf(fmatlab,"\t\tsize *= dims[i];\n"); - fprintf(fmatlab,"\t}\n"); - - if((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) - { - fprintf(fmatlab,"\tfor (i = 0; i < size; i++)\n"); - fprintf(fmatlab,"\t\tb->__ptr[i] = (%s)*temp++;\n", c_type((Tnode*)p->info.typ->ref)); - } - else - { - fprintf(fmatlab,"\tret = mxGetString(a, b->__ptr, size + 1);\n"); - fprintf(fmatlab,"\tmexPrintf(\"ret = %%d, b->__ptr = %%s, size = %%d\", ret, b->__ptr, size);\n"); - } - fprintf(fmatlab,"\n}\n"); - - fflush(fmatlab); -} - - -void -matlab_c_to_mx_dynamicArray(Tnode* typ) -{ - int d,i; - Entry *p; - - p = is_dynamic_array(typ); - - fprintf(fmatlab,"{\n"); - fprintf(fmatlab,"\tmxArray *out;\n"); - fprintf(fmatlab,"\t%s;\n",c_type_id((Tnode*)p->info.typ->ref,"*temp")); - d = get_Darraydims(typ); - fprintf(fmatlab,"\tint i;\n"); - - fprintf(fmatlab,"\tint ndim = %d, dims[%d] = {", d, d); - for (i = 0; i < d; i++) - { - if(i==0) - fprintf(fmatlab,"a.__size[%d]",i); - else - fprintf(fmatlab,", a.__size[%d]",i); - } - fprintf(fmatlab,"};\n"); - - fprintf(fmatlab,"\tint size = "); - for (i = 0; i < d; i++) - { - if(i==0) - fprintf(fmatlab,"dims[%d]",i); - else - fprintf(fmatlab,"*dims[%d]",i); - } - fprintf(fmatlab,";\n"); - if((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) - { - fprintf(fmatlab,"\tout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n",get_mxClassID((Tnode*)p->info.typ->ref)); - fprintf(fmatlab,"\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); - fprintf(fmatlab,"\ttemp = (%s) mxGetPr(out);\n",c_type_id((Tnode*)p->info.typ->ref,"*")); - fprintf(fmatlab,"\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); - - fprintf(fmatlab,"\tfor (i = 0; i < size; i++)\n"); - fprintf(fmatlab,"\t\t*temp++ = a.__ptr[i];\n"); - } - else - { - fprintf(fmatlab,"\tout = mxCreateString(a.__ptr);\n"); - fprintf(fmatlab,"\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); - } - fprintf(fmatlab,"\treturn out;\n}\n"); - fflush(fmatlab); -} - -char* -get_mxClassID(Tnode* typ) -{ - - switch(typ->type) - { - case Tdouble: - return "mxDOUBLE_CLASS"; - case Tfloat: - return "mxSINGLE_CLASS"; - case Tshort: - return "mxINT16_CLASS"; - case Tushort: - return "mxUINT16_CLASS"; - case Tint: - return "mxINT32_CLASS"; - case Tuint: - return "mxUINT32_CLASS"; - case Tlong: - return "mxINT32_CLASS"; - case Tulong: - return "mxUINT32_CLASS"; - case Tllong: - return "mxINT64_CLASS"; - case Tullong: - return "mxUINT64_CLASS"; - case Tchar: - return "mxCHAR_CLASS"; - case Tuchar: - return "mxCHAR_CLASS"; - default: - return ""; - }; -} - -/*Function not in use.*/ -void -matlab_array_c_to_mx(Tnode* typ) -{ - Tnode* temp; - int d,i; - - fprintf(fmatlab,"{\n\tint rows, r, cols, c;\n"); - fprintf(fmatlab,"\tmxArray* out;\n"); - fprintf(fmatlab,"\tdouble* temp;\n"); - d = get_dimension(typ); - fprintf(fmatlab,"\tint ndim = %d, dims[%d] = {",d,d); - temp=typ; - for(i=0;i<d; i++) - { - if(i==0) - fprintf(fmatlab,"%d",temp->width / ((Tnode*) temp->ref)->width); - else - fprintf(fmatlab,",%d",temp->width / ((Tnode*) temp->ref)->width); - temp=(Tnode*)typ->ref; - } - fprintf(fmatlab,"};\n"); - - fprintf(fmatlab,"\tout = mxCreateNumericArray(ndim, dims, mxDOUBLE_CLASS, mxREAL);\n"); - fprintf(fmatlab,"\ttemp = (double *) mxGetPr(out);\n"); - fprintf(fmatlab,"\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); - fprintf(fmatlab,"\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); - fprintf(fmatlab,"\trows = mxGetM(out);\n"); - fprintf(fmatlab,"\tif (!rows)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero rows\");\n"); - fprintf(fmatlab,"\tcols = mxGetN(out);\n"); - fprintf(fmatlab,"\tif (!cols)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero columns\");\n"); - fprintf(fmatlab,"\tfor (c = 0; c < cols; c++)\n"); - fprintf(fmatlab,"\t\tfor (r = 0; r < rows; r++)\n"); - fprintf(fmatlab,"\t\t\t*temp++ = z->a[r][c];\n"); - fprintf(fmatlab,"\treturn out;\n}\n"); - fflush(fmatlab); -} - - -void matlab_c_to_mx_pointer(Tnode* typ) -{ - if (!typ->ref) - return; - - fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);\n",c_ident(typ),c_type_id(typ, "")); - fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a")); - fprintf(fmatlab,"{\n"); - fprintf(fmatlab,"\tmxArray *fout;\n"); - fprintf(fmatlab,"\tfout = c_to_mx_%s(*a);\n",c_ident((Tnode*)typ->ref)); - fprintf(fmatlab,"\treturn fout;\n"); - fprintf(fmatlab,"}\n"); -} - -void matlab_mx_to_c_pointer(Tnode* typ) -{ - if (!typ->ref) - return; - fprintf(fmheader,"\nvoid mx_to_c_%s(const mxArray*,%s);\n",c_ident(typ),c_type_id(typ, "*")); - fprintf(fmatlab,"\nvoid mx_to_c_%s(const mxArray* a,%s)\n",c_ident(typ),c_type_id(typ, "*b")); - fprintf(fmatlab,"{\n\tmx_to_c_%s(a,*b);\n",c_ident((Tnode*)typ->ref)); - fprintf(fmatlab,"\n}\n"); -} - -void func2(Tnode* typ) -{ - Table *table,*t; - Entry *p; - - fprintf(fmatlab,"\tif(!mxIsStruct(a))\n\t\tmexErrMsgTxt(\"Input must be a structure.\");\n"); - - table=(Table*)typ->ref; - for (t = table; t != (Table *) 0; t = t->prev) { - for (p = t->list; p != (Entry*) 0; p = p->next) { - if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) - { - fprintf(fmatlab,"\t{mxArray *tmp = mxGetField(a,0,\"%s\");\n",ident(p->sym->name)); - fprintf(fmatlab,"\tif (!tmp) {\n"); - fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Above member field is empty!\");\n\t}\n"); - fprintf(fmatlab,"\tmx_to_c_%s(tmp,&(b->%s));}\n",c_ident(p->info.typ),ident(p->sym->name)); - } - } - } -} - -void -matlab_mx_to_c_struct(Tnode* typ) -{ - if (!typ->ref) - return; - - - if (is_dynamic_array(typ)) - { - fprintf(fmheader,"\nvoid mx_to_c_%s(const mxArray*, %s);\n",c_ident(typ),c_type_id(typ, "*")); - fprintf(fmatlab,"\nvoid mx_to_c_%s(const mxArray* a, %s)\n",c_ident(typ),c_type_id(typ, "*b")); - matlab_mx_to_c_dynamicArray(typ); - return; - } - else if(strstr(c_type_id(typ, ""),"soapSparseArray")) - { - return; - } - - fprintf(fmheader,"\nvoid mx_to_c_%s(const mxArray*, %s);\n",c_ident(typ),c_type_id(typ, "*")); - fprintf(fmatlab,"\nvoid mx_to_c_%s(const mxArray* a, %s)\n",c_ident(typ),c_type_id(typ, "*b")); - fprintf(fmatlab,"{\n"); - - func2(typ); - fprintf(fmatlab,"\n}\n"); - - return; -} - - - -void -matlab_c_to_mx_struct(Tnode* typ) -{ - Table *table,*t; - Entry *p; - int number_of_fields=0; - - if (!typ->ref) - return; - - if (is_dynamic_array(typ)) - { - fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);\n",c_ident(typ),c_type_id(typ, "")); - fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a")); - matlab_c_to_mx_dynamicArray(typ); - return; - } - else if(strstr(c_type_id(typ, ""),"soapSparseArray")) - { - return; - } - - fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);\n",c_ident(typ),c_type_id(typ, "")); - fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a")); - table=(Table*)typ->ref; - fprintf(fmatlab,"{\n\tconst char* fnames[] = {"); - for (t = table; t != (Table *) 0; t = t->prev) { - for (p = t->list; p != (Entry*) 0; p = p->next) { - if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) - { - if(number_of_fields) - fprintf(fmatlab,",\"%s\"",ident(p->sym->name)); - else - fprintf(fmatlab,"\"%s\"",ident(p->sym->name)); - number_of_fields++; - } - } - } - fprintf(fmatlab,"}; /* pointers to member field names */\n"); - - fprintf(fmatlab,"\tint rows = 1, cols = 1;\n\tint index = 0;\n\tint number_of_fields = %d;\n\tmxArray *struct_array_ptr;\n",number_of_fields); - fprintf(fmatlab,"\t/* Create a 1x1 struct matrix for output */\n"); - fprintf(fmatlab,"\tstruct_array_ptr = mxCreateStructMatrix(rows, cols, number_of_fields, fnames);\n\tmexPrintf(\"6\");\n\tif(struct_array_ptr == NULL) {\n\t\tmexPrintf(\"COULDNT CREATE A MATRIX\");}\n\tmexPrintf(\"7\");\n"); - - - for (t = table; t != (Table *) 0; t = t->prev) { - for (p = t->list; p != (Entry*) 0; p = p->next) { - if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) - { - fprintf(fmatlab,"\t{mxArray *fout = c_to_mx_%s(a.%s);\n",c_ident(p->info.typ), ident(p->sym->name)); - fprintf(fmatlab,"\tmxSetField(struct_array_ptr, index,\"%s\" , fout);}\n", ident(p->sym->name)); - } - } - } - fprintf(fmatlab,"\treturn struct_array_ptr;\n}\n"); - return; -} - -void -matlab_c_to_mx_primitive(Tnode *typ) -{ - fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);",c_ident(typ),c_type_id(typ, "")); - fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a")); - - fprintf(fmatlab,"{\n\tmxArray *fout;\n"); - if((typ->type == Tchar) || (typ->type == Tuchar)) - { - fprintf(fmatlab,"\tchar buf[2];\n"); - fprintf(fmatlab,"\tbuf[0] = a;\n"); - fprintf(fmatlab,"\tbuf[1] = \'\\0\';\n"); - fprintf(fmatlab,"\tfout = mxCreateString(buf);\n"); - fprintf(fmatlab,"\tif (!fout)\n"); - fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); - } - else - { - fprintf(fmatlab,"\tint ndim = 1, dims[1] = {1};\n"); - fprintf(fmatlab,"\tfout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n",get_mxClassID(typ)); - fprintf(fmatlab,"\t%s = (%s)mxGetPr(fout);\n",c_type_id(typ,"*temp"),c_type_id(typ,"*")); - fprintf(fmatlab,"\tif (!fout)\n"); - fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); - fprintf(fmatlab,"\tif (!temp) \n"); - fprintf(fmatlab,"\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); - fprintf(fmatlab,"\t*temp++= a;\n"); - } - fprintf(fmatlab,"\treturn fout;\n}\n"); -} - -void -matlab_mx_to_c_primitive(Tnode *typ) -{ - fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray *, %s);\n",c_ident(typ),c_type_id(typ, "*")); - fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray *a, %s)\n",c_ident(typ),c_type_id(typ, "*b")); - if((typ->type == Tchar) || (typ->type == Tuchar)) - { - fprintf(fmatlab,"{\n\tint ret;\n"); - fprintf(fmatlab,"\tchar buf[2];\n"); - fprintf(fmatlab,"\tret = mxGetString(a, buf, 2);\n"); - fprintf(fmatlab,"\tmexPrintf(\"ret = %%d, buf = %%s\", ret, buf);\n"); - fprintf(fmatlab,"\t*b = buf[0];\n"); - } - else - { - fprintf(fmatlab,"{\n\tdouble* data = (double*)mxGetData(a);\n"); - fprintf(fmatlab,"\t*b = (%s)*data;\n",c_type(typ)); - } - fprintf(fmatlab,"\n}\n"); -} - -void -matlab_out_generate(Tnode *typ) -{ - - if (is_transient(typ) || typ->type == Twchar || is_XML(typ)) - return; - - /* - typeNO++; - if (typeNO>=1024) - execerror("Too many user-defined data types"); - */ - - if(is_primitive(typ)) - { - matlab_c_to_mx_primitive(typ); - matlab_mx_to_c_primitive(typ); - return; - } - - switch(typ->type) - { - case Tstruct: - matlab_c_to_mx_struct(typ); - matlab_mx_to_c_struct(typ); - break; - case Tpointer: - matlab_c_to_mx_pointer(typ); - matlab_mx_to_c_pointer(typ); - break; - case Tarray: - break; - default:break; - } -} - -/*his function is called first it first generates all routines - and then in the second pass calls all routines to generate - matlab_out for the table*/ - -void -func1(Table *table, Entry *param) -{ Entry *q,*pout,*response=NULL; - q=entry(table, param->sym); - if (q) - pout = (Entry*)q->info.typ->ref; - else - { fprintf(stderr, "Internal error: no table entry\n"); - return; - } - q=entry(classtable, param->sym); - if (!is_response(pout->info.typ)) - { response = get_response(param->info.typ); - } - fprintf(fmheader,"\n\toutside loop struct %s soap_tmp_%s;",param->sym->name,param->sym->name); - if (!is_response(pout->info.typ) && response) - { fprintf(fmheader,"\n\tif..inside loop struct %s *soap_tmp_%s;",c_ident(response->info.typ), c_ident(response->info.typ)); - } - fflush(fmheader); -} - -void -matlab_def_table(Table *table) -{ - Entry *q,*pout,*e,*response=NULL; - int i; - Tnode *p; - - /* for (q1 = table->list; q1 != (Entry*) 0; q1 = q1->next) - if (q1->info.typ->type==Tfun) - func1(table, q1); - */ - - /* Sparse matrix code will be present by default */ - matlab_gen_sparseStruct(); - matlab_c_to_mx_sparse(); - matlab_mx_to_c_sparse(); - - for(i=0;i<TYPES;i++) - for(p=Tptr[i];p!=(Tnode*) 0;p=p->next) - { - /* This is generated for everything declared in the ".h" file. To make - sure that it doesnt get generated for functions do a comparison with - p->sym->name, so that its not generated for functions. - */ - if(is_XML(p)) - continue; - if(strstr(c_ident(p),"SOAP_ENV_") != NULL) - continue; - for(q = table->list; q != (Entry*) 0; q = q->next) - { - if(strcmp(c_ident(p),q->sym->name) == 0) - break; - e=entry(table, q->sym); - if (e) - pout = (Entry*)e->info.typ->ref; - else - { fprintf(stderr, "Internal error: no table entry\n"); - return; - } - if (!is_response(pout->info.typ)) - { response = get_response(q->info.typ); - } - if (!is_response(pout->info.typ) && response) - { - if(strcmp(c_ident(p),c_ident(response->info.typ)) == 0) - break; - } - } - if(q == (Entry*) 0) - matlab_out_generate(p); - } -} - -void -def_table(Table *table) -{ int i; - Tnode *p; - for (i = 0; i < TYPES; i++) - { for (p = Tptr[i]; p; p = p->next) - { if (!p->generated && !is_transient(p) && p->type != Twchar && !is_void(p)) - { p->generated = True; - generate(p); - if (fflag) - if (--partnum == 0) - return; - } - } - } -} - - -int -no_of_var(Tnode *typ) -{ - Entry *p; - Table *t; - int i=0; - if(typ->type==Tstruct || typ->type==Tclass) - { - t=(Table*)typ->ref; - for (p = t->list; p != (Entry*) 0; p = p->next) { - if(p->info.typ->type==Tpointer) - i++; - } - } - if((((Tnode *)(typ->ref))->type==Tstruct) || - (((Tnode *)(typ->ref))->type==Tclass) ) - { - t=(Table*)((Tnode*)(typ->ref))->ref; - for (p = t->list; p != (Entry*) 0; p = p->next) { - if(p->info.typ->type==Tpointer) - i++; - } - } - return i; -} - -void -in_defs(Table *table) -{ int i; - Tnode *p; - for (i = 0; i < TYPES; i++) - { for (p = Tptr[i]; p; p = p->next) - { if (!is_element(p) && !is_transient(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p) && !is_template(p)) - { char *s = xsi_type(p); - if (!*s) - s = wsdl_type(p, ""); - if (*s == '-') - continue; - if (is_string(p)) - fprintf(fout,"\n\tcase %s:\n\t{\tchar **s;\n\t\ts = soap_in_%s(soap, NULL, NULL, \"%s\");\n\t\treturn s ? *s : NULL;\n\t}", soap_type(p), c_ident(p), s); - else if (is_wstring(p)) - fprintf(fout,"\n\tcase %s:\n\t{\twchar_t **s;\n\t\ts = soap_in_%s(soap, NULL, NULL, \"%s\");\n\t\treturn s ? *s : NULL;\n\t}", soap_type(p), c_ident(p), s); - else - fprintf(fout,"\n\tcase %s:\n\t\treturn soap_in_%s(soap, NULL, NULL, \"%s\");", soap_type(p), c_ident(p), s); - } - } - } -} - -void -in_defs2(Table *table) -{ int i, j; - Tnode *p; - char *s; - for (i = 0; i < TYPES; i++) - { /* make sure (wrapper) classes are checked first */ - if (i == 0) - j = Tclass; - else if (i == Tclass) - continue; - else - j = i; - for (p = Tptr[j]; p; p = p->next) - { if (!is_element(p) && !is_transient(p) && !is_template(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p)) - { s = xsi_type(p); - if (!*s) - s = wsdl_type(p, ""); - if (*s == '-') - continue; - if (*s) - { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) - fprintf(fout,"\n\t\tif (*soap->arrayType && !soap_match_array(soap, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); - else if (is_string(p)) - fprintf(fout,"\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\tchar **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); - else if (is_wstring(p)) - fprintf(fout,"\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\twchar_t **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); - else if (p->type != Tpointer) - fprintf(fout,"\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); - } - } - } - } -} - -void -in_defs3(Table *table) -{ int i; - Tnode *p; - char *s; - for (i = 0; i < TYPES; i++) - { for (p = Tptr[i]; p; p = p->next) - { if (is_element(p) && !is_transient(p) && !is_template(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p)) - { s = xsi_type(p); - if (!*s) - s = wsdl_type(p, ""); - if (*s == '-') - continue; - if (*s) - { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) - fprintf(fout,"\n\t\tif (*soap->arrayType && !soap_match_array(soap, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); - else if (is_string(p)) - fprintf(fout,"\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\tchar **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); - else if (is_wstring(p)) - fprintf(fout,"\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\twchar_t **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); - else if (p->type != Tpointer) - fprintf(fout,"\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); - } - } - } - } -} - -void -out_defs(Table *table) -{ int i; - char *s; - Tnode *p; - for (i = 0; i < TYPES; i++) - { for (p = Tptr[i]; p; p = p->next) - { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p)) - continue; - if (is_element(p)) - { s = wsdl_type(p, ""); - if (*s == '-') - continue; - if (p->type == Tarray) - fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (%s)ptr, NULL);", soap_type(p),c_ident(p),s,c_type_id((Tnode*)p->ref, "(*)")); - else if(p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) - fprintf(fout,"\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, \"%s\", id, NULL);", soap_type(p), c_type_id(p, "*"),s); - else if (is_string(p)) - fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_string(soap, \"%s\", id, (char*const*)&ptr, NULL);", soap_type(p),s); - else if (is_wstring(p)) - fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_wstring(soap, \"%s\", id, (wchar_t*const*)&ptr, NULL);", soap_type(p),s); - else if (p->type == Tpointer) - fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (%s)ptr, NULL);", soap_type(p),c_ident(p),s,c_type_id(p, "const*")); - else if(p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Tunion) - fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (const %s)ptr, NULL);", soap_type(p),c_ident(p),s,c_type_id(p, "*")); - } - else - { s = xsi_type(p); - if (!*s) - s = wsdl_type(p, ""); - if (*s == '-') - continue; - if (p->type == Tarray) - fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (%s)ptr, \"%s\");", soap_type(p), c_ident(p),c_type_id((Tnode*)p->ref, "(*)"), s); - else if(p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) - fprintf(fout,"\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, tag, id, \"%s\");", soap_type(p), c_type_id(p, "*"), s); - else if (is_string(p)) - fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_string(soap, tag, id, (char*const*)&ptr, \"%s\");", soap_type(p), s); - else if (is_wstring(p)) - fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_wstring(soap, tag, id, (wchar_t*const*)&ptr, \"%s\");", soap_type(p), s); - else if (p->type == Tpointer) - fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (%s)ptr, \"%s\");", soap_type(p), c_ident(p),c_type_id(p, "const*"), s); - else if(p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Tunion) - fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (const %s)ptr, \"%s\");", soap_type(p), c_ident(p),c_type_id(p, "*"), s); - } - } - } -} - -void -mark_defs(Table *table) -{ int i; - Tnode *p; - for (i = 0; i < TYPES; i++) - { for (p = Tptr[i]; p; p = p->next) - { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) - continue; - if (p->type == Tarray) - fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (%s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p),c_type_id((Tnode*)p->ref, "(*)")); - else if(p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) - fprintf(fout,"\n\tcase %s:\n\t\t((%s)ptr)->soap_serialize(soap);\n\t\tbreak;", soap_type(p), c_type_id(p, "*")); - else if (is_string(p)) - fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_string(soap, (char*const*)&ptr);\n\t\tbreak;", soap_type(p)); - else if (is_wstring(p)) - fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_wstring(soap, (wchar_t*const*)&ptr);\n\t\tbreak;", soap_type(p)); - else if (p->type == Tpointer) - fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (%s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p),c_type_id(p, "const*")); - else if(p->type == Ttemplate && p->ref) - fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p),c_type_id(p, "*")); - else if(!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Tunion) - fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p),c_type_id(p, "*")); - } - } -} - -void -in_attach(Table *table) -{ int i; - Tnode *p; - for (i = 0; i < TYPES; i++) - { for (p = Tptr[i]; p; p = p->next) - { if (is_attachment(p)) - { if (p->type == Tclass) - fprintf(fout,"\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_class_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL);\n\t\t\tif (a)\n\t\t\t{\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\t\ta->__size = soap->dime.size;\n\t\t\t\ta->id = (char*)soap->dime.id;\n\t\t\t\ta->type = (char*)soap->dime.type;\n\t\t\t\ta->options = (char*)soap->dime.options;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn soap->error;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); - else - fprintf(fout,"\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), 0, NULL, NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\ta->id = (char*)soap->dime.id;\n\t\t\ta->type = (char*)soap->dime.type;\n\t\t\ta->options = (char*)soap->dime.options;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); - } - else if (is_binary(p) && !is_transient(p)) - { if (p->type == Tclass) - fprintf(fout,"\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_class_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); - else - fprintf(fout,"\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), 0, NULL, NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); - } - } - } -} - -void -soap_instantiate_class(Tnode *typ) -{ Table *Tptr; - Entry *Eptr; - int derclass = 0, flag = 0; - char *s; - - if (cflag) - return; - - if (typ->type != Tclass || !typ->sym || !is_eq(typ->sym->name, "xsd__QName") || is_imported(typ)) - if (is_typedef(typ) && !is_external(typ)) - { fprintf(fhead, "\n\n#define soap_instantiate_%s soap_instantiate_%s\n", c_ident(typ), t_ident(typ)); - fprintf(fhead, "\n\n#define soap_copy_%s soap_copy_%s", c_ident(typ), t_ident(typ)); - return; - } - - fprintf(fhead,"\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_type(typ), c_ident(typ)); - - fprintf(fhead, "\n\ninline %s * soap_new_%s(struct soap *soap, int n = -1) { return soap_instantiate_%s(soap, n, NULL, NULL, NULL); }", c_type(typ), c_ident(typ), c_ident(typ)); - - if (typ->type == Tclass || typ->type == Tstruct) - { fprintf(fhead, "\n\ninline %s * soap_new_req_%s(struct soap *soap", c_type(typ), c_ident(typ)); - if (!is_dynamic_array(typ)) - { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) - { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) - { if (Eptr->info.sto & (Stypedef | Sstatic)) - continue; - if (is_repetition(Eptr) || is_anytype(Eptr)) - flag = 2; - if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) - { if (flag) - flag--; - if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) - fprintf(fhead, ", %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); - else - fprintf(fhead, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); - if (derclass) - fprintf(fhead, "%d", derclass); - } - } - } - } - fprintf(fhead, ") { %s = soap_instantiate_%s(soap, -1, NULL, NULL, NULL); if (_p) { ", c_type_id(typ, "*_p"), c_ident(typ)); - if (!is_external(typ)) - { if (typ->type == Tclass && !is_volatile(typ)) - fprintf(fhead, "_p->soap_default(soap); "); - else - fprintf(fhead, "soap_default_%s(soap, _p); ", c_ident(typ)); - } - flag = 0; - if (!is_dynamic_array(typ)) - { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) - { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) - { if (Eptr->info.sto & (Stypedef | Sstatic)) - continue; - if (is_repetition(Eptr) || is_anytype(Eptr)) - flag = 2; - if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) - { if (flag) - flag--; - if (typ->type == Tclass) - fprintf(fhead, "_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); - else - fprintf(fhead, "_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); - if (derclass) - fprintf(fhead, "%d; ", derclass); - else - fprintf(fhead, "; "); - } - } - } - } - fprintf(fhead, "} return _p; }"); - fprintf(fhead, "\n\ninline %s * soap_new_set_%s(struct soap *soap", c_type(typ), c_ident(typ)); - for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) - { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) - { if (Eptr->info.sto & (Stypedef | Sstatic)) - continue; - if (!(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) - { if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) - fprintf(fhead, ", %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); - else - fprintf(fhead, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); - if (derclass) - fprintf(fhead, "%d", derclass); - } - } - } - fprintf(fhead, ") { %s = soap_instantiate_%s(soap, -1, NULL, NULL, NULL); if (_p) { ", c_type_id(typ, "*_p"), c_ident(typ)); - if (!is_external(typ)) - { if (typ->type == Tclass && !is_volatile(typ)) - fprintf(fhead, "_p->soap_default(soap); "); - else - fprintf(fhead, "soap_default_%s(soap, _p); ", c_ident(typ)); - } - for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) - { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) - { if (Eptr->info.sto & (Stypedef | Sstatic)) - continue; - if (!(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) - { if (typ->type == Tclass) - fprintf(fhead, "_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); - else if (Eptr->info.typ->type == Tarray) - fprintf(fhead, "memcpy(_p->%s, %s, sizeof(%s))", ident(Eptr->sym->name), ident(Eptr->sym->name), c_type(Eptr->info.typ)); - else - fprintf(fhead, "_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); - if (derclass) - fprintf(fhead, "%d; ", derclass); - else - fprintf(fhead, "; "); - } - } - } - fprintf(fhead, "} return _p; }"); - } - - fprintf(fhead, "\n\ninline void soap_delete_%s(struct soap *soap, %s) { soap_delete(soap, p); }", c_ident(typ), c_type_id(typ, "*p")); - - /* extern "C" causes C++ namespace linking issues */ - /* fprintf(fhead,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); */ - fprintf(fhead,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_copy_%s(struct soap*, int, int, void*, size_t, const void*, size_t);", c_ident(typ)); - /* fprintf(fhead,"\n#ifdef __cplusplus\n}\n#endif"); */ - - fprintf(fout,"\n\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_instantiate_%s(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size)", c_type(typ), c_ident(typ)); - fprintf(fout,"\n{"); - fprintf(fout,"\n\t(void)type; (void)arrayType; /* appease -Wall -Werror */"); - fprintf(fout, "\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"soap_instantiate_%s(%%d, %%s, %%s)\\n\", n, type?type:\"\", arrayType?arrayType:\"\"));", c_ident(typ)); - - fprintf(fout,"\n\tstruct soap_clist *cp = soap_link(soap, NULL, %s, n, %s_fdelete);", soap_type(typ), prefix); - fprintf(fout,"\n\tif (!cp)\n\t\treturn NULL;"); - for (Eptr = classtable->list; Eptr; Eptr = Eptr->next) - { - Tptr = ((Table *) Eptr->info.typ->ref); - if(Tptr == ((Table *) typ->ref)){ - continue; - } - - derclass = 0; - while(Tptr) - { - if(Tptr == (Table*)typ->ref){ - derclass = 1; - } - - Tptr = Tptr->prev; - } - - if(derclass == 1 && !is_transient(Eptr->info.typ)){ - if (is_dynamic_array(Eptr->info.typ) && !is_binary(Eptr->info.typ) && !has_ns(Eptr->info.typ) && !is_untyped(Eptr->info.typ)) - fprintf(fout,"\n\tif (arrayType && !soap_match_tag(soap, arrayType, \"%s\"))", xsi_type(Eptr->info.typ)); - else - fprintf(fout,"\n\tif (type && !soap_match_tag(soap, type, \"%s\"))", the_type(Eptr->info.typ)); - fprintf(fout,"\n\t{\tcp->type = %s;", soap_type(Eptr->info.typ)); - fprintf(fout,"\n\t\tif (n < 0)"); - fprintf(fout,"\n\t\t{\tcp->ptr = (void*)SOAP_NEW(%s);", c_type(Eptr->info.typ)); - fprintf(fout,"\n\t\t\tif (size)\n\t\t\t\t*size = sizeof(%s);", c_type(Eptr->info.typ)); - if ((s = has_soapref(Eptr->info.typ))) - fprintf(fout,"\n\t\t\t((%s*)cp->ptr)->%s = soap;", c_type(Eptr->info.typ), s); - fprintf(fout,"\n\t\t}\n\t\telse"); - fprintf(fout,"\n\t\t{\tcp->ptr = (void*)SOAP_NEW_ARRAY(%s, n);", c_type(Eptr->info.typ)); - fprintf(fout,"\n\t\t\tif (size)\n\t\t\t\t*size = n * sizeof(%s);", c_type(Eptr->info.typ)); - if (s) - fprintf(fout,"\n\t\t\tif (cp->ptr)\n\t\t\t\tfor (int i = 0; i < n; i++)\n\t\t\t\t\t((%s*)cp->ptr)[i].%s = soap;", c_type(Eptr->info.typ), s); - fprintf(fout,"\n\t\t}"); - fprintf(fout,"\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Instantiated location=%%p\\n\", cp->ptr));"); - fprintf(fout,"\n\t\tif (!cp->ptr)\n\t\t\tsoap->error = SOAP_EOM;"); - fprintf(fout,"\n\t\treturn (%s*)cp->ptr;", c_type(Eptr->info.typ)); - fprintf(fout,"\n\t}"); - - derclass = 0; - } - } - - fprintf(fout,"\n\tif (n < 0)"); - fprintf(fout,"\n\t{\tcp->ptr = (void*)SOAP_NEW(%s);", c_type(typ)); - fprintf(fout,"\n\t\tif (size)\n\t\t\t*size = sizeof(%s);", c_type(typ)); - if ((s = has_soapref(typ))) - fprintf(fout,"\n\t\t((%s*)cp->ptr)->%s = soap;", c_type(typ), s); - fprintf(fout,"\n\t}\n\telse"); - fprintf(fout,"\n\t{\tcp->ptr = (void*)SOAP_NEW_ARRAY(%s, n);", c_type(typ)); - fprintf(fout,"\n\t\tif (size)\n\t\t\t*size = n * sizeof(%s);", c_type(typ)); - if (s) - fprintf(fout,"\n\t\tif (cp->ptr)\n\t\t\tfor (int i = 0; i < n; i++)\n\t\t\t\t((%s*)cp->ptr)[i].%s = soap;", c_type(typ), s); - fprintf(fout,"\n\t}"); - fprintf(fout,"\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Instantiated location=%%p\\n\", cp->ptr));"); - fprintf(fout,"\n\tif (!cp->ptr)\n\t\tsoap->error = SOAP_EOM;"); - fprintf(fout,"\n\treturn (%s*)cp->ptr;", c_type(typ)); - - fprintf(fout,"\n}"); - - /* fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); */ - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_copy_%s(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n)", c_ident(typ)); - fprintf(fout,"\n{\n\t(void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */"); - fprintf(fout,"\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Copying %s %%p -> %%p\\n\", q, p));", c_type(typ)); - fprintf(fout,"\n\t*(%s*)p = *(%s*)q;\n}", c_type(typ), c_type(typ)); - /* fprintf(fout,"\n#ifdef __cplusplus\n}\n#endif"); */ -} - -int -get_dimension(Tnode *typ) -{ if (((Tnode*)typ->ref)->width) - return typ->width / ((Tnode*) typ->ref)->width; - return 0; -} - - -void -soap_serialize(Tnode *typ) -{ int d; - Table *table,*t; - Entry *p; - Tnode* temp; - int cardinality; - const char *self; - - if (is_primitive(typ)) - return; - - if (is_typedef(typ) && is_element(typ) && !is_external(typ)) - { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) - fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) (a)->soap_serialize(soap)\n",c_ident(typ)); - else - fprintf(fhead, "\n\n#define soap_serialize_%s soap_serialize_%s\n", c_ident(typ), t_ident(typ)); - return; - } - - if (is_typedef(typ) && !is_external(typ)) - { if (is_imported(typ)) - { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) soap_serialize_%s(soap, a)\n", c_ident(typ), t_ident(typ)); - return; - } - if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) - { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) (a)->soap_serialize(soap)\n",c_ident(typ)); - return; - } - /* enabling this will not allow multi-ref detection of these typedef types - else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) - { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) soap_serialize_std__string(soap, a)\n", c_ident(typ)); - return; - } - else if (typ->type != Tclass) - { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) soap_serialize_%s(soap, a)\n", c_ident(typ), t_ident(typ)); - return; - } - */ - } - - if ((p = is_dynamic_array(typ))) - { if (typ->type == Tclass && !is_typedef(typ) && !is_volatile(typ)) - { if (is_external(typ)) - return; - fprintf(fout,"\n\nvoid %s::soap_serialize(struct soap *soap) const\n{\n#ifndef WITH_NOIDREF",c_ident(typ)); - if (is_binary(typ)) - { if (is_attachment(typ)) - { fprintf(fout,"\n\tif (this->__ptr && !soap_array_reference(soap, this, (struct soap_array*)&this->__ptr, 1, %s))", soap_type(typ)); - fprintf(fout,"\n\t\tif (this->id || this->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;"); - } - else - fprintf(fout,"\n\tif (this->__ptr)\n\t\tsoap_array_reference(soap, this, (struct soap_array*)&this->%s, 1, %s);", ident(p->sym->name), soap_type(typ)); - fprintf(fout,"\n#endif\n}"); - fflush(fout); - return; - } - else - { - d = get_Darraydims(typ); - if (d) - { fprintf(fout,"\n\tif (this->%s && !soap_array_reference(soap, this, (struct soap_array*)&this->%s, %d, %s))", ident(p->sym->name), ident(p->sym->name), d, soap_type(typ)); - fprintf(fout,"\n\t\tfor (int i = 0; i < soap_size(this->__size, %d); i++)", d); - } - else - { fprintf(fout,"\n\tif (this->%s && !soap_array_reference(soap, this, (struct soap_array*)&this->%s, 1, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); - fprintf(fout,"\n\t\tfor (int i = 0; i < this->__size; i++)"); - } - fprintf(fout,"\n\t\t{"); - if (has_ptr((Tnode*)p->info.typ->ref)) - fprintf(fout,"\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); - if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_XML((Tnode*)p->info.typ->ref) && !is_external(p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\t\tthis->%s[i].soap_serialize(soap);", ident(p->sym->name)); - else if (!is_XML((Tnode*)p->info.typ->ref) &&!is_primitive((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\t\tsoap_serialize_%s(soap, this->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); - fprintf(fout,"\n\t\t}\n#endif\n}"); - return; - } - } - else - { if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "const*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "const*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{\n#ifndef WITH_NOIDREF",c_ident(typ),c_type_id(typ, "const*a")); - if (is_binary(typ)) - { if (is_attachment(typ)) - { fprintf(fout,"\n\tif (a->%s && !soap_array_reference(soap, a, (struct soap_array*)&a->%s, 1, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); - fprintf(fout,"\n\t\tif (a->id || a->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;"); - } - else - fprintf(fout,"\n\tif (a->%s)\n\t\tsoap_array_reference(soap, a, (struct soap_array*)&a->%s, 1, %s);", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); - fprintf(fout,"\n#endif\n}"); - fflush(fout); - return; - } - else - { - fprintf(fout,"\n\tint i;"); - d = get_Darraydims(typ); - if (d) - { fprintf(fout,"\n\tif (a->%s && !soap_array_reference(soap, a, (struct soap_array*)&a->%s, %d, %s))", ident(p->sym->name), ident(p->sym->name), d, soap_type(typ)); - fprintf(fout,"\n\t\tfor (i = 0; i < soap_size(a->__size, %d); i++)", d); - } - else - { fprintf(fout,"\n\tif (a->%s && !soap_array_reference(soap, a, (struct soap_array*)&a->%s, 1, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); - fprintf(fout,"\n\t\tfor (i = 0; i < a->__size; i++)"); - } - fprintf(fout,"\n\t\t{"); - if (has_ptr((Tnode*)p->info.typ->ref)) - fprintf(fout,"\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); - if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_XML((Tnode*)p->info.typ->ref) && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->sym->name)); - else if (!is_XML((Tnode*)p->info.typ->ref) && !is_primitive((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); - fprintf(fout,"\n\t\t}\n#endif\n}"); - fflush(fout); - return; - } - } - } - if (is_stdstring(typ) || is_stdwstring(typ)) - { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\t(void)soap; (void)a; /* appease -Wall -Werror */\n}",c_ident(typ),c_type_id(typ, "*a")); - return; - } - switch(typ->type) - { - case Tclass: - if (!is_volatile(typ)) - { - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); - return; - } - table=(Table*)typ->ref; - if (!table) - return; - if (!is_typedef(typ)) - { self = "this"; - fprintf(fout,"\n\nvoid %s::soap_serialize(struct soap *soap) const\n{\n#ifndef WITH_NOIDREF", ident(typ->id->name)); - } - else - { self = "p"; - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n#ifndef WITH_NOIDREF", c_ident(typ), c_type_id(typ, "*p")); - } - fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); - for (p = table->list; p; p = p->next) - { - if (p->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); - else if (is_transient(p->info.typ)) - fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.sto & Sattribute) - ; - else if (is_repetition(p)) - { - if (!is_XML(p->next->info.typ)) - { - fprintf(fout,"\n\tif (%s->%s::%s)", self, ident(table->sym->name), ident(p->next->sym->name)); - fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < %s->%s::%s; i++)\n\t\t{", self, ident(table->sym->name), ident(p->sym->name)); - if (!is_invisible(p->next->sym->name)) - if (has_ptr((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\tsoap_embedded(soap, %s->%s::%s + i, %s);", self, ident(table->sym->name), ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t%s->%s::%s[i].soap_serialize(soap);", self, ident(table->sym->name), ident(p->next->sym->name)); - else if (!is_primitive((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\tsoap_serialize_%s(soap, %s->%s::%s + i);", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); - fprintf(fout,"\n\t\t}\n\t}"); - } - p = p->next; - } - else if (is_anytype(p)) - { fprintf(fout,"\n\tsoap_markelement(soap, %s->%s, %s->%s);", self, ident(p->next->sym->name), self, ident(p->sym->name)); - p = p->next; - } - else if (is_choice(p)) - { fprintf(fout,"\n\tsoap_serialize_%s(soap, %s->%s::%s, &%s->%s::%s);", c_ident(p->next->info.typ), self, ident(table->sym->name), ident(p->sym->name), self, ident(table->sym->name), ident(p->next->sym->name)); - p = p->next; - } - else if(p->info.typ->type==Tarray) - { - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\tsoap_embedded(soap, %s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\tsoap_serialize_%s(soap, %s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); - } - else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - { - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\t%s->%s::%s.soap_serialize(soap);", self, ident(table->sym->name), ident(p->sym->name)); - } - else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) - { - if (!is_template(p->info.typ)) - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); - if (!is_primitive(p->info.typ)) - fprintf(fout,"\n\tsoap_serialize_%s(soap, &%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); - } - } - t = table->prev; - if (t) - fprintf(fout,"\n\t%s->%s::soap_serialize(soap);", self, ident(t->sym->name)); - fprintf(fout,"\n#endif\n}"); - break; - } - case Tstruct: - - if (is_external(typ) && !is_volatile(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); - if (!typ->ref) - return; - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n#ifndef WITH_NOIDREF",c_ident(typ),c_type_id(typ, "*a")); - /* DYNAMIC ARRAY */ - - fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); - table=(Table*)typ->ref; - for (t = table; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (p->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); - else if (is_transient(p->info.typ)) - fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.sto & Sattribute) - ; - else if (is_repetition(p)) - { - if (!is_XML(p->next->info.typ)) { - fprintf(fout,"\n\tif (a->%s)", ident(p->next->sym->name)); - fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s; i++)\n\t\t{", ident(p->sym->name)); - if (!is_invisible(p->next->sym->name)) - if (has_ptr((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\tsoap_embedded(soap, a->%s + i, %s);", ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->next->sym->name)); - else if (!is_primitive((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); - fprintf(fout,"\n\t\t}\n\t}"); - } - p = p->next; - } - else if (is_anytype(p)) - { fprintf(fout,"\n\tsoap_markelement(soap, a->%s, a->%s);", ident(p->next->sym->name), ident(p->sym->name)); - p = p->next; - } - else if (is_choice(p)) - { fprintf(fout,"\n\tsoap_serialize_%s(soap, a->%s, &a->%s);", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); - p = p->next; - } - else if(p->info.typ->type==Tarray) - { - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); - } - else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - { - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\ta->%s.soap_serialize(soap);", ident(p->sym->name)); - } - else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) - { - if (!is_template(p->info.typ)) - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); - if (!is_primitive(p->info.typ)) - fprintf(fout,"\n\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); - } - } - } - fprintf(fout,"\n#endif\n}"); - break; - - case Tunion: - if (is_external(typ) && !is_volatile(typ)) - { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); - return; - } - table=(Table*)typ->ref; - fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); - fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, int choice, const %s)\n{\n#ifndef WITH_NOIDREF", c_ident(typ), c_type_id(typ, "*a")); - fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); - fprintf(fout, "\n\tswitch (choice)\n\t{"); - for (t = table; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (p->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); - else if (is_transient(p->info.typ)) - fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.sto & Sattribute) - ; - else if (is_repetition(p)) - ; - else if (is_anytype(p)) - ; - else if (p->info.typ->type==Tarray) - { - fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\t\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); - fprintf(fout, "\n\t\tbreak;"); - } - else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - { - fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\t\ta->%s.soap_serialize(soap);", ident(p->sym->name)); - fprintf(fout, "\n\t\tbreak;"); - } - else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) - { - fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); - if (!is_primitive(p->info.typ)) - fprintf(fout,"\n\t\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); - fprintf(fout, "\n\t\tbreak;"); - } - } - } - fprintf(fout,"\n\tdefault:\n\t\tbreak;\n\t}\n#endif\n}"); - break; - case Tpointer: - if (((Tnode*)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) - { if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{\n#ifndef WITH_NOIDREF", c_ident(typ),c_type_id(typ, "const*a")); - p = is_dynamic_array((Tnode*)typ->ref); - if (p) - { d = get_Darraydims((Tnode*)typ->ref); - if (d) - fprintf(fout,"\n\tif (*a)"); - else - fprintf(fout,"\n\tif (*a)"); - } - else - fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); - fprintf(fout,"\n\t\t(*a)->soap_serialize(soap);\n#endif\n}"); - break; - } - else - { - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{\n#ifndef WITH_NOIDREF", c_ident(typ),c_type_id(typ, "const*a")); - if (is_string(typ) || is_wstring(typ)) - fprintf(fout,"\n\tsoap_reference(soap, *a, %s);", soap_type(typ)); - else if (is_primitive((Tnode*)typ->ref)) - fprintf(fout,"\n\tsoap_reference(soap, *a, %s);", soap_type((Tnode*)typ->ref)); - else if ((p = is_dynamic_array((Tnode*)typ->ref)) != NULL) - { d = get_Darraydims((Tnode*)typ->ref); - if (d) - fprintf(fout,"\n\tif (*a)"); - else - fprintf(fout,"\n\tif (*a)"); - fprintf(fout,"\n\t\tsoap_serialize_%s(soap, *a);", c_ident((Tnode*)typ->ref)); - } - else - { fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); - fprintf(fout,"\n\t\tsoap_serialize_%s(soap, *a);", c_ident((Tnode*)typ->ref)); - } - fprintf(fout,"\n#endif\n}"); - break; - } - case Tarray: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{\n#ifndef WITH_NOIDREF", c_ident(typ),c_type_id(typ, "const a")); - if (is_primitive((Tnode*)typ->ref)) - fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); - else - { fprintf(fout,"\n\tint i;"); - fprintf(fout,"\n\tfor(i = 0; i < %d; i++)", get_dimension(typ)); - - temp=(Tnode*)typ->ref;; - cardinality = 1; - while(temp->type==Tarray) - { - temp=(Tnode*)temp->ref; - cardinality++; - } - fprintf(fout,"\n\t{"); - if (has_ptr((Tnode*)typ->ref)) - { - fprintf(fout,"\tsoap_embedded(soap, a"); - if(cardinality > 1) - fprintf(fout,"[i]"); - else - fprintf(fout,"+i"); - fprintf(fout,", %s);", soap_type((Tnode*)typ->ref)); - } - if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) - { fprintf(fout,"\n\ta[i].soap_serialize(soap)"); - } - else if (!is_primitive((Tnode*)typ->ref)) - { fprintf(fout,"\n\tsoap_serialize_%s(soap, a",c_ident((Tnode*)typ->ref)); - if(cardinality > 1){ - fprintf(fout,"[i])"); - }else { - fprintf(fout,"+i)"); - } - } - fprintf(fout,";\n\t}"); - } - fprintf(fout,"\n#endif\n}"); - break; - case Ttemplate: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*")); - temp = (Tnode*)typ->ref; - if (!temp) - return; - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n#ifndef WITH_NOIDREF",c_ident(typ),c_type_id(typ, "*a")); - if (!is_primitive(temp) && !is_XML(temp) && temp->type != Tfun && !is_void(temp)) - { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); - if (temp->type==Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) - fprintf(fout,"\n\t\t(*i).soap_serialize(soap);"); - else - fprintf(fout,"\n\t\tsoap_serialize_%s(soap, &(*i));", c_ident(temp)); - } - fprintf(fout, "\n#endif\n}"); - default: break; - } -} - -void -soap_default(Tnode* typ) -{ int i, d; - Table *table,*t; - Entry *p; - Tnode *temp; - char *s; - int cardinality; - - if (typ->type == Tpointer && !is_string(typ)) - return; - - if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_external(typ) || is_imported(typ)) - { if (is_typedef(typ) && !is_external(typ)) - { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) - fprintf(fhead, "\n\n#define soap_default_%s(soap, a) (a)->%s::soap_default(soap)\n", c_ident(typ), t_ident(typ)); - else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) - fprintf(fhead, "\n\n#define soap_default_%s(soap, a) soap_default_std__string(soap, a)\n", c_ident(typ)); - else - fprintf(fhead, "\n\n#define soap_default_%s(soap, a) soap_default_%s(soap, a)\n", c_ident(typ), t_ident(typ)); - return; - } - } - p = is_dynamic_array(typ); - if (p) - { if (typ->type == Tclass && !is_volatile(typ)) - { if (is_external(typ)) - return; - fprintf(fout,"\n\nvoid %s::soap_default(struct soap *soap)\n{", c_ident(typ)); - if ((s = has_soapref(typ))) - fprintf(fout,"\n\tthis->%s = soap;", s); - else - fprintf(fout,"\n\t(void)soap; /* appease -Wall -Werror */"); - d = get_Darraydims(typ); - if (d) - { fprintf(fout,"\n\tthis->%s = NULL;", ident(p->sym->name)); - for (i = 0; i < d; i++) - { fprintf(fout,"\n\tthis->__size[%d] = 0;", i); - if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) - fprintf(fout, "\n\tthis->__offset[%d] = 0;", i); - } - } - else - { fprintf(fout,"\n\tthis->__size = 0;\n\tthis->%s = NULL;", ident(p->sym->name)); - if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) - fprintf(fout, "\n\tthis->__offset = 0;"); - } - if (is_attachment(typ)) - fprintf(fout,"\n\tthis->id = NULL;\n\tthis->type = NULL;\n\tthis->options = NULL;"); - fprintf(fout,"\n}"); - } - else - { if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{\t(void)soap;", c_ident(typ),c_type_id(typ, "*a")); - if ((s = has_soapref(typ))) - fprintf(fout,"\n\ta->%s = soap;", s); - else - fprintf(fout,"\n\t(void)soap; /* appease -Wall -Werror */"); - d = get_Darraydims(typ); - if (d) - { fprintf(fout,"\n\ta->%s = NULL;", ident(p->sym->name)); - for (i = 0; i < d; i++) - { fprintf(fout,"\n\ta->__size[%d] = 0;", i); - if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) - fprintf(fout, "\n\ta->__offset[%d] = 0;", i); - } - } - else - { fprintf(fout,"\n\ta->__size = 0;\n\ta->%s = NULL;", ident(p->sym->name)); - if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) - fprintf(fout, "\n\ta->__offset = 0;"); - } - if (is_attachment(typ)) - fprintf(fout,"\n\ta->id = NULL;\n\ta->type = NULL;\n\ta->options = NULL;"); - fprintf(fout,"\n}"); - } - fflush(fout); - return; - } - if (is_primitive(typ) || is_string(typ)) - { if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n#ifdef SOAP_DEFAULT_%s\n\t*a = SOAP_DEFAULT_%s;\n#else\n\t*a = (%s)0;\n#endif\n}",c_ident(typ),c_type_id(typ, "*a"), c_ident(typ), c_ident(typ), c_type(typ)); - return; - } - if (is_fixedstring(typ)) - { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, char[]);",c_ident(typ)); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, char a[])\n{\n\t(void)soap; /* appease -Wall -Werror */\n\ta[0] = '\\0';\n}",c_ident(typ)); - return; - } - if (is_stdstring(typ) || is_stdwstring(typ)) - { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n\tp->erase();\n}",c_ident(typ),c_type_id(typ, "*p")); - return; - } - switch(typ->type) - { - case Tclass: - /* CLASS */ - if (!is_volatile(typ)) - { - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); - return; - } - table=(Table*)typ->ref; - fprintf(fout,"\n\nvoid %s::soap_default(struct soap *soap)\n{", ident(typ->id->name)); - if ((s = has_soapref(typ))) - fprintf(fout,"\n\tthis->%s = soap;", s); - else - fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); - - fflush(fout); - if (table) - { - t = table->prev; - if (t) - fprintf(fout,"\n\tthis->%s::soap_default(soap);", ident(t->sym->name)); - for (p = table->list; p; p = p->next) - { if (p->info.typ->type == Tfun) - continue; - if (p->info.sto & Sconst) - fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); - else if (is_choice(p)) - { fprintf(fout, "\n\tthis->%s::%s = 0;", ident(table->sym->name), ident(p->sym->name)); - p = p->next; - } - else if (is_repetition(p) || is_anytype(p)) - { fprintf(fout, "\n\tthis->%s::%s = 0;\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name), ident(table->sym->name), ident(p->next->sym->name)); - p = p->next; - } - else - { - if (is_fixedstring(p->info.typ)) - { if (p->info.hasval) - fprintf(fout,"\n\tstrcpy(this->%s::%s, \"%s\");", ident(table->sym->name), ident(p->sym->name), cstring(p->info.val.s)); - else - fprintf(fout,"\n\tthis->%s::%s[0] = '\\0';", ident(table->sym->name), ident(p->sym->name)); - } - else if (p->info.typ->type == Tarray){ - fprintf(fout,"\n\tsoap_default_%s(soap, this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); - } - else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ) && !is_transient(p->info.typ)) - fprintf(fout,"\n\tthis->%s::%s.%s::soap_default(soap);", ident(table->sym->name), ident(p->sym->name), c_ident(p->info.typ)); - else if (p->info.hasval) - { if (p->info.typ->type == Tpointer && is_stdstring((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\tstatic std::string soap_tmp_%s(\"%s\");\n\tthis->%s::%s = &soap_tmp_%s;", ident(p->sym->name), p->info.val.s, ident(table->sym->name), ident(p->sym->name), ident(p->sym->name)); - else - fprintf(fout,"\n\tthis->%s::%s%s;", ident(table->sym->name), ident(p->sym->name), c_init(p)); - } - else if (is_transient(p->info.typ) || is_void(p->info.typ)) - fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ))) - fprintf(fout,"\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name)); - else if (p->info.sto & (Sprivate | Sprotected)) - { if (p->info.typ->type == Tpointer) - fprintf(fout,"\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name)); - else if (p->info.typ->type >= Tchar && p->info.typ->type < Tenum) - fprintf(fout,"\n\tthis->%s::%s = 0;", ident(table->sym->name), ident(p->sym->name)); - else if (p->info.typ->type == Tenum) - fprintf(fout,"\n\tthis->%s::%s = (%s)0;", ident(table->sym->name), ident(p->sym->name), c_type(p->info.typ)); - else - fprintf(fout, "\n\t/* private/protected %s skipped */", ident(p->sym->name)); - } - else - fprintf(fout,"\n\tsoap_default_%s(soap, &this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); - } - } - } - fprintf(fout,"\n}"); - fflush(fout); - break; - } - - case Tstruct: - table=(Table*)typ->ref; - - if (is_external(typ) && !is_volatile(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ),c_type_id(typ, "*a")); - fflush(fout); - if ((s = has_soapref(typ))) - fprintf(fout,"\n\ta->%s = soap;", s); - else - fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); - if (table) - { - for (t = table; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (p->info.typ->type == Tfun) - continue; - if (p->info.sto & Sconst) - fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); - else if (p->info.sto & (Sprivate | Sprotected)) - fprintf(fout, "\n\t/* private/protected %s skipped */", ident(p->sym->name)); - else if (is_choice(p)) - { fprintf(fout, "\n\ta->%s = 0;", ident(p->sym->name)); - p = p->next; - } - else if (is_repetition(p) || is_anytype(p)) - { fprintf(fout, "\n\ta->%s = 0;\n\ta->%s = NULL;", ident(p->sym->name), ident(p->next->sym->name)); - p = p->next; - } - else - { - if (is_fixedstring(p->info.typ)) - { if (p->info.hasval) - fprintf(fout,"\n\tstrcpy(a->%s, \"%s\");", ident(p->sym->name), cstring(p->info.val.s)); - else - fprintf(fout,"\n\ta->%s[0] = '\\0';", ident(p->sym->name)); - } - else if (p->info.typ->type==Tarray) - fprintf(fout,"\n\tsoap_default_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); - else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ) && !is_transient(p->info.typ)) - fprintf(fout,"\n\ta->%s.%s::soap_default(soap);", ident(p->sym->name), c_ident(p->info.typ)); - else if (p->info.hasval) - { if (p->info.typ->type == Tpointer && is_stdstring((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\tstatic std::string soap_tmp_%s(\"%s\");\n\ta->%s = &soap_tmp_%s;", ident(p->sym->name), p->info.val.s, ident(p->sym->name), ident(p->sym->name)); - else - fprintf(fout,"\n\ta->%s%s;", ident(p->sym->name), c_init(p)); - } - else if (is_transient(p->info.typ) || is_void(p->info.typ)) - fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ))) - fprintf(fout,"\n\ta->%s = NULL;", ident(p->sym->name)); - else - fprintf(fout,"\n\tsoap_default_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); - } - } - } - } - fprintf(fout,"\n}"); - fflush(fout); - break; - case Tarray: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type(typ)); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type(typ)); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ),c_type_id(typ, "a")); - fprintf(fout,"\n\tint i;"); - fprintf(fout,"\n\t(void)soap; /* appease -Wall -Werror */"); - fprintf(fout,"\n\tfor (i = 0; i < %d; i++)",get_dimension(typ)); - temp = (Tnode*)typ->ref; - cardinality = 1; - while(temp->type==Tarray) - { - temp=(Tnode*)temp->ref; - cardinality++; - } - if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref)) - { - if (cardinality>1) - fprintf(fout,"a[i].%s::soap_default(soap)", t_ident((Tnode*)typ->ref)); - else - fprintf(fout,"(a+i)->soap_default(soap)"); - } - else if (((Tnode*)typ->ref)->type == Tpointer) - fprintf(fout,"\n\ta[i] = NULL"); - else - { - fprintf(fout,"\n\tsoap_default_%s(soap, a",c_ident((Tnode*)typ->ref)); - if (cardinality>1) - fprintf(fout,"[i])"); - else - fprintf(fout,"+i)"); - } - fprintf(fout,";\n}"); - break; - - case Ttemplate: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{",c_ident(typ),c_type_id(typ, "*p")); - fprintf(fout,"\n\tp->clear();"); - fprintf(fout,"\n}"); - fflush(fout); - break; - default :break; - } -} - -void -soap_traverse(Tnode* typ) -{ int d; - Table *table,*t; - Entry *p; - Tnode* temp; - int cardinality; - if (is_primitive_or_string(typ) || is_fixedstring(typ)) - { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{\t(void)soap; (void)q; /* appease -Wall -Werror */",c_ident(typ),c_type_id(typ, "*a")); - fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n}", soap_type(typ), c_type(typ)); - return; - } - if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_external(typ) || is_imported(typ)) - if (is_typedef(typ) && !is_external(typ)) - { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) - fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) (a)->soap_traverse(soap, s, p, q)\n",c_ident(typ)); - else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) - fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_std__string(soap, a, s, p, q)\n", c_ident(typ)); - else - fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_%s(soap, a, s, p, q)\n", c_ident(typ), t_ident(typ)); - return; - } - if (is_XML(typ)) - { fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_%s(soap, a, s, p, q)\n", c_ident(typ), t_ident(typ)); - return; - } - if ((p = is_dynamic_array(typ))) - { if (typ->type == Tclass && !is_volatile(typ)) - { if (is_external(typ)) - return; - fprintf(fout,"\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{",c_ident(typ)); - if (is_binary(typ)) - { fprintf(fout,"\n\tif (this->%s && !soap_array_reference(soap, this, (struct soap_array*)&this->%s, 1, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); - if (is_attachment(typ)) - { fprintf(fout,"\n\t\tif (this->id || this->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n}"); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); - fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); - fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->options, 0, \"options\", NULL);"); - fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->options, 0, \"options\", NULL);"); - } - fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); - fprintf(fout,"\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); - fflush(fout); - return; - } - else - { - d = get_Darraydims(typ); - if (d) - { fprintf(fout,"\n\tif (this->%s && !soap_array_reference(soap, this, (struct soap_array*)&this->%s, %d, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), d, soap_type(typ)); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n\t\tfor (int i = 0; i < soap_size(this->__size, %d); i++)", d); - } - else - { fprintf(fout,"\n\tif (this->%s && !soap_array_reference(soap, this, (struct soap_array*)&this->%s, 1, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n\t\tfor (int i = 0; i < this->__size; i++)"); - } - fprintf(fout,"\n\t\t{"); - if (has_ptr((Tnode*)p->info.typ->ref)) - fprintf(fout,"\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); - if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external(p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\t\tthis->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); - else - fprintf(fout,"\n\t\t\tsoap_traverse_%s(soap, this->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), ident(p->sym->name)); - fprintf(fout,"\n\t\t}\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n\t}\n}"); - return; - } - } - else - { if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{",c_ident(typ),c_type_id(typ, "*a")); - if (is_binary(typ)) - { fprintf(fout,"\n\tif (a->%s && !soap_array_reference(soap, a, (struct soap_array*)&a->%s, 1, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); - if (is_attachment(typ)) - { fprintf(fout,"\n\t\tif (a->id || a->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n}"); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); - fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); - fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->options, 0, \"options\", NULL);"); - fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->options, 0, \"options\", NULL);"); - } - fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); - fprintf(fout,"\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); - fflush(fout); - return; - } - else - { - fprintf(fout,"\n\tint i;"); - d = get_Darraydims(typ); - if (d) - { fprintf(fout,"\n\tif (a->%s && !soap_array_reference(soap, a, (struct soap_array*)&a->%s, %d, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), d, soap_type(typ)); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n\t\tfor (i = 0; i < soap_size(a->__size, %d); i++)", d); - } - else - { fprintf(fout,"\n\tif (a->%s && !soap_array_reference(soap, a, (struct soap_array*)&a->%s, 1, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n\t\tfor (i = 0; i < a->__size; i++)"); - } - fprintf(fout,"\n\t\t{"); - if (has_ptr((Tnode*)p->info.typ->ref)) - fprintf(fout,"\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); - if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); - else - fprintf(fout,"\n\t\t\tsoap_traverse_%s(soap, a->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), p->sym->name); - fprintf(fout,"\n\t\t}\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n\t}\n}"); - fflush(fout); - return; - } - } - } - switch(typ->type) - { - case Tclass: - if (!is_volatile(typ)) - { - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); - return; - } - table=(Table*)typ->ref; - fprintf(fout,"\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{", ident(typ->id->name)); - fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); - fprintf(fout,"\n\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - for (t = table; t; t = t->prev) - { - for (p = t->list; p; p = p->next) { - if (p->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); - else if (is_transient(p->info.typ)) - fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.sto & Sattribute) - ; - else if (is_repetition(p)) - { - fprintf(fout,"\n\tif (this->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); - fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < this->%s::%s; i++)\n\t\t{", ident(t->sym->name), ident(p->sym->name)); - if (!is_invisible(p->next->sym->name)) - if (has_ptr((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\tsoap_embedded(soap, this->%s::%s + i, %s);", ident(t->sym->name), ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\tthis->%s::%s[i].soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); - else - fprintf(fout,"\n\t\t\tsoap_traverse_%s(soap, this->%s::%s + i, \"%s\", p, q);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); - fprintf(fout,"\n\t\t}\n\t}"); - p = p->next; - } - else if (is_anytype(p)) - { p = p->next; - } - else if (is_choice(p)) - { fprintf(fout,"\n\tsoap_traverse_%s(soap, this->%s::%s, &this->%s::%s, \"%s\", p, q);", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); - p = p->next; - } - else if(p->info.typ->type==Tarray) - { - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\tsoap_embedded(soap, this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\tsoap_traverse_%s(soap, this->%s::%s, \"%s\", p, q);", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), p->sym->name); - } - else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - { - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\tthis->%s::%s.soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->sym->name), p->sym->name); - } - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) - { - if (!is_template(p->info.typ)) - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\tsoap_traverse_%s(soap, &this->%s::%s, \"%s\", p, q);", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), p->sym->name); - } - } - } - fprintf(fout,"\n\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n}"); - break; - } - case Tstruct: - if (is_external(typ) && !is_volatile(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); - if (!typ->ref) - return; - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{",c_ident(typ),c_type_id(typ, "*a")); - fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); - fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - table=(Table*)typ->ref; - for (t = table; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (p->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); - else if (is_transient(p->info.typ)) - fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.sto & Sattribute) - ; - else if (is_repetition(p)) - { - fprintf(fout,"\n\tif (a->%s)", ident(p->next->sym->name)); - fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s; i++)\n\t\t{", ident(p->sym->name)); - if (!is_invisible(p->next->sym->name)) - if (has_ptr((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\tsoap_embedded(soap, a->%s + i, %s);", ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->next->sym->name), p->next->sym->name); - else - fprintf(fout,"\n\t\t\tsoap_traverse_%s(soap, a->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), p->next->sym->name); - fprintf(fout,"\n\t\t}\n\t}"); - p = p->next; - } - else if (is_anytype(p)) - { p = p->next; - } - else if (is_choice(p)) - { fprintf(fout,"\n\tsoap_traverse_%s(soap, a->%s, &a->%s, \"%s\", p, q);", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name), p->next->sym->name); - p = p->next; - } - else if(p->info.typ->type==Tarray) - { - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); - } - else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - { - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); - } - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) - { - if (!is_template(p->info.typ)) - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); - } - } - } - fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n}"); - break; - case Tunion: - if (is_external(typ) && !is_volatile(typ)) - { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, int, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); - return; - } - table=(Table*)typ->ref; - fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, int, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); - fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, int choice, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); - fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); - fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout, "\n\tswitch (choice)\n\t{"); - for (t = table; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (p->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); - else if (is_transient(p->info.typ)) - fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.sto & Sattribute) - ; - else if (is_repetition(p)) - ; - else if (is_anytype(p)) - ; - else if (p->info.typ->type==Tarray) - { - fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\t\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); - fprintf(fout, "\n\t\tbreak;"); - } - else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - { - fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\t\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); - fprintf(fout, "\n\t\tbreak;"); - } - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) - { - fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); - if (has_ptr(p->info.typ)) - fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); - fprintf(fout,"\n\t\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); - fprintf(fout, "\n\t\tbreak;"); - } - } - } - fprintf(fout,"\n\tdefault:\n\t\tbreak;\n\t}"); - fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n}"); - break; - case Tpointer: - if (((Tnode*)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) - { if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ),c_type_id(typ, "*a")); - p = is_dynamic_array((Tnode*)typ->ref); - if (p) - { d = get_Darraydims((Tnode*)typ->ref); - if (d) - fprintf(fout,"\n\tif (*a)"); - else - fprintf(fout,"\n\tif (*a)"); - } - else - fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); - fprintf(fout,"\n\t\t(*a)->soap_traverse(soap, s, p, q);\n}"); - break; - } - else - { - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ),c_type_id(typ, "*a")); - if (is_primitive((Tnode*)typ->ref)) - { fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))\n\t{", soap_type(typ)); - fprintf(fout,"\n\t\tif (p) p(soap, (void*)*a, %s, s, \"%s\");", soap_type(typ->ref), c_type(typ->ref)); - fprintf(fout,"\n\t\tif (q) q(soap, (void*)*a, %s, s, \"%s\");\n\t}\n}", soap_type(typ->ref), c_type(typ->ref)); - } - else if ((p = is_dynamic_array((Tnode*)typ->ref)) != NULL) - { d = get_Darraydims((Tnode*)typ->ref); - if (d) - fprintf(fout,"\n\tif (*a)"); - else - fprintf(fout,"\n\tif (*a)"); - fprintf(fout,"\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); - } - else - { fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); - fprintf(fout,"\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); - } - break; - } - case Tarray: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ),c_type(typ)); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ),c_type(typ)); - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)", c_ident(typ),c_type_id(typ, "a")); - if (is_primitive((Tnode*)typ->ref)) - { fprintf(fout, "\n{"); - fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); - fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - } - else - { fprintf(fout,"\n{\tint i;"); - fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n\tfor(i = 0; i < %d; i++)", get_dimension(typ)); - - temp=(Tnode*)typ->ref;; - cardinality = 1; - while(temp->type==Tarray) - { - temp=(Tnode*)temp->ref; - cardinality++; - } - fprintf(fout,"\n\t{"); - if (has_ptr((Tnode*)typ->ref)) - { - fprintf(fout,"\tsoap_embedded(soap, a"); - if(cardinality > 1) - fprintf(fout,"[i]"); - else - fprintf(fout,"+i"); - fprintf(fout,", %s);", soap_type((Tnode*)typ->ref)); - } - if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) - { fprintf(fout,"\n\ta[i].soap_traverse(soap, s, p, q)"); - } - else if (!is_primitive((Tnode*)typ->ref)) - { fprintf(fout,"\n\tsoap_traverse_%s(soap, a",c_ident((Tnode*)typ->ref)); - if(cardinality > 1) - fprintf(fout,"[i], s, p, q)"); - else - fprintf(fout,"+i, s, p, q)"); - } - fprintf(fout,";\n\t}"); - } - fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout,"\n}"); - break; - case Ttemplate: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);",c_ident(typ),c_type_id(typ, "*")); - temp = (Tnode*)typ->ref; - if (!temp) - return; - fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{",c_ident(typ),c_type_id(typ, "*a")); - if (!is_primitive(temp) && temp->type != Tfun && !is_void(temp)) - { fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - fprintf(fout, "\n\tfor (%s::iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); - if (temp->type==Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) - fprintf(fout,"\n\t\t(*i).soap_traverse(soap, s, p, q);"); - else - fprintf(fout,"\n\t\tsoap_traverse_%s(soap, &(*i), s, p, q);", c_ident(temp)); - fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); - } - fprintf(fout, "\n}"); - default: break; - } -} - -void -soap_put(Tnode *typ) -{ int d; - Entry *p; - char *ci = c_ident(typ); - char *ct = c_type(typ); - char *ctp = c_type_id(typ, "*"); - char *ctpa = c_type_id(typ, "*a"); - char *ctc = c_type_id(typ, "const"); - char *ctca = c_type_id(typ, "const a"); - char *ctcp = c_type_id(typ, "const*"); - char *ctcpa = c_type_id(typ, "const*a"); - - if (typ->type == Ttemplate || typ->type == Tunion) - return; - - if (is_typedef(typ) && is_element(typ)) - { fprintf(fhead, "\n\n#define soap_put_%s soap_put_%s\n", c_ident(typ), t_ident(typ)); - return; - } - - if (typ->type == Tarray) - { fprintf(fhead,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci,ctc); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci,ctca); - } - else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) - fprintf(fout,"\n\nint %s::soap_put(struct soap *soap, const char *tag, const char *type) const\n{", ct); - else if (typ->type == Tpointer) - { fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci,ctcp); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci,ctcpa); - } - else - { fprintf(fhead,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, const %s, const char*, const char*);", ci,ctp); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, const %s, const char *tag, const char *type)\n{", ci,ctpa); - } - fflush(fout); - fprintf(fout,"\n\tregister int id = "); - if (is_invisible(typ->id->name)) - fprintf(fout,"0;"); - else if ((p = is_dynamic_array(typ)) != NULL) - { d = get_Darraydims(typ); - if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) - { if (d) - fprintf(fout,"soap_embed(soap, (void*)this, (struct soap_array*)&this->%s, %d, tag, %s);", ident(p->sym->name), d, soap_type(typ)); - else - fprintf(fout,"soap_embed(soap, (void*)this, (struct soap_array*)&this->%s, 1, tag, %s);", ident(p->sym->name), soap_type(typ)); - } - else if (d) - fprintf(fout,"soap_embed(soap, (void*)a, (struct soap_array*)&a->%s, %d, tag, %s);", ident(p->sym->name), d, soap_type(typ)); - else - fprintf(fout,"soap_embed(soap, (void*)a, (struct soap_array*)&a->%s, 1, tag, %s);", ident(p->sym->name), soap_type(typ)); - } - else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) - fprintf(fout,"soap_embed(soap, (void*)this, NULL, 0, tag, %s);", soap_type(typ)); - else - fprintf(fout,"soap_embed(soap, (void*)a, NULL, 0, tag, %s);", soap_type(typ)); - if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) - fprintf(fout,"\n\tif (this->soap_out(soap, tag?tag:\"%s\", id, type))\n\t\treturn soap->error;", xml_tag(typ)); - else - fprintf(fout,"\n\tif (soap_out_%s(soap, tag?tag:\"%s\", id, a, type))\n\t\treturn soap->error;", ci, xml_tag(typ)); - if (!is_invisible(typ->id->name)) - fprintf(fout,"\n\treturn soap_putindependent(soap);\n}"); - else - fprintf(fout,"\n\treturn SOAP_OK;\n}"); -#if 0 - /* some compilers cannot handle this inlined function */ - if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ)) - fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s) { if (p->soap_put(soap, \"%s\", NULL) || soap_end_send(soap)) return soap->error; return SOAP_OK; }\n", c_ident(typ), c_type_id(typ, "*p"), xml_tag(typ)); - else if (typ->type != Treference) - fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s) { if (soap_begin_send(soap) || soap_put_%s(soap, p, \"%s\", NULL) || soap_end_send(soap)) return soap->error; return SOAP_OK; }\n", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ), xml_tag(typ)); -#endif - if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ)) - fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || ((data)->soap_serialize(soap),0) || (data)->soap_put(soap, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), xml_tag(typ)); - else if (is_primitive(typ)) - { if ((!is_external(typ) || Qflag) && namespaceid) - fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (%s::soap_serialize_%s(soap, data),0) || %s::soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ)); - else - fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_%s(soap, data),0) || soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ)); - } - else if (typ->type != Treference) - { if (((!is_external(typ) && !is_volatile(typ)) || Qflag) && namespaceid) - fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (%s::soap_serialize_%s(soap, data),0) || %s::soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ)); - else - fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_%s(soap, data),0) || soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ)); - } - fflush(fout); -} - -Entry * -is_dynamic_array(Tnode *typ) -{ Entry *p; - Table *t; - if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) - { for (t = (Table*)typ->ref; t; t = t->prev) - { p = t->list; - while (p && p->info.typ->type == Tfun) - p = p->next; - if (p && p->info.typ->type == Tpointer && !strncmp(ident(p->sym->name), "__ptr", 5)) - if (p->next && (p->next->info.typ->type == Tint || p->next->info.typ->type == Tulong || (p->next->info.typ->type == Tarray && (((Tnode*)p->next->info.typ->ref)->type == Tint || ((Tnode*)p->next->info.typ->ref)->type == Tuint))) && !strcmp(ident(p->next->sym->name), "__size")) - return p; - } - } - return 0; -} - -Entry * -is_discriminant(Tnode *typ) -{ Entry *p; - Table *t; - if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) - { t = (Table*)typ->ref; - /* only if this struct/class has a union and is not derived */ - if (t && !t->prev) - { p = t->list; - if (p && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(ident(p->sym->name), "__union", 7))) - if (p->next && p->next->info.typ->type == Tunion) - { Entry *q; - for (q = p->next->next; q; q = q->next) - { if (q->info.typ->type != Tfun - && !is_void(q->info.typ) - && !is_transient(q->info.typ)) - return NULL; - } - return p; - } - } - } - return NULL; -} - -int -get_Darraydims(Tnode *typ) -{ Entry *p; - Table *t; - if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) - { for (t = (Table*)typ->ref; t; t = t->prev) - { p = t->list; - while (p && p->info.typ->type == Tfun) - p = p->next; - if (p && p->info.typ->type == Tpointer && !strncmp(ident(p->sym->name), "__ptr", 5)) - if (p->next && p->next->info.typ->type == Tarray && (((Tnode*)p->next->info.typ->ref)->type == Tint || ((Tnode*)p->next->info.typ->ref)->type == Tuint) && !strcmp(ident(p->next->sym->name), "__size")) - return get_dimension(p->next->info.typ); - } - } - return 0; -} - -int -has_offset(Tnode *typ) -{ Entry *p; - Table *t; - if (typ->type == Tstruct || typ->type == Tclass) - { for (t = (Table*)typ->ref; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if ((p->info.typ->type == Tint || (p->info.typ->type == Tarray && ((Tnode*)p->info.typ->ref)->type == Tint)) && !strcmp(ident(p->sym->name), "__offset")) - return 1; - } - } - } - return 0; -} - -int -is_boolean(Tnode *typ) -{ if (typ->type == Tenum) - { if ((Table*)typ->ref == booltable) - return 1; - else - { size_t n = strlen(ident(typ->id->name)); - return n >= 7 && is_eq(ident(typ->id->name) + n - 7, "boolean"); - } - } - return 0; -} - -int -is_hexBinary(Tnode *typ) -{ Entry *p; - Table *t; - size_t n = strlen(ident(typ->id->name)); - if ((typ->type == Tstruct || typ->type == Tclass) && n >= 9 && is_eq(ident(typ->id->name) + n - 9, "hexBinary")) - { for (t = (Table*)typ->ref; t; t = t->prev) - { p = t->list; - while (p && p->info.typ->type == Tfun) - p = p->next; - if (p && p->info.typ->type == Tpointer && ((Tnode*)p->info.typ->ref)->type == Tuchar && !strcmp(ident(p->sym->name), "__ptr")) - { p = p->next; - return p && (p->info.typ->type == Tint || p->info.typ->type == Tuint) && !strcmp(ident(p->sym->name), "__size"); - } - } - } - return 0; -} - -int -is_binary(Tnode *typ) -{ Entry *p; - Table *t; - if (!has_ns(typ) && !is_element(typ)) - return 0; - if (typ->type == Tstruct || typ->type == Tclass) - { for (t = (Table*)typ->ref; t; t = t->prev) - { p = t->list; - while (p && p->info.typ->type == Tfun) - p = p->next; - if (p && p->info.typ->type == Tpointer && ((Tnode*)p->info.typ->ref)->type == Tuchar && !strcmp(ident(p->sym->name), "__ptr")) - { p = p->next; - return p && (p->info.typ->type == Tint || p->info.typ->type == Tuint) && !strcmp(ident(p->sym->name), "__size"); - } - } - } - return 0; -} - -int -is_attachment(Tnode *typ) -{ Entry *p; - Table *t; - if (!is_binary(typ) || is_transient(typ)) - return 0; - for (t = (Table*)typ->ref; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (is_string(p->info.typ) && !strcmp(p->sym->name, "id")) - { p = p->next; - if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "type")) - break; - p = p->next; - if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "options")) - break; - return 1; - } - } - } - return 0; -} - -int -has_attachment(Tnode *typ) -{ if (is_attachment(typ)) - return 1; - if (typ->type == Tstruct || typ->type == Tclass) - { Entry *p; - Table *t; - for (t = (Table*)typ->ref; t; t = t->prev) - { for (p = t->list; p; p = p->next) - if (has_attachment(p->info.typ)) - return 1; - } - } - return 0; -} - -int -is_mutable(Tnode *typ) -{ return is_header_or_fault(typ); -} - -int -is_header_or_fault(Tnode *typ) -{ if (typ->type == Tpointer || typ->type == Treference) - return is_header_or_fault((Tnode*)typ->ref); - return (typ->type == Tstruct || typ->type == Tclass) && (!strcmp(ident(typ->id->name), "SOAP_ENV__Header") || !strcmp(ident(typ->id->name), "SOAP_ENV__Fault") || !strcmp(ident(typ->id->name), "SOAP_ENV__Code") || !strcmp(ident(typ->id->name), "SOAP_ENV__Detail") || !strcmp(ident(typ->id->name), "SOAP_ENV__Reason")); -} - -int -is_body(Tnode *typ) -{ if (typ->type == Tpointer || typ->type == Treference) - return is_body((Tnode*)typ->ref); - return (typ->type == Tstruct || typ->type == Tclass) && !strcmp(ident(typ->id->name), "SOAP_ENV__Body"); -} - -long -minlen(Tnode *typ) -{ if (typ->minLength < 0 || (typ->maxLength >> 31) != 0) - return 0; - return (long)typ->minLength; -} - -long -maxlen(Tnode *typ) -{ if (typ->maxLength < 0 || (typ->maxLength >> 31) != 0) - return -1; - return (long)typ->maxLength; -} - -int -is_soap12(const char *enc) -{ return !strcmp(envURI, "http://www.w3.org/2003/05/soap-envelope") || (enc && !strcmp(enc, "http://www.w3.org/2003/05/soap-encoding")); -} - -int -is_document(const char *style) -{ return vflag < 0 || (!eflag && !style) || (style && !strcmp(style, "document")); -} - -int -is_literal(const char *encoding) -{ return vflag < 0 || (!eflag && !encoding) || (encoding && !strcmp(encoding, "literal")); -} - -char * -has_soapref(Tnode *typ) -{ Entry *p; - Table *t; - if (typ->type == Tstruct || typ->type == Tclass) - { for (t = (Table*)typ->ref; t; t = t->prev) - { for (p = t->list; p; p = p->next) - if (p->info.typ->type == Tpointer && ((Tnode*)p->info.typ->ref)->type == Tstruct && ((Tnode*)p->info.typ->ref)->id == lookup("soap")) - return ident(p->sym->name); - } - } - return NULL; -} - -int -has_constructor(Tnode *typ) -{ Entry *p, *q; - Table *t; - if (typ->type == Tclass || typ->type == Tstruct) - for (t = (Table*)typ->ref; t; t = t->prev) - for (p = t->list; p; p = p->next) - if (p->info.typ->type == Tfun && !strcmp(p->sym->name, typ->id->name) && ((FNinfo *)p->info.typ->ref)->ret->type == Tnone) - { q = ((FNinfo*)p->info.typ->ref)->args->list; - if (!q) - return 1; - } - return 0; -} - -int -has_destructor(Tnode *typ) -{ Entry *p; - Table *t; - if (typ->type == Tclass || typ->type == Tstruct) - for (t = (Table*)typ->ref; t; t = t->prev) - for (p = t->list; p; p = p->next) - if (p->info.typ->type == Tfun && *p->sym->name == '~') - return 1; - return 0; -} - -int -has_getter(Tnode *typ) -{ Entry *p, *q; - Table *t; - if (typ->type == Tclass) - for (t = (Table*)typ->ref; t; t = t->prev) - for (p = t->list; p; p = p->next) - if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "get") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) - { q = ((FNinfo*)p->info.typ->ref)->args->list; - if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) - return 1; - } - return 0; -} - -int -has_setter(Tnode *typ) -{ Entry *p, *q; - Table *t; - if (typ->type == Tclass) - for (t = (Table*)typ->ref; t; t = t->prev) - for (p = t->list; p; p = p->next) - if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "set") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) - { q = ((FNinfo*)p->info.typ->ref)->args->list; - if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) - return 1; - } - return 0; -} - -int -is_primitive_or_string(Tnode *typ) -{ return is_primitive(typ) || is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ) || is_qname(typ) || is_stdqname(typ); -} - -int -is_primitive(Tnode *typ) -{ return typ->type <= Tenum; -} - -int -is_string(Tnode *typ) -{ return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Tchar && !((Tnode*)typ->ref)->sym; -} - -int -is_fixedstring(Tnode *typ) -{ return bflag && typ->type == Tarray && ((Tnode*)typ->ref)->type == Tchar; -} - -int -is_wstring(Tnode *typ) -{ return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Twchar && !((Tnode*)typ->ref)->sym; -} - -int -is_stdstring(Tnode *typ) -{ return typ->type == Tclass && typ->id == lookup("std::string"); -} - -int -is_stdwstring(Tnode *typ) -{ return typ->type == Tclass && typ->id == lookup("std::wstring"); -} - -int -is_stdstr(Tnode *typ) -{ if (typ->type == Tpointer) - return is_stdstring((Tnode*)typ->ref) || is_stdwstring((Tnode*)typ->ref); - return is_stdstring(typ) || is_stdwstring(typ); -} - -int -is_typedef(Tnode *typ) -{ return typ->sym && !is_transient(typ); -} - -int -reflevel(Tnode *typ) -{ int level; - for (level = 0; typ->type == Tpointer; level++) - typ = (Tnode*)typ->ref; - return level; -} - -Tnode * -reftype(Tnode *typ) -{ while ((typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) || typ->type == Treference) - typ = (Tnode*)typ->ref; - return typ; -} - -void -soap_set_attr(Entry *p, char *obj, char *name, char *tag) -{ Tnode *typ = p->info.typ; - int flag = (p->info.minOccurs == 0); - if (is_external(typ) && !is_anyAttribute(typ)) - fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); - else if (is_qname(typ)) - fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s), 1);", obj, name, tag, obj, name); - else if (is_string(typ)) - fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", %s->%s, 1);", obj, name, tag, obj, name); - else if (is_wstring(typ)) - fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s), 2);", obj, name, tag, obj, name); - else if (is_stdqname(typ)) - fprintf(fout, "\n\tif (!%s->%s.empty())\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s.c_str()), 1);", obj, name, tag, obj, name); - else if (is_stdstring(typ)) - { if (flag) - fprintf(fout, "\n\tif (!%s->%s.empty())", obj, name); - fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", %s->%s.c_str(), 1);", tag, obj, name); - } - else if (is_stdwstring(typ)) - { if (flag) - fprintf(fout, "\n\tif (!%s->%s.empty())", obj, name); - fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s.c_str()), 2);", tag, obj, name); - } - else if (typ->type == Tllong || typ->type == Tullong) - fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_type(typ), obj, name); - else if (typ->type == Tenum) - fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); - else if (typ->type == Tpointer) - { Tnode *ptr = (Tnode*)typ->ref; - fprintf(fout, "\n\tif (%s->%s)", obj, name); - if (is_external(ptr) && !is_anyAttribute(ptr)) - fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); - else if (is_qname(ptr)) - fprintf(fout, "\n\t\tif (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, *%s->%s), 1);", obj, name, tag, obj, name); - else if (is_string(ptr)) - fprintf(fout, "\n\t\tif (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", *%s->%s, 1);", obj, name, tag, obj, name); - else if (ptr->type == Tllong || ptr->type == Tullong) - fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_type(ptr), obj, name); - else if (ptr->type == Tenum) - fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); - else if (is_stdqname(ptr)) - fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s->c_str()), 1);", tag, obj, name); - else if (is_stdstring(ptr)) - fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", %s->%s->c_str(), 1);", tag, obj, name); - else if (is_stdwstring(ptr)) - fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s->c_str()), 2);", tag, obj, name); - else if (is_primitive(ptr)) - fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, the_type(ptr), obj, name); - else if (is_hexBinary(ptr)) - fprintf(fout, "\n\t\tif (%s->%s->__ptr)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_s2hex(soap, %s->%s->__ptr, NULL, %s->%s->__size), 1);", obj, name, tag, obj, name, obj, name); - else if (is_binary(ptr)) - fprintf(fout, "\n\t\tif (%s->%s->__ptr)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_s2base64(soap, %s->%s->__ptr, NULL, %s->%s->__size), 1);", obj, name, tag, obj, name, obj, name); - else if (is_anyAttribute(ptr)) - fprintf(fout, "\n\t\tif (soap_out_%s(soap, \"%s\", -1, %s->%s, \"%s\"))\n\t\t\treturn soap->error;", c_ident(ptr), tag, obj, name, xsi_type_u(ptr)); - else - { sprintf(errbuf, "Field '%s' cannot be serialized as an XML attribute", name); - semwarn(errbuf); - } - } - else if (is_primitive(typ)) - fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, the_type(typ), obj, name); - else if (is_hexBinary(typ)) - fprintf(fout, "\n\tif (%s->%s.__ptr)\n\t\tsoap_set_attr(soap, \"%s\", soap_s2hex(soap, %s->%s.__ptr, NULL, %s->%s.__size), 1);", obj, name, tag, obj, name, obj, name); - else if (is_binary(typ)) - fprintf(fout, "\n\tif (%s->%s.__ptr)\n\t\tsoap_set_attr(soap, \"%s\", soap_s2base64(soap, %s->%s.__ptr, NULL, %s->%s.__size), 1);", obj, name, tag, obj, name, obj, name); - else if (is_anyAttribute(typ)) - fprintf(fout, "\n\tif (soap_out_%s(soap, \"%s\", -1, &%s->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(typ), tag, obj, name, xsi_type_u(typ)); - else - { sprintf(errbuf, "Field '%s' cannot be serialized as an XML attribute", name); - semwarn(errbuf); - } -} - -void -soap_attr_value(Entry *p, char *obj, char *name, char *tag) -{ int flag = 0; - Tnode *typ = p->info.typ; - if (p->info.maxOccurs == 0) - flag = 2; /* prohibited */ - else if (p->info.minOccurs >= 1 && !p->info.hasval) - flag = 1; /* required */ - if (is_external(typ) && !is_anyAttribute(typ)) - fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", c_ident(typ), tag, flag, obj, name); - else if (typ->type == Tllong || typ->type == Tullong) - fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", c_type(typ), tag, flag, obj, name); - else if (typ->type == Tenum) - fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", c_ident(typ), tag, flag, obj, name); - else if (is_qname(typ)) - fprintf(fout, "\n\tif (soap_s2QName(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); - else if (is_string(typ)) - fprintf(fout, "\n\tif (soap_s2string(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); - else if (is_wstring(typ)) - fprintf(fout, "\n\tif (soap_s2wchar(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); - else if (is_stdqname(typ)) - fprintf(fout, "\n\t{\tconst char *t = soap_attr_value(soap, \"%s\", %d);\n\t\tif (t)\n\t\t{\tchar *s;\n\t\t\tif (soap_s2QName(soap, t, &s, %ld, %ld))\n\t\t\t\treturn NULL;\n\t\t\t%s->%s.assign(s);\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}", tag, flag, minlen(typ), maxlen(typ), obj, name); - else if (is_stdstring(typ)) - fprintf(fout, "\n\t{\tconst char *t = soap_attr_value(soap, \"%s\", %d);\n\t\tif (t)\n\t\t{\tchar *s;\n\t\t\tif (soap_s2string(soap, t, &s, %ld, %ld))\n\t\t\t\treturn NULL;\n\t\t\t%s->%s.assign(s);\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}", tag, flag, minlen(typ), maxlen(typ), obj, name); - else if (is_stdwstring(typ)) - fprintf(fout, "\n\t{\tconst char *t = soap_attr_value(soap, \"%s\", %d);\n\t\tif (t)\n\t\t{\twchar_t *s;\n\t\t\tif (soap_s2wchar(soap, t, &s, %ld, %ld))\n\t\t\t\treturn NULL;\n\t\t\t%s->%s.assign(s);\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}", tag, flag, minlen(typ), maxlen(typ), obj, name); - else if (typ->type == Tpointer) - { Tnode *ptr = (Tnode*)typ->ref; - if (!is_anyAttribute(ptr)) - fprintf(fout, "\n\t{\tconst char *t = soap_attr_value(soap, \"%s\", %d);\n\t\tif (t)\n\t\t{", tag, flag); - if (!is_stdstring(ptr)) - fprintf(fout, "\n\t\t\tif (!(%s->%s = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\t{\tsoap->error = SOAP_EOM;\n\t\t\t\treturn NULL;\n\t\t\t}", obj, name, c_type(typ), c_type(ptr)); - if (is_external(ptr) && !is_anyAttribute(ptr)) - fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\t\treturn NULL;", c_ident(ptr), obj, name); - else if (ptr->type == Tllong || ptr->type == Tullong) - fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\treturn NULL;", c_type(ptr), obj, name); - else if (ptr->type == Tenum) - fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\treturn NULL;", c_ident(ptr), obj, name); - else if (is_qname(ptr)) - fprintf(fout, "\n\t\t\tif (soap_s2QName(soap, t, %s->%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, minlen(ptr), maxlen(ptr)); - else if (is_string(ptr)) - fprintf(fout, "\n\t\t\tif (soap_s2string(soap, t, %s->%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, minlen(ptr), maxlen(ptr)); - else if (is_stdqname(ptr)) - fprintf(fout, "\n\t\t\tchar *s = NULL;\n\t\t\tif (soap_s2QName(soap, t, &s, %ld, %ld))\n\t\t\t\treturn NULL;\n\t\t\tif (s)\n\t\t\t{\t%s->%s = soap_new_std__string(soap, -1);\n\t\t\t\t%s->%s->assign(s);\n\t\t\t}", minlen(ptr), maxlen(ptr), obj, name, obj, name); - else if (is_stdstring(ptr)) - fprintf(fout, "\n\t\t\tchar *s = NULL;\n\t\t\tif (soap_s2string(soap, t, &s, %ld, %ld))\n\t\t\t\treturn NULL;\n\t\t\tif (s)\n\t\t\t{\t%s->%s = soap_new_std__string(soap, -1);\n\t\t\t\t%s->%s->assign(s);\n\t\t\t}", minlen(ptr), maxlen(ptr), obj, name, obj, name); - else if (is_stdwstring(ptr)) - fprintf(fout, "\n\t\t\twchar_t *s = NULL;\n\t\t\tif (soap_s2wchar(soap, t, &s, %ld, %ld))\n\t\t\t\treturn NULL;\n\t\t\tif (s)\n\t\t\t{\t%s->%s = soap_new_std__wstring(soap, -1);\n\t\t\t\t%s->%s->assign(s);\n\t\t\t}", minlen(ptr), maxlen(ptr), obj, name, obj, name); - else if (is_hexBinary(ptr)) - fprintf(fout, "\n\t\t\tif (!(%s->%s->__ptr = (unsigned char*)soap_hex2s(soap, soap_attr_value(soap, \"%s\", %d), NULL, 0, &%s->%s->__size)))\n\t\t\t\treturn NULL;", obj, name, tag, flag, obj, name); - else if (is_binary(ptr)) - fprintf(fout, "\n\t\t\tif (!(%s->%s->__ptr = (unsigned char*)soap_base642s(soap, soap_attr_value(soap, \"%s\", %d), NULL, 0, &%s->%s->__size)))\n\t\t\t\treturn NULL;", obj, name, tag, flag, obj, name); - else if (is_anyAttribute(ptr)) - fprintf(fout, "\n\t\t\t%s->%s = soap_in_%s(soap, \"%s\", %s->%s, \"%s\");", obj, name, c_ident(ptr), tag, obj, name, xsi_type(ptr)); - else - fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\t\treturn NULL;", the_type(ptr), obj, name); - if (!is_anyAttribute(ptr)) - fprintf(fout, "\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}"); - } - else if (is_hexBinary(typ)) - fprintf(fout, "\n\tif (!(%s->%s.__ptr = (unsigned char*)soap_hex2s(soap, soap_attr_value(soap, \"%s\", %d), NULL, 0, &%s->%s.__size)))\n\t\treturn NULL;", obj, name, tag, flag, obj, name); - else if (is_binary(typ)) - fprintf(fout, "\n\tif (!(%s->%s.__ptr = (unsigned char*)soap_base642s(soap, soap_attr_value(soap, \"%s\", %d), NULL, 0, &%s->%s.__size)))\n\t\treturn NULL;", obj, name, tag, flag, obj, name); - else if (is_anyAttribute(typ)) - fprintf(fout, "\n\tsoap_in_%s(soap, \"%s\", &%s->%s, \"%s\");", c_ident(typ), tag, obj, name, xsi_type(typ)); - else if (is_primitive(typ)) - fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", the_type(typ), tag, flag, obj, name); - if (typ->type == Tpointer) - { if (!is_string(typ) && !is_wstring(typ) && !is_stdstr(typ->ref)) - { Tnode *ptr = (Tnode*)typ->ref; - if (ptr->type <= Tenum) - { if (ptr->minLength != MINLONG64 && (ptr->minLength > 0 || ptr->type < Tuchar || ptr->type > Tullong)) - fprintf(fout,"\n\tif (%s->%s && *%s->%s < " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, obj, name, ptr->minLength); - if (ptr->maxLength != MAXLONG64) - fprintf(fout,"\n\tif (%s->%s && *%s->%s > " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, obj, name, ptr->maxLength); - } - } - } - else if (typ->type <= Tenum) - { if (typ->minLength != MINLONG64 && (typ->minLength > 0 || typ->type < Tuchar || typ->type > Tullong)) - fprintf(fout,"\n\tif (%s->%s < " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, typ->minLength); - if (typ->maxLength != MAXLONG64) - fprintf(fout,"\n\tif (%s->%s > " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, typ->maxLength); - } -} - -char * -ptr_cast(Table *t, char *name) -{ char *s = emalloc(strlen(t->sym->name) + strlen(name) + 6); - sprintf(s, "((%s*)%s)", t->sym->name, name); - return s; -} - -void -soap_out(Tnode *typ) -{ Table *table,*t; - Entry *p = NULL; - int cardinality,i,j,d; - Tnode *n; - char *nse = ns_qualifiedElement(typ); - char *nsa = ns_qualifiedAttribute(typ); - - if (is_dynamic_array(typ)) - { soap_out_Darray(typ); - return; - } - - if (is_external(typ)) - fprintf(fhead, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); - - if (is_typedef(typ) && is_element(typ) && !is_external(typ)) - { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); - return; - } - - if (is_primitive(typ) && typ->type != Tenum) - { if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{\t(void)soap; (void)type; (void)tag; (void)id;", c_ident(typ), c_type_id(typ, "*a")); - if (typ->type == Tllong || typ->type == Tullong) - fprintf(fout,"\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", c_type(typ), soap_type(typ)); - else - fprintf(fout,"\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", the_type(typ), soap_type(typ)); - return; - } - if (is_fixedstring(typ)) - { fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const char[], const char*);", c_ident(typ)); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const char a[], const char *type)\n{", c_ident(typ)); - fprintf(fout,"\n\treturn soap_outstring(soap, tag, id, (char*const*)&a, type, %s);\n}", soap_type(typ)); - return; - } - if (is_string(typ)) - { if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, char *const*a, const char *type)\n{", c_ident(typ)); - fprintf(fout,"\n\treturn soap_outstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); - return; - } - if (is_wstring(typ)) - { if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, wchar_t *const*a, const char *type)\n{", c_ident(typ)); - fprintf(fout,"\n\treturn soap_outwstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); - return; - } - if (is_stdstring(typ)) - { if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); - if (is_stdXML(typ)) - fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::string *s, const char *type)\n{\n\tconst char *t = s->c_str();\n\treturn soap_outliteral(soap, tag, (char*const*)&t, type);\n}", c_ident(typ)); - else - fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::string *s, const char *type)\n{\n\tif ((soap->mode & SOAP_C_NILSTRING) && s->empty())\n\t\treturn soap_element_null(soap, tag, id, type);\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, %s), type) || soap_string_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), soap_type(typ)); - return; - } - if (is_stdwstring(typ)) - { if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); - if (is_stdXML(typ)) - fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::wstring *s, const char *type)\n{\n\tconst wchar_t *t = s->c_str();\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&t, type);\n}", c_ident(typ)); - else - fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::wstring *s, const char *type)\n{\n\tif ((soap->mode & SOAP_C_NILSTRING) && s->empty())\n\t\treturn soap_element_null(soap, tag, id, type);\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, %s), type) || soap_wstring_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), soap_type(typ)); - return; - } - switch(typ->type) - { case Tstruct: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); - return; - } - table=(Table*)typ->ref; - fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ),c_type_id(typ, "*a")); - for (t = table; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (is_repetition(p)) - p = p->next; - else if (p->info.sto & Sattribute) - soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); - else if (is_qname(p->info.typ)) - fprintf(fout,"\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); - else if (is_stdqname(p->info.typ)) - fprintf(fout,"\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name)); - else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\tconst char *soap_tmp_%s = a->%s ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); - else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\tstd::string soap_temp_%s(a->%s ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); - } - } - fprintf(fout,"\n\t(void)soap; (void)tag; (void)id; (void)type;"); - if (is_primclass(typ)) - { - for (table = (Table*)typ->ref; table; table = table->prev) - { p = table->list; - if (p && is_item(p)) - break; - } - if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) - fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); - if(p->info.typ->type==Tarray) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); - else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - fprintf(fout,"\n\treturn a->%s.soap_out(soap, tag, id, \"%s\");", ident(p->sym->name), xsi_type_u(typ)); - else if (is_qname(p->info.typ)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, (char*const*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); - else if (is_stdqname(p->info.typ)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); - else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, (char*const*)soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); - else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); - else if (is_XML(p->info.typ) && is_string(p->info.typ)) - fprintf(fout,"\n\treturn soap_outliteral(soap, tag, &a->%s, NULL);", ident(p->sym->name)); - else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) - fprintf(fout,"\n\treturn soap_outwliteral(soap, tag, &a->%s, NULL);", ident(p->sym->name)); - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); - else - fprintf(fout,"\n\treturn SOAP_OK;"); - fprintf(fout,"\n}"); - } - else - { if (!is_invisible(typ->id->name)) - fprintf(fout,"\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type))\n\t\treturn soap->error;", soap_type(typ)); - fflush(fout); - for (t = table; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (p->info.sto & Sreturn) - { if (nse || has_ns_eq(NULL, p->sym->name)) - { if (p->info.typ->type == Tpointer) - fprintf(fout,"\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse)); - else - fprintf(fout,"\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse)); - } - } - if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) - fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); - needs_lang(p); - if (p->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); - else if (is_transient(p->info.typ)) - fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.sto & Sattribute) - ; - else if (is_repetition(p)) - { fprintf(fout,"\n\tif (a->%s)", ident(p->next->sym->name)); - fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s; i++)", ident(p->sym->name)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\tif (a->%s[i].soap_out(soap, \"%s\", -1, \"%s\"))\n\t\t\t\treturn soap->error;", ident(p->next->sym->name), ns_add(p->next, nse),xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); - else if (is_qname((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s[i]);\n\t\t\tif (soap_out_%s(soap, \"%s\", -1, (char*const*)&soap_tmp_%s, \"%s\"))\n\t\t\t\treturn soap->error;\n\t\t}", ident(p->next->sym->name), ident(p->next->sym->name), c_ident((Tnode*)p->next->info.typ->ref), ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); - else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\tsoap_outliteral(soap, \"%s\", a->%s + i, NULL);", ns_add(p->next, nse), ident(p->next->sym->name)); - else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\tsoap_outwliteral(soap, \"%s\", a->%s + i, NULL);", ns_add(p->next, nse), ident(p->next->sym->name)); - else - fprintf(fout,"\n\t\t\tif (soap_out_%s(soap, \"%s\", -1, a->%s + i, \"%s\"))\n\t\t\t\treturn soap->error;", c_ident((Tnode*)p->next->info.typ->ref), ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); - fprintf(fout,"\n\t}"); - p = p->next; - } - else if (is_anytype(p) && is_invisible(p->next->sym->name)) - { fprintf(fout,"\n\tif (soap_putelement(soap, a->%s, tag, -1, a->%s))\n\t\treturn soap->error;", ident(p->next->sym->name), ident(p->sym->name)); - p = p->next; - } - else if (is_anytype(p)) - { fprintf(fout,"\n\tif (soap_putelement(soap, a->%s, \"%s\", -1, a->%s))\n\t\treturn soap->error;", ident(p->next->sym->name), ns_add(p->next, nse), ident(p->sym->name)); - p = p->next; - } - else if (is_choice(p)) - { fprintf(fout,"\n\tif (soap_out_%s(soap, a->%s, &a->%s))\n\t\treturn soap->error;", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); - p = p->next; - } - else if (p->info.typ->type==Tarray) - fprintf(fout,"\n\tsoap_out_%s(soap, %s, -1, a->%s, \"%s\");", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - else if (p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - fprintf(fout,"\n\tif (a->%s.soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(p->sym->name), field(p, nse), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - else if (is_qname(p->info.typ)) - fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - else if (is_stdqname(p->info.typ)) - fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - else if (is_XML(p->info.typ) && is_string(p->info.typ)) - fprintf(fout,"\n\tsoap_outliteral(soap, %s, &a->%s, NULL);", field(p, nse), ident(p->sym->name)); - else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) - fprintf(fout,"\n\tsoap_outwliteral(soap, %s, &a->%s, NULL);", field(p, nse), ident(p->sym->name)); - else if (p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) - fprintf(fout,"\n\tif (a->%s)\n\t{\tif (soap_out_%s(soap, %s, -1, &a->%s, \"%s\"))\n\t\t\treturn soap->error;\n\t}\n\telse if (soap_element_nil(soap, %s))\n\t\treturn soap->error;", ident(p->sym->name), c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name)), field(p, nse)); - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) - fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, &a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - } - } - if (!is_invisible(typ->id->name)) - fprintf(fout,"\n\treturn soap_element_end_out(soap, tag);\n}"); - else - fprintf(fout,"\n\treturn SOAP_OK;\n}"); - } - fflush(fout); - break; - - case Tclass: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); - return; - } - table=(Table*)typ->ref; - if (!is_volatile(typ) && !is_typedef(typ)) - { - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fout,"\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", ident(typ->id->name)); - fprintf(fout,"\n{\n\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); - } - fprintf(fhead,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); - fflush(fout); - if (has_setter(typ)) - fprintf(fout, "\n\t((%s)a)->set(soap);", c_type_id(typ, "*")); - for (t = table; t; t = t->prev) - { Entry *e = entry(classtable, t->sym); - char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; - for (p = t->list; p; p = p->next) - { if (is_repetition(p)) - p = p->next; - else if (p->info.sto & Sattribute) - soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); - else if (is_qname(p->info.typ)) - fprintf(fout,"\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); - else if (is_stdqname(p->info.typ)) - fprintf(fout,"\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name)); - else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\tconst char *soap_tmp_%s = a->%s ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); - else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\tstd::string soap_temp_%s(a->%s ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); - } - } - if (is_primclass(typ)) - { - for (t = table; t; t = t->prev) - { p = t->list; - if (p && is_item(p)) - break; - } - if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) - fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); - if (table->prev) - { - if (is_XML(p->info.typ) && is_string(p->info.typ)) - fprintf(fout,"\n\treturn soap_outliteral(soap, tag, &(a->%s::%s), \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); - else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) - fprintf(fout,"\n\treturn soap_outwliteral(soap, tag, &(a->%s::%s), \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); - else if(p->info.typ->type==Tarray) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); - else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - fprintf(fout,"\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); - else if (is_qname(p->info.typ)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, (char*const*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); - else if (is_stdqname(p->info.typ)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); - else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, (char*const*)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); - else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &(a->%s::%s), \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); - else - fprintf(fout,"\n\treturn SOAP_OK;"); - } - else - { if (is_XML(p->info.typ) && is_string(p->info.typ)) - fprintf(fout,"\n\treturn soap_outliteral(soap, tag, &(a->%s::%s), NULL);", ident(t->sym->name), ident(p->sym->name)); - else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) - fprintf(fout,"\n\treturn soap_outwliteral(soap, tag, &(a->%s::%s), NULL);", ident(t->sym->name), ident(p->sym->name)); - else if(p->info.typ->type==Tarray) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); - else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - fprintf(fout,"\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); - else if (is_qname(p->info.typ)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, (char*const*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); - else if (is_stdqname(p->info.typ)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); - else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, (char*const*)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); - else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, &a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); - else - fprintf(fout,"\n\treturn SOAP_OK;"); - } - fprintf(fout,"\n}"); - } - else - { if (!is_invisible(typ->id->name)) - { if (table && table->prev) - fprintf(fout,"\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), \"%s\"))\n\t\treturn soap->error;", soap_type(typ), xsi_type(typ)); - else - fprintf(fout,"\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type))\n\t\treturn soap->error;", soap_type(typ)); - } - fflush(fout); - - i=0; - /* Get the depth of the inheritance hierarchy */ - for (t = table; t; t = t->prev) - i++; - - /* Call routines to output the member data of the class */ - /* Data members of the Base Classes are outputed first - followed by the data members of the Derived classes. - Overridden data members are output twice once for the base class - they are defined in and once for the derived class that overwrites - them */ - - for (; i > 0; i--) - { Entry *e; - char *nse1; - t = table; - for (j = 0; j< i-1; j++) - t = t->prev; - e = entry(classtable, t->sym); - nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; - for (p = t->list; p != (Entry*) 0; p = p->next) - { if (p->info.sto & Sreturn) - { if (nse1 || has_ns_eq(NULL, p->sym->name)) - { if (p->info.typ->type == Tpointer) - fprintf(fout,"\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse1)); - else - fprintf(fout,"\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse1)); - } - } - if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) - fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); - needs_lang(p); - if (is_item(p)) - ; - else if (p->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); - else if (is_transient(p->info.typ)) - fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.sto & Sattribute) - ; - else if (is_repetition(p)) - { fprintf(fout,"\n\tif (a->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); - fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s::%s; i++)", ident(t->sym->name), ident(p->sym->name)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\tif (a->%s::%s[i].soap_out(soap, %s, -1, \"%s\"))\n\t\t\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), field_overridden(t, p->next, nse1),xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); - else if (is_qname((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s[i]);\n\t\t\tif (soap_out_%s(soap, %s, -1, (char*const*)&soap_tmp_%s, \"%s\"))\n\t\t\t\treturn soap->error;\n\t\t}", ident(p->next->sym->name), ident(p->next->sym->name), c_ident((Tnode*)p->next->info.typ->ref), field_overridden(t, p->next, nse1), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); - else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\tsoap_outliteral(soap, %s, a->%s::%s + i, NULL);", field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); - else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\tsoap_outwliteral(soap, %s, a->%s::%s + i, NULL);", field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); - else - fprintf(fout,"\n\t\t\tif (soap_out_%s(soap, %s, -1, a->%s::%s + i, \"%s\"))\n\t\t\t\treturn soap->error;", c_ident((Tnode*)p->next->info.typ->ref), field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); - fprintf(fout,"\n\t}"); - p = p->next; - } - else if (is_anytype(p) && is_invisible(p->next->sym->name)) - { fprintf(fout,"\n\tif (soap_putelement(soap, a->%s::%s, tag, -1, a->%s::%s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); - p = p->next; - } - else if (is_anytype(p)) - { fprintf(fout,"\n\tif (soap_putelement(soap, a->%s::%s, %s, -1, a->%s::%s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); - p = p->next; - } - else if (is_choice(p)) - { fprintf(fout,"\n\tif (soap_out_%s(soap, a->%s::%s, &a->%s::%s))\n\t\treturn soap->error;", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); - p = p->next; - } - else if (p->info.typ->type==Tarray) - fprintf(fout,"\n\tsoap_out_%s(soap, %s, -1, a->%s::%s, \"%s\");", c_ident(p->info.typ),field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - else if (p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - fprintf(fout,"\n\tif ((a->%s::%s).soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1),xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - else if (is_qname(p->info.typ)) - fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ),field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - else if (is_stdqname(p->info.typ)) - fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ),field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - else if (is_XML(p->info.typ) && is_string(p->info.typ)) - fprintf(fout,"\n\tsoap_outliteral(soap, %s, &(a->%s::%s), NULL);", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); - else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) - fprintf(fout,"\n\tsoap_outwliteral(soap, %s, &(a->%s::%s), NULL);", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); - else if (p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) - fprintf(fout,"\n\tif (a->%s::%s)\n\t{\tif (soap_out_%s(soap, %s, -1, &a->%s::%s, \"%s\"))\n\t\t\treturn soap->error;\n\t}\n\telse if (soap_element_nil(soap, %s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->sym->name), c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name)), field_overridden(t, p, nse1)); - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) - fprintf(fout,"\n\tif (soap_out_%s(soap, %s, -1, &(a->%s::%s), \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ),field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - fflush(fout); - } - } - if (!is_invisible(typ->id->name)) - fprintf(fout,"\n\treturn soap_element_end_out(soap, tag);\n}"); - else - fprintf(fout,"\n\treturn SOAP_OK;\n}"); - } - fflush(fout); - break; - - case Tunion: - if (is_external(typ)) - { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); - return; - } - fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); - fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, int choice, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); - table = (Table*)typ->ref; - fprintf(fout, "\n\tswitch (choice)\n\t{"); - for (p = table->list; p; p = p->next) - { if (p->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); - else if (is_transient(p->info.typ)) - fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.sto & Sattribute) - ; - else if (is_repetition(p)) - ; - else if (is_anytype(p)) - ; - else if (p->info.typ->type == Tarray) - { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); - fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - } - else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); - fprintf(fout, "\n\t\treturn a->%s.soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), ns_add(p, nse), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - } - else if (is_qname(p->info.typ) || is_stdqname(p->info.typ)) - { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); - fprintf(fout,"\n\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); - fprintf(fout,"\n\t\treturn soap_out_%s(soap, \"%s\", -1, (char*const*)&soap_tmp_%s, \"%s\");\n\t}", c_ident(p->info.typ),ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - } - else if (is_XML(p->info.typ) && is_string(p->info.typ)) - { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); - fprintf(fout,"\n\t\treturn soap_outliteral(soap, \"%s\", &a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); - } - else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) - { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); - fprintf(fout,"\n\t\treturn soap_outwliteral(soap, \"%s\", &a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); - } - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) - { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name)); - fprintf(fout,"\n\t\treturn soap_out_%s(soap, \"%s\", -1, &a->%s, \"%s\");", c_ident(p->info.typ),ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); - } - } - fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}\n\treturn SOAP_OK;\n}"); - fflush(fout); - break; - - case Tpointer: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char *, int, %s, const char *);", c_ident(typ),c_type_id(typ, "const*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char *, int, %s, const char *);", c_ident(typ),c_type_id(typ, "const*")); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, %s, const char *type)\n{", c_ident(typ),c_type_id(typ, "const*a")); - if (is_template(typ)) - { fprintf(fout,"\n\tif (!*a)"); - fprintf(fout,"\n\t\treturn soap_element_null(soap, tag, id, type);"); - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, *a, type);", c_ident((Tnode*)typ->ref)); - } - else - { p = is_dynamic_array((Tnode*)typ->ref); - if (p) - { d = get_Darraydims((Tnode*)typ->ref); - if (d) - fprintf(fout,"\n\tid = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->%s, %d, type, %s);", ident(p->sym->name), d, soap_type((Tnode*)typ->ref)); - else - fprintf(fout,"\n\tid = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->%s, 1, type, %s);", ident(p->sym->name), soap_type((Tnode*)typ->ref)); - } - else - fprintf(fout,"\n\tid = soap_element_id(soap, tag, id, *a, NULL, 0, type, %s);", soap_type((Tnode*)typ->ref)); - fprintf(fout,"\n\tif (id < 0)\n\t\treturn soap->error;"); - if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) - fprintf(fout,"\n\treturn (*a)->soap_out(soap, tag, id, type);"); - else - fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, *a, type);",c_ident((Tnode*)typ->ref)); - } - fprintf(fout,"\n}"); - break; - - case Tarray: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, %s, const char*);", c_ident(typ),c_type_id(typ, "const")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, %s, const char*);", c_ident(typ),c_type_id(typ, "const")); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, %s, const char *type)\n{", c_ident(typ),c_type_id(typ, "const a")); - fprintf(fout,"\n\tint i;"); - fprintf(fout,"\n\tsoap_array_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), \"%s[%d]\", 0);", soap_type(typ), xsi_type_Tarray(typ), get_dimension(typ)); - n=(Tnode*)typ->ref; - cardinality = 1; - while(n->type==Tarray) - { - n=(Tnode*)n->ref; - cardinality++; - } - - fprintf(fout,"\n\tfor (i = 0; i < %d; i++)\n\t{",get_dimension(typ)); - if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) - { if(cardinality>1) - fprintf(fout,"\n\t\ta[i].soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); - else fprintf(fout,"\n\t\t(a+i)->soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); - } - else - { if(((Tnode *)typ->ref)->type != Tarray) - { if(((Tnode *)typ->ref)->type == Tpointer) - fprintf(fout,"\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;\n\t\tsoap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); - else - fprintf(fout,"\n\t\tsoap_out_%s(soap, \"item\", -1, a",c_ident((Tnode*)typ->ref)); - } - else - fprintf(fout,"\n\t\tsoap_out_%s(soap, \"item\", -1, a",c_ident((Tnode*)typ->ref)); - if(cardinality>1) - fprintf(fout,"[i], \"%s\")", xsi_type_u((Tnode*)typ->ref)); - else - fprintf(fout,"+i, \"%s\")", xsi_type_u((Tnode*)typ->ref)); - } - if(((Tnode *)typ->ref)->type == Tpointer) - fprintf(fout,";\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); - else - fprintf(fout,";\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); - break; - - case Tenum: - if (is_external(typ)) - { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); - return; - } - fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); - if (!is_typedef(typ)) - { fprintf(fout, "\n\nstatic const struct soap_code_map soap_codes_%s[] =\n{", c_ident(typ)); - for (t = (Table*)typ->ref; t; t = t->prev) - { for (p = t->list; p; p = p->next) - fprintf(fout, "\t{ (long)%s, \"%s\" },\n", ident(p->sym->name), ns_remove2(p->sym->name)); - } - fprintf(fout, "\t{ 0, NULL }\n"); - fprintf(fout, "};"); - } - fprintf(fhead, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); - fprintf(fout, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap *soap, %s)", c_ident(typ), c_type_id(typ, "n")); - if (is_typedef(typ)) - fprintf(fout, "\n{\treturn soap_%s2s(soap, n);\n}", t_ident(typ)); - else if (is_boolean(typ)) - fprintf(fout, "\n{\n\t(void)soap; /* appease -Wall -Werror */\nreturn soap_code_str(soap_codes_%s, n!=0);\n}", c_ident(typ)); - else if (!is_mask(typ)) - { fprintf(fout, "\n{\tconst char *s = soap_code_str(soap_codes_%s, (long)n);", c_ident(typ)); - fprintf(fout, "\n\tif (s)\n\t\treturn s;"); - fprintf(fout, "\n\treturn soap_long2s(soap, (long)n);"); - fprintf(fout, "\n}"); - } - else - fprintf(fout, "\n{\n\treturn soap_code_list(soap, soap_codes_%s, (long)n);\n}", c_ident(typ)); - fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)", c_ident(typ), c_type_id(typ, "*a")); - fprintf(fout, "\n{\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type)", soap_type(typ)); - fprintf(fout, " || soap_send(soap, soap_%s2s(soap, *a)))\n\t\treturn soap->error;", c_ident(typ)); - fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); - break; - case Ttemplate: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); - return; - } - if (is_typedef(typ)) - { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); - n = typ->ref; - if (!n) - return; - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ),c_type_id(typ, "*a")); - - fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)\n\t{", c_type(typ)); - if (n->type==Tarray) - fprintf(fout,"\n\t\tif (soap_out_%s(soap, tag, id, *i, \"%s\"))", c_ident(n), xsi_type_u(typ)); - else if (n->type==Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) - fprintf(fout,"\n\t\tif ((*i).soap_out(soap, tag, id, \"%s\"))", xsi_type_u(typ)); - else if (is_qname(n)) - fprintf(fout,"\n\t\tconst char *soap_tmp = soap_QName2s(soap, *i);\n\t\tif (soap_out_%s(soap, tag, id, (char*const*)&soap_tmp, \"%s\"))", c_ident(n), xsi_type_u(typ)); - else if (is_stdqname(n)) - fprintf(fout,"\n\t\tstd::string soap_tmp(soap_QName2s(soap, (*i).c_str()));\n\t\tif (soap_out_%s(soap, tag, id, &soap_tmp, \"%s\"))", c_ident(n), xsi_type_u(typ)); - else if (is_XML(n) && is_string(n)) - fprintf(fout,"\n\t\tif (soap_outliteral(soap, tag, &(*i), NULL))"); - else if (is_XML(n) && is_wstring(n)) - fprintf(fout,"\n\t\tif (soap_outwliteral(soap, tag, &(*i), NULL))"); - else if (n->type == Tenum && (Table*)n->ref == booltable) - fprintf(fout,"\n\t\tbool b = (*i);\n\t\tif (soap_out_%s(soap, tag, id, &b, \"%s\"))", c_ident(n), xsi_type_u(typ)); - else - fprintf(fout,"\n\t\tif (soap_out_%s(soap, tag, id, &(*i), \"%s\"))", c_ident(n), xsi_type_u(typ)); - fprintf(fout, "\n\t\t\treturn soap->error;"); - fprintf(fout, "\n\t}\n\treturn SOAP_OK;\n}"); - break; - default: break; - } -} - -void -soap_out_Darray(Tnode *typ) -{ int i, j, d = 0; - Table *t, *table; - Entry *p; - char *nse = ns_qualifiedElement(typ); - char *nsa = ns_qualifiedAttribute(typ); - char *item; - - table=(Table*)typ->ref; - fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ),c_type_id(typ, "*")); - if (is_external(typ)) - return; - if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) - { fprintf(fout,"\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", c_type(typ)); - fprintf(fout,"\n{\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); - } - fflush(fout); - fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ),c_type_id(typ, "*a")); - if (has_setter(typ)) - fprintf(fout, "\n\t((%s)a)->set(soap);", c_type_id(typ, "*")); - if (!is_binary(typ)) - { d = get_Darraydims(typ); - if (d) - fprintf(fout,"\n\tint i, n = soap_size(a->__size, %d);", d); - else - fprintf(fout,"\n\tint i, n = a->__size;"); - } - if (typ->type == Tclass) - { for (t = table; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (p->info.sto & Sattribute) - soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); - } - } - } - else - { for (t = table; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (p->info.sto & Sattribute) - soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); - } - } - } - p = is_dynamic_array(typ); - if (p->sym->name[5]) - item = ns_addx(p->sym->name + 5, nse); - else - item = ns_addx("item", nse); - if (!has_ns(typ) && !is_untyped(typ) && !is_binary(typ)) - { if (is_untyped(p->info.typ)) - { if (has_offset(typ)) - if (d) - fprintf(fout,"\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", a->__size, a->__offset, %d) : NULL;", ident(p->sym->name), wsdl_type(p->info.typ, "xsd"), d); - else - fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", n + a->__offset) : NULL;", ident(p->sym->name), wsdl_type(p->info.typ, "xsd")); - else if (d) - fprintf(fout,"\n\tchar *t = a->%s ? soap_putsizes(soap, \"%s\", a->__size, %d) : NULL;", ident(p->sym->name), wsdl_type(p->info.typ, "xsd"), d); - else - fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", n) : NULL;", ident(p->sym->name), wsdl_type(p->info.typ, "xsd")); - } - else - { if (has_offset(typ)) - if (d) - fprintf(fout,"\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", a->__size, a->__offset, %d) : NULL;", ident(p->sym->name), xsi_type(typ), d); - else - fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", n + a->__offset) : NULL;", ident(p->sym->name), xsi_type(typ)); - else if (d) - fprintf(fout,"\n\tchar *t = a->%s ? soap_putsizes(soap, \"%s\", a->__size, %d) : NULL;", ident(p->sym->name), xsi_type(typ),d); - else - fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", a->__size) : NULL;", ident(p->sym->name), xsi_type(typ)); - } - } - if (d) - fprintf(fout,"\n\tid = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->%s, %d, type, %s);", ident(p->sym->name), d, soap_type(typ)); - else if (is_attachment(typ)) - { fprintf(fout,"\n#ifndef WITH_LEANER\n\tid = soap_attachment(soap, tag, id, a, (struct soap_array*)&a->%s, a->id, a->type, a->options, 1, type, %s);", ident(p->sym->name), soap_type(typ)); - fprintf(fout,"\n#else\n\tid = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->%s, 1, type, %s);\n#endif", ident(p->sym->name), soap_type(typ)); - } - else - fprintf(fout,"\n\tid = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->%s, 1, type, %s);", ident(p->sym->name), soap_type(typ)); - fprintf(fout,"\n\tif (id < 0)\n\t\treturn soap->error;"); - fprintf(fout,"\n\tif ("); - if (has_ns(typ) || is_untyped(typ) || is_binary(typ)) - { if (table->prev) - fprintf(fout,"soap_element_begin_out(soap, tag, id, \"%s\")", xsi_type(typ)); - else - fprintf(fout,"soap_element_begin_out(soap, tag, id, type)"); - } - else if (has_offset(typ)) - { if (d) - fprintf(fout,"soap_array_begin_out(soap, tag, id, t, soap_putoffsets(soap, a->__offset, %d))", d); - else - fprintf(fout,"soap_array_begin_out(soap, tag, id, t, soap_putoffset(soap, a->__offset))"); - } - else - fprintf(fout,"soap_array_begin_out(soap, tag, id, t, NULL)"); - fprintf(fout, ")\n\t\treturn soap->error;"); - if (is_binary(typ) && !is_hexBinary(typ)) - fprintf(fout, "\n\tif (soap_putbase64(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); - else if (is_hexBinary(typ)) - fprintf(fout, "\n\tif (soap_puthex(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); - else - { fprintf(fout,"\n\tfor (i = 0; i < n; i++)\n\t{"); - if (!has_ns(typ) && !is_untyped(typ)) - { if (d) - { fprintf(fout,"\n\t\tsoap->position = %d;", d); - for (i = 0; i < d; i++) - { fprintf(fout, "\n\t\tsoap->positions[%d] = i", i); - for (j = i+1; j < d; j++) - fprintf(fout, "/a->__size[%d]", j); - fprintf(fout, "%%a->__size[%d];", i); - } - if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); - else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); - else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\ta->%s[i].soap_out(soap, \"item\", -1, \"%s\");", ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); - else - fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\");",c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); - } - else - { fprintf(fout,"\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;"); - if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); - else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); - else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\ta->%s[i].soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); - else - fprintf(fout,"\n\t\tsoap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\");",c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); - } - } - else - { if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); - else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); - else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\ta->%s[i].soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); - else - fprintf(fout,"\n\t\tsoap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\");",c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); - } - } - if (is_binary(typ)) - fprintf(fout,"\n\treturn soap_element_end_out(soap, tag);\n}"); - else if (!has_ns(typ) && !is_untyped(typ)) - fprintf(fout,"\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); - else - fprintf(fout,"\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); -} - -void -soap_get(Tnode *typ) -{ - Tnode *temp; - - if (typ->type == Ttemplate || typ->type == Tunion) - return; - - if (is_typedef(typ) && is_element(typ)) - { fprintf(fhead, "\n\n#define soap_get_%s soap_get_%s\n", c_ident(typ), t_ident(typ)); - return; - } - - if(typ->type==Tarray) - { - /* ARRAY */ - temp = typ; - while(temp->type == Tarray){ - temp = (Tnode*)temp->ref; - } - fprintf(fhead,"\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type(temp),c_ident(typ),c_type(typ)); - fprintf(fout,"\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)", c_type(temp),c_ident(typ),c_type_id(typ, "a")); - fprintf(fout,"\n{\t%s;",c_type_id(temp, "(*p)")); - fprintf(fout,"\n\tif ((p = soap_in_%s(soap, tag, a, type)))", c_ident(typ)); - } - else if (typ->type==Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) - { - /* CLASS */ - fprintf(fout,"\n\nvoid *%s::soap_get(struct soap *soap, const char *tag, const char *type)", c_type(typ)); - fprintf(fout,"\n{\n\treturn soap_get_%s(soap, this, tag, type);\n}", c_ident(typ)); - fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*p")); - fprintf(fout,"\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); - } - else - { - fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*p")); - fprintf(fout,"\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); - } - fprintf(fout,"\n\t\tif (soap_getindependent(soap))\n\t\t\treturn NULL;"); - fprintf(fout,"\n\treturn p;\n}"); -#if 0 - /* some compilers cannot handle this inlined function */ - if (typ->type != Treference) - fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s) { if (soap_begin_recv(soap) || !soap_get_%s(soap, p, NULL, NULL) || soap_end_recv(soap)) return soap->error; return SOAP_OK; }\n", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); -#endif - if (typ->type != Treference) - { if (((!is_external(typ) && !is_volatile(typ)) || Qflag) && namespaceid) - fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( soap_begin_recv(soap) || !%s::soap_get_%s(soap, data, NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ)); - else - fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( soap_begin_recv(soap) || !soap_get_%s(soap, data, NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ)); - } - fflush(fout); -} - -void -soap_in(Tnode *typ) -{ Entry *p = NULL; - Table *table, *t; - int total, a, f, cardinality, i, j; - long min, max; - Tnode *n, *temp; - char *nse = ns_qualifiedElement(typ); - char *nsa = ns_qualifiedAttribute(typ); - - if (is_dynamic_array(typ)) - { soap_in_Darray(typ); - return; - } - - if (is_external(typ)) - fprintf(fhead,"\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);",c_ident(typ),c_type_id(typ, "*")); - - if (is_typedef(typ) && is_element(typ) && !is_external(typ)) - { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); - return; - } - - if (is_primitive_or_string(typ) && typ->type != Tenum) - { - if (is_stdqname(typ)) - { fprintf(fhead,"\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); - fprintf(fout,"\n\nSOAP_FMAC1 std::string * SOAP_FMAC2 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\tif (soap_element_begin_in(soap, tag, 1, type))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__string(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); - fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{\tchar *t;\n\t\ts = (std::string*)soap_class_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType);\n\t\tif (s)\n\t\t{\tif (!(t = soap_string_in(soap, 2, %ld, %ld)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::string*)soap_id_forward(soap, soap->href, soap_class_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType), 0, %s, 0, sizeof(std::string), 0, soap_copy_%s);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), minlen(typ), maxlen(typ), soap_type(typ), soap_type(typ), c_ident(typ)); - return; - } - if (is_stdstring(typ)) - { if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 std::string * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); - if (is_stdXML(typ)) - fprintf(fout,"\n\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\tchar *t;\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_inliteral(soap, tag, &t))\n\t{\tif (!s)\n\t\t\ts = soap_new_std__string(soap, -1);\n\t\ts->assign(t);\n\t\treturn s;\n\t}\n\treturn NULL;\n}", c_ident(typ)); - else - { fprintf(fout,"\n\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__string(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); - fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{\tchar *t;\n\t\ts = (std::string*)soap_class_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType);\n\t\tif (s)\n\t\t{\tif (!(t = soap_string_in(soap, 1, %ld, %ld)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::string*)soap_id_forward(soap, soap->href, soap_class_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType), 0, %s, 0, sizeof(std::string), 0, soap_copy_%s);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), minlen(typ), maxlen(typ), soap_type(typ), soap_type(typ), c_ident(typ)); - } - return; - } - if (is_stdwstring(typ)) - { if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); - return; - } - if (is_stdXML(typ)) - fprintf(fout,"\n\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::wstring *s, const char *type)\n{\n\twchar_t *t;\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_inwliteral(soap, tag, &t))\n\t{\tif (!s)\n\t\t\ts = soap_new_std__wstring(soap, -1);\n\t\ts->assign(t);\n\t\treturn s;\n\t}\n\treturn NULL;\n}", c_ident(typ)); - else - { fprintf(fhead,"\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); - fprintf(fout,"\n\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::wstring *s, const char *type)\n{\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__wstring(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); - fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{\twchar_t *t;\n\t\ts = (std::wstring*)soap_class_id_enter(soap, soap->id, s, %s, sizeof(std::wstring), soap->type, soap->arrayType);\n\t\tif (s)\n\t\t{\tif (!(t = soap_wstring_in(soap, 1, %ld, %ld)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::wstring*)soap_id_forward(soap, soap->href, soap_class_id_enter(soap, soap->id, s, %s, sizeof(std::wstring), soap->type, soap->arrayType), 0, %s, 0, sizeof(std::wstring), 0, soap_copy_%s);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), minlen(typ), maxlen(typ), soap_type(typ), soap_type(typ), c_ident(typ)); - } - return; - } - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(typ), c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(typ), c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{\t%s;", c_type(typ), c_ident(typ), c_type_id(typ, "*a"), c_type_id(typ, "*p")); - if (is_wstring(typ)) - fprintf(fout,"\n\tp = soap_inwstring(soap, tag, a, type, %s, %ld, %ld);", soap_type(typ), minlen(typ), maxlen(typ)); - else if (is_string(typ)) - fprintf(fout,"\n\tp = soap_instring(soap, tag, a, type, %s, %d, %ld, %ld);", soap_type(typ), is_qname(typ)+1, minlen(typ), maxlen(typ)); - else - { if (typ->type == Tllong || typ->type == Tullong) - fprintf(fout,"\n\tp = soap_in%s(soap, tag, a, type, %s);", c_type(typ), soap_type(typ)); - else - fprintf(fout,"\n\tp = soap_in%s(soap, tag, a, type, %s);", the_type(typ), soap_type(typ)); - if (typ->type <= Tenum) - { if (typ->minLength != MINLONG64 && (typ->minLength > 0 || typ->type < Tuchar || typ->type > Tullong)) - fprintf(fout,"\n\tif (p && *p < " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->minLength); - if (typ->maxLength != MAXLONG64) - fprintf(fout,"\n\tif (p && *p > " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->maxLength); - } - } - fprintf(fout,"\n\treturn p;\n}"); - fflush(fout); - return; - } - if (is_fixedstring(typ)) - { fprintf(fhead,"\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap*, const char*, char[], const char*);", c_ident(typ)); - fprintf(fout,"\n\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, char a[], const char *type)\n{\tchar *p;\n\tif (soap_instring(soap, tag, &p, type, %s, 1, 0, %d))\n\t\treturn strcpy(a, p);\n\treturn NULL;\n}", c_ident(typ), soap_type(typ), typ->width / ((Tnode*)typ->ref)->width - 1); - return; - } - switch(typ->type) - { case Tstruct: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); - table = (Table *)typ->ref; - if (is_primclass(typ)) - { fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); - if (!cflag || has_class(typ)) - fprintf(fout,"\n\tif (!(a = (%s)soap_class_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType)))\n\t\treturn NULL;", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - else - fprintf(fout,"\n\tif (!(a = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), 0, NULL, NULL, NULL)))\n\t\treturn NULL;", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - fprintf(fout,"\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); - /* fprintf(fout,"\n\tif (soap->alloced)"); */ - fprintf(fout,"\n\tsoap_default_%s(soap, a);",c_ident(typ)); - for (t = (Table*)typ->ref; t; t = t->prev) - { for (p = t->list; p; p = p->next) - if (p->info.sto & Sattribute) - soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); - } - fflush(fout); - for (table = (Table*)typ->ref; table; table = table->prev) - { p = table->list; - if (p && is_item(p)) - break; - } - if (is_XML(p->info.typ) && is_string(p->info.typ)) - { fprintf(fout,"\n\tif (!soap_inliteral(soap, tag, &a->%s))", ident(p->sym->name)); - } - else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) - { fprintf(fout,"\n\tif (!soap_inwliteral(soap, tag, &a->%s))", ident(p->sym->name)); - } - else if(p->info.typ->type==Tarray) { - fprintf(fout,"\n\tif (!soap_in_%s(soap, tag, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); - } - else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { - fprintf(fout,"\n\tif (!a->%s.soap_in(soap, tag, \"%s\"))", ident(p->sym->name), xsi_type(typ)); - } - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { - fprintf(fout,"\n\tif (!soap_in_%s(soap, tag, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); - } - fprintf(fout,"\n\t\treturn NULL;"); - fprintf(fout, "\n\treturn a;\n}"); - } - else - { table = (Table*)typ->ref; - if (!is_discriminant(typ)) - { for (t = table; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_template(p->info.typ)) - { if (is_anytype(p) || is_choice(p)) - p = p->next; - if (is_repetition(p)) - { fprintf(fout,"\n\tstruct soap_blist *soap_blist_%s = NULL;", ident(p->next->sym->name)); - p = p->next; - } - else - fprintf(fout,"\n\tsize_t soap_flag_%s = " SOAP_LONG_FORMAT ";", ident(p->sym->name), p->info.maxOccurs); - } - } - } - } - if (!is_invisible(typ->id->name)) - { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, type))\n\t\treturn NULL;"); - } - else if (!is_discriminant(typ)) - { if (table && (table->prev || table->list)) - fprintf(fout,"\n\tshort soap_flag;"); - } - if (has_class(typ)) - { if (is_invisible(typ->id->name)) - fprintf(fout,"\n\ta = (%s)soap_class_id_enter(soap, \"\", a, %s, sizeof(%s), soap->type, soap->arrayType);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - else - fprintf(fout,"\n\ta = (%s)soap_class_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - } - else if (is_invisible(typ->id->name)) - fprintf(fout,"\n\ta = (%s)soap_id_enter(soap, \"\", a, %s, sizeof(%s), 0, NULL, NULL, NULL);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - else - fprintf(fout,"\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), 0, NULL, NULL, NULL);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); - /* fprintf(fout,"\n\tif (soap->alloced)"); */ - fprintf(fout,"\n\tsoap_default_%s(soap, a);",c_ident(typ)); - for (t = table; t; t = t->prev) - { for (p = t->list; p; p = p->next) - if (p->info.sto & Sattribute) - soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); - } - if (!is_invisible(typ->id->name)) - { if (!is_discriminant(typ)) - { fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{"); - fprintf(fout,"\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); - } - else - fprintf(fout,"\n\tif (!tag || *tag == '-' || (soap->body && !*soap->href))\n\t{"); - } - else if (!is_discriminant(typ)) - { if (table->prev || table->list) - fprintf(fout,"\n\t\tfor (soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); - } - a=0; - f=0; - for (t = table; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (p->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fout, "\n\t\t/* non-serializable %s skipped */", ident(p->sym->name)); - else if (is_transient(p->info.typ)) - fprintf(fout, "\n\t\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.sto & Sattribute) - ; - else if (is_repetition(p)) - { if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) - { p = p->next; - continue; - } - f=1; - fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); - fprintf(fout,"!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse)); - fprintf(fout,"\n\t\t\t{\tif (a->%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\t\t\tsoap_blist_%s = soap_new_block(soap);\n\t\t\t\t\ta->%s = (%s)soap_push_block(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) - fprintf(fout,"\n\t\t\t\t\tSOAP_PLACEMENT_NEW(a->%s, %s);", ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); - else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\t\tsoap_default_%s(soap, a->%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); - else - fprintf(fout,"\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); - fprintf(fout,"\n\t\t\t\t}"); - fprintf(fout,"\n\t\t\t\tsoap_revert(soap);"); - if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name)); - else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name)); - else - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); - fprintf(fout,"\n\t\t\t\t{\ta->%s++;\n\t\t\t\t\ta->%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(p->sym->name), ident(p->next->sym->name)); - p = p->next; - } - else if (is_anytype(p)) - { f=1; - fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); - fprintf(fout,"\n\t\t\t\tif ((a->%s = soap_getelement(soap, &a->%s)))", ident(p->next->sym->name), ident(p->sym->name)); - fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); - fprintf(fout,"\n\t\t\t\t\tcontinue;"); - fprintf(fout,"\n\t\t\t\t}"); - p = p->next; - } - else if (is_discriminant(typ) && p->next) - { f=1; - fprintf(fout,"\n\t\tif (!soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); - fprintf(fout,"\n\t\t\treturn NULL;"); - break; - } - else if (is_choice(p)) - { f=1; - fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); - fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); - fprintf(fout,"\n\t\t\t\t\tcontinue;"); - fprintf(fout,"\n\t\t\t\t}"); - p = p->next; - } - else - { f=1; - if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) - { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) - fprintf(fout,"\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); - else if (is_template(p->info.typ)) - fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); - else - fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); - } - if (is_unmatched(p->sym)) - { - if (is_XML(p->info.typ) && is_string(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, &a->%s))", ident(p->sym->name)); - } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, &a->%s))", ident(p->sym->name)); - } else if(p->info.typ->type==Tarray) { - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); - } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ)); - } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, NULL, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); - } - } - else if (!is_invisible(p->sym->name)) - { - if (is_XML(p->info.typ) && is_string(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name)); - } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name)); - } else if(p->info.typ->type==Tarray) { - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); - } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (a->%s.soap_in(soap, %s, \"%s\"))", ident(p->sym->name), field(p, nse),xsi_type(p->info.typ)); - } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, &a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); - } - } - if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) - { if (is_template(p->info.typ)) - fprintf(fout,"\n\t\t\t\t\tcontinue;"); - else - { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); - fprintf(fout,"\n\t\t\t\t\tcontinue;"); - fprintf(fout,"\n\t\t\t\t}"); - } - } - } - fflush(fout); - } - } - if (!is_discriminant(typ)) - { for (t = table; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (is_repetition(p) && (is_unmatched(p->next->sym) || (is_invisible(p->next->sym->name)))) - { f=1; - fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); - if (is_unmatched(p->next->sym)) - fprintf(fout,"!soap_element_begin_in(soap, NULL, 1, NULL))"); - else if (is_invisible(p->next->sym->name)) - fprintf(fout,"!soap_peek_element(soap))"); - fprintf(fout,"\n\t\t\t{\tif (a->%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\t\t\tsoap_blist_%s = soap_new_block(soap);\n\t\t\t\t\ta->%s = (%s)soap_push_block(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) - fprintf(fout,"\n\t\t\t\t\tSOAP_PLACEMENT_NEW(a->%s, %s);", ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); - else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\t\tsoap_default_%s(soap, a->%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); - else - fprintf(fout,"\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); - fprintf(fout,"\n\t\t\t\t}"); - if (!is_invisible(p->next->sym->name)) - fprintf(fout,"\n\t\t\t\tsoap_revert(soap);"); - if (is_unmatched(p->next->sym)) - { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, a->%s))", ident(p->next->sym->name)); - else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, a->%s))", ident(p->next->sym->name)); - else - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); - } - else - { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name)); - else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name)); - else - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); - } - fprintf(fout,"\n\t\t\t\t{\ta->%s++;\n\t\t\t\t\ta->%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(p->sym->name), ident(p->next->sym->name)); - p = p->next; - } - else if (is_repetition(p) || is_anytype(p) || is_choice(p)) - { p = p->next; - continue; - } - else if (is_invisible(p->sym->name) - && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) - { f=1; - if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) - fprintf(fout,"\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); - else if (is_template(p->info.typ)) - fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); - else - fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); - if (is_XML(p->info.typ) && is_string(p->info.typ)) - fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name)); - else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) - fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name)); - else if(p->info.typ->type==Tarray) - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse),ident(p->sym->name),xsi_type(p->info.typ)); - else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - fprintf(fout,"\n\t\t\t\tif (a->%s.soap_in(soap, %s, \"%s\"))", ident(p->sym->name), field(p, nse),xsi_type(p->info.typ)); - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, &a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse),ident(p->sym->name),xsi_type(p->info.typ)); - if (is_template(p->info.typ)) - fprintf(fout,"\n\t\t\t\t\tcontinue;"); - else - { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); - fprintf(fout,"\n\t\t\t\t\tcontinue;"); - fprintf(fout,"\n\t\t\t\t}"); - } - } - } - } - for (t = table; t; t = t->prev) - for (p = t->list; p; p = p->next) - if (p->info.sto & Sreturn) - if (nse || has_ns_eq(NULL, p->sym->name)) - fprintf(fout,"\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); - if (!f && is_invisible(typ->id->name)) - fprintf(fout,"\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); - if (!is_invisible(typ->id->name) || table->prev || table->list) - { fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); - if (!is_invisible(typ->id->name) || is_discriminant(typ)) - fprintf(fout,"\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); - else - fprintf(fout,"\n\t\t\t\tif (soap_flag)\n\t\t\t\t{\tsoap->error = SOAP_OK;\n\t\t\t\t\tbreak;\n\t\t\t\t}"); - if (!is_invisible(typ->id->name)) - fprintf(fout,"\n\t\t\tif (soap->error == SOAP_NO_TAG)"); - else - fprintf(fout,"\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); - fprintf(fout,"\n\t\t\t\tbreak;"); - fprintf(fout,"\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); - fprintf(fout,"\n\t\t}"); - } - } - if (table && !is_discriminant(typ)) - { for (p = table->list; p; p = p->next) - if (is_repetition(p)) - { fprintf(fout, "\n\t\tif (a->%s)\n\t\t\tsoap_pop_block(soap, soap_blist_%s);", ident(p->next->sym->name), ident(p->next->sym->name)); - fprintf(fout, "\n\t\tif (a->%s)\n\t\t\ta->%s = (%s)soap_save_block(soap, soap_blist_%s, NULL, 1);\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); - p = p->next; - } - } - if (!is_invisible(typ->id->name)) - { fprintf(fout,"\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); - fprintf(fout,"\n\t}\n\telse\n\t{\t"); - if (has_class(typ)) - fprintf(fout,"a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, 0, sizeof(%s), 0, soap_copy_%s);",c_type_id(typ, "*"), soap_type(typ), c_type(typ), c_ident(typ)); - else - fprintf(fout,"a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, 0, sizeof(%s), 0, NULL);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); - fprintf(fout, "\n\t}"); - } - a = 0; - if (table && !is_discriminant(typ)) - { for (p = table->list; p; p = p->next) - { if (p->info.minOccurs > 0 && p->info.maxOccurs >= 0 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_template(p->info.typ) && !is_repetition(p) && !is_choice(p) && p->info.hasval == False) - { if (is_item(p)) - continue; - if (is_anytype(p)) - p = p->next; - if (a==0) - { fprintf(fout,"\n\tif (%s(soap_flag_%s > " SOAP_LONG_FORMAT "", strict_check(), ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); - a=1; - } - else - fprintf(fout," || soap_flag_%s > " SOAP_LONG_FORMAT "", ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); - } - else if (is_template(p->info.typ)) - { if (p->info.minOccurs > 0) - { if (p->info.typ->type == Tpointer) - { if (a==0) - { fprintf(fout,"\n\tif (%s(!a->%s || a->%s->size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), ident(p->sym->name), p->info.minOccurs); - a=1; - } - else - fprintf(fout," || !a->%s || a->%s->size() < " SOAP_LONG_FORMAT, ident(p->sym->name), ident(p->sym->name), p->info.minOccurs); - } - else - { if (a==0) - { fprintf(fout,"\n\tif (%s(a->%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); - a=1; - } - else - fprintf(fout," || a->%s.size() < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); - } - } - if ( p->info.maxOccurs > 1) - { if (p->info.typ->type == Tpointer) - { if (a==0) - { fprintf(fout,"\n\tif (%s((a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", strict_check(), ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs); - a=1; - } - else - fprintf(fout," || (a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs); - } - else - { if (a==0) - { fprintf(fout,"\n\tif (%s(a->%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); - a=1; - } - else - fprintf(fout," || a->%s.size() > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); - } - } - } - else if (is_repetition(p)) - { if (p->info.minOccurs > 0) - { if (a==0) - { fprintf(fout,"\n\tif (%s(a->%s < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); - a=1; - } - else - fprintf(fout," || a->%s < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); - } - if (p->info.maxOccurs > 1) - { if (a==0) - { fprintf(fout,"\n\tif (%s(a->%s > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); - a=1; - } - else - fprintf(fout," || a->%s > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); - } - p = p->next; - } - else if (is_choice(p)) - { if (p->info.minOccurs != 0) - { if (a==0) - { fprintf(fout,"\n\tif (%s(soap_flag_%s", strict_check(), ident(p->next->sym->name)); - a=1; - } - else - fprintf(fout," || soap_flag_%s", ident(p->next->sym->name)); - } - p = p->next; - } - } - if (a) - fprintf(fout,"))\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;\n\t}"); - } - fprintf(fout, "\n\treturn a;\n}"); - } - break; - - case Tclass: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - if (!is_volatile(typ) && !is_typedef(typ)) - { fprintf(fout,"\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); - fprintf(fout,"\n{\treturn soap_in_%s(soap, tag, this, type);\n}",c_ident(typ)); - fflush(fout); - } - fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); - if (is_primclass(typ)) - { - fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); - fprintf(fout,"\n\tif (!(a = (%s)soap_class_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType)))\n\t{\tsoap->error = SOAP_TAG_MISMATCH;\n\t\treturn NULL;\n\t}", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - fprintf(fout,"\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); - fprintf(fout,"\n\tif (soap->alloced)"); - fprintf(fout,"\n\t{\ta->soap_default(soap);"); - fprintf(fout,"\n\t\tif (soap->clist->type != %s)", soap_type(typ)); - fprintf(fout,"\n\t\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); - fprintf(fout,"\n\t}"); - for (t = (Table*)typ->ref; t; t = t->prev) - { Entry *e = entry(classtable, t->sym); - char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; - for (p = t->list; p; p = p->next) - if (p->info.sto & Sattribute) - soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); - } - fflush(fout); - for (table = (Table*)typ->ref; table; table = table->prev) - { p = table->list; - if (p && is_item(p)) - break; - } - if (is_XML(p->info.typ) && is_string(p->info.typ)) - { fprintf(fout,"\n\tif (!soap_inliteral(soap, tag, &(a->%s::%s)))", ident(table->sym->name), ident(p->sym->name)); - } - else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) - { fprintf(fout,"\n\tif (!soap_inwliteral(soap, tag, &(a->%s::%s)))", ident(table->sym->name), ident(p->sym->name)); - } - else if(p->info.typ->type==Tarray) { - fprintf(fout,"\n\tif (!soap_in_%s(soap, tag, a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); - } - else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { - fprintf(fout,"\n\tif (!(a->%s::%s).soap_in(soap, tag, \"%s\"))", ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); - } - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { - fprintf(fout,"\n\tif (!soap_in_%s(soap, tag, &(a->%s::%s), \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); - } - fprintf(fout,"\n\t\treturn NULL;"); - if (has_getter(typ)) - fprintf(fout,"\n\tif (a->get(soap))\n\t\treturn NULL;"); - fprintf(fout,"\n\treturn a;\n}"); - } - else - { - if (!is_invisible(typ->id->name)) - { fprintf(fout,"\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 0, NULL))\n\t\treturn NULL;"); - fprintf(fout,"\n\ta = (%s)soap_class_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - } - else - fprintf(fout,"\n\ta = (%s)soap_class_id_enter(soap, \"\", a, %s, sizeof(%s), soap->type, soap->arrayType);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); - if (!is_discriminant(typ)) - { fprintf(fout,"\n\tif (soap->alloced)"); - if (is_volatile(typ) || is_typedef(typ)) - fprintf(fout,"\n\t{\tsoap_default_%s(soap, a);",c_ident(typ)); - else - fprintf(fout,"\n\t{\ta->soap_default(soap);"); - if (!is_invisible(typ->id->name)) - { fprintf(fout,"\n\t\tif (soap->clist->type != %s)", soap_type(typ)); - fprintf(fout,"\n\t\t{\tsoap_revert(soap);"); - fprintf(fout,"\n\t\t\t*soap->id = '\\0';"); - if (is_volatile(typ) || is_typedef(typ)) - fprintf(fout,"\n\t\t\treturn soap_in_%s(soap, tag, a, type);", c_ident(typ)); - else - fprintf(fout,"\n\t\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); - fprintf(fout,"\n\t\t}"); - } - fprintf(fout,"\n\t}"); - } - else - fprintf(fout,"\n\ta->soap_default(soap);"); - table=(Table *)typ->ref; - for (t = table; t; t = t->prev) - { Entry *e = entry(classtable, t->sym); - char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; - for (p = t->list; p; p = p->next) - if (p->info.sto & Sattribute) - soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); - } - fflush(fout); - - i=0; - if (!is_discriminant(typ)) - { for (t = table; t; t = t->prev) - i++; - a=0; - for (; i > 0; i--) - { t = table; - for (j = 0; j < i-1; j++) - t = t->prev; - for (p = t->list; p; p = p->next) - { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_template(p->info.typ)) - { if (is_anytype(p) || is_choice(p)) - p = p->next; - if (is_repetition(p)) - { fprintf(fout,"\n\tstruct soap_blist *soap_blist_%s%d = NULL;", ident(p->next->sym->name), i); - p = p->next; - } - else - fprintf(fout,"\n\tsize_t soap_flag_%s%d = " SOAP_LONG_FORMAT ";", ident(p->sym->name), i, p->info.maxOccurs); - } - } - } - if (a) - fprintf(fout,";"); - } - fflush(fout); - if (!is_invisible(typ->id->name)) - { if (!is_discriminant(typ)) - { fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{"); - fprintf(fout,"\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); - } - else - fprintf(fout,"\n\tif (!tag || *tag == '-' || (soap->body && !*soap->href))\n\t{"); - } - else if (!is_discriminant(typ)) - { if (table->prev || table->list) - fprintf(fout,"\n\t\tfor (short soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); - } - table=(Table *)typ->ref; - a=0; - i=0; - f=0; - for (t = table; t; t = t->prev) - i++; - for (; i > 0; i--) - { Entry *e; - char *nse1; - t = table; - for (j = 0; j < i-1; j++) - t = t->prev; - e = entry(classtable, t->sym); - nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; - for (p = t->list; p; p = p->next) - { if (is_item(p)) - ; - else if (p->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fout, "\n\t\t\t/* non-serializable %s skipped */", ident(p->sym->name)); - else if (is_transient(p->info.typ)) - fprintf(fout, "\n\t\t\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.sto & Sattribute) - ; - else if (is_repetition(p)) - { - if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) - { p = p->next; - continue; - } - f=1; - fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); - fprintf(fout,"!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse1)); - fprintf(fout,"\n\t\t\t{\tif (a->%s::%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s%d == NULL)\n\t\t\t\t\t\tsoap_blist_%s%d = soap_new_block(soap);\n\t\t\t\t\ta->%s::%s = (%s)soap_push_block(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) - fprintf(fout,"\n\t\t\t\t\tSOAP_PLACEMENT_NEW(a->%s::%s, %s);", ident(t->sym->name), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); - else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\t\tsoap_default_%s(soap, a->%s::%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); - else - fprintf(fout,"\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); - fprintf(fout,"\n\t\t\t\t}"); - fprintf(fout,"\n\t\t\t\tsoap_revert(soap);"); - if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); - else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); - else - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); - fprintf(fout,"\n\t\t\t\t{\ta->%s::%s++;\n\t\t\t\t\ta->%s::%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); - p = p->next; - } - else if (is_anytype(p)) - { f=1; - fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name), i); - fprintf(fout,"\n\t\t\t\tif ((a->%s::%s = soap_getelement(soap, &a->%s::%s)))", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); - fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); - fprintf(fout,"\n\t\t\t\t\tcontinue;"); - fprintf(fout,"\n\t\t\t\t}"); - p = p->next; - } - else if (is_discriminant(typ) && p->next) - { f=1; - fprintf(fout,"\n\t\tif (!soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); - fprintf(fout,"\n\t\t\treturn NULL;"); - i = 0; - break; - } - else if (is_choice(p)) - { f=1; - fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)",ident(p->next->sym->name),i); - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, &a->%s::%s, &a->%s::%s))", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); - fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); - fprintf(fout,"\n\t\t\t\t\tcontinue;"); - fprintf(fout,"\n\t\t\t\t}"); - p = p->next; - } - else - { f=1; - if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) - { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) - fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))",ident(p->sym->name), i); - else if (is_template(p->info.typ)) - fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); - else - fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)",ident(p->sym->name), i); - } - if (is_unmatched(p->sym)) - { - if (is_XML(p->info.typ) && is_string(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, &(a->%s::%s)))", ident(t->sym->name), ident(p->sym->name)); - } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, &(a->%s::%s)))", ident(t->sym->name), ident(p->sym->name)); - } - else if(p->info.typ->type==Tarray) { - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s::%s, \"%s\"))", c_ident(p->info.typ),ident(t->sym->name),ident(p->sym->name),xsi_type(p->info.typ)); - } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif ((a->%s::%s).soap_in(soap, NULL, \"%s\"))", ident(t->sym->name),ident(p->sym->name),xsi_type(p->info.typ)); - } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, NULL, &(a->%s::%s), \"%s\"))", c_ident(p->info.typ),ident(t->sym->name),ident(p->sym->name),xsi_type(p->info.typ)); - } - } - else if (!is_invisible(p->sym->name)) - { - if (is_XML(p->info.typ) && is_string(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, &(a->%s::%s)))", field_overridden(t, p, nse1), ident(t->sym->name),ident(p->sym->name)); - } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, &(a->%s::%s)))", field_overridden(t, p, nse1), ident(t->sym->name),ident(p->sym->name)); - } - else if(p->info.typ->type==Tarray) { - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1),ident(t->sym->name),ident(p->sym->name),xsi_type(p->info.typ)); - } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif ((a->%s::%s).soap_in(soap, %s, \"%s\"))", ident(t->sym->name),ident(p->sym->name), field_overridden(t, p, nse1),xsi_type(p->info.typ)); - } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, &(a->%s::%s), \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1),ident(t->sym->name),ident(p->sym->name),xsi_type(p->info.typ)); - } - } - if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) - { if (is_template(p->info.typ)) - fprintf(fout,"\n\t\t\t\t\tcontinue;"); - else - { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); - fprintf(fout,"\n\t\t\t\t\tcontinue;"); - fprintf(fout,"\n\t\t\t\t}"); - } - } - fflush(fout); - } - } - } - if (!is_discriminant(typ)) - { - Entry *e; - char *nse1; - i=0; - for (t = table; t; t = t->prev) - { i++; - e = entry(classtable, t->sym); - nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; - for (p = t->list; p; p = p->next) - { if (is_repetition(p) && (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name))) - { f=1; - fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); - if (is_unmatched(p->next->sym)) - fprintf(fout,"!soap_element_begin_in(soap, NULL, 1, NULL))"); - else if (is_invisible(p->next->sym->name)) - fprintf(fout,"!soap_peek_element(soap))"); - fprintf(fout,"\n\t\t\t{\tif (a->%s::%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s%d == NULL)\n\t\t\t\t\t\tsoap_blist_%s%d = soap_new_block(soap);\n\t\t\t\t\ta->%s::%s = (%s)soap_push_block(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) - fprintf(fout,"\n\t\t\t\t\tSOAP_PLACEMENT_NEW(a->%s::%s, %s);", ident(t->sym->name), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref)); - if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); - else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\t\tsoap_default_%s(soap, a->%s::%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); - else - fprintf(fout,"\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); - fprintf(fout,"\n\t\t\t\t}"); - if (!is_invisible(p->next->sym->name)) - fprintf(fout,"\n\t\t\t\tsoap_revert(soap);"); - if (is_unmatched(p->next->sym)) - { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); - else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); - else - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); - } - else - { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); - else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); - else - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); - } - fprintf(fout,"\n\t\t\t\t{\ta->%s::%s++;\n\t\t\t\t\ta->%s::%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); - p = p->next; - } - else if (is_repetition(p) || is_anytype(p) || is_choice(p)) - { p = p->next; - continue; - } - else if (is_invisible(p->sym->name) - && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) - { f=1; - if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) - fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))",ident(p->sym->name), i); - else if (is_template(p->info.typ)) - fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); - else - fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)",ident(p->sym->name), i); - if (is_XML(p->info.typ) && is_string(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, &(a->%s::%s)))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); - } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, &(a->%s::%s)))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); - } - else if(p->info.typ->type==Tarray) { - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident(p->info.typ),field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name) ,xsi_type(p->info.typ)); - } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif ((a->%s::%s).soap_in(soap, %s, \"%s\"))", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1),xsi_type(p->info.typ)); - } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { - fprintf(fout,"\n\t\t\t\tif (soap_in_%s(soap, %s, &(a->%s::%s), \"%s\"))", c_ident(p->info.typ),field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name) ,xsi_type(p->info.typ)); - } - if (is_template(p->info.typ)) - fprintf(fout,"\n\t\t\t\t\tcontinue;"); - else - { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); - fprintf(fout,"\n\t\t\t\t\tcontinue;"); - fprintf(fout,"\n\t\t\t\t}"); - } - } - } - } - for (t = table; t; t = t->prev) - for (p = t->list; p; p = p->next) - if (p->info.sto & Sreturn) - if (nse || has_ns_eq(NULL, p->sym->name)) - fprintf(fout,"\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); - if (!f && is_invisible(typ->id->name)) - fprintf(fout,"\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); - if (!is_invisible(typ->id->name) || table->prev || table->list) - { fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); - if (!is_invisible(typ->id->name) || is_discriminant(typ)) - fprintf(fout,"\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); - else - fprintf(fout,"\n\t\t\t\tif (soap_flag)\n\t\t\t\t{\n\t\t\t\t\tsoap->error = SOAP_OK;\n\t\t\t\t\tbreak;\n\t\t\t\t}"); - if (!is_invisible(typ->id->name)) - fprintf(fout,"\n\t\t\tif (soap->error == SOAP_NO_TAG)"); - else - fprintf(fout,"\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); - fprintf(fout,"\n\t\t\t\tbreak;"); - fprintf(fout,"\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); - fprintf(fout,"\n\t\t}"); - } - } - if (!is_discriminant(typ)) - { i=0; - for (t = table; t; t = t->prev) - i++; - for (; i > 0; i--) - { t = table; - for (j = 0; j < i-1; j++) - t = t->prev; - for (p = t->list; p; p = p->next) - { if (is_repetition(p)) - { fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t\tsoap_pop_block(soap, soap_blist_%s%d);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i); - fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t\ta->%s::%s = (%s)soap_save_block(soap, soap_blist_%s%d, NULL, 1);\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); - p = p->next; - } - } - } - } - if (has_getter(typ)) - fprintf(fout,"\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); - if (!is_invisible(typ->id->name)) - { fprintf(fout, "\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); - fprintf(fout,"\n\t}\n\telse\n\t{"); - fprintf(fout,"\ta = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, 0, sizeof(%s), 0, soap_copy_%s);",c_type_id(typ, "*"), soap_type(typ), c_type(typ), c_ident(typ)); - fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); - fprintf(fout, "\n\t}"); - } - if (!is_discriminant(typ)) - { a=0; - i = 0; - for (t = table; t; t = t->prev) - i++; - for (; i > 0; i--) - { t = table; - for (j = 0; j < i-1; j++) - t = t->prev; - for (p = t->list; p; p = p->next) - { if (p->info.minOccurs > 0 && p->info.maxOccurs >= 0 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_template(p->info.typ) && !is_repetition(p) && !is_choice(p) && p->info.hasval == False) - { if (is_item(p)) - continue; - if (is_anytype(p)) - p = p->next; - if (a==0) - { fprintf(fout,"\n\tif (%s(soap_flag_%s%d > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs); - a=1; - } - else - fprintf(fout," || soap_flag_%s%d > " SOAP_LONG_FORMAT, ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs); - } - else if (is_template(p->info.typ)) - { if (p->info.minOccurs > 0) - { if (p->info.typ->type == Tpointer) - { if (a==0) - { fprintf(fout,"\n\tif (%s(!a->%s::%s || a->%s::%s->size() < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); - a=1; - } - else - fprintf(fout," || !a->%s::%s || a->%s::%s->size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); - } - else - { if (a==0) - { fprintf(fout,"\n\tif (%s(a->%s::%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); - a=1; - } - else - fprintf(fout," || a->%s::%s.size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); - } - } - if ( p->info.maxOccurs > 1) - { if (p->info.typ->type == Tpointer) - { if (a==0) - { fprintf(fout,"\n\tif (%s((a->%s::%s && a->%s::%s->size() > " SOAP_LONG_FORMAT ")", strict_check(), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); - a=1; - } - else - fprintf(fout," || (a->%s::%s && a->%s::%s->size() > " SOAP_LONG_FORMAT ")", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); - } - else - { if (a==0) - { fprintf(fout,"\n\tif (%s(a->%s::%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); - a=1; - } - else - fprintf(fout," || a->%s::%s.size() > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); - } - } - } - else if (is_repetition(p)) - { if (p->info.minOccurs > 0) - { if (a==0) - { fprintf(fout,"\n\tif (%s(a->%s::%s < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); - a=1; - } - else - fprintf(fout," || a->%s::%s < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); - } - if (p->info.maxOccurs > 1) - { if (a==0) - { fprintf(fout,"\n\tif (%s(a->%s::%s > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); - a=1; - } - else - fprintf(fout," || a->%s::%s > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); - } - p = p->next; - } - else if (is_choice(p)) - { if (p->info.minOccurs != 0) - { if (a==0) - { fprintf(fout,"\n\tif (%s(soap_flag_%s%d", strict_check(), ident(p->next->sym->name), i); - a=1; - } - else - fprintf(fout," || soap_flag_%s%d", ident(p->next->sym->name), i); - } - p = p->next; - } - } - } - if (a) - fprintf(fout,"))\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;\n\t}"); - } - fprintf(fout,"\n\treturn a;\n}"); - } - - break; - - case Tunion: - if (is_external(typ)) - { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, int*, %s);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, int*, %s);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, int *choice, %s)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); - fprintf(fout, "\tsoap->error = SOAP_TAG_MISMATCH;"); - table = (Table *)typ->ref; - for (p = table->list; p; p = p->next) - { if (p->info.sto & (Sconst | Sprivate | Sprotected)) - fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); - else if (is_transient(p->info.typ)) - fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); - else if (p->info.sto & Sattribute) - ; - else if (is_repetition(p)) - ; - else if (is_anytype(p)) - ; - else if (!is_invisible(p->sym->name)) - { if (is_unmatched(p->sym)) - { if (is_XML(p->info.typ) && is_string(p->info.typ)) - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, NULL, &a->%s))", ident(p->sym->name)); - else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, NULL, &a->%s))", ident(p->sym->name)); - else if (p->info.typ->type == Tarray) - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident(p->info.typ),ident(p->sym->name),xsi_type(p->info.typ)); - else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ)); - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) - { if (p->info.typ->type == Tpointer) - fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, NULL, &a->%s, \"%s\"))", c_ident(p->info.typ),ident(p->sym->name),xsi_type(p->info.typ)); - } - } - else - { if (is_XML(p->info.typ) && is_string(p->info.typ)) - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name)); - else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name)); - else if (p->info.typ->type == Tarray) - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", a->%s, \"%s\"))", c_ident(p->info.typ),ns_add(p, nse),ident(p->sym->name),xsi_type(p->info.typ)); - else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", \"%s\"))", ident(p->sym->name),ns_add(p, nse),xsi_type(p->info.typ)); - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) - { if (p->info.typ->type == Tpointer) - fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", &a->%s, \"%s\"))", c_ident(p->info.typ),ns_add(p, nse),ident(p->sym->name),xsi_type(p->info.typ)); - } - } - fprintf(fout, "\n\t{\t*choice = SOAP_UNION_%s_%s;", c_ident(typ), ident(p->sym->name)); - fprintf(fout, "\n\t\treturn a;"); - fprintf(fout, "\n\t}"); - fflush(fout); - } - } - table = (Table *)typ->ref; - for (p = table->list; p; p = p->next) - { if (p->info.sto & (Sconst | Sprivate | Sprotected)) - ; - else if (is_transient(p->info.typ)) - ; - else if (p->info.sto & Sattribute) - ; - else if (is_repetition(p)) - ; - else if (is_anytype(p)) - ; - else if (is_invisible(p->sym->name)) - { if (is_XML(p->info.typ) && is_string(p->info.typ)) - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name)); - else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name)); - else if (p->info.typ->type == Tarray) - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", a->%s, NULL))", c_ident(p->info.typ),ns_add(p, nse),ident(p->sym->name)); - else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", NULL))", ident(p->sym->name),ns_add(p, nse)); - else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) - { if (p->info.typ->type == Tpointer) - fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); - fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", &a->%s, NULL))", c_ident(p->info.typ),ns_add(p, nse),ident(p->sym->name)); - } - fprintf(fout, "\n\t{\t*choice = SOAP_UNION_%s_%s;", c_ident(typ), ident(p->sym->name)); - fprintf(fout, "\n\t\treturn a;"); - fprintf(fout, "\n\t}"); - fflush(fout); - } - } - fprintf(fout, "\n\t*choice = -1;\n\tif (!soap->error)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}"); - break; - - case Tpointer: - - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); - fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 1, NULL))"); - fprintf(fout,"\n\t\treturn NULL;"); - - if (is_template(typ)) - { fprintf(fout,"\n\tsoap_revert(soap);"); - fprintf(fout,"\n\tif (!a)\n\t{\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;\n\t\t*a = NULL;\n\t}", c_type_id(typ, "*"), c_type(typ)); - fprintf(fout,"\n\tif (!(*a = soap_in_%s(soap, tag, *a, type)))\n\t\treturn NULL;", c_ident((Tnode*)typ->ref)); - fprintf(fout,"\n\treturn a;\n}"); - } - else if(((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) - { - fprintf(fout,"\n\tif (!a)\n\t\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ)); - fprintf(fout,"\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); - fprintf(fout,"\n\t{\tsoap_revert(soap);"); - fprintf(fout, "\n\t\tif (!(*a = (%s)soap_instantiate_%s(soap, -1, soap->type, soap->arrayType, NULL)))", c_type(typ), c_ident((Tnode*)typ->ref)); - fprintf(fout, "\n\t\t\treturn NULL;"); - fprintf(fout, "\n\t\t(*a)->soap_default(soap);"); - fprintf(fout, "\n\t\tif (!(*a)->soap_in(soap, tag, NULL))"); - fprintf(fout, "\n\t\t\treturn NULL;"); - fprintf(fout,"\n\t}\n\telse\n\t{\t%s p = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), %d);", c_type_id(typ, "*"), c_type_id(typ, "*"), soap_type((Tnode*)typ->ref), c_type((Tnode*)typ->ref), reflevel((Tnode*)typ->ref) ); - if (((Tnode*)typ->ref)->type == Tclass) - { table = (Table*)((Tnode*)typ->ref)->ref; - for (p = classtable->list; p; p = p->next) - { if (p->info.typ->type == Tclass) - { Table *q = (Table*)p->info.typ->ref; - if (q) - for (q = q->prev; q; q = q->prev) - if (q == table) - fprintf(fout, "\n\t\tif (!p && soap->error == SOAP_HREF)\n\t\t{\tsoap->error = SOAP_OK;\n\t\t\tp = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), 0);\n\t\t}", c_type_id(typ, "*"), soap_type(p->info.typ), c_type(p->info.typ)); - } - } - } - fprintf(fout,"\n\t\ta = p;"); - fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); - fprintf(fout,"\n\t}\n\treturn a;\n}"); - } - else - { - fprintf(fout,"\n\tif (!a)\n\t\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ)); - fprintf(fout,"\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); - fprintf(fout,"\n\t{\tsoap_revert(soap);"); - fprintf(fout,"\n\t\tif (!(*a = soap_in_%s(soap, tag, *a, type)))", c_ident((Tnode*)typ->ref)); - fprintf(fout,"\n\t\t\treturn NULL;"); - - fprintf(fout,"\n\t}\n\telse\n\t{\ta = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), %d);", c_type_id(typ, "*"), soap_type((Tnode*)typ->ref), c_type((Tnode*)typ->ref), reflevel((Tnode*)typ->ref) ); - fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); - fprintf(fout,"\n\t}\n\treturn a;\n}"); - } - - break; - - case Tarray: - temp = typ; - while(temp->type == Tarray){ - temp = (Tnode*)temp->ref; - } - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);",c_type_id(temp, "*"),c_ident(typ),c_type(typ)); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);",c_type_id(temp, "*"),c_ident(typ),c_type(typ)); - fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{",c_type_id(temp, "*"),c_ident(typ),c_type_id(typ, "a")); - fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); - fprintf(fout,"\n\t\treturn NULL;"); - fprintf(fout,"\n\tif (soap_match_array(soap, type))"); - fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); - fprintf(fout,"\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), 0, NULL, NULL, NULL);", c_type_id((Tnode*)typ->ref, "(*)"), soap_type(typ), c_type(typ)); - fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); - fprintf(fout,"\n\tsoap_default_%s(soap, a);",c_ident(typ)); - fprintf(fout,"\n\tif (soap->body && !*soap->href)"); - total=get_dimension(typ); - n=(Tnode*)typ->ref; - cardinality = 1; - while(n->type==Tarray) - { - total=total*get_dimension(n); - n = (Tnode*)n->ref; - cardinality++; - } - fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)",get_dimension(typ)); - fprintf(fout,"\n\t\t{\tsoap_peek_element(soap);\n\t\t\tif (soap->position)\n\t\t\t{\ti = soap->positions[0];\n\t\t\t\tif (i < 0 || i >= %d)\n\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t}", get_dimension(typ)); - fprintf(fout,"\n\t\t\tif (!soap_in_%s(soap, NULL, a", c_ident((Tnode*)typ->ref)); - - if(cardinality > 1){ - fprintf(fout,"[i]"); - }else { - fprintf(fout,"+i"); - } - fprintf(fout,", \"%s\"))", xsi_type((Tnode*)typ->ref)); - fprintf(fout,"\n\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\treturn NULL;"); - fprintf(fout,"\n\t\t\t\tsoap->error = SOAP_OK;"); - fprintf(fout,"\n\t\t\t\tbreak;"); - fprintf(fout,"\n\t\t\t}"); - fprintf(fout,"\n\t\t}"); - fprintf(fout,"\n\t\tif (soap->mode & SOAP_C_NOIOB)\n\t\t\twhile (soap_element_end_in(soap, tag) == SOAP_SYNTAX_ERROR)\n\t\t\t{\tsoap->peeked = 1;\n\t\t\t\tsoap_ignore_element(soap);\n\t\t\t}"); - fprintf(fout,"\n\t\telse if (soap_element_end_in(soap, tag))\n\t\t{\tif (soap->error == SOAP_SYNTAX_ERROR)\n\t\t\t\tsoap->error = SOAP_IOB;\n\t\t\treturn NULL;\n\t\t}"); - fprintf(fout,"\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), 0, NULL, NULL, NULL), 0, %s, 0, sizeof(%s), 0, NULL);", c_type_id((Tnode*)typ->ref, "(*)"), soap_type(typ), c_type(typ), soap_type(typ), c_type(typ)); - fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); - fprintf(fout,"\n\t}\n\treturn (%s)a;\n}", c_type_id(temp, "*")); - break; - - case Tenum: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);",c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);",c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - fprintf(fhead,"\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);",c_ident(typ),c_type_id(typ, "*")); - fprintf(fout,"\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap *soap, const char *s, %s)\n{",c_ident(typ),c_type_id(typ, "*a")); - if (is_typedef(typ)) - fprintf(fout, "\n\treturn soap_s2%s(soap, s, a);\n}", t_ident(typ)); - else if (!is_mask(typ)) - { fprintf(fout, "\n\tconst struct soap_code_map *map;"); - t = (Table*)typ->ref; - if (t && t->list && has_ns_eq(NULL, ns_remove1(t->list->sym->name))) - { fprintf(fout, "\n\tchar *t;"); - fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); - fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld);", minlen(typ), maxlen(typ)); - fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, t);", c_ident(typ)); - } - else - { fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); - fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, s);", c_ident(typ)); - } - min = 0; - max = 0; - for (t = (Table*)typ->ref; t; t = t->prev) - { for (p = t->list; p; p = p->next) - { if (p->info.val.i < min) - min = (unsigned long)p->info.val.i; - if (p->info.val.i > max) - max = (unsigned long)p->info.val.i; - } - } - if (is_boolean(typ)) - fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)(map->code != 0);\n\telse\n\t{\tlong n;\n\t\tif (soap_s2long(soap, s, &n) || n < 0 || n > 1)\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)(n != 0);\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), c_type(typ)); - else if (sflag) - fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse\n\t\treturn soap->error = SOAP_TYPE;\n\treturn SOAP_OK;\n}", c_type(typ)); - else - fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse\n\t{\tlong n;\n\t\tif (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < %ld || n > %ld)))\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)n;\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), min, max, c_type(typ)); - } - else - { t = (Table*)typ->ref; - if (t && t->list && has_ns_eq(NULL, ns_remove1(t->list->sym->name))) - { fprintf(fout, "\n\tchar *t;"); - fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld);", minlen(typ), maxlen(typ)); - fprintf(fout, "\n\t*a = (%s)soap_code_bits(soap_codes_%s, t);", c_type(typ), c_ident(typ)); - } - else - fprintf(fout, "\n\t*a = (%s)soap_code_bits(soap_codes_%s, s);", c_type(typ), c_ident(typ)); - fprintf(fout, "\n\treturn SOAP_OK;\n}"); - } - fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{",c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); - if (is_boolean(typ)) - { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); - fprintf(fout,"\n\t\treturn NULL;"); - fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":boolean\"))"); - fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); - } - else if (typ->sym) - { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); - fprintf(fout,"\n\t\treturn NULL;"); - fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \"%s\"))", base_type(typ, "")); - fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); - } - else - { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, type))"); - fprintf(fout,"\n\t\treturn NULL;"); - } - fprintf(fout,"\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), 0, NULL, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); - fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{"); - fprintf(fout,"\tif (!a || soap_s2%s(soap, soap_value(soap), a) || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;", c_ident(typ)); - fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, 0, sizeof(%s), 0, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); - fprintf(fout,"\n\t}\n\treturn a;\n}"); - break; - - case Ttemplate: - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - return; - } - if (is_typedef(typ)) - { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); - n = (Tnode*)typ->ref; - fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); - fprintf(fout, "\n\tshort soap_flag;"); - fprintf(fout, "\n\tfor (soap_flag = 0;; soap_flag = 1)\n\t{\t%s;", c_type_id(n, "n")); - fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\t\t\tbreak;\n\t\t\tsoap_revert(soap);\n\t\t}\n\t\t"); - if (n->type == Tpointer) - fprintf(fout,"n = NULL;"); - else if (n->type == Tarray) - fprintf(fout,"soap_default_%s(soap, &n);", c_ident(n)); - else if (n->type==Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) - fprintf(fout,"n.soap_default(soap);"); - else if (n->type != Tfun && !is_void(n) && !is_XML(n)) - fprintf(fout,"soap_default_%s(soap, &n);", c_ident(n)); - fprintf(fout, "\n\t\tif (tag && *tag != '-' && (*soap->id || *soap->href))"); - fprintf(fout, "\n\t\t{\tif (!soap_container_id_forward(soap, *soap->id?soap->id:soap->href, a, (size_t)a->size(), %s, %s, sizeof(%s), %d))\n\t\t\t\tbreak;\n\t\t\t", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n)); - if (is_XML(n) && is_string(n)) - fprintf(fout, "if (!soap_inliteral(soap, tag, NULL))"); - else if (is_XML(n) && is_wstring(n)) - fprintf(fout, "if (!soap_inwliteral(soap, tag, NULL))"); - else if (n->type==Tarray) - fprintf(fout, "if (!soap_in_%s(soap, tag, NULL, \"%s\"))", c_ident(n),xsi_type(n)); - else if (n->type != Tfun && !is_void(n)) - fprintf(fout, "if (!soap_in_%s(soap, tag, NULL, \"%s\"))", c_ident(n),xsi_type(n)); - fprintf(fout, "\n\t\t\t\tbreak;\n\t\t}\n\t\telse "); - if (is_XML(n) && is_string(n)) - fprintf(fout, "if (!soap_inliteral(soap, tag, &n))"); - else if (is_XML(n) && is_wstring(n)) - fprintf(fout, "if (!soap_inwliteral(soap, tag, &n))"); - else if (n->type==Tarray) - fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n),xsi_type(n)); - else if (n->type != Tfun && !is_void(n)) - fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n),xsi_type(n)); - fprintf(fout, "\n\t\t\tbreak;"); - fprintf(fout, "\n\t\tif (!a && !(a = soap_new_%s(soap, -1)))\n\t\t\treturn NULL;", c_ident(typ)); - if ((!strcmp(typ->id->name, "std::vector") || !strcmp(typ->id->name, "std::deque")) && (is_primitive(n) || n->type == Tpointer)) - fprintf(fout, "\n\t\ta->push_back(n);"); - else - { - if (is_primitive(n) || n->type == Tpointer) - fprintf(fout, "\n\t\ta->insert(a->end(), n);"); - else - fprintf(fout, "\n\t\tsoap_update_pointers(soap, (char*)&n, (char*)&n + sizeof(n), (char*)&(*a->insert(a->end(), n)), (char*)&n);"); - } - fprintf(fout, "\n\t\tif (!tag || *tag == '-')\n\t\t\treturn a;\n\t}\n\tif (soap_flag && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))\n\t{\tsoap->error = SOAP_OK;\n\t\treturn a;\n\t}\n\treturn NULL;\n}"); - break; - default: break; - } - fflush(fout); -} - - -void -soap_in_Darray(Tnode *typ) -{ int i, j, d; - Entry *p; - Table *t, *table; - char *nsa = ns_qualifiedAttribute(typ); - - table=(Table *)typ->ref; - p = is_dynamic_array(typ); - d = get_Darraydims(typ); - - if (is_external(typ)) - { fprintf(fhead,"\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - return; - } - fprintf(fhead,"\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*")); - if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) - { fprintf(fout,"\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); - fprintf(fout,"\n{\treturn soap_in_%s(soap, tag, this, type);\n}", c_ident(typ)); - } - fflush(fout); - fprintf(fout,"\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)", c_type_id(typ, "*"),c_ident(typ),c_type_id(typ, "*a")); - if ((has_ns(typ) || is_untyped(typ)) && is_binary(typ)) - fprintf(fout,"\n{\n\t(void)type; /* appease -Wall -Werror */"); - else if (d) - fprintf(fout,"\n{\tint i, j, n;\n\t%s;", c_type_id(p->info.typ, "p")); - else - fprintf(fout,"\n{\tint i, j;\n\t%s;", c_type_id(p->info.typ, "p")); - fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); - if (has_ns(typ) || is_untyped(typ)) - { if (is_hexBinary(typ)) - fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":hexBinary\"))"); - else if (is_binary(typ)) - fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":base64Binary\") && soap_match_tag(soap, soap->type, \":base64\"))"); - else - fprintf(fout,"\n\tif (*soap->type && soap_match_array(soap, \"%s\") && soap_match_tag(soap, soap->type, type))", xsi_type((Tnode*)p->info.typ->ref)); - } - else - fprintf(fout,"\n\tif (soap_match_array(soap, type))"); - fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); - if (typ->type == Tclass) - { fprintf(fout,"\n\ta = (%s)soap_class_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); - fprintf(fout,"\n\tif (soap->alloced)\n\t\ta->soap_default(soap);"); - for (t = (Table*)typ->ref; t; t = t->prev) - { for (p = t->list; p; p = p->next) - if (p->info.sto & Sattribute) - soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); - } - } - else - { fprintf(fout,"\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), 0, NULL, NULL, NULL);",c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;"); - /*fprintf(fout,"\n\tif (soap->alloced)");*/ - fprintf(fout,"\n\tsoap_default_%s(soap, a);", c_ident(typ)); - for (t = (Table*)typ->ref; t; t = t->prev) - { for (p = t->list; p; p = p->next) - if (p->info.sto & Sattribute) - soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); - } - } - fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{"); - p = is_dynamic_array(typ); - if ((has_ns(typ) || is_untyped(typ)) && is_binary(typ)) - { if (is_hexBinary(typ)) - fprintf(fout,"\n\t\ta->__ptr = soap_gethex(soap, &a->__size);"); - else - { fprintf(fout,"\n\t\ta->__ptr = soap_getbase64(soap, &a->__size, 0);"); - if (is_attachment(typ)) - fprintf(fout,"\n#ifndef WITH_LEANER\n\t\tif (soap_xop_forward(soap, &a->__ptr, &a->__size, &a->id, &a->type, &a->options))\n\t\t\treturn NULL;\n#endif"); - } - fprintf(fout,"\n\t\tif ((!a->__ptr && soap->error) || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); - } - else - { if (d) - { fprintf(fout,"\n\t\tn = soap_getsizes(soap->arraySize, a->__size, %d);", d); - if (has_offset(typ)) - fprintf(fout,"\n\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, a->__offset, %d);", d); - else - fprintf(fout,"\n\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, NULL, %d);", d); - if (p->info.minOccurs > 0) - fprintf(fout,"\n\t\tif (%sn >= 0 && n < " SOAP_LONG_FORMAT ")\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}", strict_check(), p->info.minOccurs); - if (p->info.maxOccurs > 1) - fprintf(fout,"\n\t\tif (%sn > " SOAP_LONG_FORMAT ")\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}", strict_check(), p->info.maxOccurs); - fprintf(fout,"\n\t\tif (n >= 0)"); - if (((Tnode*)p->info.typ->ref)->type == Tclass - || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) - { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); - if (!is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref) && ((Tnode*)p->info.typ->ref)->type == Tclass) - fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\t(a->%s+i)->%s::soap_default(soap);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); - else if (((Tnode*)p->info.typ->ref)->type == Tpointer) - fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); - } - else if (has_class((Tnode*)p->info.typ->ref)) - { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); - fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); - } - else - { fprintf(fout,"\n\t\t{\ta->%s = (%s)soap_malloc(soap, n*sizeof(%s));", ident(p->sym->name), c_type_id((Tnode*)p->info.typ->ref, "*"), c_type((Tnode*)p->info.typ->ref)); - if (((Tnode*)p->info.typ->ref)->type == Tpointer) - fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); - else if (!is_XML((Tnode*)p->info.typ->ref)) - fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); - } - fprintf(fout,"\n\t\t\tfor (i = 0; i < n; i++)"); - fprintf(fout,"\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position == %d)", d); - fprintf(fout,"\n\t\t\t\t{\ti = "); - for (i = 0; i < d; i++) - { fprintf(fout,"soap->positions[%d]", i); - for (j = 1; j < d-i; j++) - fprintf(fout,"*a->__size[%d]", j); - if (i < d-1) - fprintf(fout,"+"); - } - fprintf(fout,"-j;"); - fprintf(fout,"\n\t\t\t\t\tif (i < 0 || i >= n)\n\t\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t}"); - fprintf(fout,"\n\t\t\t\tif (!soap_in_%s(soap, NULL, a->%s + i, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); - fprintf(fout,"\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); - fprintf(fout,"\n\t\t\t\t\tsoap->error = SOAP_OK;"); - fprintf(fout,"\n\t\t\t\t\tbreak;"); - fprintf(fout,"\n\t\t\t\t}"); - } - else - { fprintf(fout,"\n\t\ta->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j);"); - if (has_offset(typ) && (p->next->next->info.sto & Sconst) == 0) - { fprintf(fout,"\n\t\ta->__offset = j;"); - } - if (p->info.minOccurs > 0) - fprintf(fout,"\n\t\tif (%sa->__size >= 0 && a->__size < " SOAP_LONG_FORMAT ")\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}", strict_check(), p->info.minOccurs); - if (p->info.maxOccurs > 1) - fprintf(fout,"\n\t\tif (%sa->__size > " SOAP_LONG_FORMAT ")\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}", strict_check(), p->info.maxOccurs); - fprintf(fout,"\n\t\tif (a->__size >= 0)"); - if (((Tnode*)p->info.typ->ref)->type == Tclass - || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) - { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); - if (!is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref) && ((Tnode*)p->info.typ->ref)->type == Tclass) - fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\t(a->%s+i)->%s::soap_default(soap);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); - else - fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); - } - else if (has_class((Tnode*)p->info.typ->ref)) - { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); - fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); - } - else - { fprintf(fout,"\n\t\t{\ta->%s = (%s)soap_malloc(soap, sizeof(%s) * a->__size);", ident(p->sym->name), c_type_id((Tnode*)p->info.typ->ref, "*"), c_type((Tnode*)p->info.typ->ref)); - if (((Tnode*)p->info.typ->ref)->type == Tpointer) - fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); - else if (!is_XML((Tnode*)p->info.typ->ref)) - fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); - } - fprintf(fout,"\n\t\t\tfor (i = 0; i < a->__size; i++)"); - fprintf(fout,"\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position)\n\t\t\t\t{\ti = soap->positions[0]-j;\n\t\t\t\t\tif (i < 0 || i >= a->__size)\n\t\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t}"); - if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (!soap_inliteral(soap, NULL, a->%s + i))", ident(p->sym->name)); - else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (!soap_inwliteral(soap, NULL, a->%s + i))", ident(p->sym->name)); - else - fprintf(fout,"\n\t\t\t\tif (!soap_in_%s(soap, NULL, a->%s + i, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); - fprintf(fout,"\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); - fprintf(fout,"\n\t\t\t\t\tsoap->error = SOAP_OK;"); - fprintf(fout,"\n\t\t\t\t\tbreak;"); - fprintf(fout,"\n\t\t\t\t}"); - } - fprintf(fout,"\n\t\t\t}\n\t\t}\n\t\telse"); - fprintf(fout,"\n\t\t{\tif (soap_new_block(soap) == NULL)\n\t\t\t\treturn NULL;"); - if (p->info.maxOccurs > 1) - { if (d) - fprintf(fout,"\n\t\t\tfor (a->__size[0] = 0; a->__size[0] <= " SOAP_LONG_FORMAT "; a->__size[0]++)", p->info.maxOccurs); - else - fprintf(fout,"\n\t\t\tfor (a->__size = 0; a->__size <= " SOAP_LONG_FORMAT "; a->__size++)", p->info.maxOccurs); - } - else - { if (d) - fprintf(fout,"\n\t\t\tfor (a->__size[0] = 0; ; a->__size[0]++)"); - else - fprintf(fout,"\n\t\t\tfor (a->__size = 0; ; a->__size++)"); - } - fprintf(fout,"\n\t\t\t{\tp = (%s)soap_push_block(soap, NULL, sizeof(%s));\n\t\t\t\tif (!p)\n\t\t\t\t\treturn NULL;", c_type(p->info.typ), c_type((Tnode*)p->info.typ->ref)); - if (((Tnode*)p->info.typ->ref)->type == Tclass || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct)) - fprintf(fout,"\n\t\t\t\tSOAP_PLACEMENT_NEW(p, %s);", c_type((Tnode*)p->info.typ->ref)); - if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tp->soap_default(soap);"); - else if (((Tnode*)p->info.typ->ref)->type == Tpointer) - fprintf(fout,"\n\t\t\t\t*p = NULL;"); - else if (!is_XML((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tsoap_default_%s(soap, p);", c_ident((Tnode*)p->info.typ->ref)); - if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (!soap_inliteral(soap, NULL, p))"); - else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) - fprintf(fout,"\n\t\t\t\tif (!soap_inwliteral(soap, NULL, p))"); - else - fprintf(fout,"\n\t\t\t\tif (!soap_in_%s(soap, NULL, p, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), xsi_type((Tnode*)p->info.typ->ref)); - fprintf(fout,"\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); - fprintf(fout,"\n\t\t\t\t\tsoap->error = SOAP_OK;"); - fprintf(fout,"\n\t\t\t\t\tbreak;"); - fprintf(fout,"\n\t\t\t\t}"); - fprintf(fout,"\n\t\t\t}"); - fprintf(fout,"\n\t\t\tsoap_pop_block(soap, NULL);"); - if (p->info.minOccurs > 0) - fprintf(fout,"\n\t\t\tif (%sa->__size < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); - if (p->info.maxOccurs > 1) - fprintf(fout,"\n\t\t\tif (%sa->__size > " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.maxOccurs); - if (((Tnode*)p->info.typ->ref)->type == Tclass - || has_class((Tnode*)p->info.typ->ref) - || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) - fprintf(fout,"\n\t\t\tif (soap->blist->size)\n\t\t\t\ta->%s = soap_new_%s(soap, soap->blist->size/sizeof(%s));\n\t\t\telse\n\t\t\t\ta->%s = NULL;", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref), c_type((Tnode*)p->info.typ->ref), ident(p->sym->name)); - else - fprintf(fout,"\n\t\t\ta->%s = (%s)soap_malloc(soap, soap->blist->size);", ident(p->sym->name), c_type(p->info.typ)); - fprintf(fout,"\n\t\t\tsoap_save_block(soap, NULL, (char*)a->%s, 1);", ident(p->sym->name)); - fprintf(fout,"\n\t\t}"); - fprintf(fout,"\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); - } - if (has_getter(typ)) - fprintf(fout,"\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); - fprintf(fout,"\n\t}\n\telse\n\t{\t"); - if (is_attachment(typ)) - fprintf(fout,"\n#ifndef WITH_LEANER\n\t\tif (*soap->href != '#')\n\t\t{\tif (soap_dime_forward(soap, &a->__ptr, &a->__size, &a->id, &a->type, &a->options))\n\t\t\t\treturn NULL;\n\t\t}\n\t\telse\n#endif\n\t\t\t"); - if (typ->type == Tclass) - fprintf(fout,"a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, 0, sizeof(%s), 0, soap_copy_%s);", c_type_id(typ, "*"), soap_type(typ), c_type(typ), c_ident(typ)); - else - fprintf(fout,"a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, 0, sizeof(%s), 0, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); - fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); - fprintf(fout,"\n\t}"); - fprintf(fout,"\n\treturn a;\n}"); -} - -const char * -cstring(const char *s) -{ size_t n; - char *t; - const char *r; - for (n = 0, r = s; *r; n++, r++) - if (*r == '"' || *r == '\\') - n++; - else if (*r < 32) - n += 3; - r = t = (char*)emalloc(n + 1); - for (; *s; s++) - { if (*s == '"' || *s == '\\') - { *t++ = '\\'; - *t++ = *s; - } - else if (*s < 32) - { sprintf(t, "\\%03o", (unsigned int)(unsigned char)*s); - t += 4; - } - else - *t++ = *s; - } - *t = '\0'; - return r; -} - -const char * -xstring(const char *s) -{ size_t n; - char *t; - const char *r; - for (n = 0, r = s; *r; n++, r++) - { if (*r < 32 || *r >= 127) - n += 4; - else if (*r == '<' || *r == '>') - n += 3; - else if (*r == '&') - n += 4; - else if (*r == '"') - n += 5; - else if (*r == '\\') - n += 1; - } - r = t = (char*)emalloc(n + 1); - for (; *s; s++) - { if (*s < 32 || *s >= 127) - { sprintf(t, "&#%.2x;", (unsigned char)*s); - t += 5; - } - else if (*s == '<') - { strcpy(t, "<"); - t += 4; - } - else if (*s == '>') - { strcpy(t, ">"); - t += 4; - } - else if (*s == '&') - { strcpy(t, "&"); - t += 5; - } - else if (*s == '"') - { strcpy(t, """); - t += 6; - } - else if (*s == '\\') - { strcpy(t, "\\\\"); - t += 2; - } - else - *t++ = *s; - } - *t = '\0'; - return r; -}