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
)
29 , construct(a_construct
)
30 , origin(from_unknown
)
33 switch (a_construct
) {
38 //redundant: origin = from_unknown;
40 case c_unknown
: // because when using fields in complextypes we set construct to c_unknown
42 origin
= from_simpleType
;
43 type
.upload(Mstring("anySimpleType"));
46 origin
= from_element
;
47 type
.upload(Mstring("anyType"));
48 addVariant(V_element
);
51 origin
= from_attribute
;
52 type
.upload(Mstring("anySimpleType"));
53 addVariant(V_attribute
);
56 origin
= from_complexType
;
57 type
.upload(Mstring("record"));
61 type
.upload(Mstring("record"));
62 addVariant(V_untagged
);
64 case c_attributeGroup
:
65 origin
= from_attributeGroup
;
66 type
.upload(Mstring("record"));
67 addVariant(V_attributeGroup
);
75 void RootType::addVariant(const VariantMode var
, const Mstring
& var_value
, const bool into_variant_ref
) {
76 Mstring variantstring
;
80 variantstring
= "\"abstract\"";
83 variantstring
= "\"anyAttributes" + var_value
+ "\"";
86 variantstring
= "\"anyElement" + var_value
+ "\"";
89 variantstring
= "\"attribute\"";
91 case V_attributeFormQualified
:
92 variantstring
= "\"attributeFormQualified\"";
94 case V_attributeGroup
:
95 variantstring
= "\"attributeGroup\"";
98 variantstring
= "\"block\"";
100 case V_controlNamespace
:
101 variantstring
= "\"controlNamespace" + var_value
+ "\"";
103 case V_defaultForEmpty
:
104 variantstring
= "\"defaultForEmpty as \'" + var_value
+ "\'\""; // chapter 7.1.5
107 variantstring
= "\"element\"";
109 case V_elementFormQualified
:
110 variantstring
= "\"elementFormQualified\"";
113 variantstring
= "\"embedValues\"";
116 variantstring
= "\"form as " + var_value
+ "\"";
119 variantstring
= "\"list\"";
122 variantstring
= "\"name as \'" + var_value
+ "\'\"";
128 for (List
<NamespaceType
>::iterator namesp
= module
->getDeclaredNamespaces().begin(); namesp
; namesp
= namesp
->Next
) {
129 if (namesp
->Data
.uri
== var_value
) {
130 prefix
= namesp
->Data
.prefix
;
131 uri
= namesp
->Data
.uri
;
135 if (prefix
.empty() || uri
.empty()) {
138 variantstring
= "\"namespace as \'" + uri
+ "\' prefix \'" + prefix
+ "\'\"";
142 variantstring
= var_value
;
144 case V_onlyValueHidden
:
145 hidden_variant
.push_back(var_value
);
148 variantstring
= "\"untagged\"";
151 variantstring
= "\"useNil\"";
154 variantstring
= "\"useNumber\"";
157 variantstring
= "\"useOrder\"";
160 variantstring
= "\"useType\"";
163 variantstring
= "\"useUnion\"";
166 variantstring
= "\"whiteSpace " + var_value
+ "\"";
168 case V_fractionDigits
:
169 //variantstring = "\"fractionDigits " + var_value + "\"";
173 if (!variantstring
.empty()) {
174 variant
.push_back(variantstring
);
175 if (into_variant_ref
) {
176 variant_ref
.push_back(variantstring
);
181 void RootType::printVariant(FILE * file
) {
182 if (!e_flag_used
&& !variant
.empty()) {
183 fprintf(file
, "\nwith {\n");
184 for (List
<Mstring
>::iterator var
= variant
.end(); var
; var
= var
->Prev
) {
185 fprintf(file
, " variant %s;\n", var
->Data
.c_str());
187 for (List
<Mstring
>::iterator var
= hidden_variant
.end(); var
; var
= var
->Prev
) {
188 fprintf(file
, " //variant %s;\n", var
->Data
.c_str());
191 } else if (!e_flag_used
&& type
.originalValueWoPrefix
== Mstring("boolean")) {
192 fprintf(file
, ";\n//with {\n");
193 for (List
<Mstring
>::iterator var
= hidden_variant
.end(); var
; var
= var
->Prev
) {
194 fprintf(file
, " //variant %s;\n", var
->Data
.c_str());
196 fprintf(file
, "//}");
200 void RootType::addComment(const Mstring
& text
) {
201 comment
.push_back(Mstring("/* " + text
+ " */\n"));
204 void RootType::printComment(FILE * file
, int level
) {
205 if (!c_flag_used
&& !comment
.empty()) {
206 for (List
<Mstring
>::iterator c
= comment
.begin(); c
; c
= c
->Next
) {
208 fprintf(file
, "%s", c
->Data
.c_str());
213 void RootType::printMinOccursMaxOccurs(FILE * file
, const bool inside_union
,
214 const bool empty_allowed
/* = true */) const {
216 unsigned long long tmp_minOccurs
= minOccurs
;
217 if (minOccurs
== 0 && !empty_allowed
) tmp_minOccurs
= 1ULL;
219 if (maxOccurs
== 1) {
220 if (minOccurs
== 0) {
221 if (inside_union
|| name
.list_extension
) {
222 fputs("record length(", file
);
223 if (empty_allowed
) fputs("0 .. ", file
);
224 // else: length(1..1) is shortened to length(1)
225 fputs("1) of ", file
);
227 // else it's optional which is not printed from here
228 } else if (minOccurs
== 1) {
229 // min==max==1; do nothing unless...
230 if (name
.convertedValue
== "embed_values") {
231 fputs("record length(1) of ", file
);
234 } else if (maxOccurs
== ULLONG_MAX
) {
235 if (minOccurs
== 0) {
236 fputs("record ", file
);
237 if (!empty_allowed
) fputs("length(1 .. infinity) ", file
);
239 } else fprintf(file
, "record length(%llu .. infinity) of ", tmp_minOccurs
);
241 if (tmp_minOccurs
== maxOccurs
) {
242 fprintf(file
, "record length(%llu) of ", tmp_minOccurs
);
244 fprintf(file
, "record length(%llu .. %llu) of ", tmp_minOccurs
, maxOccurs
);
249 bool RootType::hasVariant(const Mstring
& var
) const{
250 for(List
<Mstring
>::iterator vars
= variant
.begin(); vars
; vars
= vars
->Next
){
251 if(vars
->Data
.isFound(var
)){
255 for(List
<Mstring
>::iterator vars
= hidden_variant
.begin(); vars
; vars
= vars
->Next
){
256 if(vars
->Data
.isFound(var
)){