Merge pull request #81 from gpilisi/master
[deliverable/titan.core.git] / compiler2 / XerAttributes.hh
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
7 *
8 * Contributors:
9 * Balasko, Jeno
10 * Baranyi, Botond
11 * Raduly, Csaba
12 *
13 ******************************************************************************/
14 /*
15 * XerAttributes.h
16 *
17 * Created on: Oct 17, 2008
18 * Author: ecsardu
19 */
20
21 #ifndef XERATTRIBUTES_H_
22 #define XERATTRIBUTES_H_
23
24 #include <stddef.h>
25 #include <limits.h>
26 #include "../common/memory.h"
27
28 namespace Common {
29 class Value;
30 }
31
32 struct NamespaceRestriction // union member, no constructor allowed
33 {
34 size_t nElements_;
35 /** URIs for ANY-ATTRIBUTES and ANY-ELEMENT. NULL is used to represent
36 * ABSENT */
37 char ** uris_;
38 enum {
39 UNUSED,
40 NOTHING, ///< anyElement
41 FROM, ///< anyElement from ...
42 EXCEPT ///< anyElement except ...
43 } type_;
44 };
45 // #define ABSENT ((char*)5) just use NULL
46
47 void FreeNamespaceRestriction(NamespaceRestriction& nsr);
48
49
50 struct NamespaceSpecification
51 {
52 /** How to transform the ASN/TTCN name to XML name */
53 enum NameMangling {
54 NO_MANGLING, ///< no change
55 CAPITALIZED, ///< change the first letter to uppercase
56 UNCAPITALIZED,///< change the first letter to lowercase
57 UPPERCASED, ///< change all letters to uppercase
58 LOWERCASED, ///< change all letters to lowercase
59 // The underlying type of the enum is an integral type that can cover
60 // all the enum values. Using a value which doesn't fit into signed int,
61 // we try to force the underlying type to be _unsigned_ int.
62 FORCE_UNSIGNED = UINT_MAX
63 };
64 enum { ALL = LOWERCASED+1 }; // should be one bigger than the last of NameMangling
65
66 /** The URI for the NAMESPACE encoding instruction, or TextToBeUsed for TEXT.
67 * May be a valid pointer or any of the NameMangling enum values,
68 * or NULL for "text".
69 * For NAMESPACE, NULL (NO_MANGLING) means that no NAMESPACE instruction
70 * is assigned directly; UNCAPITALIZED means that an explicit "cancel
71 * all namespaces" instruction was applied: "namespace '' prefix ''" */
72 union {
73 char * uri; // for NAMESPACE
74 char * new_text; // for TEXT
75 NameMangling keyword; // for TEXT
76 };
77 /** The prefix for the NAME encoding instruction or the Target for TEXT.
78 * May be XerAttributes::ALL for "text all as ...cased", or 0 for "text" */
79 union {
80 char * prefix; // for NAMESPACE
81 char * target; // for TEXT
82 };
83 };
84
85 inline void free_name_or_kw(char *s)
86 {
87 if (s > (char*)NamespaceSpecification::ALL) {
88 Free(s);
89 }
90 }
91
92 /** XER attributes during compilation.
93 *
94 * @todo members are ordered alphabetically, this should be changed to
95 * be more space efficient (pointers, then integers, then booleans)
96 */
97 class XerAttributes {
98 private:
99 // Compiler-generated copy constructor and assignment NOT safe.
100 // Must disable or implement own.
101 XerAttributes(const XerAttributes&);
102 XerAttributes& operator=(const XerAttributes&);
103 public:
104 //enum PI_Location { NOWHERE, BEFORE_TAG, BEFORE_VALUE, AFTER_TAG, AFTER_VALUE };
105 enum WhitespaceAction { PRESERVE, REPLACE, COLLAPSE };
106 enum Form { // a bit mask
107 UNSET = 0,
108 // Global defaults for the module:
109 ELEMENT_DEFAULT_QUALIFIED = 1,
110 ATTRIBUTE_DEFAULT_QUALIFIED = 2,
111 // Locally set values (applied directly to the type or field)
112 UNQUALIFIED = 4, //< "form as unqualified"
113 QUALIFIED = 8, //< "form as qualified"
114 LOCALLY_SET = (QUALIFIED | UNQUALIFIED)
115 };
116
117 /** Name change action.
118 *
119 * When importing XSD into ASN.1 or TTCN-3, some names might need to be
120 * changed to protect the guilty (make them valid ASN.1/TTCN.3).
121 * The NAME encoding instruction describes how to get back to the XML
122 * tag name. The original name may be retrieved with one of the "canned" actions
123 * (change the case of the first or all letters) or by storing the original
124 * name in full (usually if characters were appended to remove name clashes).
125 *
126 * This union and the related code makes the assumption that not only
127 * 0, but 1,2,3,4 will not appear as valid pointers. Switch statements
128 * operating on the kw_ member must have cases for the enumeration values,
129 * the default case means that the nn_ member is in fact active
130 * and contains a pointer to the string. Remember to free/alloc new space
131 * in this situation. */
132 typedef union {
133 NamespaceSpecification::NameMangling kw_;
134 char* nn_;
135 } NameChange;
136
137 XerAttributes();
138 ~XerAttributes();
139
140 /// If the NameChange structure contains a string, free it.
141 static void FreeNameChange(NameChange& n);
142 /// If the NamespaceSpecification contains a string, free it.
143 static void FreeNamespace(NamespaceSpecification& ns);
144 public:
145 bool abstract_;
146 bool attribute_;
147 NamespaceRestriction anyAttributes_;
148 NamespaceRestriction anyElement_;
149 /// Base64 encoding for string-like types (XSD:base64Binary)
150 bool base64_;
151 bool block_;
152 /// No scientific notation for float
153 bool decimal_;
154 /// String parsed out from the encoding attribute
155 char * defaultForEmpty_;
156 /// Value object constructed by Type::chk_xer() from defaultForEmpty_
157 Common::Value *defaultValue_;
158 /// Global element in XSD
159 bool element_;
160 /// Give values to text nodes. Applied to record containing a record of string
161 bool embedValues_;
162 /// Qualified or unqualified form for local elements and attributes
163 unsigned short form_;
164 /// XSD:hexBinary
165 bool hex_;
166 /// space-separated values for record-of/set-of
167 bool list_;
168 /// How to get back the XML name
169 NameChange name_;
170 NamespaceSpecification namespace_;
171 //struct { PI_Location position_; /*const*/ char * value_; } pi_or_comment_;
172 /// Number of TEXT instructions stored.
173 size_t num_text_;
174 /// Pointer to an array for the TEXT encoding instruction
175 NamespaceSpecification *text_; // re-use of struct
176 /// No XML tag, just the value
177 bool untagged_;
178 bool useNil_;
179 bool useNumber_;
180 bool useOrder_;
181 bool useQName_;
182 bool useType_;
183 bool useUnion_;
184 WhitespaceAction whitespace_;
185
186 void print(const char *type_name) const;
187
188 /** Override/merge XER attributes from @p other.
189 *
190 * Boolean attributes (attribute_, base64_, decimal_, embedValues_,
191 * list_, untagged_, useNil_, useNumber_, useOrder_, useQName_, useType_,
192 * useUnion_) are merged.
193 * In case of "Value" attributes (anyAttributes_, anyElement_, name_,
194 * namespace_, text_, whitespace_) the value in @p other overwrites
195 * the value in @p this.
196 *
197 * @param other set of XER attributes
198 * @return the merged object (@p *this)
199 * @pre @a other must not be @t empty() */
200 XerAttributes& operator |= (const XerAttributes& other);
201
202 /** Return true if no attribute is set, false otherwise */
203 bool empty() const;
204 };
205
206 inline bool has_ae(const XerAttributes *xa) {
207 return xa->anyElement_.type_ != NamespaceRestriction::UNUSED;
208 }
209
210 inline bool has_aa(const XerAttributes *xa) {
211 return xa->anyAttributes_.type_ != NamespaceRestriction::UNUSED;
212 }
213
214
215 #endif /* XERATTRIBUTES_H_ */
This page took 0.035435 seconds and 5 git commands to generate.