1 ///////////////////////////////////////////////////////////////////////////////
2 // Copyright (c) 2000-2015 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
7 ///////////////////////////////////////////////////////////////////////////////
10 #include "TTCN3Module.hh"
12 RootType::RootType(XMLParser
* a_parser
, TTCN3Module
* a_module
, const ConstructType a_construct
)
22 , construct(a_construct
)
23 , origin(from_unknown
)
26 switch (a_construct
) {
31 //redundant: origin = from_unknown;
33 case c_unknown
: // because when using fields in complextypes we set construct to c_unknown
35 origin
= from_simpleType
;
36 type
.upload(Mstring("anySimpleType"));
39 origin
= from_element
;
40 type
.upload(Mstring("anyType"));
41 addVariant(V_element
);
44 origin
= from_attribute
;
45 type
.upload(Mstring("anySimpleType"));
46 addVariant(V_attribute
);
49 origin
= from_complexType
;
50 type
.upload(Mstring("record"));
54 type
.upload(Mstring("record"));
55 addVariant(V_untagged
);
57 case c_attributeGroup
:
58 origin
= from_attributeGroup
;
59 type
.upload(Mstring("record"));
60 addVariant(V_attributeGroup
);
68 void RootType::addVariant(const VariantMode var
, const Mstring
& var_value
, const bool into_variant_ref
) {
69 Mstring variantstring
;
73 variantstring
= "\"abstract\"";
76 variantstring
= "\"anyAttributes" + var_value
+ "\"";
79 variantstring
= "\"anyElement" + var_value
+ "\"";
82 variantstring
= "\"attribute\"";
84 case V_attributeFormQualified
:
85 variantstring
= "\"attributeFormQualified\"";
87 case V_attributeGroup
:
88 variantstring
= "\"attributeGroup\"";
91 variantstring
= "\"block\"";
93 case V_controlNamespace
:
94 variantstring
= "\"controlNamespace" + var_value
+ "\"";
96 case V_defaultForEmpty
:
97 variantstring
= "\"defaultForEmpty as \'" + var_value
+ "\'\""; // chapter 7.1.5
100 variantstring
= "\"element\"";
102 case V_elementFormQualified
:
103 variantstring
= "\"elementFormQualified\"";
106 variantstring
= "\"embedValues\"";
109 variantstring
= "\"form as " + var_value
+ "\"";
112 variantstring
= "\"list\"";
115 variantstring
= "\"name as \'" + var_value
+ "\'\"";
121 for (List
<NamespaceType
>::iterator namesp
= module
->getDeclaredNamespaces().begin(); namesp
; namesp
= namesp
->Next
) {
122 if (namesp
->Data
.uri
== var_value
) {
123 prefix
= namesp
->Data
.prefix
;
124 uri
= namesp
->Data
.uri
;
128 if (prefix
.empty() || uri
.empty()) {
131 variantstring
= "\"namespace as \'" + uri
+ "\' prefix \'" + prefix
+ "\'\"";
135 variantstring
= var_value
;
137 case V_onlyValueHidden
:
138 hidden_variant
.push_back(var_value
);
141 variantstring
= "\"untagged\"";
144 variantstring
= "\"useNil\"";
147 variantstring
= "\"useNumber\"";
150 variantstring
= "\"useOrder\"";
153 variantstring
= "\"useType\"";
156 variantstring
= "\"useUnion\"";
159 variantstring
= "\"whiteSpace " + var_value
+ "\"";
161 case V_fractionDigits
:
162 //variantstring = "\"fractionDigits " + var_value + "\"";
166 if (!variantstring
.empty()) {
167 variant
.push_back(variantstring
);
168 if (into_variant_ref
) {
169 variant_ref
.push_back(variantstring
);
174 void RootType::printVariant(FILE * file
) {
175 if (!e_flag_used
&& !variant
.empty()) {
176 fprintf(file
, "\nwith {\n");
177 for (List
<Mstring
>::iterator var
= variant
.end(); var
; var
= var
->Prev
) {
178 fprintf(file
, "variant %s;\n", var
->Data
.c_str());
180 for (List
<Mstring
>::iterator var
= hidden_variant
.end(); var
; var
= var
->Prev
) {
181 fprintf(file
, "//variant %s;\n", var
->Data
.c_str());
184 } else if (!e_flag_used
&& type
.originalValueWoPrefix
== Mstring("boolean")) {
185 fprintf(file
, ";\n//with {\n");
186 for (List
<Mstring
>::iterator var
= hidden_variant
.end(); var
; var
= var
->Prev
) {
187 fprintf(file
, "//variant %s;\n", var
->Data
.c_str());
189 fprintf(file
, "//}");
193 void RootType::addComment(const Mstring
& text
) {
194 comment
.push_back(Mstring("/* " + text
+ " */\n"));
197 void RootType::printComment(FILE * file
, int level
) {
198 if (!c_flag_used
&& !comment
.empty()) {
199 for (List
<Mstring
>::iterator c
= comment
.begin(); c
; c
= c
->Next
) {
201 fprintf(file
, "%s", c
->Data
.c_str());
206 void RootType::printMinOccursMaxOccurs(FILE * file
, const bool inside_union
,
207 const bool empty_allowed
/* = true */) const {
209 unsigned long long tmp_minOccurs
= minOccurs
;
210 if (minOccurs
== 0 && !empty_allowed
) tmp_minOccurs
= 1ULL;
212 if (maxOccurs
== 1) {
213 if (minOccurs
== 0) {
214 if (inside_union
|| name
.list_extension
) {
215 fputs("record length(", file
);
216 if (empty_allowed
) fputs("0 .. ", file
);
217 // else: length(1..1) is shortened to length(1)
218 fputs("1) of ", file
);
220 // else it's optional which is not printed from here
221 } else if (minOccurs
== 1) {
222 // min==max==1; do nothing unless...
223 if (name
.convertedValue
== "embed_values") {
224 fputs("record length(1) of ", file
);
227 } else if (maxOccurs
== ULLONG_MAX
) {
228 if (minOccurs
== 0) {
229 fputs("record ", file
);
230 if (!empty_allowed
) fputs("length(1 .. infinity) ", file
);
232 } else fprintf(file
, "record length(%llu .. infinity) of ", tmp_minOccurs
);
234 if (tmp_minOccurs
== maxOccurs
) {
235 fprintf(file
, "record length(%llu) of ", tmp_minOccurs
);
237 fprintf(file
, "record length(%llu .. %llu) of ", tmp_minOccurs
, maxOccurs
);
242 bool RootType::hasVariant(const Mstring
& var
) const{
243 for(List
<Mstring
>::iterator vars
= variant
.begin(); vars
; vars
= vars
->Next
){
244 if(vars
->Data
.isFound(var
)){
248 for(List
<Mstring
>::iterator vars
= hidden_variant
.begin(); vars
; vars
= vars
->Next
){
249 if(vars
->Data
.isFound(var
)){