diff GEMBASSY-1.0.3/gsoap/src/symbol2.c @ 0:8300eb051bea draft

Initial upload
author ktnyt
date Fri, 26 Jun 2015 05:19:29 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GEMBASSY-1.0.3/gsoap/src/symbol2.c	Fri Jun 26 05:19:29 2015 -0400
@@ -0,0 +1,12970 @@
+/*
+	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, "&lt;");
+      t += 4;
+    }
+    else if (*s == '>')
+    { strcpy(t, "&gt;");
+      t += 4;
+    }
+    else if (*s == '&')
+    { strcpy(t, "&amp;");
+      t += 5;
+    }
+    else if (*s == '"')
+    { strcpy(t, "&quot;");
+      t += 6;
+    }
+    else if (*s == '\\')
+    { strcpy(t, "\\\\");
+      t += 2;
+    }
+    else
+      *t++ = *s;
+  }
+  *t = '\0';
+  return r;
+}