annotate GEMBASSY-1.0.3/gsoap/wsdl/types.cpp @ 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 types.cpp
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4 Generate gSOAP types from XML schemas (e.g. embedded in WSDL).
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) 2001-2013, Robert van Engelen, Genivia Inc. All Rights Reserved.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9 This 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 A commercial use license is available from Genivia, Inc., contact@genivia.com
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
31 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
33 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
34
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
35 #include "types.h"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
36
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
37 static char *getline(char *s, size_t n, FILE *fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
38 static const char *nonblank(const char *s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
39 static const char *fill(char *t, int n, const char *s, int e);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
40 static const char *utf8(char *t, const char *s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
41 static const char *cstring(const char *s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
42 static const char *xstring(const char *s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
43 static bool is_integer(const char *s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
44 static LONG64 to_integer(const char *s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
45 static void documentation(const char *text);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
46 static void operations(const char *t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
47
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
48 static int comment_nest = 0; /* keep track of block comments to avoid nesting */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
49
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
50 ////////////////////////////////////////////////////////////////////////////////
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
51 //
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
52 // Keywords and reserved words
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
53 //
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
54 ////////////////////////////////////////////////////////////////////////////////
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
55
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
56 static const char *keywords[] =
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
57 { "and",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
58 "asm",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
59 "auto",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
60 "bool",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
61 "break",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
62 "case",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
63 "catch",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
64 "char",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
65 "class",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
66 "const",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
67 "const_cast",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
68 "continue",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
69 "default",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
70 "delete",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
71 "do",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
72 "double",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
73 "dynamic_cast",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
74 "else",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
75 "enum",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
76 "errno",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
77 "explicit",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
78 "export",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
79 "extern",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
80 "false",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
81 "FILE",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
82 "float",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
83 "for",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
84 "friend",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
85 "goto",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
86 "if",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
87 "inline",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
88 "int",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
89 "interface",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
90 "long",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
91 "LONG64",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
92 "max",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
93 "min",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
94 "mustUnderstand",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
95 "mutable",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
96 "namespace",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
97 "new",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
98 "not",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
99 "NULL",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
100 "operator",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
101 "or",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
102 "private",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
103 "protected",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
104 "public",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
105 "_QName",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
106 "register",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
107 "reinterpret_cast",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
108 "restrict",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
109 "return",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
110 "short",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
111 "signed",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
112 "size_t",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
113 "sizeof",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
114 "soap",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
115 "static",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
116 "static_cast",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
117 "struct",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
118 "switch",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
119 "template",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
120 "this",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
121 "throw",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
122 "time_t",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
123 "true",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
124 "typedef",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
125 "typeid",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
126 "typeof",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
127 "typename",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
128 "ULONG64",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
129 "union",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
130 "unsigned",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
131 "using",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
132 "virtual",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
133 "void",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
134 "volatile",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
135 "wchar_t",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
136 "while",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
137 "XML",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
138 "_XML",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
139 "xor",
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
140 };
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
141
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
142 ////////////////////////////////////////////////////////////////////////////////
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
143 //
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
144 // Types methods
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
145 //
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
146 ////////////////////////////////////////////////////////////////////////////////
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
147
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
148 Types::Types()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
149 { init();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
150 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
151
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
152 int Types::read(const char *file)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
153 { FILE *fd;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
154 char buf[1024], xsd[1024], def[1024], use[1024], ptr[1024], uri[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
155 const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
156 short copy = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
157 strcpy(buf, file);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
158 fd = fopen(buf, "r");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
159 if (!fd && import_path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
160 { strcpy(buf, import_path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
161 strcat(buf, "/");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
162 strcat(buf, file);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
163 fd = fopen(buf, "r");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
164 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
165 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
166 { fprintf(stderr, "Cannot open file '%s'\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
167 return SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
168 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
169 fprintf(stderr, "Reading type definitions from type map file '%s'\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
170 while (getline(buf, sizeof(buf), fd))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
171 { s = buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
172 if (copy)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
173 { if (*s == ']')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
174 copy = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
175 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
176 fprintf(stream, "%s\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
177 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
178 else if (*s == '[')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
179 copy = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
180 else if (*s == '<')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
181 { s = fill(uri, sizeof(uri), s+1, -1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
182 infile[infiles++] = estrdup(uri);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
183 if (infiles >= MAXINFILES)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
184 { fprintf(stderr, "wsdl2h: too many files\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
185 exit(1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
186 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
187 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
188 else if (*s == '>')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
189 { s = fill(uri, sizeof(uri), s+1, -1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
190 if (!outfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
191 { outfile = estrdup(uri);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
192 stream = fopen(outfile, "w");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
193 if (!stream)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
194 { fprintf(stderr, "Cannot write to %s\n", outfile);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
195 exit(1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
196 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
197 if (cppnamespace)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
198 fprintf(stream, "namespace %s {\n", cppnamespace);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
199 fprintf(stderr, "Saving %s\n\n", outfile);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
200 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
201 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
202 else if (*s && *s != '#')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
203 { s = fill(xsd, sizeof(xsd), s, '=');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
204 if (strstr(xsd, "__"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
205 { if (s && *s == '=')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
206 { s = fill(use, sizeof(use), s+1, '|');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
207 if (*xsd && *use)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
208 { s = estrdup(xsd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
209 eqvtypemap[s] = estrdup(use);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
210 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
211 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
212 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
213 { s = fill(def, sizeof(def), s, '|');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
214 s = fill(use, sizeof(use), s, '|');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
215 s = fill(ptr, sizeof(ptr), s, '|');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
216 if (*xsd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
217 { s = estrdup(xsd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
218 if (*def == '$')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
219 { const char *t = modtypemap[s];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
220 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
221 { char *r = (char*)emalloc(strlen(t) + strlen(def) + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
222 strcpy(r, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
223 strcat(r, def);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
224 free((void*)modtypemap[s]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
225 modtypemap[s] = r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
226 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
227 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
228 modtypemap[s] = estrdup(def);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
229 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
230 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
231 { if (*def)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
232 { if (strcmp(def, "..."))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
233 deftypemap[s] = estrdup(def);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
234 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
235 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
236 deftypemap[s] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
237 if (*use)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
238 usetypemap[s] = estrdupf(use);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
239 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
240 usetypemap[s] = estrdupf(xsd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
241 if (*ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
242 ptrtypemap[s] = estrdupf(ptr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
243 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
244 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
245 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
246 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
247 else if (*xsd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
248 { s = fill(uri, sizeof(uri), s, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
249 if (uri[0] == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
250 { uri[strlen(uri) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
251 nsprefix(xsd, estrdup(uri + 1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
252 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
253 else if (uri[0] == '<')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
254 { uri[strlen(uri) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
255 char *s = estrdup(uri + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
256 nsprefix(xsd, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
257 exturis.insert(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
258 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
259 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
260 nsprefix(xsd, estrdup(uri));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
261 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
262 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
263 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
264 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
265 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
266 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
267
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
268 void Types::init()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
269 { snum = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
270 unum = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
271 gnum = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
272 with_union = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
273 fake_union = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
274 knames.insert(keywords, keywords + sizeof(keywords)/sizeof(char*));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
275 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
276 { deftypemap["xsd__ur_type"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
277 if (dflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
278 { usetypemap["xsd__ur_type"] = "xsd__anyType";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
279 ptrtypemap["xsd__ur_type"] = "xsd__anyType*";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
280 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
281 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
282 { usetypemap["xsd__ur_type"] = "_XML";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
283 ptrtypemap["xsd__ur_type"] = "_XML";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
284 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
285 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
286 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
287 { deftypemap["xsd__ur_type"] = "class xsd__ur_type { _XML __item; struct soap *soap; };";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
288 usetypemap["xsd__ur_type"] = "xsd__ur_type";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
289 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
290 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
291 { deftypemap["xsd__anyType"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
292 if (dflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
293 { usetypemap["xsd__anyType"] = "xsd__anyType";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
294 ptrtypemap["xsd__anyType"] = "xsd__anyType*";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
295 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
296 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
297 { usetypemap["xsd__anyType"] = "_XML";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
298 ptrtypemap["xsd__anyType"] = "_XML";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
299 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
300 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
301 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
302 { if (dflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
303 { deftypemap["xsd__anyType"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
304 usetypemap["xsd__anyType"] = "xsd__anyType";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
305 ptrtypemap["xsd__anyType"] = "xsd__anyType*";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
306 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
307 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
308 { deftypemap["xsd__anyType"] = "class xsd__anyType { _XML __item; struct soap *soap; };";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
309 usetypemap["xsd__anyType"] = "xsd__anyType*";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
310 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
311 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
312 deftypemap["xsd__any"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
313 if (dflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
314 { usetypemap["xsd__any"] = "xsd__anyType";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
315 ptrtypemap["xsd__any"] = "xsd__anyType*";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
316 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
317 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
318 { usetypemap["xsd__any"] = "_XML";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
319 ptrtypemap["xsd__any"] = "_XML";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
320 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
321 deftypemap["xsd__anyAttribute"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
322 if (dflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
323 { usetypemap["xsd__anyAttribute"] = "xsd__anyAttribute";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
324 ptrtypemap["xsd__anyAttribute"] = "xsd__anyAttribute*";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
325 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
326 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
327 { usetypemap["xsd__anyAttribute"] = "_XML";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
328 ptrtypemap["xsd__anyAttribute"] = "_XML";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
329 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
330 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
331 { deftypemap["xsd__base64Binary"] = "struct xsd__base64Binary\n{\tunsigned char *__ptr;\n\tint __size;\n\tchar *id, *type, *options; // NOTE: non-NULL for DIMEM/MIME/MTOM XOP attachments only\n};";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
332 usetypemap["xsd__base64Binary"] = "struct xsd__base64Binary";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
333 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
334 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
335 { deftypemap["xsd__base64Binary"] = "class xsd__base64Binary\n{\tunsigned char *__ptr;\n\tint __size;\n\tchar *id, *type, *options; // NOTE: non-NULL for DIMEM/MIME/MTOM XOP attachments only\n\tstruct soap *soap;\n};";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
336 usetypemap["xsd__base64Binary"] = "xsd__base64Binary";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
337 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
338 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
339 { if (eflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
340 deftypemap["xsd__boolean"] = "enum xsd__boolean { false_, true_ };";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
341 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
342 deftypemap["xsd__boolean"] = "enum xsd__boolean { xsd__boolean__false_, xsd__boolean__true_ };";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
343 usetypemap["xsd__boolean"] = "enum xsd__boolean";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
344 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
345 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
346 { deftypemap["xsd__boolean"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
347 usetypemap["xsd__boolean"] = "bool";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
348 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
349 deftypemap["xsd__byte"] = "typedef char xsd__byte;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
350 usetypemap["xsd__byte"] = "xsd__byte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
351 deftypemap["xsd__dateTime"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
352 usetypemap["xsd__dateTime"] = "time_t";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
353 deftypemap["xsd__double"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
354 usetypemap["xsd__double"] = "double";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
355 deftypemap["xsd__float"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
356 usetypemap["xsd__float"] = "float";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
357 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
358 { deftypemap["xsd__hexBinary"] = "struct xsd__hexBinary { unsigned char *__ptr; int __size; };";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
359 usetypemap["xsd__hexBinary"] = "struct xsd__hexBinary";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
360 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
361 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
362 { deftypemap["xsd__hexBinary"] = "class xsd__hexBinary { unsigned char *__ptr; int __size; };";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
363 usetypemap["xsd__hexBinary"] = "xsd__hexBinary";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
364 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
365 deftypemap["xsd__int"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
366 usetypemap["xsd__int"] = "int";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
367 deftypemap["xsd__long"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
368 usetypemap["xsd__long"] = "LONG64";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
369 deftypemap["xsd__short"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
370 usetypemap["xsd__short"] = "short";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
371 if (cflag || sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
372 { deftypemap["xsd__string"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
373 usetypemap["xsd__string"] = "char*";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
374 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
375 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
376 { deftypemap["xsd__string"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
377 usetypemap["xsd__string"] = "std::string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
378 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
379 if (cflag || sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
380 { deftypemap["xsd__QName"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
381 usetypemap["xsd__QName"] = "_QName";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
382 ptrtypemap["xsd__QName"] = "_QName";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
383 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
384 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
385 { deftypemap["xsd__QName"] = "typedef std::string xsd__QName;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
386 usetypemap["xsd__QName"] = "xsd__QName";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
387 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
388 deftypemap["xsd__unsignedByte"] = "typedef unsigned char xsd__unsignedByte;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
389 usetypemap["xsd__unsignedByte"] = "xsd__unsignedByte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
390 deftypemap["xsd__unsignedInt"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
391 usetypemap["xsd__unsignedInt"] = "unsigned int";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
392 deftypemap["xsd__unsignedLong"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
393 usetypemap["xsd__unsignedLong"] = "ULONG64";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
394 deftypemap["xsd__unsignedShort"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
395 usetypemap["xsd__unsignedShort"] = "unsigned short";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
396 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
397 { deftypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary { unsigned char *__ptr; int __size; };";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
398 usetypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
399 deftypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64 { unsigned char *__ptr; int __size; };";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
400 usetypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
401 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
402 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
403 { deftypemap["SOAP_ENC__base64Binary"] = "class SOAP_ENC__base64Binary { unsigned char *__ptr; int __size; };";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
404 usetypemap["SOAP_ENC__base64Binary"] = "SOAP_ENC__base64Binary";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
405 deftypemap["SOAP_ENC__base64"] = "class SOAP_ENC__base64 { unsigned char *__ptr; int __size; };";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
406 usetypemap["SOAP_ENC__base64"] = "SOAP_ENC__base64";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
407 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
408 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
409 { deftypemap["SOAP_ENC__boolean"] = "enum SOAP_ENC__boolean { false_, true_ };";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
410 usetypemap["SOAP_ENC__boolean"] = "enum SOAP_ENC__boolean";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
411 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
412 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
413 { deftypemap["SOAP_ENC__boolean"] = "typedef bool SOAP_ENC__boolean;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
414 usetypemap["SOAP_ENC__boolean"] = "SOAP_ENC__boolean";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
415 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
416 deftypemap["SOAP_ENC__byte"] = "typedef char SOAP_ENC__byte;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
417 usetypemap["SOAP_ENC__byte"] = "SOAP_ENC__byte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
418 deftypemap["SOAP_ENC__dateTime"] = "typedef time_t SOAP_ENC__dateTime;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
419 usetypemap["SOAP_ENC__dateTime"] = "SOAP_ENC__dateTime";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
420 deftypemap["SOAP_ENC__double"] = "typedef double SOAP_ENC__double;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
421 usetypemap["SOAP_ENC__double"] = "SOAP_ENC__double";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
422 deftypemap["SOAP_ENC__float"] = "typedef float SOAP_ENC__float";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
423 usetypemap["SOAP_ENC__float"] = "SOAP_ENC__float";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
424 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
425 { deftypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary { unsigned char *__ptr; int __size; };";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
426 usetypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
427 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
428 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
429 { deftypemap["SOAP_ENC__hexBinary"] = "class SOAP_ENC__hexBinary { unsigned char *__ptr; int __size; };";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
430 usetypemap["SOAP_ENC__hexBinary"] = "SOAP_ENC__hexBinary";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
431 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
432 deftypemap["SOAP_ENC__int"] = "typedef int SOAP_ENC__int;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
433 usetypemap["SOAP_ENC__int"] = "SOAP_ENC__int";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
434 deftypemap["SOAP_ENC__long"] = "typedef LONG64 SOAP_ENC__long;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
435 usetypemap["SOAP_ENC__long"] = "SOAP_ENC__long";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
436 deftypemap["SOAP_ENC__short"] = "typedef short SOAP_ENC__short;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
437 usetypemap["SOAP_ENC__short"] = "SOAP_ENC__short";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
438 if (cflag || sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
439 { deftypemap["SOAP_ENC__string"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
440 usetypemap["SOAP_ENC__string"] = "char*";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
441 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
442 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
443 { deftypemap["SOAP_ENC__string"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
444 usetypemap["SOAP_ENC__string"] = "std::string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
445 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
446 deftypemap["SOAP_ENC__unsignedByte"] = "typedef unsigned char SOAP_ENC__unsignedByte;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
447 usetypemap["SOAP_ENC__unsignedByte"] = "SOAP_ENC__unsignedByte";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
448 deftypemap["SOAP_ENC__unsignedInt"] = "typedef unsigned int SOAP_ENC__unsignedInt;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
449 usetypemap["SOAP_ENC__unsignedInt"] = "SOAP_ENC__unsignedInt";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
450 deftypemap["SOAP_ENC__unsignedLong"] = "typedef ULONG64 SOAP_ENC__unsignedLong;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
451 usetypemap["SOAP_ENC__unsignedLong"] = "SOAP_ENC__unsignedLong";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
452 deftypemap["SOAP_ENC__unsignedShort"] = "typedef unsigned short SOAP_ENC__unsignedShort;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
453 usetypemap["SOAP_ENC__unsignedShort"] = "SOAP_ENC__unsignedShort";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
454 deftypemap["SOAP_ENC__Array"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
455 usetypemap["SOAP_ENC__Array"] = "struct { _XML *__ptr; int __size; }";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
456 deftypemap["_SOAP_ENC__arrayType"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
457 deftypemap["SOAP_ENV__Header"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
458 usetypemap["SOAP_ENV__Header"] = "struct SOAP_ENV__Header";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
459 deftypemap["_SOAP_ENV__mustUnderstand"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
460 if (cflag || sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
461 usetypemap["_SOAP_ENV__mustUnderstand"] = "char*";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
462 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
463 usetypemap["_SOAP_ENV__mustUnderstand"] = "std::string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
464 deftypemap["SOAP_ENV__Fault"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
465 usetypemap["SOAP_ENV__Fault"] = "struct SOAP_ENV__Fault";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
466 deftypemap["SOAP_ENV__detail"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
467 usetypemap["SOAP_ENV__detail"] = "struct SOAP_ENV__Detail";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
468 deftypemap["SOAP_ENV__Detail"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
469 usetypemap["SOAP_ENV__Detail"] = "struct SOAP_ENV__Detail";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
470 deftypemap["SOAP_ENV__Code"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
471 usetypemap["SOAP_ENV__Code"] = "struct SOAP_ENV__Code";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
472 deftypemap["SOAP_ENV__Reason"] = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
473 usetypemap["SOAP_ENV__Reason"] = "struct SOAP_ENV__Reason";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
474 if (read(mapfile))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
475 fprintf(stderr, "Problem reading type map file '%s'.\nUsing internal type definitions for %s instead.\n\n", mapfile, cflag?"C":"C++");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
476 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
477
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
478 const char *Types::nsprefix(const char *prefix, const char *URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
479 { if (URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
480 { const char *s = uris[URI];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
481 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
482 { size_t n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
483 if (!prefix || !*prefix || *prefix == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
484 s = schema_prefix;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
485 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
486 s = estrdup(prefix);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
487 if (!syms[s])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
488 n = syms[s] = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
489 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
490 n = ++syms[s];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
491 if (n != 1 || !prefix || !*prefix || *prefix == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
492 { char *t = (char*)emalloc(strlen(s) + 16);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
493 sprintf(t, "%s%lu", s, (unsigned long)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
494 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
495 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
496 uris[URI] = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
497 if (vflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
498 fprintf(stderr, "namespace prefix %s = \"%s\"\n", s, URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
499 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
500 // if *prefix == '_', then add prefix string to s
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
501 if (prefix && *prefix == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
502 { char *t = (char*)emalloc(strlen(s) + 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
503 *t = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
504 strcpy(t + 1, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
505 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
506 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
507 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
508 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
509 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
510 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
511
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
512 const char *Types::prefix(const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
513 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
514 char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
515 if (*name == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
516 { s = strchr(name + 1, '"');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
517 t = (char*)emalloc(s - name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
518 strncpy(t, name + 1, s - name - 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
519 t[s - name - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
520 return nsprefix(NULL, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
521 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
522 s = strchr(name, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
523 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
524 { t = (char*)emalloc(s - name + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
525 strncpy(t, name, s - name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
526 t[s - name] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
527 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
528 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
529 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
530 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
531
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
532 const char *Types::uri(const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
533 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
534 char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
535 if (*name == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
536 { s = strchr(name + 1, '"');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
537 t = (char*)emalloc(s - name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
538 strncpy(t, name + 1, s - name - 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
539 t[s - name - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
540 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
541 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
542 s = strchr(name, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
543 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
544 { struct Namespace *p = namespaces;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
545 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
546 { for (p += 6; p->id; p++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
547 { if (!strncmp(p->id, name, s - name) && !p->id[s - name])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
548 { if (p->in && *p->in)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
549 return p->in;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
550 return p->ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
551 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
552 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
553 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
554 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
555 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
556 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
557
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
558 // Find a C name for a QName. If the name has no qualifier, use URI. Suggest prefix for URI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
559 const char *Types::fname(const char *prefix, const char *URI, const char *qname, SetOfString *reserved, enum Lookup lookup, bool isqname)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
560 { char buf[1024], *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
561 const char *p, *s, *name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
562 if (!qname)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
563 { fprintf(stream, "// Warning: internal error, no QName in fname()\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
564 if (vflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
565 fprintf(stderr, "Internal error, no QName in fname()\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
566 qname = "?";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
567 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
568 name = qname;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
569 if (isqname)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
570 s = strrchr(name, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
571 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
572 s = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
573 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
574 { name = s + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
575 if (qname[0] == '"' && qname[1] == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
576 s = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
577 else if (*qname == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
578 { t = (char*)emalloc(s - qname - 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
579 strncpy(t, qname + 1, s - qname - 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
580 t[s - qname - 2] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
581 URI = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
582 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
583 else if (!strncmp(qname, "xs:", 3)) // this hack is necessary since the nsmap table defines "xs" for "xsd"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
584 { s = "xsd";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
585 URI = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
586 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
587 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
588 { t = (char*)emalloc(s - qname + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
589 strncpy(t, qname, s - qname);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
590 t[s - qname] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
591 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
592 URI = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
593 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
594 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
595 if (URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
596 p = nsprefix(prefix, URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
597 else if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
598 p = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
599 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
600 p = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
601 s = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
602 if (lookup == LOOKUP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
603 { if (qnames.find(Pair(p,name)) != qnames.end())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
604 s = qnames[Pair(p,name)];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
605 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
606 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
607 { t = buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
608 if (!prefix || *prefix)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
609 { s = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
610 // no longer add '_' when URI != NULL, since nsprefix() will do this
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
611 if (prefix && *prefix == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
612 *t++ = ':';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
613 else if (prefix && *prefix == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
614 { if (!URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
615 *t++ = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
616 if (prefix[1] == '_') // ensures ns prefix starts with __
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
617 { strcpy(t, prefix + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
618 t += strlen(prefix + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
619 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
620 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
621 if (s && *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
622 { for (; *s; s++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
623 { if (isalnum(*s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
624 *t++ = *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
625 else if (*s == '-' && s[1] != '-' && s != p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
626 *t++ = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
627 else if (*s == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
628 { if (s == p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
629 *t++ = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
630 else if (!_flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
631 { strcpy(t, "_USCORE");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
632 t += 7;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
633 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
634 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
635 { s = utf8(t, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
636 t += 6;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
637 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
638 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
639 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
640 { s = utf8(t, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
641 t += 6;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
642 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
643 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
644 if (!prefix || *prefix != '*')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
645 { *t++ = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
646 *t++ = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
647 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
648 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
649 else if (isdigit(*name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
650 *t++ = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
651 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
652 for (s = name; *s; s++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
653 { if (isalnum(*s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
654 *t++ = *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
655 else if (*s == '-' && s[1] != '-' && s[1] != '\0' && s != name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
656 *t++ = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
657 else if (!_flag && *s == '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
658 { strcpy(t, "_USCORE");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
659 t += 7;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
660 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
661 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
662 { s = utf8(t, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
663 t += 6;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
664 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
665 if (t >= buf + sizeof(buf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
666 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
667 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
668 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
669 while (knames.find(buf) != knames.end() || (reserved && reserved->find(buf) != reserved->end()))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
670 { *t++ = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
671 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
672 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
673 if (isalpha(*buf) || *buf == '_' || *buf == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
674 { t = (char*)emalloc(strlen(buf) + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
675 strcpy(t, buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
676 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
677 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
678 { t = (char*)emalloc(strlen(buf) + 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
679 *t = '_';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
680 strcpy(t + 1, buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
681 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
682 if (lookup == LOOKUP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
683 { qnames[Pair(p,name)] = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
684 if (vflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
685 { cerr << "Mapping '" << p << ":" << name << "' to '" << t << "'" << endl;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
686 #ifdef DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
687 for (MapOfPairToString::const_iterator i = qnames.begin(); i != qnames.end(); ++i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
688 cerr << "Map[" << (*i).first.first << ":" << (*i).first.second << "]='" << (*i).second << "'" << endl;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
689 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
690 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
691 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
692 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
693 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
694 if (eqvtypemap.find(s) != eqvtypemap.end())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
695 s = eqvtypemap[s];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
696 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
697 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
698
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
699 bool Types::is_defined(const char *prefix, const char *URI, const char *qname)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
700 { const char *t = fname(prefix, URI, qname, NULL, LOOKUP, true);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
701 return usetypemap.find(t) != usetypemap.end();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
702 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
703
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
704 const char *Types::aname(const char *prefix, const char *URI, const char *qname)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
705 { return fname(prefix, URI, qname, NULL, NOLOOKUP, true);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
706 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
707
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
708 const char *Types::cname(const char *prefix, const char *URI, const char *qname)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
709 { return fname(prefix, URI, qname, NULL, LOOKUP, true);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
710 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
711
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
712 const char *Types::tname(const char *prefix, const char *URI, const char *qname)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
713 { const char *s, *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
714 t = cname(prefix, URI, qname);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
715 if (usetypemap.find(t) != usetypemap.end())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
716 { s = usetypemap[t];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
717 if (vflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
718 cerr << "Mapping use of '" << t << "' to '" << s << "'" << endl;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
719 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
720 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
721 { s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
722 fprintf(stream, "\n// Warning: undefined QName '%s' for type '%s' in namespace '%s' (FIXME: check WSDL and schema definitions)\n", qname?qname:"", t, URI?URI:"?");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
723 if (vflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
724 fprintf(stderr, "\nWarning: undefined QName '%s' for type '%s' in namespace '%s'\n", qname?qname:"", t, URI?URI:"?");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
725 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
726 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
727 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
728
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
729 const char *Types::tnameptr(bool flag, const char *prefix, const char *URI, const char *qname)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
730 { const char *s = pname(flag, prefix, URI, qname);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
731 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
732 { if (!strncmp(s, "char*", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
733 return "char**";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
734 if (!strchr(s, '*'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
735 { char *r = (char*)emalloc(strlen(s) + 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
736 strcpy(r, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
737 strcat(r, "*");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
738 return r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
739 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
740 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
741 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
742 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
743
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
744 const char *Types::pname(bool flag, const char *prefix, const char *URI, const char *qname)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
745 { const char *r, *s = NULL, *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
746 t = cname(prefix, URI, qname);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
747 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
748 { if (ptrtypemap.find(t) != ptrtypemap.end())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
749 s = ptrtypemap[t];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
750 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
751 { if (usetypemap.find(t) != usetypemap.end())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
752 s = usetypemap[t];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
753 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
754 { s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
755 fprintf(stream, "\n// Warning: undefined QName '%s' for pointer to type '%s' (FIXME: check WSDL and schema definitions)\n", qname, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
756 if (vflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
757 fprintf(stderr, "\nWarning: undefined QName '%s' for pointer to type '%s' in namespace '%s'\n", qname, t, URI?URI:"?");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
758 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
759 r = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
760 while (r && *r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
761 { r = strchr(r + 1, '*');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
762 if (r && *(r-1) != '/' && *(r+1) != '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
763 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
764 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
765 if (!r) // already pointer?
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
766 { char *p = (char*)emalloc(strlen(s) + 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
767 strcpy(p, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
768 strcat(p, "*");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
769 s = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
770 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
771 if (vflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
772 cerr << "Mapping pointer to '" << t << "' to '" << s << "'" << endl;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
773 ptrtypemap[t] = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
774 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
775 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
776 else if (usetypemap.find(t) != usetypemap.end())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
777 s = usetypemap[t];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
778 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
779 { s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
780 fprintf(stream, "\n// Warning: undefined QName '%s' for type '%s' in namespace '%s' (FIXME: check WSDL and schema definitions)\n", qname, t, URI?URI:"?");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
781 if (vflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
782 fprintf(stderr, "\nWarning: undefined QName '%s' for type '%s' in namespace '%s'\n", qname, t, URI?URI:"?");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
783 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
784 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
785 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
786
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
787 const char *Types::deftname(enum Type type, const char *pointer, bool is_pointer, const char *prefix, const char *URI, const char *qname)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
788 { char buf[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
789 char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
790 const char *q = NULL, *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
791 t = fname(prefix, URI, qname, NULL, LOOKUP, true);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
792 if (deftypemap[t])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
793 { if (vflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
794 fprintf(stderr, "Name %s already defined (probably in %s file)\n", qname, mapfile);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
795 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
796 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
797 if (usetypemap[t])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
798 { if (vflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
799 fprintf(stderr, "Name %s is mapped\n", qname);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
800 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
801 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
802 switch (type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
803 { case ENUM:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
804 q = "enum";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
805 if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
806 knames.insert(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
807 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
808 case STRUCT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
809 q = "struct";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
810 if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
811 knames.insert(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
812 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
813 case CLASS:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
814 case TYPEDEF:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
815 knames.insert(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
816 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
817 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
818 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
819 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
820 { strcpy(buf, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
821 strcat(buf, " ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
822 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
823 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
824 buf[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
825 strcat(buf, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
826 if (pointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
827 strcat(buf, pointer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
828 s = (char*)emalloc(strlen(buf) + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
829 strcpy(s, buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
830 usetypemap[t] = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
831 if (pointer || is_pointer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
832 ptrtypemap[t] = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
833 if (vflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
834 cerr << "Defined '" << t << "' ('" << qname << "' in namespace '" << (URI?URI:prefix?prefix:"") << "') as '" << s << endl;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
835 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
836 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
837
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
838 // get enumeration value. URI/type refers to the enum simpleType.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
839 const char *Types::ename(const char *type, const char *value, bool isqname)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
840 { const char *s = enames[Pair(type,value)];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
841 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
842 { s = fname(NULL, NULL, value, &rnames, NOLOOKUP, isqname);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
843 if (!eflag && type && *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
844 { // Add prefix to enum
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
845 if (!*s || (s[0] == '_' && s[1] == '\0'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
846 s = "_x0000";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
847 char *buf = (char*)emalloc(strlen(type) + strlen(s) + 3);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
848 // _xXXXX is OK here
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
849 if (s[0] == '_' && s[1] != 'x' && strncmp(s, "_USCORE", 7))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
850 sprintf(buf, "%s_%s", type, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
851 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
852 sprintf(buf, "%s__%s", type, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
853 s = buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
854 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
855 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
856 rnames.insert(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
857 enames[Pair(type,value)] = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
858 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
859 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
860 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
861
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
862 // get operation name
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
863 const char *Types::oname(const char *prefix, const char *URI, const char *qname)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
864 { const char *s = fname(prefix, URI, qname, NULL, LOOKUP, true);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
865 if (s && usetypemap.find(s) != usetypemap.end())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
866 { // Avoid name clash with structs/classes of the same name
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
867 onames.insert(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
868 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
869 s = fname(prefix, URI, qname, &onames, NOLOOKUP, true);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
870 onames.insert(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
871 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
872 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
873
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
874 // generate struct name
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
875 const char *Types::sname(const char *URI, const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
876 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
877 char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
878 if (!aflag && name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
879 { size_t len = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
880 for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
881 len += strlen(*i) + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
882 t = (char*)emalloc(len + strlen(name) + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
883 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
884 for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
885 { strcat(t, *j);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
886 strcat(t, "-");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
887 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
888 strcat(t, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
889 s = fname("_", URI, t, &rnames, NOLOOKUP, true);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
890 rnames.insert(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
891 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
892 else if (URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
893 { s = nsprefix(NULL, URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
894 t = (char*)emalloc(strlen(s) + 16);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
895 sprintf(t, "_%s__struct_%d", s, snum++);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
896 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
897 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
898 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
899 { t = (char*)emalloc(16);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
900 sprintf(t, "struct_%d", snum++);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
901 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
902 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
903 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
904 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
905
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
906 // generate union name
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
907 const char *Types::uname(const char *URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
908 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
909 char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
910 if (!aflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
911 { size_t len = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
912 for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
913 len += strlen(*i) + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
914 t = (char*)emalloc(len + 6);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
915 strcpy(t, "union");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
916 for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
917 { strcat(t, "-");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
918 strcat(t, *j);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
919 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
920 s = fname("_", URI, t, &rnames, NOLOOKUP, true);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
921 rnames.insert(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
922 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
923 else if (URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
924 { s = nsprefix(NULL, URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
925 t = (char*)emalloc(strlen(s) + 16);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
926 sprintf(t, "_%s__union_%d", s, unum++);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
927 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
928 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
929 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
930 { t = (char*)emalloc(16);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
931 sprintf(t, "_union_%d", unum++);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
932 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
933 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
934 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
935 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
936
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
937 // generate enum name
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
938 const char *Types::gname(const char *URI, const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
939 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
940 char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
941 if (!aflag && name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
942 { size_t len = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
943 for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
944 len += strlen(*i) + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
945 t = (char*)emalloc(len + strlen(name) + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
946 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
947 for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
948 { strcat(t, *j);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
949 strcat(t, "-");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
950 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
951 strcat(t, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
952 s = fname("_", URI, t, &rnames, LOOKUP, true);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
953 rnames.insert(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
954 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
955 else if (URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
956 { s = nsprefix(NULL, URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
957 t = (char*)emalloc(strlen(s) + 16);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
958 sprintf(t, "_%s__enum_%d", s, gnum++);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
959 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
960 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
961 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
962 { t = (char*)emalloc(16);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
963 sprintf(t, "enum_%d", gnum++);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
964 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
965 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
966 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
967 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
968
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
969 // checks if nillable or minOccurs=0 (and no default value is present)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
970 bool Types::is_nillable(const xs__element& element)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
971 { return !element.default_ && (element.nillable || (element.minOccurs && !strcmp(element.minOccurs, "0")));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
972 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
973
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
974 bool Types::is_basetypeforunion(const char *prefix, const char *URI, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
975 { const char *t = tname(prefix, URI, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
976 if (!strcmp(t, "std::string") || !strcmp(t, "std::wstring"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
977 return false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
978 return is_basetype(prefix, URI, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
979 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
980
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
981 bool Types::is_basetype(const char *prefix, const char *URI, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
982 { const char *t = tname(prefix, URI, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
983 if (!strncmp(t, "enum ", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
984 return true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
985 if (strstr(t, "__") && strcmp(t, "xsd__byte"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
986 return false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
987 return !strncmp(type, "xs:", 3) || !strncmp(type, "SOAP-ENC:", 9);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
988 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
989
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
990 void Types::dump(FILE *fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
991 { fprintf(fd, "\nTypes:\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
992 for (MapOfStringToString::const_iterator i = usetypemap.begin(); i != usetypemap.end(); ++i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
993 fprintf(fd, "%s=%s\n", (*i).first, (*i).second?(*i).second:"(null)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
994 fprintf(fd, "\nPointers:\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
995 for (MapOfStringToString::const_iterator j = ptrtypemap.begin(); j != ptrtypemap.end(); ++j)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
996 fprintf(fd, "%s=%s\n", (*j).first, (*j).second?(*j).second:"(null)");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
997 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
998
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
999 void Types::define(const char *URI, const char *name, const xs__complexType& complexType)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1000 { // generate prototype for structs/classes and store name
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1001 const char *prefix = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1002 if (complexType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1003 name = complexType.name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1004 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1005 prefix = "_";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1006 if (complexType.complexContent
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1007 && complexType.complexContent->restriction
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1008 && !strcmp(complexType.complexContent->restriction->base, "SOAP-ENC:Array"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1009 { if (strcmp(schema_prefix, "ns"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1010 prefix = "*";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1011 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1012 prefix = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1013 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1014 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1015 { const char *t = deftname(STRUCT, "*", true, prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1016 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1017 { if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1018 fprintf(stream, "\n/// Typedef synonym for struct %s.\ntypedef struct %s %s;\n", t, t, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1019 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1020 else if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1021 { t = deftypemap[cname(prefix, URI, name)];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1022 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1023 { fprintf(stream, "\n/// Imported complexType \"%s\":%s from typemap %s.\n", URI, name, mapfile?mapfile:"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1024 document(complexType.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1025 if (*t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1026 format(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1027 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1028 fprintf(stream, "// complexType definition intentionally left blank.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1029 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1030 }
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 { const char *t = deftname(CLASS, "*", true, prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1034 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1035 fprintf(stream, "\n// Forward declaration of class %s.\nclass %s;\n", t, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1036 else if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1037 { t = deftypemap[cname(prefix, URI, name)];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1038 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1039 { fprintf(stream, "\n/// Imported complexType \"%s\":%s from typemap %s.\n", URI, name, mapfile?mapfile:"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1040 document(complexType.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1041 if (*t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1042 format(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1043 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1044 fprintf(stream, "// complexType definition intentionally left blank.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1045 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1046 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1047 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1048 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1049
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1050 void Types::gen(const char *URI, const char *name, const xs__simpleType& simpleType, bool anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1051 { const char *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1052 const char *prefix = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1053 if (simpleType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1054 name = simpleType.name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1055 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1056 prefix = "_";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1057 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1058 { t = deftypemap[cname(NULL, URI, name)];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1059 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1060 { fprintf(stream, "\n/// Imported simpleType \"%s\":%s from typemap %s.\n", URI, name, mapfile?mapfile:"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1061 document(simpleType.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1062 if (*t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1063 format(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1064 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1065 fprintf(stream, "// simpleType definition intentionally left blank.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1066 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1067 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1068 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1069 if (simpleType.restriction)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1070 { const char *base = simpleType.restriction->base;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1071 if (!base && simpleType.restriction->simpleType)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1072 { if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1073 { if (simpleType.restriction->simpleType->list && simpleType.restriction->length && simpleType.restriction->length->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1074 { fprintf(stream, "\n/// \"%s\":%s is a simpleType restriction list with length %s.", URI?URI:"", name, simpleType.restriction->length->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1075 document(simpleType.restriction->length->annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1076 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1077 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1078 fprintf(stream, "\n/// \"%s\":%s is a simpleType restriction.", URI?URI:"", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1079 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1080 gen(URI, name, *simpleType.restriction->simpleType, anonymous);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1081 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1082 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1083 { if (!base)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1084 base = "xsd:string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1085 const char *baseURI = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1086 if (simpleType.restriction->simpleTypePtr() && simpleType.restriction->simpleTypePtr()->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1087 baseURI = simpleType.restriction->simpleTypePtr()->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1088 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1089 fprintf(stream, "\n/// \"%s\":%s is a simpleType restriction of %s.\n", URI?URI:"", name, base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1090 document(simpleType.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1091 document(simpleType.restriction->annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1092 if (!simpleType.restriction->enumeration.empty())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1093 { bool is_numeric = true; // check if all enumeration values are numeric
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1094 bool is_qname = !strcmp(base, "xs:QName");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1095 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1096 { t = deftname(ENUM, NULL, false, prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1097 if (t && !eflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1098 fprintf(stream, "/// Note: enum values are prefixed with '%s' to avoid name clashes, please use wsdl2h option -e to omit this prefix\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1099 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1100 if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1101 t = gname(URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1102 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1103 fprintf(stream, "enum %s\n{\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1104 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1105 fprintf(stream, " enum %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1106 for (vector<xs__enumeration>::const_iterator enumeration1 = simpleType.restriction->enumeration.begin(); enumeration1 != simpleType.restriction->enumeration.end(); ++enumeration1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1107 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1108 if ((s = (*enumeration1).value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1109 is_numeric &= is_integer(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1110 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1111 SetOfString enumvals;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1112 for (vector<xs__enumeration>::const_iterator enumeration2 = simpleType.restriction->enumeration.begin(); enumeration2 != simpleType.restriction->enumeration.end(); ++enumeration2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1113 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1114 document((*enumeration2).annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1115 if ((s = (*enumeration2).value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1116 { if (!enumvals.count(s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1117 { enumvals.insert(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1118 if (is_numeric)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1119 fprintf(stream, "\t%s = %s,\t///< %s value=\"%s\"\n", ename(t, s, false), s, base, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1120 else if (is_qname && (*enumeration2).value_)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1121 fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration2).value_, true), base, (*enumeration2).value_);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1122 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1123 fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, s, false), base, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1124 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1125 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1126 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1127 fprintf(stream, "//\tunrecognized: enumeration '%s' has no value\n", name?name:"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1128 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1129 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1130 { fprintf(stream, "};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1131 if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1132 fprintf(stream, "/// Typedef synonym for enum %s.\ntypedef enum %s %s;\n", t, t, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1133 if (pflag && simpleType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1134 { const char *s = aname(prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1135 knames.insert(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1136 s = aname(prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1137 fprintf(stream, "\n/// Class wrapper\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1138 fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1139 fprintf(stream, elementformat, tname(prefix, URI, name), "__item;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1140 modify(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1141 fprintf(stream, "\n};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1142 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1143 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1144 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1145 fprintf(stream, " }\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1146 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1147 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1148 { if (simpleType.restriction->length && simpleType.restriction->length->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1149 { fprintf(stream, "/// Length of this string is exactly %s characters\n", simpleType.restriction->length->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1150 document(simpleType.restriction->length->annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1151 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1152 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1153 { const char *a = NULL, *b = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1154 if (simpleType.restriction->minLength)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1155 { a = simpleType.restriction->minLength->value;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1156 document(simpleType.restriction->minLength->annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1157 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1158 if (simpleType.restriction->maxLength)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1159 { b = simpleType.restriction->maxLength->value;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1160 document(simpleType.restriction->maxLength->annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1161 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1162 if (a || b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1163 fprintf(stream, "/// Length of this string is within %s..%s characters\n", a?a:"0", b?b:"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1164 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1165 if (simpleType.restriction->precision && simpleType.restriction->precision->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1166 fprintf(stream, "/// %sprecision is %s (note: not automatically enforced)\n", simpleType.restriction->precision->fixed?"fixed ":"", simpleType.restriction->precision->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1167 if (simpleType.restriction->scale && simpleType.restriction->scale->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1168 fprintf(stream, "/// %sscale is %s (note: not automatically enforced)\n", simpleType.restriction->scale->fixed?"fixed ":"", simpleType.restriction->scale->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1169 if (simpleType.restriction->totalDigits && simpleType.restriction->totalDigits->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1170 fprintf(stream, "/// %snumber of total digits is %s (note: not automatically enforced)\n", simpleType.restriction->totalDigits->fixed?"fixed ":"", simpleType.restriction->totalDigits->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1171 if (simpleType.restriction->fractionDigits && simpleType.restriction->fractionDigits->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1172 fprintf(stream, "/// %snumber of fraction digits is %s (note: not automatically enforced)\n", simpleType.restriction->fractionDigits->fixed?"fixed ":"", simpleType.restriction->fractionDigits->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1173 for (vector<xs__pattern>::const_iterator pattern1 = simpleType.restriction->pattern.begin(); pattern1 != simpleType.restriction->pattern.end(); ++pattern1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1174 fprintf(stream, "/// Content pattern is \"%s\" (note: not automatically enforced)\n", xstring((*pattern1).value));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1175 const char *ai = NULL, *ae = NULL, *bi = NULL, *be = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1176 if (simpleType.restriction->minInclusive)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1177 { ai = simpleType.restriction->minInclusive->value;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1178 document(simpleType.restriction->minInclusive->annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1179 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1180 else if (simpleType.restriction->minExclusive)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1181 { ae = simpleType.restriction->minExclusive->value;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1182 document(simpleType.restriction->minExclusive->annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1183 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1184 if (simpleType.restriction->maxInclusive)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1185 { bi = simpleType.restriction->maxInclusive->value;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1186 document(simpleType.restriction->maxInclusive->annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1187 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1188 else if (simpleType.restriction->maxExclusive)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1189 { be = simpleType.restriction->maxExclusive->value;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1190 document(simpleType.restriction->maxExclusive->annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1191 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1192 if (ai || ae || bi || be)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1193 { fprintf(stream, "/// Value range is ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1194 if (ai)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1195 fprintf(stream, "[%s..", ai);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1196 else if (ae)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1197 fprintf(stream, "(%s..", ae);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1198 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1199 fprintf(stream, "[..");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1200 if (bi)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1201 fprintf(stream, "%s]\n", bi);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1202 else if (be)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1203 fprintf(stream, "%s)\n", be);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1204 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1205 fprintf(stream, "]\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1206 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1207 if (!simpleType.restriction->attribute.empty())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1208 { if (!Wflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1209 fprintf(stderr, "\nWarning: simpleType '%s' should not have attributes\n", name?name:"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1210 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1211 const char *s = tname(NULL, baseURI, base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1212 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1213 { bool is_ptr = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1214 is_ptr = (strchr(s, '*') != NULL) || (s == pname(true, NULL, baseURI, base));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1215 t = deftname(TYPEDEF, NULL, is_ptr, prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1216 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1217 fprintf(stream, "typedef %s %s", s, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1218 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1219 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1220 { t = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1221 fprintf(stream, elementformat, s, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1222 fprintf(stream, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1223 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1224 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1225 { if (!anonymous && !simpleType.restriction->pattern.empty())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1226 { fprintf(stream, " \"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1227 for (vector<xs__pattern>::const_iterator pattern2 = simpleType.restriction->pattern.begin(); pattern2 != simpleType.restriction->pattern.end(); ++pattern2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1228 { if (pattern2 != simpleType.restriction->pattern.begin())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1229 fprintf(stream, "|");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1230 fprintf(stream, "%s", xstring((*pattern2).value));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1231 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1232 fprintf(stream, "\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1233 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1234 // add range info only when type is numeric
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1235 bool is_numeric = false, is_float = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1236 if (!strncmp(s, "unsigned ", 9))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1237 s += 9;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1238 else if (!strncmp(s, "xsd__unsigned", 13))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1239 s += 13;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1240 else if (!strncmp(s, "xsd__", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1241 s += 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1242 if (!strcmp(s, "double")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1243 || !strcmp(s, "float"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1244 is_numeric = is_float = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1245 else if (!strcmp(s, "bool")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1246 || !strcmp(s, "byte")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1247 || !strcmp(s, "Byte")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1248 || !strcmp(s, "char")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1249 || !strcmp(s, "double")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1250 || !strcmp(s, "float")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1251 || !strcmp(s, "int")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1252 || !strcmp(s, "Int")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1253 || !strcmp(s, "long")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1254 || !strcmp(s, "Long")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1255 || !strcmp(s, "LONG64")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1256 || !strcmp(s, "short")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1257 || !strcmp(s, "Short")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1258 || !strcmp(s, "ULONG64"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1259 is_numeric = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1260 if (!anonymous
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1261 && simpleType.restriction->minLength
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1262 && simpleType.restriction->minLength->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1263 fprintf(stream, " %s", simpleType.restriction->minLength->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1264 else if (is_numeric
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1265 && !anonymous
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1266 && simpleType.restriction->minInclusive
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1267 && simpleType.restriction->minInclusive->value
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1268 && is_integer(simpleType.restriction->minInclusive->value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1269 fprintf(stream, " %s", simpleType.restriction->minInclusive->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1270 else if (is_float
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1271 && !anonymous
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1272 && simpleType.restriction->minExclusive
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1273 && simpleType.restriction->minExclusive->value
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1274 && is_integer(simpleType.restriction->minExclusive->value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1275 fprintf(stream, " %s", simpleType.restriction->minExclusive->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1276 else if (is_numeric
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1277 && !anonymous
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1278 && simpleType.restriction->minExclusive
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1279 && simpleType.restriction->minExclusive->value
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1280 && is_integer(simpleType.restriction->minExclusive->value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1281 fprintf(stream, " " SOAP_LONG_FORMAT, to_integer(simpleType.restriction->minExclusive->value)+1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1282 if (!anonymous
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1283 && simpleType.restriction->maxLength
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1284 && simpleType.restriction->maxLength->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1285 fprintf(stream, ":%s", simpleType.restriction->maxLength->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1286 else if (is_numeric
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1287 && !anonymous
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1288 && simpleType.restriction->maxInclusive
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1289 && simpleType.restriction->maxInclusive->value
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1290 && is_integer(simpleType.restriction->maxInclusive->value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1291 fprintf(stream, ":%s", simpleType.restriction->maxInclusive->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1292 else if (is_float
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1293 && !anonymous
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1294 && simpleType.restriction->maxExclusive
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1295 && simpleType.restriction->maxExclusive->value
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1296 && is_integer(simpleType.restriction->maxExclusive->value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1297 fprintf(stream, ":%s", simpleType.restriction->maxExclusive->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1298 else if (is_numeric
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1299 && !anonymous
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1300 && simpleType.restriction->maxExclusive
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1301 && simpleType.restriction->maxExclusive->value
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1302 && is_integer(simpleType.restriction->maxExclusive->value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1303 fprintf(stream, ":" SOAP_LONG_FORMAT, to_integer(simpleType.restriction->maxExclusive->value)-1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1304 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1305 { fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1306 if (pflag && simpleType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1307 { const char *s = aname(prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1308 knames.insert(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1309 s = aname(prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1310 fprintf(stream, "\n/// Class wrapper\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1311 fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1312 fprintf(stream, elementformat, tname(prefix, URI, name), "__item;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1313 modify(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1314 fprintf(stream, "\n};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1315 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1316 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1317 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1318 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1319 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1320 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1321 else if (simpleType.list)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1322 { if (simpleType.list->restriction && simpleType.list->restriction->base)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1323 { if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1324 { fprintf(stream, "\n/// \"%s\":%s is a simpleType list restriction of %s.\n", URI?URI:"", name, simpleType.list->restriction->base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1325 fprintf(stream, "/// Note: this enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1326 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1327 document(simpleType.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1328 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1329 { t = deftname(ENUM, NULL, false, prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1330 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1331 fprintf(stream, "enum * %s\n{\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1332 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1333 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1334 { t = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1335 fprintf(stream, "enum *\n{\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1336 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1337 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1338 { for (vector<xs__enumeration>::const_iterator enumeration = simpleType.list->restriction->enumeration.begin(); enumeration != simpleType.list->restriction->enumeration.end(); ++enumeration)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1339 { if ((*enumeration).value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1340 { if (!strcmp(simpleType.list->restriction->base, "xs:QName") && (*enumeration).value_)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1341 fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), simpleType.list->restriction->base, (*enumeration).value_);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1342 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1343 fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), simpleType.list->restriction->base, (*enumeration).value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1344 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1345 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1346 fprintf(stream, "//\tunrecognized: bitmask enumeration '%s' has no value\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1347 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1348 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1349 { fprintf(stream, "};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1350 if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1351 fprintf(stream, "/// Typedef synonym for enum %s.\ntypedef enum %s %s;\n", t, t, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1352 if (pflag && simpleType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1353 { const char *s = aname(prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1354 knames.insert(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1355 s = aname(prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1356 fprintf(stream, "\n/// Class wrapper\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1357 fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1358 fprintf(stream, elementformat, tname(prefix, URI, name), "__item;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1359 modify(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1360 fprintf(stream, "\n};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1361 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1362 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1363 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1364 fprintf(stream, "}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1365 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1366 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1367 else if (simpleType.list->itemType)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1368 { const xs__simpleType *p = simpleType.list->itemTypePtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1369 if (p
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1370 && p->restriction
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1371 && p->restriction->base
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1372 && !p->restriction->enumeration.empty()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1373 && p->restriction->enumeration.size() <= 64)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1374 { if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1375 { fprintf(stream, "\n/// \"%s\":%s is a simpleType list of %s.\n", URI?URI:"", name, simpleType.list->itemType);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1376 fprintf(stream, "/// Note: this enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1377 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1378 document(simpleType.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1379 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1380 { t = deftname(ENUM, NULL, false, prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1381 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1382 fprintf(stream, "enum * %s\n{\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1383 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1384 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1385 { t = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1386 fprintf(stream, "enum *\n{\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1387 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1388 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1389 { for (vector<xs__enumeration>::const_iterator enumeration = p->restriction->enumeration.begin(); enumeration != p->restriction->enumeration.end(); ++enumeration)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1390 { if ((*enumeration).value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1391 { if (!strcmp(p->restriction->base, "xs:QName") && (*enumeration).value_)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1392 fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), p->restriction->base, (*enumeration).value_);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1393 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1394 fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), p->restriction->base, (*enumeration).value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1395 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1396 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1397 fprintf(stream, "//\tunrecognized: bitmask enumeration '%s' has no value\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1398 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1399 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1400 { fprintf(stream, "};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1401 if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1402 fprintf(stream, "/// Typedef synonym for enum %s.\ntypedef enum %s %s;\n", t, t, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1403 if (pflag && simpleType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1404 { const char *s = aname(prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1405 knames.insert(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1406 s = aname(prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1407 fprintf(stream, "\n/// Class wrapper.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1408 fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1409 fprintf(stream, elementformat, tname(prefix, URI, name), "__item;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1410 modify(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1411 fprintf(stream, "\n};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1412 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1413 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1414 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1415 fprintf(stream, "}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1416 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1417 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1418 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1419 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1420 if (!strcmp(simpleType.list->itemType, "xs:QName"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1421 s = tname(NULL, NULL, "xsd:QName");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1422 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1423 s = tname(NULL, NULL, "xsd:string");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1424 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1425 { fprintf(stream, "\n/// \"%s\":%s is a simpleType containing a whitespace separated list of %s.\n", URI?URI:"", name, simpleType.list->itemType);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1426 t = deftname(TYPEDEF, NULL, strchr(s, '*') != NULL, prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1427 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1428 document(simpleType.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1429 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1430 fprintf(stream, "typedef %s %s;\n", s, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1431 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1432 { fprintf(stream, elementformat, s, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1433 fprintf(stream, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1434 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1435 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1436 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1437 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1438 { if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1439 { fprintf(stream, "\n/// \"%s\":%s is a simpleType list.\n", URI?URI:"", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1440 fprintf(stream, "/// Note: this enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1441 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1442 document(simpleType.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1443 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1444 { t = deftname(ENUM, NULL, false, prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1445 if (t && !eflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1446 fprintf(stream, "/// Note: enum values are prefixed with '%s' to avoid name clashes, please use wsdl2h option -e to omit this prefix\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1447 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1448 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1449 t = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1450 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1451 { fprintf(stream, "enum * %s\n{\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1452 for (vector<xs__simpleType>::const_iterator simple = simpleType.list->simpleType.begin(); simple != simpleType.list->simpleType.end(); ++simple)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1453 { if ((*simple).restriction && (*simple).restriction->base)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1454 { for (vector<xs__enumeration>::const_iterator enumeration = (*simple).restriction->enumeration.begin(); enumeration != (*simple).restriction->enumeration.end(); ++enumeration)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1455 { if ((*enumeration).value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1456 { if (!strcmp((*simple).restriction->base, "xs:QName") && (*enumeration).value_)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1457 fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), (*simple).restriction->base, (*enumeration).value_);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1458 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1459 fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), (*simple).restriction->base, (*enumeration).value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1460 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1461 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1462 fprintf(stream, "//\tunrecognized: bitmask enumeration '%s' has no value\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1463 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1464 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1465 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1466 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1467 { fprintf(stream, "};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1468 if (yflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1469 fprintf(stream, "/// Typedef synonym for enum %s.\ntypedef enum %s %s;\n", t, t, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1470 if (pflag && simpleType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1471 { const char *s = aname(prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1472 knames.insert(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1473 s = aname(prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1474 fprintf(stream, "\n/// Class wrapper.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1475 fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1476 fprintf(stream, elementformat, tname(prefix, URI, name), "__item;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1477 modify(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1478 fprintf(stream, "\n};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1479 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1480 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1481 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1482 fprintf(stream, "}\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1483 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1484 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1485 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1486 else if (simpleType.union_)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1487 { if (simpleType.union_->memberTypes)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1488 { const char *s = tname(NULL, NULL, "xsd:string");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1489 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1490 t = deftname(TYPEDEF, NULL, strchr(s, '*') != NULL, prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1491 fprintf(stream, "\n/// union of values \"%s\"\n", simpleType.union_->memberTypes);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1492 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1493 fprintf(stream, "typedef %s %s;\n", s, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1494 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1495 { fprintf(stream, elementformat, s, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1496 fprintf(stream, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1497 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1498 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1499 else if (!simpleType.union_->simpleType.empty())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1500 { const char *s = tname(NULL, NULL, "xsd:string");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1501 fprintf(stream, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1502 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1503 t = deftname(TYPEDEF, NULL, strchr(s, '*') != NULL, prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1504 for (vector<xs__simpleType>::const_iterator simpleType1 = simpleType.union_->simpleType.begin(); simpleType1 != simpleType.union_->simpleType.end(); ++simpleType1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1505 if ((*simpleType1).restriction)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1506 { fprintf(stream, "/// union of values from \"%s\"\n", (*simpleType1).restriction->base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1507 // TODO: are there any other types we should report here?
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1508 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1509 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1510 fprintf(stream, "typedef %s %s;\n", s, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1511 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1512 { fprintf(stream, elementformat, s, "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1513 fprintf(stream, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1514 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1515 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1516 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1517 fprintf(stream, "//\tunrecognized\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1518 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1519 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1520 fprintf(stream, "//\tunrecognized simpleType\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1521 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1522
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1523 void Types::gen(const char *URI, const char *name, const xs__complexType& complexType, bool anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1524 { const char *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1525 const char *prefix = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1526 bool soapflag = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1527 if (complexType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1528 name = complexType.name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1529 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1530 prefix = "_";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1531 if (anonymous && name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1532 t = sname(URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1533 else if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1534 { t = cname(prefix, URI, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1535 if (deftypemap[t])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1536 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1537 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1538 if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1539 scope.push_back(name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1540 if (complexType.simpleContent)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1541 { if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1542 fprintf(stream, "\n/// \"%s\":%s is a%s complexType with simpleContent.\n", URI?URI:"", name, complexType.abstract?"n abstract":"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1543 document(complexType.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1544 operations(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1545 if (complexType.simpleContent->restriction)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1546 { if (anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1547 { if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1548 fprintf(stream, " struct %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1549 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1550 fprintf(stream, " class %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1551 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1552 else if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1553 fprintf(stream, "struct %s\n{\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1554 else if (pflag && complexType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1555 fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1556 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1557 fprintf(stream, "class %s\n{ public:\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1558 const char *base = "xs:string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1559 const char *baseURI = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1560 const xs__complexType *p = &complexType;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1561 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1562 { if (!p->simpleContent)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1563 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1564 if (p->simpleContent->restriction)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1565 { if (p->simpleContent->restriction->complexTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1566 p = p->simpleContent->restriction->complexTypePtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1567 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1568 { base = p->simpleContent->restriction->base;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1569 if (p->simpleContent->restriction->simpleTypePtr() && p->simpleContent->restriction->simpleTypePtr()->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1570 baseURI = p->simpleContent->restriction->simpleTypePtr()->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1571 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1572 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1573 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1574 else if (p->simpleContent->extension)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1575 { if (p->simpleContent->extension->complexTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1576 p = p->simpleContent->extension->complexTypePtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1577 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1578 { base = p->simpleContent->extension->base;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1579 if (p->simpleContent->extension->simpleTypePtr() && p->simpleContent->extension->simpleTypePtr()->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1580 baseURI = p->simpleContent->extension->simpleTypePtr()->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1581 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1582 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1583 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1584 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1585 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1586 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1587 while (p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1588 fprintf(stream, "/// __item wraps '%s' simpleContent.\n", base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1589 fprintf(stream, elementformat, tname(NULL, baseURI, base), "__item");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1590 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1591 p = &complexType;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1592 bool flag = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1593 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1594 { if (!p->simpleContent)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1595 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1596 if (p->simpleContent->restriction)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1597 { // TODO: should only generate attribute when name is different?
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1598 gen(URI, p->simpleContent->restriction->attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1599 if (p->simpleContent->restriction->anyAttribute && flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1600 { gen(URI, *p->simpleContent->restriction->anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1601 flag = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1602 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1603 if (p->simpleContent->restriction->complexTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1604 p = p->simpleContent->restriction->complexTypePtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1605 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1606 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1607 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1608 else if (p->simpleContent->extension)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1609 { gen(URI, p->simpleContent->extension->attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1610 gen(URI, p->simpleContent->extension->attributeGroup);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1611 if (p->simpleContent->extension->anyAttribute && flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1612 { gen(URI, *p->simpleContent->extension->anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1613 flag = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1614 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1615 if (p->simpleContent->extension->complexTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1616 p = p->simpleContent->extension->complexTypePtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1617 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1618 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1619 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1620 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1621 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1622 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1623 while (p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1624 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1625 else if (complexType.simpleContent->extension)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1626 { const char *base = "xs:string";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1627 const char *baseURI = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1628 if (cflag || fflag || anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1629 { if (anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1630 { if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1631 fprintf(stream, " struct %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1632 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1633 fprintf(stream, " class %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1634 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1635 else if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1636 fprintf(stream, "struct %s\n{\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1637 else if (pflag && complexType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1638 fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1639 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1640 fprintf(stream, "class %s\n{ public:\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1641 const xs__complexType *p = &complexType;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1642 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1643 { if (!p->simpleContent)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1644 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1645 if (p->simpleContent->restriction)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1646 { if (p->simpleContent->restriction->complexTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1647 p = p->simpleContent->restriction->complexTypePtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1648 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1649 { base = p->simpleContent->restriction->base;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1650 if (p->simpleContent->restriction->simpleTypePtr() && p->simpleContent->restriction->simpleTypePtr()->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1651 baseURI = p->simpleContent->restriction->simpleTypePtr()->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1652 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1653 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1654 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1655 else if (p->simpleContent->extension)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1656 { if (p->simpleContent->extension->complexTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1657 p = p->simpleContent->extension->complexTypePtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1658 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1659 { base = p->simpleContent->extension->base;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1660 if (p->simpleContent->extension->simpleTypePtr() && p->simpleContent->extension->simpleTypePtr()->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1661 baseURI = p->simpleContent->extension->simpleTypePtr()->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1662 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1663 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1664 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1665 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1666 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1667 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1668 while (p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1669 fprintf(stream, "/// __item wraps '%s' simpleContent.\n", base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1670 fprintf(stream, elementformat, tname(NULL, baseURI, base), "__item");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1671 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1672 p = &complexType;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1673 bool flag = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1674 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1675 { if (!p->simpleContent)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1676 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1677 if (p->simpleContent->restriction)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1678 { gen(URI, p->simpleContent->restriction->attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1679 if (p->simpleContent->restriction->anyAttribute && flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1680 gen(URI, *p->simpleContent->restriction->anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1681 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1682 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1683 else if (p->simpleContent->extension)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1684 { gen(URI, p->simpleContent->extension->attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1685 gen(URI, p->simpleContent->extension->attributeGroup);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1686 if (p->simpleContent->extension->anyAttribute && flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1687 { gen(URI, *p->simpleContent->extension->anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1688 flag = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1689 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1690 if (p->simpleContent->extension->complexTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1691 p = p->simpleContent->extension->complexTypePtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1692 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1693 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1694 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1695 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1696 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1697 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1698 while (p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1699 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1700 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1701 { base = complexType.simpleContent->extension->base;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1702 if (
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1703 /* TODO: in future, may want to add check here for base type == class
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1704 complexType.simpleContent->extension->simpleTypePtr()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1705 ||
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1706 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1707 complexType.simpleContent->extension->complexTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1708 { if (complexType.simpleContent->extension->complexTypePtr()->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1709 baseURI = complexType.simpleContent->extension->complexTypePtr()->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1710 fprintf(stream, "class %s : public %s\n{ public:\n", t, cname(NULL, baseURI, base));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1711 soapflag = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1712 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1713 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1714 { if (complexType.simpleContent->extension->simpleTypePtr() && complexType.simpleContent->extension->simpleTypePtr()->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1715 baseURI = complexType.simpleContent->extension->simpleTypePtr()->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1716 else if (complexType.simpleContent->extension->complexTypePtr() && complexType.simpleContent->extension->complexTypePtr()->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1717 baseURI = complexType.simpleContent->extension->complexTypePtr()->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1718 if (pflag && complexType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1719 fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1720 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1721 fprintf(stream, "class %s\n{ public:\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1722 fprintf(stream, "/// __item wraps '%s' simpleContent.\n", base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1723 fprintf(stream, elementformat, tname(NULL, baseURI, base), "__item");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1724 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1725 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1726 gen(URI, complexType.simpleContent->extension->attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1727 gen(URI, complexType.simpleContent->extension->attributeGroup);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1728 if (complexType.simpleContent->extension->anyAttribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1729 gen(URI, *complexType.simpleContent->extension->anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1730 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1731 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1732 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1733 fprintf(stream, "//\tunrecognized\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1734 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1735 else if (complexType.complexContent)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1736 { if (complexType.complexContent->restriction)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1737 { if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1738 fprintf(stream, "\n/// \"%s\":%s is a%s complexType with complexContent restriction of %s.\n", URI?URI:"", name, complexType.abstract?"n abstract":"", complexType.complexContent->restriction->base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1739 document(complexType.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1740 operations(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1741 if (!strcmp(complexType.complexContent->restriction->base, "SOAP-ENC:Array"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1742 { char *item = NULL, *type = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1743 if (!complexType.complexContent->restriction->attribute.empty())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1744 { xs__attribute& attribute = complexType.complexContent->restriction->attribute.front();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1745 if (attribute.wsdl__arrayType)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1746 type = attribute.wsdl__arrayType;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1747 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1748 xs__seqchoice *s = complexType.complexContent->restriction->sequence;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1749 if (s
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1750 && !s->__contents.empty()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1751 && s->__contents.front().__union == SOAP_UNION_xs__union_content_element
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1752 && s->__contents.front().__content.element)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1753 { xs__element& element = *s->__contents.front().__content.element;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1754 if (!type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1755 { if (element.type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1756 type = element.type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1757 else if (element.simpleTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1758 { if (element.simpleTypePtr()->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1759 type = element.simpleTypePtr()->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1760 else if (element.simpleTypePtr()->restriction)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1761 type = element.simpleTypePtr()->restriction->base;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1762 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1763 else if (element.complexTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1764 { if (element.complexTypePtr()->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1765 type = element.complexTypePtr()->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1766 else if (element.complexTypePtr()->complexContent && element.complexTypePtr()->complexContent->restriction)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1767 type = element.complexTypePtr()->complexContent->restriction->base;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1768 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1769 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1770 item = element.name; // <sequence><element name="item" type="..."/></sequence>
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1771 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1772 gen_soap_array(name, t, item, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1773 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1774 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1775 { if (anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1776 { if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1777 fprintf(stream, " struct %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1778 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1779 fprintf(stream, " class %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1780 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1781 else if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1782 fprintf(stream, "struct %s\n{\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1783 else if (pflag && complexType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1784 fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1785 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1786 fprintf(stream, "class %s\n{ public:\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1787 if (complexType.complexContent->restriction->group)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1788 gen(URI, *complexType.complexContent->restriction->group, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1789 if (complexType.complexContent->restriction->all)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1790 gen(URI, *complexType.complexContent->restriction->all, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1791 if (complexType.complexContent->restriction->sequence)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1792 gen(URI, *complexType.complexContent->restriction->sequence, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1793 if (complexType.complexContent->restriction->choice)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1794 gen(URI, name, *complexType.complexContent->restriction->choice, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1795 gen(URI, complexType.complexContent->restriction->attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1796 bool flag = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1797 if (complexType.complexContent->restriction->anyAttribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1798 { gen(URI, *complexType.complexContent->restriction->anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1799 flag = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1800 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1801 const xs__complexType *p = complexType.complexContent->restriction->complexTypePtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1802 while (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1803 { const char *pURI;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1804 if (p->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1805 pURI = p->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1806 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1807 pURI = URI;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1808 const char *b = cname(NULL, pURI, p->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1809 if (zflag && zflag <= 5)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1810 fprintf(stream, "/// RESTRICTED FROM %s:\n", b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1811 else if (comment_nest == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1812 fprintf(stream, "/* RESTRICTED FROM %s:\n", b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1813 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1814 fprintf(stream, " RESTRICTED FROM %s:\n", b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1815 comment_nest++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1816 if (p->complexContent && p->complexContent->restriction)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1817 { gen(URI, p->complexContent->restriction->attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1818 if (p->complexContent->restriction->anyAttribute && flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1819 { gen(URI, *p->complexContent->restriction->anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1820 flag = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1821 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1822 p = p->complexContent->restriction->complexTypePtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1823 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1824 else if (p->complexContent && p->complexContent->extension)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1825 { gen(URI, p->complexContent->extension->attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1826 gen(URI, p->complexContent->extension->attributeGroup);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1827 if (p->complexContent->extension->anyAttribute && flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1828 { gen(URI, *p->complexContent->extension->anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1829 flag = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1830 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1831 p = p->complexContent->extension->complexTypePtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1832 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1833 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1834 { gen(URI, p->attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1835 gen(URI, p->attributeGroup);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1836 if (p->anyAttribute && flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1837 gen(URI, *p->anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1838 p = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1839 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1840 comment_nest--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1841 if (zflag && zflag <= 5)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1842 fprintf(stream, "// END OF RESTRICTED FROM %s\n", b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1843 else if (comment_nest == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1844 fprintf(stream, " END OF RESTRICTED FROM %s */\n", b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1845 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1846 fprintf(stream, " END OF RESTRICTED FROM %s\n", b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1847 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1848 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1849 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1850 else if (complexType.complexContent->extension)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1851 { const char *base = complexType.complexContent->extension->base;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1852 xs__complexType *p = complexType.complexContent->extension->complexTypePtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1853 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1854 fprintf(stream, "\n/// \"%s\":%s is a%s complexType with complexContent extension of %s.\n", URI?URI:"", name, complexType.abstract?"n abstract":"", base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1855 document(complexType.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1856 operations(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1857 if (anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1858 { if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1859 fprintf(stream, " struct %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1860 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1861 fprintf(stream, " class %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1862 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1863 else if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1864 fprintf(stream, "struct %s\n{\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1865 else if (fflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1866 fprintf(stream, "class %s\n{ public:\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1867 else // TODO: what to do if base class is in another namespace and elements must be qualified in XML payload?
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1868 { const char *baseURI = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1869 if (p && p->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1870 baseURI = p->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1871 fprintf(stream, "class %s : public %s\n{ public:\n", t, cname(NULL, baseURI, base));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1872 soapflag = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1873 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1874 gen_inh(URI, p, anonymous);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1875 if (complexType.complexContent->extension->group)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1876 gen(URI, *complexType.complexContent->extension->group, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1877 if (complexType.complexContent->extension->all)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1878 gen(URI, *complexType.complexContent->extension->all, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1879 if (complexType.complexContent->extension->sequence)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1880 gen(URI, *complexType.complexContent->extension->sequence, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1881 if (complexType.complexContent->extension->choice)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1882 gen(URI, name, *complexType.complexContent->extension->choice, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1883 gen(URI, complexType.complexContent->extension->attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1884 gen(URI, complexType.complexContent->extension->attributeGroup);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1885 if (complexType.complexContent->extension->anyAttribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1886 gen(URI, *complexType.complexContent->extension->anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1887 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1888 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1889 fprintf(stream, "//\tunrecognized\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1890 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1891 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1892 { if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1893 fprintf(stream, "\n/// \"%s\":%s is a%s complexType.\n", URI?URI:"", name, complexType.abstract?"n abstract":"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1894 document(complexType.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1895 operations(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1896 if (anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1897 { if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1898 fprintf(stream, " struct %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1899 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1900 fprintf(stream, " class %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1901 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1902 else if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1903 fprintf(stream, "struct %s\n{\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1904 else if (pflag && complexType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1905 fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1906 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1907 fprintf(stream, "class %s\n{ public:\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1908 if (complexType.all)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1909 gen(URI, *complexType.all, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1910 else if (complexType.choice)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1911 gen(URI, name, *complexType.choice, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1912 else if (complexType.sequence)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1913 gen(URI, *complexType.sequence, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1914 else if (complexType.any)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1915 gen(URI, *complexType.any, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1916 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1917 gen(URI, complexType.attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1918 gen(URI, complexType.attributeGroup);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1919 if (complexType.anyAttribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1920 gen(URI, *complexType.anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1921 if (complexType.mixed
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1922 || ( complexType.complexContent
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1923 && complexType.complexContent->extension
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1924 && complexType.complexContent->extension->complexTypePtr()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1925 && complexType.complexContent->extension->complexTypePtr()->mixed
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1926 ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1927 { fprintf(stream, "/// TODO: this mixed complexType is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element).\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1928 if (dflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1929 { if (with_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1930 fprintf(stream, pointerformat, "xsd__anyType", "__mixed");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1931 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1932 fprintf(stream, elementformat, "xsd__anyType", "__mixed");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1933 fprintf(stream, "0;\t///< Catch mixed content in DOM soap_dom_element linked node structure.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1934 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1935 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1936 { fprintf(stream, elementformat, "_XML", "__mixed");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1937 fprintf(stream, "0;\t///< Catch mixed content in XML string\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1938 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1939 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1940 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1941 modify(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1942 if (!anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1943 { if (!cflag
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1944 && !(pflag && complexType.name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1945 && !soapflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1946 { if (!complexType.complexContent || !complexType.complexContent->extension || !complexType.complexContent->extension->complexTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1947 { fprintf(stream, "/// A handle to the soap struct that manages this instance (automatically set)\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1948 fprintf(stream, pointerformat, "struct soap", "soap");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1949 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1950 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1951 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1952 fprintf(stream, "};\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1953 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1954 scope.pop_back();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1955 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1956
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1957 void Types::gen(const char *URI, const vector<xs__attribute>& attributes)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1958 { for (vector<xs__attribute>::const_iterator attribute = attributes.begin(); attribute != attributes.end(); ++attribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1959 gen(URI, *attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1960 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1961
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1962 void Types::gen(const char *URI, const xs__attribute& attribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1963 { const char *name, *type, *nameURI = NULL, *typeURI = NULL, *nameprefix = NULL, *typeprefix = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1964 name = attribute.name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1965 type = attribute.type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1966 bool is_optional = attribute.use != required && attribute.use != default_ && attribute.use != fixed_ && !attribute.default_;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1967 document(attribute.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1968 if (!URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1969 URI = attribute.schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1970 if (attribute.form)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1971 { if (*attribute.form == qualified)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1972 nameURI = URI;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1973 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1974 nameprefix = ":";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1975 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1976 if (URI && attribute.schemaPtr() && attribute.schemaPtr()->targetNamespace && strcmp(URI, attribute.schemaPtr()->targetNamespace))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1977 nameURI = attribute.schemaPtr()->targetNamespace; // handles attributeGroup defined in another namespace
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1978 if (attribute.attributePtr()) // attribute ref
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1979 { name = attribute.attributePtr()->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1980 type = attribute.attributePtr()->type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1981 if (!type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1982 { type = name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1983 typeprefix = "_";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1984 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1985 if (attribute.attributePtr()->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1986 { typeURI = attribute.attributePtr()->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1987 if (attribute.form && *attribute.form == unqualified)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1988 nameprefix = ":";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1989 else if (zflag != 3 && zflag != 2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1990 && URI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1991 && typeURI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1992 && attribute.schemaPtr()->elementFormDefault == qualified
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1993 && !strcmp(URI, typeURI))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1994 nameprefix = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1995 else if (zflag == 3
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1996 && URI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1997 && typeURI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1998 && attribute.schemaPtr()->attributeFormDefault == unqualified
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1999 && !strcmp(URI, typeURI))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2000 nameprefix = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2001 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2002 nameURI = typeURI;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2003 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2004 fprintf(stream, "/// Attribute reference %s.\n", attribute.ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2005 document(attribute.attributePtr()->annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2006 fprintf(stream, attributeformat, pname(is_optional, typeprefix, typeURI, type), aname(nameprefix, nameURI, name)); // make sure no name - type clash
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2007 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2008 else if (name && type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2009 { fprintf(stream, "/// Attribute %s of type %s.\n", name, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2010 fprintf(stream, attributeformat, pname(is_optional, NULL, URI, type), aname(nameprefix, nameURI, name)); // make sure no name - type clash
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2011 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2012 else if (name && attribute.simpleTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2013 { fprintf(stream, "@");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2014 gen(URI, name, *attribute.simpleTypePtr(), true);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2015 // 8/1/09 Changed (is_optional && !cflag && !sflag) to is_optional
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2016 fprintf(stream, is_optional ? pointerformat : elementformat, "", aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2017 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2018 else if (attribute.ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2019 { fprintf(stream, "/// Imported attribute reference %s.\n", attribute.ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2020 fprintf(stream, attributeformat, pname(is_optional, "_", NULL, attribute.ref), aname(NULL, NULL, attribute.ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2021 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2022 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2023 { fprintf(stream, "/// Attribute '%s' has no type or ref: assuming string content.\n", name?name:"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2024 fprintf(stream, attributeformat, tname(NULL, NULL, "xs:string"), aname(NULL, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2025 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2026 switch (attribute.use)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2027 { case prohibited:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2028 fprintf(stream, " 0:0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2029 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2030 case required:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2031 fprintf(stream, " 1");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2032 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2033 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2034 fprintf(stream, " 0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2035 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2036 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2037 if (attribute.default_
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2038 || (attribute.fixed && !is_optional))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2039 { const char *value, *QName;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2040 if (attribute.default_)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2041 { value = attribute.default_;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2042 QName = attribute.default__;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2043 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2044 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2045 { value = attribute.fixed;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2046 QName = attribute.fixed_;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2047 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2048 const char *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2049 if (!type && attribute.simpleTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2050 { if (attribute.simpleTypePtr()->restriction && attribute.simpleTypePtr()->restriction->base)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2051 { if (!attribute.simpleTypePtr()->restriction->enumeration.empty())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2052 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2053 if (is_integer(value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2054 fprintf(stream, " = %s", value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2055 else if (!*value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2056 fprintf(stream, " = 0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2057 else if ((s = enames[Pair(gname(URI, name),value)]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2058 fprintf(stream, " = %s", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2059 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2060 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2061 { const char *baseURI = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2062 if (attribute.simpleTypePtr()->restriction->simpleTypePtr() && attribute.simpleTypePtr()->restriction->simpleTypePtr()->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2063 baseURI = attribute.simpleTypePtr()->restriction->simpleTypePtr()->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2064 t = tname(NULL, baseURI, attribute.simpleTypePtr()->restriction->base);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2065 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2066 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2067 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2068 if (type && !t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2069 t = tname(NULL, typeURI?typeURI:URI, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2070 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2071 { if (!strncmp(t, "unsigned ", 9))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2072 t += 9;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2073 else if (!strncmp(t, "xsd__unsigned", 13))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2074 t += 13;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2075 else if (!strncmp(t, "xsd__", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2076 t += 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2077 if (!strcmp(t, "bool")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2078 || !strcmp(t, "byte")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2079 || !strcmp(t, "Byte")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2080 || !strcmp(t, "char")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2081 || !strcmp(t, "double")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2082 || !strcmp(t, "float")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2083 || !strcmp(t, "int")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2084 || !strcmp(t, "Int")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2085 || !strcmp(t, "long")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2086 || !strcmp(t, "Long")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2087 || !strcmp(t, "LONG64")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2088 || !strcmp(t, "short")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2089 || !strcmp(t, "Short")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2090 || !strcmp(t, "ULONG64"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2091 fprintf(stream, " = %s", value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2092 else if (!strncmp(t, "enum ", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2093 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2094 if (is_integer(value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2095 fprintf(stream, " = %s", value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2096 else if (!*value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2097 fprintf(stream, " = 0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2098 else if ((s = enames[Pair(t + 5,value)]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2099 fprintf(stream, " = %s", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2100 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2101 else if (!strcmp(t, "char*")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2102 || !strcmp(t, "char *") // not elegant
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2103 || !strcmp(t, "std::string")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2104 || !strcmp(t, "std::string*")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2105 || !strcmp(t, "std::string *")) // not elegant
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2106 fprintf(stream, " = \"%s\"", cstring(value));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2107 else if (!strcmp(t, "xsd__QName") && QName) // QName
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2108 fprintf(stream, " = \"%s\"", cstring(QName));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2109 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2110 if (attribute.default_)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2111 fprintf(stream, ";\t///< Default value=\"%s\".\n", value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2112 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2113 fprintf(stream, ";\t///< Fixed required value=\"%s\".\n", value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2114 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2115 else if (attribute.fixed)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2116 fprintf(stream, ";\t///< Fixed optional value=\"%s\".\n", attribute.fixed);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2117 else if (attribute.use == required)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2118 fprintf(stream, ";\t///< Required attribute.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2119 else if (attribute.use == prohibited)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2120 fprintf(stream, ";\t///< Prohibited attribute.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2121 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2122 fprintf(stream, ";\t///< Optional attribute.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2123 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2124
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2125 void Types::gen(const char *URI, const vector<xs__attributeGroup>& attributeGroups)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2126 { for (vector<xs__attributeGroup>::const_iterator attributeGroup = attributeGroups.begin(); attributeGroup != attributeGroups.end(); ++attributeGroup)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2127 { const xs__attributeGroup *ag = &*attributeGroup;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2128 if (ag->attributeGroupPtr()) // attributeGroup ref
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2129 ag = ag->attributeGroupPtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2130 fprintf(stream, "/// Begin attributeGroup %s.\n", ag->name?ag->name:ag->ref?ag->ref:"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2131 gen(URI, ag->attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2132 gen(URI, ag->attributeGroup);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2133 if (ag->anyAttribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2134 gen(URI, *ag->anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2135 fprintf(stream, "/// End of attributeGroup %s.\n", ag->name?ag->name:ag->ref?ag->ref:"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2136 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2137 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2138
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2139 void Types::gen(const char *URI, const vector<xs__all>& alls)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2140 { for (vector<xs__all>::const_iterator all = alls.begin(); all != alls.end(); ++all)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2141 gen(URI, *all, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2142 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2143
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2144 void Types::gen(const char *URI, const xs__all& all, const char *minOccurs, const char *maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2145 { bool tmp_union1 = with_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2146 bool tmp_union2 = fake_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2147 with_union = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2148 fake_union = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2149 gen(URI, all.element, minOccurs, maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2150 with_union = tmp_union1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2151 fake_union = tmp_union2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2152 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2153
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2154 void Types::gen(const char *URI, const vector<xs__contents>& contents)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2155 { for (vector<xs__contents>::const_iterator content = contents.begin(); content != contents.end(); ++content)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2156 { switch ((*content).__union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2157 { case SOAP_UNION_xs__union_content_element:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2158 if ((*content).__content.element)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2159 gen(URI, *(*content).__content.element, true, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2160 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2161 case SOAP_UNION_xs__union_content_group:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2162 if ((*content).__content.group)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2163 gen(URI, *(*content).__content.group, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2164 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2165 case SOAP_UNION_xs__union_content_choice:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2166 if ((*content).__content.choice)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2167 gen(URI, NULL, *(*content).__content.choice, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2168 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2169 case SOAP_UNION_xs__union_content_sequence:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2170 if ((*content).__content.sequence)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2171 gen(URI, *(*content).__content.sequence, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2172 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2173 case SOAP_UNION_xs__union_content_any:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2174 if ((*content).__content.any)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2175 gen(URI, *(*content).__content.any, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2176 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2177 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2178 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2179 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2180
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2181 void Types::gen(const char *URI, const xs__seqchoice& sequence, const char *minOccurs, const char *maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2182 { const char *s = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2183 char *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2184 bool tmp_union = with_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2185 with_union = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2186 if (sequence.minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2187 minOccurs = sequence.minOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2188 if (sequence.maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2189 maxOccurs = sequence.maxOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2190 if ((minOccurs && strcmp(minOccurs, "1"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2191 || (maxOccurs && strcmp(maxOccurs, "1")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2192 { fprintf(stream, "/// SEQUENCE <xs:sequence");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2193 if (minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2194 fprintf(stream, " minOccurs=\"%s\"", minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2195 if (maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2196 fprintf(stream, " maxOccurs=\"%s\"", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2197 fprintf(stream, ">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2198 document(sequence.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2199 s = sname(URI, "sequence");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2200 t = (char*)emalloc(strlen(s)+2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2201 strcpy(t, "_");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2202 strcat(t, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2203 s = strstr(s, "__");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2204 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2205 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2206 if (cflag || sflag || zflag == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2207 { fprintf(stream, sizeformat, "int", s + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2208 if (!fake_union && minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2209 fprintf(stream, " %s", minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2210 if (maxOccurs
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2211 && strcmp(maxOccurs, "1")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2212 && is_integer(maxOccurs))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2213 fprintf(stream, ":%s", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2214 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2215 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2216 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2217 { fprintf(stream, elementformat, "std::vector<", "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2218 fprintf(stream, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2219 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2220 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2221 fprintf(stream, " struct %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2222 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2223 fprintf(stream, " class %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2224 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2225 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2226 { if (fake_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2227 fprintf(stream, "/// SEQUENCE <xs:sequence>\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2228 document(sequence.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2229 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2230 gen(URI, sequence.__contents);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2231 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2232 { if (cflag || sflag || zflag == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2233 fprintf(stream, pointerformat, "}", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2234 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2235 { fprintf(stream, elementformat, "}>", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2236 if (!fake_union && minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2237 fprintf(stream, " %s", minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2238 if (maxOccurs
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2239 && strcmp(maxOccurs, "1")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2240 && is_integer(maxOccurs))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2241 fprintf(stream, ":%s", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2242 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2243 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2244 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2245 if (s || fake_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2246 fprintf(stream, "// END OF SEQUENCE\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2247 with_union = tmp_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2248 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2249
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2250 void Types::gen(const char *URI, const vector<xs__element>& elements, const char *minOccurs, const char *maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2251 { for (vector<xs__element>::const_iterator element = elements.begin(); element != elements.end(); ++element)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2252 gen(URI, *element, true, minOccurs, maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2253 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2254
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2255 void Types::gen(const char *URI, const xs__element& element, bool substok, const char *minOccurs, const char *maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2256 { const char *name, *type, *nameURI = NULL, *typeURI = NULL, *nameprefix = NULL, *typeprefix = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2257 name = element.name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2258 type = element.type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2259 document(element.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2260 if (!URI)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2261 URI = element.schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2262 if (element.minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2263 minOccurs = element.minOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2264 if (element.maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2265 maxOccurs = element.maxOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2266 if (element.xmime__expectedContentTypes)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2267 fprintf(stream, "/// MTOM attachment with content types %s.\n", element.xmime__expectedContentTypes);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2268 if (element.form)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2269 { if (*element.form == qualified)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2270 nameURI = URI;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2271 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2272 nameprefix = ":";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2273 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2274 if (element.elementPtr()) // element ref
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2275 { name = element.elementPtr()->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2276 type = element.elementPtr()->type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2277 if (!type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2278 { type = name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2279 typeprefix = "_";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2280 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2281 if (element.elementPtr()->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2282 { typeURI = element.elementPtr()->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2283 if (element.form && *element.form == unqualified)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2284 nameprefix = ":";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2285 else if (zflag != 3 && zflag != 2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2286 && URI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2287 && typeURI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2288 && element.schemaPtr()->elementFormDefault == qualified
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2289 && !strcmp(URI, typeURI))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2290 nameprefix = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2291 else if (zflag == 3
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2292 && URI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2293 && typeURI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2294 && element.schemaPtr()->elementFormDefault == unqualified
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2295 && !strcmp(URI, typeURI))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2296 nameprefix = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2297 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2298 nameURI = typeURI;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2299 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2300 document(element.elementPtr()->annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2301 if (element.elementPtr()->xmime__expectedContentTypes)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2302 fprintf(stream, "/// MTOM attachment with content types %s.\n", element.elementPtr()->xmime__expectedContentTypes);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2303 if (substok && element.elementPtr()->abstract)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2304 { fprintf(stream, "/// Reference %s to abstract element.\n", element.ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2305 gen_substitutions(URI, element);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2306 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2307 else if (substok
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2308 && element.elementPtr()->substitutionsPtr()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2309 && !element.elementPtr()->substitutionsPtr()->empty())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2310 { if (vflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2311 fprintf(stderr, "\nWarning: element ref '%s' stands as the head of a substitutionGroup but is not declared abstract\n", element.ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2312 gen_substitutions(URI, element);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2313 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2314 else if (maxOccurs && strcmp(maxOccurs, "1")) // maxOccurs != "1"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2315 { const char *s = tnameptr(cflag && zflag != 1, typeprefix, typeURI, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2316 if (cflag || sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2317 { fprintf(stream, "/// Size of the dynamic array of %s is %s..%s\n", s, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2318 fprintf(stream, sizeformat, "int", aname(NULL, NULL, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2319 fprintf(stream, " %s", fake_union ? "0" : minOccurs ? minOccurs : "1");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2320 if (is_integer(maxOccurs))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2321 fprintf(stream, ":%s", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2322 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2323 if (cflag && zflag != 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2324 { fprintf(stream, "/// Array %s of length %s..%s\n", s, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2325 fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2326 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2327 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2328 { fprintf(stream, "/// Pointer to array %s of length %s..%s\n", s, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2329 fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2330 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2331 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2332 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2333 { fprintf(stream, "/// Vector of %s element refs with length %s..%s\n", s, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2334 if (with_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2335 fprintf(stream, pointervectorformat, s, aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2336 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2337 fprintf(stream, vectorformat, s, aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2338 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2339 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2340 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2341 { fprintf(stream, "/// Element reference %s.\n", element.ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2342 fprintf(stream, elementformat, pname((with_union && !cflag && !is_basetypeforunion(typeprefix, typeURI, type)) || fake_union || is_nillable(element), typeprefix, typeURI, type), aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2343 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2344 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2345 else if (name && type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2346 { if (substok && element.abstract)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2347 { fprintf(stream, "/// Abstract element %s of type %s.\n", name, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2348 gen_substitutions(URI, element);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2349 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2350 else if (substok
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2351 && element.substitutionsPtr()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2352 && !element.substitutionsPtr()->empty())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2353 { if (vflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2354 fprintf(stderr, "\nWarning: element '%s' stands as the head of a substitutionGroup but is not declared abstract\n", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2355 gen_substitutions(URI, element);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2356 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2357 else if (maxOccurs && strcmp(maxOccurs, "1")) // maxOccurs != "1"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2358 { const char *s = tnameptr(cflag && zflag != 1, NULL, URI, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2359 if (cflag || sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2360 { fprintf(stream, "/// Size of array of %s is %s..%s\n", s, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2361 fprintf(stream, sizeformat, "int", aname(NULL, NULL, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2362 fprintf(stream, " %s", fake_union ? "0" : minOccurs ? minOccurs : "1");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2363 if (is_integer(maxOccurs))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2364 fprintf(stream, ":%s", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2365 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2366 if (cflag && zflag != 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2367 { fprintf(stream, "/// Array %s of length %s..%s\n", s, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2368 fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2369 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2370 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2371 { fprintf(stream, "/// Pointer to array %s of length %s..%s\n", s, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2372 fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2373 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2374 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2375 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2376 { fprintf(stream, "/// Vector of %s with length %s..%s\n", s, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2377 if (with_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2378 fprintf(stream, pointervectorformat, s, aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2379 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2380 fprintf(stream, vectorformat, s, aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2381 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2382 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2383 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2384 { fprintf(stream, "/// Element %s of type %s.\n", name, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2385 fprintf(stream, elementformat, pname((with_union && !cflag && !is_basetypeforunion(NULL, URI, type)) || (fake_union && !element.default_) || is_nillable(element), NULL, URI, type), aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2386 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2387 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2388 else if (name && element.simpleTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2389 { const char *s = "";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2390 document(element.simpleTypePtr()->annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2391 if (maxOccurs && strcmp(maxOccurs, "1")) // maxOccurs != "1"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2392 { if (cflag || sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2393 { fprintf(stream, "/// Size of %s array is %s..%s\n", name, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2394 fprintf(stream, sizeformat, "int", aname(NULL, NULL, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2395 fprintf(stream, " %s", fake_union ? "0" : minOccurs ? minOccurs : "1");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2396 if (is_integer(maxOccurs))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2397 fprintf(stream, ":%s", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2398 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2399 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2400 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2401 { s = ">";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2402 fprintf(stream, "/// Vector of %s with length %s..%s\n", name, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2403 fprintf(stream, vectorformat_open, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2404 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2405 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2406 gen(URI, name, *element.simpleTypePtr(), true);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2407 if (is_nillable(element)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2408 || ((cflag || sflag ) && maxOccurs && strcmp(maxOccurs, "1")) // maxOccurs != "1"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2409 || (with_union && !cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2410 || (fake_union && !element.default_))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2411 fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2412 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2413 fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2414 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2415 else if (name && element.complexTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2416 { const char *s = "}";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2417 document(element.complexTypePtr()->annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2418 if (maxOccurs && strcmp(maxOccurs, "1")) // maxOccurs != "1"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2419 { if (cflag || sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2420 { fprintf(stream, "/// Size of %s array is %s..%s\n", name, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2421 fprintf(stream, sizeformat, "int", aname(NULL, NULL, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2422 fprintf(stream, " %s", fake_union ? "0" : minOccurs ? minOccurs : "1");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2423 if (is_integer(maxOccurs))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2424 fprintf(stream, ":%s", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2425 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2426 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2427 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2428 { s = "}>";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2429 fprintf(stream, "/// Vector of %s with length %s..%s\n", name, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2430 fprintf(stream, vectorformat_open, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2431 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2432 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2433 gen(URI, name, *element.complexTypePtr(), true);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2434 if (is_nillable(element)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2435 || ((cflag || sflag ) && maxOccurs && strcmp(maxOccurs, "1")) // maxOccurs != "1"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2436 || (with_union && !cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2437 || (fake_union && !element.default_))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2438 fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2439 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2440 fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2441 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2442 else if (element.ref)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2443 { fprintf(stream, "/// Imported element reference %s.\n", element.ref);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2444 if (maxOccurs && strcmp(maxOccurs, "1")) // maxOccurs != "1"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2445 { if (cflag || sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2446 { fprintf(stream, "/// Size of %s array is %s..%s\n", element.ref, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2447 fprintf(stream, sizeformat, "int", aname(NULL, NULL, element.ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2448 fprintf(stream, " %s", fake_union ? "0" : minOccurs ? minOccurs : "1");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2449 if (is_integer(maxOccurs))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2450 fprintf(stream, ":%s", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2451 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2452 fprintf(stream, pointerformat, pname(true, "_", NULL, element.ref), aname(nameprefix, nameURI, element.ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2453 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2454 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2455 { fprintf(stream, "/// Vector of %s with length %s..%s\n", element.ref, minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2456 fprintf(stream, vectorformat, pname(false, "_", NULL, element.ref), aname(nameprefix, nameURI, element.ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2457 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2458 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2459 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2460 fprintf(stream, elementformat, pname((with_union && !cflag) || fake_union || is_nillable(element), "_", NULL, element.ref), aname(nameprefix, nameURI, element.ref));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2461 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2462 else if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2463 { fprintf(stream, "/// Element '%s' has no type or ref (empty or with XML content).\n", name?name:"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2464 if (maxOccurs && strcmp(maxOccurs, "1")) // maxOccurs != "1"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2465 { if (cflag || sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2466 { fprintf(stream, sizeformat, "int", aname(NULL, NULL, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2467 fprintf(stream, " %s", fake_union ? "0" : minOccurs ? minOccurs : "1");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2468 if (is_integer(maxOccurs))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2469 fprintf(stream, ":%s", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2470 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2471 fprintf(stream, "/// Pointer to array of XML.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2472 fprintf(stream, pointerformat, "_XML", aname(NULL, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2473 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2474 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2475 { fprintf(stream, "/// Vector of XML with length %s..%s\n", minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2476 if (with_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2477 fprintf(stream, pointervectorformat, "_XML", aname(NULL, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2478 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2479 fprintf(stream, vectorformat, "_XML", aname(NULL, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2480 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2481 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2482 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2483 fprintf(stream, elementformat, "_XML", aname(NULL, nameURI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2484 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2485 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2486 fprintf(stream, "/// Element has no name, type, or ref.");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2487 if (!substok
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2488 || ( !(element.elementPtr() && element.elementPtr()->abstract)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2489 && !(element.substitutionsPtr() && !element.substitutionsPtr()->empty())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2490 && !(element.elementPtr() && element.elementPtr()->substitutionsPtr() && !element.elementPtr()->substitutionsPtr()->empty())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2491 ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2492 { if (!fake_union && !minOccurs && !element.nillable && !element.default_ && !element.abstract)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2493 fprintf(stream, " 1");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2494 else if (!fake_union && minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2495 fprintf(stream, " %s", minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2496 if (maxOccurs && strcmp(maxOccurs, "1") && is_integer(maxOccurs))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2497 fprintf(stream, ":%s", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2498 if (element.default_
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2499 || ( element.fixed
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2500 && !fake_union
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2501 && (!minOccurs || !strcmp(minOccurs, "1"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2502 && (!maxOccurs || !strcmp(maxOccurs, "1"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2503 ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2504 { // determine whether the element can be assigned a default value, this is dependent on the choice of mapping for primitive types
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2505 const char *value, *QName;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2506 if (element.default_)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2507 { value = element.default_;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2508 QName = element.default__;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2509 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2510 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2511 { value = element.fixed;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2512 QName = element.fixed_;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2513 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2514 if (type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2515 { const char *t = tname(NULL, typeURI?typeURI:URI, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2516 if (!strncmp(t, "unsigned ", 9))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2517 t += 9;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2518 else if (!strncmp(t, "xsd__unsigned", 13))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2519 t += 13;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2520 else if (!strncmp(t, "xsd__", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2521 t += 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2522 if (!strcmp(t, "bool")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2523 || !strcmp(t, "byte")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2524 || !strcmp(t, "Byte")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2525 || !strcmp(t, "char")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2526 || !strcmp(t, "double")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2527 || !strcmp(t, "float")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2528 || !strcmp(t, "int")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2529 || !strcmp(t, "Int")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2530 || !strcmp(t, "long")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2531 || !strcmp(t, "Long")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2532 || !strcmp(t, "LONG64")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2533 || !strcmp(t, "short")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2534 || !strcmp(t, "Short")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2535 || !strcmp(t, "ULONG64"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2536 fprintf(stream, " = %s", value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2537 else if (!strncmp(t, "enum ", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2538 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2539 if (is_integer(value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2540 fprintf(stream, " = %s", value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2541 else if (!*value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2542 fprintf(stream, " = 0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2543 else if ((s = enames[Pair(t + 5, value)]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2544 fprintf(stream, " = %s", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2545 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2546 else if (!strcmp(t, "char*")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2547 || !strcmp(t, "char *") // not elegant
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2548 || !strcmp(t, "std::string")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2549 || !strcmp(t, "std::string*")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2550 || !strcmp(t, "std::string *")) // not elegant
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2551 fprintf(stream, " = \"%s\"", cstring(value));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2552 else if (!strcmp(t, "xsd__QName") && QName) // QName
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2553 fprintf(stream, " = \"%s\"", cstring(QName));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2554 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2555 if (element.default_)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2556 fprintf(stream, ";\t///< Default value=\"%s\".\n", value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2557 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2558 fprintf(stream, ";\t///< Fixed required value=\"%s\".\n", value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2559 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2560 else if (element.nillable)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2561 fprintf(stream, ";\t///< Nillable pointer.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2562 else if (!fake_union && (!minOccurs || !strcmp(minOccurs, "1")) && (!maxOccurs || !strcmp(maxOccurs, "1")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2563 fprintf(stream, ";\t///< Required element.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2564 else if (element.fixed)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2565 fprintf(stream, ";\t///< Fixed optional value=\"%s\".\n", element.fixed);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2566 else if (!fake_union && minOccurs && !strcmp(minOccurs, "0") && (!maxOccurs || !strcmp(maxOccurs, "1")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2567 fprintf(stream, ";\t///< Optional element.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2568 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2569 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2570 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2571 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2572
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2573 void Types::gen(const char *URI, const vector<xs__group>& groups)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2574 { for (vector<xs__group>::const_iterator group = groups.begin(); group != groups.end(); ++group)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2575 gen(URI, *group, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2576 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2577
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2578 void Types::gen(const char *URI, const xs__group& group, const char *minOccurs, const char *maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2579 { if (group.minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2580 minOccurs = group.minOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2581 if (group.maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2582 maxOccurs = group.maxOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2583 if (group.groupPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2584 { if (group.schemaPtr() == group.groupPtr()->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2585 gen(URI, *group.groupPtr(), minOccurs, maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2586 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2587 gen(group.groupPtr()->schemaPtr()->targetNamespace, *group.groupPtr(), minOccurs, maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2588 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2589 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2590 { fprintf(stream, "/// GROUP <xs:group name=\"%s\"", group.name ? group.name : "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2591 if (minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2592 fprintf(stream, " minOccurs=\"%s\"", minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2593 if (maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2594 fprintf(stream, " maxOccurs=\"%s\"", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2595 fprintf(stream, ">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2596 document(group.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2597 if (group.all)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2598 gen(URI, *group.all, minOccurs, maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2599 else if (group.choice)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2600 gen(URI, NULL, *group.choice, minOccurs, maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2601 else if (group.sequence)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2602 gen(URI, *group.sequence, minOccurs, maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2603 fprintf(stream, "// END OF GROUP\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2604 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2605 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2606
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2607 void Types::gen(const char *URI, const char *name, const xs__seqchoice& choice, const char *minOccurs, const char *maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2608 { const char *r = NULL, *s = NULL, *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2609 bool use_union = !uflag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2610 bool wrap_union = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2611 bool tmp_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2612 if (!URI && choice.schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2613 URI = choice.schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2614 fprintf(stream, "/// CHOICE <xs:choice");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2615 if (choice.minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2616 minOccurs = choice.minOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2617 if (choice.maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2618 maxOccurs = choice.maxOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2619 if (minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2620 fprintf(stream, " minOccurs=\"%s\"", minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2621 if (maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2622 fprintf(stream, " maxOccurs=\"%s\"", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2623 fprintf(stream, ">\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2624 document(choice.annotation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2625 for (vector<xs__contents>::const_iterator c1 = choice.__contents.begin(); c1 != choice.__contents.end(); ++c1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2626 { if ((*c1).__union == SOAP_UNION_xs__union_content_group
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2627 || (*c1).__union == SOAP_UNION_xs__union_content_sequence)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2628 { fprintf(stream, "/// Note: <xs:choice> with embedded <xs:sequence> or <xs:group> prevents the use of a union\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2629 use_union = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2630 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2631 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2632 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2633 if (use_union && (cflag || sflag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2634 { for (vector<xs__contents>::const_iterator c2 = choice.__contents.begin(); c2 != choice.__contents.end(); ++c2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2635 { if ((*c2).__union == SOAP_UNION_xs__union_content_element
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2636 && (*c2).__content.element
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2637 && (*c2).__content.element->maxOccurs
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2638 && strcmp((*c2).__content.element->maxOccurs, "1"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2639 { fprintf(stream, "/// Note: <xs:choice> of element with maxOccurs>1 prevents the use of a union\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2640 use_union = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2641 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2642 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2643 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2644 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2645 t = uname(URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2646 s = strstr(t, "__union");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2647 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2648 r = s + 7;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2649 if (!r || !*r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2650 { r = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2651 s = "__union";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2652 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2653 if (maxOccurs && strcmp(maxOccurs, "1"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2654 { if (with_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2655 { // Generate a wrapper when we need a union within a union
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2656 wrap_union = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2657 fprintf(stream, " struct __%s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2658 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2659 fprintf(stream, sizeformat, "int", r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2660 fprintf(stream, " %s", minOccurs ? minOccurs : "0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2661 if (is_integer(maxOccurs))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2662 fprintf(stream, ":%s", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2663 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2664 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2665 fprintf(stream, " struct _%s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2666 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2667 fprintf(stream, " class _%s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2668 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2669 if (use_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2670 { if (!with_union || wrap_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2671 { fprintf(stream, choiceformat, "int", r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2672 if (minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2673 fprintf(stream, " %s", minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2674 fprintf(stream, ";\t///< Union %s selector: set to SOAP_UNION_%s_<fieldname>%s\n", t, t, minOccurs && !strcmp(minOccurs, "0") ? " or 0" : "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2675 if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2676 fprintf(stream, "/// Union for choice in type %s\n", cname(NULL, URI, name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2677 fprintf(stream, " union %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2678 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2679 tmp_union = with_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2680 with_union = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2681 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2682 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2683 { tmp_union = fake_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2684 fake_union = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2685 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2686 gen(URI, choice.__contents);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2687 if (use_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2688 { with_union = tmp_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2689 if (!with_union || wrap_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2690 fprintf(stream, elementformat, "}", s+2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2691 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2692 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2693 fake_union = tmp_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2694 if (maxOccurs && strcmp(maxOccurs, "1"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2695 { if (use_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2696 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2697 fprintf(stream, pointerformat, "}", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2698 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2699 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2700 if (wrap_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2701 { fprintf(stream, elementformat, "}", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2702 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2703 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2704 fprintf(stream, "// END OF CHOICE\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2705 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2706
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2707 void Types::gen(const char *URI, const vector<xs__any>& anys)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2708 { for (vector<xs__any>::const_iterator any = anys.begin(); any != anys.end(); ++any)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2709 gen(URI, *any, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2710 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2711
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2712 void Types::gen(const char *URI, const xs__any& any, const char *minOccurs, const char *maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2713 { fprintf(stream, "/// TODO: <any");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2714 if (any.namespace_)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2715 fprintf(stream, " namespace=\"%s\"", any.namespace_);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2716 if (any.minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2717 minOccurs = any.minOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2718 if (any.maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2719 maxOccurs = any.maxOccurs;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2720 if (minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2721 fprintf(stream, " minOccurs=\"%s\"", minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2722 if (maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2723 fprintf(stream, " maxOccurs=\"%s\"", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2724 fprintf(stream, ">\n/// TODO: Schema extensibility is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -x to remove this element.\n/// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element).\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2725 if (!xflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2726 { if (maxOccurs && strcmp(maxOccurs, "1"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2727 { fprintf(stream, "/// Size of the array of XML or DOM nodes is %s..%s\n", minOccurs ? minOccurs : "1", maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2728 if (cflag || sflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2729 { if (!with_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2730 { fprintf(stream, sizeformat, "int", "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2731 fprintf(stream, "0;\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2732 fprintf(stream, elementformat, pname(true, NULL, NULL, "xsd:any"), "__any");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2733 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2734 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2735 fprintf(stream, elementformat, tname(NULL, NULL, "xsd:any"), "__any");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2736 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2737 else if (with_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2738 fprintf(stream, pointervectorformat, tname(NULL, NULL, "xsd:any"), "__any");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2739 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2740 fprintf(stream, vectorformat, tname(NULL, NULL, "xsd:any"), "__any");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2741 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2742 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2743 fprintf(stream, elementformat, pname(with_union, NULL, NULL, "xsd:any"), "__any");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2744 if (dflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2745 fprintf(stream, "0;\t///< Catch any element content in DOM.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2746 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2747 fprintf(stream, "0;\t///< Catch any element content in XML string.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2748 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2749 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2750
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2751 void Types::gen(const char *URI, const xs__anyAttribute& anyAttribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2752 { if (anyAttribute.namespace_)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2753 fprintf(stream, "/// <anyAttribute namespace=\"%s\">\n", anyAttribute.namespace_);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2754 fprintf(stream, "/// TODO: Schema extensibility is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -x to remove this attribute.\n/// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute).\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2755 if (!xflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2756 { const char *t = tname(NULL, NULL, "xsd:anyAttribute");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2757 fprintf(stream, attributeformat, t, "__anyAttribute");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2758 if (dflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2759 fprintf(stream, ";\t///< Store anyAttribute content in DOM soap_dom_attribute linked node structure.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2760 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2761 fprintf(stream, ";\t///< A placeholder that has no effect: please see comment.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2762 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2763 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2764
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2765 void Types::gen_inh(const char *URI, const xs__complexType *complexType, bool anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2766 { const xs__complexType *p = complexType;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2767 if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2768 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2769 const char *pURI;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2770 if (p->schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2771 pURI = p->schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2772 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2773 pURI = URI;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2774 const char *b = cname(NULL, pURI, p->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2775 if (p->complexContent && p->complexContent->extension)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2776 gen_inh(URI, p->complexContent->extension->complexTypePtr(), anonymous);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2777 if (cflag || fflag || anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2778 fprintf(stream, "/// INHERITED FROM %s:\n", b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2779 else if (comment_nest == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2780 fprintf(stream, "/* INHERITED FROM %s:\n", b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2781 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2782 fprintf(stream, " INHERITED FROM %s:\n", b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2783 comment_nest++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2784 if (cflag || fflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2785 pURI = URI; // if base ns != derived ns then qualify elts
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2786 if (p->complexContent && p->complexContent->extension)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2787 { if (p->complexContent->extension->group)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2788 gen(pURI, *p->complexContent->extension->group, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2789 if (p->complexContent->extension->all)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2790 gen(pURI, *p->complexContent->extension->all, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2791 if (p->complexContent->extension->sequence)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2792 gen(pURI, *p->complexContent->extension->sequence, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2793 if (p->complexContent->extension->choice)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2794 gen(pURI, p->name, *p->complexContent->extension->choice, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2795 gen(pURI, p->complexContent->extension->attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2796 gen(pURI, p->complexContent->extension->attributeGroup);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2797 if (p->complexContent->extension->anyAttribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2798 gen(pURI, *p->complexContent->extension->anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2799 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2800 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2801 { if (p->all)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2802 gen(pURI, p->all->element, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2803 else if (p->all)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2804 gen(pURI, *p->all, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2805 else if (p->choice)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2806 gen(pURI, p->name, *p->choice, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2807 else if (p->sequence)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2808 gen(pURI, *p->sequence, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2809 else if (p->any)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2810 gen(pURI, *p->any, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2811 gen(pURI, p->attribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2812 gen(pURI, p->attributeGroup);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2813 if (p->anyAttribute)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2814 gen(pURI, *p->anyAttribute);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2815 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2816 modify(b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2817 comment_nest--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2818 if (cflag || fflag || anonymous)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2819 fprintf(stream, "// END OF INHERITED FROM %s\n", b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2820 else if (comment_nest == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2821 fprintf(stream, " END OF INHERITED FROM %s */\n", b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2822 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2823 fprintf(stream, " END OF INHERITED FROM %s\n", b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2824 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2825
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2826 void Types::gen_soap_array(const char *name, const char *t, const char *item, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2827 { char *tmp = NULL, *dims = NULL, size[8];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2828 if (type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2829 { tmp = (char*)emalloc(strlen(type) + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2830 strcpy(tmp, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2831 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2832 *size = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2833 if (tmp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2834 dims = strrchr(tmp, '[');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2835 if (dims)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2836 *dims++ = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2837 fprintf(stream, "/// SOAP encoded array of %s\n", tmp ? tmp : "xs:anyType");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2838 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2839 fprintf(stream, "struct %s\n{\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2840 else if (pflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2841 fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2842 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2843 fprintf(stream, "class %s\n{ public:\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2844 if (dims)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2845 { char *s = strchr(dims, ']');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2846 if (s && s != dims)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2847 sprintf(size, "[%d]", (int)(s - dims + 1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2848 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2849 if (tmp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2850 { if (strchr(tmp, '[') != NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2851 { gen_soap_array(NULL, "", item, tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2852 fprintf(stream, arrayformat, "}", item ? aname(NULL, NULL, item) : "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2853 fprintf(stream, ";\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 { const char *s = pname(!is_basetype(NULL, NULL, tmp), NULL, NULL, tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2857 fprintf(stream, "/// Pointer to array of %s.\n", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2858 fprintf(stream, arrayformat, s, item ? aname(NULL, NULL, item) : "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2859 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2860 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2861 if (*size)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2862 fprintf(stream, "/// Size of the multidimensional dynamic array with dimensions=%s\n", size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2863 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2864 fprintf(stream, "/// Size of the dynamic array.\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2865 fprintf(stream, arraysizeformat, "int", size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2866 fprintf(stream, ";\n/// Offset for partially transmitted arrays (uncomment only when required).\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2867 fprintf(stream, arrayoffsetformat, "int", size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2868 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2869 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2870 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2871 { // TODO: how to handle generic SOAP array? E.g. as an array of anyType?
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2872 fprintf(stream, "// TODO: add declarations to handle generic SOAP-ENC:Array (array of anyType)\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2873 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2874 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2875
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2876 void Types::gen_substitutions(const char *URI, const xs__element &element)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2877 { const std::vector<xs__element*> *substitutions;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2878 const char *name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2879 const char *r = NULL, *s = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2880 bool use_union = !uflag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2881 bool wrap_union = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2882 bool tmp_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2883 bool abstract = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2884 if (!URI && element.schemaPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2885 URI = element.schemaPtr()->targetNamespace;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2886 if (element.elementPtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2887 { name = element.elementPtr()->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2888 substitutions = element.elementPtr()->substitutionsPtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2889 abstract = element.elementPtr()->abstract;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2890 if (!abstract && element.elementPtr()->complexTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2891 abstract = element.elementPtr()->complexTypePtr()->abstract;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2892 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2893 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2894 { name = element.name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2895 substitutions = element.substitutionsPtr();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2896 abstract = element.abstract;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2897 if (!abstract && element.complexTypePtr())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2898 abstract = element.complexTypePtr()->abstract;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2899 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2900 fprintf(stream, "/// CHOICE OF SUBSTITUTIONS <xs:element substitutionGroup=\"%s\"", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2901 if (element.minOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2902 fprintf(stream, " minOccurs=\"%s\"", element.minOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2903 if (element.maxOccurs)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2904 fprintf(stream, " maxOccurs=\"%s\"", element.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2905 fprintf(stream, "> with elements");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2906 for (std::vector<xs__element*>::const_iterator i1 = substitutions->begin(); i1 != substitutions->end(); ++i1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2907 fprintf(stream, " <%s>", (*i1)->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2908 fprintf(stream, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2909 if (use_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2910 { const char *t = uname(URI);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2911 // TODO: could reuse the union instead of generating a new one each time!
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2912 s = strstr(t, "__union");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2913 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2914 s = "__union";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2915 r = aname(NULL, NULL, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2916 if (element.maxOccurs && strcmp(element.maxOccurs, "1"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2917 { if (with_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2918 { // Generate a wrapper when we need a union within a union
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2919 wrap_union = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2920 fprintf(stream, " struct __%s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2921 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2922 fprintf(stream, sizeformat, "int", r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2923 fprintf(stream, " %s", element.minOccurs ? element.minOccurs : "0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2924 if (is_integer(element.maxOccurs))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2925 fprintf(stream, ":%s", element.maxOccurs);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2926 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2927 if (cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2928 fprintf(stream, " struct _%s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2929 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2930 fprintf(stream, " class _%s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2931 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2932 if (!with_union || wrap_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2933 { fprintf(stream, choiceformat, "int", r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2934 fprintf(stream, " %s", element.minOccurs ? element.minOccurs : "0");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2935 fprintf(stream, ";\t///< Union %s selector: set to SOAP_UNION_%s_<fieldname>%s\n", t, t, element.minOccurs && !strcmp(element.minOccurs, "0") ? " or 0" : "");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2936 fprintf(stream, "/// Union for substitutionGroup=\"%s\"\n", name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2937 fprintf(stream, " union %s\n {\n", t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2938 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2939 tmp_union = with_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2940 with_union = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2941 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2942 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2943 { tmp_union = fake_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2944 fake_union = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2945 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2946 if (!abstract)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2947 gen(URI, element, false, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2948 for (vector<xs__element*>::const_iterator i2 = substitutions->begin(); i2 != substitutions->end(); ++i2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2949 gen(URI, *(*i2), true, NULL, NULL); // substitutions are recursive?
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2950 if (use_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2951 { with_union = tmp_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2952 if (!with_union || wrap_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2953 { fprintf(stream, elementformat, "}", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2954 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2955 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2956 if (element.maxOccurs && strcmp(element.maxOccurs, "1"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2957 { fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2958 fprintf(stream, pointerformat, "}", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2959 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2960 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2961 if (wrap_union)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2962 { fprintf(stream, elementformat, "}", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2963 fprintf(stream, ";\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2964 }
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 fake_union = tmp_union;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2968 fprintf(stream, "// END OF CHOICE OF SUBSTITUTIONS\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2969 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2970
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2971 void Types::document(const xs__annotation *annotation)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2972 { if (annotation && annotation->documentation)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2973 { fprintf(stream, "/// @brief");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2974 documentation(annotation->documentation);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2975 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2976 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2977
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2978 void Types::modify(const char *name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2979 { // TODO: consider support removal of elements/attributes with ns__X = $- Y
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2980 const char *s = modtypemap[name];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2981 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2982 { while (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2983 { if (*s++ == '$')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2984 fprintf(stream, "/// Member declared in %s\n ", mapfile);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2985 s = format(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2986 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2987 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2988 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2989
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2990 const char* Types::format(const char *text)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2991 { const char *s = text;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2992 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2993 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2994 while (*s && *s != '$')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2995 { if (*s == '\\')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2996 { switch (s[1])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2997 { case 'n':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2998 fputc('\n', stream);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2999 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3000 case 't':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3001 fputc('\t', stream);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3002 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3003 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3004 fputc(s[1], stream);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3005 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3006 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3007 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3008 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3009 fputc(*s, stream);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3010 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3011 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3012 fputc('\n', stream);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3013 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3014 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3015
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3016 ////////////////////////////////////////////////////////////////////////////////
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3017 //
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3018 // Type map file parsing
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3019 //
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3020 ////////////////////////////////////////////////////////////////////////////////
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3021
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3022 static char *getline(char *s, size_t n, FILE *fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3023 { int c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3024 char *t = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3025 if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3026 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3027 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3028 { c = fgetc(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3029 if (c == '\r')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3030 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3031 if (c == '\\')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3032 { c = fgetc(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3033 if (c == '\r')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3034 c = fgetc(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3035 if (c < ' ')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3036 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3037 if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3038 { *t++ = '\\';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3039 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3040 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3041 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3042 if (c == '\n' || c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3043 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3044 if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3045 { *t++ = c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3046 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3047 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3048 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3049 *t++ = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3050 if (!*s && c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3051 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3052 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3053 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3054
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3055 static const char *nonblank(const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3056 { while (*s && isspace(*s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3057 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3058 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3059 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3060
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3061 static const char *fill(char *t, int n, const char *s, int e)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3062 { int i = n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3063 s = nonblank(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3064 while (*s && *s != e && --i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3065 *t++ = *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3066 while (*s && *s != e)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3067 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3068 if (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3069 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3070 i = n - i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3071 if (i == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3072 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3073 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3074 { while (isspace(*--t) && i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3075 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3076 t[1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3077 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3078 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3079 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3080
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3081 ////////////////////////////////////////////////////////////////////////////////
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3082 //
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3083 // Miscellaneous
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3084 //
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3085 ////////////////////////////////////////////////////////////////////////////////
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3086
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3087 static const char *utf8(char *t, const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3088 { unsigned int c = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3089 unsigned int c1, c2, c3, c4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3090 c = (unsigned char)*s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3091 if (c >= 0x80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3092 { c1 = (unsigned char)*++s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3093 if (c1 < 0x80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3094 s--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3095 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3096 { c1 &= 0x3F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3097 if (c < 0xE0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3098 c = ((c & 0x1F) << 6) | c1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3099 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3100 { c2 = (unsigned char)*++s & 0x3F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3101 if (c < 0xF0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3102 c = ((c & 0x0F) << 12) | (c1 << 6) | c2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3103 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3104 { c3 = (unsigned char)*++s & 0x3F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3105 if (c < 0xF8)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3106 c = ((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3107 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3108 { c4 = (unsigned char)*++s & 0x3F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3109 if (c < 0xFC)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3110 c = ((c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3111 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3112 c = ((c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (*++s & 0x3F);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3113 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3114 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3115 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3116 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3117 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3118 sprintf(t, "_x%.4x", c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3119 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3120 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3121
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3122 static const char *cstring(const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3123 { size_t n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3124 char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3125 const char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3126 for (n = 0, r = s; *r; n++, r++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3127 if (*r == '"' || *r == '\\')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3128 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3129 else if (*r < 32)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3130 n += 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3131 r = t = (char*)emalloc(n + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3132 for (; *s; s++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3133 { if (*s == '"' || *s == '\\')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3134 { *t++ = '\\';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3135 *t++ = *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3136 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3137 else if (*s < 32)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3138 { sprintf(t, "\\%03o", (unsigned int)(unsigned char)*s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3139 t += 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3140 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3141 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3142 *t++ = *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3143 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3144 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3145 return r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3146 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3147
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3148 static const char *xstring(const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3149 { size_t n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3150 char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3151 const char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3152 for (n = 0, r = s; *r; n++, r++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3153 { if (*r < 32 || *r >= 127)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3154 n += 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3155 else if (*r == '<' || *r == '>')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3156 n += 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3157 else if (*r == '&')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3158 n += 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3159 else if (*r == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3160 n += 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3161 else if (*r == '\\')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3162 n += 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3163 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3164 r = t = (char*)emalloc(n + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3165 for (; *s; s++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3166 { if (*s < 32 || *s >= 127)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3167 { sprintf(t, "&#%.2x;", (unsigned char)*s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3168 t += 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3169 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3170 else if (*s == '<')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3171 { strcpy(t, "&lt;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3172 t += 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3173 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3174 else if (*s == '>')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3175 { strcpy(t, "&gt;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3176 t += 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3177 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3178 else if (*s == '&')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3179 { strcpy(t, "&amp;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3180 t += 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3181 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3182 else if (*s == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3183 { strcpy(t, "&quot;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3184 t += 6;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3185 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3186 else if (*s == '\\')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3187 { strcpy(t, "\\\\");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3188 t += 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3189 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3190 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3191 *t++ = *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3192 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3193 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3194 return r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3195 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3196
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3197 static LONG64 to_integer(const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3198 { LONG64 n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3199 #ifdef HAVE_STRTOLL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3200 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3201 n = soap_strtoll(s, &r, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3202 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3203 # ifdef HAVE_SSCANF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3204 sscanf(s, SOAP_LONG_FORMAT, &n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3205 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3206 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3207 return n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3208 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3209
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3210 static bool is_integer(const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3211 { if ((*s == '-' || *s == '+') && s[1])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3212 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3213 if (!*s || strlen(s) > 20)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3214 return false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3215 while (*s && isdigit(*s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3216 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3217 return *s == '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3218 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3219
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3220 static void documentation(const char *text)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3221 { const char *s = text;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3222 bool flag = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3223 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3224 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3225 while (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3226 { switch (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3227 { case '\n':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3228 case '\t':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3229 case ' ':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3230 flag = true;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3231 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3232 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3233 if (*s > 32)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3234 { if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3235 { fputc(' ', stream);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3236 flag = false;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3237 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3238 fputc(*s, stream);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3239 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3240 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3241 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3242 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3243 fputc('\n', stream);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3244 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3245
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3246 static void operations(const char *t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3247 { if (!cflag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3248 fprintf(stream, "/// class %s operations:\n/// - soap_new_%s(soap*) allocate\n/// - soap_new_%s(soap*, int num) allocate array\n/// - soap_new_req_%s(soap*, ...) allocate, set required members\n/// - soap_new_set_%s(soap*, ...) allocate, set all public members\n/// - int soap_read_%s(soap*, %s*) deserialize from a stream\n/// - int soap_write_%s(soap, %s*) serialize to a stream\n", t, t, t, t, t, t, t, t, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3249 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3250
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3251 ////////////////////////////////////////////////////////////////////////////////
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3252 //
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3253 // Allocation
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3254 //
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3255 ////////////////////////////////////////////////////////////////////////////////
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3256
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3257 void *emalloc(size_t size)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3258 { void *p = malloc(size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3259 if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3260 { fprintf(stderr, "\nError: Malloc failed\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3261 exit(1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3262 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3263 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3264 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3265
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3266 char *estrdup(const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3267 { char *t = (char*)emalloc(strlen(s) + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3268 strcpy(t, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3269 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3270 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3271
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3272 char *estrdupf(const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3273 { char *t = (char*)emalloc(strlen(s) + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3274 char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3275 for (p = t; *s; s++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3276 { if (s[0] == '/' && s[1] == '*')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3277 { for (s += 2; s[0] && s[1]; s++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3278 { if (s[0] == '*' && s[1] == '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3279 { s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3280 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3281 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3282 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3283 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3284 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3285 *p++ = *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3286 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3287 *p = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3288 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3289 }