1 /******************************************************************************
2 * Copyright (c) 2000-2016 Ericsson Telecom AB
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
14 ******************************************************************************/
15 #include "RootType.hh"
17 #include "TTCN3Module.hh"
19 RootType::RootType(XMLParser
* a_parser
, TTCN3Module
* a_module
, const ConstructType a_construct
)
27 , construct(a_construct
)
28 , origin(from_unknown
)
35 switch (a_construct
) {
40 //redundant: origin = from_unknown;
42 case c_unknown
: // because when using fields in complextypes we set construct to c_unknown
44 origin
= from_simpleType
;
45 type
.upload(Mstring("anySimpleType"));
48 origin
= from_element
;
49 type
.upload(Mstring("anyType"));
50 addVariant(V_element
);
53 origin
= from_attribute
;
54 type
.upload(Mstring("anySimpleType"));
55 addVariant(V_attribute
);
58 origin
= from_complexType
;
59 type
.upload(Mstring("record"));
63 type
.upload(Mstring("record"));
64 addVariant(V_untagged
);
66 case c_attributeGroup
:
67 origin
= from_attributeGroup
;
68 type
.upload(Mstring("record"));
69 addVariant(V_attributeGroup
);
77 void RootType::addVariant(const VariantMode var
, const Mstring
& var_value
, const bool into_variant_ref
) {
78 Mstring variantstring
;
82 variantstring
= "\"abstract\"";
85 variantstring
= "\"anyAttributes" + var_value
+ "\"";
88 variantstring
= "\"anyElement" + var_value
+ "\"";
91 variantstring
= "\"attribute\"";
93 case V_attributeFormQualified
:
94 variantstring
= "\"attributeFormQualified\"";
96 case V_attributeGroup
:
97 variantstring
= "\"attributeGroup\"";
100 variantstring
= "\"block\"";
102 case V_controlNamespace
:
103 variantstring
= "\"controlNamespace" + var_value
+ "\"";
105 case V_defaultForEmpty
:
106 variantstring
= "\"defaultForEmpty as \'" + var_value
+ "\'\""; // chapter 7.1.5
109 variantstring
= "\"element\"";
111 case V_elementFormQualified
:
112 variantstring
= "\"elementFormQualified\"";
115 variantstring
= "\"embedValues\"";
118 variantstring
= "\"form as " + var_value
+ "\"";
121 variantstring
= "\"list\"";
124 variantstring
= "\"name as \'" + var_value
+ "\'\"";
130 for (List
<NamespaceType
>::iterator namesp
= module
->getDeclaredNamespaces().begin(); namesp
; namesp
= namesp
->Next
) {
131 if (namesp
->Data
.uri
== var_value
) {
132 prefix
= namesp
->Data
.prefix
;
133 uri
= namesp
->Data
.uri
;
137 if (prefix
.empty() || uri
.empty()) {
140 variantstring
= "\"namespace as \'" + uri
+ "\' prefix \'" + prefix
+ "\'\"";
144 variantstring
= var_value
;
146 case V_onlyValueHidden
:
147 hidden_variant
.push_back(var_value
);
150 variantstring
= "\"untagged\"";
153 variantstring
= "\"useNil\"";
156 variantstring
= "\"useNumber\"";
159 variantstring
= "\"useOrder\"";
162 variantstring
= "\"useType\"";
165 variantstring
= "\"useUnion\"";
168 variantstring
= "\"whiteSpace " + var_value
+ "\"";
170 case V_fractionDigits
:
171 //variantstring = "\"fractionDigits " + var_value + "\"";
175 if (!variantstring
.empty()) {
176 variant
.push_back(variantstring
);
177 if (into_variant_ref
) {
178 variant_ref
.push_back(variantstring
);
183 void RootType::printVariant(FILE * file
) {
184 if (!e_flag_used
&& !variant
.empty()) {
185 fprintf(file
, "\nwith {\n");
186 for (List
<Mstring
>::iterator var
= variant
.end(); var
; var
= var
->Prev
) {
187 fprintf(file
, " variant %s;\n", var
->Data
.c_str());
189 for (List
<Mstring
>::iterator var
= hidden_variant
.end(); var
; var
= var
->Prev
) {
190 fprintf(file
, " //variant %s;\n", var
->Data
.c_str());
193 } else if (!e_flag_used
&& type
.originalValueWoPrefix
== Mstring("boolean")) {
194 fprintf(file
, ";\n//with {\n");
195 for (List
<Mstring
>::iterator var
= hidden_variant
.end(); var
; var
= var
->Prev
) {
196 fprintf(file
, " //variant %s;\n", var
->Data
.c_str());
198 fprintf(file
, "//}");
202 void RootType::addComment(const Mstring
& text
) {
203 comment
.push_back(Mstring("/* " + text
+ " */\n"));
206 void RootType::printComment(FILE * file
, int level
) {
207 if (!c_flag_used
&& !comment
.empty()) {
208 for (List
<Mstring
>::iterator c
= comment
.begin(); c
; c
= c
->Next
) {
210 fprintf(file
, "%s", c
->Data
.c_str());
215 void RootType::printMinOccursMaxOccurs(FILE * file
, const bool inside_union
,
216 const bool empty_allowed
/* = true */) const {
218 unsigned long long tmp_minOccurs
= minOccurs
;
219 if (minOccurs
== 0 && !empty_allowed
) tmp_minOccurs
= 1ULL;
221 if (maxOccurs
== 1) {
222 if (minOccurs
== 0) {
223 if (inside_union
|| name
.list_extension
) {
224 fputs("record length(", file
);
225 if (empty_allowed
) fputs("0 .. ", file
);
226 // else: length(1..1) is shortened to length(1)
227 fputs("1) of ", file
);
229 // else it's optional which is not printed from here
230 } else if (minOccurs
== 1) {
231 // min==max==1; do nothing unless...
232 if (name
.convertedValue
== "embed_values") {
233 fputs("record length(1) of ", file
);
236 } else if (maxOccurs
== ULLONG_MAX
) {
237 if (minOccurs
== 0) {
238 fputs("record ", file
);
239 if (!empty_allowed
) fputs("length(1 .. infinity) ", file
);
241 } else fprintf(file
, "record length(%llu .. infinity) of ", tmp_minOccurs
);
243 if (tmp_minOccurs
== maxOccurs
) {
244 fprintf(file
, "record length(%llu) of ", tmp_minOccurs
);
246 fprintf(file
, "record length(%llu .. %llu) of ", tmp_minOccurs
, maxOccurs
);
251 bool RootType::hasVariant(const Mstring
& var
) const{
252 for(List
<Mstring
>::iterator vars
= variant
.begin(); vars
; vars
= vars
->Next
){
253 if(vars
->Data
.isFound(var
)){
257 for(List
<Mstring
>::iterator vars
= hidden_variant
.begin(); vars
; vars
= vars
->Next
){
258 if(vars
->Data
.isFound(var
)){