annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2 symbol2.c
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4 Symbol table handling, type analysis, and code generation.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7 gSOAP XML Web services tools
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8 Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9 This part of the software is released under one of the following licenses:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10 GPL or Genivia's license for commercial use.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12 GPL license.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14 This program is free software; you can redistribute it and/or modify it under
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15 the terms of the GNU General Public License as published by the Free Software
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16 Foundation; either version 2 of the License, or (at your option) any later
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
17 version.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
18
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
19 This program is distributed in the hope that it will be useful, but WITHOUT ANY
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
20 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
21 PARTICULAR PURPOSE. See the GNU General Public License for more details.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
22
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
23 You should have received a copy of the GNU General Public License along with
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
24 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
25 Place, Suite 330, Boston, MA 02111-1307 USA
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
26
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
27 Author contact information:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
28 engelen@genivia.com / engelen@acm.org
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
29
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
30 This program is released under the GPL with the additional exemption that
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
31 compiling, linking, and/or using OpenSSL is allowed.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
32 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
33 A commercial use license is available from Genivia, Inc., contact@genivia.com
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
34 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
35 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
36
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
37 #include "soapcpp2.h"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
38
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
39 #ifdef HAVE_CONFIG_H
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
40 #include "soapcpp2_yacc.h"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
41 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
42 #include "soapcpp2_yacc.tab.h"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
43 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
44
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
45 char *envURI = "http://schemas.xmlsoap.org/soap/envelope/";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
46 char *encURI = "http://schemas.xmlsoap.org/soap/encoding/";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
47 char *rpcURI = "http://www.w3.org/2003/05/soap-rpc";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
48 char *xsiURI = "http://www.w3.org/2001/XMLSchema-instance";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
49 char *xsdURI = "http://www.w3.org/2001/XMLSchema";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
50 char *tmpURI = "http://tempuri.org";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
51
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
52 static Symbol *symlist = (Symbol*) 0; /* pointer to linked list of symbols */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
53 static Symbol *nslist = (Symbol*) 0; /* pointer to linked list of namespace prefix symbols */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
54
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
55 static Tnode *Tptr[TYPES];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
56
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
57 Service *services = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
58
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
59 FILE *fout, *fhead, *fclient, *fserver, *fheader, *flib, *fmatlab, *fmheader;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
60
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
61 int partnum = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
62
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
63 int typeNO = 1; /* unique no. assigned to all types */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
64
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
65 static int is_anytype_flag = 0; /* anytype is used */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
66 static int has_nsmap = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
67
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
68 int tagcmp(const char *s, const char *t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
69 int tagncmp(const char *s, const char *t, size_t n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
70
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
71 long minlen(Tnode *typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
72 long maxlen(Tnode *typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
73
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
74 int is_soap12(const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
75 int has_detail_string(void);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
76 int has_Detail_string(void);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
77
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
78 void needs_lang(Entry *e);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
79
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
80 int is_mutable(Tnode *typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
81 int is_header_or_fault(Tnode *typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
82 int is_body(Tnode *typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
83 int is_volatile(Tnode* typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
84 int is_untyped(Tnode* typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
85 int is_primclass(Tnode* typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
86 int is_imported(Tnode* typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
87 int is_template(Tnode* typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
88 int is_mask(Tnode* typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
89 int is_attachment(Tnode* typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
90 int has_attachment(Tnode* typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
91 int is_void(Tnode* typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
92 int has_external(Tnode *typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
93 int has_volatile(Tnode *typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
94
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
95 int is_invisible(const char *name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
96 int is_invisible_empty(Tnode *p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
97
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
98 int is_eq_nons(const char *s, const char *t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
99 int is_eq(const char *s, const char *t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
100
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
101 int is_item(Entry *p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
102 int is_self(Entry *p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
103
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
104 const char *cstring(const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
105 const char *xstring(const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
106
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
107 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
108 install - add new symbol
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
109 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
110 Symbol *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
111 install(const char *name, Token token)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
112 { Symbol *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
113 p = (Symbol*)emalloc(sizeof(Symbol));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
114 p->name = emalloc(strlen(name)+1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
115 strcpy(p->name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
116 p->token = token;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
117 p->next = symlist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
118 symlist = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
119 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
120 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
121
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
122 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
123 lookup - search for an identifier's name. If found, return pointer to symbol table entry. Return pointer 0 if not found.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
124 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
125 Symbol *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
126 lookup(const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
127 { Symbol *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
128 for (p = symlist; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
129 if (!strcmp(p->name, name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
130 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
131 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
132 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
133
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
134 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
135 gensymidx - generate new symbol from base name and index
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
136 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
137 Symbol *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
138 gensymidx(const char *base, int idx)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
139 { char buf[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
140 Symbol *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
141 sprintf(buf, "%s_%d", base, idx);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
142 s = lookup(buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
143 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
144 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
145 return install(buf, ID);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
146 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
147
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
148 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
149 gensym - generate new symbol from base name
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
150 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
151 Symbol *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
152 gensym(const char *base)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
153 { static int num = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
154 return gensymidx(base, num++);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
155 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
156
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
157 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
158 mktable - make a new symbol table with a pointer to a previous table
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
159 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
160 Table *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
161 mktable(Table *table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
162 { Table *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
163 p = (Table*)emalloc(sizeof(Table));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
164 p->sym = lookup("/*?*/");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
165 p->list = (Entry*) 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
166 if (table == (Table*) 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
167 p->level = INTERNAL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
168 else p->level = table->level+1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
169 p->prev = table;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
170 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
171 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
172
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
173 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
174 mkmethod - make a new method by calling mktype
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
175 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
176 Tnode *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
177 mkmethod(Tnode *ret, Table *args)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
178 { FNinfo *fn = (FNinfo*)emalloc(sizeof(FNinfo));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
179 fn->ret = ret;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
180 fn->args = args;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
181 return mktype(Tfun, fn, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
182 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
183
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
184 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
185 freetable - free space by removing a table
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
186 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
187 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
188 freetable(Table *table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
189 { Entry *p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
190 if (table == (Table*) 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
191 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
192 for (p = table->list; p != (Entry*) 0; p = q) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
193 q = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
194 free(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
195 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
196 free(table);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
197 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
198
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
199 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
200 unlinklast - unlink last entry added to table
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
201 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
202 Entry *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
203 unlinklast(Table *table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
204 { Entry **p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
205 if (table == (Table*)0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
206 return (Entry*)0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
207 for (p = &table->list; *p != (Entry*)0 && (*p)->next != (Entry*)0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
208 p = &(*p)->next);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
209 q = *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
210 *p = (Entry*)0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
211 return q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
212 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
213
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
214 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
215 enter - enter a symbol in a table. Error if already in the table
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
216 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
217 Entry *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
218 enter(Table *table, Symbol *sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
219 { Entry *p, *q = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
220 again:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
221 for (p = table->list; p; q = p, p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
222 { if (p->sym == sym && p->info.typ->type != Tfun)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
223 { char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
224 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
225 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
226 s = (char*)emalloc(strlen(sym->name) + 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
227 strcpy(s, sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
228 strcat(s, "_");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
229 sym = lookup(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
230 if (!sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
231 sym = install(s, ID);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
232 free(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
233 goto again;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
234 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
235 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
236 p = (Entry*)emalloc(sizeof(Entry));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
237 p->sym = sym;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
238 p->tag = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
239 p->info.typ = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
240 p->info.sto = Snone;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
241 p->info.hasval = False;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
242 p->info.minOccurs = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
243 p->info.maxOccurs = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
244 p->info.offset = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
245 p->level = table->level;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
246 p->lineno = yylineno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
247 p->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
248 if (!q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
249 table->list = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
250 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
251 q->next = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
252 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
253 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
254
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
255 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
256 entry - return pointer to table entry of a symbol
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
257 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
258 Entry *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
259 entry(Table *table, Symbol *sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
260 { Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
261 Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
262 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
263 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
264 if (p->sym == sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
265 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
266 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
267 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
268
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
269 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
270 reenter - re-enter a symbol in a table.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
271 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
272 Entry *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
273 reenter(Table *table, Symbol *sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
274 { Entry *p, *q = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
275 for (p = table->list; p; q = p, p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
276 if (p->sym == sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
277 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
278 if (p && p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
279 { if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
280 q->next = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
281 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
282 table->list = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
283 for (q = p->next; q->next; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
284 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
285 q->next = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
286 p->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
287 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
288 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
289 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
290
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
291 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
292 merge - append two tables if members are not duplicated
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
293 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
294 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
295 merge(Table *dest, Table *src)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
296 { Entry *p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
297 for (p = src->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
298 { q = entry(dest, p->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
299 if (!q || q->info.typ != p->info.typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
300 { q = enter(dest, p->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
301 q->info = p->info;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
302 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
303 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
304 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
305 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
306
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
307 Entry *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
308 enumentry(Symbol *sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
309 { Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
310 Entry *p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
311 for (t = enumtable; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
312 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
313 { q = entry((Table*)p->info.typ->ref, sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
314 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
315 return q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
316 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
317 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
318 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
319 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
320
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
321 char *get_mxClassID(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
322 char *t_ident(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
323 char *c_ident(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
324 char *ident(char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
325 char *soap_type(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
326 char *c_storage(Storage);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
327 char *c_init(Entry*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
328 char *c_type(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
329 char *c_type_id(Tnode*, char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
330 char *xsi_type_cond(Tnode*, int);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
331 char *xsi_type(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
332 char *xsi_type_cond_u(Tnode*, int);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
333 char *xsi_type_u(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
334 char *the_type(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
335 char *wsdl_type(Tnode*, char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
336 char *base_type(Tnode*, char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
337 char *xml_tag(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
338 char *ns_qualifiedElement(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
339 char *ns_qualifiedAttribute(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
340 char *ns_convert(char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
341 char *field(Entry *p, char *ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
342 char *field_overridden(Table *t, Entry *p, char *ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
343 char *ns_add(Entry *p, char *ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
344 char *ns_addx(char *tag, char *ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
345 char *ns_add_overridden(Table *t, Entry *p, char *ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
346 char *ns_remove(char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
347 char *ns_remove1(char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
348 char *ns_remove2(char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
349 char *res_remove(char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
350 char *ns_name(char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
351 char *ns_cname(char*, char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
352 char *ns_fname(char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
353
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
354 int has_class(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
355 int has_constructor(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
356 int has_destructor(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
357 int has_getter(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
358 int has_setter(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
359 int has_ns(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
360 int has_ns_t(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
361 int has_ns_eq(char*, char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
362 char *strict_check(void);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
363 char *ns_of(char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
364 int eq_ns(char*, char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
365 char *prefix_of(char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
366 int has_offset(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
367 int reflevel(Tnode *typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
368 Tnode* reftype(Tnode *typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
369 int is_response(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
370 int is_XML(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
371 int is_stdXML(Tnode *p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
372 Entry *get_response(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
373 int is_primitive_or_string(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
374 int is_primitive(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
375 Entry *is_discriminant(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
376 Entry *is_dynamic_array(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
377 int is_transient(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
378 int is_external(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
379 int is_anyType(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
380 int is_anyAttribute(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
381 int is_binary(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
382 int is_hexBinary(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
383 int is_fixedstring(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
384 int is_string(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
385 int is_wstring(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
386 int is_stdstring(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
387 int is_stdwstring(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
388 int is_stdstr(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
389 int is_typedef(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
390 int get_dimension(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
391 char *has_soapref(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
392 int is_document(const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
393 int is_literal(const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
394 int is_keyword(const char *);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
395
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
396 int is_repetition(Entry*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
397 int is_choice(Entry*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
398 int is_sequence(Entry*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
399 int is_anytype(Entry*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
400
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
401 char *xsi_type_Tarray(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
402 char *xsi_type_Darray(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
403
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
404 void matlab_def_table(Table*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
405 void def_table(Table*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
406 void generate(Tnode *);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
407 int no_of_var(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
408 char *pointer_stuff(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
409 void in_defs(Table*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
410 void in_defs2(Table*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
411 void in_defs3(Table*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
412 void out_defs(Table*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
413 void mark_defs(Table*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
414 void in_attach(Table*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
415 void out_attach(Table*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
416 void soap_serialize(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
417 void soap_traverse(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
418 void soap_default(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
419 void soap_put(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
420 void soap_out(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
421 void soap_out_Darray(Tnode *);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
422 void soap_get(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
423 void soap_in(Tnode*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
424 void soap_in_Darray(Tnode *);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
425 void soap_instantiate_class(Tnode *);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
426 int get_Darraydims(Tnode *typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
427 const char *nillable(Tnode *typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
428
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
429 void soap_serve(Table*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
430 void generate_proto(Table*, Entry*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
431 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
432 void generate_call(Table*, Entry*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
433 void generate_server(Table*, Entry*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
434 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
435 void generate_header(Table*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
436 void get_namespace_prefixes(void);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
437 void generate_schema(Table*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
438 void gen_schema(FILE*,Table*,char*,char*,int,int,char*,char*,char*,char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
439 void gen_type_documentation(FILE *fd, Entry *type, char *ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
440 int gen_member_documentation(FILE *fd, Symbol *type, Entry *member, char *ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
441 void gen_schema_elements_attributes(FILE *fd, Table *t, char *ns, char *ns1, char *encoding, char *style);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
442 void gen_schema_elements(FILE *fd, Tnode *p, char *ns, char *ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
443 int gen_schema_element(FILE *fd, Tnode *p, Entry *q, char *ns, char *ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
444 void gen_schema_attributes(FILE *fd, Tnode *p, char *ns, char *ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
445 void gen_wsdl(FILE*,Table*,char*,char*,char*,char*,char*,char*,char*,char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
446 void gen_nsmap(FILE*,Symbol*,char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
447
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
448 void gen_proxy(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
449 void gen_object(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
450 void gen_proxy_header(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
451 void gen_proxy_code(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
452 void gen_object_header(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
453 void gen_object_code(FILE*,Table*,Symbol*,char*,char*,char*,char*,char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
454 void gen_method(FILE *fd, Table *table, Entry *method, int server);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
455 void gen_params(FILE *fd, Table *params, Entry *result, int flag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
456 void gen_args(FILE *fd, Table *params, Entry *result, int flag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
457 void gen_query_url(FILE *fd, Table *params);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
458 void gen_query_form(FILE *fd, Table *params);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
459 const char* gen_format(FILE *fd, Tnode *typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
460 void gen_call_method(FILE *fd, Table *table, Entry *method, char *name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
461 void gen_serve_method(FILE *fd, Table *table, Entry *param, char *name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
462
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
463 void gen_data(char*,Table*,char*,char*,char*,char*,char*,char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
464 FILE *gen_env(char*,char*,int,Table*,char*,char*,char*,char*,char*,char*,int);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
465 void gen_xmlns(FILE*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
466 void gen_field(FILE*,int,Entry*,char*,char*,char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
467 void gen_val(FILE*,int,Tnode*,char*,char*,char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
468 void gen_atts(FILE*,int,Table*,char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
469
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
470 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
471 mktype - make a (new) type with a reference to additional information and the
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
472 width in bytes required to store objects of that type. A pointer to the
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
473 type is returned which can be compared to check if types are identical.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
474 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
475 Tnode *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
476 mktype(Type type, void *ref, int width)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
477 { Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
478 int t = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
479 if (transient != -2 || type > Ttime)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
480 t = transient;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
481 if (type != Tstruct && type != Tclass && type != Tunion && (type != Tenum || ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
482 { for (p = Tptr[type]; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
483 { if (p->ref == ref && p->sym == (Symbol*) 0 && p->width == width && p->transient == t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
484 { if (imported && !p->imported)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
485 p->imported = imported;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
486 return p; /* type alrady exists in table */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
487 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
488 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
489 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
490 p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
491 p->type = type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
492 p->ref = ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
493 p->id = lookup("/*?*/");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
494 p->base = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
495 p->sym = (Symbol*)0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
496 p->response = (Entry*)0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
497 p->width = width;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
498 p->generated = False;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
499 p->classed = False;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
500 p->wsdl = False;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
501 p->next = Tptr[type];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
502 p->transient = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
503 p->imported = imported;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
504 p->pattern = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
505 p->minLength = MINLONG64;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
506 p->maxLength = MAXLONG64;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
507 p->num = typeNO++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
508 Tptr[type] = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
509 DBGLOG(fprintf(stderr, "New type %s %s\n", c_type(p), p->imported));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
510 if (type == Tpointer && ((Tnode*)ref)->imported && (((Tnode*)ref)->type == Tenum || ((Tnode*)ref)->type == Tstruct || ((Tnode*)ref)->type == Tclass))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
511 p->imported = ((Tnode*)ref)->imported;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
512 else if (lflag && !is_transient(p) && (type == Tenum || type == Tstruct || type == Tclass))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
513 mkpointer(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
514 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
515 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
516
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
517 Tnode *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
518 mksymtype(Tnode *typ, Symbol *sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
519 { Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
520 p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
521 p->type = typ->type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
522 p->ref = typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
523 if (typ->id == lookup("/*?*/"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
524 p->id = sym;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
525 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
526 p->id = typ->id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
527 p->sym = sym;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
528 p->response = (Entry*)0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
529 p->width = typ->width;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
530 p->generated = False;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
531 p->classed = True; /* copy of existing (generated) type */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
532 p->wsdl = False;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
533 p->next = Tptr[typ->type];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
534 p->transient = transient;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
535 p->imported = imported;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
536 p->pattern = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
537 p->minLength = MINLONG64;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
538 p->maxLength = MAXLONG64;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
539 p->num = typeNO++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
540 Tptr[typ->type] = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
541 DBGLOG(fprintf(stderr, "New typedef %s %s\n", c_type(p), p->imported));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
542 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
543 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
544
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
545 Tnode *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
546 mktemplate(Tnode *typ, Symbol *id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
547 { Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
548 for (p = Tptr[Ttemplate]; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
549 if (p->ref == typ && p->id == id && p->transient == transient)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
550 { if (imported && !p->imported)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
551 p->imported = imported;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
552 return p; /* type alrady exists in table */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
553 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
554 p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
555 p->type = Ttemplate;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
556 p->ref = typ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
557 p->id = id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
558 p->sym = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
559 p->response = (Entry*)0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
560 p->width = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
561 p->generated = False;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
562 p->classed = False; /* copy of existing (generated) type */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
563 p->wsdl = False;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
564 p->next = Tptr[Ttemplate];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
565 p->transient = transient;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
566 p->imported = imported;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
567 p->pattern = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
568 p->minLength = MINLONG64;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
569 p->maxLength = MAXLONG64;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
570 p->num = typeNO++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
571 Tptr[Ttemplate] = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
572 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
573 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
574
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
575 /* DO NOT REMOVE OR ALTER (SEE LICENCE AGREEMENT AND COPYING.txt) */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
576 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
577 copyrightnote(FILE *fd, char *fn)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
578 { fprintf(fd, "\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
579 /* %s\n Generated by gSOAP "VERSION" from %s\n\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
580 \n\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
581 Copyright(C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
582 The generated code is released under one of the following licenses:\n\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
583 GPL or Genivia's license for commercial use.\n\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
584 This program is released under the GPL with the additional exemption that\n\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
585 compiling, linking, and/or using OpenSSL is allowed.\n\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
586 */", fn, filename);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
587 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
588
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
589 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
590 banner(FILE *fd, const char *text)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
591 { int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
592 fprintf(fd, "\n\n/");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
593 for (i = 0; i < 78; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
594 fputc('*', fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
595 fprintf(fd, "\\\n *%76s*\n * %-75s*\n *%76s*\n\\", "", text, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
596 for (i = 0; i < 78; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
597 fputc('*', fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
598 fprintf(fd, "/\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
599 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
600
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
601 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
602 identify(FILE *fd, char *fn)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
603 { time_t t = time(NULL), *p = &t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
604 char tmp[256];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
605 strftime(tmp, 256, "%Y-%m-%d %H:%M:%S GMT", gmtime(p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
606 fprintf(fd, "\n\nSOAP_SOURCE_STAMP(\"@(#) %s ver "VERSION" %s\")\n", fn, tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
607 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
608
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
609 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
610 compile(Table *table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
611 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
612 Tnode *typ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
613 Pragma *pragma;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
614 int classflag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
615 int found;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
616 int filenum;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
617 char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
618 char base[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
619 char soapStub[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
620 char soapH[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
621 char soapC[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
622 char soapClient[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
623 char soapServer[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
624 char soapClientLib[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
625 char soapServerLib[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
626 char pathsoapStub[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
627 char pathsoapH[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
628 char pathsoapC[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
629 char pathsoapClient[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
630 char pathsoapServer[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
631 char pathsoapClientLib[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
632 char pathsoapServerLib[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
633 char soapMatlab[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
634 char pathsoapMatlab[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
635 char soapMatlabHdr[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
636 char pathsoapMatlabHdr[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
637
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
638 found = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
639 for (p = table->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
640 if (p->info.typ->type == Tfun && !(p->info.sto & Sextern))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
641 found = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
642 if (!found)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
643 Sflag = Cflag = Lflag = 1; /* no service operations were found */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
644
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
645 if (*dirpath)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
646 fprintf(fmsg, "Using project directory path: %s\n", dirpath);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
647
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
648 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
649 { prefix = namespaceid;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
650 fprintf(fmsg, "Using code namespace: %s\n", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
651 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
652 strcpy(base, prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
653 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
654 s = ".c";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
655 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
656 s = ".cpp";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
657
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
658 strcpy(soapMatlab, base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
659 strcat(soapMatlab, "Matlab.c");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
660 strcpy(pathsoapMatlab, dirpath);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
661 strcat(pathsoapMatlab, soapMatlab );
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
662
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
663 strcpy(soapMatlabHdr, base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
664 strcat(soapMatlabHdr, "Matlab.h");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
665 strcpy(pathsoapMatlabHdr, dirpath);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
666 strcat(pathsoapMatlabHdr, soapMatlabHdr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
667
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
668 strcpy(soapStub, base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
669 strcat(soapStub, "Stub.h");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
670 strcpy(pathsoapStub, dirpath);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
671 strcat(pathsoapStub, soapStub);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
672 strcpy(soapH, base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
673 strcat(soapH, "H.h");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
674 strcpy(pathsoapH, dirpath);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
675 strcat(pathsoapH, soapH);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
676 strcpy(soapC, base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
677 if (fflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
678 strcat(soapC, "C_nnn");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
679 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
680 strcat(soapC, "C");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
681 strcat(soapC, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
682 strcpy(pathsoapC, dirpath);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
683 strcat(pathsoapC, soapC);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
684 strcpy(soapClient, base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
685 strcat(soapClient, "Client");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
686 strcat(soapClient, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
687 strcpy(pathsoapClient, dirpath);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
688 strcat(pathsoapClient, soapClient);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
689 strcpy(soapServer, base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
690 strcat(soapServer, "Server");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
691 strcat(soapServer, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
692 strcpy(pathsoapServer, dirpath);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
693 strcat(pathsoapServer, soapServer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
694 strcpy(soapClientLib, base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
695 strcat(soapClientLib, "ClientLib");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
696 strcat(soapClientLib, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
697 strcpy(pathsoapClientLib, dirpath);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
698 strcat(pathsoapClientLib, soapClientLib);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
699 strcpy(soapServerLib, base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
700 strcat(soapServerLib, "ServerLib");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
701 strcat(soapServerLib, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
702 strcpy(pathsoapServerLib, dirpath);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
703 strcat(pathsoapServerLib, soapServerLib);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
704
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
705 if (mflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
706 { fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlab);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
707 fmatlab=fopen(pathsoapMatlab, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
708 if (!fmatlab)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
709 execerror("Cannot write to file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
710 copyrightnote(fmatlab, soapMatlab);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
711 fprintf(fmatlab,"\n#include \"%s\"\n", soapMatlabHdr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
712 fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlabHdr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
713 fmheader=fopen(pathsoapMatlabHdr, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
714 if (!fmheader)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
715 execerror("Cannot write to file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
716 copyrightnote(fmheader, soapMatlabHdr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
717 fprintf(fmheader,"\n#include \"mex.h\"\n#include \"%s\"\n", soapStub);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
718 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
719
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
720 fprintf(fmsg, "Saving %s annotated copy of the source input\n", pathsoapStub);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
721 fheader=fopen(pathsoapStub, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
722 if (!fheader)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
723 execerror("Cannot write to file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
724 copyrightnote(fheader, soapStub);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
725 fprintf(fheader,"\n\n#ifndef %sStub_H\n#define %sStub_H", prefix, prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
726 for (pragma = pragmas; pragma; pragma = pragma->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
727 fprintf(fheader,"\n%s", pragma->pragma);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
728 if (nflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
729 fprintf(fheader,"\n#ifndef WITH_NONAMESPACES\n#define WITH_NONAMESPACES\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
730 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
731 { fprintf(fheader,"\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
732 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
733 fprintf(fheader,"\n#include \"stdsoap2.h\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
734 fprintf(fheader,"\n#if GSOAP_VERSION != %d\n# error \"GSOAP VERSION MISMATCH IN GENERATED CODE: PLEASE REINSTALL PACKAGE\"\n#endif\n", GSOAP_VERSION);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
735 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
736 fprintf(fheader,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
737 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
738 fprintf(fheader,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
739
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
740 fprintf(fmsg, "Saving %s interface declarations\n", pathsoapH);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
741 fhead=fopen(pathsoapH,"w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
742 if (!fhead)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
743 execerror("Cannot write to file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
744 copyrightnote(fhead, soapH);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
745 fprintf(fhead,"\n\n#ifndef %sH_H\n#define %sH_H", prefix, prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
746 fprintf(fhead,"\n#include \"%s\"", soapStub);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
747 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
748 fprintf(fhead,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
749 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
750 fprintf(fhead,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
751 fprintf(fhead, "\n#ifndef WITH_NOIDREF");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
752 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
753 fprintf(fhead,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
754 fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
755 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
756 fprintf(fhead,"\n\n#ifdef __cplusplus\n}\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
757 fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
758 fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
759 fprintf(fhead, "\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
760 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
761 fprintf(fhead,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
762 fprintf(fhead, "\nSOAP_FMAC3 void *SOAP_FMAC4 soap_getelement(struct soap*, int*);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
763 fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
764 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
765 fprintf(fhead,"\n\n#ifdef __cplusplus\n}\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
766 fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
767
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
768 generate_header(table);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
769 generate_schema(table);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
770
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
771 if (!Sflag && !iflag && !jflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
772 { fprintf(fmsg, "Saving %s client calling stubs\n", pathsoapClient);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
773 fclient=fopen(pathsoapClient,"w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
774 if (!fclient)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
775 execerror("Cannot write to file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
776 copyrightnote(fclient, soapClient);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
777 fprintf(fclient,"\n\n#if defined(__BORLANDC__)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
778 fprintf(fclient,"\n#pragma option push -w-8060");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
779 fprintf(fclient,"\n#pragma option push -w-8004");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
780 fprintf(fclient,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
781 fprintf(fclient,"\n#include \"%sH.h\"", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
782 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
783 fprintf(fclient,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
784 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
785 fprintf(fclient,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
786 identify(fclient, soapClient);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
787
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
788 if (!Lflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
789 { flib=fopen(pathsoapClientLib,"w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
790 if (!flib)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
791 execerror("Cannot write to file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
792 copyrightnote(flib, soapClientLib);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
793 fprintf(fmsg, "Saving %s client stubs with serializers (use only for libs)\n", pathsoapClientLib);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
794 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
795 fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
796 fprintf(flib, "\n#define SOAP_FMAC3 static");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
797 fprintf(flib, "\n#include \"%s\"", soapC);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
798 fprintf(flib, "\n#include \"%s\"", soapClient);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
799 fprintf(flib, "\n\n/* End of %s */\n", soapClientLib);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
800 fclose(flib);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
801 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
802 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
803 if (!Cflag && !iflag && !jflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
804 { fprintf(fmsg, "Saving %s server request dispatcher\n", pathsoapServer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
805 fserver=fopen(pathsoapServer,"w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
806 if (!fserver)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
807 execerror("Cannot write to file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
808 copyrightnote(fserver, soapServer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
809 fprintf(fserver,"\n\n#if defined(__BORLANDC__)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
810 fprintf(fserver,"\n#pragma option push -w-8060");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
811 fprintf(fserver,"\n#pragma option push -w-8004");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
812 fprintf(fserver,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
813 fprintf(fserver,"\n#include \"%sH.h\"", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
814 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
815 fprintf(fserver,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
816 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
817 fprintf(fserver,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
818 identify(fserver, soapServer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
819
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
820 if (!Lflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
821 { flib = fopen(pathsoapServerLib,"w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
822 if (!flib)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
823 execerror("Cannot write to file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
824 copyrightnote(flib, soapServerLib);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
825 fprintf(fmsg, "Saving %s server request dispatcher with serializers (use only for libs)\n", pathsoapServerLib);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
826 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
827 fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
828 fprintf(flib, "\n#define SOAP_FMAC3 static");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
829 fprintf(flib, "\n#include \"%s\"", soapC);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
830 fprintf(flib, "\n#include \"%s\"", soapServer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
831 fprintf(flib, "\n\n/* End of %s */\n", soapServerLib);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
832 fclose(flib);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
833 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
834 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
835
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
836 if (!iflag && !jflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
837 soap_serve(table);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
838
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
839 classflag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
840 for (p = classtable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
841 { if (p->info.typ->type == Tclass && p->info.typ->transient <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
842 { classflag = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
843 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
844 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
845 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
846 if (classflag || Tptr[Ttemplate])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
847 { if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
848 semwarn("Option -c conflicts with the use of classes");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
849 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
850
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
851 for (filenum = 1; partnum == 0; filenum++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
852 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
853 if (fflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
854 { char *t = strrchr(pathsoapC, '.');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
855 sprintf(t-3, "%03d", filenum);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
856 *t = '.';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
857 fprintf(fmsg, "Saving %s serializers (part %d)\n", pathsoapC, filenum);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
858 partnum = fflag; /* number of defs per file */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
859 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
860 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
861 { fprintf(fmsg, "Saving %s serializers\n", pathsoapC);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
862 partnum = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
863 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
864 fout=fopen(pathsoapC,"w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
865 if (!fout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
866 execerror("Cannot write to file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
867 copyrightnote(fout, soapC);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
868 fprintf(fout,"\n\n#if defined(__BORLANDC__)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
869 fprintf(fout,"\n#pragma option push -w-8060");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
870 fprintf(fout,"\n#pragma option push -w-8004");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
871 fprintf(fout,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
872
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
873 fprintf(fout,"\n\n#include \"%sH.h\"", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
874 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
875 fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
876 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
877 fprintf(fout,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
878 identify(fout, soapC);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
879
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
880 if (filenum == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
881 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
882
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
883 if (!lflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
884 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
885 fprintf(fout,"\n\n#ifndef WITH_NOGLOBAL");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
886 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
887 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
888 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
889 { 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
890 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
891 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
892 else if ((p = entry(classtable, lookup("SOAP_ENV__Header"))) && p->info.typ->type == Tstruct)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
893 { 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
894 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
895 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
896 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
897 { 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
898 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
899 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
900 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
901 { 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
902 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
903 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
904 else if ((p = entry(classtable, lookup("SOAP_ENV__Fault"))) && p->info.typ->type == Tstruct)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
905 { 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
906 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
907 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
908 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
909 { 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
910 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
911 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
912 if ((p = entry(classtable, lookup("SOAP_ENV__Fault"))) && p->info.typ->type == Tstruct)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
913 { 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
914 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
915 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
916 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
917 { 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
918 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
919 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
920 fprintf(fhead,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
921 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
922 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
923 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
924 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
925 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
926 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
927 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
928 fprintf(fout,"\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap)\n{\n\tsoap_fault(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
929 if (has_Detail_string())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
930 { if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
931 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
932 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
933 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
934 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
935 if (has_detail_string())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
936 { if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
937 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
938 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
939 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
940 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
941 if (!has_detail_string() && !has_Detail_string())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
942 fprintf(fout,"\n\treturn NULL;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
943 fprintf(fout,"\n\nSOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultdetail(struct soap *soap)\n{\n\tsoap_fault(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
944 if (has_Detail_string())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
945 fprintf(fout,"\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Detail)\n\t\treturn soap->fault->SOAP_ENV__Detail->__any;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
946 if (has_detail_string())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
947 fprintf(fout,"\n\tif (soap->fault->detail)\n\t\treturn soap->fault->detail->__any;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
948 fprintf(fout,"\n\treturn NULL;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
949 fprintf(fout,"\n\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
950
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
951 fprintf(fout,"\n\n#ifndef WITH_NOIDREF");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
952 fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap)\n{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
953 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
954 fprintf(fout,"\n\tif (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
955 fprintf(fout,"\n\t\tsoap->error = SOAP_OK;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
956 fprintf(fout,"\n\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
957 fprintf(fout,"\n}\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
958
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
959 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
960 fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
961 fprintf(fout,"\nSOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type)\n{\t(void)type;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
962 fprintf(fout,"\n\tif (soap_peek_element(soap))\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
963 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);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
964 fprintf(fout,"\n\tswitch (*type)\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
965 DBGLOG(fprintf(stderr,"\n Calling in_defs( )."));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
966 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
967 in_defs(table);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
968 DBGLOG(fprintf(stderr,"\n Completed in_defs( )."));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
969 fprintf(fout,"\n\tdefault:\n#else\n\t*type = 0;\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
970 fprintf(fout,"\n\t{\tconst char *t = soap->type;\n\t\tif (!*t)\n\t\t\tt = soap->tag;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
971 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
972 in_defs2(table);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
973 fprintf(fout,"\n\t\tt = soap->tag;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
974 in_defs3(table);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
975 fprintf(fout,"\n#ifndef WITH_NOIDREF\n\t}\n#endif\n\t}\n\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
976 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
977 fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
978
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
979 fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap)\n{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
980 fprintf(fout,"\n\tif (!soap_peek_element(soap))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
981 fprintf(fout,"\n\t{\tint t;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
982 fprintf(fout,"\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Unexpected element '%%s' in input (level=%%u, %%d)\\n\", soap->tag, soap->level, soap->body));");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
983 fprintf(fout,"\n\t\tif (soap->mustUnderstand && !soap->other)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
984 fprintf(fout,"\n\t\t\treturn soap->error = SOAP_MUSTUNDERSTAND;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
985 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
986 fprintf(fout,"\n\t\tif (!*soap->id || !soap_getelement(soap, &t))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
987 fprintf(fout,"\n\t\t{\tsoap->peeked = 0;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
988 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;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
989 fprintf(fout,"\n\t\t\tDBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, \"IGNORING element '%%s'\\n\", soap->tag));");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
990 fprintf(fout,"\n\t\t\tif (!soap->error && soap->body)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
991 fprintf(fout,"\n\t\t\t{\tsoap->level++;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
992 fprintf(fout,"\n\t\t\t\twhile (!soap_ignore_element(soap))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
993 fprintf(fout,"\n\t\t\t\t\t;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
994 fprintf(fout,"\n\t\t\t\tif (soap->error == SOAP_NO_TAG)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
995 fprintf(fout,"\n\t\t\t\t\tsoap->error = soap_element_end_in(soap, NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
996 fprintf(fout,"\n\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
997 fprintf(fout,"\n\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
998 fprintf(fout,"\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
999 fprintf(fout,"\n\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1000 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1001
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1002 fprintf(fout,"\n\n#ifndef WITH_NOIDREF");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1003 fprintf(fout,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap *soap)\n{\n\tint i;\n\tstruct soap_plist *pp;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1004 fprintf(fout,"\n\tif (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH)))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1005 fprintf(fout,"\n\t\tfor (i = 0; i < SOAP_PTRHASH; i++)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1006 fprintf(fout,"\n\t\t\tfor (pp = soap->pht[i]; pp; pp = pp->next)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1007 fprintf(fout,"\n\t\t\t\tif (pp->mark1 == 2 || pp->mark2 == 2)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1008 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;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1009 fprintf(fout,"\n\treturn SOAP_OK;\n}\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1010
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1011 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1012 fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1013 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;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1014 fprintf(fout,"\n\tswitch (type)\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1015 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1016 out_defs(table);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1017 fprintf(fout,"\n\t}\n\treturn SOAP_OK;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1018 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1019 fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1020
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1021 fprintf(fout,"\n\n#ifndef WITH_NOIDREF");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1022 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1023 fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1024 if (is_anytype_flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1025 { fprintf(fout,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1026 fprintf(fout,"\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1027 fprintf(fout,"\n\tswitch (type)\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1028 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1029 mark_defs(table);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1030 fprintf(fout,"\n\t}\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1031 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1032 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1033 { fprintf(fout,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1034 fprintf(fout,"\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1035 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1036 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1037 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1038 fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1039 fprintf(fout,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1040
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1041 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1042
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1043 if (!cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1044 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1045 fprintf(fhead,"\n\nSOAP_FMAC3 void * SOAP_FMAC4 %s_instantiate(struct soap*, int, const char*, const char*, size_t*);", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1046 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1047 if (classtable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1048 for (p = classtable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1049 if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1050 { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1051 fprintf(fout,"\n#ifndef WITH_NOGLOBAL");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1052 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1053 if (is_header_or_fault(p->info.typ) || is_body(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1054 fprintf(fout,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1055 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1056 if (typetable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1057 for (p = typetable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1058 if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1059 { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1060 fprintf(fout,"\n#ifndef WITH_NOGLOBAL");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1061 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1062 if (is_header_or_fault(p->info.typ) || is_body(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1063 fprintf(fout,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1064 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1065 for (typ = Tptr[Ttemplate]; typ; typ = typ->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1066 if (typ->ref && !is_transient(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1067 fprintf(fout,"\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(typ), c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1068
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1069 fprintf(fout,"\n\t}\n\treturn NULL;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1070
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1071 fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap_clist*);", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1072 fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap_clist *p)", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1073 fprintf(fout,"\n{\tswitch (p->type)\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1074 if (classtable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1075 { for (p = classtable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1076 if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1077 { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1078 fprintf(fout,"\n#ifndef WITH_NOGLOBAL");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1079 fprintf(fout,"\n\tcase %s:", soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1080 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1081 if (is_header_or_fault(p->info.typ) || is_body(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1082 fprintf(fout,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1083 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1084 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1085 if (typetable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1086 { for (p = typetable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1087 if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct) /* && is_external(p->info.typ)) */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1088 { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1089 fprintf(fout,"\n#ifndef WITH_NOGLOBAL");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1090 fprintf(fout,"\n\tcase %s:", soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1091 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1092 if (is_header_or_fault(p->info.typ) || is_body(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1093 fprintf(fout,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1094 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1095 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1096 for (typ = Tptr[Ttemplate]; typ; typ = typ->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1097 { if (typ->ref && !is_transient(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1098 { fprintf(fout,"\n\tcase %s:", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1099 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1100 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1101 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1102 fprintf(fout,"\n\tdefault:\treturn SOAP_ERR;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1103 fprintf(fout,"\n\t}\n\treturn SOAP_OK;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1104 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1105
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1106 fprintf(fhead,"\nSOAP_FMAC3 void* SOAP_FMAC4 soap_class_id_enter(struct soap*, const char*, void*, int, size_t, const char*, const char*);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1107 if (!lflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1108 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1109 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)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1110 fprintf(fout, "\n{\treturn soap_id_enter(soap, id, p, t, n, 0, type, arrayType, %s_instantiate);\n}", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1111 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1112
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1113 if (Tptr[Ttemplate])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1114 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1115 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);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1116 if (!lflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1117 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1118 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)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1119 fprintf(fout, "\n{\treturn soap_id_forward(soap, href, p, len, st, tt, n, k, %s_container_insert);\n}", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1120 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1121
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1122 fprintf(fhead, "\n\nSOAP_FMAC3 void SOAP_FMAC4 %s_container_insert(struct soap*, int, int, void*, size_t, const void*, size_t);", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1123 if (!lflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1124 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1125 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1126 fprintf(fout, "\n#ifdef WIN32\n#pragma warning(push)\n#pragma warning(disable:4065)\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1127 fprintf(fout,"\n{\n\t(void)soap; (void)st; (void)p; (void)len; (void)q; (void)n; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1128 fprintf(fout, "\n\tswitch (tt)\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1129 for (typ = Tptr[Ttemplate]; typ; typ = typ->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1130 { if (typ->ref && !is_transient(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1131 { fprintf(fout, "\n\tcase %s:", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1132 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1133 if (!strcmp(typ->id->name, "std::vector") || !strcmp(typ->id->name, "std::deque"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1134 fprintf(fout, "\n\t\t(*(%s)p)[len] = *(%s)q;", c_type_id(typ, "*"), c_type_id((Tnode*)typ->ref, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1135 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1136 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1137 fprintf(fout, "\n\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1138 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1139 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1140 fprintf(fout, "\n\tdefault:\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Could not insert type=%%d in %%d\\n\", st, tt));");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1141 fprintf(fout, "\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1142 fprintf(fout, "\n#ifdef WIN32\n#pragma warning(pop)\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1143 fprintf(fout, "\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1144 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1145 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1146 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1147 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1148
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1149 def_table(table);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1150
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1151 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1152 fprintf(fout,"\n\n} // namespace %s\n", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1153 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1154 fprintf(fout,"\n\n#ifdef __cplusplus\n}\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1155 fprintf(fout,"\n\n#if defined(__BORLANDC__)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1156 fprintf(fout,"\n#pragma option pop");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1157 fprintf(fout,"\n#pragma option pop");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1158 fprintf(fout,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1159 fprintf(fout, "\n\n/* End of %s */\n", soapC);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1160 fclose(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1161 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1162
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1163 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1164 fprintf(fhead,"\n\n} // namespace %s\n", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1165 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1166 fprintf(fhead,"\n\n#ifdef __cplusplus\n}\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1167 fprintf(fhead, "\n\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1168 fprintf(fhead, "\n\n/* End of %s */\n", soapH);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1169 fclose(fhead);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1170
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1171 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1172 fprintf(fheader,"\n\n} // namespace %s\n", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1173 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1174 fprintf(fheader,"\n\n#ifdef __cplusplus\n}\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1175 fprintf(fheader, "\n\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1176 fprintf(fheader, "\n\n/* End of %s */\n", soapStub);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1177 fclose(fheader);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1178
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1179 if (mflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1180 { DBGLOG(fprintf(stderr,"\n Calling matlab_def_table( )."));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1181 matlab_def_table(table);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1182 DBGLOG(fprintf(stderr,"\n Completed matlab_def_table( )."));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1183 fclose(fmatlab);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1184 fclose(fmheader);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1185 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1186
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1187 if (!Sflag && !iflag && !jflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1188 { if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1189 fprintf(fclient,"\n\n} // namespace %s\n", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1190 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1191 fprintf(fclient,"\n\n#ifdef __cplusplus\n}\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1192 fprintf(fclient,"\n\n#if defined(__BORLANDC__)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1193 fprintf(fclient,"\n#pragma option pop");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1194 fprintf(fclient,"\n#pragma option pop");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1195 fprintf(fclient,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1196 fprintf(fclient, "\n\n/* End of %s */\n", soapClient);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1197 fclose(fclient);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1198 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1199
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1200 if (!Cflag && !iflag && !jflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1201 { if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1202 fprintf(fserver,"\n\n} // namespace %s\n", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1203 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1204 fprintf(fserver,"\n\n#ifdef __cplusplus\n}\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1205 fprintf(fserver,"\n\n#if defined(__BORLANDC__)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1206 fprintf(fserver,"\n#pragma option pop");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1207 fprintf(fserver,"\n#pragma option pop");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1208 fprintf(fserver,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1209 fprintf(fserver, "\n\n/* End of %s */\n", soapServer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1210 fclose(fserver);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1211 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1212 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1213
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1214 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1215 gen_class(FILE *fd, Entry *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1216 { Entry *Eptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1217 Tnode *typ = p->info.typ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1218 char *x;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1219 x = xsi_type(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1220 if (!x || !*x)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1221 x = wsdl_type(typ, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1222 typ->classed = True;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1223 if (is_header_or_fault(typ) || is_body(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1224 fprintf(fd, "\n\n#ifndef WITH_NOGLOBAL");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1225 if (typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1226 { fprintf(fd, "\n\n#ifndef %s", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1227 fprintf(fd, "\n#define %s (%d)\n",soap_type(typ),typ->num);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1228 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1229 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1230 fprintf(fd, "\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1231 if (is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1232 fprintf(fd, "#if 0 /* volatile type: do not declare here, declared elsewhere */\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1233 else if (is_transient(typ) && typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1234 fprintf(fd, "/* Transient type: */\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1235 else if (is_invisible(typ->id->name) && typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1236 fprintf(fd, "/* Operation wrapper: */\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1237 else if (is_hexBinary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1238 fprintf(fd, "/* hexBinary schema type: */\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1239 else if (is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1240 fprintf(fd, "/* Base64 schema type: */\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1241 else if (is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1242 fprintf(fd, "/* Choice: */\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1243 else if (is_dynamic_array(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1244 { Eptr = ((Table*)typ->ref)->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1245 if (has_ns(typ) || is_untyped(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1246 fprintf(fd, "/* Sequence of %s schema type: */\n", x);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1247 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1248 { if (!eflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1249 { sprintf(errbuf, "array '%s' is not compliant with WS-I Basic Profile 1.0a, reason: SOAP encoded array", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1250 compliancewarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1251 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1252 fprintf(fd, "/* SOAP encoded array of %s schema type: */\n", x);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1253 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1254 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1255 else if (is_primclass(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1256 fprintf(fd, "/* Primitive %s schema type: */\n", x);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1257 else if (!strcmp(typ->id->name, "SOAP_ENV__Header"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1258 fprintf(fd, "/* SOAP Header: */\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1259 else if (!strcmp(typ->id->name, "SOAP_ENV__Fault"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1260 fprintf(fd, "/* SOAP Fault: */\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1261 else if (!strcmp(typ->id->name, "SOAP_ENV__Code"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1262 fprintf(fd, "/* SOAP Fault Code: */\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1263 else if (x && *x && typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1264 fprintf(fd, "/* %s */\n", x);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1265 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1266 if (typ->type == Tstruct)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1267 { DBGLOG(fprintf(stderr,"\nstruct %s\n", typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1268 if (typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1269 { int permission = -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1270 fprintf(fd, "struct %s\n{", ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1271 for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1272 { if (!cflag && permission != (Eptr->info.sto & (Sprivate | Sprotected)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1273 { if (Eptr->info.sto & Sprivate)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1274 fprintf(fd, "\nprivate:");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1275 else if (Eptr->info.sto & Sprotected)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1276 fprintf(fd, "\nprotected:");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1277 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1278 fprintf(fd, "\npublic:");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1279 permission = (Eptr->info.sto & (Sprivate | Sprotected));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1280 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1281 if (cflag && Eptr->info.typ->type == Tfun)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1282 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1283 if (cflag && (Eptr->info.sto & Stypedef))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1284 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1285 fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1286 /*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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1287 fprintf(fd, "class ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1288 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1289 if (Eptr->sym == typ->id && Eptr->info.typ->type == Tfun) /* a hack to emit constructor in a struct, where constructor has no return value */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1290 ((FNinfo*)Eptr->info.typ->ref)->ret = mknone();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1291 fprintf(fd, "%s", c_type_id(Eptr->info.typ,Eptr->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1292 if (Eptr->info.sto & Sconst)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1293 fprintf(fd, "%s;", c_init(Eptr));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1294 else if (Eptr->info.sto & Sconstobj)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1295 fprintf(fd, " const;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1296 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1297 fprintf(fd, ";");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1298 if (Eptr->info.sto & Sreturn)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1299 fprintf(fd, "\t/* SOAP 1.2 RPC return element (when namespace qualified) */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1300 if (is_external(Eptr->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1301 fprintf(fd, "\t/* external */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1302 if (is_transient(Eptr->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1303 fprintf(fd, "\t/* transient */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1304 if (is_imported(Eptr->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1305 fprintf(fd, "\t/* type imported from %s */", Eptr->info.typ->imported);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1306 if (Eptr->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1307 { if (Eptr->info.minOccurs >= 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1308 fprintf(fd, "\t/* required attribute of type %s */", wsdl_type(Eptr->info.typ, ""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1309 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1310 fprintf(fd, "\t/* optional attribute of type %s */", wsdl_type(Eptr->info.typ, ""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1311 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1312 if (Eptr->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1313 fprintf(fd, "\t/* not serialized */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1314 else if (Eptr->info.sto & SmustUnderstand)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1315 fprintf(fd, "\t/* mustUnderstand */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1316 else if (!is_dynamic_array(typ) && is_repetition(Eptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1317 { if (Eptr->info.maxOccurs > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1318 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1319 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1320 fprintf(fd, "\t/* sequence of elements <%s> */", ns_convert(Eptr->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1321 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1322 else if (is_anytype(Eptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1323 fprintf(fd, "\t/* any type of element <%s> (defined below) */", ns_convert(Eptr->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1324 else if (is_choice(Eptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1325 fprintf(fd, "\t/* union discriminant (of union defined below) */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1326 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1327 { if (Eptr->info.maxOccurs > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1328 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, ""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1329 else if (Eptr->info.minOccurs >= 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1330 fprintf(fd, "\t/* required element of type %s */", wsdl_type(Eptr->info.typ, ""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1331 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1332 fprintf(fd, "\t/* optional element of type %s */", wsdl_type(Eptr->info.typ, ""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1333 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1334 if (!is_dynamic_array(typ) && !is_primclass(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1335 { if (!strncmp(Eptr->sym->name, "__size", 6))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1336 { if (!Eptr->next || Eptr->next->info.typ->type != Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1337 { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in struct '%s'", Eptr->sym->name, typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1338 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1339 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1340 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1341 else if (!strncmp(Eptr->sym->name, "__type", 6))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1342 { if (!Eptr->next || ((Eptr->next->info.typ->type != Tpointer || ((Tnode*)Eptr->next->info.typ->ref)->type != Tvoid)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1343 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1344 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1345 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1346 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1347 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1348 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1349 if (!cflag && !is_transient(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1350 { fprintf(fd,"\npublic:\n\tint soap_type() const { return %d; } /* = unique type id %s */", typ->num, soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1351 #if 0
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1352 /* ctor not allowed in unions, so keep things simple for structs */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1353 if (!has_constructor(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1354 { fprintf(fd,"\n\t %s()", ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1355 fprintf(fd, " { void soap_default_%s(struct soap*, %s); soap_default_%s(NULL, this); }", c_ident(typ), c_type_id(typ, "*"), c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1356 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1357 if (!has_destructor(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1358 fprintf(fd,"\n\tvirtual ~%s() { }", ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1359 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1360 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1361 if (!((Table*)typ->ref)->list)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1362 { if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1363 fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\n\tchar dummy;\t/* dummy member to enable compilation */\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1364 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1365 fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\nprivate:\n\tchar dummy;\t/* dummy member to enable compilation */\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1366 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1367 fprintf(fd, "\n};");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1368 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1369 else if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1370 { sprintf(errbuf, "struct '%s' is empty", typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1371 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1372 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1373 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1374 else if (typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1375 { DBGLOG(fprintf(stderr,"\nclass %s\n", typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1376 if (typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1377 { int permission = -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1378 fprintf(fd,"class SOAP_CMAC %s", ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1379 if (typ->base)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1380 fprintf(fd," : public %s", ident(typ->base->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1381 fprintf(fd,"\n{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1382 for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1383 { if (permission != (Eptr->info.sto & (Sprivate | Sprotected)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1384 { if (Eptr->info.sto & Sprivate)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1385 fprintf(fd, "\nprivate:");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1386 else if (Eptr->info.sto & Sprotected)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1387 fprintf(fd, "\nprotected:");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1388 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1389 fprintf(fd, "\npublic:");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1390 permission = (Eptr->info.sto & (Sprivate | Sprotected));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1391 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1392 fprintf(fd,"\n\t%s", c_storage(Eptr->info.sto));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1393 /* 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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1394 fprintf(fd, "class ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1395 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1396 fprintf(fd,"%s", c_type_id(Eptr->info.typ,Eptr->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1397 if (Eptr->info.sto & Sconstobj)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1398 fprintf(fd, " const");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1399 if (Eptr->info.sto & Sconst)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1400 fprintf(fd, "%s;", c_init(Eptr));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1401 else if (Eptr->info.sto & Sabstract)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1402 fprintf(fd, " = 0;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1403 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1404 fprintf(fd, ";");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1405 if (Eptr->info.sto & Sreturn)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1406 fprintf(fd, "\t/* SOAP 1.2 RPC return element (when namespace qualified) */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1407 if (is_external(Eptr->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1408 fprintf(fd, "\t/* external */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1409 if (is_transient(Eptr->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1410 fprintf(fd, "\t/* transient */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1411 if (is_imported(Eptr->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1412 fprintf(fd, "\t/* type imported from %s */", Eptr->info.typ->imported);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1413 if (Eptr->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1414 { if (Eptr->info.minOccurs >= 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1415 fprintf(fd, "\t/* required attribute */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1416 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1417 fprintf(fd, "\t/* optional attribute */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1418 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1419 if (Eptr->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1420 fprintf(fd, "\t/* not serialized */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1421 else if (Eptr->info.sto & SmustUnderstand)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1422 fprintf(fd, "\t/* mustUnderstand */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1423 else if (!is_dynamic_array(typ) && is_repetition(Eptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1424 { if (Eptr->info.maxOccurs > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1425 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1426 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1427 fprintf(fd, "\t/* sequence of elements <%s> */", ns_convert(Eptr->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1428 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1429 else if (is_anytype(Eptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1430 fprintf(fd, "\t/* any type of element <%s> (defined below) */", ns_convert(Eptr->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1431 else if (is_choice(Eptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1432 fprintf(fd, "\t/* union discriminant (of union defined below) */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1433 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1434 { if (Eptr->info.maxOccurs > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1435 fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements */", Eptr->info.minOccurs, Eptr->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1436 else if (Eptr->info.minOccurs >= 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1437 fprintf(fd, "\t/* required element of type %s */", wsdl_type(Eptr->info.typ, ""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1438 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1439 fprintf(fd, "\t/* optional element of type %s */", wsdl_type(Eptr->info.typ, ""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1440 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1441 if (!is_dynamic_array(typ) && !is_primclass(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1442 { if (!strncmp(Eptr->sym->name, "__size", 6))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1443 { if (!Eptr->next || Eptr->next->info.typ->type != Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1444 { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in struct '%s'", Eptr->sym->name, typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1445 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1446 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1447 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1448 else if (!strncmp(Eptr->sym->name, "__type", 6))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1449 { if (!Eptr->next || ((Eptr->next->info.typ->type != Tpointer || ((Tnode*)Eptr->next->info.typ->ref)->type != Tvoid)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1450 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1451 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1452 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1453 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1454 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1455 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1456 if (!is_transient(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1457 { fprintf(fd,"\npublic:\n\tvirtual int soap_type() const { return %d; } /* = unique type id %s */", typ->num, soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1458 fprintf(fd,"\n\tvirtual void soap_default(struct soap*);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1459 fprintf(fd,"\n\tvirtual void soap_serialize(struct soap*) const;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1460 if (kflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1461 fprintf(fd,"\n\tvirtual void soap_traverse(struct soap*, const char *s, soap_walker, soap_walker);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1462 fprintf(fd,"\n\tvirtual int soap_put(struct soap*, const char*, const char*) const;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1463 fprintf(fd,"\n\tvirtual int soap_out(struct soap*, const char*, int, const char*) const;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1464 fprintf(fd,"\n\tvirtual void *soap_get(struct soap*, const char*, const char*);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1465 fprintf(fd,"\n\tvirtual void *soap_in(struct soap*, const char*, const char*);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1466 if (!has_constructor(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1467 { fprintf(fd,"\n\t %s()", ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1468 fprintf(fd, " { %s::soap_default(NULL); }", ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1469 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1470 if (!has_destructor(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1471 fprintf(fd,"\n\tvirtual ~%s() { }", ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1472 /* the use of 'friend' causes problems linking static functions. Adding these friends could enable serializing protected/private members (which is not implemented)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1473 fprintf(fd,"\n\tfriend %s *soap_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", typ->id->name, typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1474 fprintf(fd,"\n\tfriend %s *soap_in_%s(struct soap*, const char*, %s*, const char*);", typ->id->name, typ->id->name, typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1475 fprintf(fd,"\n\tfriend int soap_out_%s(struct soap*, const char*, int, const %s*, const char*);", typ->id->name, typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1476 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1477 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1478 else if (!((Table*)typ->ref)->list)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1479 fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\nprivate:\n\tchar dummy;\t/* dummy member to enable compilation */\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1480 fprintf(fd,"\n};");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1481 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1482 else if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1483 { sprintf(errbuf, "class '%s' is empty", typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1484 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1485 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1486 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1487 else if (typ->type == Tunion)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1488 { int i = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1489 if (typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1490 { fprintf(fd, "union %s\n{", ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1491 for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1492 { fprintf(fd, "\n#define SOAP_UNION_%s_%s\t(%d)", c_ident(typ), ident(Eptr->sym->name), i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1493 i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1494 fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1495 fprintf(fd, "%s;", c_type_id(Eptr->info.typ,Eptr->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1496 if (Eptr->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1497 fprintf(fd, "\t/* const field cannot be deserialized */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1498 if (is_external(Eptr->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1499 fprintf(fd, "\t/* external */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1500 if (is_transient(Eptr->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1501 fprintf(fd, "\t/* transient */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1502 if (Eptr->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1503 { fprintf(fd, "\t/* attribute not allowed in union */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1504 sprintf(errbuf, "union '%s' contains attribute declarations", typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1505 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1506 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1507 if (Eptr->info.sto & SmustUnderstand)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1508 fprintf(fd, "\t/* mustUnderstand */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1509 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1510 fprintf(fd, "\n};");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1511 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1512 else if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1513 { sprintf(errbuf, "union '%s' is empty", typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1514 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1515 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1516 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1517 if (is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1518 fprintf(fd, "\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1519 if ((typ->type == Tstruct || typ->type == Tunion) && p->sym->token == TYPE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1520 fprintf(fd, "\ntypedef %s %s;", c_type(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1521 if (typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1522 fprintf(fd, "\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1523 if (is_header_or_fault(typ) || is_body(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1524 fprintf(fd, "\n\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1525 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1526 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1527
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1528 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1529 generate_header(Table *t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1530 { Entry *p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1531 banner(fheader, "Enumerations");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1532 fflush(fheader);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1533 if (enumtable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1534 for (p = enumtable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1535 { char *x;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1536 if (is_imported(p->info.typ) || (is_transient(p->info.typ) && !p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1537 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1538 x = xsi_type(p->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1539 if (!x || !*x)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1540 x = wsdl_type(p->info.typ, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1541 fprintf(fheader, "\n\n#ifndef %s", soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1542 fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1543 if (is_volatile(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1544 fprintf(fheader, "\n#if 0 /* volatile type: do not redeclare here */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1545 if (is_mask(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1546 fprintf(fheader, "\n/* Bitmask %s */", x);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1547 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1548 fprintf(fheader, "\n/* %s */", x);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1549 fprintf(fheader, "\nenum %s { ", ident(p->info.typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1550 if ((Table*)p->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1551 { const char *c = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1552 for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1553 { if (q->info.val.i <= 0x7FFFLL && q->info.val.i >= -0x8000LL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1554 fprintf(fheader, "%s%s = " SOAP_LONG_FORMAT, c, ident(q->sym->name), q->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1555 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1556 fprintf(fheader, "%s%s = " SOAP_LONG_FORMAT "LL", c, ident(q->sym->name), q->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1557 c = ", ";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1558 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1559 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1560 fprintf(fheader, " };");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1561 if (p->sym->token == TYPE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1562 fprintf(fheader, "\ntypedef %s %s;", c_type(p->info.typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1563 if (is_volatile(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1564 fprintf(fheader, "\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1565 fprintf(fheader, "\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1566 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1567 banner(fheader, "Types with Custom Serializers");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1568 fflush(fheader);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1569 if (typetable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1570 for (p = typetable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1571 { if (is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_imported(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1572 { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1573 fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1574 fprintf(fheader, "\n%s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1575 fprintf(fheader, "\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1576 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1577 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1578 if (typetable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1579 for (p = typetable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1580 { 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1581 { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1582 fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1583 fprintf(fheader,"\n%sstd::string %s;", c_storage(p->info.sto), p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1584 fprintf(fheader, "\n#endif\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1585 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1586 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1587 banner(fheader, "Classes and Structs");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1588 fflush(fheader);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1589 if (classtable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1590 for (p = classtable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1591 { if (!is_imported(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1592 gen_class(fheader, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1593 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1594 banner(fheader, "Typedefs");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1595 fflush(fheader);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1596 if (typetable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1597 for (p = typetable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1598 { 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1599 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1600 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1601 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1602 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1603 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1604 if (!is_external(p->info.typ) && !is_imported(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1605 { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1606 fprintf(fheader, "\n#define %s (%d)",soap_type(p->info.typ),p->info.typ->num);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1607 fprintf(fheader,"\n%s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1608 fprintf(fheader, "\n#endif\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1609 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1610 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1611 banner(fheader, "Externals");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1612 fflush(fheader);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1613 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1614 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1615 if (p->info.typ->type != Tfun || p->info.sto & Sextern)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1616 { fprintf(fheader,"\n\nextern %s", c_storage(p->info.sto));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1617 fprintf(fheader,"%s;", c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1618 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1619 fflush(fheader);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1620 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1621
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1622 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1623 get_namespace_prefixes(void)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1624 { Symbol *p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1625 int i, n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1626 char *s, buf[256];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1627 if (nslist)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1628 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1629 for (p = symlist; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1630 { if (*p->name != '~')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1631 { s = p->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1632 while (*s == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1633 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1634 n = (int)(strlen(s) - 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1635 for (i = 1; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1636 { if (s[i] == ':'
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1637 || (s[i-1] != '_' && s[i] == '_' && s[i+1] == '_' && s[i+2] && s[i+2] != '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1638 || (s[i-1] != '_' && (!strncmp(s+i, "___DOT", 6)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1639 || !strncmp(s+i, "___USCORE", 9)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1640 || (!strncmp(s+i, "___x", 4) && isxdigit(s[i+4]) && isxdigit(s[i+5]) && isxdigit(s[i+6]) && isxdigit(s[i+7])))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1641 { if (s[i+1] == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1642 { i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1643 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1644 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1645 strncpy(buf, s, i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1646 buf[i] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1647 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1648 goto nsnext;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1649 for (q = nslist; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1650 if (!strcmp(q->name, buf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1651 goto nsnext;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1652 q = (Symbol*)emalloc(sizeof(Symbol));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1653 q->name = (char*)emalloc(i+1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1654 strcpy(q->name, buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1655 q->name[i] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1656 q->next = nslist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1657 nslist = q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1658 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1659 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1660 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1661 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1662 nsnext:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1663 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1664 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1665 q = (Symbol*)emalloc(sizeof(Symbol));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1666 q->name = "xsd";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1667 q->next = nslist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1668 nslist = q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1669 q = (Symbol*)emalloc(sizeof(Symbol));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1670 q->name = "xsi";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1671 q->next = nslist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1672 nslist = q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1673 q = (Symbol*)emalloc(sizeof(Symbol));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1674 q->name = "SOAP-ENC";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1675 q->next = nslist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1676 nslist = q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1677 q = (Symbol*)emalloc(sizeof(Symbol));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1678 q->name = "SOAP-ENV";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1679 q->next = nslist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1680 nslist = q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1681 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1682
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1683 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1684 generate_schema(Table *t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1685 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1686 Symbol *ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1687 char *name = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1688 char *URL = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1689 char *executable = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1690 char *URI = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1691 char *style = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1692 char *encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1693 char *protocol = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1694 char *import = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1695 Service *sp = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1696 char buf[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1697 FILE *fd;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1698 int flag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1699 get_namespace_prefixes();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1700 for (ns = nslist; ns; ns = ns->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1701 { if (!strcmp(ns->name, "SOAP-ENV") || !strcmp(ns->name, "SOAP-ENC") || !strcmp(ns->name, "xsi") || !strcmp(ns->name, "xsd"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1702 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1703 name = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1704 URL = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1705 executable = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1706 URI = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1707 style = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1708 encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1709 import = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1710 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1711 { if (!tagcmp(sp->ns, ns->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1712 { name = ns_cname(sp->name, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1713 URL = sp->URL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1714 executable = sp->executable;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1715 URI = sp->URI;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1716 style = sp->style;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1717 encoding = sp->encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1718 protocol = sp->protocol;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1719 import = sp->import;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1720 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1721 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1722 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1723 if (!URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1724 { URI = emalloc(strlen(tmpURI) + strlen(ns->name) + 6);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1725 sprintf(URI, "%s/%s.xsd", tmpURI, ns_convert(ns->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1726 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1727 if (vflag >= 0 && is_document(style) && encoding && !*encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1728 { semwarn("Cannot use document style with SOAP encoding");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1729 encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1730 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1731 if (!name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1732 name = "Service";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1733 if (!URL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1734 URL = "http://localhost:80";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1735 if (!import)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1736 flag = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1737 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1738 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1739 { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1740 { if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1741 fprintf(fmsg, "Using %s service name: %s\n", ns->name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1742 if (protocol)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1743 fprintf(fmsg, "Using %s service protocol: %s\n", ns->name, protocol);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1744 if (style && vflag >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1745 fprintf(fmsg, "Using %s service style: %s\n", ns->name, style);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1746 else if (!eflag && vflag >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1747 fprintf(fmsg, "Using %s service style: document\n", ns->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1748 if (encoding && *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1749 fprintf(fmsg, "Using %s service encoding: %s\n", ns->name, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1750 else if (encoding && !*encoding && vflag >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1751 fprintf(fmsg, "Using %s service encoding: encoded\n", ns->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1752 else if (!eflag && vflag >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1753 fprintf(fmsg, "Using %s service encoding: literal\n", ns->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1754 if (URL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1755 fprintf(fmsg, "Using %s service location: %s\n", ns->name, URL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1756 if (executable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1757 fprintf(fmsg, "Using %s service executable: %s\n", ns->name, executable);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1758 if (import)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1759 fprintf(fmsg, "Using %s schema import: %s\n", ns->name, import);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1760 else if (URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1761 fprintf(fmsg, "Using %s schema namespace: %s\n", ns->name, URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1762 if (sp && sp->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1763 sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1764 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1765 sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(ns->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1766 if (!wflag && !import)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1767 { fprintf(fmsg, "Saving %s Web Service description\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1768 fd = fopen(buf, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1769 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1770 execerror("Cannot write WSDL file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1771 gen_wsdl(fd, t, ns->name, name, URL, executable, URI, style, encoding, protocol);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1772 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1773 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1774 if (!cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1775 { if (iflag || jflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1776 { char *sname;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1777 if (sp && sp->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1778 sname = sp->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1779 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1780 sname = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1781 if (!Sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1782 { char *name1 = ns_cname(sname, "Proxy");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1783 sprintf(buf, "%s%s%s.h", dirpath, prefix, name1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1784 fprintf(fmsg, "Saving %s client proxy class\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1785 fd = fopen(buf, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1786 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1787 execerror("Cannot write proxy class file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1788 sprintf(buf, "%s%s.h", prefix, name1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1789 copyrightnote(fd, buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1790 gen_proxy_header(fd, t, ns, name1, URL, executable, URI, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1791 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1792 sprintf(buf, "%s%s%s.cpp", dirpath, prefix, name1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1793 fprintf(fmsg, "Saving %s client proxy class\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1794 fd = fopen(buf, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1795 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1796 execerror("Cannot write proxy class file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1797 sprintf(buf, "%s%s.cpp", prefix, name1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1798 copyrightnote(fd, buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1799 gen_proxy_code(fd, t, ns, name1, URL, executable, URI, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1800 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1801 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1802 if (!Cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1803 { char *name1 = ns_cname(sname, "Service");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1804 sprintf(buf, "%s%s%s.h", dirpath, prefix, name1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1805 fprintf(fmsg, "Saving %s service class\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1806 fd = fopen(buf, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1807 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1808 execerror("Cannot write service class file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1809 sprintf(buf, "%s%s.h", prefix, name1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1810 copyrightnote(fd, buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1811 gen_object_header(fd, t, ns, name1, URL, executable, URI, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1812 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1813 sprintf(buf, "%s%s%s.cpp", dirpath, prefix, name1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1814 fprintf(fmsg, "Saving %s service class\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1815 fd = fopen(buf, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1816 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1817 execerror("Cannot write service class file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1818 sprintf(buf, "%s%s.cpp", prefix, name1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1819 copyrightnote(fd, buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1820 gen_object_code(fd, t, ns, name1, URL, executable, URI, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1821 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1822 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1823 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1824 else if (zflag == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1825 { if (!Sflag && sp && sp->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1826 { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Proxy"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1827 fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1828 fd = fopen(buf, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1829 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1830 execerror("Cannot write proxy file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1831 sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Proxy"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1832 copyrightnote(fd, buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1833 gen_proxy(fd, t, ns, name, URL, executable, URI, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1834 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1835 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1836 else if (!Sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1837 { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Proxy"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1838 fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1839 fd = fopen(buf, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1840 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1841 execerror("Cannot write proxy file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1842 sprintf(buf, "%s.h", ns_cname(prefix, "Proxy"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1843 copyrightnote(fd, buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1844 gen_proxy(fd, t, ns, "Service", URL, executable, URI, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1845 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1846 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1847 if (!Cflag && sp && sp->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1848 { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Object"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1849 fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1850 fd = fopen(buf, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1851 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1852 execerror("Cannot write server object file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1853 sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Object"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1854 copyrightnote(fd, buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1855 gen_object(fd, t, ns, name, URL, executable, URI, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1856 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1857 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1858 else if (!Cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1859 { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Object"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1860 fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1861 fd = fopen(buf, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1862 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1863 execerror("Cannot write server object file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1864 sprintf(buf, "%s.h", ns_cname(prefix, "Object"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1865 copyrightnote(fd, buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1866 gen_object(fd, t, ns, "Service", URL, executable, URI, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1867 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1868 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1869 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1870 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1871 if (!xflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1872 { strcpy(buf, dirpath);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1873 if (sp && sp->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1874 strcat(buf, ns_fname(name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1875 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1876 strcat(buf, ns_fname(ns->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1877 strcat(buf, ".");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1878 gen_data(buf, t, ns->name, name, URL, executable, URI, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1879 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1880 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1881 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1882 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1883 if (sp && sp->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1884 { has_nsmap = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1885 if (nflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1886 sprintf(buf, "%s%s.nsmap", dirpath, prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1887 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1888 sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1889 fprintf(fmsg, "Saving %s namespace mapping table\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1890 fd = fopen(buf, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1891 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1892 execerror("Cannot write nsmap file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1893 fprintf(fd, "\n#include \"%sH.h\"", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1894 if (nflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1895 fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] =\n", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1896 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1897 fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] =\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1898 gen_nsmap(fd, ns, URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1899 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1900
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1901 if (Tflag && !Cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1902 { Entry *method;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1903 char soapTester[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1904 char pathsoapTester[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1905 char *name1 = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1906 Tflag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1907 strcpy(soapTester, prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1908 strcat(soapTester, "Tester");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1909 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1910 strcat(soapTester, ".c");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1911 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1912 strcat(soapTester, ".cpp");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1913 strcpy(pathsoapTester, dirpath);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1914 strcat(pathsoapTester, soapTester);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1915 fprintf(fmsg, "Saving %s server auto-test code\n", pathsoapTester);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1916 fd = fopen(pathsoapTester,"w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1917 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1918 execerror("Cannot write to file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1919 copyrightnote(fd, soapTester);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1920 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 \"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1921 if (iflag || jflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1922 { char *sname;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1923 if (sp && sp->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1924 sname = sp->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1925 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1926 sname = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1927 name1 = ns_cname(sname, "Service");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1928 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1929 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1930 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1931 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");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1932 for (method = t->list; method; method = method->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1933 { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1934 { Entry *p, *q = entry(t, method->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1935 Table *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1936 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1937 p = (Entry*)q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1938 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1939 { fprintf(stderr, "Internal error: no table entry\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1940 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1941 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1942 q = entry(classtable, method->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1943 r = (Table*)q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1944 if (iflag || jflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1945 fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s::%s(", method->sym->name, name1, ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1946 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1947 fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s(struct soap *soap", method->sym->name, ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1948 gen_params(fd, r, p, !iflag && !jflag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1949 /* single param to single param echo */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1950 if (p && r && r->list && r->list->info.typ == p->info.typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1951 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1952 else if (p && r && r->list && p->info.typ->type == Tpointer && r->list->info.typ == (Tnode*)p->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1953 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1954 else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ == (Tnode*)p->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1955 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1956 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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1957 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1958 /* params to wrapped params echo */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1959 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1960 { fprintf(fd, "\n{\t");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1961 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1962 { const char *s, *a;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1963 int d = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1964 s = ident(p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1965 if (p->info.typ->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1966 a = ".";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1967 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1968 a = "->";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1969 for (p = ((Table*)((Tnode*)p->info.typ->ref)->ref)->list, q = r->list; p && q; p = p->next, q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1970 { if (p->info.typ == q->info.typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1971 fprintf(fd, "\n\t%s%s%s = %s;", s, a, ident(p->sym->name), ident(q->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1972 else if (q->info.typ->type == Tpointer && p->info.typ == (Tnode*)q->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1973 fprintf(fd, "\n\t%s%s%s = *%s;", s, a, ident(p->sym->name), ident(q->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1974 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1975 d = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1976 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1977 if (!d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1978 fprintf(fd, "\n\t/* Return incomplete response with default data values */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1979 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1980 fprintf(fd, "\n\treturn SOAP_OK;\n}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1981 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1982 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1983 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1984 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1985 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1986 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1987 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1988 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1989 if (!wflag && !import)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1990 { sprintf(buf, "%s%s.xsd", dirpath, ns_cname(ns->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1991 fprintf(fmsg, "Saving %s XML schema\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1992 fd = fopen(buf, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1993 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1994 execerror("Cannot write schema file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1995 fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1996 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1997 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1998 if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1999 { gen_schema(fd, t, ns->name, ns->name, 0, 1, URL, URI, style, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2000 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2001 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2002 if (!t || !p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2003 gen_schema(fd, t, ns->name, ns->name, 0, 0, URL, URI, style, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2004 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2005 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2006 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2007 if (!has_nsmap && flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2008 { if (Tflag && !Cflag && !iflag && !jflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2009 fprintf(fmsg, "Warning: cannot save soapTester, need directive //gsoap service name\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2010 for (ns = nslist; ns; ns = ns->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2011 if (strcmp(ns->name, "SOAP-ENV") && strcmp(ns->name, "SOAP-ENC") && strcmp(ns->name, "xsi") && strcmp(ns->name, "xsd"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2012 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2013 if (nflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2014 sprintf(buf, "%s%s.nsmap", dirpath, prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2015 else if (ns && ns->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2016 sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(ns->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2017 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2018 sprintf(buf, "%ssoap.nsmap", dirpath);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2019 fprintf(fmsg, "Saving %s namespace mapping table\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2020 fd = fopen(buf, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2021 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2022 execerror("Cannot write nsmap file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2023 fprintf(fd, "\n#include \"%sH.h\"", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2024 if (nflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2025 fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] =\n", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2026 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2027 fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] =\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2028 gen_nsmap(fd, ns, URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2029 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2030 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2031 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2032
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2033 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2034 chkhdr(char *part)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2035 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2036 p = entry(classtable, lookup("SOAP_ENV__Header"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2037 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2038 for (p = ((Table*)p->info.typ->ref)->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2039 if (has_ns_eq(NULL, p->sym->name) && (!strcmp(part, p->sym->name) || is_eq_nons(part, p->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2040 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2041 sprintf(errbuf, "Cannot define method-header-part in WSDL: SOAP_ENV__Header \"%s\" member field is not qualified", part);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2042 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2043 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2044 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2045
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2046 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2047 gen_wsdl(FILE *fd, Table *t, char *ns, char *name, char *URL, char *executable, char *URI, char *style, char *encoding, char *protocol)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2048 { Entry *p, *q, *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2049 Symbol *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2050 Service *sp, *sp2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2051 Method *m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2052 const char *mimein = NULL, *mimeout = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2053 int prot, mask = 0x0; /* 0x1 = SOAP, 0x2 = GET, 0x4 = PUT, 0x8 = POST */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2054 char *action, *comment, *method_style = NULL, *method_encoding = NULL, *method_response_encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2055 char *portname;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2056 char *binding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2057 fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2058 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2059 if (!tagcmp(sp->ns, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2060 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2061 if (sp && sp->definitions)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2062 fprintf(fd, "<definitions name=\"%s\"\n", sp->definitions);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2063 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2064 fprintf(fd, "<definitions name=\"%s\"\n", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2065 if (sp && sp->WSDL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2066 fprintf(fd, " targetNamespace=\"%s\"\n xmlns:tns=\"%s\"", sp->WSDL, sp->WSDL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2067 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2068 fprintf(fd, " targetNamespace=\"%s/%s.wsdl\"\n xmlns:tns=\"%s/%s.wsdl\"", URI, name, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2069 if (sp && sp->binding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2070 binding = ns_cname(sp->binding, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2071 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2072 binding = name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2073 if (sp && sp->portname)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2074 portname = ns_cname(sp->portname, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2075 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2076 portname = name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2077 for (s = nslist; s; s = s->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2078 { for (sp2 = services; sp2; sp2 = sp2->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2079 if (!tagcmp(sp2->ns, s->name) && sp2->URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2080 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2081 if (sp2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2082 fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2083 else if (!strcmp(s->name, "SOAP-ENV"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2084 fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2085 else if (!strcmp(s->name, "SOAP-ENC"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2086 fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2087 else if (!strcmp(s->name, "xsi"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2088 fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2089 else if (!strcmp(s->name, "xsd"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2090 fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2091 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2092 fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2093 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2094 if (is_soap12(encoding))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2095 fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap12/\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2096 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2097 fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap/\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2098 fprintf(fd, "\n xmlns:HTTP=\"http://schemas.xmlsoap.org/wsdl/http/\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2099 fprintf(fd, "\n xmlns:MIME=\"http://schemas.xmlsoap.org/wsdl/mime/\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2100 fprintf(fd, "\n xmlns:DIME=\"http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2101 fprintf(fd, "\n xmlns:WSDL=\"http://schemas.xmlsoap.org/wsdl/\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2102 fprintf(fd, "\n xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2103 fprintf(fd, "<types>\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2104 for (s = nslist; s; s = s->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2105 gen_schema(fd, t, ns, s->name, !strcmp(s->name, ns), 1, URL, URI, style, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2106 fprintf(fd, "</types>\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2107 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2108 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2109 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2110 { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2111 { mimein = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2112 mimeout = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2113 comment = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2114 method_style = style;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2115 method_encoding = encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2116 method_response_encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2117 if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2118 { for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2119 { if (is_eq_nons(m->name, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2120 { if (m->mess&MIMEIN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2121 mimein = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2122 if (m->mess&MIMEOUT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2123 mimeout = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2124 if (m->mess == ENCODING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2125 method_encoding = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2126 else if (m->mess == RESPONSE_ENCODING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2127 method_response_encoding = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2128 else if (m->mess == STYLE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2129 method_style = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2130 else if (m->mess == COMMENT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2131 comment = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2132 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2133 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2134 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2135 if (!method_response_encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2136 method_response_encoding = method_encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2137 if (get_response(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2138 fprintf(fd, "<message name=\"%sRequest\">\n", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2139 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2140 fprintf(fd, "<message name=\"%s\">\n", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2141 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2142 if (is_document(method_style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2143 { if (is_invisible(p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2144 { q = entry(classtable, p->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2145 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2146 { q = ((Table*)q->info.typ->ref)->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2147 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2148 { if (is_invisible(q->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2149 { r = entry(classtable, q->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2150 if (r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2151 { r = ((Table*)r->info.typ->ref)->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2152 if (r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2153 { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(r, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2154 if (gen_member_documentation(fd, p->sym, r, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2155 fprintf(fd, " </part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2156 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2157 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2158 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2159 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2160 { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(q, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2161 if (gen_member_documentation(fd, p->sym, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2162 fprintf(fd, " </part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2163 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2164 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2165 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2166 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2167 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2168 { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(p, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2169 if (gen_member_documentation(fd, p->sym, p, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2170 fprintf(fd, " </part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2171 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2172 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2173 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2174 { q = entry(classtable, p->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2175 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2176 { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2177 { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2178 { if (is_literal(method_encoding))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2179 { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2180 if (gen_member_documentation(fd, p->sym, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2181 fprintf(fd, " </part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2182 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2183 else if (is_XML(q->info.typ) || is_stdXML(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2184 fprintf(fd, " <part name=\"Body\" type=\"xsd:anyType\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2185 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2186 { fprintf(fd, " <part name=\"%s\" type=\"%s\"", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2187 if (gen_member_documentation(fd, p->sym, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2188 fprintf(fd, " </part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2189 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2190 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2191 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2192 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2193 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2194 if (mimein)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2195 fprintf(fd, " <part name=\"Attachments\" type=\"xsd:base64Binary\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2196 fprintf(fd, "</message>\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2197 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2198 q = (Entry*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2199 for (r = t->list; r; r = r->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2200 if (r != p && r->info.typ->type == Tfun && !(r->info.sto & Sextern) && q == (Entry*)r->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2201 q = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2202 if (q && is_transient(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2203 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2204 else if (q && !is_response(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2205 { fprintf(fd, "<message name=\"%sResponse\">\n", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2206 if (is_document(method_style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2207 fprintf(fd, " <part name=\"Body\" element=\"%sResponse\"/>\n", ns_add(p, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2208 else if (is_literal(method_response_encoding))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2209 { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2210 if (gen_member_documentation(fd, p->sym, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2211 fprintf(fd, " </part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2212 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2213 else if (is_XML((Tnode*)q->info.typ->ref) || is_stdXML((Tnode*)q->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2214 fprintf(fd, " <part name=\"Body\" type=\"xsd:anyType\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2215 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2216 { fprintf(fd, " <part name=\"%s\" type=\"%s\"", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2217 if (gen_member_documentation(fd, p->sym, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2218 fprintf(fd, " </part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2219 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2220 if (mimeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2221 fprintf(fd, " <part name=\"Attachments\" type=\"xsd:base64Binary\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2222 fprintf(fd, "</message>\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2223 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2224 else if (q && q->info.typ->wsdl == False)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2225 { q->info.typ->wsdl = True;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2226 fprintf(fd, "<message name=\"%s\">\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2227 if (is_document(method_style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2228 { if (has_ns_eq(NULL, ((Entry*)p->info.typ->ref)->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2229 fprintf(fd, " <part name=\"Body\" element=\"%s\"/>\n", ns_convert(((Entry*)p->info.typ->ref)->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2230 else if (is_invisible(((Tnode*)q->info.typ->ref)->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2231 { r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2232 if (r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2233 { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_add(r, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2234 if (gen_member_documentation(fd, p->sym, r, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2235 fprintf(fd, " </part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2236 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2237 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2238 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2239 { fprintf(fd, " <part name=\"Body\" element=\"%s\"", ns_convert(((Tnode*)q->info.typ->ref)->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2240 if (gen_member_documentation(fd, p->sym, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2241 fprintf(fd, " </part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2242 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2243 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2244 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2245 { if (((Tnode*)q->info.typ->ref)->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2246 { for (q = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2247 { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2248 { if (is_literal(method_response_encoding))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2249 { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2250 if (gen_member_documentation(fd, p->sym, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2251 fprintf(fd, " </part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2252 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2253 else if (is_XML(q->info.typ) || is_stdXML(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2254 fprintf(fd, " <part name=\"Body\" type=\"xsd:anyType\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2255 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2256 { fprintf(fd, " <part name=\"%s\" type=\"%s\"", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2257 if (gen_member_documentation(fd, p->sym, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2258 fprintf(fd, " </part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2259 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2260 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2261 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2262 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2263 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2264 if (mimeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2265 fprintf(fd, " <part name=\"Attachments\" type=\"xsd:base64Binary\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2266 fprintf(fd, "</message>\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2267 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2268 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2269 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2270 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2271 if (custom_header)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2272 { Table *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2273 fprintf(fd, "<message name=\"%sHeader\">\n", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2274 r = (Table*)entry(classtable, lookup("SOAP_ENV__Header"))->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2275 if (r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2276 { for (q = r->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2277 { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2278 fprintf(fd, " <part name=\"%s\" element=\"%s\"/>\n", ns_remove(q->sym->name), ns_add(q, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2279 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2280 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2281 fprintf(fd, "</message>\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2282 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2283 if (custom_fault)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2284 { Table *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2285 fprintf(fd, "<message name=\"%sFault\">\n", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2286 r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2287 if (r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2288 for (q = r->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2289 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2290 { fprintf(fd, " <part name=\"%s\" element=\"%s\"", ns_remove(q->sym->name), ns_add(q, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2291 if (gen_member_documentation(fd, q->sym, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2292 fprintf(fd, " </part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2293 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2294 fprintf(fd, "</message>\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2295 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2296 if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2297 { for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2298 { if (m->mess&FAULT && m->part)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2299 { Method *m2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2300 int flag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2301 for (m2 = sp->list; m2 && m2 != m; m2 = m2->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2302 if (m2->mess&FAULT && !strcmp(m2->part, m->part))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2303 flag = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2304 if (!flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2305 { if (typetable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2306 for (p = typetable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2307 if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2308 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2309 if (!p && classtable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2310 for (p = classtable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2311 if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2312 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2313 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2314 { fprintf(fd, "<message name=\"%sFault\">\n", ns_remove(m->part));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2315 fprintf(fd, " <part name=\"Fault\" element=\"%s\"/>\n", ns_convert(m->part));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2316 fprintf(fd, "</message>\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2317 flag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2318 if (custom_fault)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2319 { Table *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2320 r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2321 if (r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2322 for (q = r->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2323 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)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2324 { flag = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2325 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2326 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2327 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2328 if (!flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2329 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2330 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2331 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2332 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2333 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2334 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2335 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2336 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2337 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2338 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2339 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2340 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2341 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2342 if (sp && sp->porttype)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2343 fprintf(fd, "<portType name=\"%s\">\n", sp->porttype);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2344 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2345 fprintf(fd, "<portType name=\"%s\">\n", ns_cname(name, "PortType"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2346 if (protocol)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2347 { if (strncmp(protocol, "SOAP", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2348 { if (strstr(protocol, "GET"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2349 mask = 0x2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2350 else if (strstr(protocol, "PUT"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2351 mask = 0x4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2352 else /* POST */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2353 mask = 0x8;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2354 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2355 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2356 mask = 0x1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2357 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2358 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2359 { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2360 { comment = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2361 if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2362 { for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2363 { if (m->mess == COMMENT && is_eq_nons(m->name, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2364 comment = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2365 else if (m->mess == PROTOCOL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2366 { if (strncmp(m->part, "SOAP", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2367 { if (strstr(m->part, "GET"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2368 mask |= 0x2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2369 else if (strstr(m->part, "PUT"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2370 mask |= 0x4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2371 else /* POST */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2372 mask |= 0x8;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2373 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2374 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2375 mask |= 0x1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2376 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2377 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2378 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2379 if (!mask)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2380 { if (vflag < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2381 mask = 0x8; /* -0 option: use POST */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2382 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2383 mask = 0x1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2384 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2385 fprintf(fd, " <operation name=\"%s\">\n", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2386 if (comment)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2387 fprintf(fd, " <documentation>%s</documentation>\n", comment);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2388 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2389 fprintf(fd, " <documentation>Service definition of function %s</documentation>\n", p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2390 if (get_response(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2391 fprintf(fd, " <input message=\"tns:%sRequest\"/>\n", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2392 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2393 fprintf(fd, " <input message=\"tns:%s\"/>\n", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2394 q = (Entry*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2395 if (q && is_transient(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2396 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2397 else if (q && !is_response(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2398 fprintf(fd, " <output message=\"tns:%sResponse\"/>\n", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2399 else if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2400 fprintf(fd, " <output message=\"tns:%s\"/>\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2401 if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2402 for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2403 if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2404 fprintf(fd, " <fault name=\"%s\" message=\"tns:%sFault\"/>\n", ns_remove(m->part), ns_remove(m->part));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2405 fprintf(fd, " </operation>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2406 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2407 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2408 fprintf(fd, "</portType>\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2409 for (prot = 0x1; prot <= 0x8; prot <<= 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2410 { if ((prot & mask))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2411 { const char *v = "", *b = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2412 switch (prot)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2413 { case 0x1: v = ""; b = "SOAP"; break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2414 case 0x2: v = "GET"; b = "HTTP"; break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2415 case 0x4: v = "PUT"; b = "HTTP"; break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2416 case 0x8: v = "POST"; b = "HTTP"; break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2417 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2418 fprintf(fd, "<binding name=\"%s%s\" ", binding, v);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2419 if (prot == 0x1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2420 { if (is_document(style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2421 { if (sp && sp->porttype)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2422 fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"document\"", sp->porttype);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2423 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2424 fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"document\"", ns_cname(name, "PortType"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2425 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2426 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2427 { if (sp && sp->porttype)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2428 fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"rpc\"", sp->porttype);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2429 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2430 fprintf(fd, "type=\"tns:%s\">\n <SOAP:binding style=\"rpc\"", ns_cname(name, "PortType"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2431 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2432 if (sp && sp->transport)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2433 fprintf(fd, " transport=\"%s\"/>\n", sp->transport);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2434 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2435 fprintf(fd, " transport=\"http://schemas.xmlsoap.org/soap/http\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2436 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2437 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2438 { if (sp && sp->porttype)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2439 fprintf(fd, "type=\"tns:%s\">\n <HTTP:binding verb=\"%s\"/>\n", sp->porttype, v);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2440 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2441 fprintf(fd, "type=\"tns:%s\">\n <HTTP:binding verb=\"%s\"/>\n", ns_cname(name, "PortType"), v);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2442 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2443 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2444 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2445 { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2446 { action = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2447 mimein = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2448 mimeout = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2449 method_style = style;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2450 method_encoding = encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2451 method_response_encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2452 if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2453 { int v = 0x1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2454 if (sp->protocol)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2455 { if (strncmp(sp->protocol, "SOAP", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2456 { if (strstr(sp->protocol, "GET"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2457 v = 0x2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2458 else if (strstr(sp->protocol, "PUT"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2459 v = 0x4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2460 else /* POST */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2461 v = 0x8;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2462 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2463 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2464 for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2465 { if (is_eq_nons(m->name, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2466 { if (m->mess&MIMEIN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2467 mimein = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2468 if (m->mess&MIMEOUT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2469 mimeout = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2470 if (m->mess == ENCODING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2471 method_encoding = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2472 else if (m->mess == RESPONSE_ENCODING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2473 method_response_encoding = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2474 else if (m->mess == STYLE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2475 method_style = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2476 else if (m->mess == ACTION || m->mess == REQUEST_ACTION)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2477 action = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2478 else if (m->mess == RESPONSE_ACTION)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2479 action = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2480 else if (m->mess == PROTOCOL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2481 { if (strncmp(m->part, "SOAP", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2482 { if (strstr(m->part, "GET"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2483 v = 0x2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2484 else if (strstr(m->part, "PUT"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2485 v = 0x4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2486 else /* POST */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2487 v = 0x8;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2488 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2489 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2490 v = 0x1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2491 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2492 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2493 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2494 if (vflag < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2495 v = 0x8;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2496 if (prot != v)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2497 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2498 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2499 if (!method_response_encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2500 method_response_encoding = method_encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2501 fprintf(fd, " <operation name=\"%s\">\n", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2502 if (prot == 0x1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2503 { if (is_document(style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2504 { if (is_document(method_style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2505 { if (is_soap12(encoding) && !*action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2506 fprintf(fd, " <SOAP:operation/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2507 else if (*action == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2508 fprintf(fd, " <SOAP:operation soapAction=%s/>\n", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2509 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2510 fprintf(fd, " <SOAP:operation soapAction=\"%s\"/>\n", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2511 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2512 else if (is_soap12(encoding) && !*action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2513 fprintf(fd, " <SOAP:operation style=\"rpc\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2514 else if (*action == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2515 fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=%s/>\n", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2516 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2517 fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=\"%s\"/>\n", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2518 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2519 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2520 { if (is_document(method_style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2521 { if (is_soap12(encoding) && !*action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2522 fprintf(fd, " <SOAP:operation style=\"document\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2523 else if (*action == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2524 fprintf(fd, " <SOAP:operation style=\"document\" soapAction=%s/>\n", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2525 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2526 fprintf(fd, " <SOAP:operation style=\"document\" soapAction=\"%s\"/>\n", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2527 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2528 else if (is_soap12(encoding) && !*action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2529 fprintf(fd, " <SOAP:operation style=\"rpc\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2530 else if (*action == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2531 fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=%s/>\n", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2532 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2533 fprintf(fd, " <SOAP:operation style=\"rpc\" soapAction=\"%s\"/>\n", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2534 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2535 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2536 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2537 { if (!*action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2538 fprintf(fd, " <HTTP:operation/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2539 else if (*action == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2540 fprintf(fd, " <HTTP:operation location=%s/>\n", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2541 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2542 fprintf(fd, " <HTTP:operation location=\"%s\"/>\n", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2543 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2544 fprintf(fd, " <input>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2545 q = entry(classtable, p->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2546 if (prot == 0x1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2547 { if (mimein)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2548 fprintf(fd, " <MIME:multipartRelated>\n <MIME:part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2549 if (is_literal(method_encoding) || (q && (q = (((Table*)q->info.typ->ref)->list)) && q && is_XML(q->info.typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2550 { if (is_document(method_style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2551 fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2552 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2553 fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\" namespace=\"%s\"/>\n", URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2554 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2555 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2556 { if (encoding && *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2557 fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2558 else if (method_encoding && *method_encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2559 fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, method_encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2560 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2561 fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2562 if (!eflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2563 { sprintf(errbuf, "operation '%s' is not compliant with WS-I Basic Profile 1.0a, reason: uses SOAP encoding", p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2564 compliancewarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2565 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2566 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2567 if (custom_header)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2568 { m = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2569 if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2570 { for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2571 if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDRIN))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2572 { if (chkhdr(m->part))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2573 fprintf(fd, " <SOAP:header use=\"literal\" message=\"tns:%sHeader\" part=\"%s\"/>\n", name, ns_remove(m->part));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2574 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2575 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2576 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2577 if (mimein)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2578 { if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2579 { for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2580 { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEIN))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2581 fprintf(fd, " </MIME:part>\n <MIME:part>\n <MIME:content part=\"Attachments\" type=\"%s\"/>\n", m->part);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2582 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2583 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2584 fprintf(fd, " </MIME:part>\n </MIME:multipartRelated>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2585 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2586 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2587 else if (prot == 0x2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2588 fprintf(fd, " <HTTP:urlEncoded/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2589 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2590 { if (mimein)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2591 fprintf(fd, " <MIME:content type=\"%s\"/>\n", mimein);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2592 else if (!q || is_document(method_style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2593 fprintf(fd, " <MIME:mimeXml part=\"Body\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2594 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2595 fprintf(fd, " <MIME:mimeXml part=\"%s\"/>\n", ns_remove(q->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2596 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2597 fprintf(fd, " </input>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2598
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2599 q = (Entry*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2600 if (!q || !q->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2601 { fprintf(fd, " </operation>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2602 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2603 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2604 if (prot != 0x4)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2605 { fprintf(fd, " <output>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2606 if (prot == 0x1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2607 { if (mimeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2608 fprintf(fd, " <MIME:multipartRelated>\n <MIME:part>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2609 if (is_literal(method_response_encoding) || is_XML((Tnode*)q->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2610 { if (is_document(method_style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2611 fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2612 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2613 fprintf(fd, " <SOAP:body parts=\"Body\" use=\"literal\" namespace=\"%s\"/>\n", URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2614 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2615 else if (encoding && *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2616 fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2617 else if (method_response_encoding && *method_response_encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2618 fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, method_response_encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2619 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2620 fprintf(fd, " <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2621 if (custom_header)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2622 { if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2623 for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2624 if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDROUT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2625 { if (chkhdr(m->part))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2626 fprintf(fd, " <SOAP:header use=\"literal\" message=\"tns:%sHeader\" part=\"%s\"/>\n", name, ns_remove(m->part));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2627 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2628 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2629 if (mimeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2630 { if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2631 { for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2632 { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEOUT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2633 fprintf(fd, " </MIME:part>\n <MIME:part>\n <MIME:content part=\"Attachments\" type=\"%s\"/>\n", m->part);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2634 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2635 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2636 fprintf(fd, " </MIME:part>\n </MIME:multipartRelated>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2637 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2638 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2639 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2640 { q = (Entry*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2641 if (is_document(method_style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2642 fprintf(fd, " <MIME:mimeXml part=\"Body\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2643 else if (q && !is_transient(q->info.typ) && !is_response(q->info.typ) && is_literal(method_response_encoding))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2644 fprintf(fd, " <MIME:mimeXml part=\"%s\"/>\n", ns_remove(q->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2645 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2646 fprintf(fd, " <MIME:mimeXml part=\"Body\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2647 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2648 fprintf(fd, " </output>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2649 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2650 if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2651 for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2652 if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2653 fprintf(fd, " <fault name=\"%s\">\n <SOAP:fault name=\"%s\" use=\"literal\"/>\n </fault>\n", ns_remove(m->part), ns_remove(m->part));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2654 fprintf(fd, " </operation>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2655 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2656 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2657 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2658 fprintf(fd, "</binding>\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2659 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2660 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2661 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2662 fprintf(fd, "<service name=\"%s\">\n", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2663 if (sp && sp->documentation)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2664 fprintf(fd, " <documentation>%s</documentation>\n", sp->documentation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2665 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2666 fprintf(fd, " <documentation>gSOAP "VERSION" generated service definition</documentation>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2667 if (executable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2668 fprintf(fd, " <port name=\"%s\" binding=\"tns:%s\">\n <SOAP:address location=\"%s/%s\"/>\n </port>", portname, binding, URL, executable);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2669 for (prot = 0x1; prot <= 0x8; prot <<= 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2670 { if ((prot & mask))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2671 { const char *s, *t, *v = "", *b = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2672 switch (prot)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2673 { case 0x1: v = ""; b = "SOAP"; break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2674 case 0x2: v = "GET"; b = "HTTP"; break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2675 case 0x4: v = "PUT"; b = "HTTP"; break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2676 case 0x8: v = "POST"; b = "HTTP"; break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2677 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2678 fprintf(fd, " <port name=\"%s%s\" binding=\"tns:%s%s\">\n", portname, v, binding, v);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2679 for (s = URL; s; s = t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2680 { int n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2681 t = strchr(s, ' ');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2682 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2683 { n = (int)(t - s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2684 t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2685 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2686 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2687 n = (int)strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2688 fprintf(fd, " <%s:address location=\"%.*s\"/>\n", b, n, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2689 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2690 fprintf(fd, " </port>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2691 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2692 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2693 fprintf(fd, "</service>\n\n</definitions>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2694 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2695
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2696 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2697 default_value(Entry *e, const char *a)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2698 { Entry *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2699 static char buf[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2700 buf[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2701 if (e->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2702 switch (e->info.typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2703 { case Tchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2704 case Twchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2705 case Tuchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2706 case Tshort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2707 case Tushort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2708 case Tint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2709 case Tuint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2710 case Tlong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2711 case Tllong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2712 case Tulong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2713 case Tullong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2714 sprintf(buf, " %s=\"" SOAP_LONG_FORMAT "\"", a, e->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2715 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2716 case Tfloat:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2717 case Tdouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2718 case Tldouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2719 sprintf(buf, " %s=\"%g\"", a, e->info.val.r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2720 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2721 case Ttime:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2722 break; /* should get value? */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2723 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2724 for (q = ((Table*)e->info.typ->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2725 if (q->info.val.i == e->info.val.i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2726 { sprintf(buf, " %s=\"%s\"", a, ns_convert(q->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2727 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2728 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2729 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2730 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2731 if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-12)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2732 sprintf(buf, " %s=\"%s\"", a, xstring(e->info.val.s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2733 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2734 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2735 return buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2736 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2737
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2738 const char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2739 nillable(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2740 { if (typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2741 return "true";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2742 return "false";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2743 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2744
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2745 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2746 gen_schema(FILE *fd, Table *t, char *ns1, char *ns, int all, int wsdl, char *URL, char *URI, char *style, char *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2747 { int i, d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2748 char cbuf[4];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2749 Entry *p, *q, *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2750 Tnode *n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2751 Symbol *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2752 Service *sp, *sp2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2753 Method *m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2754 int flag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2755 if (!strcmp(ns, "SOAP-ENV") || !strcmp(ns, "SOAP-ENC") || !strcmp(ns, "xsi") || !strcmp(ns, "xsd"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2756 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2757 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2758 if (!tagcmp(sp->ns, ns) && sp->URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2759 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2760 if (sp && sp->import)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2761 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2762 fprintf(fd, " <schema ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2763 if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2764 fprintf(fd, "targetNamespace=\"%s\"", sp->URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2765 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2766 fprintf(fd, "targetNamespace=\"%s/%s.xsd\"", tmpURI, ns_convert(ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2767 for (s = nslist; s; s = s->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2768 { for (sp2 = services; sp2; sp2 = sp2->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2769 if (!tagcmp(sp2->ns, s->name) && sp2->URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2770 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2771 if (sp2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2772 fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2773 else if (!strcmp(s->name, "SOAP-ENV"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2774 fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2775 else if (!strcmp(s->name, "SOAP-ENC"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2776 fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2777 else if (!strcmp(s->name, "xsi"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2778 fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2779 else if (!strcmp(s->name, "xsd"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2780 fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2781 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2782 fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2783 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2784 fprintf(fd, "\n xmlns=\"%s\"\n", xsdURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2785 if (sp && (sp->elementForm || sp->attributeForm))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2786 fprintf(fd, " elementFormDefault=\"%s\"\n attributeFormDefault=\"%s\">\n", sp->elementForm?sp->elementForm:"unqualified", sp->attributeForm?sp->attributeForm:"unqualified");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2787 else if (style && !strcmp(style, "document"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2788 fprintf(fd, " elementFormDefault=\"qualified\"\n attributeFormDefault=\"unqualified\">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2789 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2790 fprintf(fd, " elementFormDefault=\"unqualified\"\n attributeFormDefault=\"unqualified\">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2791 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2792 flag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2793 for (s = nslist; s; s = s->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2794 { for (sp2 = services; sp2; sp2 = sp2->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2795 if (sp2 != sp && !tagcmp(sp2->ns, s->name) && sp2->URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2796 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2797 if (sp2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2798 { fprintf(fd, " <import namespace=\"%s\"", sp2->URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2799 if (sp2->import)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2800 fprintf(fd, " schemaLocation=\"%s\"", sp2->import);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2801 fprintf(fd, "/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2802 if (!strcmp(sp2->URI, encURI))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2803 flag = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2804 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2805 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2806 if (!flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2807 fprintf(fd, " <import namespace=\"%s\"/>", encURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2808 fprintf(fd, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2809 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2810 if (typetable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2811 { for (p = typetable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2812 { 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))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2813 { /* typedefs that are used for SOAP Fault details */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2814 m = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2815 if (p->info.typ->type != Tstruct && p->info.typ->type != Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2816 { for (sp2 = services; sp2 && !m; sp2 = sp2->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2817 { for (m = sp2->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2818 { if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2819 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2820 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2821 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2822 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2823 if (m)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2824 { if (!uflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2825 fprintf(fd, " <!-- fault element -->\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2826 fprintf(fd, " <element name=\"%s\" type=\"%s\">\n", ns_remove(p->sym->name), base_type(p->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2827 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2828 fprintf(fd, " </element>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2829 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2830 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2831 if (is_primitive_or_string(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive_or_string((Tnode*)p->info.typ->ref)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2832 { fprintf(fd, " <simpleType name=\"%s\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2833 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2834 fprintf(fd, " <restriction base=\"%s\">\n", base_type(p->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2835 if (p->info.typ->pattern)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2836 fprintf(fd, " <pattern value=\"%s\"/>\n", p->info.typ->pattern);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2837 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)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2838 { if (p->info.typ->minLength != MINLONG64)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2839 fprintf(fd, " <minInclusive value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2840 if (p->info.typ->maxLength != MAXLONG64)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2841 fprintf(fd, " <maxInclusive value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->maxLength);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2842 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2843 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2844 { if (p->info.typ->maxLength > 0 && p->info.typ->minLength == p->info.typ->maxLength)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2845 fprintf(fd, " <length value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2846 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2847 { if (p->info.typ->minLength > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2848 fprintf(fd, " <minLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2849 if (p->info.typ->maxLength != MAXLONG64)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2850 fprintf(fd, " <maxLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->maxLength);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2851 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2852 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2853 fprintf(fd, " </restriction>\n </simpleType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2854 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2855 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2856 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2857 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2858 fprintf(fd, " <complexContent>\n <restriction base=\"%s\">\n", base_type(p->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2859 fprintf(fd, " </restriction>\n </complexContent>\n </complexType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2860 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2861 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2862 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2863 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2864 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2865 if (enumtable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2866 { for (p = enumtable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2867 { if (!is_transient(p->info.typ) && !is_invisible(p->sym->name) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2868 { if (is_mask(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2869 { fprintf(fd, " <simpleType name=\"%s\">", wsdl_type(p->info.typ, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2870 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2871 fprintf(fd, " <list>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2872 q = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2873 if ((Table*)p->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2874 { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2875 if (!has_ns_eq(NULL, ns_remove1(((Table*)p->info.typ->ref)->list->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2876 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2877 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2878 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2879 fprintf(fd, " <restriction base=\"xsd:string\">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2880 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2881 fprintf(fd, " <restriction base=\"xsd:QName\">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2882 if ((Table*)p->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2883 { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2884 { fprintf(fd, " <enumeration value=\"%s\"", ns_remove2(q->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2885 if (gen_member_documentation(fd, p->sym, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2886 fprintf(fd, " </enumeration>");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2887 if (!uflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2888 fprintf(fd, " <!-- = " SOAP_LONG_FORMAT " -->", q->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2889 fprintf(fd, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2890 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2891 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2892 fprintf(fd, " </restriction>\n </list>\n </simpleType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2893 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2894 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2895 { fprintf(fd, " <simpleType name=\"%s\">", wsdl_type(p->info.typ, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2896 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2897 q = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2898 if ((Table*)p->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2899 { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2900 if (!has_ns_eq(NULL, ns_remove1(((Table*)p->info.typ->ref)->list->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2901 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2902 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2903 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2904 fprintf(fd, " <restriction base=\"xsd:string\">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2905 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2906 fprintf(fd, " <restriction base=\"xsd:QName\">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2907 if ((Table*)p->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2908 { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2909 { fprintf(fd, " <enumeration value=\"%s\"", ns_remove2(q->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2910 if (gen_member_documentation(fd, p->sym, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2911 fprintf(fd, " </enumeration>");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2912 if (!uflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2913 fprintf(fd, " <!-- = " SOAP_LONG_FORMAT " -->", q->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2914 fprintf(fd, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2915 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2916 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2917 fprintf(fd, " </restriction>\n </simpleType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2918 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2919 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2920 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2921 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2922 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2923 if (classtable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2924 { for (p = classtable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2925 { if (is_transient(p->info.typ) || is_invisible(p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2926 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2927 for (q = t->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2928 if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && p == get_response(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2929 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2930 /* omit the auto-generated and user-defined response struct/class (when necessary) */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2931 if (!q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2932 for (q = t->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2933 if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && !has_ns_eq(NULL, ((Entry*)q->info.typ->ref)->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2934 { r = entry(t, q->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2935 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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2936 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2937 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2938 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2939 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2940 /* classes that are used for SOAP Fault details */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2941 m = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2942 for (sp2 = services; sp2 && !m; sp2 = sp2->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2943 for (m = sp2->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2944 if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2945 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2946 if (m)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2947 { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2948 { if (!uflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2949 fprintf(fd, " <!-- fault element and type -->\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2950 fprintf(fd, " <element name=\"%s\" type=\"%s\">\n", ns_remove(p->sym->name), base_type(p->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2951 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2952 fprintf(fd, " </element>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2953 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2954 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2955 if (p->info.typ->ref && is_binary(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2956 { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2957 { if (is_attachment(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2958 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2959 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2960 fprintf(fd, " <simpleContent>\n <extension base=\"xsd:base64Binary\">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2961 if (!eflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2962 fprintf(fd, " <attribute name=\"href\" type=\"xsd:anyURI\" use=\"optional\"/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2963 gen_schema_attributes(fd, p->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2964 fprintf(fd, " </extension>\n </simpleContent>\n </complexType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2965 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2966 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2967 { fprintf(fd, " <simpleType name=\"%s\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2968 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2969 fprintf(fd, " <restriction base=\"xsd:base64Binary\">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2970 if (p->info.typ->maxLength > 0 && p->info.typ->minLength == p->info.typ->maxLength)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2971 fprintf(fd, " <length value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2972 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2973 { if (p->info.typ->minLength > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2974 fprintf(fd, " <minLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->minLength);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2975 if (p->info.typ->maxLength != MAXLONG64)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2976 fprintf(fd, " <maxLength value=\"" SOAP_LONG_FORMAT "\"/>\n", p->info.typ->maxLength);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2977 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2978 fprintf(fd, " </restriction>\n </simpleType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2979 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2980 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2981 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2982 else if (p->info.typ->ref && !is_transient(p->info.typ) && is_primclass(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2983 { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2984 { q = ((Table*)p->info.typ->ref)->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2985 if (q && strncmp(q->sym->name, "xsd__anyType", 12))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2986 { if (is_string(q->info.typ) || is_wstring(q->info.typ) || is_stdstring(q->info.typ) || is_stdwstring(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2987 { fprintf(fd, " <complexType name=\"%s\" mixed=\"true\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2988 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2989 fprintf(fd, " <simpleContent>\n <extension base=\"%s\">\n", wsdl_type(q->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2990 gen_schema_attributes(fd, p->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2991 fprintf(fd, " </extension>\n </simpleContent>\n </complexType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2992 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2993 else if (is_primitive(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2994 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2995 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2996 fprintf(fd, " <simpleContent>\n <extension base=\"%s\">\n", wsdl_type(q->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2997 gen_schema_attributes(fd, p->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2998 fprintf(fd, " </extension>\n </simpleContent>\n </complexType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2999 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3000 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3001 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3002 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3003 fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n", wsdl_type(q->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3004 gen_schema_attributes(fd, p->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3005 fprintf(fd, " </extension>\n </complexContent>\n </complexType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3006 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3007 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3008 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3009 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3010 else if (p->info.typ->ref && !is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3011 { q = ((Table*)p->info.typ->ref)->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3012 if (entry(t, p->sym) && (!q || !is_XML(q->info.typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3013 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3014 else if (is_dynamic_array(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3015 { if (eflag || (!has_ns(p->info.typ) && !is_untyped(p->info.typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3016 { if (all)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3017 { d = get_Darraydims(p->info.typ)-1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3018 for (i = 0; i < d; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3019 cbuf[i] = ',';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3020 cbuf[i] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3021 if (q->info.maxOccurs == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3022 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3023 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3024 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3025 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3026 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3027 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3028 { if (q->info.maxOccurs == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3029 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3030 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3031 fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n <sequence>\n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3032 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3033 fprintf(fd, " </sequence>\n </extension>\n </complexContent>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3034 gen_schema_attributes(fd, p->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3035 fprintf(fd, " </complexType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3036 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3037 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3038 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3039 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3040 fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n <sequence>\n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3041 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3042 fprintf(fd, " </sequence>\n </extension>\n </complexContent>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3043 gen_schema_attributes(fd, p->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3044 fprintf(fd, " </complexType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3045 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3046 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3047 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3048 { if (q->info.maxOccurs == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3049 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3050 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3051 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3052 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3053 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3054 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3055 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3056 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3057 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3058 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3059 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3060 else if (is_discriminant(p->info.typ) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3061 { if (p->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3062 { fprintf(fd, " <complexType name=\"%s\">\n", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3063 gen_schema_elements(fd, p->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3064 fprintf(fd, " </complexType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3065 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3066 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3067 else if (p->info.typ->type == Tstruct && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3068 { if (p->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3069 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3070 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3071 fprintf(fd, " <sequence>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3072 gen_schema_elements(fd, p->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3073 fprintf(fd, " </sequence>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3074 gen_schema_attributes(fd, p->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3075 fprintf(fd, " </complexType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3076 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3077 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3078 else if (p->info.typ->type == Tclass && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3079 { if (p->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3080 { 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3081 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3082 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3083 fprintf(fd, " <complexContent>\n <extension base=\"%s\">\n <sequence>\n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3084 gen_schema_elements(fd, p->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3085 fprintf(fd, " </sequence>\n </extension>\n </complexContent>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3086 gen_schema_attributes(fd, p->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3087 fprintf(fd, " </complexType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3088 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3089 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3090 { fprintf(fd, " <complexType name=\"%s\">", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3091 gen_type_documentation(fd, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3092 fprintf(fd, " <sequence>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3093 gen_schema_elements(fd, p->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3094 fprintf(fd, " </sequence>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3095 gen_schema_attributes(fd, p->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3096 fprintf(fd, " </complexType>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3097 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3098 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3099 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3100 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3101 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3102 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3103 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3104 for (n = Tptr[Tarray]; n; n = n->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3105 { if (is_transient(n) || is_fixedstring(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3106 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3107 if (1 /* wsdl */)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3108 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3109 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3110 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3111 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3112 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3113 gen_schema_elements_attributes(fd, t, ns, ns1, style, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3114 fprintf(fd, " </schema>\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3115 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3116
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3117 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3118 gen_schema_elements(FILE *fd, Tnode *p, char *ns, char *ns1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3119 { Entry *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3120 for (q = ((Table*)p->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3121 if (gen_schema_element(fd, p, q, ns, ns1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3122 q = q->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3123 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3124
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3125 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3126 gen_schema_element(FILE *fd, Tnode *p, Entry *q, char *ns, char *ns1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3127 { char *s, *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3128 if (is_transient(q->info.typ) || (q->info.sto & Sattribute) || q->info.typ->type == Tfun || q->info.typ->type == Tunion)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3129 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3130 if (is_repetition(q))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3131 { if (is_sequence(q->next))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3132 { fprintf(fd, " <sequence minOccurs=\"0\" maxOccurs=\"unbounded\">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3133 if (q->next->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3134 gen_schema_elements(fd, (Tnode*)q->next->info.typ->ref, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3135 fprintf(fd, " </sequence>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3136 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3137 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3138 t = ns_convert(q->next->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3139 if (*t == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3140 fprintf(fd, " <any processContents=\"lax\" minOccurs=\"0\" maxOccurs=\"unbounded\"/><!-- %s -->\n", q->next->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3141 else if ((s = strchr(t+1, ':')) && (!strchr(q->next->sym->name+1, ':') || !has_ns_eq(ns, q->next->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3142 { if (((Tnode*)q->next->info.typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3143 if (q->info.maxOccurs == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3144 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3145 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3146 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3147 else if (q->info.maxOccurs == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3148 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3149 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3150 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3151 if (gen_member_documentation(fd, p->id, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3152 fprintf(fd, " </element>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3153 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3154 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3155 { const char *form = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3156 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3157 { s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3158 if (*s == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3159 { s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3160 form = " form=\"unqualified\"";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3161 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3162 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3163 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3164 { s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3165 form = " form=\"qualified\"";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3166 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3167 if (((Tnode*)q->next->info.typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3168 if (q->info.maxOccurs == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3169 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3170 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3171 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3172 else if (q->info.maxOccurs == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3173 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3174 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3175 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3176 if (gen_member_documentation(fd, p->id, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3177 fprintf(fd, " </element>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3178 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3179 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3180 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3181 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3182 { t = ns_convert(q->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3183 if (*t == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3184 fprintf(fd, " <any processContents=\"lax\" minOccurs=\"0\" maxOccurs=\"unbounded\"/><!-- %s -->\n", q->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3185 else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3186 { if (((Tnode*)q->info.typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3187 if (q->info.maxOccurs == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3188 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3189 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3190 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3191 else if (q->info.maxOccurs == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3192 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"unbounded\"", t, q->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3193 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3194 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3195 if (gen_member_documentation(fd, p->id, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3196 fprintf(fd, " </element>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3197 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3198 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3199 { const char *form = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3200 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3201 { s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3202 if (*s == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3203 { s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3204 form = " form=\"unqualified\"";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3205 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3206 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3207 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3208 { s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3209 form = " form=\"qualified\"";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3210 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3211 if (((Tnode*)q->info.typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3212 if (q->info.maxOccurs == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3213 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3214 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3215 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3216 else if (q->info.maxOccurs == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3217 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3218 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3219 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3220 if (gen_member_documentation(fd, p->id, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3221 fprintf(fd, " </element>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3222 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3223 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3224 else if (is_anytype(q)) /* ... maybe need to show all possible types rather than xsd:anyType */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3225 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3226 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3227 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3228 else if (is_choice(q))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3229 { if (q->info.minOccurs == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3230 fprintf(fd, " <choice minOccurs=\"0\" maxOccurs=\"1\">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3231 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3232 fprintf(fd, " <choice>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3233 if (q->next->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3234 gen_schema_elements(fd, q->next->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3235 fprintf(fd, " </choice>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3236 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3237 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3238 else if (is_sequence(q))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3239 { if (q->info.minOccurs == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3240 fprintf(fd, " <sequence minOccurs=\"0\" maxOccurs=\"1\">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3241 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3242 fprintf(fd, " <sequence>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3243 if (q->info.typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3244 gen_schema_elements(fd, (Tnode*)q->info.typ->ref, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3245 else if (q->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3246 gen_schema_elements(fd, q->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3247 fprintf(fd, " </sequence>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3248 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3249 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3250 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3251 { t = ns_convert(q->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3252 if (*t == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3253 fprintf(fd, " <any processContents=\"lax\" minOccurs=\"0\" maxOccurs=\"1\"/><!-- %s -->\n", q->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3254 else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3255 { if (q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3256 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3257 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3258 fprintf(fd, " <element ref=\"%s\" minOccurs=\"" SOAP_LONG_FORMAT "\" maxOccurs=\"" SOAP_LONG_FORMAT "\"", t, q->info.minOccurs, q->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3259 if (gen_member_documentation(fd, p->id, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3260 fprintf(fd, " </element>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3261 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3262 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3263 { const char *form = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3264 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3265 { s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3266 if (*s == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3267 { s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3268 form = " form=\"unqualified\"";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3269 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3270 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3271 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3272 { s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3273 form = " form=\"qualified\"";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3274 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3275 if (q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3276 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3277 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3278 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3279 if (gen_member_documentation(fd, p->id, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3280 fprintf(fd, " </element>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3281 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3282 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3283 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3284 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3285 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3286
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3287 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3288 gen_schema_elements_attributes(FILE *fd, Table *t, char *ns, char *ns1, char *style, char *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3289 { Entry *p, *q, *e;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3290 Table *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3291 Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3292 Method *m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3293 char *method_style, *method_encoding, *method_response_encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3294 int all = !strcmp(ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3295 r = mktable(NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3296 for (p = classtable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3297 { 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3298 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3299 for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3300 { 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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3301 { Service *sp2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3302 Method *m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3303 m = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3304 for (sp2 = services; sp2 && !m; sp2 = sp2->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3305 for (m = sp2->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3306 if ((m->mess&FAULT) && m->part && is_eq(m->part, q->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3307 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3308 if (m)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3309 continue; /* already generated element for fault */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3310 e = entry(r, q->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3311 if (e)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3312 { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute) || reftype(e->info.typ) != reftype(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3313 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3314 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3315 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3316 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3317 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3318 { if (q->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3319 fprintf(fd, " <attribute name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3320 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3321 fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3322 e = enter(r, q->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3323 e->info = q->info;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3324 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3325 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3326 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3327 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3328 if (t && all)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3329 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3330 { if (p->info.typ->type == Tfun && !is_invisible(p->sym->name) && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3331 { method_encoding = encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3332 method_response_encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3333 method_style = style;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3334 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3335 { if (!tagcmp(sp->ns, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3336 { for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3337 { if (is_eq_nons(m->name, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3338 { if (m->mess == ENCODING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3339 method_encoding = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3340 else if (m->mess == RESPONSE_ENCODING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3341 method_response_encoding = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3342 else if (m->mess == STYLE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3343 method_style = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3344 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3345 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3346 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3347 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3348 if (!eflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3349 { if (!method_response_encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3350 method_response_encoding = method_encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3351 q = entry(classtable, p->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3352 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3353 { if (is_document(method_style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3354 { if (!uflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3355 fprintf(fd, " <!-- operation request element -->\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3356 fprintf(fd, " <element name=\"%s\">\n <complexType>\n <sequence>\n", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3357 gen_schema_elements(fd, q->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3358 fprintf(fd, " </sequence>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3359 gen_schema_attributes(fd, q->info.typ, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3360 fprintf(fd, " </complexType>\n </element>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3361 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3362 else if (is_literal(method_encoding))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3363 { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3364 { 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3365 { e = entry(r, q->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3366 if (e)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3367 { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute)|| reftype(e->info.typ) != reftype(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3368 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3369 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3370 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3371 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3372 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3373 { if (!uflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3374 fprintf(fd, " <!-- operation request element -->\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3375 fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3376 e = enter(r, q->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3377 e->info = q->info;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3378 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3379 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3380 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3381 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3382 q = (Entry*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3383 for (e = t->list; e; e = e->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3384 if (e != p && e->info.typ->type == Tfun && !(e->info.sto & Sextern) && q == (Entry*)e->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3385 q = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3386 if (q && !is_transient(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3387 { if (!is_response(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3388 { if (is_document(method_style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3389 { if (!uflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3390 fprintf(fd, " <!-- operation response element -->\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3391 fprintf(fd, " <element name=\"%sResponse\">\n <complexType>\n", ns_remove(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3392 fprintf(fd, " <sequence>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3393 gen_schema_element(fd, p->info.typ, q, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3394 fprintf(fd, " </sequence>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3395 fprintf(fd, " </complexType>\n </element>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3396 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3397 else if (is_literal(method_response_encoding))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3398 { e = entry(r, q->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3399 if (e)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3400 { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute)|| reftype(e->info.typ) != reftype(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3401 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3402 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3403 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3404 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3405 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3406 { if (!uflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3407 fprintf(fd, " <!-- operation response element -->\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3408 fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3409 e = enter(r, q->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3410 e->info = q->info;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3411 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3412 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3413 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3414 else if (((Tnode*)q->info.typ->ref)->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3415 { if (is_document(method_style))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3416 { if (!has_ns_eq(NULL, q->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3417 { e = entry(r, ((Tnode*)q->info.typ->ref)->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3418 if (!e)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3419 { if (!uflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3420 fprintf(fd, " <!-- operation response element -->\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3421 fprintf(fd, " <element name=\"%s\">\n <complexType>\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3422 fprintf(fd, " <sequence>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3423 gen_schema_elements(fd, (Tnode*)q->info.typ->ref, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3424 fprintf(fd, " </sequence>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3425 gen_schema_attributes(fd, (Tnode*)q->info.typ->ref, ns, ns1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3426 fprintf(fd, " </complexType>\n </element>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3427 e = enter(r, ((Tnode*)q->info.typ->ref)->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3428 e->info = q->info;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3429 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3430 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3431 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3432 else if (is_literal(method_response_encoding))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3433 { for (q = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3434 { 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3435 { e = entry(r, q->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3436 if (e)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3437 { if ((e->info.sto & Sattribute) != (q->info.sto & Sattribute)|| reftype(e->info.typ) != reftype(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3438 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3439 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3440 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3441 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3442 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3443 { if (!uflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3444 fprintf(fd, " <!-- operation response element -->\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3445 fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3446 e = enter(r, q->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3447 e->info = q->info;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3448 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3449 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3450 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3451 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3452 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3453 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3454 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3455 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3456 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3457 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3458 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3459 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3460 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3461 { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && !eflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3462 { q = (Entry*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3463 if (q && !is_transient(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3464 { if (is_response(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3465 { if (has_ns_eq(ns, q->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3466 { e = entry(r, q->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3467 if (!e)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3468 { if (!uflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3469 fprintf(fd, " <!-- operation response element -->\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3470 fprintf(fd, " <element name=\"%s\" type=\"%s\"/>\n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3471 e = enter(r, q->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3472 e->info = q->info;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3473 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3474 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3475 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3476 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3477 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3478 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3479 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3480 freetable(r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3481 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3482
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3483 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3484 gen_schema_attributes(FILE *fd, Tnode *p, char *ns, char *ns1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3485 { Entry *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3486 char *t, *s, *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3487 for (q = ((Table*)p->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3488 { if (q->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3489 { r = default_value(q, "default");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3490 t = ns_convert(q->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3491 if (*t == '-' || is_anyAttribute(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3492 fprintf(fd, " <anyAttribute processContents=\"lax\"/><!-- %s -->\n", q->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3493 else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3494 { if (r && *r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3495 fprintf(fd, " <attribute ref=\"%s\" use=\"default\"%s/>\n", t, r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3496 else if (q->info.typ->type != Tpointer || q->info.minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3497 fprintf(fd, " <attribute ref=\"%s\" use=\"required\"/>\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3498 else if (q->info.maxOccurs == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3499 fprintf(fd, " <attribute ref=\"%s\" use=\"prohibited\"/>\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3500 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3501 fprintf(fd, " <attribute ref=\"%s\" use=\"optional\"/>\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3502 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3503 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3504 { const char *form = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3505 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3506 { s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3507 if (*s == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3508 { s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3509 form = " form=\"unqualified\"";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3510 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3511 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3512 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3513 { s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3514 form = " form=\"qualified\"";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3515 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3516 if (r && *r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3517 fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"default\"%s%s", s, wsdl_type(q->info.typ, ns1), r, form);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3518 else if ((q->info.typ->type != Tpointer && !is_stdstring(q->info.typ) && !is_stdwstring(q->info.typ)) || q->info.minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3519 fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"required\"%s", s, wsdl_type(q->info.typ, ns1), form);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3520 else if (q->info.maxOccurs == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3521 fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"prohibited\"", s, wsdl_type(q->info.typ, ns1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3522 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3523 fprintf(fd, " <attribute name=\"%s\" type=\"%s\" use=\"optional\"%s", s, wsdl_type(q->info.typ, ns1), form);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3524 if (gen_member_documentation(fd, p->id, q, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3525 fprintf(fd, " </attribute>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3526 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3527 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3528 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3529 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3530 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3531
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3532 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3533 gen_type_documentation(FILE *fd, Entry *type, char *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3534 { Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3535 Data *d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3536 if (!type->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3537 { fprintf(fd, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3538 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3539 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3540 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3541 { if (!tagcmp(sp->ns, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3542 { for (d = sp->data; d; d = d->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3543 { if (!strstr(d->name, "::") && is_eq_nons(d->name, type->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3544 { fprintf(fd, "\n <annotation>\n <documentation>%s</documentation>\n </annotation>\n", d->text);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3545 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3546 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3547 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3548 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3549 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3550 if (!uflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3551 fprintf(fd, "<!-- %s -->\n", type->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3552 fprintf(fd, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3553 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3554
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3555 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3556 gen_member_documentation(FILE *fd, Symbol *type, Entry *member, char *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3557 { Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3558 Data *d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3559 char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3560 if (!type || !member->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3561 { fprintf(fd, "/>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3562 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3563 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3564 t = ns_remove(type->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3565 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3566 { if (!tagcmp(sp->ns, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3567 { for (d = sp->data; d; d = d->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3568 { char *s = strstr(d->name, "::");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3569 if (s && !strncmp(t, d->name, s-d->name) && !strcmp(s + 2, member->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3570 { fprintf(fd, ">\n <annotation>\n <documentation>%s</documentation>\n </annotation>\n", d->text);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3571 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3572 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3573 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3574 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3575 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3576 fprintf(fd, "/>");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3577 if (!uflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3578 fprintf(fd, "<!-- %s::%s -->", type->name, member->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3579 fprintf(fd, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3580 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3581 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3582
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3583 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3584 gen_nsmap(FILE *fd, Symbol *ns, char *URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3585 { Symbol *ns1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3586 Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3587 fprintf(fd, "{\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3588 for (ns1 = nslist; ns1; ns1 = ns1->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3589 { for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3590 if (!tagcmp(sp->ns, ns1->name) && sp->URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3591 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3592 if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3593 { if (!strcmp(ns1->name, "SOAP-ENV"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3594 { if (vflag < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3595 fprintf(fd, "\t{\"SOAP-ENV\", NULL, NULL, NULL},\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3596 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3597 fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : envURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3598 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3599 else if (!strcmp(ns1->name, "SOAP-ENC"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3600 { if (vflag < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3601 fprintf(fd, "\t{\"SOAP-ENC\", NULL, NULL, NULL},\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3602 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3603 fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : encURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3604 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3605 else if (sp->URI2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3606 fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3607 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3608 fprintf(fd, "\t{\"%s\", \"%s\", NULL, NULL},\n", ns_convert(ns1->name), sp->URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3609 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3610 else if (!strcmp(ns1->name, "SOAP-ENV"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3611 { if (vflag < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3612 fprintf(fd, "\t{\"SOAP-ENV\", NULL, NULL, NULL},\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3613 else if (is_soap12(NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3614 fprintf(fd, "\t{\"SOAP-ENV\", \"%s\", \"http://schemas.xmlsoap.org/soap/envelope/\", NULL},\n", envURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3615 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3616 fprintf(fd, "\t{\"SOAP-ENV\", \"%s\", \"http://www.w3.org/*/soap-envelope\", NULL},\n", envURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3617 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3618 else if (!strcmp(ns1->name, "SOAP-ENC"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3619 { if (vflag < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3620 fprintf(fd, "\t{\"SOAP-ENC\", NULL, NULL, NULL},\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3621 else if (is_soap12(NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3622 fprintf(fd, "\t{\"SOAP-ENC\", \"%s\", \"http://schemas.xmlsoap.org/soap/encoding/\", NULL},\n", encURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3623 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3624 fprintf(fd, "\t{\"SOAP-ENC\", \"%s\", \"http://www.w3.org/*/soap-encoding\", NULL},\n", encURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3625 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3626 else if (!strcmp(ns1->name, "xsi"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3627 fprintf(fd, "\t{\"xsi\", \"%s\", \"http://www.w3.org/*/XMLSchema-instance\", NULL},\n", xsiURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3628 else if (!strcmp(ns1->name, "xsd"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3629 fprintf(fd, "\t{\"xsd\", \"%s\", \"http://www.w3.org/*/XMLSchema\", NULL},\n", xsdURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3630 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3631 fprintf(fd, "\t{\"%s\", \"%s/%s.xsd\", NULL, NULL},\n", ns_convert(ns1->name), tmpURI, ns_convert(ns1->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3632 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3633 fprintf(fd, "\t{NULL, NULL, NULL, NULL}\n};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3634 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3635
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3636 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3637 gen_proxy(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3638 { Entry *p, *q, *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3639 Table *t, *output;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3640 Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3641 int flag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3642 char *name1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3643 name1 = ns_cname(name, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3644 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3645 if (!tagcmp(sp->ns, ns->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3646 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3647 fprintf(fd, "\n\n#ifndef %s%sProxy_H\n#define %s%sProxy_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3648 if (nflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3649 fprintf(fd, "\nextern SOAP_NMAC struct Namespace %s_namespaces[];", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3650 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3651 fprintf(fd,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3652 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3653 if (nflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3654 fprintf(fd, "\t%s() { soap = soap_new(); if (soap) soap->namespaces = %s_namespaces; endpoint = \"%s\"; };\n", name1, prefix, URL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3655 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3656 { fprintf(fd, "\t%s()\n\t{ soap = soap_new(); endpoint = \"%s\"; if (soap && !soap->namespaces) { static const struct Namespace namespaces[] = \n", name1, URL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3657 gen_nsmap(fd, ns, URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3658 fprintf(fd, "\tsoap->namespaces = namespaces; } };\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3659 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3660 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3661 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3662 for (r = table->list; r; r = r->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3663 if (r->info.typ->type == Tfun && !(r->info.sto & Sextern) && has_ns_eq(ns->name, r->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3664 { p = entry(table, r->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3665 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3666 q = (Entry*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3667 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3668 { fprintf(stderr, "Internal error: no table entry\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3669 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3670 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3671 p = entry(classtable, r->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3672 if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3673 { fprintf(stderr, "Internal error: no parameter table entry\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3674 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3675 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3676 output = (Table*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3677 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3678 if ((s = strstr(r->sym->name, "__")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3679 s += 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3680 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3681 s = r->sym->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3682 fprintf(fd, "\tvirtual int %s(", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3683 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3684 fprintf(fd, "\t/// Invoke '%s' of service '%s' and return error code (or SOAP_OK)\n", ns_remove(r->sym->name), name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3685 fprintf(fd, "\tvirtual int %s(", ident(r->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3686 flag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3687 for (t = output; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3688 { p = t->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3689 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3690 { fprintf(fd, "%s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3691 for (p = p->next; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3692 fprintf(fd, ", %s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3693 flag = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3694 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3695 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3696 if (is_transient(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3697 fprintf(fd,") { return soap ? soap_send_%s(soap, endpoint, NULL", ident(r->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3698 else if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3699 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3700 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3701 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3702 /* the action is now handled by the soap_call/soap_send operation when we pass NULL */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3703 #if 0
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3704 m = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3705 if (sp && (s = strstr(r->sym->name, "__")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3706 for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3707 if (m->part && m->mess == ACTION && !strcmp(m->name, s+2))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3708 { if (*m->part == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3709 fprintf(fd, "%s", m->part);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3710 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3711 fprintf(fd, "\"%s\"", m->part);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3712 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3713 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3714 if (!m)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3715 fprintf(fd, "NULL");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3716 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3717 for (t = output; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3718 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3719 fprintf(fd, ", %s", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3720 if (is_transient(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3721 fprintf(fd,") : SOAP_EOM; };\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3722 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3723 fprintf(fd,", %s) : SOAP_EOM; };\n", ident(q->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3724 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3725 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3726 fprintf(fd, "};");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3727 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3728 fprintf(fd,"\n\n} // namespace %s\n", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3729 fprintf(fd, "\n#endif\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3730 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3731
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3732 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3733 gen_object(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3734 { char *name1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3735 Entry *method;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3736 name1 = ns_cname(name, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3737 fprintf(fd, "\n\n#ifndef %s%sObject_H\n#define %s%sObject_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3738 banner(fd, "Service Object");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3739 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3740 fprintf(fd,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3741 fprintf(fd, "\nclass %sService : public soap\n{ public:", name1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3742 fprintf(fd, "\n\t%sService()\n\t{ static const struct Namespace namespaces[] =\n", name1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3743 gen_nsmap(fd, ns, URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3744 fprintf(fd, "\n\tthis->namespaces = namespaces; };");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3745 fprintf(fd, "\n\tvirtual ~%sService() { };", name1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3746 fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3747 fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog) { return soap_bind(this, host, port, backlog); };");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3748 fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3749 fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept() { return soap_accept(this); };");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3750 fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3751 fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3752 fprintf(fd, "\n\tvirtual\tint ssl_accept() { return soap_ssl_accept(this); };");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3753 fprintf(fd, "\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3754 fprintf(fd, "\n\t/// Serve this request (returns error code or SOAP_OK)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3755 if (nflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3756 fprintf(fd, "\n\tvirtual\tint serve() { return %s_serve(this); };", prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3757 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3758 fprintf(fd, "\n\tvirtual\tint serve() { return soap_serve(this); };");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3759 fprintf(fd, "\n};");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3760 banner(fd, "Service Operations (you should define these globally)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3761 for (method = table->list; method; method = method->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3762 { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3763 { Entry *p, *q=entry(table, method->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3764 Table *output;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3765 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3766 p = (Entry*)q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3767 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3768 { fprintf(stderr, "Internal error: no table entry\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3769 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3770 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3771 q = entry(classtable, method->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3772 output = (Table*)q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3773 fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3774 gen_params(fd, output, p, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3775 fprintf(fd, ";");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3776 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3777 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3778 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3779 fprintf(fd,"\n\n} // namespace %s\n", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3780 fprintf(fd, "\n\n#endif\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3781 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3782
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3783 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3784 gen_proxy_header(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3785 { Entry *p, *method;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3786 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3787 fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3788 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3789 fprintf(fd,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3790 if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3791 fprintf(fd, "\n\nclass SOAP_CMAC %s : public soap\n{ public:", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3792 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3793 fprintf(fd, "\n\nclass SOAP_CMAC %s\n{ public:", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3794 if (!iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3795 fprintf(fd, "\n\tstruct soap *soap;\n\tbool own;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3796 fprintf(fd, "\n\t/// Endpoint URL of service '%s' (change as needed)", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3797 fprintf(fd, "\n\tconst char *soap_endpoint;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3798 fprintf(fd, "\n\t/// Constructor");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3799 fprintf(fd, "\n\t%s();", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3800 if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3801 { fprintf(fd, "\n\t/// Construct from another engine state");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3802 fprintf(fd, "\n\t%s(const struct soap&);", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3803 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3804 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3805 { fprintf(fd, "\n\t/// Constructor to use/share an engine state");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3806 fprintf(fd, "\n\t%s(struct soap*);", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3807 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3808 fprintf(fd, "\n\t/// Constructor with endpoint URL");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3809 fprintf(fd, "\n\t%s(const char *url);", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3810 fprintf(fd, "\n\t/// Constructor with engine input+output mode control");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3811 fprintf(fd, "\n\t%s(soap_mode iomode);", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3812 fprintf(fd, "\n\t/// Constructor with URL and input+output mode control");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3813 fprintf(fd, "\n\t%s(const char *url, soap_mode iomode);", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3814 fprintf(fd, "\n\t/// Constructor with engine input and output mode control");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3815 fprintf(fd, "\n\t%s(soap_mode imode, soap_mode omode);", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3816 fprintf(fd, "\n\t/// Destructor frees deserialized data");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3817 fprintf(fd, "\n\tvirtual\t~%s();", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3818 fprintf(fd, "\n\t/// Initializer used by constructors");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3819 fprintf(fd, "\n\tvirtual\tvoid %s_init(soap_mode imode, soap_mode omode);", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3820 fprintf(fd, "\n\t/// Delete all deserialized data (with soap_destroy and soap_end)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3821 fprintf(fd, "\n\tvirtual\tvoid destroy();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3822 fprintf(fd, "\n\t/// Delete all deserialized data and reset to default");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3823 fprintf(fd, "\n\tvirtual\tvoid reset();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3824 fprintf(fd, "\n\t/// Disables and removes SOAP Header from message");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3825 fprintf(fd, "\n\tvirtual\tvoid soap_noheader();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3826 if (!namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3827 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3828 p = entry(classtable, lookup("SOAP_ENV__Header"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3829 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3830 { t = (Table*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3831 if (t && t->list && !is_void(t->list->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3832 { fprintf(fd, "\n\t/// Put SOAP Header in message");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3833 fprintf(fd, "\n\tvirtual\tvoid soap_header(");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3834 gen_params(fd, t, NULL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3835 fprintf(fd, ";");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3836 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3837 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3838 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3839 fprintf(fd, "\n\t/// Get SOAP Header structure (NULL when absent)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3840 fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Header *soap_header();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3841 fprintf(fd, "\n\t/// Get SOAP Fault structure (NULL when absent)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3842 fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Fault *soap_fault();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3843 fprintf(fd, "\n\t/// Get SOAP Fault string (NULL when absent)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3844 fprintf(fd, "\n\tvirtual\tconst char *soap_fault_string();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3845 fprintf(fd, "\n\t/// Get SOAP Fault detail as string (NULL when absent)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3846 fprintf(fd, "\n\tvirtual\tconst char *soap_fault_detail();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3847 fprintf(fd, "\n\t/// Close connection (normally automatic, except for send_X ops)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3848 fprintf(fd, "\n\tvirtual\tint soap_close_socket();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3849 fprintf(fd, "\n\t/// Force close connection (can kill a thread blocked on IO)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3850 fprintf(fd, "\n\tvirtual\tint soap_force_close_socket();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3851 fprintf(fd, "\n\t/// Print fault");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3852 fprintf(fd, "\n\tvirtual\tvoid soap_print_fault(FILE*);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3853 fprintf(fd, "\n#ifndef WITH_LEAN\n\t/// Print fault to stream");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3854 fprintf(fd, "\n#ifndef WITH_COMPAT");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3855 fprintf(fd, "\n\tvirtual\tvoid soap_stream_fault(std::ostream&);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3856 fprintf(fd, "\n#endif\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3857 fprintf(fd, "\n\t/// Put fault into buffer");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3858 fprintf(fd, "\n\tvirtual\tchar *soap_sprint_fault(char *buf, size_t len);\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3859 for (method = table->list; method; method = method->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3860 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3861 gen_method(fd, table, method, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3862 fprintf(fd, "\n};");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3863 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3864 fprintf(fd,"\n\n} // namespace %s\n", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3865 fprintf(fd, "\n#endif\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3866 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3867
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3868 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3869 gen_proxy_code(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3870 { Entry *p, *method, *param;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3871 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3872 char *soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3873 if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3874 soap = "this";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3875 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3876 soap = "this->soap";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3877 fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3878 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3879 fprintf(fd,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3880 if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3881 { fprintf(fd, "\n\n%s::%s()\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3882 fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3883 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3884 fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3885 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3886 fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\t%s_init(imode, omode);\n}", name, name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3887 fprintf(fd, "\n\n%s::~%s()\n{ }", name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3888 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3889 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3890 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3891 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3892 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3893 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3894 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3895 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3896 fprintf(fd, "\n\n%s::~%s()\n{\tif (this->own)\n\t\tsoap_free(this->soap);\n}", name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3897 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3898 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3899 gen_nsmap(fd, ns, URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3900 fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3901 fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3902 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3903 fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3904 if (!namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3905 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3906 p = entry(classtable, lookup("SOAP_ENV__Header"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3907 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3908 { t = (Table*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3909 if (t && t->list && !is_void(t->list->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3910 { fprintf(fd, "\n\nvoid %s::soap_header(", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3911 gen_params(fd, t, NULL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3912 fprintf(fd, "\n{\t::soap_header(%s);", soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3913 for (param = t->list; param; param = param->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3914 { if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3915 fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3916 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3917 fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3918 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3919 fprintf(fd, "\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3920 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3921 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3922 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3923 fprintf(fd, "\n\nconst SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3924 fprintf(fd, "\n\nconst SOAP_ENV__Fault *%s::soap_fault()\n{\treturn %s->fault;\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3925 fprintf(fd, "\n\nconst char *%s::soap_fault_string()\n{\treturn *soap_faultstring(%s);\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3926 fprintf(fd, "\n\nconst char *%s::soap_fault_detail()\n{\treturn *soap_faultdetail(%s);\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3927 fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3928 fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3929 fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3930 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3931 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3932 for (method = table->list; method; method = method->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3933 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3934 gen_call_method(fd, table, method, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3935 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3936 fprintf(fd,"\n\n} // namespace %s\n", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3937 fprintf(fd,"\n/* End of client proxy code */\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3938 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3939
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3940 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3941 gen_object_header(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3942 { Entry *p, *method;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3943 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3944 fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3945 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3946 fprintf(fd,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3947 if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3948 fprintf(fd, "\nclass SOAP_CMAC %s : public soap\n{ public:", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3949 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3950 { fprintf(fd, "\nclass SOAP_CMAC %s\n{ public:", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3951 fprintf(fd, "\n\tstruct soap *soap;\n\tbool own;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3952 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3953 fprintf(fd, "\n\t/// Constructor");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3954 fprintf(fd, "\n\t%s();", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3955 if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3956 { fprintf(fd, "\n\t/// Construct from another engine state");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3957 fprintf(fd, "\n\t%s(const struct soap&);", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3958 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3959 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3960 { fprintf(fd, "\n\t/// Constructor to use/share an engine state");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3961 fprintf(fd, "\n\t%s(struct soap*);", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3962 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3963 fprintf(fd, "\n\t/// Constructor with engine input+output mode control");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3964 fprintf(fd, "\n\t%s(soap_mode iomode);", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3965 fprintf(fd, "\n\t/// Constructor with engine input and output mode control");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3966 fprintf(fd, "\n\t%s(soap_mode imode, soap_mode omode);", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3967 fprintf(fd, "\n\t/// Destructor, also frees all deserialized data");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3968 fprintf(fd, "\n\tvirtual ~%s();", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3969 fprintf(fd, "\n\t/// Delete all deserialized data (with soap_destroy and soap_end)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3970 fprintf(fd, "\n\tvirtual\tvoid destroy();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3971 fprintf(fd, "\n\t/// Delete all deserialized data and reset to defaults");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3972 fprintf(fd, "\n\tvirtual\tvoid reset();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3973 fprintf(fd, "\n\t/// Initializer used by constructor");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3974 fprintf(fd, "\n\tvirtual\tvoid %s_init(soap_mode imode, soap_mode omode);", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3975 fprintf(fd, "\n\t/// Create a copy");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3976 fprintf(fd, "\n\tvirtual\t%s *copy() SOAP_PURE_VIRTUAL;", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3977 fprintf(fd, "\n\t/// Close connection (normally automatic)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3978 fprintf(fd, "\n\tvirtual\tint soap_close_socket();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3979 fprintf(fd, "\n\t/// Force close connection (can kill a thread blocked on IO)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3980 fprintf(fd, "\n\tvirtual\tint soap_force_close_socket();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3981 fprintf(fd, "\n\t/// Return sender-related fault to sender");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3982 fprintf(fd, "\n\tvirtual\tint soap_senderfault(const char *string, const char *detailXML);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3983 fprintf(fd, "\n\t/// Return sender-related fault with SOAP 1.2 subcode to sender");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3984 fprintf(fd, "\n\tvirtual\tint soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3985 fprintf(fd, "\n\t/// Return receiver-related fault to sender");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3986 fprintf(fd, "\n\tvirtual\tint soap_receiverfault(const char *string, const char *detailXML);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3987 fprintf(fd, "\n\t/// Return receiver-related fault with SOAP 1.2 subcode to sender");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3988 fprintf(fd, "\n\tvirtual\tint soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3989 fprintf(fd, "\n\t/// Print fault");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3990 fprintf(fd, "\n\tvirtual\tvoid soap_print_fault(FILE*);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3991 fprintf(fd, "\n#ifndef WITH_LEAN\n\t/// Print fault to stream");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3992 fprintf(fd, "\n#ifndef WITH_COMPAT");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3993 fprintf(fd, "\n\tvirtual\tvoid soap_stream_fault(std::ostream&);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3994 fprintf(fd, "\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3995 fprintf(fd, "\n\t/// Put fault into buffer");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3996 fprintf(fd, "\n\tvirtual\tchar *soap_sprint_fault(char *buf, size_t len);\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3997 fprintf(fd, "\n\t/// Disables and removes SOAP Header from message");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3998 fprintf(fd, "\n\tvirtual\tvoid soap_noheader();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3999 if (!namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4000 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4001 p = entry(classtable, lookup("SOAP_ENV__Header"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4002 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4003 { t = (Table*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4004 if (t && t->list && !is_void(t->list->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4005 { fprintf(fd, "\n\t/// Put SOAP Header in message");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4006 fprintf(fd, "\n\tvirtual\tvoid soap_header(");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4007 gen_params(fd, t, NULL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4008 fprintf(fd, ";");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4009 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4010 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4011 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4012 fprintf(fd, "\n\t/// Get SOAP Header structure (NULL when absent)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4013 fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Header *soap_header();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4014 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");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4015 fprintf(fd, "\n\tvirtual\tint run(int port);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4016 fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4017 fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4018 fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4019 fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4020 fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4021 fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4022 fprintf(fd, "\n\tvirtual\tint ssl_accept();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4023 fprintf(fd, "\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4024 fprintf(fd, "\n\t/// Serve this request (returns error code or SOAP_OK)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4025 fprintf(fd, "\n\tvirtual\tint serve();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4026 fprintf(fd, "\n\t/// Used by serve() to dispatch a request (returns error code or SOAP_OK)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4027 fprintf(fd, "\n\tvirtual\tint dispatch();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4028 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///");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4029 for (method = table->list; method; method = method->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4030 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4031 gen_method(fd, table, method, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4032 fprintf(fd, "\n};");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4033 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4034 fprintf(fd,"\n\n} // namespace %s\n", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4035 fprintf(fd, "\n#endif\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4036 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4037
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4038 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4039 gen_method(FILE *fd, Table *table, Entry *method, int server)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4040 { Table *params;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4041 Entry *result, *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4042 char *soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4043 if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4044 soap = "this";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4045 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4046 soap = "this->soap";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4047 result = (Entry*)method->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4048 p = entry(classtable, method->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4049 if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4050 execerror("no table entry");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4051 params = (Table*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4052 if (server || !is_transient(result->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4053 { if (is_transient(result->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4054 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4055 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4056 fprintf(fd, "\n\n\t/// Web service operation '%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4057 fprintf(fd, "\n\tvirtual\tint %s(", ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4058 gen_params(fd, params, result, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4059 if (!server)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4060 { fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4061 gen_args(fd, params, result, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4062 fprintf(fd, "; }");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4063 fprintf(fd, "\n\tvirtual\tint %s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4064 gen_params(fd, params, result, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4065 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4066 if (server)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4067 fprintf(fd, " SOAP_PURE_VIRTUAL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4068 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4069 fprintf(fd, ";");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4070 if (is_transient(result->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4071 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4072 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4073 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4074 { fprintf(fd, "\n\n\t/// Web service one-way send operation 'send_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4075 fprintf(fd, "\n\tvirtual\tint send_%s(", ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4076 gen_params(fd, params, result, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4077 fprintf(fd, " { return this->send_%s(NULL, NULL", ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4078 gen_args(fd, params, result, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4079 fprintf(fd, "; }");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4080 fprintf(fd, "\n\tvirtual\tint send_%s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4081 gen_params(fd, params, result, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4082 fprintf(fd, ";\n\t/// Web service one-way receive operation 'recv_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4083 fprintf(fd, ";\n\tvirtual\tint recv_%s(", ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4084 fprintf(fd, "struct %s&);", ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4085 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4086 fprintf(fd, "\n\tvirtual\tint recv_%s_empty_response() { return soap_recv_empty_response(%s); }", ns_cname(method->sym->name, NULL), soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4087 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4088 fprintf(fd, "\n\tvirtual\tint %s(", ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4089 gen_params(fd, params, result, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4090 fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4091 gen_args(fd, params, result, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4092 fprintf(fd, "; }");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4093 fprintf(fd, "\n\tvirtual\tint %s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4094 gen_params(fd, params, result, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4095 fprintf(fd, " { if (this->send_%s(endpoint, soap_action", ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4096 gen_args(fd, params, result, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4097 fprintf(fd, " || soap_recv_empty_response(%s)) return %s->error; return SOAP_OK; }", soap, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4098 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4099 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4100
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4101 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4102 gen_params(FILE *fd, Table *params, Entry *result, int flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4103 { Entry *param;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4104 for (param = params->list; param; param = param->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4105 fprintf(fd, "%s%s%s", flag || param != params->list ? ", " : "", c_storage(param->info.sto), c_type_id(param->info.typ, param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4106 if (!result || is_transient(result->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4107 fprintf(fd, ")");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4108 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4109 fprintf(fd, "%s%s%s)", flag || params->list ? ", " : "", c_storage(result->info.sto), c_type_id(result->info.typ, result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4110 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4111
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4112 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4113 gen_args(FILE *fd, Table *params, Entry *result, int flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4114 { Entry *param;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4115 for (param = params->list; param; param = param->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4116 fprintf(fd, "%s%s", flag || param != params->list ? ", " : "", param->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4117 if (!result || is_transient(result->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4118 fprintf(fd, ")");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4119 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4120 fprintf(fd, "%s%s)", flag || params->list ? ", " : "", result->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4121 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4122
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4123 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4124 gen_query_url(FILE *fd, Table *params)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4125 { Entry *param;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4126 int flag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4127 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?");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4128 for (param = params->list; param; param = param->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4129 if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4130 fprintf(fd, "%s%s=%s", flag++ ? "&" : "", ns_remove(param->sym->name), gen_format(fd, param->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4131 fprintf(fd, "\", soap_endpoint");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4132 for (param = params->list; param; param = param->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4133 { if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4134 { if (is_stdstring(param->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4135 fprintf(fd, ", soap_encode_url_string(soap, %s.c_str())", ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4136 else if (is_string(param->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4137 fprintf(fd, ", soap_encode_url_string(soap, %s)", ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4138 else if (is_primitive(param->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4139 fprintf(fd, ", %s", ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4140 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4141 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4142 fprintf(fd, ") < 0)\n\t{\tsoap->error = SOAP_EOM;\n\t\treturn soap_closesock(soap);\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4143 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4144
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4145 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4146 gen_query_form(FILE *fd, Table *params)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4147 { Entry *param;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4148 int flag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4149 fprintf(fd, "\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4150 for (param = params->list; param; param = param->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4151 { if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4152 { fprintf(fd, "soap_send(soap, \"%s%s=\")", flag++ ? "&" : "", ns_remove(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4153 if (is_stdstring(param->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4154 fprintf(fd, " || soap_send(soap, soap_encode_url_string(soap, %s.c_str()))\n\t || ", ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4155 else if (is_string(param->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4156 fprintf(fd, " || soap_send(soap_encode_url_string(soap, %s))\n\t || ", ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4157 else if (is_primitive(param->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4158 fprintf(fd, " || soap_send(soap, soap_%s2s(soap, %s))\n\t || ", c_ident(param->info.typ), ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4159 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4160 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4161 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4162
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4163 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4164 gen_format(FILE *fd, Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4165 { if (is_string(typ) || is_stdstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4166 return "%s";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4167 switch (typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4168 { case Tchar: return "%hhd";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4169 case Tshort: return "%hd";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4170 case Tint: return "%d";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4171 case Tlong: return "%ld";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4172 case Tllong: return SOAP_LONG_FORMAT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4173 case Tfloat: return "%.9G";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4174 case Tdouble: return "%.17lG";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4175 case Tuchar: return "%hhu";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4176 case Tushort: return "%hu";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4177 case Tuint: return "%u";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4178 case Tulong: return "%lu";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4179 case Tullong: return SOAP_ULONG_FORMAT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4180 default: return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4181 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4182 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4183
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4184 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4185 gen_call_method(FILE *fd, Table *table, Entry *method, char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4186 { Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4187 Method *m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4188 int soap = (vflag >= 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4189 int version = vflag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4190 int get = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4191 int put = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4192 int post = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4193 int mime = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4194 const char *style, *encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4195 const char *xtag, *xtyp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4196 const char *action = NULL, *method_encoding = NULL, *method_response_encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4197 Table *params;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4198 Entry *param, *result, *p, *response = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4199 result = (Entry*)method->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4200 p = entry(classtable, method->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4201 if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4202 execerror("no table entry");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4203 params = (Table*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4204 if (!is_response(result->info.typ) && !is_XML(result->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4205 response = get_response(method->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4206 if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4207 { if (!is_transient(result->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4208 fprintf(fd, "\n\nint %s::%s(const char *endpoint, const char *soap_action", name, ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4209 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4210 fprintf(fd, "\n\nint %s::send_%s(const char *endpoint, const char *soap_action", name, ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4211 gen_params(fd, params, result, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4212 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4213 else if (!is_transient(result->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4214 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4215 gen_params(fheader, params, result, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4216 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4217 gen_params(fd, params, result, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4218 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4219 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4220 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4221 gen_params(fheader, params, result, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4222 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4223 gen_params(fd, params, result, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4224 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4225 if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4226 { if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4227 fprintf(fd, "\n{\tstruct soap *soap = this;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4228 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4229 fprintf(fd, "\n{\tstruct soap *soap = this->soap;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4230 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4231 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4232 { fprintf(fheader, ";");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4233 fprintf(fd, "\n{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4234 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4235 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4236 { if (has_ns_eq(sp->ns, method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4237 { style = sp->style;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4238 encoding = sp->encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4239 method_encoding = encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4240 method_response_encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4241 if (sp->protocol)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4242 { if (strstr(sp->protocol, "GET"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4243 get = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4244 else if (strstr(sp->protocol, "POST"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4245 post = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4246 else if (strstr(sp->protocol, "PUT"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4247 put = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4248 if (strncmp(sp->protocol, "SOAP", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4249 soap = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4250 else if (strlen(sp->protocol) > 6)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4251 version = sp->protocol[6] - '0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4252 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4253 for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4254 { if (is_eq_nons(m->name, method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4255 { if (m->mess == ACTION || m->mess == REQUEST_ACTION)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4256 action = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4257 else if (m->mess == ENCODING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4258 method_encoding = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4259 else if (m->mess == RESPONSE_ENCODING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4260 method_response_encoding = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4261 else if (m->mess == PROTOCOL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4262 { if (strstr(m->part, "GET"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4263 get = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4264 else if (strstr(m->part, "POST"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4265 post = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4266 else if (strstr(m->part, "PUT"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4267 put = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4268 if (strncmp(m->part, "SOAP", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4269 soap = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4270 else if (strlen(m->part) > 6)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4271 version = m->part[6] - '0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4272 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4273 else if (m->mess&MIMEIN && !strcmp(m->part, "application/x-www-form-urlencoded"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4274 mime = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4275 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4276 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4277 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4278 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4279 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4280 if (!get && !mime)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4281 fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(method->sym->name), ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4282 if (response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4283 fprintf(fd, "\n\tstruct %s *soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4284 if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4285 fprintf(fd, "\n\tif (endpoint)\n\t\tsoap_endpoint = endpoint;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4286 if (sp && sp->URL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4287 fprintf(fd, "\n\tif (soap_endpoint == NULL)\n\t\tsoap_endpoint = \"%s\";", sp->URL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4288 if (action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4289 { fprintf(fd, "\n\tif (soap_action == NULL)\n\t\tsoap_action = ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4290 if (*action == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4291 fprintf(fd, "%s;", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4292 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4293 fprintf(fd, "\"%s\";", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4294 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4295 if (!method_response_encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4296 method_response_encoding = method_encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4297 if (!get && !mime)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4298 { fprintf(fd, "\n\tsoap_begin(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4299 if (soap && sp && sp->URI && method_encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4300 { if (is_literal(method_encoding))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4301 fprintf(fd, "\n\tsoap->encodingStyle = NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4302 else if (method_encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4303 fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", method_encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4304 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4305 else if (!soap || !eflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4306 fprintf(fd, "\n\tsoap->encodingStyle = NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4307 for (param = params->list; param; param = param->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4308 { if (param->info.typ->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4309 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4310 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4311 fprintf(fd, "\n\tsoap_tmp_%s.%s = %s;", ident(method->sym->name), ident(param->sym->name), ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4312 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4313 if (!soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4314 fprintf(fd, "\n\tsoap_set_version(soap, 0); /* no SOAP */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4315 else if (version)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4316 fprintf(fd, "\n\tsoap_set_version(soap, %d); /* SOAP1.%d */", version, version);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4317 if (soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4318 fprintf(fd, "\n\tsoap_serializeheader(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4319 fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", ident(method->sym->name), ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4320 fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4321 fprintf(fd, "\n\tif (soap->mode & SOAP_IO_LENGTH)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4322 fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4323 if (soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4324 { fprintf(fd, "\n\t\t || soap_putheader(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4325 fprintf(fd, "\n\t\t || soap_body_begin_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4326 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4327 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4328 if (soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4329 fprintf(fd, "\n\t\t || soap_body_end_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4330 fprintf(fd, "\n\t\t || soap_envelope_end_out(soap))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4331 fprintf(fd, "\n\t\t\t return soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4332 fprintf(fd, "\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4333 fprintf(fd, "\n\tif (soap_end_count(soap))\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4334 if (soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4335 fprintf(fd, "\n\tif (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4336 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4337 { fprintf(fd, "\n\tsoap->http_content = \"text/xml\";");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4338 if (put)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4339 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_PUT, soap_url(soap, soap_endpoint, soap_action), soap_action)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4340 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4341 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_POST_FILE, soap_url(soap, soap_endpoint, soap_action), soap_action)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4342 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4343 fprintf(fd, "\n\t || soap_envelope_begin_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4344 if (soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4345 { fprintf(fd, "\n\t || soap_putheader(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4346 fprintf(fd, "\n\t || soap_body_begin_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4347 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4348 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4349 if (soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4350 fprintf(fd, "\n\t || soap_body_end_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4351 fprintf(fd, "\n\t || soap_envelope_end_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4352 fprintf(fd, "\n\t || soap_end_send(soap))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4353 fprintf(fd, "\n\t\treturn soap_closesock(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4354 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4355 else if (get)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4356 { if (params->list)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4357 { gen_query_url(fd, params);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4358 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap->msgbuf, soap_action))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4359 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4360 else if (soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4361 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap_url(soap, soap_endpoint, NULL), soap_action))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4362 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4363 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap_url(soap, soap_endpoint, soap_action), soap_action))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4364 fprintf(fd, "\n\t\treturn soap_closesock(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4365 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4366 else if (mime)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4367 { fprintf(fd, "\n\tsoap->http_content = \"application/x-www-form-urlencoded\";");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4368 if (post)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4369 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_POST_FILE, soap_url(soap, soap_endpoint, soap_action), soap_action))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4370 else if (put)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4371 fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_PUT, soap_url(soap, soap_endpoint, soap_action), soap_action))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4372 fprintf(fd, "\n\t\treturn soap_closesock(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4373 gen_query_form(fd, params);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4374 fprintf(fd, "soap_end_send(soap))\n\t\treturn soap_closesock(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4375 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4376 if (is_transient(result->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4377 { fprintf(fd, "\n\treturn SOAP_OK;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4378 if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4379 { fprintf(fd, "\n\nint %s::recv_%s(", name, ns_cname(method->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4380 fprintf(fd, "struct %s& tmp)", ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4381 if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4382 fprintf(fd, "\n{\tstruct soap *soap = this;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4383 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4384 fprintf(fd, "\n{\tstruct soap *soap = this->soap;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4385 fprintf(fd, "\n\tstruct %s *%s = &tmp;", ident(method->sym->name), ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4386 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4387 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4388 { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4389 fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4390 fprintf(fheader, "struct %s *%s);\n", ident(method->sym->name), ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4391 fprintf(fd, "struct %s *%s)\n{", ident(method->sym->name), ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4392 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4393 fprintf(fd, "\n\tsoap_default_%s(soap, %s);", ident(method->sym->name), ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4394 fprintf(fd, "\n\tsoap_begin(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4395 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4396 else if (result->info.typ->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4397 fprintf(fd, "\n\tsoap_default_%s(soap, %s);", c_ident(result->info.typ), ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4398 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4399 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4400 else if (((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4401 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4402 else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4403 fprintf(fd, "\n\t%s = NULL;", ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4404 else if (((Tnode*)result->info.typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4405 fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t*%s = NULL;", ident(result->sym->name), ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4406 else if (result->info.typ->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4407 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4408 else if (!is_void(result->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4409 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4410 fprintf(fd,"\n\tif (soap_begin_recv(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4411 fprintf(fd,"\n\t || soap_envelope_begin_in(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4412 fprintf(fd,"\n\t || soap_recv_header(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4413 fprintf(fd,"\n\t || soap_body_begin_in(soap))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4414 fprintf(fd,"\n\t\treturn soap_closesock(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4415 if (is_transient(result->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4416 { fprintf(fd,"\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", ident(method->sym->name), ident(result->sym->name), ns_convert(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4417 fprintf(fd,"\n\tif (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)\n\t\tsoap->error = SOAP_OK;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4418 fprintf(fd,"\n\tif (soap->error");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4419 fprintf(fd,"\n\t || soap_body_end_in(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4420 fprintf(fd,"\n\t || soap_envelope_end_in(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4421 fprintf(fd,"\n\t || soap_end_recv(soap))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4422 fprintf(fd,"\n\t\treturn soap_closesock(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4423 fprintf(fd,"\n\treturn soap_closesock(soap);\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4424 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4425 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4426 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4427 /* With RPC encoded responses, try to parse the fault first */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4428 if (!is_literal(method_response_encoding))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4429 { fprintf(fd,"\n\tif (soap_recv_fault(soap, 1))\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4430 xtag = xtyp = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4431 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4432 else if (has_ns_eq(NULL, result->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4433 { if (response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4434 xtag = xml_tag(response->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4435 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4436 xtag = ns_convert(result->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4437 xtyp = xsi_type(result->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4438 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4439 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4440 { if (response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4441 xtag = xml_tag(response->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4442 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4443 xtag = xml_tag(result->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4444 xtyp = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4445 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4446 if (response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4447 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4448 fprintf(fd,"\n\tif (!soap_tmp_%s || soap->error)\n\t\treturn soap_recv_fault(soap, 0);", c_ident(response->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4449 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4450 else if ((result->info.typ->type == Treference || result->info.typ->type == Tpointer) && !is_invisible_empty(result->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4451 { 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4452 fprintf(fd,"\n\t%s.soap_get(soap, \"%s\", \"%s\");", ident(result->sym->name), xtag, xtyp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4453 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4454 fprintf(fd,"\n\t%s->soap_get(soap, \"%s\", \"%s\");", ident(result->sym->name), xtag, xtyp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4455 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4456 { fprintf(fd,"\n\tsoap_get_%s(soap, &%s, \"%s\", \"%s\");", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag, xtyp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4457 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4458 else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)result->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4459 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4460 fprintf(fd,"\n\tsoap_get_%s(soap, %s, \"%s\", \"%s\");", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag, xtyp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4461 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4462 else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4463 { fprintf(fd,"\n\tsoap_inliteral(soap, NULL, %s);", ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4464 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4465 else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4466 { fprintf(fd,"\n\tsoap_inliteral(soap, NULL, &%s);", ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4467 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4468 else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4469 { fprintf(fd,"\n\tsoap_inwliteral(soap, NULL, %s);", ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4470 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4471 else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4472 { fprintf(fd,"\n\tsoap_inwliteral(soap, NULL, &%s);", ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4473 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4474 else if (result->info.typ->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4475 { fprintf(fd,"\n\tsoap_get_%s(soap, &%s, \"%s\", \"%s\");", c_ident(result->info.typ), ident(result->sym->name), xtag, xtyp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4476 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4477 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4478 { fprintf(fd,"\n\tsoap_get_%s(soap, %s, \"%s\", \"%s\");", c_ident(result->info.typ), ident(result->sym->name), xtag, xtyp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4479 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4480 fprintf(fd,"\n\tif (soap->error)\n\t\treturn soap_recv_fault(soap, 0);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4481 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4482 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4483 fprintf(fd,"\n\tif (soap_body_end_in(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4484 fprintf(fd,"\n\t || soap_envelope_end_in(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4485 fprintf(fd,"\n\t || soap_end_recv(soap))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4486 fprintf(fd,"\n\t\treturn soap_closesock(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4487 if (response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4488 { if (result->info.typ->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4489 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4490 else if (result->info.typ->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4491 fprintf(fd,"\n\t%s = soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4492 else if (!is_external((Tnode*)result->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4493 { fprintf(fd,"\n\tif (%s && soap_tmp_%s->%s)", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4494 fprintf(fd,"\n\t\t*%s = *soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4495 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4496 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4497 fprintf(fd,"\n\treturn soap_closesock(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4498 fprintf(fd ,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4499 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4500 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4501
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4502 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4503 gen_serve_method(FILE *fd, Table *table, Entry *param, char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4504 { Service *sp = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4505 char *style, *encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4506 Entry *result, *p, *q, *pin, *pout, *response = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4507 Table *input;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4508 char *xtag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4509 Method *m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4510 char *method_encoding = NULL, *method_response_encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4511 result = (Entry*)param->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4512 p = entry(classtable, param->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4513 if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4514 execerror("no table entry");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4515 if (!is_response(result->info.typ) && !is_XML(result->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4516 response = get_response(param->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4517 q = entry(table, param->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4518 if (!q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4519 execerror("no table entry");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4520 pout = (Entry*)q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4521 if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4522 { if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4523 fprintf(fd, "\n\nstatic int serve_%s(%s *soap)\n{", ident(param->sym->name), name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4524 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4525 fprintf(fd, "\n\nstatic int serve_%s(%s *service)\n{\tstruct soap *soap = service->soap;\n", ident(param->sym->name), name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4526 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4527 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4528 { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap*);", ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4529 fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap *soap)\n{", ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4530 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4531 fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(param->sym->name), ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4532 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4533 if (has_ns_eq(sp->ns, param->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4534 { style = sp->style;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4535 encoding = sp->encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4536 method_encoding = encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4537 method_response_encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4538 for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4539 { if (is_eq_nons(m->name, param->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4540 { if (m->mess == ENCODING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4541 method_encoding = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4542 else if (m->mess == RESPONSE_ENCODING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4543 method_response_encoding = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4544 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4545 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4546 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4547 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4548 if (!method_response_encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4549 method_response_encoding = method_encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4550 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4551 if (!is_transient(pout->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4552 { if (pout->info.typ->type == Tarray && response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4553 { fprintf(fd,"\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4554 fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4555 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4556 else if (pout->info.typ->type == Tpointer && !is_stdstring(pout->info.typ) && !is_stdwstring(pout->info.typ) && response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4557 { fprintf(fd,"\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4558 fprintf(fd,"\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4559 fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4560 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4561 fprintf(fd,"\n\tsoap_tmp_%s.soap_default(soap);", c_ident((Tnode*)pout->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4562 else if (((Tnode*)pout->info.typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4563 fprintf(fd,"\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4564 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4565 fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4566 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4567 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4568 else if (response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4569 { fprintf(fd,"\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4570 fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4571 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4572 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4573 { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4574 fprintf(fd,"\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4575 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4576 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4577 { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4578 fprintf(fd,"\n\t%s.soap_default(soap);", ident(pout->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4579 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4580 else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4581 { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4582 fprintf(fd,"\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode *)pout->info.typ->ref), ident(pout->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4583 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4584 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4585 { fprintf(fd,"\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4586 if (is_string((Tnode*)pout->info.typ->ref) || is_wstring((Tnode*)pout->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4587 fprintf(fd,"\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4588 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4589 fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4590 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4591 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4592 fprintf(fd,"\n\tsoap_default_%s(soap, &soap_tmp_%s);", ident(param->sym->name), ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4593 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4594 q = entry(classtable, param->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4595 if (!is_invisible_empty(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4596 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4597 fprintf(fd,"\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4598 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4599 fprintf(fd,"\n\tif (soap_body_end_in(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4600 fprintf(fd,"\n\t || soap_envelope_end_in(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4601 fprintf(fd,"\n\t || soap_end_recv(soap))\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4602 if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4603 { if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4604 fprintf(fd, "\n\tsoap->error = soap->%s(", ns_cname(param->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4605 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4606 fprintf(fd, "\n\tsoap->error = service->%s(", ns_cname(param->sym->name, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4607 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4608 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4609 fprintf(fd, "\n\tsoap->error = %s(soap", ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4610 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4611 input = (Table*) q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4612 for (pin = input->list; pin; pin = pin->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4613 fprintf(fd, "%ssoap_tmp_%s.%s", !name || pin != input->list ? ", " : "", ident(param->sym->name), ident(pin->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4614 if (is_transient(pout->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4615 fprintf(fd, ");");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4616 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4617 { if (!name || input->list)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4618 fprintf(fd, ", ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4619 if (response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4620 fprintf(fd, "soap_tmp_%s.%s);", c_ident(response->info.typ), ident(pout->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4621 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4622 fprintf(fd, "%s);", ident(pout->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4623 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4624 fprintf(fd, "&%s);", ident(pout->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4625 else if(pout->info.typ->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4626 fprintf(fd, "soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4627 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4628 fprintf(fd, "&soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4629 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4630 fprintf(fd,"\n\tif (soap->error)\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4631 if (!is_transient(pout->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4632 { if (sp && sp->URI && method_response_encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4633 { if (is_literal(method_response_encoding))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4634 fprintf(fd, "\n\tsoap->encodingStyle = NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4635 else if (sp->encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4636 fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", sp->encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4637 else if (method_response_encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4638 fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", method_response_encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4639 else if (!eflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4640 fprintf(fd, "\n\tsoap->encodingStyle = NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4641 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4642 else if (!eflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4643 fprintf(fd, "\n\tsoap->encodingStyle = NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4644 fprintf(fd,"\n\tsoap_serializeheader(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4645 if (pout->info.typ->type == Tarray && response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4646 fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4647 else if (response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4648 fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4649 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4650 fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4651 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4652 fprintf(fd, "\n\t%s.soap_serialize(soap);", ident(pout->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4653 else if(((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4654 fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4655 else if (!is_XML((Tnode*)pout->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4656 fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4657 if (has_ns_eq(NULL, pout->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4658 xtag = ns_convert(pout->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4659 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4660 xtag = xml_tag(pout->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4661 fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4662 fprintf(fd, "\n\tif (soap->mode & SOAP_IO_LENGTH)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4663 fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4664 fprintf(fd,"\n\t\t || soap_putheader(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4665 fprintf(fd,"\n\t\t || soap_body_begin_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4666 if (response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4667 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4668 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4669 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4670 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4671 fprintf(fd, "\n\t\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4672 else if (((Tnode*)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4673 fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4674 else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4675 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4676 else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4677 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4678 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4679 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4680 fprintf(fd,"\n\t\t || soap_body_end_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4681 fprintf(fd,"\n\t\t || soap_envelope_end_out(soap))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4682 fprintf(fd,"\n\t\t\t return soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4683 fprintf(fd,"\n\t};");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4684 fprintf(fd,"\n\tif (soap_end_count(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4685 fprintf(fd,"\n\t || soap_response(soap, SOAP_OK)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4686 fprintf(fd,"\n\t || soap_envelope_begin_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4687 fprintf(fd,"\n\t || soap_putheader(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4688 fprintf(fd,"\n\t || soap_body_begin_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4689 if (response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4690 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4691 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4692 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4693 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4694 fprintf(fd, "\n\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4695 else if(((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4696 fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4697 else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4698 fprintf(fd,"\n\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4699 else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4700 fprintf(fd,"\n\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4701 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4702 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4703 fprintf(fd,"\n\t || soap_body_end_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4704 fprintf(fd,"\n\t || soap_envelope_end_out(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4705 fprintf(fd,"\n\t || soap_end_send(soap))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4706 fprintf(fd, "\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4707 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4708 fprintf(fd,"\n\treturn soap_closesock(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4709 fprintf(fd,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4710 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4711 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4712
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4713 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4714 gen_object_code(FILE *fd, Table *table, Symbol *ns, char *name, char *URL, char *executable, char *URI, char *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4715 { Entry *p, *method, *catch_method, *param;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4716 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4717 char *soap, *catch_action;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4718 if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4719 soap = "this";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4720 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4721 soap = "this->soap";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4722 fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4723 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4724 fprintf(fd,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4725 if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4726 { fprintf(fd, "\n\n%s::%s()\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4727 fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4728 fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4729 fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\t%s_init(imode, omode);\n}", name, name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4730 fprintf(fd, "\n\n%s::~%s()\n{ }", name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4731 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4732 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4733 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4734 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4735 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4736 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4737 fprintf(fd, "\n\n%s::~%s()\n{\tif (this->own)\n\t\tsoap_free(this->soap);\n}", name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4738 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4739 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4740 gen_nsmap(fd, ns, URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4741 fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4742 fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4743 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4744 if (iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4745 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4746 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4747 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4748 fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4749 fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4750 fprintf(fd, "\n\nint %s::soap_senderfault(const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault(%s, string, detailXML);\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4751 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4752 fprintf(fd, "\n\nint %s::soap_receiverfault(const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault(%s, string, detailXML);\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4753 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4754 fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4755 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4756 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4757 fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4758 if (!namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4759 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4760 p = entry(classtable, lookup("SOAP_ENV__Header"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4761 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4762 { t = (Table*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4763 if (t && t->list && !is_void(t->list->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4764 { fprintf(fd, "\n\nvoid %s::soap_header(", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4765 gen_params(fd, t, NULL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4766 fprintf(fd, "\n{\t::soap_header(%s);", soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4767 for (param = t->list; param; param = param->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4768 { if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4769 fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4770 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4771 fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4772 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4773 fprintf(fd, "\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4774 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4775 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4776 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4777 fprintf(fd, "\n\nconst SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4778 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4779 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4780 fprintf(fd, "\n\nSOAP_SOCKET %s::accept()\n{\treturn soap_accept(%s);\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4781 fprintf(fd, "\n\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4782 fprintf(fd, "\nint %s::ssl_accept()\n{\treturn soap_ssl_accept(%s);\n}", name, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4783 fprintf(fd, "\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4784 fprintf(fd, "\n\nint %s::serve()", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4785 fprintf(fd, "\n{\n#ifndef WITH_FASTCGI\n\tunsigned int k = %s->max_keep_alive;\n#endif\n\tdo\n\t{", soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4786 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4787 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4788 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4789 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4790 fprintf(fd, "\n\treturn SOAP_OK;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4791 fprintf(fd, "\n}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4792 for (method = table->list; method; method = method->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4793 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4794 fprintf(fd, "\nstatic int serve_%s(%s*);", ident(method->sym->name), name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4795 fprintf(fd, "\n\nint %s::dispatch()\n{", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4796 if (!iflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4797 fprintf(fd, "\t%s_init(this->soap->imode, this->soap->omode);\n", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4798 fprintf(fd, "\tsoap_peek_element(%s);", soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4799 catch_method = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4800 catch_action = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4801 for (method = table->list; method; method = method->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4802 { char *action = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4803 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4804 { if (aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4805 { Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4806 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4807 { if (has_ns_eq(sp->ns, method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4808 { Method *m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4809 for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4810 { if (is_eq_nons(m->name, method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4811 { if (m->mess == ACTION || m->mess == REQUEST_ACTION)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4812 action = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4813 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4814 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4815 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4816 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4817 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4818 if (is_invisible(method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4819 { Entry *param = entry(classtable, method->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4820 if (param)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4821 param = ((Table*)param->info.typ->ref)->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4822 if (action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4823 { if (*action == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4824 { fprintf(fd, "\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4825 if (param && !Aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4826 fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4827 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4828 { catch_method = method;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4829 catch_action = action;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4830 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4831 fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4832 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4833 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4834 { fprintf(fd, "\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4835 if (param && !Aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4836 fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4837 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4838 { catch_method = method;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4839 catch_action = action;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4840 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4841 fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4842 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4843 fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4844 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4845 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4846 { if (Aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4847 compliancewarn("Option -A requires a SOAPAction where none is defined");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4848 if (param)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4849 { fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4850 fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4851 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4852 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4853 { catch_method = method;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4854 catch_action = action;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4855 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4856 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4857 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4858 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4859 { if (action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4860 { if (*action == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4861 { fprintf(fd, "\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4862 if (!Aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4863 fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4864 fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4865 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4866 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4867 { fprintf(fd, "\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4868 if (!Aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4869 fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4870 fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4871 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4872 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4873 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4874 { if (Aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4875 compliancewarn("Option -A requires a SOAPAction where none is defined");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4876 fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4877 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4878 fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4879 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4880 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4881 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4882 if (catch_method)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4883 { if (Aflag && catch_action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4884 { if (*catch_action == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4885 { fprintf(fd, "\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4886 fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, catch_action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4887 fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(catch_method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4888 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4889 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4890 { fprintf(fd, "\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4891 fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, catch_action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4892 fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(catch_method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4893 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4894 fprintf(fd,"\n\treturn %s->error = SOAP_NO_METHOD;", soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4895 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4896 fprintf(fd, "\n\treturn serve_%s(this);\n}", ident(catch_method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4897 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4898 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4899 fprintf(fd, "\n\treturn %s->error = SOAP_NO_METHOD;\n}", soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4900 for (method = table->list; method; method = method->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4901 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4902 gen_serve_method(fd, table, method, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4903 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4904 fprintf(fd,"\n\n} // namespace %s\n", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4905 fprintf(fd,"\n/* End of server object code */\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4906 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4907
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4908 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4909 gen_response_begin(FILE *fd, int n, char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4910 { if (!is_invisible(s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4911 { fprintf(fd, "%*s<%sResponse", n, "", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4912 if (vflag < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4913 gen_xmlns(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4914 fprintf(fd, ">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4915 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4916 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4917
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4918 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4919 gen_response_end(FILE *fd, int n, char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4920 { if (!is_invisible(s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4921 fprintf(fd, "%*s</%sResponse>\n", n, "", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4922 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4923
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4924 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4925 gen_element_begin(FILE *fd, int n, char *s, char *t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4926 { if (!is_invisible(s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4927 { if (tflag && t && *t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4928 fprintf(fd, "%*s<%s xsi:type=\"%s\"", n, "", s, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4929 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4930 fprintf(fd, "%*s<%s", n, "", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4931 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4932 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4933
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4934 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4935 gen_element_end(FILE *fd, int n, char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4936 { if (!is_invisible(s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4937 fprintf(fd, "%*s</%s>\n", n, "", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4938 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4939 fprintf(fd, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4940 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4941
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4942 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4943 gen_data(char *buf, Table *t, char *ns, char *name, char *URL, char *executable, char *URI, char *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4944 { Entry *p, *q, *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4945 FILE *fd;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4946 char *method_encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4947 char *method_response_encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4948 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4949 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4950 if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4951 { int get = 0, soap = 1, mime = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4952 Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4953 Method *m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4954 char *nse = ns_qualifiedElement(p->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4955 char *nsa = ns_qualifiedAttribute(p->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4956 method_encoding = encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4957 method_response_encoding = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4958 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4959 { if (!tagcmp(sp->ns, ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4960 { for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4961 { if (is_eq_nons(m->name, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4962 { if (m->mess == ENCODING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4963 method_encoding = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4964 else if (m->mess == RESPONSE_ENCODING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4965 method_response_encoding = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4966 else if (m->mess&MIMEIN && !strcmp(m->part, "application/x-www-form-urlencoded"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4967 mime = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4968 else if (m->mess == PROTOCOL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4969 { if (strncmp(m->part, "SOAP", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4970 soap = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4971 if (strstr(m->part, "GET"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4972 get = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4973 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4974 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4975 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4976 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4977 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4978 if (!method_response_encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4979 method_response_encoding = method_encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4980 /* request */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4981 if (!get && !mime)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4982 { fd = gen_env(buf, ns_remove(p->sym->name), 0, t, ns, name, URL, executable, URI, method_encoding, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4983 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4984 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4985 q = entry(classtable, p->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4986 if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4987 { fprintf(fd, "%*s<!-- %s(...", 2, "", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4988 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4989 { Table *r = (Table*)q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4990 while (r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4991 { Entry *e;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4992 for (e = r->list; e; e = e->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4993 fprintf(fd, ", %s", c_type_id(e->info.typ, e->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4994 r = r->prev;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4995 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4996 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4997 fprintf(fd, ", ...) -->\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4998 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4999 gen_element_begin(fd, 2, ns_convert(p->sym->name), NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5000 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5001 { if (!is_invisible(p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5002 { if (soap && vflag < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5003 gen_xmlns(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5004 gen_atts(fd, 2, (Table*)q->info.typ->ref, nsa);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5005 fprintf(fd, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5006 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5007 for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5008 gen_field(fd, 3, q, nse, nsa, method_encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5009 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5010 gen_element_end(fd, 2, ns_convert(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5011 if (soap && vflag >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5012 fprintf(fd, " </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5013 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5014 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5015 /* response */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5016 q = (Entry*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5017 if (!mime && q && !is_transient(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5018 { fd = gen_env(buf, ns_remove(p->sym->name), 1, t, ns, name, URL, executable, URI, method_response_encoding, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5019 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5020 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5021 if (q && !is_response(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5022 { if (is_XML((Tnode*)q->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5023 { gen_response_begin(fd, 2, ns_convert(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5024 gen_response_end(fd, 2, ns_convert(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5025 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5026 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5027 { gen_response_begin(fd, 2, ns_convert(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5028 gen_field(fd, 3, q, nse, nsa, method_response_encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5029 gen_response_end(fd, 2, ns_convert(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5030 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5031 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5032 else if (q && q->info.typ->ref && ((Tnode*)q->info.typ->ref)->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5033 { char *xtag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5034 nse = ns_qualifiedElement((Tnode*)q->info.typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5035 nsa = ns_qualifiedAttribute((Tnode*)q->info.typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5036 if (has_ns_eq(NULL, q->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5037 xtag = q->sym->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5038 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5039 xtag = ((Tnode*)q->info.typ->ref)->id->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5040 if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5041 fprintf(fd, "%*s<!-- %s(..., %s) -->\n", 2, "", ident(p->sym->name), c_type_id(q->info.typ, q->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5042 gen_element_begin(fd, 2, ns_addx(xtag, nse), NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5043 if (!is_invisible(xtag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5044 { if (soap && vflag < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5045 gen_xmlns(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5046 gen_atts(fd, 2, ((Tnode*)q->info.typ->ref)->ref, nsa);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5047 fprintf(fd, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5048 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5049 for (r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; r; r = r->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5050 gen_field(fd, 3, r, nse, nsa, method_response_encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5051 gen_element_end(fd, 2, ns_addx(xtag, nse));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5052 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5053 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5054 if (soap && vflag >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5055 fprintf(fd, " </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5056 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5057 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5058 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5059 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5060 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5061
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5062 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5063 gen_field(FILE *fd, int n, Entry *p, char *nse, char *nsa, char *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5064 { Entry *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5065 char tmp[32];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5066 LONG64 i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5067 int d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5068 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5069 { if (is_soap12(encoding) && (p->info.sto & Sreturn) && (nse || has_ns_eq(NULL, p->sym->name)) && !is_literal(encoding))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5070 fprintf(fd, "%*s<SOAP-RPC:result xmlns:SOAP-RPC=\"%s\">%s</SOAP-RPC:result>\n", n, "", rpcURI, ns_add(p, nse));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5071 if (is_XML(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5072 { if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5073 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5074 gen_element_begin(fd, n, ns_add(p, nse), NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5075 if (!is_invisible(p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5076 fprintf(fd, ">");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5077 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5078 fprintf(fd, "%*s<!-- extensibility element(s) -->\n", n, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5079 gen_element_end(fd, n, ns_add(p, nse));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5080 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5081 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5082 { if (!is_string(p->info.typ) && n >= 10 && p->info.minOccurs <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5083 { /* Do not generate nil, since some tools don't accept it:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5084 if (!is_invisible(p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5085 { gen_element_begin(fd, n, ns_add(p->sym->name, nse), NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5086 fprintf(fd, " xsi:nil=\"true\"/>");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5087 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5088 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5089 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5090 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5091 else if (n >= 20)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5092 { 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, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5093 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5094 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5095 else if (is_fixedstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5096 { if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5097 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5098 gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5099 fprintf(fd, ">");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5100 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5101 if (p->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5102 fprintf(fd, "%s", xstring(p->info.val.s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5103 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5104 gen_val(fd, n, p->info.typ, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5105 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5106 else if (p->info.typ->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5107 { i = ((Tnode*) p->info.typ->ref)->width;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5108 if (i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5109 { i = p->info.typ->width / i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5110 if (i > 4)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5111 i = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5112 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5113 if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5114 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5115 gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5116 fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "]\">", xsi_type_Tarray(p->info.typ), i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5117 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5118 gen_val(fd, n, p->info.typ, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5119 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5120 else if (is_dynamic_array(p->info.typ) && !is_binary(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5121 { if (!eflag && (has_ns(p->info.typ) || is_untyped(p->info.typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5122 { if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5123 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5124 gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5125 gen_atts(fd, n, (Table*)p->info.typ->ref, nsa);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5126 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5127 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5128 { d = get_Darraydims(p->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5129 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5130 { for (i = 0; i < d-1; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5131 { tmp[2*i] = ',';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5132 tmp[2*i+1] = '1';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5133 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5134 tmp[2*d-2] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5135 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5136 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5137 *tmp = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5138 if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5139 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5140 gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5141 if (((Table*)p->info.typ->ref)->list->info.minOccurs > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5142 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5143 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5144 fprintf(fd, " SOAP-ENC:arrayType=\"%s[1%s]\">", wsdl_type(((Table*)p->info.typ->ref)->list->info.typ, ""), tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5145 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5146 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5147 gen_val(fd, n, p->info.typ, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5148 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5149 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5150 { if (!eflag && (has_ns((Tnode*)p->info.typ->ref) || is_untyped((Tnode*)p->info.typ->ref)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5151 { if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5152 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5153 gen_element_begin(fd, n, ns_add(p, nse), xsi_type((Tnode*)p->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5154 gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5155 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5156 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5157 { d = get_Darraydims((Tnode*)p->info.typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5158 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5159 { for (i = 0; i < d-1; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5160 { tmp[2*i] = ',';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5161 tmp[2*i+1] = '1';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5162 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5163 tmp[2*d-2] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5164 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5165 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5166 *tmp = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5167 if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5168 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5169 gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5170 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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5171 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5172 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5173 fprintf(fd, " SOAP-ENC:arrayType=\"%s[1%s]\">", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5174 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5175 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5176 gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5177 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5178 else if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5179 { /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5180 if (!is_primclass(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5181 { char *nse1 = ns_qualifiedElement(p->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5182 char *nsa1 = ns_qualifiedAttribute(p->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5183 if (nse1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5184 nse = nse1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5185 if (nsa1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5186 nsa = nsa1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5187 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5188 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5189 if (!is_invisible(p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5190 { if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5191 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5192 gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5193 gen_atts(fd, n, (Table*)p->info.typ->ref, nsa);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5194 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5195 else if (is_anyType(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5196 fprintf(fd, "%*s<!-- extensibility element(s) -->\n", n, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5197 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5198 else if ((p->info.typ->type == Tpointer || p->info.typ->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5199 && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5200 { /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5201 if (!is_primclass(p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5202 { char *nse1 = ns_qualifiedElement(p->info.typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5203 char *nsa1 = ns_qualifiedAttribute(p->info.typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5204 if (nse1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5205 nse = nse1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5206 if (nsa1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5207 nsa = nsa1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5208 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5209 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5210 if (!is_invisible(p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5211 { if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5212 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5213 gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5214 gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5215 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5216 else if (is_anyType(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5217 fprintf(fd, "%*s<!-- extensibility element(s) -->\n", n, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5218 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5219 else if (p->info.typ->type != Tunion)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5220 { if (!is_invisible(p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5221 { if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5222 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5223 gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5224 if (p->info.typ->type == Ttemplate)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5225 { if (((Tnode*)p->info.typ->ref)->type == Tpointer
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5226 && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5227 || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5228 gen_atts(fd, n, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nsa);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5229 else if (((Tnode*)p->info.typ->ref)->type == Tclass
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5230 || ((Tnode*)p->info.typ->ref)->type == Tstruct)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5231 gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5232 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5233 fprintf(fd, ">");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5234 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5235 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5236 fprintf(fd, ">");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5237 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5238 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5239 switch (p->info.typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5240 { case Tchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5241 case Tshort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5242 case Tint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5243 case Tlong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5244 case Tllong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5245 case Tuchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5246 case Tushort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5247 case Tuint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5248 case Tulong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5249 case Tullong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5250 if (p->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5251 fprintf(fd, SOAP_LONG_FORMAT, p->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5252 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5253 fprintf(fd, "0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5254 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5255 case Tfloat:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5256 case Tdouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5257 case Tldouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5258 if (p->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5259 fprintf(fd, "%g", p->info.val.r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5260 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5261 fprintf(fd, "0.0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5262 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5263 case Ttime:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5264 { char tmp[256];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5265 time_t t = time(NULL), *p = &t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5266 strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5267 fprintf(fd, "%s", tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5268 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5269 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5270 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5271 if (p->info.hasval && p->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5272 { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5273 if (p->info.val.i == q->info.val.i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5274 { fprintf(fd, "%s", ns_remove2(q->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5275 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5276 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5277 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5278 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5279 gen_val(fd, n+1, p->info.typ, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5280 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5281 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5282 case Treference:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5283 if (is_string(p->info.typ) || is_wstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5284 { if (p->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5285 fprintf(fd, "%s", xstring(p->info.val.s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5286 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5287 gen_val(fd, n, p->info.typ, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5288 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5289 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5290 gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5291 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5292 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5293 if (is_stdstr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5294 { if (p->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5295 fprintf(fd, "%s", xstring(p->info.val.s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5296 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5297 gen_val(fd, n, p->info.typ, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5298 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5299 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5300 case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5301 if (!is_dynamic_array(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5302 gen_val(fd, n, p->info.typ, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5303 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5304 case Tunion:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5305 gen_val(fd, n, p->info.typ, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5306 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5307 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5308 i = p->info.maxOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5309 if (i <= 1 || i > 4)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5310 i = p->info.minOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5311 if (i <= 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5312 i = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5313 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5314 { /* a bit of a hack, I don't like the copy of the code above */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5315 { gen_val(fd, n, p->info.typ, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5316 if (i > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5317 { gen_element_end(fd, 0, ns_add(p, nse));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5318 if (!is_invisible(p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5319 { if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5320 fprintf(fd, "%*s<!-- %s -->\n", n, "", c_type_id(p->info.typ, p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5321 gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5322 if (p->info.typ->type == Ttemplate)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5323 { if (((Tnode*)p->info.typ->ref)->type == Tpointer
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5324 && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5325 || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5326 gen_atts(fd, n, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nsa);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5327 else if (((Tnode*)p->info.typ->ref)->type == Tclass
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5328 || ((Tnode*)p->info.typ->ref)->type == Tstruct)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5329 gen_atts(fd, n, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5330 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5331 fprintf(fd, ">");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5332 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5333 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5334 fprintf(fd, ">");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5335 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5336 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5337 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5338 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5339 } while (--i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5340 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5341 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5342 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5343 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5344 if (p->info.typ->type != Tunion)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5345 gen_element_end(fd, 0, ns_add(p, nse));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5346 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5347 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5348 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5349 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5350
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5351 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5352 gen_atts(FILE *fd, int n, Table *t, char *nsa)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5353 { static unsigned long idnum = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5354 Entry *q, *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5355 Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5356 int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5357 for (; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5358 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5359 for (q = t->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5360 { if (q->info.sto & Sattribute && !is_invisible(q->sym->name) && q->info.maxOccurs != 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5361 { fprintf(fd, " %s=\"", ns_add(q, nsa));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5362 if ((q->info.typ->type == Tpointer || q->info.typ->type == Treference) && !is_string(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5363 p = (Tnode*)q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5364 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5365 p = q->info.typ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5366 if (is_eq(q->sym->name, "id"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5367 fprintf(fd, "%lu", ++idnum); /* id="#" should be unique */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5368 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5369 switch (p->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5370 { case Tchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5371 case Tshort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5372 case Tint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5373 case Tuchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5374 case Tushort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5375 case Tuint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5376 case Tlong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5377 case Tulong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5378 case Tllong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5379 case Tullong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5380 if (q->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5381 fprintf(fd, SOAP_LONG_FORMAT, q->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5382 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5383 fprintf(fd, "0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5384 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5385 case Tfloat:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5386 case Tdouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5387 case Tldouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5388 if (q->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5389 fprintf(fd, "%g", q->info.val.r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5390 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5391 fprintf(fd, "0.0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5392 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5393 case Ttime:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5394 { char tmp[256];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5395 time_t T = time(NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5396 strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5397 fprintf(fd, "%s", tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5398 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5399 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5400 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5401 if (q->info.hasval && p->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5402 { for (r = ((Table*)p->ref)->list; r; r = r->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5403 { if (r->info.val.i == q->info.val.i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5404 { fprintf(fd, "%s", ns_remove2(r->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5405 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5406 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5407 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5408 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5409 else if (p->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5410 fprintf(fd, "%s", ns_remove2((((Table*)p->ref)->list)->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5411 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5412 fprintf(fd, "0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5413 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5414 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5415 case Treference:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5416 if (is_string(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5417 { if (q->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5418 fprintf(fd, "%s", xstring(q->info.val.s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5419 else if (q->info.typ->minLength > 0 && q->info.typ->minLength < 10000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5420 for (i = 0; i < (int)q->info.typ->minLength; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5421 fprintf(fd, "X");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5422 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5423 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5424 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5425 if (is_stdstr(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5426 { if (q->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5427 fprintf(fd, "%s", xstring(q->info.val.s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5428 else if (q->info.typ->minLength > 0 && q->info.typ->minLength < 10000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5429 for (i = 0; i < (int)q->info.typ->minLength; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5430 fprintf(fd, "X");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5431 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5432 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5433 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5434 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5435 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5436 if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5437 fprintf(fd, " // %s //", c_type_id(q->info.typ, q->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5438 fprintf(fd, "\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5439 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5440 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5441 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5442 fprintf(fd, ">");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5443 fflush(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5444 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5445
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5446 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5447 gen_val(FILE *fd, int n, Tnode *p, char *nse, char *nsa, char *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5448 { Entry *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5449 LONG64 i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5450 if (!is_transient(p) && p->type != Tfun && !is_XML(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5451 { if (is_fixedstring(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5452 { for (i = 0; i < p->width / ((Tnode*)p->ref)->width - 1; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5453 fprintf(fd, "X");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5454 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5455 else if (p->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5456 { i = ((Tnode*) p->ref)->width;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5457 if (i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5458 { i = p->width / i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5459 if (i > 4)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5460 i = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5461 fprintf(fd, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5462 for (; i > 0; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5463 { fprintf(fd, "%*s<item>", n+1, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5464 gen_val(fd, n+1, (Tnode*)p->ref, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5465 fprintf(fd, "</item>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5466 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5467 fprintf(fd, "%*s", n, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5468 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5469 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5470 else if (is_dynamic_array(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5471 { if (!is_binary(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5472 { Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5473 fprintf(fd, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5474 for (t = (Table*)p->ref; t && !t->list; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5475 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5476 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5477 gen_field(fd, n+1, t->list, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5478 fprintf(fd, "%*s", n, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5479 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5480 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5481 switch (p->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5482 { case Tchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5483 case Tshort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5484 case Tint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5485 case Tlong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5486 case Tllong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5487 case Tuchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5488 case Tushort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5489 case Tuint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5490 case Tulong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5491 case Tullong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5492 fprintf(fd, "0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5493 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5494 case Tfloat:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5495 case Tdouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5496 case Tldouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5497 fprintf(fd, "0.0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5498 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5499 case Ttime:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5500 { char tmp[256];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5501 time_t T = time(NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5502 strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5503 fprintf(fd, "%s", tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5504 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5505 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5506 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5507 if (p->ref && (q = ((Table*)p->ref)->list))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5508 fprintf(fd, "%s", ns_remove2(q->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5509 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5510 fprintf(fd, "0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5511 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5512 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5513 case Treference:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5514 if (is_string(p) || is_wstring(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5515 { if (p->minLength > 0 && p->minLength < 10000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5516 for (i = 0; i < (int)p->minLength; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5517 fprintf(fd, "X");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5518 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5519 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5520 gen_val(fd, n, (Tnode*)p->ref, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5521 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5522 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5523 case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5524 nse = ns_qualifiedElement(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5525 nsa = ns_qualifiedAttribute(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5526 if (is_stdstr(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5527 { if (p->minLength > 0 && p->minLength < 10000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5528 for (i = 0; i < (int)p->minLength; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5529 fprintf(fd, "X");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5530 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5531 else if (is_primclass(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5532 { Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5533 for (t = (Table*)p->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5534 { Entry *r = entry(classtable, t->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5535 r = t->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5536 if (r && is_item(r))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5537 { gen_val(fd, n, r->info.typ, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5538 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5539 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5540 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5541 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5542 else if (!is_dynamic_array(p) && p->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5543 { Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5544 fprintf(fd, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5545 for (t = (Table*)p->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5546 { for (q = t->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5547 { if (is_repetition(q))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5548 { i = q->info.maxOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5549 if (i <= 1 || i > 4)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5550 i = q->info.minOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5551 if (i <= 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5552 i = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5553 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5554 gen_field(fd, n+1, q->next, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5555 while (--i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5556 q = q->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5557 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5558 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5559 gen_field(fd, n+1, q, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5560 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5561 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5562 fprintf(fd, "%*s", n, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5563 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5564 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5565 case Tunion:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5566 if (((Table*)p->ref)->list)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5567 gen_field(fd, n, ((Table*)p->ref)->list, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5568 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5569 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5570 gen_val(fd, n, (Tnode*)p->ref, nse, nsa, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5571 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5572 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5573 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5574 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5575 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5576 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5577
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5578 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5579 gen_header(FILE *fd, char *method, int response, char *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5580 { if (custom_header)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5581 { Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5582 Method *m = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5583 Entry *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5584 Table *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5585 if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5586 { if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5587 fprintf(fd, " <!-- struct SOAP_ENV__Header -->\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5588 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5589 fprintf(fd, " <!-- SOAP_ENV__Header *soap::header -->\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5590 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5591 fprintf(fd, " <SOAP-ENV:Header>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5592 q = entry(classtable, lookup("SOAP_ENV__Header"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5593 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5594 { r = (Table*)q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5595 if (r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5596 { for (q = r->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5597 { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5598 { for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5599 for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5600 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))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5601 { gen_field(fd, 2, q, NULL, NULL, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5602 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5603 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5604 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5605 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5606 fprintf(fd, " </SOAP-ENV:Header>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5607 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5608 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5609 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5610 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5611
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5612 FILE *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5613 gen_env(char *buf, char *method, int response, Table *t, char *ns, char *name, char *URL, char *executable, char *URI, char *encoding, int soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5614 { char tmp[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5615 FILE *fd;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5616 strcpy(tmp, buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5617 if (!soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5618 strcat(tmp, "REST.");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5619 #ifdef __vms
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5620 if (!response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5621 { sprintf(strrchr(tmp, '.'), "_%s_req.xml", method);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5622 fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5623 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5624 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5625 { sprintf(strrchr(tmp, '.'), "_%s_res.xml", method);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5626 fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5627 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5628 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5629 strcpy(strrchr(tmp, '.')+1, method);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5630 if (!response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5631 { strcat(tmp, ".req.xml");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5632 fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5633 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5634 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5635 { strcat(tmp, ".res.xml");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5636 fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5637 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5638 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5639 fd = fopen(tmp, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5640 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5641 execerror("Cannot write XML file");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5642 fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5643 if (soap && vflag >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5644 { fprintf(fd, "<SOAP-ENV:Envelope");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5645 gen_xmlns(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5646 fprintf(fd, ">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5647 gen_header(fd, method, response, encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5648 fprintf(fd, " <SOAP-ENV:Body");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5649 if (eflag && !encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5650 fprintf(fd, " SOAP-ENV:encodingStyle=\"%s\"", encURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5651 else if (encoding && !*encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5652 fprintf(fd, " SOAP-ENV:encodingStyle=\"%s\"", encURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5653 else if (encoding && strcmp(encoding, "literal"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5654 fprintf(fd, " SOAP-ENV:encodingStyle=\"%s\"", encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5655 fprintf(fd, ">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5656 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5657 return fd;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5658 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5659
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5660 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5661 gen_xmlns(FILE *fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5662 { Symbol *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5663 Service *sp = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5664 for (s = nslist; s; s = s->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5665 { for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5666 if (!tagcmp(sp->ns, s->name) && sp->URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5667 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5668 if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5669 fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp->URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5670 else if (!strcmp(s->name, "SOAP-ENV"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5671 { if (vflag >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5672 fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5673 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5674 else if (!strcmp(s->name, "SOAP-ENC"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5675 { if (vflag >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5676 fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5677 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5678 else if (!strcmp(s->name, "xsi"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5679 fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5680 else if (!strcmp(s->name, "xsd"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5681 fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5682 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5683 fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5684 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5685 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5686
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5687 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5688 emalloc(size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5689 { char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5690 if ((p = (char*)malloc(n)) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5691 execerror("out of memory");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5692 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5693 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5694
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5695 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5696 soap_serve(Table *table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5697 { Entry *method, *catch_method = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5698 char *catch_action = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5699 if (!Cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5700 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5701 fprintf(fserver,"\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5702 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5703 fprintf(fserver,"extern \"C\" ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5704 fprintf(fserver,"SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap *soap)", nflag?prefix:"soap");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5705
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5706 fprintf(fserver,"\n{\n#ifndef WITH_FASTCGI\n\tunsigned int k = soap->max_keep_alive;\n#endif\n\tdo\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5707 fprintf(fserver,"\n#ifndef WITH_FASTCGI\n\t\tif (soap->max_keep_alive > 0 && !--k)\n\t\t\tsoap->keep_alive = 0;\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5708 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5709 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5710 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");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5711 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5712 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");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5713 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");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5714
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5715 fprintf(fserver,"\n\treturn SOAP_OK;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5716 fprintf(fserver,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5717
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5718 fprintf(fserver,"\n\n#ifndef WITH_NOSERVEREQUEST\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5719 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5720 fprintf(fserver,"extern \"C\" ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5721 fprintf(fserver,"SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap *soap)\n{", nflag?prefix:"soap");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5722 fprintf(fserver, "\n\tsoap_peek_element(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5723 for (method = table->list; method; method = method->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5724 { char *action = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5725 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5726 { if (aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5727 { Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5728 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5729 { if (has_ns_eq(sp->ns, method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5730 { Method *m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5731 for (m = sp->list; m; m = m->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5732 { if (is_eq_nons(m->name, method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5733 { if (m->mess == ACTION || m->mess == REQUEST_ACTION)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5734 action = m->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5735 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5736 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5737 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5738 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5739 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5740 if (is_invisible(method->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5741 { Entry *param = entry(classtable, method->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5742 if (param)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5743 param = ((Table*)param->info.typ->ref)->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5744 if (action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5745 { if (*action == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5746 { fprintf(fserver, "\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5747 if (param && !Aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5748 fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5749 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5750 { catch_method = method;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5751 catch_action = action;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5752 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5753 fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5754 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5755 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5756 { fprintf(fserver, "\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5757 if (param && !Aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5758 fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5759 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5760 { catch_method = method;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5761 catch_action = action;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5762 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5763 fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5764 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5765 fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5766 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5767 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5768 { if (Aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5769 compliancewarn("Option -A requires a SOAPAction where none is defined");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5770 if (param)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5771 { fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\")", ns_convert(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5772 fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5773 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5774 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5775 { catch_method = method;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5776 catch_action = action;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5777 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5778 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5779 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5780 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5781 { if (action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5782 { if (*action == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5783 { fprintf(fserver, "\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5784 if (!Aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5785 fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5786 fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5787 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5788 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5789 { fprintf(fserver, "\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5790 if (!Aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5791 fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5792 fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5793 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5794 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5795 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5796 { if (Aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5797 compliancewarn("Option -A requires a SOAPAction where none is defined");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5798 fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\")", ns_convert(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5799 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5800 fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5801 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5802 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5803 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5804 if (catch_method)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5805 { if (Aflag && catch_action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5806 { if (*catch_action == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5807 { fprintf(fserver, "\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5808 fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", catch_action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5809 fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(catch_method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5810 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5811 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5812 { fprintf(fserver, "\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5813 fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", catch_action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5814 fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(catch_method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5815 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5816 fprintf(fserver,"\n\treturn soap->error = SOAP_NO_METHOD;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5817 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5818 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5819 fprintf(fserver, "\n\treturn soap_serve_%s(soap);", ident(catch_method->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5820 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5821 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5822 fprintf(fserver,"\n\treturn soap->error = SOAP_NO_METHOD;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5823
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5824 fprintf(fserver,"\n}\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5825
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5826 banner(fheader, "Server-Side Operations");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5827 for (method = table->list; method; method = method->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5828 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5829 generate_proto(table, method);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5830
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5831 banner(fheader, "Server-Side Skeletons to Invoke Service Operations");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5832 fprintf(fheader, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5833 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5834 fprintf(fheader,"extern \"C\" ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5835 fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap*);", nflag?prefix:"soap");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5836 fprintf(fheader, "\n\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5837 if (!cflag && !namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5838 fprintf(fheader,"extern \"C\" ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5839 fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap*);", nflag?prefix:"soap");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5840 for (method = table->list; method; method = method->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5841 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5842 gen_serve_method(fserver, table, method, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5843
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5844 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5845
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5846 if (!Sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5847 { banner(fheader, "Client-Side Call Stubs");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5848 for (method = table->list; method; method = method->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5849 if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5850 gen_call_method(fclient, table, method, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5851 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5852
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5853 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5854
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5855 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5856 generate_proto(Table *table, Entry *param)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5857 { Entry *q, *pout;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5858 Table *output;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5859 q = entry(table, param->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5860 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5861 pout = (Entry*)q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5862 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5863 { fprintf(stderr, "Internal error: no table entry\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5864 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5865 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5866 q = entry(classtable, param->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5867 output = (Table*)q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5868 fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(param->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5869 gen_params(fheader, output, pout, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5870 fprintf(fheader, ";");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5871 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5872
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5873 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5874 tagcmp(const char *s, const char *t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5875 { size_t i, n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5876 n = strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5877 for (i = 0; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5878 { int c = t[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5879 if (c == '_' && s[i] != '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5880 c = '-';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5881 if (s[i] > c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5882 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5883 if (s[i] < c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5884 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5885 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5886 return -(t[i] != 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5887 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5888
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5889 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5890 tagncmp(const char *s, const char *t, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5891 { size_t i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5892 for (i = 0; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5893 { int c = t[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5894 if (c == '_' && s[i] != '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5895 c = '-';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5896 if (s[i] > c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5897 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5898 if (s[i] < c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5899 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5900 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5901 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5902 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5903
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5904 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5905 is_qname(Tnode *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5906 { if (p->sym && is_string(p) && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5907 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5908 return p->id && is_string(p) && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5909 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5910
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5911 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5912 is_stdqname(Tnode *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5913 { if (p->sym && p->type == Tclass && is_volatile(p) && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5914 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5915 return p->id && p->type == Tclass && is_volatile(p) && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5916 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5917
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5918 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5919 is_XML(Tnode *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5920 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5921 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5922
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5923 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5924 is_stdXML(Tnode *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5925 { return p->sym && (is_stdstring(p) || is_stdwstring(p)) && is_eq(p->sym->name, "XML");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5926 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5927
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5928 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5929 is_response(Tnode *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5930 { return (p->type == Tpointer || p->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5931 && p->ref
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5932 && has_ns((Tnode*)p->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5933 && ((((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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5934 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5935
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5936 Entry*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5937 get_response(Tnode *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5938 { if (p->type == Tfun)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5939 return p->response;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5940 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5941 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5942
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5943 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5944 is_unmatched(Symbol *sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5945 { return sym->name[0] == '_'
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5946 && sym->name[1] != '_'
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5947 && strncmp(sym->name, "_DOT", 4)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5948 && strncmp(sym->name, "_USCORE", 7)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5949 && (strncmp(sym->name, "_x", 2) || !isxdigit(sym->name[2]) || !isxdigit(sym->name[3]) || !isxdigit(sym->name[4]) || !isxdigit(sym->name[5]));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5950 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5951
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5952 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5953 is_invisible(const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5954 { return name[0] == '-' || (name[0] == '_' && name[1] == '_' && strncmp(name, "__ptr", 5));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5955 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5956
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5957 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5958 is_invisible_empty(Tnode *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5959 { if (p->type == Tstruct || p->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5960 if (is_invisible(p->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5961 if (!p->ref || !((Table*)p->ref)->list)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5962 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5963 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5964 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5965
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5966 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5967 is_element(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5968 { if (is_XML(typ) || is_stdXML(typ) || is_qname(typ) || is_stdqname(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5969 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5970 if (typ->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5971 return is_unmatched(typ->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5972 if (typ->type == Tstruct || typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5973 return is_unmatched(typ->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5974 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5975 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5976
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5977 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5978 is_untyped(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5979 { Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5980 if (typ->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5981 return is_unmatched(typ->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5982 if (typ->type == Tpointer || typ->type == Treference || typ->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5983 return is_untyped((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5984 if (typ->type == Tstruct || typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5985 { if (is_dynamic_array(typ) && !has_ns(typ) && !is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5986 { p = (Tnode*)((Table*)typ->ref)->list->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5987 return is_untyped(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5988 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5989 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5990 return is_unmatched(typ->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5991 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5992 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5993 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5994
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5995 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5996 is_primclass(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5997 { Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5998 if (typ->type == Tstruct || typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5999 { if (!is_dynamic_array(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6000 { t = (Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6001 while (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6002 { if (t->list && is_item(t->list))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6003 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6004 t = t->prev;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6005 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6006 if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6007 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6008 t = (Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6009 while (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6010 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6011 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6012 if (!is_item(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6013 if (p->info.typ->type != Tfun && !is_transient(p->info.typ) && p->info.sto != Sattribute && p->info.sto != Sprivate && p->info.sto != Sprotected)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6014 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6015 t = t->prev;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6016 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6017 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6018 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6019 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6020 else if (typ->type == Tpointer || typ->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6021 return is_primclass((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6022 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6023 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6024
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6025 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6026 is_mask(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6027 { return (typ->type == Tenum && typ->width == 8);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6028 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6029
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6030 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6031 is_void(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6032 { if (!typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6033 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6034 if (typ->type == Tvoid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6035 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6036 if (typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6037 return is_void((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6038 if (typ->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6039 return is_void((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6040 if (typ->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6041 return is_void((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6042 if (typ->type == Ttemplate)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6043 return is_void((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6044 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6045 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6046
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6047 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6048 is_transient(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6049 { if (!typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6050 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6051 if (typ->type == Tstruct && typ->id == lookup("soap"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6052 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6053 if (is_external(typ) || is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6054 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6055 if (typ->transient > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6056 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6057 switch (typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6058 { case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6059 case Treference:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6060 case Tarray:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6061 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6062 return is_transient((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6063 case Tnone:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6064 case Tvoid:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6065 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6066 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6067 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6068 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6069 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6070 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6071
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6072 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6073 is_imported(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6074 { return typ->imported != NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6075 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6076
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6077 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6078 is_external(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6079 { return typ->transient == -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6080 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6081
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6082 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6083 is_anyType(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6084 { if (typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6085 return is_anyType((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6086 return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_element");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6087 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6088
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6089 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6090 is_anyAttribute(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6091 { if (typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6092 return is_anyAttribute((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6093 return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_attribute");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6094 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6095
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6096 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6097 is_volatile(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6098 { return typ->transient == -2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6099 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6100
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6101 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6102 is_template(Tnode *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6103 { if (p->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6104 return is_template((Tnode*)p->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6105 return p->type == Ttemplate;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6106 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6107
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6108 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6109 is_repetition(Entry *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6110 { if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6111 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6112 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6113 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6114
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6115 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6116 is_item(Entry *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6117 { if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6118 return !strcmp(p->sym->name, "__item");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6119 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6120 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6121
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6122 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6123 is_self(Entry *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6124 { if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6125 return !strcmp(p->sym->name, "__self");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6126 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6127 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6128
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6129 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6130 is_choice(Entry *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6131 { if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6132 if (p->next && p->next->info.typ->type == Tunion && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__union", 7)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6133 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6134 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6135 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6136
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6137 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6138 is_sequence(Entry *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6139 { if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6140 { Tnode *q = p->info.typ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6141 if (q->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6142 q = (Tnode*)q->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6143 if (q->type == Tstruct && is_invisible(p->sym->name) && is_invisible(q->id->name) && !is_transient(q))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6144 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6145 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6146 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6147 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6148
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6149
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6150 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6151 is_anytype(Entry *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6152 { if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6153 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6154 { is_anytype_flag = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6155 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6156 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6157 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6158 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6159
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6160 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6161 is_keyword(const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6162 { Symbol *s = lookup(name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6163 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6164 return s->token != ID;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6165 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6166 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6167
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6168
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6169 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6170 has_ptr(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6171 { Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6172 if (typ->type == Tpointer || typ->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6173 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6174 for (p = Tptr[Tpointer]; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6175 if ((Tnode*)p->ref == typ && p->transient != 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6176 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6177 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6178 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6179
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6180 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6181 has_detail_string(void)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6182 { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6183 if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6184 { Entry *e = entry((Table*)p->info.typ->ref, lookup("detail"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6185 if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6186 { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6187 return e2 && is_string(e2->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6188 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6189 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6190 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6191 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6192
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6193 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6194 has_Detail_string(void)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6195 { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6196 if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6197 { Entry *e = entry((Table*)p->info.typ->ref, lookup("SOAP_ENV__Detail"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6198 if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6199 { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6200 return e2 && is_string(e2->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6201 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6202 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6203 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6204 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6205
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6206 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6207 has_class(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6208 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6209 if (typ->type == Tstruct && typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6210 { for (p = ((Table*)typ->ref)->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6211 { if (p->info.sto & Stypedef)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6212 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6213 if (p->info.typ->type == Tclass || p->info.typ->type == Ttemplate)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6214 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6215 if (p->info.typ->type == Tstruct && has_class(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6216 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6217 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6218 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6219 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6220 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6221
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6222 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6223 has_external(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6224 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6225 if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6226 { for (p = ((Table*)typ->ref)->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6227 { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6228 { if (is_external(p->info.typ) || has_external(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6229 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6230 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6231 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6232 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6233 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6234 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6235
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6236 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6237 has_volatile(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6238 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6239 if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6240 { for (p = ((Table*)typ->ref)->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6241 { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6242 { if (is_volatile(p->info.typ) || has_volatile(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6243 if (!is_stdstr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6244 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6245 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6246 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6247 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6248 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6249 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6250
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6251 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6252 has_ns(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6253 { if (typ->type == Tstruct || typ->type == Tclass || typ->type == Tenum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6254 return has_ns_eq(NULL, typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6255 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6256 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6257
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6258 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6259 has_ns_t(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6260 { char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6261 if (typ->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6262 { s = strstr(typ->sym->name + 1, "__");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6263 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6264 { s = strchr(typ->sym->name, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6265 if (s && s[1] == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6266 s = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6267 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6268 return s && s[1] && s[2] && (s[2] != '_'
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6269 || (s[2] == '_' && s[3] == 'x' && isxdigit(s[4]) && isxdigit(s[5]) && isxdigit(s[6]) && isxdigit(s[7]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6270 || !strncmp(s+2, "_DOT", 4)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6271 || !strncmp(s+2, "_USCORE", 7));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6272 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6273 return has_ns(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6274 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6275
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6276 /* needs_lang adds xml:lang attribute to matching struct/class member name
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6277 we should use an annotation for soapcpp2's input this in the future instead
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6278 of a hard-coded member name */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6279 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6280 needs_lang(Entry *e)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6281 { if (!strcmp(e->sym->name, "SOAP_ENV__Text"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6282 fprintf(fout, "\n\tif (soap->lang)\n\t\tsoap_set_attr(soap, \"xml:lang\", soap->lang, 1);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6283 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6284
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6285 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6286 is_eq_nons(const char *s, const char *t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6287 { size_t n, m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6288 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6289 while (*s == '_' || *s == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6290 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6291 while (*t == '_' || *t == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6292 t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6293 if (!*s || !*t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6294 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6295 r = strstr(t, "__");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6296 if (r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6297 t = r + 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6298 n = strlen(s) - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6299 m = strlen(t) - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6300 #ifdef SOAP_OLD_DIRECTIVE_NAME_MATCHING
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6301 while (n > 0 && s[n] == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6302 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6303 while (m > 0 && t[m] == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6304 m--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6305 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6306 if (n != m)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6307 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6308 return !strncmp(s, t, n + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6309 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6310
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6311 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6312 is_eq(const char *s, const char *t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6313 { size_t n, m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6314 while (*s == '_' || *s == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6315 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6316 while (*t == '_' || *t == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6317 t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6318 if (!*s || !*t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6319 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6320 for (n = strlen(s) - 1; n && s[n] == '_'; n--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6321 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6322 for (m = strlen(t) - 1; m && t[m] == '_'; m--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6323 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6324 if (n != m)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6325 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6326 return !strncmp(s, t, n + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6327 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6328
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6329 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6330 has_ns_eq(char *ns, char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6331 { size_t n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6332 while (*s == '_' || *s == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6333 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6334 if (!ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6335 { char *t = strstr(s + 1, "__");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6336 if (!t
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6337 || (t[2] == 'x' && isxdigit(t[3]) && isxdigit(t[4]) && isxdigit(t[5]) && isxdigit(t[6]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6338 || !strncmp(t+2, "DOT", 3)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6339 || !strncmp(t+2, "USCORE", 6))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6340 { t = strchr(s, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6341 if (t && t[1] == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6342 t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6343 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6344 return t && t[1] && t[2] && t[2] != '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6345 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6346 if ((n = strlen(ns)) < strlen(s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6347 return ((s[n] == '_' && s[n+1] == '_') || (s[n] == ':' && s[n+1] != ':')) && !tagncmp(ns, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6348 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6349 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6350
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6351 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6352 strict_check(void)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6353 { if (sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6354 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6355 return "(soap->mode & SOAP_XML_STRICT) && ";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6356 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6357
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6358 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6359 ns_of(char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6360 { Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6361 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6362 if (has_ns_eq(sp->ns, name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6363 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6364 if (sp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6365 return sp->URI;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6366 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6367 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6368
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6369 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6370 eq_ns(char *s, char *t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6371 { return ns_of(s) == ns_of(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6372 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6373
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6374 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6375 prefix_of(char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6376 { char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6377 while (*s == '_' || *s == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6378 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6379 t = strstr(s + 1, "__");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6380 if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6381 { t = strchr(s, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6382 if (t && t[1] == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6383 t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6384 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6385 if (t && t[1] && t[2] && t[2] != '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6386 { char *r = (char*)emalloc(t - s + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6387 strncpy(r, s, t - s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6388 r[t - s] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6389 return r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6390 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6391 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6392 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6393
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6394 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6395 ns_add_overridden(Table *t, Entry *p, char *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6396 { Entry *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6397 Symbol *s = t->sym;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6398 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6399 { do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6400 { for (q = t->list; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6401 if (!strcmp(q->sym->name, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6402 return ns_add(p, ns ? prefix_of(t->sym->name) : NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6403 } while ((t = t->prev) != NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6404 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6405 return ns_add(p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6406 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6407
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6408
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6409 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6410 c_ident(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6411 { if (typ->sym && strcmp(typ->sym->name, "/*?*/"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6412 return res_remove(typ->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6413 return t_ident(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6414 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6415
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6416 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6417 soap_type(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6418 { char *s, *t = c_ident(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6419 if (namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6420 { s = (char*)emalloc(strlen(t) + strlen(namespaceid) + 12);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6421 strcpy(s, "SOAP_TYPE_");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6422 strcat(s, namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6423 strcat(s, "_");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6424 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6425 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6426 { s = (char*)emalloc(strlen(t) + 11);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6427 strcpy(s, "SOAP_TYPE_");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6428 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6429 strcat(s, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6430 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6431 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6432
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6433 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6434 ident(char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6435 { char *s = strrchr(name, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6436 if (s && *(s+1) && *(s-1) != ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6437 return s+1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6438 return name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6439 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6440
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6441 /*t_ident gives the name of a type in identifier format*/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6442 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6443 t_ident(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6444 { char *p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6445 switch(typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6446 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6447 case Tnone:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6448 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6449 case Tvoid:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6450 return "void";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6451 case Tchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6452 return "byte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6453 case Twchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6454 return "wchar";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6455 case Tshort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6456 return "short";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6457 case Tint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6458 return "int";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6459 case Tlong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6460 return "long";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6461 case Tllong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6462 return "LONG64";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6463 case Tfloat:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6464 return "float";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6465 case Tdouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6466 return "double";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6467 case Tldouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6468 return "decimal";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6469 case Tuchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6470 return "unsignedByte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6471 case Tushort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6472 return "unsignedShort";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6473 case Tuint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6474 return "unsignedInt";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6475 case Tulong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6476 return "unsignedLong";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6477 case Tullong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6478 return "unsignedLONG64";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6479 case Ttime:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6480 return "time";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6481 case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6482 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6483 case Tunion:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6484 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6485 if ((Table*)typ->ref == booltable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6486 return "bool";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6487 return res_remove(typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6488 case Treference:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6489 return c_ident((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6490 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6491 if (is_string(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6492 return "string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6493 if (is_wstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6494 return "wstring";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6495 p=(char*) emalloc((10+strlen(q = c_ident((Tnode*)typ->ref)))*sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6496 strcpy(p,"PointerTo");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6497 strcat(p,q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6498 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6499 case Tarray:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6500 p=(char*) emalloc((16+strlen(c_ident((Tnode*)typ->ref)))*sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6501 if (((Tnode*)typ->ref)->width)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6502 sprintf(p, "Array%dOf%s",typ->width / ((Tnode*) typ->ref)->width,c_ident(typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6503 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6504 sprintf(p, "ArrayOf%s", c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6505 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6506 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6507 if (typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6508 { p=(char*) emalloc((11+strlen(res_remove(typ->id->name))+strlen(q = c_ident((Tnode*)typ->ref)))*sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6509 strcpy(p, res_remove(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6510 strcat(p, "TemplateOf");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6511 strcat(p, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6512 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6513 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6514 case Tfun:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6515 return "Function";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6516 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6517 return "anyType";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6518 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6519
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6520 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6521 utf8(char **t, long c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6522 { if (c < 0x0080)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6523 *(*t)++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6524 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6525 { if (c < 0x0800)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6526 *(*t)++ = (char)(0xC0 | ((c >> 6) & 0x1F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6527 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6528 { if (c < 0x010000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6529 *(*t)++ = (char)(0xE0 | ((c >> 12) & 0x0F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6530 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6531 { if (c < 0x200000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6532 *(*t)++ = (char)(0xF0 | ((c >> 18) & 0x07));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6533 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6534 { if (c < 0x04000000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6535 *(*t)++ = (char)(0xF8 | ((c >> 24) & 0x03));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6536 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6537 { *(*t)++ = (char)(0xFC | ((c >> 30) & 0x01));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6538 *(*t)++ = (char)(0x80 | ((c >> 24) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6539 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6540 *(*t)++ = (char)(0x80 | ((c >> 18) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6541 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6542 *(*t)++ = (char)(0x80 | ((c >> 12) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6543 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6544 *(*t)++ = (char)(0x80 | ((c >> 6) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6545 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6546 *(*t)++ = (char)(0x80 | (c & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6547 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6548 *(*t) = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6549 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6550
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6551 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6552 ns_convert(char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6553 { char *t, *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6554 size_t i, n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6555 if (*tag == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6556 { if (!strncmp(tag, "__ptr", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6557 { if (tag[5])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6558 tag += 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6559 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6560 tag = "item";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6561 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6562 else if (strncmp(tag, "_DOT", 4)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6563 && strncmp(tag, "_USCORE", 7)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6564 && (strncmp(tag, "_x", 2) || !isxdigit(tag[2]) || !isxdigit(tag[3]) || !isxdigit(tag[4]) || !isxdigit(tag[5])))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6565 tag++; /* skip leading _ */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6566 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6567 for (n = strlen(tag); n > 0; n--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6568 { if (tag[n-1] != '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6569 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6570 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6571 s = t = (char*)emalloc(n+1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6572 for (i = 0; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6573 { if (tag[i] == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6574 { if (tag[i+1] == '_' && !(tag[i+2] == 'x' && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5]) && isxdigit(tag[i+6])))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6575 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6576 else if (!strncmp(tag+i, "_DOT", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6577 { *s++ = '.';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6578 i += 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6579 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6580 else if (!strncmp(tag+i, "_USCORE", 7))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6581 { *s++ = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6582 i += 6;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6583 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6584 else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6585 { char d[5];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6586 strncpy(d, tag+i+2, 4);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6587 d[4] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6588 utf8(&s, strtoul(d, NULL, 16));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6589 i += 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6590 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6591 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6592 *s++ = '-';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6593 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6594 else if (tag[i] == ':' && tag[i+1] == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6595 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6596 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6597 *s++ = tag[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6598 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6599 if (i < n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6600 { *s++ = ':';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6601 for (i += 2; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6602 { if (tag[i] == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6603 { if (!strncmp(tag+i, "_DOT", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6604 { *s++ = '.';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6605 i += 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6606 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6607 else if (!strncmp(tag+i, "_USCORE", 7))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6608 { *s++ = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6609 i += 6;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6610 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6611 else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6612 { char d[5];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6613 strncpy(d, tag+i+2, 4);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6614 d[4] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6615 utf8(&s, strtoul(d, NULL, 16));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6616 i += 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6617 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6618 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6619 *s++ = '-';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6620 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6621 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6622 *s++ = tag[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6623 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6624 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6625 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6626 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6627 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6628
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6629 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6630 res_remove(char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6631 { char *s, *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6632 if (!(s = strchr(tag, ':')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6633 return tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6634 if (s[1] != ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6635 tag = s + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6636 if (!strchr(tag, ':'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6637 return tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6638 s = emalloc(strlen(tag) + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6639 strcpy(s, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6640 while ((t = strchr(s, ':')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6641 *t = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6642 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6643 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6644
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6645 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6646 ns_qualifiedElement(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6647 { Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6648 char *s = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6649 if (typ->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6650 s = prefix_of(typ->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6651 if (!s && typ->id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6652 s = prefix_of(typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6653 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6654 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6655 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6656 { if (sp->elementForm && !tagcmp(sp->ns, s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6657 { if (!strcmp(sp->elementForm, "qualified"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6658 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6659 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6660 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6661 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6662 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6663 if (!tagcmp(sp->ns, s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6664 if (sp->style && !strcmp(sp->style, "document"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6665 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6666 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6667 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6668
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6669 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6670 ns_qualifiedAttribute(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6671 { Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6672 char *s = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6673 if (typ->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6674 s = prefix_of(typ->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6675 if (!s && typ->id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6676 s = prefix_of(typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6677 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6678 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6679 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6680 { if (sp->attributeForm && !tagcmp(sp->ns, s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6681 { if (!strcmp(sp->attributeForm, "qualified"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6682 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6683 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6684 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6685 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6686 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6687 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6688
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6689 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6690 field(Entry *p, char *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6691 { char *r, *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6692 if (is_self(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6693 return "tag";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6694 r = ns_add(p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6695 s = emalloc(strlen(r) + 3);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6696 strcpy(s, "\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6697 strcat(s, r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6698 strcat(s, "\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6699 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6700 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6701
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6702 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6703 field_overridden(Table *t, Entry *p, char *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6704 { char *r, *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6705 if (is_self(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6706 return "tag";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6707 r = ns_add_overridden(t, p, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6708 s = emalloc(strlen(r) + 3);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6709 strcpy(s, "\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6710 strcat(s, r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6711 strcat(s, "\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6712 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6713 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6714
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6715 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6716 ns_add(Entry *p, char *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6717 { if (p->tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6718 return ns_addx(p->tag, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6719 return ns_addx(p->sym->name, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6720 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6721
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6722 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6723 ns_addx(char *tag, char *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6724 { char *n, *t, *s = ns_convert(tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6725 if (*s == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6726 return s+1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6727 if (!ns || *s == '-' || (t = strchr(s, ':')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6728 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6729 n = ns_convert(ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6730 t = emalloc(strlen(n) + strlen(s) + 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6731 strcpy(t, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6732 strcat(t, ":");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6733 strcat(t, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6734 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6735 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6736
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6737 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6738 ns_name(char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6739 { char *t, *r, *s = tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6740 if (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6741 { for (r = s+strlen(s)-1; r > s; r--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6742 if (*r != '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6743 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6744 for (t = s + 1; t < r; t++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6745 { if (t[0] == '_' && t[1] == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6746 { s = t + 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6747 t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6748 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6749 else if (t[0] == ':' && t[1] != ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6750 { s = t + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6751 t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6752 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6753 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6754 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6755 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6756 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6757
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6758 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6759 ns_cname(char *tag, char *suffix)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6760 { char *s, *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6761 size_t i, n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6762 if (!tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6763 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6764 t = ns_name(tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6765 n = strlen(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6766 if (suffix)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6767 s = emalloc(n + strlen(suffix) + 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6768 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6769 s = emalloc(n + 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6770 for (i = 0; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6771 { if (!isalnum(t[i]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6772 s[i] = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6773 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6774 s[i] = t[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6775 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6776 s[i] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6777 if (suffix)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6778 strcat(s, suffix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6779 if (is_keyword(t))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6780 strcat(s, "_");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6781 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6782 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6783
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6784 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6785 ns_fname(char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6786 { char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6787 size_t i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6788 s = emalloc(strlen(tag) + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6789 strcpy(s, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6790 for (i = 0; s[i]; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6791 if (!isalnum(s[i]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6792 s[i] = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6793 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6794 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6795
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6796 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6797 ns_remove(char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6798 { return ns_convert(ns_name(tag));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6799 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6800
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6801 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6802 ns_remove1(char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6803 { char *t, *s = tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6804 int n = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6805 /* handle 'enum_xx__yy' generated by wsdl2h
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6806 if (!strncmp(s, "enum_", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6807 n = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6808 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6809 if (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6810 { for (t = s + 1; *t && n; t++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6811 if (t[0] == '_' && t[1] == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6812 { s = t + 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6813 t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6814 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6815 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6816 if (n || (s[0] == '_' && s[1] != 'x' && strncmp(s, "_USCORE", 7)) || !*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6817 s = tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6818 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6819 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6820 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6821
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6822 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6823 ns_remove2(char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6824 { return ns_convert(ns_remove1(tag));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6825 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6826
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6827 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6828 xsi_type_cond(Tnode *typ, int flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6829 { if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6830 return xsi_type(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6831 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6832 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6833
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6834 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6835 xsi_type_cond_u(Tnode *typ, int flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6836 { if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6837 return xsi_type_u(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6838 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6839 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6840
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6841 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6842 xsi_type_u(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6843 { Service *sp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6844 char *s = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6845 if (tflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6846 return xsi_type(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6847 if (typ->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6848 s = prefix_of(typ->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6849 if (!s && typ->id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6850 s = prefix_of(typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6851 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6852 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6853 s = xsi_type(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6854 for (sp = services; sp; sp = sp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6855 if (sp->xsi_type && has_ns_eq(sp->ns, s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6856 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6857 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6858 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6859
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6860 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6861 xsi_type(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6862 { if (!typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6863 return "NULL";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6864 if (is_dynamic_array(typ) && !has_ns(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6865 return xsi_type_Darray(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6866 if (typ->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6867 return xsi_type_Tarray(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6868 if (is_untyped(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6869 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6870 if (typ->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6871 { if (!strncmp(typ->sym->name, "SOAP_ENV__", 10))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6872 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6873 if (is_XML(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6874 return "xsd:anyType";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6875 if (typ->type != Ttemplate)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6876 return ns_convert(typ->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6877 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6878 if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6879 return "xsd:string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6880 switch(typ->type){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6881 case Tchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6882 return "xsd:byte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6883 case Twchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6884 return "wchar";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6885 case Tshort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6886 return "xsd:short";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6887 case Tint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6888 return "xsd:int";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6889 case Tlong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6890 case Tllong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6891 return "xsd:long";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6892 case Tfloat:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6893 return "xsd:float";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6894 case Tdouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6895 return "xsd:double";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6896 case Tldouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6897 return "xsd:decimal";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6898 case Tuchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6899 return "xsd:unsignedByte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6900 case Tushort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6901 return "xsd:unsignedShort";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6902 case Tuint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6903 return "xsd:unsignedInt";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6904 case Tulong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6905 case Tullong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6906 return "xsd:unsignedLong";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6907 case Ttime:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6908 return "xsd:dateTime";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6909 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6910 case Treference:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6911 return xsi_type((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6912 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6913 if ((Table*)typ->ref == booltable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6914 return "xsd:boolean";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6915 case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6916 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6917 if (!strncmp(typ->id->name, "SOAP_ENV__", 10))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6918 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6919 return ns_convert(typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6920 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6921 if ((Tnode*)typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6922 return xsi_type((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6923 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6924 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6925 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6926 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6927 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6928 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6929
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6930 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6931 xml_tag(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6932 { if (!typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6933 return "NULL";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6934 if (typ->type == Tpointer || typ->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6935 return xml_tag((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6936 if (typ->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6937 return ns_convert(typ->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6938 return the_type(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6939 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6940
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6941 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6942 wsdl_type(Tnode *typ, char *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6943 { if (!typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6944 return "NULL";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6945 if ((is_qname(typ) || is_stdqname(typ)) && ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6946 return "xsd:QName";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6947 if (typ->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6948 { if (is_XML(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6949 return "xsd:anyType";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6950 else if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6951 return ns_convert(typ->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6952 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6953 return ns_remove(typ->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6954 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6955 return base_type(typ, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6956 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6957
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6958 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6959 base_type(Tnode *typ, char *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6960 { int d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6961 char *s, *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6962 if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6963 { if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6964 return "xsd:string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6965 return "string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6966 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6967 if (is_dynamic_array(typ) && !is_binary(typ) && !has_ns(typ) && !is_untyped(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6968 { s = ns_remove(wsdl_type(((Table*)typ->ref)->list->info.typ, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6969 if (ns && *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6970 { t = (char*)emalloc(strlen(s)+strlen(ns_convert(ns))+13);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6971 strcpy(t, ns_convert(ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6972 strcat(t, ":");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6973 strcat(t, "ArrayOf");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6974 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6975 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6976 { t = (char*)emalloc(strlen(s)+12);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6977 strcpy(t, "ArrayOf");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6978 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6979 strcat(t, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6980 d = get_Darraydims(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6981 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6982 sprintf(t+strlen(t), "%dD", d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6983 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6984 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6985 switch (typ->type){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6986 case Tchar :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6987 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6988 return "xsd:byte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6989 return "byte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6990 case Twchar :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6991 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6992 return "xsd:wchar";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6993 return "wchar";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6994 case Tshort :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6995 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6996 return "xsd:short";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6997 return "short";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6998 case Tint :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6999 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7000 return "xsd:int";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7001 return "int";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7002 case Tlong :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7003 case Tllong :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7004 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7005 return "xsd:long";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7006 return "long";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7007 case Tfloat:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7008 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7009 return "xsd:float";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7010 return "float";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7011 case Tdouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7012 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7013 return "xsd:double";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7014 return "double";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7015 case Tldouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7016 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7017 return "xsd:decimal";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7018 return "decimal";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7019 case Tuchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7020 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7021 return "xsd:unsignedByte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7022 return "unsignedByte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7023 case Tushort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7024 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7025 return "xsd:unsignedShort";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7026 return "unsignedShort";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7027 case Tuint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7028 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7029 return "xsd:unsignedInt";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7030 return "unsignedInt";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7031 case Tulong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7032 case Tullong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7033 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7034 return "xsd:unsignedLong";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7035 return "unsignedLong";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7036 case Ttime:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7037 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7038 return "xsd:dateTime";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7039 return "dateTime";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7040 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7041 case Treference:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7042 return wsdl_type((Tnode*)typ->ref, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7043 case Tarray:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7044 if (is_fixedstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7045 { if (typ->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7046 { if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7047 return ns_convert(typ->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7048 return ns_remove(typ->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7049 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7050 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7051 return "xsd:string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7052 return "string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7053 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7054 if (ns && *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7055 { s = (char*)emalloc((strlen(ns_convert(ns))+strlen(c_ident(typ))+2)*sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7056 strcpy(s, ns_convert(ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7057 strcat(s, ":");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7058 strcat(s, c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7059 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7060 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7061 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7062 return c_ident(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7063 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7064 if ((Table*)typ->ref == booltable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7065 { if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7066 return "xsd:boolean";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7067 return "boolean";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7068 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7069 case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7070 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7071 if (!has_ns(typ) && ns && *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7072 { s = (char*)emalloc((strlen(ns_convert(ns))+strlen(typ->id->name)+2)*sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7073 strcpy(s, ns_convert(ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7074 strcat(s, ":");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7075 strcat(s, ns_convert(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7076 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7077 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7078 else if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7079 return ns_convert(typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7080 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7081 return ns_remove(typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7082 case Tunion:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7083 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7084 return "xsd:choice";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7085 return "choice";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7086 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7087 if ((Tnode*)typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7088 return wsdl_type((Tnode*)typ->ref, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7089 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7090 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7091 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7092 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7093 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7094 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7095
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7096 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7097 the_type(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7098 { if (!typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7099 return "NULL";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7100 if (typ->type == Tarray || (is_dynamic_array(typ) && (eflag || (!has_ns(typ) && !is_untyped(typ)))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7101 return "SOAP-ENC:Array";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7102 if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7103 return "string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7104 switch (typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7105 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7106 case Tchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7107 return "byte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7108 case Twchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7109 return "wchar";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7110 case Tshort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7111 return "short";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7112 case Tint :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7113 return "int";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7114 case Tlong :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7115 case Tllong :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7116 return "long";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7117 case Tfloat:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7118 return "float";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7119 case Tdouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7120 return "double";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7121 case Tldouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7122 return "decimal";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7123 case Tuchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7124 return "unsignedByte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7125 case Tushort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7126 return "unsignedShort";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7127 case Tuint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7128 return "unsignedInt";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7129 case Tulong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7130 case Tullong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7131 return "unsignedLong";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7132 case Ttime:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7133 return "dateTime";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7134 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7135 case Treference:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7136 return the_type((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7137 case Tarray:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7138 return "SOAP-ENC:Array";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7139 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7140 if ((Table*)typ->ref == booltable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7141 return "boolean";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7142 case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7143 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7144 return ns_convert(typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7145 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7146 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7147 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7148 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7149 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7150
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7151 /* c_type returns the type to be used in parameter declaration*/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7152 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7153 c_type(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7154 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7155 char *p, *q, tempBuf[10];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7156 Tnode *temp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7157 if (typ==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7158 return "NULL";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7159 switch(typ->type){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7160 case Tnone:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7161 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7162 case Tvoid:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7163 return "void";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7164 case Tchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7165 return "char";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7166 case Twchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7167 return "wchar_t";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7168 case Tshort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7169 return "short";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7170 case Tint :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7171 return "int";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7172 case Tlong :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7173 return "long";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7174 case Tllong :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7175 return "LONG64";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7176 case Tfloat:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7177 return "float";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7178 case Tdouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7179 return "double";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7180 case Tldouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7181 return "long double";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7182 case Tuchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7183 return "unsigned char";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7184 case Tushort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7185 return "unsigned short";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7186 case Tuint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7187 return "unsigned int";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7188 case Tulong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7189 return "unsigned long";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7190 case Tullong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7191 return "ULONG64";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7192 case Ttime:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7193 return "time_t";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7194 case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7195 p = (char*) emalloc((8+strlen(ident(typ->id->name))) *sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7196 strcpy(p, "struct ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7197 strcat(p, ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7198 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7199 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7200 p = ident(typ->id->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7201 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7202 case Tunion: p=(char*) emalloc((7+strlen(ident(typ->id->name))) *sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7203 strcpy(p, "union ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7204 strcat(p, ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7205 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7206 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7207 if ((Table*)typ->ref == booltable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7208 return "bool";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7209 p=(char*) emalloc((6+strlen(ident(typ->id->name))) *sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7210 strcpy(p, "enum ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7211 strcat(p, ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7212 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7213 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7214 p = c_type_id((Tnode*)typ->ref, "*");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7215 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7216 case Treference:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7217 p = c_type_id((Tnode*)typ->ref, "&");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7218 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7219 case Tarray:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7220 temp = typ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7221 while(((Tnode*) (typ->ref))->type==Tarray){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7222 typ = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7223 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7224 p=(char*) emalloc((12+strlen(q = c_type((Tnode*)typ->ref))) *sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7225 if (((Tnode*)typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7226 sprintf(p,"%s",c_type((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7227 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7228 strcpy(p, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7229 typ = temp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7230 while(typ->type==Tarray){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7231 if (((Tnode*) typ->ref)->width)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7232 { sprintf(tempBuf,"[%d]",(typ->width / ((Tnode*) typ->ref)->width));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7233 strcat(p,tempBuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7234 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7235 typ = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7236 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7237 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7238 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7239 if (typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7240 { p=(char*)emalloc((strlen(q = c_type((Tnode*)typ->ref))+strlen(ident(typ->id->name))+4) *sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7241 strcpy(p, ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7242 strcat(p, "<");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7243 strcat(p, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7244 strcat(p, " >");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7245 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7246 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7247 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7248 return "UnknownType";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7249 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7250 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7251 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7252
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7253 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7254 c_storage(Storage sto)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7255 { char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7256 static char buf[256];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7257 if (sto & Sconst)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7258 { p = c_storage(sto & ~Sconst);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7259 strcat(p, "const ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7260 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7261 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7262 if (sto & Sconstptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7263 { p = c_storage(sto & ~Sconstptr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7264 strcat(p, "const ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7265 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7266 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7267 if (sto & Sauto)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7268 { p = c_storage(sto & ~Sauto);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7269 strcat(p, "auto ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7270 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7271 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7272 if (sto & Sregister)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7273 { p = c_storage(sto & ~Sregister);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7274 strcat(p, "register ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7275 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7276 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7277 if (sto & Sstatic)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7278 { p = c_storage(sto & ~Sstatic);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7279 strcat(p, "static ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7280 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7281 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7282 if (sto & Sexplicit)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7283 { p = c_storage(sto & ~Sexplicit);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7284 strcat(p, "explicit ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7285 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7286 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7287 if (sto & Sextern)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7288 { p = c_storage(sto & ~Sextern);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7289 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7290 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7291 if (sto & Stypedef)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7292 { p = c_storage(sto & ~Stypedef);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7293 strcat(p, "typedef ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7294 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7295 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7296 if (sto & Svirtual)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7297 { p = c_storage(sto & ~Svirtual);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7298 strcat(p, "virtual ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7299 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7300 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7301 if (sto & Sfriend)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7302 { p = c_storage(sto & ~Sfriend);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7303 strcat(p, "friend ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7304 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7305 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7306 if (sto & Sinline)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7307 { p = c_storage(sto & ~Sinline);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7308 strcat(p, "inline ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7309 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7310 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7311 buf[0]= '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7312 return buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7313 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7314
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7315 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7316 c_init(Entry *e)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7317 { static char buf[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7318 buf[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7319 if (e && e->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7320 { switch (e->info.typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7321 { case Tchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7322 case Twchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7323 case Tuchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7324 case Tshort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7325 case Tushort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7326 case Tint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7327 case Tuint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7328 case Ttime:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7329 sprintf(buf, " = " SOAP_LONG_FORMAT, e->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7330 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7331 case Tlong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7332 sprintf(buf, " = " SOAP_LONG_FORMAT "L", e->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7333 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7334 case Tulong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7335 sprintf(buf, " = " SOAP_LONG_FORMAT "UL", e->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7336 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7337 case Tllong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7338 sprintf(buf, " = " SOAP_LONG_FORMAT "LL", e->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7339 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7340 case Tullong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7341 sprintf(buf, " = " SOAP_LONG_FORMAT "ULL", e->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7342 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7343 case Tfloat:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7344 case Tdouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7345 sprintf(buf, " = %g", e->info.val.r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7346 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7347 case Tldouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7348 sprintf(buf, " = %gL", e->info.val.r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7349 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7350 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7351 if (e->info.val.i <= 0x7FFFLL && e->info.val.i >= -0x8000LL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7352 sprintf(buf, " = (%s)" SOAP_LONG_FORMAT, c_type(e->info.typ), e->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7353 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7354 sprintf(buf, " = (%s)" SOAP_LONG_FORMAT "LL", c_type(e->info.typ), e->info.val.i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7355 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7356 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7357 if (is_stdstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7358 sprintf(buf, " = \"%s\"", cstring(e->info.val.s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7359 else if (is_stdwstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7360 sprintf(buf, " = L\"%s\"", cstring(e->info.val.s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7361 else if (is_wstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7362 sprintf(buf, " = (wchar_t*)L\"%s\"", cstring(e->info.val.s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7363 else if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7364 sprintf(buf, " = (char*)\"%s\"", cstring(e->info.val.s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7365 else if (e->info.typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7366 sprintf(buf, " = NULL");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7367 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7368 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7369 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7370 return buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7371 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7372
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7373 /* c_type_id returns the type to be used in parameter declaration */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7374 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7375 c_type_id(Tnode *typ, char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7376 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7377 char *id,*p,*q,tempBuf[10];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7378 Tnode *temp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7379 Entry *e;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7380 if (!typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7381 return "NULL";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7382 id = ident(name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7383 switch(typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7384 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7385 case Tnone:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7386 p = id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7387 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7388 case Tvoid:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7389 p = (char*)emalloc(6+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7390 strcpy(p, "void ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7391 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7392 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7393 case Tchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7394 p = (char*)emalloc(6+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7395 strcpy(p, "char ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7396 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7397 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7398 case Twchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7399 p = (char*)emalloc(9+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7400 strcpy(p, "wchar_t ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7401 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7402 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7403 case Tshort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7404 p = (char*)emalloc(7+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7405 strcpy(p, "short ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7406 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7407 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7408 case Tint :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7409 p = (char*)emalloc(5+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7410 strcpy(p, "int ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7411 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7412 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7413 case Tlong :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7414 p = (char*)emalloc(6+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7415 strcpy(p, "long ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7416 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7417 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7418 case Tllong :
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7419 p = (char*)emalloc(8+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7420 strcpy(p, "LONG64 ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7421 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7422 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7423 case Tfloat:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7424 p = (char*)emalloc(7+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7425 strcpy(p, "float ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7426 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7427 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7428 case Tdouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7429 p = (char*)emalloc(8+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7430 strcpy(p, "double ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7431 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7432 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7433 case Tldouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7434 p = (char*)emalloc(13+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7435 strcpy(p, "long double ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7436 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7437 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7438 case Tuchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7439 p = (char*)emalloc(15+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7440 strcpy(p, "unsigned char ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7441 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7442 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7443 case Tushort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7444 p = (char*)emalloc(16+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7445 strcpy(p, "unsigned short ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7446 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7447 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7448 case Tuint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7449 p = (char*)emalloc(14+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7450 strcpy(p, "unsigned int ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7451 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7452 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7453 case Tulong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7454 p = (char*)emalloc(15+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7455 strcpy(p, "unsigned long ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7456 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7457 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7458 case Tullong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7459 p = (char*)emalloc(9+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7460 strcpy(p, "ULONG64 ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7461 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7462 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7463 case Ttime:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7464 p = (char*)emalloc(8+strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7465 strcpy(p, "time_t ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7466 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7467 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7468 case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7469 p=(char*) emalloc((9+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7470 strcpy(p, "struct ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7471 strcat(p, ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7472 strcat(p, " ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7473 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7474 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7475 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7476 if (!typ->classed && !is_imported(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7477 { p=(char*) emalloc((8+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7478 strcpy(p, "class ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7479 strcat(p, ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7480 typ->classed = True;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7481 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7482 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7483 { p=(char*) emalloc((2+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7484 strcpy(p, ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7485 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7486 strcat(p, " ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7487 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7488 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7489 case Tunion:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7490 p=(char*) emalloc((8+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7491 strcpy(p, "union ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7492 strcat(p, ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7493 strcat(p, " ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7494 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7495 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7496 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7497 if ((Table*)typ->ref == booltable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7498 { p = (char*)emalloc((strlen(id)+6)*sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7499 strcpy(p, "bool ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7500 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7501 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7502 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7503 p=(char*) emalloc((7+strlen(ident(typ->id->name))+strlen(id)) *sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7504 strcpy(p, "enum ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7505 strcat(p, ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7506 strcat(p, " ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7507 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7508 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7509 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7510 p = (char*)emalloc(strlen(id)+2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7511 strcpy(p+1, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7512 p[0] = '*';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7513 p = c_type_id((Tnode*)typ->ref, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7514 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7515 case Treference:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7516 p = (char*)emalloc(strlen(id)+2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7517 strcpy(p+1, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7518 p[0] = '&';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7519 p = c_type_id((Tnode*)typ->ref, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7520 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7521 case Tarray:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7522 temp = typ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7523 while(((Tnode*) (typ->ref))->type==Tarray){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7524 typ = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7525 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7526 p=(char*) emalloc((12+strlen(q = c_type_id((Tnode*)typ->ref, id))) *sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7527 strcpy(p, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7528 typ = temp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7529 while(typ->type==Tarray){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7530 if (((Tnode*) typ->ref)->width)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7531 { sprintf(tempBuf,"[%d]",(typ->width / ((Tnode*) typ->ref)->width));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7532 strcat(p,tempBuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7533 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7534 typ = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7535 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7536 /*if(((Tnode*) (typ->ref))->type==Tarray){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7537 sprintf(p,"%s [%d]",c_type((Tnode*)typ->ref),(typ->width / ((Tnode*) typ->ref)->width));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7538 }else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7539 sprintf(p,"%s a[%d]",c_type((Tnode*)typ->ref),(typ->width /((Tnode*) typ->ref)->width));*/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7540 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7541 case Tfun:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7542 if (strncmp(id, "operator ", 9))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7543 q = c_type_id(((FNinfo*)typ->ref)->ret, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7544 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7545 q = id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7546 p = (char*)emalloc(1024);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7547 strcpy(p, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7548 strcat(p, "(");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7549 for (e = ((FNinfo*)typ->ref)->args->list; e; e = e->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7550 { strcat(p, c_storage(e->info.sto));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7551 if (e->info.typ->type != Tvoid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7552 { strcat(p, c_type_id(e->info.typ, e->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7553 strcat(p, c_init(e));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7554 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7555 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7556 strcat(p, "void");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7557 if (e->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7558 strcat(p, ", ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7559 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7560 strcat(p, ")");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7561 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7562 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7563 if (typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7564 { p=(char*)emalloc((strlen(q = c_type((Tnode*)typ->ref))+strlen(ident(typ->id->name))+strlen(id)+4) *sizeof(char));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7565 strcpy(p, ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7566 strcat(p, "<");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7567 strcat(p, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7568 strcat(p, " >");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7569 strcat(p, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7570 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7571 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7572 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7573 return "UnknownType";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7574 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7575 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7576 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7577
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7578 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7579 xsi_type_Tarray(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7580 { Tnode *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7581 int cardinality;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7582 char *p, *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7583 t = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7584 if (is_fixedstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7585 { if (typ->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7586 return ns_convert(typ->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7587 return "xsd:string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7588 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7589 cardinality = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7590 while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7591 { if( t->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7592 t = (Tnode*)t->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7593 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7594 t = (Tnode*)((Table*)t->ref)->list->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7595 cardinality++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7596 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7597 s = xsi_type(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7598 if (!*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7599 s = wsdl_type(t, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7600 p = (char*)emalloc(strlen(s)+cardinality+3);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7601 strcpy(p, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7602 if (cardinality > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7603 { strcat(p, "[");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7604 for (; cardinality > 2; cardinality--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7605 strcat(p, ",");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7606 strcat(p, "]");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7607 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7608 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7609 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7610
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7611 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7612 xsi_type_Darray(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7613 { Tnode *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7614 Entry *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7615 int cardinality;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7616 char *p, *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7617 if (!typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7618 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7619 q = ((Table*)typ->ref)->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7620 while (q && q->info.typ->type == Tfun)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7621 q = q->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7622 t = (Tnode*)q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7623 cardinality = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7624 while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7625 { if (t->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7626 t = (Tnode*)t->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7627 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7628 { q = ((Table*)t->ref)->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7629 while (q && q->info.typ->type == Tfun)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7630 q = q->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7631 t = (Tnode*)q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7632 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7633 cardinality++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7634 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7635 s = xsi_type(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7636 if (!*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7637 s = wsdl_type(t, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7638 p = (char*)emalloc(strlen(s)+cardinality*2+1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7639 strcpy(p, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7640 if (cardinality > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7641 { strcat(p, "[");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7642 for (; cardinality > 2; cardinality--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7643 strcat(p, ",");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7644 strcat(p, "]");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7645 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7646 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7647 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7648
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7649 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7650 generate(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7651 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7652 if (kflag && is_XML(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7653 { soap_traverse(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7654 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7655 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7656 if (is_transient(typ) || typ->type == Twchar || is_XML(typ) || is_void(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7657 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7658
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7659 if (lflag && typ->type == Tint && !typ->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7660 { fprintf(fhead,"\n\n#ifndef %s",soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7661 fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7662 fprintf(fhead,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7663 fprintf(fhead,"\n\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_int(struct soap*, int*);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7664 fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_int(struct soap*, const char*, int, const int*, const char*);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7665 fprintf(fhead,"\nSOAP_FMAC1 int* SOAP_FMAC2 soap_in_int(struct soap*, const char*, int*, const char*);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7666 return; /* do not generate int serializers in libs */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7667 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7668 else if (is_imported(typ) && (typ->type != Tint || typ->sym))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7669 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7670 if (is_typedef(typ) && is_element(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7671 fprintf(fhead,"\n\n/* %s is a typedef element/attribute synonym for %s */", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7672 if (is_primitive(typ) || is_string(typ) || is_wstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7673 { if (!Qflag && is_external(typ) && namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7674 { char *id = namespaceid;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7675 fprintf(fhead,"\n\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7676 fprintf(fout,"\n\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7677 namespaceid = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7678 fprintf(fhead,"\n\n#ifndef %s",soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7679 fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7680 fprintf(fhead,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7681 namespaceid = id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7682 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7683 fprintf(fhead,"\n\n#ifndef %s",soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7684 fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7685 fprintf(fhead,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7686 fflush(fhead);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7687 soap_default(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7688 soap_serialize(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7689 if (kflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7690 soap_traverse(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7691 soap_out(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7692 soap_in(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7693 if (!Qflag && is_external(typ) && namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7694 { fprintf(fhead,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7695 fprintf(fout,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7696 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7697 soap_put(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7698 soap_get(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7699 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7700 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7701 switch(typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7702 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7703 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7704 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7705 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7706 case Tarray:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7707 case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7708 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7709 case Tunion:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7710 if (is_header_or_fault(typ) || is_body(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7711 { fprintf(fhead,"\n\n#ifndef WITH_NOGLOBAL");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7712 fprintf(fout,"\n\n#ifndef WITH_NOGLOBAL");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7713 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7714 if (!Qflag && is_external(typ) && namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7715 { char *id = namespaceid;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7716 fprintf(fhead,"\n\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7717 fprintf(fout,"\n\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7718 namespaceid = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7719 fprintf(fhead,"\n\n#ifndef %s",soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7720 fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7721 fprintf(fhead,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7722 namespaceid = id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7723 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7724 fprintf(fhead,"\n\n#ifndef %s",soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7725 fprintf(fhead,"\n#define %s (%d)",soap_type(typ),typ->num);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7726 fprintf(fhead,"\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7727 fflush(fhead);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7728 soap_default(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7729 soap_serialize(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7730 if (kflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7731 soap_traverse(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7732 soap_out(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7733 soap_in(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7734 if (!Qflag && is_external(typ) && namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7735 { fprintf(fhead,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7736 fprintf(fout,"\n\nnamespace %s {", namespaceid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7737 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7738 soap_put(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7739 soap_get(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7740 if (typ->type == Tstruct || typ->type == Tclass || typ->type == Ttemplate)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7741 soap_instantiate_class(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7742 if (is_header_or_fault(typ) || is_body(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7743 { fprintf(fhead,"\n\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7744 fprintf(fout,"\n\n#endif");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7745 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7746 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7747 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7748 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7749 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7750 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7751
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7752 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7753 matlab_gen_sparseStruct(void)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7754 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7755 fprintf(fmheader,"\nstruct soapSparseArray{\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7756 fprintf(fmheader," int *ir;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7757 fprintf(fmheader," int *jc;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7758 fprintf(fmheader," double *pr;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7759 fprintf(fmheader," int num_columns;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7760 fprintf(fmheader," int num_rows;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7761 fprintf(fmheader," int nzmax;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7762 fprintf(fmheader,"};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7763 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7764
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7765 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7766 matlab_c_to_mx_sparse(void)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7767 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7768 fprintf(fmheader,"\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7769 fprintf(fmatlab,"\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray a)\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7770 fprintf(fmatlab,"{\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7771 fprintf(fmatlab," mxArray *b;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7772 fprintf(fmatlab," b = mxCreateSparse(a.num_rows, a.num_columns, a.nzmax, mxREAL);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7773 fprintf(fmatlab," mxSetIr(b,a.ir);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7774 fprintf(fmatlab," mxSetJc(b,a.jc);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7775 fprintf(fmatlab," mxSetPr(b,a.pr);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7776 fprintf(fmatlab," return b;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7777 fprintf(fmatlab,"}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7778 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7779
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7780 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7781 matlab_mx_to_c_sparse(void)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7782 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7783 fprintf(fmheader,"\nmxArray* mx_to_c_soapSparseArray(const mxArray *, struct soapSparseArray *);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7784 fprintf(fmatlab,"\nmxArray* mx_to_c_soapSparseArray(const mxArray *a, struct soapSparseArray *b)\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7785 fprintf(fmatlab,"{\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7786 fprintf(fmatlab," if(!mxIsSparse(a))\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7787 fprintf(fmatlab," {\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7788 fprintf(fmatlab," mexErrMsgTxt(\"Input should be a sparse array.\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7789 fprintf(fmatlab," }\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7790
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7791 fprintf(fmatlab," /* Get the starting positions of the data in the sparse array. */ \n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7792 fprintf(fmatlab," b->pr = mxGetPr(a);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7793 fprintf(fmatlab," b->ir = mxGetIr(a);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7794 fprintf(fmatlab," b->jc = mxGetJc(a);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7795 fprintf(fmatlab," b->num_columns = mxGetN(a);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7796 fprintf(fmatlab," b->num_rows = mxGetM(a);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7797 fprintf(fmatlab," b->nzmax = mxGetNzmax(a);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7798 fprintf(fmatlab,"}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7799 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7800
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7801 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7802 matlab_mx_to_c_dynamicArray(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7803 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7804 int d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7805 Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7806
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7807 p = is_dynamic_array(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7808
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7809 fprintf(fmatlab,"{\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7810 fprintf(fmatlab,"\tint i, numdims;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7811 fprintf(fmatlab,"\tconst int *dims;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7812 fprintf(fmatlab,"\tdouble *temp;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7813 fprintf(fmatlab,"\tint size = 1;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7814 fprintf(fmatlab,"\tint ret;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7815 fprintf(fmatlab,"\tnumdims = mxGetNumberOfDimensions(a);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7816 fprintf(fmatlab,"\tdims = mxGetDimensions(a);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7817
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7818 d = get_Darraydims(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7819 fprintf(fmatlab,"\tif (numdims != %d)\n", d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7820 fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Incompatible array specifications in C and mx.\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7821
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7822 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7823 fprintf(fmatlab,"\tfor(i=0;i<numdims; i++) {\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7824 fprintf(fmatlab,"\t b->__size[i] = dims[i];\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7825 fprintf(fmatlab,"\t}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7826 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7827
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7828 if((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7829 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7830 fprintf(fmatlab,"\ttemp = (double*)mxGetPr(a);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7831 fprintf(fmatlab,"\tif (!temp)\n\t\tmexErrMsgTxt(\"mx_to_c_ArrayOfdouble: Pointer to data is NULL\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7832 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7833
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7834 fprintf(fmatlab,"\tfor (i = 0; i < numdims; i++) {\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7835 fprintf(fmatlab,"\t\tif (b->__size[i] < dims[i])\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7836 fprintf(fmatlab,"\t\t\tmexErrMsgTxt(\"Incompatible array dimensions in C and mx.\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7837 fprintf(fmatlab,"\t\tsize *= dims[i];\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7838 fprintf(fmatlab,"\t}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7839
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7840 if((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7841 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7842 fprintf(fmatlab,"\tfor (i = 0; i < size; i++)\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7843 fprintf(fmatlab,"\t\tb->__ptr[i] = (%s)*temp++;\n", c_type((Tnode*)p->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7844 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7845 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7846 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7847 fprintf(fmatlab,"\tret = mxGetString(a, b->__ptr, size + 1);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7848 fprintf(fmatlab,"\tmexPrintf(\"ret = %%d, b->__ptr = %%s, size = %%d\", ret, b->__ptr, size);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7849 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7850 fprintf(fmatlab,"\n}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7851
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7852 fflush(fmatlab);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7853 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7854
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7855
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7856 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7857 matlab_c_to_mx_dynamicArray(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7858 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7859 int d,i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7860 Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7861
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7862 p = is_dynamic_array(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7863
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7864 fprintf(fmatlab,"{\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7865 fprintf(fmatlab,"\tmxArray *out;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7866 fprintf(fmatlab,"\t%s;\n",c_type_id((Tnode*)p->info.typ->ref,"*temp"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7867 d = get_Darraydims(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7868 fprintf(fmatlab,"\tint i;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7869
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7870 fprintf(fmatlab,"\tint ndim = %d, dims[%d] = {", d, d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7871 for (i = 0; i < d; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7872 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7873 if(i==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7874 fprintf(fmatlab,"a.__size[%d]",i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7875 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7876 fprintf(fmatlab,", a.__size[%d]",i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7877 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7878 fprintf(fmatlab,"};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7879
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7880 fprintf(fmatlab,"\tint size = ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7881 for (i = 0; i < d; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7882 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7883 if(i==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7884 fprintf(fmatlab,"dims[%d]",i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7885 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7886 fprintf(fmatlab,"*dims[%d]",i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7887 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7888 fprintf(fmatlab,";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7889 if((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7890 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7891 fprintf(fmatlab,"\tout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n",get_mxClassID((Tnode*)p->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7892 fprintf(fmatlab,"\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7893 fprintf(fmatlab,"\ttemp = (%s) mxGetPr(out);\n",c_type_id((Tnode*)p->info.typ->ref,"*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7894 fprintf(fmatlab,"\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7895
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7896 fprintf(fmatlab,"\tfor (i = 0; i < size; i++)\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7897 fprintf(fmatlab,"\t\t*temp++ = a.__ptr[i];\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7898 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7899 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7900 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7901 fprintf(fmatlab,"\tout = mxCreateString(a.__ptr);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7902 fprintf(fmatlab,"\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7903 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7904 fprintf(fmatlab,"\treturn out;\n}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7905 fflush(fmatlab);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7906 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7907
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7908 char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7909 get_mxClassID(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7910 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7911
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7912 switch(typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7913 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7914 case Tdouble:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7915 return "mxDOUBLE_CLASS";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7916 case Tfloat:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7917 return "mxSINGLE_CLASS";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7918 case Tshort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7919 return "mxINT16_CLASS";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7920 case Tushort:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7921 return "mxUINT16_CLASS";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7922 case Tint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7923 return "mxINT32_CLASS";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7924 case Tuint:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7925 return "mxUINT32_CLASS";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7926 case Tlong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7927 return "mxINT32_CLASS";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7928 case Tulong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7929 return "mxUINT32_CLASS";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7930 case Tllong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7931 return "mxINT64_CLASS";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7932 case Tullong:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7933 return "mxUINT64_CLASS";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7934 case Tchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7935 return "mxCHAR_CLASS";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7936 case Tuchar:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7937 return "mxCHAR_CLASS";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7938 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7939 return "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7940 };
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7941 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7942
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7943 /*Function not in use.*/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7944 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7945 matlab_array_c_to_mx(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7946 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7947 Tnode* temp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7948 int d,i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7949
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7950 fprintf(fmatlab,"{\n\tint rows, r, cols, c;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7951 fprintf(fmatlab,"\tmxArray* out;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7952 fprintf(fmatlab,"\tdouble* temp;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7953 d = get_dimension(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7954 fprintf(fmatlab,"\tint ndim = %d, dims[%d] = {",d,d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7955 temp=typ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7956 for(i=0;i<d; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7957 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7958 if(i==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7959 fprintf(fmatlab,"%d",temp->width / ((Tnode*) temp->ref)->width);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7960 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7961 fprintf(fmatlab,",%d",temp->width / ((Tnode*) temp->ref)->width);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7962 temp=(Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7963 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7964 fprintf(fmatlab,"};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7965
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7966 fprintf(fmatlab,"\tout = mxCreateNumericArray(ndim, dims, mxDOUBLE_CLASS, mxREAL);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7967 fprintf(fmatlab,"\ttemp = (double *) mxGetPr(out);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7968 fprintf(fmatlab,"\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7969 fprintf(fmatlab,"\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7970 fprintf(fmatlab,"\trows = mxGetM(out);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7971 fprintf(fmatlab,"\tif (!rows)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero rows\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7972 fprintf(fmatlab,"\tcols = mxGetN(out);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7973 fprintf(fmatlab,"\tif (!cols)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero columns\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7974 fprintf(fmatlab,"\tfor (c = 0; c < cols; c++)\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7975 fprintf(fmatlab,"\t\tfor (r = 0; r < rows; r++)\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7976 fprintf(fmatlab,"\t\t\t*temp++ = z->a[r][c];\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7977 fprintf(fmatlab,"\treturn out;\n}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7978 fflush(fmatlab);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7979 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7980
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7981
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7982 void matlab_c_to_mx_pointer(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7983 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7984 if (!typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7985 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7986
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7987 fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);\n",c_ident(typ),c_type_id(typ, ""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7988 fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7989 fprintf(fmatlab,"{\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7990 fprintf(fmatlab,"\tmxArray *fout;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7991 fprintf(fmatlab,"\tfout = c_to_mx_%s(*a);\n",c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7992 fprintf(fmatlab,"\treturn fout;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7993 fprintf(fmatlab,"}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7994 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7995
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7996 void matlab_mx_to_c_pointer(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7997 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7998 if (!typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7999 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8000 fprintf(fmheader,"\nvoid mx_to_c_%s(const mxArray*,%s);\n",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8001 fprintf(fmatlab,"\nvoid mx_to_c_%s(const mxArray* a,%s)\n",c_ident(typ),c_type_id(typ, "*b"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8002 fprintf(fmatlab,"{\n\tmx_to_c_%s(a,*b);\n",c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8003 fprintf(fmatlab,"\n}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8004 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8005
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8006 void func2(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8007 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8008 Table *table,*t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8009 Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8010
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8011 fprintf(fmatlab,"\tif(!mxIsStruct(a))\n\t\tmexErrMsgTxt(\"Input must be a structure.\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8012
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8013 table=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8014 for (t = table; t != (Table *) 0; t = t->prev) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8015 for (p = t->list; p != (Entry*) 0; p = p->next) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8016 if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8017 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8018 fprintf(fmatlab,"\t{mxArray *tmp = mxGetField(a,0,\"%s\");\n",ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8019 fprintf(fmatlab,"\tif (!tmp) {\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8020 fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Above member field is empty!\");\n\t}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8021 fprintf(fmatlab,"\tmx_to_c_%s(tmp,&(b->%s));}\n",c_ident(p->info.typ),ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8022 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8023 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8024 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8025 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8026
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8027 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8028 matlab_mx_to_c_struct(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8029 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8030 if (!typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8031 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8032
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8033
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8034 if (is_dynamic_array(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8035 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8036 fprintf(fmheader,"\nvoid mx_to_c_%s(const mxArray*, %s);\n",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8037 fprintf(fmatlab,"\nvoid mx_to_c_%s(const mxArray* a, %s)\n",c_ident(typ),c_type_id(typ, "*b"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8038 matlab_mx_to_c_dynamicArray(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8039 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8040 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8041 else if(strstr(c_type_id(typ, ""),"soapSparseArray"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8042 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8043 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8044 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8045
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8046 fprintf(fmheader,"\nvoid mx_to_c_%s(const mxArray*, %s);\n",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8047 fprintf(fmatlab,"\nvoid mx_to_c_%s(const mxArray* a, %s)\n",c_ident(typ),c_type_id(typ, "*b"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8048 fprintf(fmatlab,"{\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8049
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8050 func2(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8051 fprintf(fmatlab,"\n}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8052
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8053 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8054 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8055
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8056
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8057
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8058 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8059 matlab_c_to_mx_struct(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8060 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8061 Table *table,*t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8062 Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8063 int number_of_fields=0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8064
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8065 if (!typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8066 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8067
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8068 if (is_dynamic_array(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8069 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8070 fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);\n",c_ident(typ),c_type_id(typ, ""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8071 fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8072 matlab_c_to_mx_dynamicArray(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8073 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8074 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8075 else if(strstr(c_type_id(typ, ""),"soapSparseArray"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8076 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8077 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8078 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8079
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8080 fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);\n",c_ident(typ),c_type_id(typ, ""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8081 fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8082 table=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8083 fprintf(fmatlab,"{\n\tconst char* fnames[] = {");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8084 for (t = table; t != (Table *) 0; t = t->prev) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8085 for (p = t->list; p != (Entry*) 0; p = p->next) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8086 if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8087 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8088 if(number_of_fields)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8089 fprintf(fmatlab,",\"%s\"",ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8090 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8091 fprintf(fmatlab,"\"%s\"",ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8092 number_of_fields++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8093 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8094 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8095 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8096 fprintf(fmatlab,"}; /* pointers to member field names */\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8097
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8098 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8099 fprintf(fmatlab,"\t/* Create a 1x1 struct matrix for output */\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8100 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");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8101
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8102
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8103 for (t = table; t != (Table *) 0; t = t->prev) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8104 for (p = t->list; p != (Entry*) 0; p = p->next) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8105 if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8106 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8107 fprintf(fmatlab,"\t{mxArray *fout = c_to_mx_%s(a.%s);\n",c_ident(p->info.typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8108 fprintf(fmatlab,"\tmxSetField(struct_array_ptr, index,\"%s\" , fout);}\n", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8109 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8110 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8111 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8112 fprintf(fmatlab,"\treturn struct_array_ptr;\n}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8113 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8114 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8115
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8116 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8117 matlab_c_to_mx_primitive(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8118 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8119 fprintf(fmheader,"\nmxArray* c_to_mx_%s(%s);",c_ident(typ),c_type_id(typ, ""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8120 fprintf(fmatlab,"\nmxArray* c_to_mx_%s(%s)\n",c_ident(typ),c_type_id(typ, "a"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8121
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8122 fprintf(fmatlab,"{\n\tmxArray *fout;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8123 if((typ->type == Tchar) || (typ->type == Tuchar))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8124 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8125 fprintf(fmatlab,"\tchar buf[2];\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8126 fprintf(fmatlab,"\tbuf[0] = a;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8127 fprintf(fmatlab,"\tbuf[1] = \'\\0\';\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8128 fprintf(fmatlab,"\tfout = mxCreateString(buf);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8129 fprintf(fmatlab,"\tif (!fout)\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8130 fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8131 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8132 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8133 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8134 fprintf(fmatlab,"\tint ndim = 1, dims[1] = {1};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8135 fprintf(fmatlab,"\tfout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n",get_mxClassID(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8136 fprintf(fmatlab,"\t%s = (%s)mxGetPr(fout);\n",c_type_id(typ,"*temp"),c_type_id(typ,"*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8137 fprintf(fmatlab,"\tif (!fout)\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8138 fprintf(fmatlab,"\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8139 fprintf(fmatlab,"\tif (!temp) \n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8140 fprintf(fmatlab,"\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8141 fprintf(fmatlab,"\t*temp++= a;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8142 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8143 fprintf(fmatlab,"\treturn fout;\n}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8144 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8145
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8146 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8147 matlab_mx_to_c_primitive(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8148 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8149 fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray *, %s);\n",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8150 fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray *a, %s)\n",c_ident(typ),c_type_id(typ, "*b"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8151 if((typ->type == Tchar) || (typ->type == Tuchar))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8152 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8153 fprintf(fmatlab,"{\n\tint ret;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8154 fprintf(fmatlab,"\tchar buf[2];\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8155 fprintf(fmatlab,"\tret = mxGetString(a, buf, 2);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8156 fprintf(fmatlab,"\tmexPrintf(\"ret = %%d, buf = %%s\", ret, buf);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8157 fprintf(fmatlab,"\t*b = buf[0];\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8158 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8159 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8160 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8161 fprintf(fmatlab,"{\n\tdouble* data = (double*)mxGetData(a);\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8162 fprintf(fmatlab,"\t*b = (%s)*data;\n",c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8163 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8164 fprintf(fmatlab,"\n}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8165 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8166
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8167 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8168 matlab_out_generate(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8169 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8170
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8171 if (is_transient(typ) || typ->type == Twchar || is_XML(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8172 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8173
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8174 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8175 typeNO++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8176 if (typeNO>=1024)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8177 execerror("Too many user-defined data types");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8178 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8179
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8180 if(is_primitive(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8181 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8182 matlab_c_to_mx_primitive(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8183 matlab_mx_to_c_primitive(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8184 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8185 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8186
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8187 switch(typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8188 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8189 case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8190 matlab_c_to_mx_struct(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8191 matlab_mx_to_c_struct(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8192 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8193 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8194 matlab_c_to_mx_pointer(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8195 matlab_mx_to_c_pointer(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8196 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8197 case Tarray:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8198 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8199 default:break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8200 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8201 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8202
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8203 /*his function is called first it first generates all routines
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8204 and then in the second pass calls all routines to generate
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8205 matlab_out for the table*/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8206
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8207 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8208 func1(Table *table, Entry *param)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8209 { Entry *q,*pout,*response=NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8210 q=entry(table, param->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8211 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8212 pout = (Entry*)q->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8213 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8214 { fprintf(stderr, "Internal error: no table entry\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8215 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8216 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8217 q=entry(classtable, param->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8218 if (!is_response(pout->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8219 { response = get_response(param->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8220 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8221 fprintf(fmheader,"\n\toutside loop struct %s soap_tmp_%s;",param->sym->name,param->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8222 if (!is_response(pout->info.typ) && response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8223 { fprintf(fmheader,"\n\tif..inside loop struct %s *soap_tmp_%s;",c_ident(response->info.typ), c_ident(response->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8224 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8225 fflush(fmheader);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8226 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8227
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8228 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8229 matlab_def_table(Table *table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8230 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8231 Entry *q,*pout,*e,*response=NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8232 int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8233 Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8234
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8235 /* for (q1 = table->list; q1 != (Entry*) 0; q1 = q1->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8236 if (q1->info.typ->type==Tfun)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8237 func1(table, q1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8238 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8239
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8240 /* Sparse matrix code will be present by default */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8241 matlab_gen_sparseStruct();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8242 matlab_c_to_mx_sparse();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8243 matlab_mx_to_c_sparse();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8244
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8245 for(i=0;i<TYPES;i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8246 for(p=Tptr[i];p!=(Tnode*) 0;p=p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8247 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8248 /* This is generated for everything declared in the ".h" file. To make
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8249 sure that it doesnt get generated for functions do a comparison with
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8250 p->sym->name, so that its not generated for functions.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8251 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8252 if(is_XML(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8253 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8254 if(strstr(c_ident(p),"SOAP_ENV_") != NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8255 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8256 for(q = table->list; q != (Entry*) 0; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8257 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8258 if(strcmp(c_ident(p),q->sym->name) == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8259 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8260 e=entry(table, q->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8261 if (e)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8262 pout = (Entry*)e->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8263 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8264 { fprintf(stderr, "Internal error: no table entry\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8265 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8266 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8267 if (!is_response(pout->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8268 { response = get_response(q->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8269 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8270 if (!is_response(pout->info.typ) && response)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8271 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8272 if(strcmp(c_ident(p),c_ident(response->info.typ)) == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8273 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8274 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8275 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8276 if(q == (Entry*) 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8277 matlab_out_generate(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8278 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8279 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8280
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8281 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8282 def_table(Table *table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8283 { int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8284 Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8285 for (i = 0; i < TYPES; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8286 { for (p = Tptr[i]; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8287 { if (!p->generated && !is_transient(p) && p->type != Twchar && !is_void(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8288 { p->generated = True;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8289 generate(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8290 if (fflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8291 if (--partnum == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8292 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8293 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8294 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8295 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8296 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8297
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8298
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8299 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8300 no_of_var(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8301 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8302 Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8303 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8304 int i=0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8305 if(typ->type==Tstruct || typ->type==Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8306 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8307 t=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8308 for (p = t->list; p != (Entry*) 0; p = p->next) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8309 if(p->info.typ->type==Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8310 i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8311 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8312 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8313 if((((Tnode *)(typ->ref))->type==Tstruct) ||
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8314 (((Tnode *)(typ->ref))->type==Tclass) )
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8315 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8316 t=(Table*)((Tnode*)(typ->ref))->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8317 for (p = t->list; p != (Entry*) 0; p = p->next) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8318 if(p->info.typ->type==Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8319 i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8320 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8321 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8322 return i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8323 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8324
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8325 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8326 in_defs(Table *table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8327 { int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8328 Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8329 for (i = 0; i < TYPES; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8330 { for (p = Tptr[i]; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8331 { 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8332 { char *s = xsi_type(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8333 if (!*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8334 s = wsdl_type(p, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8335 if (*s == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8336 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8337 if (is_string(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8338 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8339 else if (is_wstring(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8340 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8341 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8342 fprintf(fout,"\n\tcase %s:\n\t\treturn soap_in_%s(soap, NULL, NULL, \"%s\");", soap_type(p), c_ident(p), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8343 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8344 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8345 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8346 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8347
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8348 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8349 in_defs2(Table *table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8350 { int i, j;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8351 Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8352 char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8353 for (i = 0; i < TYPES; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8354 { /* make sure (wrapper) classes are checked first */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8355 if (i == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8356 j = Tclass;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8357 else if (i == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8358 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8359 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8360 j = i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8361 for (p = Tptr[j]; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8362 { 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8363 { s = xsi_type(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8364 if (!*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8365 s = wsdl_type(p, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8366 if (*s == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8367 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8368 if (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8369 { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8370 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8371 else if (is_string(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8372 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8373 else if (is_wstring(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8374 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8375 else if (p->type != Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8376 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8377 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8378 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8379 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8380 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8381 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8382
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8383 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8384 in_defs3(Table *table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8385 { int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8386 Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8387 char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8388 for (i = 0; i < TYPES; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8389 { for (p = Tptr[i]; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8390 { 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8391 { s = xsi_type(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8392 if (!*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8393 s = wsdl_type(p, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8394 if (*s == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8395 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8396 if (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8397 { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8398 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8399 else if (is_string(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8400 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8401 else if (is_wstring(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8402 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8403 else if (p->type != Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8404 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8405 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8406 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8407 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8408 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8409 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8410
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8411 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8412 out_defs(Table *table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8413 { int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8414 char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8415 Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8416 for (i = 0; i < TYPES; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8417 { for (p = Tptr[i]; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8418 { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8419 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8420 if (is_element(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8421 { s = wsdl_type(p, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8422 if (*s == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8423 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8424 if (p->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8425 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, "(*)"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8426 else if(p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8427 fprintf(fout,"\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, \"%s\", id, NULL);", soap_type(p), c_type_id(p, "*"),s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8428 else if (is_string(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8429 fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_string(soap, \"%s\", id, (char*const*)&ptr, NULL);", soap_type(p),s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8430 else if (is_wstring(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8431 fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_wstring(soap, \"%s\", id, (wchar_t*const*)&ptr, NULL);", soap_type(p),s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8432 else if (p->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8433 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*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8434 else if(p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Tunion)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8435 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8436 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8437 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8438 { s = xsi_type(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8439 if (!*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8440 s = wsdl_type(p, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8441 if (*s == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8442 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8443 if (p->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8444 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8445 else if(p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8446 fprintf(fout,"\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, tag, id, \"%s\");", soap_type(p), c_type_id(p, "*"), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8447 else if (is_string(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8448 fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_string(soap, tag, id, (char*const*)&ptr, \"%s\");", soap_type(p), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8449 else if (is_wstring(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8450 fprintf(fout,"\n\tcase %s:\n\t\treturn soap_out_wstring(soap, tag, id, (wchar_t*const*)&ptr, \"%s\");", soap_type(p), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8451 else if (p->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8452 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8453 else if(p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Tunion)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8454 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8455 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8456 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8457 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8458 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8459
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8460 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8461 mark_defs(Table *table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8462 { int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8463 Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8464 for (i = 0; i < TYPES; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8465 { for (p = Tptr[i]; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8466 { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8467 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8468 if (p->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8469 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, "(*)"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8470 else if(p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8471 fprintf(fout,"\n\tcase %s:\n\t\t((%s)ptr)->soap_serialize(soap);\n\t\tbreak;", soap_type(p), c_type_id(p, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8472 else if (is_string(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8473 fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_string(soap, (char*const*)&ptr);\n\t\tbreak;", soap_type(p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8474 else if (is_wstring(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8475 fprintf(fout,"\n\tcase %s:\n\t\tsoap_serialize_wstring(soap, (wchar_t*const*)&ptr);\n\t\tbreak;", soap_type(p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8476 else if (p->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8477 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*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8478 else if(p->type == Ttemplate && p->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8479 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8480 else if(!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Tunion)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8481 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8482 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8483 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8484 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8485
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8486 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8487 in_attach(Table *table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8488 { int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8489 Tnode *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8490 for (i = 0; i < TYPES; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8491 { for (p = Tptr[i]; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8492 { if (is_attachment(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8493 { if (p->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8494 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8495 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8496 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8497 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8498 else if (is_binary(p) && !is_transient(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8499 { if (p->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8500 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8501 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8502 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8503 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8504 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8505 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8506 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8507
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8508 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8509 soap_instantiate_class(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8510 { Table *Tptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8511 Entry *Eptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8512 int derclass = 0, flag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8513 char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8514
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8515 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8516 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8517
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8518 if (typ->type != Tclass || !typ->sym || !is_eq(typ->sym->name, "xsd__QName") || is_imported(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8519 if (is_typedef(typ) && !is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8520 { fprintf(fhead, "\n\n#define soap_instantiate_%s soap_instantiate_%s\n", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8521 fprintf(fhead, "\n\n#define soap_copy_%s soap_copy_%s", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8522 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8523 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8524
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8525 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8526
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8527 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8528
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8529 if (typ->type == Tclass || typ->type == Tstruct)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8530 { fprintf(fhead, "\n\ninline %s * soap_new_req_%s(struct soap *soap", c_type(typ), c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8531 if (!is_dynamic_array(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8532 { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8533 { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8534 { if (Eptr->info.sto & (Stypedef | Sstatic))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8535 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8536 if (is_repetition(Eptr) || is_anytype(Eptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8537 flag = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8538 if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8539 { if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8540 flag--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8541 if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8542 fprintf(fhead, ", %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8543 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8544 fprintf(fhead, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8545 if (derclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8546 fprintf(fhead, "%d", derclass);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8547 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8548 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8549 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8550 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8551 fprintf(fhead, ") { %s = soap_instantiate_%s(soap, -1, NULL, NULL, NULL); if (_p) { ", c_type_id(typ, "*_p"), c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8552 if (!is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8553 { if (typ->type == Tclass && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8554 fprintf(fhead, "_p->soap_default(soap); ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8555 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8556 fprintf(fhead, "soap_default_%s(soap, _p); ", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8557 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8558 flag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8559 if (!is_dynamic_array(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8560 { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8561 { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8562 { if (Eptr->info.sto & (Stypedef | Sstatic))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8563 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8564 if (is_repetition(Eptr) || is_anytype(Eptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8565 flag = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8566 if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8567 { if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8568 flag--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8569 if (typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8570 fprintf(fhead, "_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8571 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8572 fprintf(fhead, "_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8573 if (derclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8574 fprintf(fhead, "%d; ", derclass);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8575 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8576 fprintf(fhead, "; ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8577 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8578 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8579 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8580 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8581 fprintf(fhead, "} return _p; }");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8582 fprintf(fhead, "\n\ninline %s * soap_new_set_%s(struct soap *soap", c_type(typ), c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8583 for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8584 { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8585 { if (Eptr->info.sto & (Stypedef | Sstatic))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8586 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8587 if (!(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8588 { if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8589 fprintf(fhead, ", %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8590 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8591 fprintf(fhead, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8592 if (derclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8593 fprintf(fhead, "%d", derclass);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8594 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8595 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8596 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8597 fprintf(fhead, ") { %s = soap_instantiate_%s(soap, -1, NULL, NULL, NULL); if (_p) { ", c_type_id(typ, "*_p"), c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8598 if (!is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8599 { if (typ->type == Tclass && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8600 fprintf(fhead, "_p->soap_default(soap); ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8601 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8602 fprintf(fhead, "soap_default_%s(soap, _p); ", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8603 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8604 for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8605 { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8606 { if (Eptr->info.sto & (Stypedef | Sstatic))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8607 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8608 if (!(Eptr->info.sto & (Sprivate | Sprotected)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8609 { if (typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8610 fprintf(fhead, "_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8611 else if (Eptr->info.typ->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8612 fprintf(fhead, "memcpy(_p->%s, %s, sizeof(%s))", ident(Eptr->sym->name), ident(Eptr->sym->name), c_type(Eptr->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8613 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8614 fprintf(fhead, "_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8615 if (derclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8616 fprintf(fhead, "%d; ", derclass);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8617 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8618 fprintf(fhead, "; ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8619 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8620 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8621 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8622 fprintf(fhead, "} return _p; }");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8623 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8624
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8625 fprintf(fhead, "\n\ninline void soap_delete_%s(struct soap *soap, %s) { soap_delete(soap, p); }", c_ident(typ), c_type_id(typ, "*p"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8626
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8627 /* extern "C" causes C++ namespace linking issues */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8628 /* fprintf(fhead,"\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8629 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8630 /* fprintf(fhead,"\n#ifdef __cplusplus\n}\n#endif"); */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8631
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8632 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8633 fprintf(fout,"\n{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8634 fprintf(fout,"\n\t(void)type; (void)arrayType; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8635 fprintf(fout, "\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"soap_instantiate_%s(%%d, %%s, %%s)\\n\", n, type?type:\"\", arrayType?arrayType:\"\"));", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8636
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8637 fprintf(fout,"\n\tstruct soap_clist *cp = soap_link(soap, NULL, %s, n, %s_fdelete);", soap_type(typ), prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8638 fprintf(fout,"\n\tif (!cp)\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8639 for (Eptr = classtable->list; Eptr; Eptr = Eptr->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8640 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8641 Tptr = ((Table *) Eptr->info.typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8642 if(Tptr == ((Table *) typ->ref)){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8643 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8644 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8645
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8646 derclass = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8647 while(Tptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8648 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8649 if(Tptr == (Table*)typ->ref){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8650 derclass = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8651 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8652
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8653 Tptr = Tptr->prev;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8654 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8655
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8656 if(derclass == 1 && !is_transient(Eptr->info.typ)){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8657 if (is_dynamic_array(Eptr->info.typ) && !is_binary(Eptr->info.typ) && !has_ns(Eptr->info.typ) && !is_untyped(Eptr->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8658 fprintf(fout,"\n\tif (arrayType && !soap_match_tag(soap, arrayType, \"%s\"))", xsi_type(Eptr->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8659 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8660 fprintf(fout,"\n\tif (type && !soap_match_tag(soap, type, \"%s\"))", the_type(Eptr->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8661 fprintf(fout,"\n\t{\tcp->type = %s;", soap_type(Eptr->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8662 fprintf(fout,"\n\t\tif (n < 0)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8663 fprintf(fout,"\n\t\t{\tcp->ptr = (void*)SOAP_NEW(%s);", c_type(Eptr->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8664 fprintf(fout,"\n\t\t\tif (size)\n\t\t\t\t*size = sizeof(%s);", c_type(Eptr->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8665 if ((s = has_soapref(Eptr->info.typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8666 fprintf(fout,"\n\t\t\t((%s*)cp->ptr)->%s = soap;", c_type(Eptr->info.typ), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8667 fprintf(fout,"\n\t\t}\n\t\telse");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8668 fprintf(fout,"\n\t\t{\tcp->ptr = (void*)SOAP_NEW_ARRAY(%s, n);", c_type(Eptr->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8669 fprintf(fout,"\n\t\t\tif (size)\n\t\t\t\t*size = n * sizeof(%s);", c_type(Eptr->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8670 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8671 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8672 fprintf(fout,"\n\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8673 fprintf(fout,"\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Instantiated location=%%p\\n\", cp->ptr));");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8674 fprintf(fout,"\n\t\tif (!cp->ptr)\n\t\t\tsoap->error = SOAP_EOM;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8675 fprintf(fout,"\n\t\treturn (%s*)cp->ptr;", c_type(Eptr->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8676 fprintf(fout,"\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8677
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8678 derclass = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8679 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8680 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8681
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8682 fprintf(fout,"\n\tif (n < 0)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8683 fprintf(fout,"\n\t{\tcp->ptr = (void*)SOAP_NEW(%s);", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8684 fprintf(fout,"\n\t\tif (size)\n\t\t\t*size = sizeof(%s);", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8685 if ((s = has_soapref(typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8686 fprintf(fout,"\n\t\t((%s*)cp->ptr)->%s = soap;", c_type(typ), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8687 fprintf(fout,"\n\t}\n\telse");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8688 fprintf(fout,"\n\t{\tcp->ptr = (void*)SOAP_NEW_ARRAY(%s, n);", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8689 fprintf(fout,"\n\t\tif (size)\n\t\t\t*size = n * sizeof(%s);", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8690 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8691 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8692 fprintf(fout,"\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8693 fprintf(fout,"\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Instantiated location=%%p\\n\", cp->ptr));");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8694 fprintf(fout,"\n\tif (!cp->ptr)\n\t\tsoap->error = SOAP_EOM;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8695 fprintf(fout,"\n\treturn (%s*)cp->ptr;", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8696
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8697 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8698
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8699 /* fprintf(fout,"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8700 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8701 fprintf(fout,"\n{\n\t(void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8702 fprintf(fout,"\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Copying %s %%p -> %%p\\n\", q, p));", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8703 fprintf(fout,"\n\t*(%s*)p = *(%s*)q;\n}", c_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8704 /* fprintf(fout,"\n#ifdef __cplusplus\n}\n#endif"); */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8705 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8706
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8707 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8708 get_dimension(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8709 { if (((Tnode*)typ->ref)->width)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8710 return typ->width / ((Tnode*) typ->ref)->width;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8711 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8712 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8713
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8714
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8715 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8716 soap_serialize(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8717 { int d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8718 Table *table,*t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8719 Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8720 Tnode* temp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8721 int cardinality;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8722 const char *self;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8723
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8724 if (is_primitive(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8725 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8726
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8727 if (is_typedef(typ) && is_element(typ) && !is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8728 { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8729 fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) (a)->soap_serialize(soap)\n",c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8730 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8731 fprintf(fhead, "\n\n#define soap_serialize_%s soap_serialize_%s\n", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8732 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8733 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8734
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8735 if (is_typedef(typ) && !is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8736 { if (is_imported(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8737 { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) soap_serialize_%s(soap, a)\n", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8738 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8739 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8740 if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8741 { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) (a)->soap_serialize(soap)\n",c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8742 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8743 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8744 /* enabling this will not allow multi-ref detection of these typedef types
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8745 else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8746 { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) soap_serialize_std__string(soap, a)\n", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8747 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8748 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8749 else if (typ->type != Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8750 { fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) soap_serialize_%s(soap, a)\n", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8751 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8752 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8753 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8754 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8755
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8756 if ((p = is_dynamic_array(typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8757 { if (typ->type == Tclass && !is_typedef(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8758 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8759 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8760 fprintf(fout,"\n\nvoid %s::soap_serialize(struct soap *soap) const\n{\n#ifndef WITH_NOIDREF",c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8761 if (is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8762 { if (is_attachment(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8763 { fprintf(fout,"\n\tif (this->__ptr && !soap_array_reference(soap, this, (struct soap_array*)&this->__ptr, 1, %s))", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8764 fprintf(fout,"\n\t\tif (this->id || this->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8765 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8766 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8767 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8768 fprintf(fout,"\n#endif\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8769 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8770 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8771 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8772 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8773 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8774 d = get_Darraydims(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8775 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8776 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8777 fprintf(fout,"\n\t\tfor (int i = 0; i < soap_size(this->__size, %d); i++)", d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8778 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8779 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8780 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8781 fprintf(fout,"\n\t\tfor (int i = 0; i < this->__size; i++)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8782 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8783 fprintf(fout,"\n\t\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8784 if (has_ptr((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8785 fprintf(fout,"\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8786 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8787 fprintf(fout,"\n\t\t\tthis->%s[i].soap_serialize(soap);", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8788 else if (!is_XML((Tnode*)p->info.typ->ref) &&!is_primitive((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8789 fprintf(fout,"\n\t\t\tsoap_serialize_%s(soap, this->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8790 fprintf(fout,"\n\t\t}\n#endif\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8791 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8792 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8793 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8794 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8795 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8796 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "const*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8797 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8798 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8799 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "const*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8800 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8801 if (is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8802 { if (is_attachment(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8803 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8804 fprintf(fout,"\n\t\tif (a->id || a->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8805 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8806 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8807 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8808 fprintf(fout,"\n#endif\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8809 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8810 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8811 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8812 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8813 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8814 fprintf(fout,"\n\tint i;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8815 d = get_Darraydims(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8816 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8817 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8818 fprintf(fout,"\n\t\tfor (i = 0; i < soap_size(a->__size, %d); i++)", d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8819 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8820 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8821 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8822 fprintf(fout,"\n\t\tfor (i = 0; i < a->__size; i++)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8823 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8824 fprintf(fout,"\n\t\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8825 if (has_ptr((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8826 fprintf(fout,"\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8827 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8828 fprintf(fout,"\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8829 else if (!is_XML((Tnode*)p->info.typ->ref) && !is_primitive((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8830 fprintf(fout,"\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8831 fprintf(fout,"\n\t\t}\n#endif\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8832 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8833 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8834 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8835 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8836 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8837 if (is_stdstring(typ) || is_stdwstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8838 { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8839 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8840 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8841 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8842 switch(typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8843 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8844 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8845 if (!is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8846 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8847 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8848 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8849 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8850 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8851 table=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8852 if (!table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8853 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8854 if (!is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8855 { self = "this";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8856 fprintf(fout,"\n\nvoid %s::soap_serialize(struct soap *soap) const\n{\n#ifndef WITH_NOIDREF", ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8857 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8858 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8859 { self = "p";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8860 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8861 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8862 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8863 fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8864 for (p = table->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8865 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8866 if (p->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8867 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8868 else if (is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8869 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8870 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8871 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8872 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8873 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8874 if (!is_XML(p->next->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8875 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8876 fprintf(fout,"\n\tif (%s->%s::%s)", self, ident(table->sym->name), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8877 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8878 if (!is_invisible(p->next->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8879 if (has_ptr((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8880 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8881 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8882 fprintf(fout,"\n\t\t\t%s->%s::%s[i].soap_serialize(soap);", self, ident(table->sym->name), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8883 else if (!is_primitive((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8884 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8885 fprintf(fout,"\n\t\t}\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8886 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8887 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8888 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8889 else if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8890 { fprintf(fout,"\n\tsoap_markelement(soap, %s->%s, %s->%s);", self, ident(p->next->sym->name), self, ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8891 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8892 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8893 else if (is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8894 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8895 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8896 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8897 else if(p->info.typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8898 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8899 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8900 fprintf(fout,"\n\tsoap_embedded(soap, %s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8901 fprintf(fout,"\n\tsoap_serialize_%s(soap, %s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8902 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8903 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8904 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8905 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8906 fprintf(fout,"\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8907 fprintf(fout,"\n\t%s->%s::%s.soap_serialize(soap);", self, ident(table->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8908 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8909 else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8910 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8911 if (!is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8912 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8913 fprintf(fout,"\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8914 if (!is_primitive(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8915 fprintf(fout,"\n\tsoap_serialize_%s(soap, &%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8916 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8917 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8918 t = table->prev;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8919 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8920 fprintf(fout,"\n\t%s->%s::soap_serialize(soap);", self, ident(t->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8921 fprintf(fout,"\n#endif\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8922 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8923 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8924 case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8925
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8926 if (is_external(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8927 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8928 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8929 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8930 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8931 if (!typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8932 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8933 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8934 /* DYNAMIC ARRAY */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8935
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8936 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8937 table=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8938 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8939 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8940 { if (p->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8941 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8942 else if (is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8943 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8944 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8945 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8946 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8947 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8948 if (!is_XML(p->next->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8949 fprintf(fout,"\n\tif (a->%s)", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8950 fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s; i++)\n\t\t{", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8951 if (!is_invisible(p->next->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8952 if (has_ptr((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8953 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8954 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8955 fprintf(fout,"\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8956 else if (!is_primitive((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8957 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8958 fprintf(fout,"\n\t\t}\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8959 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8960 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8961 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8962 else if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8963 { fprintf(fout,"\n\tsoap_markelement(soap, a->%s, a->%s);", ident(p->next->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8964 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8965 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8966 else if (is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8967 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8968 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8969 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8970 else if(p->info.typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8971 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8972 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8973 fprintf(fout,"\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8974 fprintf(fout,"\n\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8975 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8976 else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8977 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8978 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8979 fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8980 fprintf(fout,"\n\ta->%s.soap_serialize(soap);", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8981 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8982 else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8983 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8984 if (!is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8985 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8986 fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8987 if (!is_primitive(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8988 fprintf(fout,"\n\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8989 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8990 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8991 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8992 fprintf(fout,"\n#endif\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8993 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8994
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8995 case Tunion:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8996 if (is_external(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8997 { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8998 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8999 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9000 table=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9001 fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9002 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9003 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9004 fprintf(fout, "\n\tswitch (choice)\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9005 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9006 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9007 { if (p->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9008 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9009 else if (is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9010 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9011 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9012 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9013 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9014 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9015 else if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9016 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9017 else if (p->info.typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9018 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9019 fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9020 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9021 fprintf(fout,"\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9022 fprintf(fout,"\n\t\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9023 fprintf(fout, "\n\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9024 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9025 else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9026 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9027 fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9028 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9029 fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9030 fprintf(fout,"\n\t\ta->%s.soap_serialize(soap);", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9031 fprintf(fout, "\n\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9032 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9033 else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9034 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9035 fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9036 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9037 fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9038 if (!is_primitive(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9039 fprintf(fout,"\n\t\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9040 fprintf(fout, "\n\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9041 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9042 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9043 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9044 fprintf(fout,"\n\tdefault:\n\t\tbreak;\n\t}\n#endif\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9045 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9046 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9047 if (((Tnode*)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9048 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9049 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9050 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9051 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9052 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9053 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9054 p = is_dynamic_array((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9055 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9056 { d = get_Darraydims((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9057 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9058 fprintf(fout,"\n\tif (*a)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9059 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9060 fprintf(fout,"\n\tif (*a)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9061 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9062 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9063 fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9064 fprintf(fout,"\n\t\t(*a)->soap_serialize(soap);\n#endif\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9065 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9066 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9067 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9068 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9069 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9070 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9071 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9072 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9073 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9074 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9075 if (is_string(typ) || is_wstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9076 fprintf(fout,"\n\tsoap_reference(soap, *a, %s);", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9077 else if (is_primitive((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9078 fprintf(fout,"\n\tsoap_reference(soap, *a, %s);", soap_type((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9079 else if ((p = is_dynamic_array((Tnode*)typ->ref)) != NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9080 { d = get_Darraydims((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9081 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9082 fprintf(fout,"\n\tif (*a)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9083 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9084 fprintf(fout,"\n\tif (*a)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9085 fprintf(fout,"\n\t\tsoap_serialize_%s(soap, *a);", c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9086 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9087 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9088 { fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9089 fprintf(fout,"\n\t\tsoap_serialize_%s(soap, *a);", c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9090 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9091 fprintf(fout,"\n#endif\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9092 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9093 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9094 case Tarray:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9095 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9096 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9097 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9098 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9099 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ),c_type_id(typ, "const"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9100 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9101 if (is_primitive((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9102 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9103 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9104 { fprintf(fout,"\n\tint i;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9105 fprintf(fout,"\n\tfor(i = 0; i < %d; i++)", get_dimension(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9106
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9107 temp=(Tnode*)typ->ref;;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9108 cardinality = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9109 while(temp->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9110 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9111 temp=(Tnode*)temp->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9112 cardinality++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9113 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9114 fprintf(fout,"\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9115 if (has_ptr((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9116 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9117 fprintf(fout,"\tsoap_embedded(soap, a");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9118 if(cardinality > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9119 fprintf(fout,"[i]");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9120 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9121 fprintf(fout,"+i");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9122 fprintf(fout,", %s);", soap_type((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9123 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9124 if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9125 { fprintf(fout,"\n\ta[i].soap_serialize(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9126 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9127 else if (!is_primitive((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9128 { fprintf(fout,"\n\tsoap_serialize_%s(soap, a",c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9129 if(cardinality > 1){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9130 fprintf(fout,"[i])");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9131 }else {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9132 fprintf(fout,"+i)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9133 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9134 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9135 fprintf(fout,";\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9136 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9137 fprintf(fout,"\n#endif\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9138 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9139 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9140 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9141 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9142 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9143 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9144 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9145 temp = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9146 if (!temp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9147 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9148 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9149 if (!is_primitive(temp) && !is_XML(temp) && temp->type != Tfun && !is_void(temp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9150 { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9151 if (temp->type==Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9152 fprintf(fout,"\n\t\t(*i).soap_serialize(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9153 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9154 fprintf(fout,"\n\t\tsoap_serialize_%s(soap, &(*i));", c_ident(temp));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9155 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9156 fprintf(fout, "\n#endif\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9157 default: break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9158 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9159 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9160
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9161 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9162 soap_default(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9163 { int i, d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9164 Table *table,*t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9165 Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9166 Tnode *temp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9167 char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9168 int cardinality;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9169
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9170 if (typ->type == Tpointer && !is_string(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9171 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9172
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9173 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9174 { if (is_typedef(typ) && !is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9175 { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9176 fprintf(fhead, "\n\n#define soap_default_%s(soap, a) (a)->%s::soap_default(soap)\n", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9177 else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9178 fprintf(fhead, "\n\n#define soap_default_%s(soap, a) soap_default_std__string(soap, a)\n", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9179 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9180 fprintf(fhead, "\n\n#define soap_default_%s(soap, a) soap_default_%s(soap, a)\n", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9181 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9182 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9183 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9184 p = is_dynamic_array(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9185 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9186 { if (typ->type == Tclass && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9187 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9188 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9189 fprintf(fout,"\n\nvoid %s::soap_default(struct soap *soap)\n{", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9190 if ((s = has_soapref(typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9191 fprintf(fout,"\n\tthis->%s = soap;", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9192 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9193 fprintf(fout,"\n\t(void)soap; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9194 d = get_Darraydims(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9195 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9196 { fprintf(fout,"\n\tthis->%s = NULL;", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9197 for (i = 0; i < d; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9198 { fprintf(fout,"\n\tthis->__size[%d] = 0;", i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9199 if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9200 fprintf(fout, "\n\tthis->__offset[%d] = 0;", i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9201 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9202 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9203 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9204 { fprintf(fout,"\n\tthis->__size = 0;\n\tthis->%s = NULL;", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9205 if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9206 fprintf(fout, "\n\tthis->__offset = 0;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9207 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9208 if (is_attachment(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9209 fprintf(fout,"\n\tthis->id = NULL;\n\tthis->type = NULL;\n\tthis->options = NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9210 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9211 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9212 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9213 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9214 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9215 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9216 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9217 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9218 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9219 if ((s = has_soapref(typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9220 fprintf(fout,"\n\ta->%s = soap;", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9221 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9222 fprintf(fout,"\n\t(void)soap; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9223 d = get_Darraydims(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9224 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9225 { fprintf(fout,"\n\ta->%s = NULL;", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9226 for (i = 0; i < d; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9227 { fprintf(fout,"\n\ta->__size[%d] = 0;", i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9228 if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9229 fprintf(fout, "\n\ta->__offset[%d] = 0;", i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9230 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9231 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9232 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9233 { fprintf(fout,"\n\ta->__size = 0;\n\ta->%s = NULL;", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9234 if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9235 fprintf(fout, "\n\ta->__offset = 0;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9236 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9237 if (is_attachment(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9238 fprintf(fout,"\n\ta->id = NULL;\n\ta->type = NULL;\n\ta->options = NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9239 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9240 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9241 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9242 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9243 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9244 if (is_primitive(typ) || is_string(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9245 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9246 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9247 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9248 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9249 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9250 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9251 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9252 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9253 if (is_fixedstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9254 { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, char[]);",c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9255 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9256 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9257 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9258 if (is_stdstring(typ) || is_stdwstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9259 { fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9260 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9261 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9262 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9263 switch(typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9264 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9265 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9266 /* CLASS */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9267 if (!is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9268 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9269 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9270 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9271 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9272 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9273 table=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9274 fprintf(fout,"\n\nvoid %s::soap_default(struct soap *soap)\n{", ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9275 if ((s = has_soapref(typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9276 fprintf(fout,"\n\tthis->%s = soap;", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9277 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9278 fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9279
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9280 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9281 if (table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9282 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9283 t = table->prev;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9284 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9285 fprintf(fout,"\n\tthis->%s::soap_default(soap);", ident(t->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9286 for (p = table->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9287 { if (p->info.typ->type == Tfun)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9288 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9289 if (p->info.sto & Sconst)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9290 fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9291 else if (is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9292 { fprintf(fout, "\n\tthis->%s::%s = 0;", ident(table->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9293 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9294 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9295 else if (is_repetition(p) || is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9296 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9297 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9298 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9299 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9300 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9301 if (is_fixedstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9302 { if (p->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9303 fprintf(fout,"\n\tstrcpy(this->%s::%s, \"%s\");", ident(table->sym->name), ident(p->sym->name), cstring(p->info.val.s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9304 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9305 fprintf(fout,"\n\tthis->%s::%s[0] = '\\0';", ident(table->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9306 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9307 else if (p->info.typ->type == Tarray){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9308 fprintf(fout,"\n\tsoap_default_%s(soap, this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9309 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9310 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9311 fprintf(fout,"\n\tthis->%s::%s.%s::soap_default(soap);", ident(table->sym->name), ident(p->sym->name), c_ident(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9312 else if (p->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9313 { if (p->info.typ->type == Tpointer && is_stdstring((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9314 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9315 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9316 fprintf(fout,"\n\tthis->%s::%s%s;", ident(table->sym->name), ident(p->sym->name), c_init(p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9317 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9318 else if (is_transient(p->info.typ) || is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9319 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9320 else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9321 fprintf(fout,"\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9322 else if (p->info.sto & (Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9323 { if (p->info.typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9324 fprintf(fout,"\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9325 else if (p->info.typ->type >= Tchar && p->info.typ->type < Tenum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9326 fprintf(fout,"\n\tthis->%s::%s = 0;", ident(table->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9327 else if (p->info.typ->type == Tenum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9328 fprintf(fout,"\n\tthis->%s::%s = (%s)0;", ident(table->sym->name), ident(p->sym->name), c_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9329 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9330 fprintf(fout, "\n\t/* private/protected %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9331 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9332 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9333 fprintf(fout,"\n\tsoap_default_%s(soap, &this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9334 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9335 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9336 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9337 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9338 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9339 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9340 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9341
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9342 case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9343 table=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9344
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9345 if (is_external(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9346 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9347 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9348 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9349 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9350 fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ),c_type_id(typ, "*a"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9351 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9352 if ((s = has_soapref(typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9353 fprintf(fout,"\n\ta->%s = soap;", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9354 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9355 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9356 if (table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9357 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9358 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9359 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9360 { if (p->info.typ->type == Tfun)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9361 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9362 if (p->info.sto & Sconst)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9363 fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9364 else if (p->info.sto & (Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9365 fprintf(fout, "\n\t/* private/protected %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9366 else if (is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9367 { fprintf(fout, "\n\ta->%s = 0;", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9368 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9369 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9370 else if (is_repetition(p) || is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9371 { fprintf(fout, "\n\ta->%s = 0;\n\ta->%s = NULL;", ident(p->sym->name), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9372 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9373 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9374 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9375 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9376 if (is_fixedstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9377 { if (p->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9378 fprintf(fout,"\n\tstrcpy(a->%s, \"%s\");", ident(p->sym->name), cstring(p->info.val.s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9379 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9380 fprintf(fout,"\n\ta->%s[0] = '\\0';", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9381 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9382 else if (p->info.typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9383 fprintf(fout,"\n\tsoap_default_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9384 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9385 fprintf(fout,"\n\ta->%s.%s::soap_default(soap);", ident(p->sym->name), c_ident(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9386 else if (p->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9387 { if (p->info.typ->type == Tpointer && is_stdstring((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9388 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9389 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9390 fprintf(fout,"\n\ta->%s%s;", ident(p->sym->name), c_init(p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9391 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9392 else if (is_transient(p->info.typ) || is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9393 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9394 else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9395 fprintf(fout,"\n\ta->%s = NULL;", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9396 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9397 fprintf(fout,"\n\tsoap_default_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9398 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9399 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9400 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9401 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9402 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9403 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9404 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9405 case Tarray:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9406 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9407 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9408 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9409 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9410 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9411 fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ),c_type_id(typ, "a"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9412 fprintf(fout,"\n\tint i;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9413 fprintf(fout,"\n\t(void)soap; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9414 fprintf(fout,"\n\tfor (i = 0; i < %d; i++)",get_dimension(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9415 temp = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9416 cardinality = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9417 while(temp->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9418 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9419 temp=(Tnode*)temp->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9420 cardinality++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9421 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9422 if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9423 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9424 if (cardinality>1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9425 fprintf(fout,"a[i].%s::soap_default(soap)", t_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9426 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9427 fprintf(fout,"(a+i)->soap_default(soap)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9428 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9429 else if (((Tnode*)typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9430 fprintf(fout,"\n\ta[i] = NULL");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9431 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9432 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9433 fprintf(fout,"\n\tsoap_default_%s(soap, a",c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9434 if (cardinality>1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9435 fprintf(fout,"[i])");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9436 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9437 fprintf(fout,"+i)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9438 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9439 fprintf(fout,";\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9440 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9441
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9442 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9443 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9444 { fprintf(fhead,"\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9445 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9446 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9447 fprintf(fhead,"\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9448 fprintf(fout,"\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{",c_ident(typ),c_type_id(typ, "*p"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9449 fprintf(fout,"\n\tp->clear();");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9450 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9451 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9452 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9453 default :break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9454 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9455 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9456
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9457 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9458 soap_traverse(Tnode* typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9459 { int d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9460 Table *table,*t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9461 Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9462 Tnode* temp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9463 int cardinality;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9464 if (is_primitive_or_string(typ) || is_fixedstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9465 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9466 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9467 fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9468 fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n}", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9469 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9470 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9471 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9472 if (is_typedef(typ) && !is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9473 { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9474 fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) (a)->soap_traverse(soap, s, p, q)\n",c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9475 else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9476 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9477 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9478 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9479 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9480 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9481 if (is_XML(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9482 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9483 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9484 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9485 if ((p = is_dynamic_array(typ)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9486 { if (typ->type == Tclass && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9487 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9488 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9489 fprintf(fout,"\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{",c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9490 if (is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9491 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9492 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9493 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9494 if (is_attachment(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9495 { fprintf(fout,"\n\t\tif (this->id || this->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9496 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9497 fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9498 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9499 fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9500 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this->options, 0, \"options\", NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9501 fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->options, 0, \"options\", NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9502 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9503 fprintf(fout,"\n\t\tif (q) q(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9504 fprintf(fout,"\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9505 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9506 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9507 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9508 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9509 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9510 d = get_Darraydims(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9511 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9512 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9513 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9514 fprintf(fout,"\n\t\tfor (int i = 0; i < soap_size(this->__size, %d); i++)", d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9515 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9516 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9517 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9518 fprintf(fout,"\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9519 fprintf(fout,"\n\t\tfor (int i = 0; i < this->__size; i++)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9520 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9521 fprintf(fout,"\n\t\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9522 if (has_ptr((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9523 fprintf(fout,"\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9524 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9525 fprintf(fout,"\n\t\t\tthis->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9526 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9527 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9528 fprintf(fout,"\n\t\t}\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9529 fprintf(fout,"\n\t}\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9530 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9531 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9532 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9533 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9534 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9535 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9536 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9537 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9538 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9539 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9540 if (is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9541 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9542 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9543 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9544 if (is_attachment(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9545 { fprintf(fout,"\n\t\tif (a->id || a->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9546 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9547 fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9548 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9549 fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9550 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a->options, 0, \"options\", NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9551 fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->options, 0, \"options\", NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9552 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9553 fprintf(fout,"\n\t\tif (q) q(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9554 fprintf(fout,"\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9555 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9556 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9557 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9558 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9559 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9560 fprintf(fout,"\n\tint i;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9561 d = get_Darraydims(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9562 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9563 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9564 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9565 fprintf(fout,"\n\t\tfor (i = 0; i < soap_size(a->__size, %d); i++)", d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9566 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9567 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9568 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9569 fprintf(fout,"\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9570 fprintf(fout,"\n\t\tfor (i = 0; i < a->__size; i++)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9571 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9572 fprintf(fout,"\n\t\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9573 if (has_ptr((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9574 fprintf(fout,"\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9575 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9576 fprintf(fout,"\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9577 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9578 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9579 fprintf(fout,"\n\t\t}\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9580 fprintf(fout,"\n\t}\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9581 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9582 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9583 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9584 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9585 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9586 switch(typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9587 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9588 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9589 if (!is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9590 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9591 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9592 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9593 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9594 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9595 table=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9596 fprintf(fout,"\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{", ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9597 fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9598 fprintf(fout,"\n\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9599 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9600 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9601 for (p = t->list; p; p = p->next) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9602 if (p->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9603 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9604 else if (is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9605 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9606 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9607 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9608 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9609 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9610 fprintf(fout,"\n\tif (this->%s::%s)", ident(t->sym->name), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9611 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9612 if (!is_invisible(p->next->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9613 if (has_ptr((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9614 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9615 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9616 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9617 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9618 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9619 fprintf(fout,"\n\t\t}\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9620 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9621 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9622 else if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9623 { p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9624 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9625 else if (is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9626 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9627 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9628 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9629 else if(p->info.typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9630 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9631 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9632 fprintf(fout,"\n\tsoap_embedded(soap, this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9633 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9634 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9635 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9636 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9637 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9638 fprintf(fout,"\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9639 fprintf(fout,"\n\tthis->%s::%s.soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->sym->name), p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9640 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9641 else if (p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9642 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9643 if (!is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9644 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9645 fprintf(fout,"\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9646 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9647 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9648 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9649 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9650 fprintf(fout,"\n\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9651 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9652 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9653 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9654 case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9655 if (is_external(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9656 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9657 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9658 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9659 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9660 if (!typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9661 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9662 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9663 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9664 fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9665 table=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9666 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9667 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9668 { if (p->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9669 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9670 else if (is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9671 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9672 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9673 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9674 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9675 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9676 fprintf(fout,"\n\tif (a->%s)", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9677 fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s; i++)\n\t\t{", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9678 if (!is_invisible(p->next->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9679 if (has_ptr((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9680 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9681 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9682 fprintf(fout,"\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->next->sym->name), p->next->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9683 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9684 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9685 fprintf(fout,"\n\t\t}\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9686 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9687 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9688 else if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9689 { p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9690 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9691 else if (is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9692 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9693 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9694 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9695 else if(p->info.typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9696 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9697 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9698 fprintf(fout,"\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9699 fprintf(fout,"\n\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9700 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9701 else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9702 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9703 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9704 fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9705 fprintf(fout,"\n\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9706 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9707 else if (p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9708 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9709 if (!is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9710 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9711 fprintf(fout,"\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9712 fprintf(fout,"\n\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9713 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9714 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9715 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9716 fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9717 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9718 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9719 case Tunion:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9720 if (is_external(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9721 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9722 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9723 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9724 table=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9725 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9726 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9727 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9728 fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9729 fprintf(fout, "\n\tswitch (choice)\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9730 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9731 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9732 { if (p->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9733 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9734 else if (is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9735 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9736 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9737 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9738 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9739 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9740 else if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9741 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9742 else if (p->info.typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9743 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9744 fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9745 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9746 fprintf(fout,"\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9747 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9748 fprintf(fout, "\n\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9749 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9750 else if(p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9751 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9752 fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9753 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9754 fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9755 fprintf(fout,"\n\t\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9756 fprintf(fout, "\n\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9757 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9758 else if (p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9759 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9760 fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9761 if (has_ptr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9762 fprintf(fout,"\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9763 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9764 fprintf(fout, "\n\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9765 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9766 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9767 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9768 fprintf(fout,"\n\tdefault:\n\t\tbreak;\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9769 fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9770 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9771 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9772 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9773 if (((Tnode*)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9774 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9775 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9776 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9777 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9778 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9779 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9780 p = is_dynamic_array((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9781 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9782 { d = get_Darraydims((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9783 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9784 fprintf(fout,"\n\tif (*a)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9785 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9786 fprintf(fout,"\n\tif (*a)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9787 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9788 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9789 fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9790 fprintf(fout,"\n\t\t(*a)->soap_traverse(soap, s, p, q);\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9791 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9792 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9793 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9794 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9795 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9796 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9797 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9798 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9799 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9800 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9801 if (is_primitive((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9802 { fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))\n\t{", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9803 fprintf(fout,"\n\t\tif (p) p(soap, (void*)*a, %s, s, \"%s\");", soap_type(typ->ref), c_type(typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9804 fprintf(fout,"\n\t\tif (q) q(soap, (void*)*a, %s, s, \"%s\");\n\t}\n}", soap_type(typ->ref), c_type(typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9805 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9806 else if ((p = is_dynamic_array((Tnode*)typ->ref)) != NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9807 { d = get_Darraydims((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9808 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9809 fprintf(fout,"\n\tif (*a)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9810 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9811 fprintf(fout,"\n\tif (*a)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9812 fprintf(fout,"\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9813 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9814 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9815 { fprintf(fout,"\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9816 fprintf(fout,"\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9817 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9818 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9819 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9820 case Tarray:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9821 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9822 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9823 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9824 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9825 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9826 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9827 if (is_primitive((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9828 { fprintf(fout, "\n{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9829 fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9830 fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9831 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9832 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9833 { fprintf(fout,"\n{\tint i;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9834 fprintf(fout,"\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9835 fprintf(fout,"\n\tfor(i = 0; i < %d; i++)", get_dimension(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9836
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9837 temp=(Tnode*)typ->ref;;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9838 cardinality = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9839 while(temp->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9840 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9841 temp=(Tnode*)temp->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9842 cardinality++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9843 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9844 fprintf(fout,"\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9845 if (has_ptr((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9846 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9847 fprintf(fout,"\tsoap_embedded(soap, a");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9848 if(cardinality > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9849 fprintf(fout,"[i]");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9850 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9851 fprintf(fout,"+i");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9852 fprintf(fout,", %s);", soap_type((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9853 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9854 if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9855 { fprintf(fout,"\n\ta[i].soap_traverse(soap, s, p, q)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9856 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9857 else if (!is_primitive((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9858 { fprintf(fout,"\n\tsoap_traverse_%s(soap, a",c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9859 if(cardinality > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9860 fprintf(fout,"[i], s, p, q)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9861 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9862 fprintf(fout,"+i, s, p, q)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9863 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9864 fprintf(fout,";\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9865 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9866 fprintf(fout,"\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9867 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9868 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9869 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9870 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9871 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9872 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9873 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9874 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9875 temp = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9876 if (!temp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9877 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9878 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9879 if (!is_primitive(temp) && temp->type != Tfun && !is_void(temp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9880 { fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9881 fprintf(fout, "\n\tfor (%s::iterator i = a->begin(); i != a->end(); ++i)", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9882 if (temp->type==Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9883 fprintf(fout,"\n\t\t(*i).soap_traverse(soap, s, p, q);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9884 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9885 fprintf(fout,"\n\t\tsoap_traverse_%s(soap, &(*i), s, p, q);", c_ident(temp));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9886 fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9887 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9888 fprintf(fout, "\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9889 default: break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9890 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9891 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9892
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9893 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9894 soap_put(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9895 { int d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9896 Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9897 char *ci = c_ident(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9898 char *ct = c_type(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9899 char *ctp = c_type_id(typ, "*");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9900 char *ctpa = c_type_id(typ, "*a");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9901 char *ctc = c_type_id(typ, "const");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9902 char *ctca = c_type_id(typ, "const a");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9903 char *ctcp = c_type_id(typ, "const*");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9904 char *ctcpa = c_type_id(typ, "const*a");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9905
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9906 if (typ->type == Ttemplate || typ->type == Tunion)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9907 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9908
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9909 if (is_typedef(typ) && is_element(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9910 { fprintf(fhead, "\n\n#define soap_put_%s soap_put_%s\n", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9911 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9912 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9913
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9914 if (typ->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9915 { fprintf(fhead,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci,ctc);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9916 fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci,ctca);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9917 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9918 else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9919 fprintf(fout,"\n\nint %s::soap_put(struct soap *soap, const char *tag, const char *type) const\n{", ct);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9920 else if (typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9921 { fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci,ctcp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9922 fprintf(fout,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci,ctcpa);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9923 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9924 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9925 { fprintf(fhead,"\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, const %s, const char*, const char*);", ci,ctp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9926 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9927 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9928 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9929 fprintf(fout,"\n\tregister int id = ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9930 if (is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9931 fprintf(fout,"0;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9932 else if ((p = is_dynamic_array(typ)) != NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9933 { d = get_Darraydims(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9934 if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9935 { if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9936 fprintf(fout,"soap_embed(soap, (void*)this, (struct soap_array*)&this->%s, %d, tag, %s);", ident(p->sym->name), d, soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9937 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9938 fprintf(fout,"soap_embed(soap, (void*)this, (struct soap_array*)&this->%s, 1, tag, %s);", ident(p->sym->name), soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9939 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9940 else if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9941 fprintf(fout,"soap_embed(soap, (void*)a, (struct soap_array*)&a->%s, %d, tag, %s);", ident(p->sym->name), d, soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9942 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9943 fprintf(fout,"soap_embed(soap, (void*)a, (struct soap_array*)&a->%s, 1, tag, %s);", ident(p->sym->name), soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9944 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9945 else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9946 fprintf(fout,"soap_embed(soap, (void*)this, NULL, 0, tag, %s);", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9947 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9948 fprintf(fout,"soap_embed(soap, (void*)a, NULL, 0, tag, %s);", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9949 if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9950 fprintf(fout,"\n\tif (this->soap_out(soap, tag?tag:\"%s\", id, type))\n\t\treturn soap->error;", xml_tag(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9951 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9952 fprintf(fout,"\n\tif (soap_out_%s(soap, tag?tag:\"%s\", id, a, type))\n\t\treturn soap->error;", ci, xml_tag(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9953 if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9954 fprintf(fout,"\n\treturn soap_putindependent(soap);\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9955 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9956 fprintf(fout,"\n\treturn SOAP_OK;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9957 #if 0
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9958 /* some compilers cannot handle this inlined function */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9959 if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9960 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9961 else if (typ->type != Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9962 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9963 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9964 if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9965 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9966 else if (is_primitive(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9967 { if ((!is_external(typ) || Qflag) && namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9968 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9969 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9970 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9971 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9972 else if (typ->type != Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9973 { if (((!is_external(typ) && !is_volatile(typ)) || Qflag) && namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9974 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9975 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9976 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9977 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9978 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9979 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9980
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9981 Entry *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9982 is_dynamic_array(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9983 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9984 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9985 if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9986 { for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9987 { p = t->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9988 while (p && p->info.typ->type == Tfun)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9989 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9990 if (p && p->info.typ->type == Tpointer && !strncmp(ident(p->sym->name), "__ptr", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9991 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"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9992 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9993 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9994 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9995 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9996 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9997
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9998 Entry *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9999 is_discriminant(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10000 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10001 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10002 if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10003 { t = (Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10004 /* only if this struct/class has a union and is not derived */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10005 if (t && !t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10006 { p = t->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10007 if (p && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(ident(p->sym->name), "__union", 7)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10008 if (p->next && p->next->info.typ->type == Tunion)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10009 { Entry *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10010 for (q = p->next->next; q; q = q->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10011 { if (q->info.typ->type != Tfun
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10012 && !is_void(q->info.typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10013 && !is_transient(q->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10014 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10015 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10016 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10017 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10018 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10019 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10020 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10021 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10022
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10023 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10024 get_Darraydims(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10025 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10026 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10027 if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10028 { for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10029 { p = t->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10030 while (p && p->info.typ->type == Tfun)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10031 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10032 if (p && p->info.typ->type == Tpointer && !strncmp(ident(p->sym->name), "__ptr", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10033 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"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10034 return get_dimension(p->next->info.typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10035 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10036 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10037 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10038 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10039
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10040 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10041 has_offset(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10042 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10043 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10044 if (typ->type == Tstruct || typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10045 { for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10046 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10047 { if ((p->info.typ->type == Tint || (p->info.typ->type == Tarray && ((Tnode*)p->info.typ->ref)->type == Tint)) && !strcmp(ident(p->sym->name), "__offset"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10048 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10049 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10050 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10051 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10052 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10053 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10054
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10055 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10056 is_boolean(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10057 { if (typ->type == Tenum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10058 { if ((Table*)typ->ref == booltable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10059 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10060 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10061 { size_t n = strlen(ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10062 return n >= 7 && is_eq(ident(typ->id->name) + n - 7, "boolean");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10063 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10064 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10065 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10066 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10067
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10068 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10069 is_hexBinary(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10070 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10071 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10072 size_t n = strlen(ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10073 if ((typ->type == Tstruct || typ->type == Tclass) && n >= 9 && is_eq(ident(typ->id->name) + n - 9, "hexBinary"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10074 { for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10075 { p = t->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10076 while (p && p->info.typ->type == Tfun)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10077 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10078 if (p && p->info.typ->type == Tpointer && ((Tnode*)p->info.typ->ref)->type == Tuchar && !strcmp(ident(p->sym->name), "__ptr"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10079 { p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10080 return p && (p->info.typ->type == Tint || p->info.typ->type == Tuint) && !strcmp(ident(p->sym->name), "__size");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10081 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10082 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10083 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10084 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10085 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10086
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10087 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10088 is_binary(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10089 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10090 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10091 if (!has_ns(typ) && !is_element(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10092 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10093 if (typ->type == Tstruct || typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10094 { for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10095 { p = t->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10096 while (p && p->info.typ->type == Tfun)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10097 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10098 if (p && p->info.typ->type == Tpointer && ((Tnode*)p->info.typ->ref)->type == Tuchar && !strcmp(ident(p->sym->name), "__ptr"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10099 { p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10100 return p && (p->info.typ->type == Tint || p->info.typ->type == Tuint) && !strcmp(ident(p->sym->name), "__size");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10101 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10102 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10103 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10104 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10105 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10106
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10107 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10108 is_attachment(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10109 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10110 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10111 if (!is_binary(typ) || is_transient(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10112 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10113 for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10114 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10115 { if (is_string(p->info.typ) && !strcmp(p->sym->name, "id"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10116 { p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10117 if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "type"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10118 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10119 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10120 if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "options"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10121 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10122 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10123 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10124 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10125 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10126 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10127 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10128
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10129 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10130 has_attachment(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10131 { if (is_attachment(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10132 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10133 if (typ->type == Tstruct || typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10134 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10135 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10136 for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10137 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10138 if (has_attachment(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10139 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10140 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10141 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10142 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10143 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10144
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10145 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10146 is_mutable(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10147 { return is_header_or_fault(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10148 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10149
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10150 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10151 is_header_or_fault(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10152 { if (typ->type == Tpointer || typ->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10153 return is_header_or_fault((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10154 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10155 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10156
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10157 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10158 is_body(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10159 { if (typ->type == Tpointer || typ->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10160 return is_body((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10161 return (typ->type == Tstruct || typ->type == Tclass) && !strcmp(ident(typ->id->name), "SOAP_ENV__Body");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10162 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10163
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10164 long
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10165 minlen(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10166 { if (typ->minLength < 0 || (typ->maxLength >> 31) != 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10167 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10168 return (long)typ->minLength;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10169 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10170
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10171 long
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10172 maxlen(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10173 { if (typ->maxLength < 0 || (typ->maxLength >> 31) != 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10174 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10175 return (long)typ->maxLength;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10176 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10177
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10178 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10179 is_soap12(const char *enc)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10180 { return !strcmp(envURI, "http://www.w3.org/2003/05/soap-envelope") || (enc && !strcmp(enc, "http://www.w3.org/2003/05/soap-encoding"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10181 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10182
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10183 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10184 is_document(const char *style)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10185 { return vflag < 0 || (!eflag && !style) || (style && !strcmp(style, "document"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10186 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10187
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10188 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10189 is_literal(const char *encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10190 { return vflag < 0 || (!eflag && !encoding) || (encoding && !strcmp(encoding, "literal"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10191 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10192
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10193 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10194 has_soapref(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10195 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10196 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10197 if (typ->type == Tstruct || typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10198 { for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10199 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10200 if (p->info.typ->type == Tpointer && ((Tnode*)p->info.typ->ref)->type == Tstruct && ((Tnode*)p->info.typ->ref)->id == lookup("soap"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10201 return ident(p->sym->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10202 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10203 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10204 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10205 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10206
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10207 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10208 has_constructor(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10209 { Entry *p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10210 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10211 if (typ->type == Tclass || typ->type == Tstruct)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10212 for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10213 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10214 if (p->info.typ->type == Tfun && !strcmp(p->sym->name, typ->id->name) && ((FNinfo *)p->info.typ->ref)->ret->type == Tnone)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10215 { q = ((FNinfo*)p->info.typ->ref)->args->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10216 if (!q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10217 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10218 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10219 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10220 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10221
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10222 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10223 has_destructor(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10224 { Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10225 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10226 if (typ->type == Tclass || typ->type == Tstruct)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10227 for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10228 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10229 if (p->info.typ->type == Tfun && *p->sym->name == '~')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10230 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10231 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10232 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10233
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10234 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10235 has_getter(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10236 { Entry *p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10237 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10238 if (typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10239 for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10240 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10241 if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "get") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10242 { q = ((FNinfo*)p->info.typ->ref)->args->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10243 if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10244 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10245 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10246 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10247 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10248
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10249 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10250 has_setter(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10251 { Entry *p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10252 Table *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10253 if (typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10254 for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10255 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10256 if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "set") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10257 { q = ((FNinfo*)p->info.typ->ref)->args->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10258 if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10259 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10260 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10261 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10262 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10263
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10264 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10265 is_primitive_or_string(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10266 { return is_primitive(typ) || is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ) || is_qname(typ) || is_stdqname(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10267 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10268
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10269 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10270 is_primitive(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10271 { return typ->type <= Tenum;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10272 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10273
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10274 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10275 is_string(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10276 { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Tchar && !((Tnode*)typ->ref)->sym;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10277 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10278
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10279 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10280 is_fixedstring(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10281 { return bflag && typ->type == Tarray && ((Tnode*)typ->ref)->type == Tchar;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10282 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10283
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10284 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10285 is_wstring(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10286 { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Twchar && !((Tnode*)typ->ref)->sym;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10287 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10288
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10289 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10290 is_stdstring(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10291 { return typ->type == Tclass && typ->id == lookup("std::string");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10292 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10293
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10294 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10295 is_stdwstring(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10296 { return typ->type == Tclass && typ->id == lookup("std::wstring");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10297 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10298
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10299 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10300 is_stdstr(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10301 { if (typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10302 return is_stdstring((Tnode*)typ->ref) || is_stdwstring((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10303 return is_stdstring(typ) || is_stdwstring(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10304 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10305
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10306 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10307 is_typedef(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10308 { return typ->sym && !is_transient(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10309 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10310
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10311 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10312 reflevel(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10313 { int level;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10314 for (level = 0; typ->type == Tpointer; level++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10315 typ = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10316 return level;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10317 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10318
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10319 Tnode *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10320 reftype(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10321 { while ((typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) || typ->type == Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10322 typ = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10323 return typ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10324 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10325
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10326 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10327 soap_set_attr(Entry *p, char *obj, char *name, char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10328 { Tnode *typ = p->info.typ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10329 int flag = (p->info.minOccurs == 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10330 if (is_external(typ) && !is_anyAttribute(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10331 fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10332 else if (is_qname(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10333 fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s), 1);", obj, name, tag, obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10334 else if (is_string(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10335 fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", %s->%s, 1);", obj, name, tag, obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10336 else if (is_wstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10337 fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s), 2);", obj, name, tag, obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10338 else if (is_stdqname(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10339 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10340 else if (is_stdstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10341 { if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10342 fprintf(fout, "\n\tif (!%s->%s.empty())", obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10343 fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", %s->%s.c_str(), 1);", tag, obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10344 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10345 else if (is_stdwstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10346 { if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10347 fprintf(fout, "\n\tif (!%s->%s.empty())", obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10348 fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s.c_str()), 2);", tag, obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10349 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10350 else if (typ->type == Tllong || typ->type == Tullong)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10351 fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_type(typ), obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10352 else if (typ->type == Tenum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10353 fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10354 else if (typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10355 { Tnode *ptr = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10356 fprintf(fout, "\n\tif (%s->%s)", obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10357 if (is_external(ptr) && !is_anyAttribute(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10358 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10359 else if (is_qname(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10360 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10361 else if (is_string(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10362 fprintf(fout, "\n\t\tif (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", *%s->%s, 1);", obj, name, tag, obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10363 else if (ptr->type == Tllong || ptr->type == Tullong)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10364 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_type(ptr), obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10365 else if (ptr->type == Tenum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10366 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10367 else if (is_stdqname(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10368 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s->c_str()), 1);", tag, obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10369 else if (is_stdstring(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10370 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", %s->%s->c_str(), 1);", tag, obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10371 else if (is_stdwstring(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10372 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s->c_str()), 2);", tag, obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10373 else if (is_primitive(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10374 fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, the_type(ptr), obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10375 else if (is_hexBinary(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10376 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10377 else if (is_binary(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10378 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10379 else if (is_anyAttribute(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10380 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10381 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10382 { sprintf(errbuf, "Field '%s' cannot be serialized as an XML attribute", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10383 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10384 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10385 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10386 else if (is_primitive(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10387 fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, the_type(typ), obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10388 else if (is_hexBinary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10389 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10390 else if (is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10391 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10392 else if (is_anyAttribute(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10393 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10394 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10395 { sprintf(errbuf, "Field '%s' cannot be serialized as an XML attribute", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10396 semwarn(errbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10397 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10398 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10399
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10400 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10401 soap_attr_value(Entry *p, char *obj, char *name, char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10402 { int flag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10403 Tnode *typ = p->info.typ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10404 if (p->info.maxOccurs == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10405 flag = 2; /* prohibited */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10406 else if (p->info.minOccurs >= 1 && !p->info.hasval)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10407 flag = 1; /* required */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10408 if (is_external(typ) && !is_anyAttribute(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10409 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10410 else if (typ->type == Tllong || typ->type == Tullong)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10411 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10412 else if (typ->type == Tenum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10413 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10414 else if (is_qname(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10415 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10416 else if (is_string(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10417 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10418 else if (is_wstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10419 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10420 else if (is_stdqname(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10421 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10422 else if (is_stdstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10423 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10424 else if (is_stdwstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10425 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10426 else if (typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10427 { Tnode *ptr = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10428 if (!is_anyAttribute(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10429 fprintf(fout, "\n\t{\tconst char *t = soap_attr_value(soap, \"%s\", %d);\n\t\tif (t)\n\t\t{", tag, flag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10430 if (!is_stdstring(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10431 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10432 if (is_external(ptr) && !is_anyAttribute(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10433 fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\t\treturn NULL;", c_ident(ptr), obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10434 else if (ptr->type == Tllong || ptr->type == Tullong)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10435 fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\treturn NULL;", c_type(ptr), obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10436 else if (ptr->type == Tenum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10437 fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\treturn NULL;", c_ident(ptr), obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10438 else if (is_qname(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10439 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10440 else if (is_string(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10441 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10442 else if (is_stdqname(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10443 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10444 else if (is_stdstring(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10445 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10446 else if (is_stdwstring(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10447 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10448 else if (is_hexBinary(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10449 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10450 else if (is_binary(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10451 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10452 else if (is_anyAttribute(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10453 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10454 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10455 fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s))\n\t\t\t\treturn NULL;", the_type(ptr), obj, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10456 if (!is_anyAttribute(ptr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10457 fprintf(fout, "\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10458 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10459 else if (is_hexBinary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10460 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10461 else if (is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10462 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10463 else if (is_anyAttribute(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10464 fprintf(fout, "\n\tsoap_in_%s(soap, \"%s\", &%s->%s, \"%s\");", c_ident(typ), tag, obj, name, xsi_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10465 else if (is_primitive(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10466 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10467 if (typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10468 { if (!is_string(typ) && !is_wstring(typ) && !is_stdstr(typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10469 { Tnode *ptr = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10470 if (ptr->type <= Tenum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10471 { if (ptr->minLength != MINLONG64 && (ptr->minLength > 0 || ptr->type < Tuchar || ptr->type > Tullong))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10472 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10473 if (ptr->maxLength != MAXLONG64)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10474 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10475 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10476 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10477 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10478 else if (typ->type <= Tenum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10479 { if (typ->minLength != MINLONG64 && (typ->minLength > 0 || typ->type < Tuchar || typ->type > Tullong))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10480 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10481 if (typ->maxLength != MAXLONG64)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10482 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10483 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10484 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10485
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10486 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10487 ptr_cast(Table *t, char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10488 { char *s = emalloc(strlen(t->sym->name) + strlen(name) + 6);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10489 sprintf(s, "((%s*)%s)", t->sym->name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10490 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10491 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10492
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10493 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10494 soap_out(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10495 { Table *table,*t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10496 Entry *p = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10497 int cardinality,i,j,d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10498 Tnode *n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10499 char *nse = ns_qualifiedElement(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10500 char *nsa = ns_qualifiedAttribute(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10501
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10502 if (is_dynamic_array(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10503 { soap_out_Darray(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10504 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10505 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10506
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10507 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10508 fprintf(fhead, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10509
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10510 if (is_typedef(typ) && is_element(typ) && !is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10511 { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10512 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10513 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10514
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10515 if (is_primitive(typ) && typ->type != Tenum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10516 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10517 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10518 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10519 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10520 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10521 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10522 if (typ->type == Tllong || typ->type == Tullong)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10523 fprintf(fout,"\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", c_type(typ), soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10524 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10525 fprintf(fout,"\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", the_type(typ), soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10526 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10527 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10528 if (is_fixedstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10529 { fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const char[], const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10530 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10531 fprintf(fout,"\n\treturn soap_outstring(soap, tag, id, (char*const*)&a, type, %s);\n}", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10532 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10533 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10534 if (is_string(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10535 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10536 { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10537 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10538 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10539 fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10540 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10541 fprintf(fout,"\n\treturn soap_outstring(soap, tag, id, a, type, %s);\n}", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10542 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10543 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10544 if (is_wstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10545 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10546 { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10547 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10548 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10549 fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10550 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10551 fprintf(fout,"\n\treturn soap_outwstring(soap, tag, id, a, type, %s);\n}", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10552 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10553 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10554 if (is_stdstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10555 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10556 { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10557 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10558 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10559 fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10560 if (is_stdXML(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10561 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10562 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10563 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10564 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10565 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10566 if (is_stdwstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10567 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10568 { fprintf(fhead,"\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10569 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10570 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10571 fprintf(fhead,"\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10572 if (is_stdXML(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10573 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10574 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10575 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10576 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10577 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10578 switch(typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10579 { case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10580 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10581 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10582 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10583 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10584 table=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10585 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10586 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10587 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10588 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10589 { if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10590 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10591 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10592 soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10593 else if (is_qname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10594 fprintf(fout,"\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10595 else if (is_stdqname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10596 fprintf(fout,"\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10597 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10598 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10599 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10600 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10601 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10602 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10603 fprintf(fout,"\n\t(void)soap; (void)tag; (void)id; (void)type;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10604 if (is_primclass(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10605 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10606 for (table = (Table*)typ->ref; table; table = table->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10607 { p = table->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10608 if (p && is_item(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10609 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10610 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10611 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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10612 fprintf(fout, "\n\tsoap->mustUnderstand = 1;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10613 if(p->info.typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10614 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10615 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10616 fprintf(fout,"\n\treturn a->%s.soap_out(soap, tag, id, \"%s\");", ident(p->sym->name), xsi_type_u(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10617 else if (is_qname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10618 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10619 else if (is_stdqname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10620 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10621 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10622 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10623 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10624 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10625 else if (is_XML(p->info.typ) && is_string(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10626 fprintf(fout,"\n\treturn soap_outliteral(soap, tag, &a->%s, NULL);", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10627 else if (is_XML(p->info.typ) && is_wstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10628 fprintf(fout,"\n\treturn soap_outwliteral(soap, tag, &a->%s, NULL);", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10629 else if (p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10630 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10631 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10632 fprintf(fout,"\n\treturn SOAP_OK;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10633 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10634 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10635 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10636 { if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10637 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10638 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10639 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10640 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10641 { if (p->info.sto & Sreturn)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10642 { if (nse || has_ns_eq(NULL, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10643 { if (p->info.typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10644 fprintf(fout,"\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10645 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10646 fprintf(fout,"\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10647 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10648 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10649 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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10650 fprintf(fout, "\n\tsoap->mustUnderstand = 1;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10651 needs_lang(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10652 if (p->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10653 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10654 else if (is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10655 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10656 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10657 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10658 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10659 { fprintf(fout,"\n\tif (a->%s)", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10660 fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s; i++)", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10661 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10662 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10663 else if (is_qname((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10664 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10665 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10666 fprintf(fout,"\n\t\t\tsoap_outliteral(soap, \"%s\", a->%s + i, NULL);", ns_add(p->next, nse), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10667 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10668 fprintf(fout,"\n\t\t\tsoap_outwliteral(soap, \"%s\", a->%s + i, NULL);", ns_add(p->next, nse), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10669 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10670 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10671 fprintf(fout,"\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10672 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10673 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10674 else if (is_anytype(p) && is_invisible(p->next->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10675 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10676 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10677 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10678 else if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10679 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10680 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10681 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10682 else if (is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10683 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10684 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10685 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10686 else if (p->info.typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10687 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10688 else if (p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10689 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10690 else if (is_qname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10691 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10692 else if (is_stdqname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10693 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10694 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10695 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10696 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10697 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10698 else if (is_XML(p->info.typ) && is_string(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10699 fprintf(fout,"\n\tsoap_outliteral(soap, %s, &a->%s, NULL);", field(p, nse), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10700 else if (is_XML(p->info.typ) && is_wstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10701 fprintf(fout,"\n\tsoap_outwliteral(soap, %s, &a->%s, NULL);", field(p, nse), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10702 else if (p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10703 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10704 else if (p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10705 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10706 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10707 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10708 if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10709 fprintf(fout,"\n\treturn soap_element_end_out(soap, tag);\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10710 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10711 fprintf(fout,"\n\treturn SOAP_OK;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10712 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10713 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10714 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10715
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10716 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10717 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10718 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10719 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10720 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10721 table=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10722 if (!is_volatile(typ) && !is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10723 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10724 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10725 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10726 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10727 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10728 fprintf(fout,"\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", ident(typ->id->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10729 fprintf(fout,"\n{\n\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10730 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10731 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10732 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10733 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10734 if (has_setter(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10735 fprintf(fout, "\n\t((%s)a)->set(soap);", c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10736 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10737 { Entry *e = entry(classtable, t->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10738 char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10739 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10740 { if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10741 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10742 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10743 soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10744 else if (is_qname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10745 fprintf(fout,"\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10746 else if (is_stdqname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10747 fprintf(fout,"\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10748 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10749 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10750 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10751 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10752 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10753 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10754 if (is_primclass(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10755 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10756 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10757 { p = t->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10758 if (p && is_item(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10759 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10760 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10761 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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10762 fprintf(fout, "\n\tsoap->mustUnderstand = 1;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10763 if (table->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10764 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10765 if (is_XML(p->info.typ) && is_string(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10766 fprintf(fout,"\n\treturn soap_outliteral(soap, tag, &(a->%s::%s), \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10767 else if (is_XML(p->info.typ) && is_wstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10768 fprintf(fout,"\n\treturn soap_outwliteral(soap, tag, &(a->%s::%s), \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10769 else if(p->info.typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10770 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10771 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10772 fprintf(fout,"\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10773 else if (is_qname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10774 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10775 else if (is_stdqname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10776 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10777 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10778 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10779 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10780 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10781 else if (p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10782 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10783 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10784 fprintf(fout,"\n\treturn SOAP_OK;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10785 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10786 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10787 { if (is_XML(p->info.typ) && is_string(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10788 fprintf(fout,"\n\treturn soap_outliteral(soap, tag, &(a->%s::%s), NULL);", ident(t->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10789 else if (is_XML(p->info.typ) && is_wstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10790 fprintf(fout,"\n\treturn soap_outwliteral(soap, tag, &(a->%s::%s), NULL);", ident(t->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10791 else if(p->info.typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10792 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10793 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10794 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10795 else if (is_qname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10796 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10797 else if (is_stdqname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10798 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10799 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10800 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10801 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10802 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10803 else if (p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10804 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10805 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10806 fprintf(fout,"\n\treturn SOAP_OK;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10807 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10808 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10809 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10810 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10811 { if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10812 { if (table && table->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10813 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10814 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10815 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10816 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10817 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10818
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10819 i=0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10820 /* Get the depth of the inheritance hierarchy */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10821 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10822 i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10823
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10824 /* Call routines to output the member data of the class */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10825 /* Data members of the Base Classes are outputed first
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10826 followed by the data members of the Derived classes.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10827 Overridden data members are output twice once for the base class
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10828 they are defined in and once for the derived class that overwrites
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10829 them */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10830
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10831 for (; i > 0; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10832 { Entry *e;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10833 char *nse1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10834 t = table;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10835 for (j = 0; j< i-1; j++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10836 t = t->prev;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10837 e = entry(classtable, t->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10838 nse1 = e ? ns_qualifiedElement(e->info.typ) : nse;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10839 for (p = t->list; p != (Entry*) 0; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10840 { if (p->info.sto & Sreturn)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10841 { if (nse1 || has_ns_eq(NULL, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10842 { if (p->info.typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10843 fprintf(fout,"\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10844 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10845 fprintf(fout,"\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10846 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10847 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10848 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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10849 fprintf(fout, "\n\tsoap->mustUnderstand = 1;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10850 needs_lang(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10851 if (is_item(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10852 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10853 else if (p->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10854 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10855 else if (is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10856 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10857 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10858 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10859 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10860 { fprintf(fout,"\n\tif (a->%s::%s)", ident(t->sym->name), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10861 fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < a->%s::%s; i++)", ident(t->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10862 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10863 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10864 else if (is_qname((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10865 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10866 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10867 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10868 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10869 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10870 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10871 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10872 fprintf(fout,"\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10873 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10874 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10875 else if (is_anytype(p) && is_invisible(p->next->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10876 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10877 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10878 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10879 else if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10880 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10881 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10882 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10883 else if (is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10884 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10885 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10886 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10887 else if (p->info.typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10888 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10889 else if (p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10890 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10891 else if (is_qname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10892 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10893 else if (is_stdqname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10894 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10895 else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10896 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10897 else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10898 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10899 else if (is_XML(p->info.typ) && is_string(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10900 fprintf(fout,"\n\tsoap_outliteral(soap, %s, &(a->%s::%s), NULL);", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10901 else if (is_XML(p->info.typ) && is_wstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10902 fprintf(fout,"\n\tsoap_outwliteral(soap, %s, &(a->%s::%s), NULL);", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10903 else if (p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10904 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10905 else if (p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10906 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10907 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10908 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10909 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10910 if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10911 fprintf(fout,"\n\treturn soap_element_end_out(soap, tag);\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10912 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10913 fprintf(fout,"\n\treturn SOAP_OK;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10914 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10915 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10916 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10917
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10918 case Tunion:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10919 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10920 { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10921 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10922 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10923 fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10924 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10925 table = (Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10926 fprintf(fout, "\n\tswitch (choice)\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10927 for (p = table->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10928 { if (p->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10929 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10930 else if (is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10931 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10932 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10933 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10934 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10935 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10936 else if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10937 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10938 else if (p->info.typ->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10939 { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10940 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10941 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10942 else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10943 { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10944 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10945 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10946 else if (is_qname(p->info.typ) || is_stdqname(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10947 { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10948 fprintf(fout,"\n\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10949 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10950 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10951 else if (is_XML(p->info.typ) && is_string(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10952 { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10953 fprintf(fout,"\n\t\treturn soap_outliteral(soap, \"%s\", &a->%s, NULL);", ns_add(p, nse), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10954 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10955 else if (is_XML(p->info.typ) && is_wstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10956 { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10957 fprintf(fout,"\n\t\treturn soap_outwliteral(soap, \"%s\", &a->%s, NULL);", ns_add(p, nse), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10958 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10959 else if (p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10960 { fprintf(fout, "\n\tcase SOAP_UNION_%s_%s:", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10961 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10962 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10963 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10964 fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}\n\treturn SOAP_OK;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10965 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10966 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10967
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10968 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10969 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10970 { 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*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10971 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10972 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10973 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*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10974 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10975 if (is_template(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10976 { fprintf(fout,"\n\tif (!*a)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10977 fprintf(fout,"\n\t\treturn soap_element_null(soap, tag, id, type);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10978 fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, *a, type);", c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10979 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10980 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10981 { p = is_dynamic_array((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10982 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10983 { d = get_Darraydims((Tnode*)typ->ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10984 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10985 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10986 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10987 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10988 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10989 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10990 fprintf(fout,"\n\tid = soap_element_id(soap, tag, id, *a, NULL, 0, type, %s);", soap_type((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10991 fprintf(fout,"\n\tif (id < 0)\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10992 if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10993 fprintf(fout,"\n\treturn (*a)->soap_out(soap, tag, id, type);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10994 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10995 fprintf(fout,"\n\treturn soap_out_%s(soap, tag, id, *a, type);",c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10996 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10997 fprintf(fout,"\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10998 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10999
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11000 case Tarray:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11001 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11002 { 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11003 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11004 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11005 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11006 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11007 fprintf(fout,"\n\tint i;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11008 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11009 n=(Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11010 cardinality = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11011 while(n->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11012 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11013 n=(Tnode*)n->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11014 cardinality++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11015 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11016
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11017 fprintf(fout,"\n\tfor (i = 0; i < %d; i++)\n\t{",get_dimension(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11018 if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11019 { if(cardinality>1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11020 fprintf(fout,"\n\t\ta[i].soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11021 else fprintf(fout,"\n\t\t(a+i)->soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11022 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11023 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11024 { if(((Tnode *)typ->ref)->type != Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11025 { if(((Tnode *)typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11026 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11027 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11028 fprintf(fout,"\n\t\tsoap_out_%s(soap, \"item\", -1, a",c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11029 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11030 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11031 fprintf(fout,"\n\t\tsoap_out_%s(soap, \"item\", -1, a",c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11032 if(cardinality>1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11033 fprintf(fout,"[i], \"%s\")", xsi_type_u((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11034 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11035 fprintf(fout,"+i, \"%s\")", xsi_type_u((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11036 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11037 if(((Tnode *)typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11038 fprintf(fout,";\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11039 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11040 fprintf(fout,";\n\t}\n\treturn soap_element_end_out(soap, tag);\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11041 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11042
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11043 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11044 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11045 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11046 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11047 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11048 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11049 if (!is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11050 { fprintf(fout, "\n\nstatic const struct soap_code_map soap_codes_%s[] =\n{", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11051 for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11052 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11053 fprintf(fout, "\t{ (long)%s, \"%s\" },\n", ident(p->sym->name), ns_remove2(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11054 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11055 fprintf(fout, "\t{ 0, NULL }\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11056 fprintf(fout, "};");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11057 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11058 fprintf(fhead, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11059 fprintf(fout, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap *soap, %s)", c_ident(typ), c_type_id(typ, "n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11060 if (is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11061 fprintf(fout, "\n{\treturn soap_%s2s(soap, n);\n}", t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11062 else if (is_boolean(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11063 fprintf(fout, "\n{\n\t(void)soap; /* appease -Wall -Werror */\nreturn soap_code_str(soap_codes_%s, n!=0);\n}", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11064 else if (!is_mask(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11065 { fprintf(fout, "\n{\tconst char *s = soap_code_str(soap_codes_%s, (long)n);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11066 fprintf(fout, "\n\tif (s)\n\t\treturn s;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11067 fprintf(fout, "\n\treturn soap_long2s(soap, (long)n);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11068 fprintf(fout, "\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11069 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11070 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11071 fprintf(fout, "\n{\n\treturn soap_code_list(soap, soap_codes_%s, (long)n);\n}", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11072 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11073 fprintf(fout, "\n{\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type)", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11074 fprintf(fout, " || soap_send(soap, soap_%s2s(soap, *a)))\n\t\treturn soap->error;", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11075 fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11076 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11077 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11078 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11079 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11080 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11081 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11082 if (is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11083 { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11084 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11085 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11086 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11087 n = typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11088 if (!n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11089 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11090 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11091
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11092 fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)\n\t{", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11093 if (n->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11094 fprintf(fout,"\n\t\tif (soap_out_%s(soap, tag, id, *i, \"%s\"))", c_ident(n), xsi_type_u(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11095 else if (n->type==Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11096 fprintf(fout,"\n\t\tif ((*i).soap_out(soap, tag, id, \"%s\"))", xsi_type_u(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11097 else if (is_qname(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11098 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11099 else if (is_stdqname(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11100 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11101 else if (is_XML(n) && is_string(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11102 fprintf(fout,"\n\t\tif (soap_outliteral(soap, tag, &(*i), NULL))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11103 else if (is_XML(n) && is_wstring(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11104 fprintf(fout,"\n\t\tif (soap_outwliteral(soap, tag, &(*i), NULL))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11105 else if (n->type == Tenum && (Table*)n->ref == booltable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11106 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11107 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11108 fprintf(fout,"\n\t\tif (soap_out_%s(soap, tag, id, &(*i), \"%s\"))", c_ident(n), xsi_type_u(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11109 fprintf(fout, "\n\t\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11110 fprintf(fout, "\n\t}\n\treturn SOAP_OK;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11111 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11112 default: break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11113 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11114 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11115
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11116 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11117 soap_out_Darray(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11118 { int i, j, d = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11119 Table *t, *table;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11120 Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11121 char *nse = ns_qualifiedElement(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11122 char *nsa = ns_qualifiedAttribute(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11123 char *item;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11124
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11125 table=(Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11126 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11127 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11128 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11129 if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11130 { fprintf(fout,"\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11131 fprintf(fout,"\n{\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11132 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11133 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11134 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11135 if (has_setter(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11136 fprintf(fout, "\n\t((%s)a)->set(soap);", c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11137 if (!is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11138 { d = get_Darraydims(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11139 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11140 fprintf(fout,"\n\tint i, n = soap_size(a->__size, %d);", d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11141 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11142 fprintf(fout,"\n\tint i, n = a->__size;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11143 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11144 if (typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11145 { for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11146 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11147 { if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11148 soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11149 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11150 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11151 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11152 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11153 { for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11154 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11155 { if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11156 soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11157 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11158 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11159 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11160 p = is_dynamic_array(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11161 if (p->sym->name[5])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11162 item = ns_addx(p->sym->name + 5, nse);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11163 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11164 item = ns_addx("item", nse);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11165 if (!has_ns(typ) && !is_untyped(typ) && !is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11166 { if (is_untyped(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11167 { if (has_offset(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11168 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11169 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11170 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11171 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11172 else if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11173 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11174 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11175 fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", n) : NULL;", ident(p->sym->name), wsdl_type(p->info.typ, "xsd"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11176 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11177 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11178 { if (has_offset(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11179 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11180 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11181 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11182 fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", n + a->__offset) : NULL;", ident(p->sym->name), xsi_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11183 else if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11184 fprintf(fout,"\n\tchar *t = a->%s ? soap_putsizes(soap, \"%s\", a->__size, %d) : NULL;", ident(p->sym->name), xsi_type(typ),d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11185 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11186 fprintf(fout,"\n\tchar *t = a->%s ? soap_putsize(soap, \"%s\", a->__size) : NULL;", ident(p->sym->name), xsi_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11187 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11188 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11189 if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11190 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11191 else if (is_attachment(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11192 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11193 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11194 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11195 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11196 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11197 fprintf(fout,"\n\tif (id < 0)\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11198 fprintf(fout,"\n\tif (");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11199 if (has_ns(typ) || is_untyped(typ) || is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11200 { if (table->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11201 fprintf(fout,"soap_element_begin_out(soap, tag, id, \"%s\")", xsi_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11202 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11203 fprintf(fout,"soap_element_begin_out(soap, tag, id, type)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11204 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11205 else if (has_offset(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11206 { if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11207 fprintf(fout,"soap_array_begin_out(soap, tag, id, t, soap_putoffsets(soap, a->__offset, %d))", d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11208 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11209 fprintf(fout,"soap_array_begin_out(soap, tag, id, t, soap_putoffset(soap, a->__offset))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11210 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11211 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11212 fprintf(fout,"soap_array_begin_out(soap, tag, id, t, NULL)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11213 fprintf(fout, ")\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11214 if (is_binary(typ) && !is_hexBinary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11215 fprintf(fout, "\n\tif (soap_putbase64(soap, a->__ptr, a->__size))\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11216 else if (is_hexBinary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11217 fprintf(fout, "\n\tif (soap_puthex(soap, a->__ptr, a->__size))\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11218 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11219 { fprintf(fout,"\n\tfor (i = 0; i < n; i++)\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11220 if (!has_ns(typ) && !is_untyped(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11221 { if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11222 { fprintf(fout,"\n\t\tsoap->position = %d;", d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11223 for (i = 0; i < d; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11224 { fprintf(fout, "\n\t\tsoap->positions[%d] = i", i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11225 for (j = i+1; j < d; j++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11226 fprintf(fout, "/a->__size[%d]", j);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11227 fprintf(fout, "%%a->__size[%d];", i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11228 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11229 if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11230 fprintf(fout,"\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11231 else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11232 fprintf(fout,"\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11233 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11234 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11235 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11236 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11237 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11238 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11239 { fprintf(fout,"\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11240 if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11241 fprintf(fout,"\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11242 else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11243 fprintf(fout,"\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11244 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11245 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11246 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11247 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11248 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11249 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11250 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11251 { if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11252 fprintf(fout,"\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11253 else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11254 fprintf(fout,"\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11255 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11256 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11257 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11258 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)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11259 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11260 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11261 if (is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11262 fprintf(fout,"\n\treturn soap_element_end_out(soap, tag);\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11263 else if (!has_ns(typ) && !is_untyped(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11264 fprintf(fout,"\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11265 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11266 fprintf(fout,"\n\t}\n\treturn soap_element_end_out(soap, tag);\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11267 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11268
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11269 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11270 soap_get(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11271 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11272 Tnode *temp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11273
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11274 if (typ->type == Ttemplate || typ->type == Tunion)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11275 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11276
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11277 if (is_typedef(typ) && is_element(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11278 { fprintf(fhead, "\n\n#define soap_get_%s soap_get_%s\n", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11279 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11280 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11281
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11282 if(typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11283 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11284 /* ARRAY */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11285 temp = typ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11286 while(temp->type == Tarray){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11287 temp = (Tnode*)temp->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11288 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11289 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11290 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11291 fprintf(fout,"\n{\t%s;",c_type_id(temp, "(*p)"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11292 fprintf(fout,"\n\tif ((p = soap_in_%s(soap, tag, a, type)))", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11293 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11294 else if (typ->type==Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11295 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11296 /* CLASS */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11297 fprintf(fout,"\n\nvoid *%s::soap_get(struct soap *soap, const char *tag, const char *type)", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11298 fprintf(fout,"\n{\n\treturn soap_get_%s(soap, this, tag, type);\n}", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11299 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11300 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11301 fprintf(fout,"\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11302 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11303 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11304 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11305 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11306 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11307 fprintf(fout,"\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11308 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11309 fprintf(fout,"\n\t\tif (soap_getindependent(soap))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11310 fprintf(fout,"\n\treturn p;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11311 #if 0
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11312 /* some compilers cannot handle this inlined function */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11313 if (typ->type != Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11314 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11315 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11316 if (typ->type != Treference)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11317 { if (((!is_external(typ) && !is_volatile(typ)) || Qflag) && namespaceid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11318 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11319 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11320 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11321 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11322 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11323 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11324
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11325 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11326 soap_in(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11327 { Entry *p = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11328 Table *table, *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11329 int total, a, f, cardinality, i, j;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11330 long min, max;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11331 Tnode *n, *temp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11332 char *nse = ns_qualifiedElement(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11333 char *nsa = ns_qualifiedAttribute(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11334
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11335 if (is_dynamic_array(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11336 { soap_in_Darray(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11337 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11338 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11339
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11340 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11341 fprintf(fhead,"\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11342
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11343 if (is_typedef(typ) && is_element(typ) && !is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11344 { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11345 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11346 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11347
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11348 if (is_primitive_or_string(typ) && typ->type != Tenum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11349 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11350 if (is_stdqname(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11351 { fprintf(fhead,"\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11352 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11353 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11354 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11355 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11356 if (is_stdstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11357 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11358 { fprintf(fhead,"\nSOAP_FMAC1 std::string * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11359 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11360 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11361 fprintf(fhead,"\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11362 if (is_stdXML(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11363 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11364 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11365 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11366 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11367 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11368 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11369 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11370 if (is_stdwstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11371 { if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11372 { fprintf(fhead,"\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11373 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11374 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11375 if (is_stdXML(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11376 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11377 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11378 { fprintf(fhead,"\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11379 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11380 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11381 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11382 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11383 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11384 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11385 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11386 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11387 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11388 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11389 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11390 if (is_wstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11391 fprintf(fout,"\n\tp = soap_inwstring(soap, tag, a, type, %s, %ld, %ld);", soap_type(typ), minlen(typ), maxlen(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11392 else if (is_string(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11393 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11394 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11395 { if (typ->type == Tllong || typ->type == Tullong)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11396 fprintf(fout,"\n\tp = soap_in%s(soap, tag, a, type, %s);", c_type(typ), soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11397 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11398 fprintf(fout,"\n\tp = soap_in%s(soap, tag, a, type, %s);", the_type(typ), soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11399 if (typ->type <= Tenum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11400 { if (typ->minLength != MINLONG64 && (typ->minLength > 0 || typ->type < Tuchar || typ->type > Tullong))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11401 fprintf(fout,"\n\tif (p && *p < " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->minLength);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11402 if (typ->maxLength != MAXLONG64)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11403 fprintf(fout,"\n\tif (p && *p > " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->maxLength);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11404 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11405 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11406 fprintf(fout,"\n\treturn p;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11407 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11408 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11409 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11410 if (is_fixedstring(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11411 { fprintf(fhead,"\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap*, const char*, char[], const char*);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11412 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11413 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11414 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11415 switch(typ->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11416 { case Tstruct:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11417 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11418 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11419 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11420 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11421 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11422 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11423 table = (Table *)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11424 if (is_primclass(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11425 { fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11426 if (!cflag || has_class(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11427 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11428 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11429 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11430 fprintf(fout,"\n\tsoap_revert(soap);\n\t*soap->id = '\\0';");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11431 /* fprintf(fout,"\n\tif (soap->alloced)"); */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11432 fprintf(fout,"\n\tsoap_default_%s(soap, a);",c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11433 for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11434 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11435 if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11436 soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11437 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11438 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11439 for (table = (Table*)typ->ref; table; table = table->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11440 { p = table->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11441 if (p && is_item(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11442 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11443 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11444 if (is_XML(p->info.typ) && is_string(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11445 { fprintf(fout,"\n\tif (!soap_inliteral(soap, tag, &a->%s))", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11446 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11447 else if (is_XML(p->info.typ) && is_wstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11448 { fprintf(fout,"\n\tif (!soap_inwliteral(soap, tag, &a->%s))", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11449 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11450 else if(p->info.typ->type==Tarray) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11451 fprintf(fout,"\n\tif (!soap_in_%s(soap, tag, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11452 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11453 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11454 fprintf(fout,"\n\tif (!a->%s.soap_in(soap, tag, \"%s\"))", ident(p->sym->name), xsi_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11455 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11456 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11457 fprintf(fout,"\n\tif (!soap_in_%s(soap, tag, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11458 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11459 fprintf(fout,"\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11460 fprintf(fout, "\n\treturn a;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11461 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11462 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11463 { table = (Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11464 if (!is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11465 { for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11466 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11467 { 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11468 { if (is_anytype(p) || is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11469 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11470 if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11471 { fprintf(fout,"\n\tstruct soap_blist *soap_blist_%s = NULL;", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11472 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11473 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11474 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11475 fprintf(fout,"\n\tsize_t soap_flag_%s = " SOAP_LONG_FORMAT ";", ident(p->sym->name), p->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11476 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11477 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11478 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11479 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11480 if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11481 { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, type))\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11482 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11483 else if (!is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11484 { if (table && (table->prev || table->list))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11485 fprintf(fout,"\n\tshort soap_flag;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11486 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11487 if (has_class(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11488 { if (is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11489 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11490 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11491 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11492 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11493 else if (is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11494 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11495 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11496 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11497 fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11498 /* fprintf(fout,"\n\tif (soap->alloced)"); */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11499 fprintf(fout,"\n\tsoap_default_%s(soap, a);",c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11500 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11501 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11502 if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11503 soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11504 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11505 if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11506 { if (!is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11507 { fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11508 fprintf(fout,"\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11509 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11510 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11511 fprintf(fout,"\n\tif (!tag || *tag == '-' || (soap->body && !*soap->href))\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11512 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11513 else if (!is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11514 { if (table->prev || table->list)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11515 fprintf(fout,"\n\t\tfor (soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11516 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11517 a=0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11518 f=0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11519 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11520 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11521 { if (p->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11522 fprintf(fout, "\n\t\t/* non-serializable %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11523 else if (is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11524 fprintf(fout, "\n\t\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11525 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11526 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11527 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11528 { if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11529 { p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11530 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11531 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11532 f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11533 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11534 fprintf(fout,"!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11535 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11536 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11537 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11538 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11539 fprintf(fout,"\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11540 else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11541 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11542 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11543 fprintf(fout,"\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11544 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11545 fprintf(fout,"\n\t\t\t\tsoap_revert(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11546 if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11547 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11548 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11549 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11550 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11551 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11552 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11553 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11554 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11555 else if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11556 { f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11557 fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11558 fprintf(fout,"\n\t\t\t\tif ((a->%s = soap_getelement(soap, &a->%s)))", ident(p->next->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11559 fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11560 fprintf(fout,"\n\t\t\t\t\tcontinue;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11561 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11562 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11563 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11564 else if (is_discriminant(typ) && p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11565 { f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11566 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11567 fprintf(fout,"\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11568 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11569 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11570 else if (is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11571 { f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11572 fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11573 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11574 fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11575 fprintf(fout,"\n\t\t\t\t\tcontinue;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11576 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11577 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11578 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11579 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11580 { f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11581 if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11582 { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11583 fprintf(fout,"\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11584 else if (is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11585 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11586 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11587 fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11588 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11589 if (is_unmatched(p->sym))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11590 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11591 if (is_XML(p->info.typ) && is_string(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11592 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, &a->%s))", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11593 } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11594 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, &a->%s))", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11595 } else if(p->info.typ->type==Tarray) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11596 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11597 } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11598 fprintf(fout,"\n\t\t\t\tif (a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11599 } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11600 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11601 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11602 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11603 else if (!is_invisible(p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11604 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11605 if (is_XML(p->info.typ) && is_string(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11606 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11607 } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11608 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11609 } else if(p->info.typ->type==Tarray) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11610 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11611 } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11612 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11613 } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11614 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11615 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11616 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11617 if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11618 { if (is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11619 fprintf(fout,"\n\t\t\t\t\tcontinue;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11620 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11621 { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11622 fprintf(fout,"\n\t\t\t\t\tcontinue;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11623 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11624 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11625 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11626 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11627 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11628 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11629 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11630 if (!is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11631 { for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11632 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11633 { if (is_repetition(p) && (is_unmatched(p->next->sym) || (is_invisible(p->next->sym->name))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11634 { f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11635 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11636 if (is_unmatched(p->next->sym))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11637 fprintf(fout,"!soap_element_begin_in(soap, NULL, 1, NULL))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11638 else if (is_invisible(p->next->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11639 fprintf(fout,"!soap_peek_element(soap))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11640 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11641 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11642 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11643 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11644 fprintf(fout,"\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11645 else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11646 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11647 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11648 fprintf(fout,"\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11649 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11650 if (!is_invisible(p->next->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11651 fprintf(fout,"\n\t\t\t\tsoap_revert(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11652 if (is_unmatched(p->next->sym))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11653 { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11654 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, a->%s))", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11655 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11656 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, a->%s))", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11657 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11658 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11659 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11660 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11661 { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11662 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11663 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11664 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, a->%s))", field(p->next, nse), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11665 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11666 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11667 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11668 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11669 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11670 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11671 else if (is_repetition(p) || is_anytype(p) || is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11672 { p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11673 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11674 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11675 else if (is_invisible(p->sym->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11676 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11677 { f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11678 if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11679 fprintf(fout,"\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11680 else if (is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11681 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11682 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11683 fprintf(fout,"\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11684 if (is_XML(p->info.typ) && is_string(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11685 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11686 else if (is_XML(p->info.typ) && is_wstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11687 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, %s, &a->%s))", field(p, nse), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11688 else if(p->info.typ->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11689 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11690 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11691 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11692 else if (p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11693 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11694 if (is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11695 fprintf(fout,"\n\t\t\t\t\tcontinue;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11696 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11697 { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11698 fprintf(fout,"\n\t\t\t\t\tcontinue;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11699 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11700 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11701 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11702 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11703 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11704 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11705 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11706 if (p->info.sto & Sreturn)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11707 if (nse || has_ns_eq(NULL, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11708 fprintf(fout,"\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11709 if (!f && is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11710 fprintf(fout,"\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11711 if (!is_invisible(typ->id->name) || table->prev || table->list)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11712 { fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11713 if (!is_invisible(typ->id->name) || is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11714 fprintf(fout,"\n\t\t\t\tsoap->error = soap_ignore_element(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11715 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11716 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11717 if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11718 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_NO_TAG)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11719 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11720 fprintf(fout,"\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11721 fprintf(fout,"\n\t\t\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11722 fprintf(fout,"\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11723 fprintf(fout,"\n\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11724 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11725 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11726 if (table && !is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11727 { for (p = table->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11728 if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11729 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11730 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11731 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11732 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11733 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11734 if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11735 { fprintf(fout,"\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11736 fprintf(fout,"\n\t}\n\telse\n\t{\t");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11737 if (has_class(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11738 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11739 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11740 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11741 fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11742 fprintf(fout, "\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11743 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11744 a = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11745 if (table && !is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11746 { for (p = table->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11747 { 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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11748 { if (is_item(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11749 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11750 if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11751 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11752 if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11753 { fprintf(fout,"\n\tif (%s(soap_flag_%s > " SOAP_LONG_FORMAT "", strict_check(), ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11754 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11755 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11756 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11757 fprintf(fout," || soap_flag_%s > " SOAP_LONG_FORMAT "", ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11758 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11759 else if (is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11760 { if (p->info.minOccurs > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11761 { if (p->info.typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11762 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11763 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11764 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11765 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11766 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11767 fprintf(fout," || !a->%s || a->%s->size() < " SOAP_LONG_FORMAT, ident(p->sym->name), ident(p->sym->name), p->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11768 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11769 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11770 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11771 { fprintf(fout,"\n\tif (%s(a->%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11772 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11773 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11774 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11775 fprintf(fout," || a->%s.size() < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11776 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11777 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11778 if ( p->info.maxOccurs > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11779 { if (p->info.typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11780 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11781 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11782 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11783 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11784 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11785 fprintf(fout," || (a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11786 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11787 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11788 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11789 { fprintf(fout,"\n\tif (%s(a->%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11790 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11791 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11792 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11793 fprintf(fout," || a->%s.size() > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11794 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11795 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11796 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11797 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11798 { if (p->info.minOccurs > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11799 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11800 { fprintf(fout,"\n\tif (%s(a->%s < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11801 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11802 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11803 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11804 fprintf(fout," || a->%s < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11805 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11806 if (p->info.maxOccurs > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11807 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11808 { fprintf(fout,"\n\tif (%s(a->%s > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11809 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11810 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11811 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11812 fprintf(fout," || a->%s > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11813 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11814 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11815 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11816 else if (is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11817 { if (p->info.minOccurs != 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11818 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11819 { fprintf(fout,"\n\tif (%s(soap_flag_%s", strict_check(), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11820 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11821 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11822 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11823 fprintf(fout," || soap_flag_%s", ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11824 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11825 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11826 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11827 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11828 if (a)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11829 fprintf(fout,"))\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11830 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11831 fprintf(fout, "\n\treturn a;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11832 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11833 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11834
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11835 case Tclass:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11836 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11837 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11838 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11839 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11840 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11841 if (!is_volatile(typ) && !is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11842 { fprintf(fout,"\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11843 fprintf(fout,"\n{\treturn soap_in_%s(soap, tag, this, type);\n}",c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11844 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11845 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11846 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11847 if (is_primclass(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11848 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11849 fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11850 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11851 fprintf(fout,"\n\tsoap_revert(soap);\n\t*soap->id = '\\0';");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11852 fprintf(fout,"\n\tif (soap->alloced)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11853 fprintf(fout,"\n\t{\ta->soap_default(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11854 fprintf(fout,"\n\t\tif (soap->clist->type != %s)", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11855 fprintf(fout,"\n\t\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11856 fprintf(fout,"\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11857 for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11858 { Entry *e = entry(classtable, t->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11859 char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11860 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11861 if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11862 soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11863 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11864 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11865 for (table = (Table*)typ->ref; table; table = table->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11866 { p = table->list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11867 if (p && is_item(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11868 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11869 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11870 if (is_XML(p->info.typ) && is_string(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11871 { fprintf(fout,"\n\tif (!soap_inliteral(soap, tag, &(a->%s::%s)))", ident(table->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11872 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11873 else if (is_XML(p->info.typ) && is_wstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11874 { fprintf(fout,"\n\tif (!soap_inwliteral(soap, tag, &(a->%s::%s)))", ident(table->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11875 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11876 else if(p->info.typ->type==Tarray) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11877 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11878 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11879 else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11880 fprintf(fout,"\n\tif (!(a->%s::%s).soap_in(soap, tag, \"%s\"))", ident(table->sym->name), ident(p->sym->name), xsi_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11881 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11882 else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11883 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11884 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11885 fprintf(fout,"\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11886 if (has_getter(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11887 fprintf(fout,"\n\tif (a->get(soap))\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11888 fprintf(fout,"\n\treturn a;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11889 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11890 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11891 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11892 if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11893 { fprintf(fout,"\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 0, NULL))\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11894 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11895 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11896 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11897 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11898 fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11899 if (!is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11900 { fprintf(fout,"\n\tif (soap->alloced)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11901 if (is_volatile(typ) || is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11902 fprintf(fout,"\n\t{\tsoap_default_%s(soap, a);",c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11903 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11904 fprintf(fout,"\n\t{\ta->soap_default(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11905 if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11906 { fprintf(fout,"\n\t\tif (soap->clist->type != %s)", soap_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11907 fprintf(fout,"\n\t\t{\tsoap_revert(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11908 fprintf(fout,"\n\t\t\t*soap->id = '\\0';");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11909 if (is_volatile(typ) || is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11910 fprintf(fout,"\n\t\t\treturn soap_in_%s(soap, tag, a, type);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11911 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11912 fprintf(fout,"\n\t\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11913 fprintf(fout,"\n\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11914 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11915 fprintf(fout,"\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11916 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11917 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11918 fprintf(fout,"\n\ta->soap_default(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11919 table=(Table *)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11920 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11921 { Entry *e = entry(classtable, t->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11922 char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11923 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11924 if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11925 soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11926 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11927 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11928
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11929 i=0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11930 if (!is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11931 { for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11932 i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11933 a=0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11934 for (; i > 0; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11935 { t = table;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11936 for (j = 0; j < i-1; j++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11937 t = t->prev;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11938 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11939 { 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11940 { if (is_anytype(p) || is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11941 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11942 if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11943 { fprintf(fout,"\n\tstruct soap_blist *soap_blist_%s%d = NULL;", ident(p->next->sym->name), i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11944 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11945 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11946 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11947 fprintf(fout,"\n\tsize_t soap_flag_%s%d = " SOAP_LONG_FORMAT ";", ident(p->sym->name), i, p->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11948 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11949 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11950 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11951 if (a)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11952 fprintf(fout,";");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11953 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11954 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11955 if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11956 { if (!is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11957 { fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11958 fprintf(fout,"\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11959 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11960 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11961 fprintf(fout,"\n\tif (!tag || *tag == '-' || (soap->body && !*soap->href))\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11962 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11963 else if (!is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11964 { if (table->prev || table->list)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11965 fprintf(fout,"\n\t\tfor (short soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11966 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11967 table=(Table *)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11968 a=0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11969 i=0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11970 f=0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11971 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11972 i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11973 for (; i > 0; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11974 { Entry *e;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11975 char *nse1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11976 t = table;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11977 for (j = 0; j < i-1; j++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11978 t = t->prev;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11979 e = entry(classtable, t->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11980 nse1 = e ? ns_qualifiedElement(e->info.typ) : nse;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11981 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11982 { if (is_item(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11983 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11984 else if (p->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11985 fprintf(fout, "\n\t\t\t/* non-serializable %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11986 else if (is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11987 fprintf(fout, "\n\t\t\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11988 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11989 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11990 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11991 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11992 if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11993 { p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11994 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11995 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11996 f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11997 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11998 fprintf(fout,"!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11999 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12000 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12001 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12002 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12003 fprintf(fout,"\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12004 else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12005 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12006 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12007 fprintf(fout,"\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12008 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12009 fprintf(fout,"\n\t\t\t\tsoap_revert(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12010 if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12011 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12012 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12013 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12014 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12015 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12016 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12017 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12018 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12019 else if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12020 { f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12021 fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name), i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12022 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12023 fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12024 fprintf(fout,"\n\t\t\t\t\tcontinue;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12025 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12026 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12027 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12028 else if (is_discriminant(typ) && p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12029 { f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12030 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12031 fprintf(fout,"\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12032 i = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12033 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12034 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12035 else if (is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12036 { f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12037 fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)",ident(p->next->sym->name),i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12038 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12039 fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12040 fprintf(fout,"\n\t\t\t\t\tcontinue;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12041 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12042 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12043 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12044 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12045 { f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12046 if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12047 { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12048 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12049 else if (is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12050 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12051 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12052 fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)",ident(p->sym->name), i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12053 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12054 if (is_unmatched(p->sym))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12055 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12056 if (is_XML(p->info.typ) && is_string(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12057 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, &(a->%s::%s)))", ident(t->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12058 } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12059 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, &(a->%s::%s)))", ident(t->sym->name), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12060 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12061 else if(p->info.typ->type==Tarray) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12062 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12063 } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12064 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12065 } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12066 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12067 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12068 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12069 else if (!is_invisible(p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12070 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12071 if (is_XML(p->info.typ) && is_string(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12072 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12073 } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12074 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12075 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12076 else if(p->info.typ->type==Tarray) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12077 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12078 } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12079 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12080 } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12081 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12082 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12083 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12084 if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12085 { if (is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12086 fprintf(fout,"\n\t\t\t\t\tcontinue;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12087 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12088 { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12089 fprintf(fout,"\n\t\t\t\t\tcontinue;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12090 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12091 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12092 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12093 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12094 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12095 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12096 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12097 if (!is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12098 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12099 Entry *e;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12100 char *nse1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12101 i=0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12102 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12103 { i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12104 e = entry(classtable, t->sym);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12105 nse1 = e ? ns_qualifiedElement(e->info.typ) : nse;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12106 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12107 { if (is_repetition(p) && (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12108 { f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12109 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12110 if (is_unmatched(p->next->sym))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12111 fprintf(fout,"!soap_element_begin_in(soap, NULL, 1, NULL))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12112 else if (is_invisible(p->next->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12113 fprintf(fout,"!soap_peek_element(soap))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12114 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12115 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12116 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12117 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12118 fprintf(fout,"\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12119 else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12120 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12121 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12122 fprintf(fout,"\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12123 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12124 if (!is_invisible(p->next->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12125 fprintf(fout,"\n\t\t\t\tsoap_revert(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12126 if (is_unmatched(p->next->sym))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12127 { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12128 fprintf(fout,"\n\t\t\t\tif (soap_inliteral(soap, NULL, a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12129 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12130 fprintf(fout,"\n\t\t\t\tif (soap_inwliteral(soap, NULL, a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12131 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12132 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12133 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12134 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12135 { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12136 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12137 else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12138 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12139 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12140 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12141 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12142 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12143 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12144 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12145 else if (is_repetition(p) || is_anytype(p) || is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12146 { p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12147 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12148 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12149 else if (is_invisible(p->sym->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12150 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12151 { f=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12152 if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12153 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12154 else if (is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12155 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12156 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12157 fprintf(fout,"\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)",ident(p->sym->name), i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12158 if (is_XML(p->info.typ) && is_string(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12159 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12160 } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12161 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12162 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12163 else if(p->info.typ->type==Tarray) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12164 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12165 } else if(p->info.typ->type==Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12166 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12167 } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12168 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12169 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12170 if (is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12171 fprintf(fout,"\n\t\t\t\t\tcontinue;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12172 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12173 { fprintf(fout,"\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12174 fprintf(fout,"\n\t\t\t\t\tcontinue;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12175 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12176 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12177 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12178 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12179 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12180 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12181 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12182 if (p->info.sto & Sreturn)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12183 if (nse || has_ns_eq(NULL, p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12184 fprintf(fout,"\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12185 if (!f && is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12186 fprintf(fout,"\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12187 if (!is_invisible(typ->id->name) || table->prev || table->list)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12188 { fprintf(fout,"\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12189 if (!is_invisible(typ->id->name) || is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12190 fprintf(fout,"\n\t\t\t\tsoap->error = soap_ignore_element(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12191 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12192 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12193 if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12194 fprintf(fout,"\n\t\t\tif (soap->error == SOAP_NO_TAG)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12195 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12196 fprintf(fout,"\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12197 fprintf(fout,"\n\t\t\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12198 fprintf(fout,"\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12199 fprintf(fout,"\n\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12200 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12201 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12202 if (!is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12203 { i=0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12204 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12205 i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12206 for (; i > 0; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12207 { t = table;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12208 for (j = 0; j < i-1; j++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12209 t = t->prev;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12210 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12211 { if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12212 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12213 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12214 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12215 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12216 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12217 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12218 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12219 if (has_getter(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12220 fprintf(fout,"\n\t\tif (a->get(soap))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12221 if (!is_invisible(typ->id->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12222 { fprintf(fout, "\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12223 fprintf(fout,"\n\t}\n\telse\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12224 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12225 fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12226 fprintf(fout, "\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12227 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12228 if (!is_discriminant(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12229 { a=0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12230 i = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12231 for (t = table; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12232 i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12233 for (; i > 0; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12234 { t = table;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12235 for (j = 0; j < i-1; j++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12236 t = t->prev;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12237 for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12238 { 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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12239 { if (is_item(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12240 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12241 if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12242 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12243 if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12244 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12245 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12246 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12247 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12248 fprintf(fout," || soap_flag_%s%d > " SOAP_LONG_FORMAT, ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12249 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12250 else if (is_template(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12251 { if (p->info.minOccurs > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12252 { if (p->info.typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12253 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12254 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12255 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12256 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12257 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12258 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12259 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12260 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12261 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12262 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12263 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12264 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12265 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12266 fprintf(fout," || a->%s::%s.size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12267 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12268 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12269 if ( p->info.maxOccurs > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12270 { if (p->info.typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12271 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12272 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12273 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12274 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12275 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12276 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12277 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12278 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12279 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12280 { 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12281 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12282 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12283 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12284 fprintf(fout," || a->%s::%s.size() > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12285 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12286 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12287 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12288 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12289 { if (p->info.minOccurs > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12290 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12291 { fprintf(fout,"\n\tif (%s(a->%s::%s < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12292 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12293 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12294 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12295 fprintf(fout," || a->%s::%s < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12296 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12297 if (p->info.maxOccurs > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12298 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12299 { fprintf(fout,"\n\tif (%s(a->%s::%s > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12300 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12301 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12302 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12303 fprintf(fout," || a->%s::%s > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12304 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12305 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12306 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12307 else if (is_choice(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12308 { if (p->info.minOccurs != 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12309 { if (a==0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12310 { fprintf(fout,"\n\tif (%s(soap_flag_%s%d", strict_check(), ident(p->next->sym->name), i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12311 a=1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12312 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12313 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12314 fprintf(fout," || soap_flag_%s%d", ident(p->next->sym->name), i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12315 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12316 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12317 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12318 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12319 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12320 if (a)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12321 fprintf(fout,"))\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12322 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12323 fprintf(fout,"\n\treturn a;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12324 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12325
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12326 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12327
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12328 case Tunion:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12329 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12330 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12331 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12332 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12333 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12334 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12335 fprintf(fout, "\tsoap->error = SOAP_TAG_MISMATCH;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12336 table = (Table *)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12337 for (p = table->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12338 { if (p->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12339 fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12340 else if (is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12341 fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12342 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12343 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12344 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12345 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12346 else if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12347 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12348 else if (!is_invisible(p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12349 { if (is_unmatched(p->sym))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12350 { if (is_XML(p->info.typ) && is_string(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12351 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, NULL, &a->%s))", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12352 else if (is_XML(p->info.typ) && is_wstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12353 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, NULL, &a->%s))", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12354 else if (p->info.typ->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12355 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12356 else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12357 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12358 else if (p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12359 { if (p->info.typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12360 fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12361 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12362 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12363 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12364 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12365 { if (is_XML(p->info.typ) && is_string(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12366 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12367 else if (is_XML(p->info.typ) && is_wstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12368 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12369 else if (p->info.typ->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12370 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12371 else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12372 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12373 else if (p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12374 { if (p->info.typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12375 fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12376 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12377 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12378 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12379 fprintf(fout, "\n\t{\t*choice = SOAP_UNION_%s_%s;", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12380 fprintf(fout, "\n\t\treturn a;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12381 fprintf(fout, "\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12382 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12383 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12384 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12385 table = (Table *)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12386 for (p = table->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12387 { if (p->info.sto & (Sconst | Sprivate | Sprotected))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12388 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12389 else if (is_transient(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12390 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12391 else if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12392 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12393 else if (is_repetition(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12394 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12395 else if (is_anytype(p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12396 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12397 else if (is_invisible(p->sym->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12398 { if (is_XML(p->info.typ) && is_string(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12399 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12400 else if (is_XML(p->info.typ) && is_wstring(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12401 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", &a->%s))", ns_add(p, nse), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12402 else if (p->info.typ->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12403 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12404 else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12405 fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", NULL))", ident(p->sym->name),ns_add(p, nse));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12406 else if (p->info.typ->type != Tfun && !is_void(p->info.typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12407 { if (p->info.typ->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12408 fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12409 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12410 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12411 fprintf(fout, "\n\t{\t*choice = SOAP_UNION_%s_%s;", c_ident(typ), ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12412 fprintf(fout, "\n\t\treturn a;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12413 fprintf(fout, "\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12414 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12415 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12416 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12417 fprintf(fout, "\n\t*choice = -1;\n\tif (!soap->error)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12418 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12419
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12420 case Tpointer:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12421
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12422 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12423 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12424 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12425 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12426 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12427 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12428 fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 1, NULL))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12429 fprintf(fout,"\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12430
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12431 if (is_template(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12432 { fprintf(fout,"\n\tsoap_revert(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12433 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12434 fprintf(fout,"\n\tif (!(*a = soap_in_%s(soap, tag, *a, type)))\n\t\treturn NULL;", c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12435 fprintf(fout,"\n\treturn a;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12436 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12437 else if(((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12438 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12439 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12440 fprintf(fout,"\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12441 fprintf(fout,"\n\t{\tsoap_revert(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12442 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12443 fprintf(fout, "\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12444 fprintf(fout, "\n\t\t(*a)->soap_default(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12445 fprintf(fout, "\n\t\tif (!(*a)->soap_in(soap, tag, NULL))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12446 fprintf(fout, "\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12447 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) );
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12448 if (((Tnode*)typ->ref)->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12449 { table = (Table*)((Tnode*)typ->ref)->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12450 for (p = classtable->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12451 { if (p->info.typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12452 { Table *q = (Table*)p->info.typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12453 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12454 for (q = q->prev; q; q = q->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12455 if (q == table)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12456 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12457 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12458 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12459 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12460 fprintf(fout,"\n\t\ta = p;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12461 fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12462 fprintf(fout,"\n\t}\n\treturn a;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12463 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12464 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12465 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12466 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12467 fprintf(fout,"\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12468 fprintf(fout,"\n\t{\tsoap_revert(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12469 fprintf(fout,"\n\t\tif (!(*a = soap_in_%s(soap, tag, *a, type)))", c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12470 fprintf(fout,"\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12471
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12472 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) );
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12473 fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12474 fprintf(fout,"\n\t}\n\treturn a;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12475 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12476
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12477 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12478
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12479 case Tarray:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12480 temp = typ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12481 while(temp->type == Tarray){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12482 temp = (Tnode*)temp->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12483 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12484 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12485 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12486 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12487 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12488 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12489 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12490 fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, NULL))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12491 fprintf(fout,"\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12492 fprintf(fout,"\n\tif (soap_match_array(soap, type))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12493 fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12494 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12495 fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12496 fprintf(fout,"\n\tsoap_default_%s(soap, a);",c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12497 fprintf(fout,"\n\tif (soap->body && !*soap->href)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12498 total=get_dimension(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12499 n=(Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12500 cardinality = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12501 while(n->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12502 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12503 total=total*get_dimension(n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12504 n = (Tnode*)n->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12505 cardinality++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12506 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12507 fprintf(fout,"\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)",get_dimension(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12508 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12509 fprintf(fout,"\n\t\t\tif (!soap_in_%s(soap, NULL, a", c_ident((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12510
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12511 if(cardinality > 1){
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12512 fprintf(fout,"[i]");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12513 }else {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12514 fprintf(fout,"+i");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12515 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12516 fprintf(fout,", \"%s\"))", xsi_type((Tnode*)typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12517 fprintf(fout,"\n\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12518 fprintf(fout,"\n\t\t\t\tsoap->error = SOAP_OK;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12519 fprintf(fout,"\n\t\t\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12520 fprintf(fout,"\n\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12521 fprintf(fout,"\n\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12522 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12523 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12524 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12525 fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12526 fprintf(fout,"\n\t}\n\treturn (%s)a;\n}", c_type_id(temp, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12527 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12528
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12529 case Tenum:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12530 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12531 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12532 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12533 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12534 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12535 fprintf(fhead,"\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);",c_ident(typ),c_type_id(typ, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12536 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12537 if (is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12538 fprintf(fout, "\n\treturn soap_s2%s(soap, s, a);\n}", t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12539 else if (!is_mask(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12540 { fprintf(fout, "\n\tconst struct soap_code_map *map;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12541 t = (Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12542 if (t && t->list && has_ns_eq(NULL, ns_remove1(t->list->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12543 { fprintf(fout, "\n\tchar *t;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12544 fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12545 fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld);", minlen(typ), maxlen(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12546 fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, t);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12547 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12548 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12549 { fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12550 fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, s);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12551 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12552 min = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12553 max = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12554 for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12555 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12556 { if (p->info.val.i < min)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12557 min = (unsigned long)p->info.val.i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12558 if (p->info.val.i > max)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12559 max = (unsigned long)p->info.val.i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12560 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12561 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12562 if (is_boolean(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12563 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12564 else if (sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12565 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12566 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12567 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12568 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12569 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12570 { t = (Table*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12571 if (t && t->list && has_ns_eq(NULL, ns_remove1(t->list->sym->name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12572 { fprintf(fout, "\n\tchar *t;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12573 fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld);", minlen(typ), maxlen(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12574 fprintf(fout, "\n\t*a = (%s)soap_code_bits(soap_codes_%s, t);", c_type(typ), c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12575 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12576 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12577 fprintf(fout, "\n\t*a = (%s)soap_code_bits(soap_codes_%s, s);", c_type(typ), c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12578 fprintf(fout, "\n\treturn SOAP_OK;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12579 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12580 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12581 if (is_boolean(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12582 { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, NULL))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12583 fprintf(fout,"\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12584 fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":boolean\"))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12585 fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12586 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12587 else if (typ->sym)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12588 { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, NULL))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12589 fprintf(fout,"\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12590 fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \"%s\"))", base_type(typ, ""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12591 fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12592 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12593 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12594 { fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 0, type))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12595 fprintf(fout,"\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12596 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12597 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12598 fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12599 fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12600 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12601 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12602 fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12603 fprintf(fout,"\n\t}\n\treturn a;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12604 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12605
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12606 case Ttemplate:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12607 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12608 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12609 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12610 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12611 if (is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12612 { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12613 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12614 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12615 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12616 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12617 n = (Tnode*)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12618 fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12619 fprintf(fout, "\n\tshort soap_flag;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12620 fprintf(fout, "\n\tfor (soap_flag = 0;; soap_flag = 1)\n\t{\t%s;", c_type_id(n, "n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12621 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");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12622 if (n->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12623 fprintf(fout,"n = NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12624 else if (n->type == Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12625 fprintf(fout,"soap_default_%s(soap, &n);", c_ident(n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12626 else if (n->type==Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12627 fprintf(fout,"n.soap_default(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12628 else if (n->type != Tfun && !is_void(n) && !is_XML(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12629 fprintf(fout,"soap_default_%s(soap, &n);", c_ident(n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12630 fprintf(fout, "\n\t\tif (tag && *tag != '-' && (*soap->id || *soap->href))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12631 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12632 if (is_XML(n) && is_string(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12633 fprintf(fout, "if (!soap_inliteral(soap, tag, NULL))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12634 else if (is_XML(n) && is_wstring(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12635 fprintf(fout, "if (!soap_inwliteral(soap, tag, NULL))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12636 else if (n->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12637 fprintf(fout, "if (!soap_in_%s(soap, tag, NULL, \"%s\"))", c_ident(n),xsi_type(n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12638 else if (n->type != Tfun && !is_void(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12639 fprintf(fout, "if (!soap_in_%s(soap, tag, NULL, \"%s\"))", c_ident(n),xsi_type(n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12640 fprintf(fout, "\n\t\t\t\tbreak;\n\t\t}\n\t\telse ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12641 if (is_XML(n) && is_string(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12642 fprintf(fout, "if (!soap_inliteral(soap, tag, &n))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12643 else if (is_XML(n) && is_wstring(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12644 fprintf(fout, "if (!soap_inwliteral(soap, tag, &n))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12645 else if (n->type==Tarray)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12646 fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n),xsi_type(n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12647 else if (n->type != Tfun && !is_void(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12648 fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n),xsi_type(n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12649 fprintf(fout, "\n\t\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12650 fprintf(fout, "\n\t\tif (!a && !(a = soap_new_%s(soap, -1)))\n\t\t\treturn NULL;", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12651 if ((!strcmp(typ->id->name, "std::vector") || !strcmp(typ->id->name, "std::deque")) && (is_primitive(n) || n->type == Tpointer))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12652 fprintf(fout, "\n\t\ta->push_back(n);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12653 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12654 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12655 if (is_primitive(n) || n->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12656 fprintf(fout, "\n\t\ta->insert(a->end(), n);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12657 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12658 fprintf(fout, "\n\t\tsoap_update_pointers(soap, (char*)&n, (char*)&n + sizeof(n), (char*)&(*a->insert(a->end(), n)), (char*)&n);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12659 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12660 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12661 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12662 default: break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12663 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12664 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12665 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12666
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12667
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12668 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12669 soap_in_Darray(Tnode *typ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12670 { int i, j, d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12671 Entry *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12672 Table *t, *table;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12673 char *nsa = ns_qualifiedAttribute(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12674
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12675 table=(Table *)typ->ref;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12676 p = is_dynamic_array(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12677 d = get_Darraydims(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12678
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12679 if (is_external(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12680 { 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12681 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12682 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12683 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, "*"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12684 if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12685 { fprintf(fout,"\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12686 fprintf(fout,"\n{\treturn soap_in_%s(soap, tag, this, type);\n}", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12687 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12688 fflush(fout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12689 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"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12690 if ((has_ns(typ) || is_untyped(typ)) && is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12691 fprintf(fout,"\n{\n\t(void)type; /* appease -Wall -Werror */");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12692 else if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12693 fprintf(fout,"\n{\tint i, j, n;\n\t%s;", c_type_id(p->info.typ, "p"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12694 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12695 fprintf(fout,"\n{\tint i, j;\n\t%s;", c_type_id(p->info.typ, "p"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12696 fprintf(fout,"\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12697 if (has_ns(typ) || is_untyped(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12698 { if (is_hexBinary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12699 fprintf(fout,"\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":hexBinary\"))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12700 else if (is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12701 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\"))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12702 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12703 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12704 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12705 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12706 fprintf(fout,"\n\tif (soap_match_array(soap, type))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12707 fprintf(fout,"\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12708 if (typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12709 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12710 fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12711 fprintf(fout,"\n\tif (soap->alloced)\n\t\ta->soap_default(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12712 for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12713 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12714 if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12715 soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12716 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12717 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12718 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12719 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12720 fprintf(fout,"\n\tif (!a)\n\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12721 /*fprintf(fout,"\n\tif (soap->alloced)");*/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12722 fprintf(fout,"\n\tsoap_default_%s(soap, a);", c_ident(typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12723 for (t = (Table*)typ->ref; t; t = t->prev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12724 { for (p = t->list; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12725 if (p->info.sto & Sattribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12726 soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12727 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12728 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12729 fprintf(fout,"\n\tif (soap->body && !*soap->href)\n\t{");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12730 p = is_dynamic_array(typ);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12731 if ((has_ns(typ) || is_untyped(typ)) && is_binary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12732 { if (is_hexBinary(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12733 fprintf(fout,"\n\t\ta->__ptr = soap_gethex(soap, &a->__size);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12734 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12735 { fprintf(fout,"\n\t\ta->__ptr = soap_getbase64(soap, &a->__size, 0);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12736 if (is_attachment(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12737 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");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12738 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12739 fprintf(fout,"\n\t\tif ((!a->__ptr && soap->error) || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12740 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12741 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12742 { if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12743 { fprintf(fout,"\n\t\tn = soap_getsizes(soap->arraySize, a->__size, %d);", d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12744 if (has_offset(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12745 fprintf(fout,"\n\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, a->__offset, %d);", d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12746 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12747 fprintf(fout,"\n\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, NULL, %d);", d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12748 if (p->info.minOccurs > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12749 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12750 if (p->info.maxOccurs > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12751 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12752 fprintf(fout,"\n\t\tif (n >= 0)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12753 if (((Tnode*)p->info.typ->ref)->type == Tclass
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12754 || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12755 { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12756 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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12757 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12758 else if (((Tnode*)p->info.typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12759 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12760 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12761 else if (has_class((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12762 { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12763 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12764 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12765 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12766 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12767 if (((Tnode*)p->info.typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12768 fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12769 else if (!is_XML((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12770 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12771 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12772 fprintf(fout,"\n\t\t\tfor (i = 0; i < n; i++)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12773 fprintf(fout,"\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position == %d)", d);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12774 fprintf(fout,"\n\t\t\t\t{\ti = ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12775 for (i = 0; i < d; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12776 { fprintf(fout,"soap->positions[%d]", i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12777 for (j = 1; j < d-i; j++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12778 fprintf(fout,"*a->__size[%d]", j);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12779 if (i < d-1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12780 fprintf(fout,"+");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12781 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12782 fprintf(fout,"-j;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12783 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12784 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12785 fprintf(fout,"\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12786 fprintf(fout,"\n\t\t\t\t\tsoap->error = SOAP_OK;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12787 fprintf(fout,"\n\t\t\t\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12788 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12789 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12790 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12791 { fprintf(fout,"\n\t\ta->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12792 if (has_offset(typ) && (p->next->next->info.sto & Sconst) == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12793 { fprintf(fout,"\n\t\ta->__offset = j;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12794 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12795 if (p->info.minOccurs > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12796 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12797 if (p->info.maxOccurs > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12798 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12799 fprintf(fout,"\n\t\tif (a->__size >= 0)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12800 if (((Tnode*)p->info.typ->ref)->type == Tclass
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12801 || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12802 { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12803 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)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12804 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12805 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12806 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12807 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12808 else if (has_class((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12809 { fprintf(fout,"\n\t\t{\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12810 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12811 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12812 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12813 { 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12814 if (((Tnode*)p->info.typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12815 fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12816 else if (!is_XML((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12817 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12818 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12819 fprintf(fout,"\n\t\t\tfor (i = 0; i < a->__size; i++)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12820 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}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12821 if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12822 fprintf(fout,"\n\t\t\t\tif (!soap_inliteral(soap, NULL, a->%s + i))", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12823 else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12824 fprintf(fout,"\n\t\t\t\tif (!soap_inwliteral(soap, NULL, a->%s + i))", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12825 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12826 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12827 fprintf(fout,"\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12828 fprintf(fout,"\n\t\t\t\t\tsoap->error = SOAP_OK;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12829 fprintf(fout,"\n\t\t\t\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12830 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12831 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12832 fprintf(fout,"\n\t\t\t}\n\t\t}\n\t\telse");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12833 fprintf(fout,"\n\t\t{\tif (soap_new_block(soap) == NULL)\n\t\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12834 if (p->info.maxOccurs > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12835 { if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12836 fprintf(fout,"\n\t\t\tfor (a->__size[0] = 0; a->__size[0] <= " SOAP_LONG_FORMAT "; a->__size[0]++)", p->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12837 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12838 fprintf(fout,"\n\t\t\tfor (a->__size = 0; a->__size <= " SOAP_LONG_FORMAT "; a->__size++)", p->info.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12839 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12840 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12841 { if (d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12842 fprintf(fout,"\n\t\t\tfor (a->__size[0] = 0; ; a->__size[0]++)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12843 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12844 fprintf(fout,"\n\t\t\tfor (a->__size = 0; ; a->__size++)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12845 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12846 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12847 if (((Tnode*)p->info.typ->ref)->type == Tclass || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12848 fprintf(fout,"\n\t\t\t\tSOAP_PLACEMENT_NEW(p, %s);", c_type((Tnode*)p->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12849 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))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12850 fprintf(fout,"\n\t\t\t\tp->soap_default(soap);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12851 else if (((Tnode*)p->info.typ->ref)->type == Tpointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12852 fprintf(fout,"\n\t\t\t\t*p = NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12853 else if (!is_XML((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12854 fprintf(fout,"\n\t\t\t\tsoap_default_%s(soap, p);", c_ident((Tnode*)p->info.typ->ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12855 if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12856 fprintf(fout,"\n\t\t\t\tif (!soap_inliteral(soap, NULL, p))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12857 else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12858 fprintf(fout,"\n\t\t\t\tif (!soap_inwliteral(soap, NULL, p))");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12859 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12860 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12861 fprintf(fout,"\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12862 fprintf(fout,"\n\t\t\t\t\tsoap->error = SOAP_OK;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12863 fprintf(fout,"\n\t\t\t\t\tbreak;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12864 fprintf(fout,"\n\t\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12865 fprintf(fout,"\n\t\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12866 fprintf(fout,"\n\t\t\tsoap_pop_block(soap, NULL);");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12867 if (p->info.minOccurs > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12868 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12869 if (p->info.maxOccurs > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12870 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);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12871 if (((Tnode*)p->info.typ->ref)->type == Tclass
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12872 || has_class((Tnode*)p->info.typ->ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12873 || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12874 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12875 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12876 fprintf(fout,"\n\t\t\ta->%s = (%s)soap_malloc(soap, soap->blist->size);", ident(p->sym->name), c_type(p->info.typ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12877 fprintf(fout,"\n\t\t\tsoap_save_block(soap, NULL, (char*)a->%s, 1);", ident(p->sym->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12878 fprintf(fout,"\n\t\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12879 fprintf(fout,"\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12880 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12881 if (has_getter(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12882 fprintf(fout,"\n\t\tif (a->get(soap))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12883 fprintf(fout,"\n\t}\n\telse\n\t{\t");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12884 if (is_attachment(typ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12885 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");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12886 if (typ->type == Tclass)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12887 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12888 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12889 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));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12890 fprintf(fout,"\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12891 fprintf(fout,"\n\t}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12892 fprintf(fout,"\n\treturn a;\n}");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12893 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12894
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12895 const char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12896 cstring(const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12897 { size_t n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12898 char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12899 const char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12900 for (n = 0, r = s; *r; n++, r++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12901 if (*r == '"' || *r == '\\')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12902 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12903 else if (*r < 32)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12904 n += 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12905 r = t = (char*)emalloc(n + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12906 for (; *s; s++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12907 { if (*s == '"' || *s == '\\')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12908 { *t++ = '\\';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12909 *t++ = *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12910 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12911 else if (*s < 32)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12912 { sprintf(t, "\\%03o", (unsigned int)(unsigned char)*s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12913 t += 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12914 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12915 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12916 *t++ = *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12917 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12918 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12919 return r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12920 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12921
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12922 const char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12923 xstring(const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12924 { size_t n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12925 char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12926 const char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12927 for (n = 0, r = s; *r; n++, r++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12928 { if (*r < 32 || *r >= 127)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12929 n += 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12930 else if (*r == '<' || *r == '>')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12931 n += 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12932 else if (*r == '&')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12933 n += 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12934 else if (*r == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12935 n += 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12936 else if (*r == '\\')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12937 n += 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12938 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12939 r = t = (char*)emalloc(n + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12940 for (; *s; s++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12941 { if (*s < 32 || *s >= 127)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12942 { sprintf(t, "&#%.2x;", (unsigned char)*s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12943 t += 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12944 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12945 else if (*s == '<')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12946 { strcpy(t, "&lt;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12947 t += 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12948 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12949 else if (*s == '>')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12950 { strcpy(t, "&gt;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12951 t += 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12952 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12953 else if (*s == '&')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12954 { strcpy(t, "&amp;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12955 t += 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12956 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12957 else if (*s == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12958 { strcpy(t, "&quot;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12959 t += 6;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12960 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12961 else if (*s == '\\')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12962 { strcpy(t, "\\\\");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12963 t += 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12964 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12965 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12966 *t++ = *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12967 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12968 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12969 return r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12970 }