diff options
author | Mike Buland <eichlan@xagasoft.com> | 2012-03-31 17:34:11 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2012-03-31 17:34:11 +0000 |
commit | 82da0238a8171cf8bba6bb1c82d5abba207a10aa (patch) | |
tree | 83ff9b022b658e7a056fc85f132937b8bda4c1c3 /c++-qt/src/object.cpp | |
parent | 7dd5c386611e31930e7ccfb83cb585df27696881 (diff) | |
download | libgats-82da0238a8171cf8bba6bb1c82d5abba207a10aa.tar.gz libgats-82da0238a8171cf8bba6bb1c82d5abba207a10aa.tar.bz2 libgats-82da0238a8171cf8bba6bb1c82d5abba207a10aa.tar.xz libgats-82da0238a8171cf8bba6bb1c82d5abba207a10aa.zip |
Gats for QT is here. It's a pretty basic conversion right now, it doesn't
support debugging formatting (Bu::sio), it doesn't support gats-text string
parsing, and the exceptions need to be fixed to be real exceptions.
The basic functions have been renamed to match the Qt API and we use QT types
for everything (QHash, QList, QByteArray). It needs more testing, but it's a
great start.
Diffstat (limited to '')
-rw-r--r-- | c++-qt/src/object.cpp | 310 |
1 files changed, 310 insertions, 0 deletions
diff --git a/c++-qt/src/object.cpp b/c++-qt/src/object.cpp new file mode 100644 index 0000000..3955ced --- /dev/null +++ b/c++-qt/src/object.cpp | |||
@@ -0,0 +1,310 @@ | |||
1 | #include "gats-qt/object.h" | ||
2 | |||
3 | #include "gats-qt/integer.h" | ||
4 | #include "gats-qt/float.h" | ||
5 | #include "gats-qt/boolean.h" | ||
6 | #include "gats-qt/string.h" | ||
7 | #include "gats-qt/list.h" | ||
8 | #include "gats-qt/dictionary.h" | ||
9 | |||
10 | #include <stdlib.h> | ||
11 | |||
12 | #include <QIODevice> | ||
13 | |||
14 | Gats::Object::Object() | ||
15 | { | ||
16 | } | ||
17 | |||
18 | Gats::Object::~Object() | ||
19 | { | ||
20 | } | ||
21 | |||
22 | Gats::Object *Gats::Object::read( QIODevice &rIn ) | ||
23 | { | ||
24 | char buf; | ||
25 | rIn.read( &buf, 1 ); | ||
26 | Object *pObj = NULL; | ||
27 | switch( buf ) | ||
28 | { | ||
29 | case 'i': | ||
30 | pObj = new Gats::Integer(); | ||
31 | break; | ||
32 | |||
33 | case 's': | ||
34 | pObj = new Gats::String(); | ||
35 | break; | ||
36 | |||
37 | case '0': | ||
38 | case '1': | ||
39 | pObj = new Gats::Boolean(); | ||
40 | break; | ||
41 | |||
42 | case 'l': | ||
43 | pObj = new Gats::List(); | ||
44 | break; | ||
45 | |||
46 | case 'd': | ||
47 | pObj = new Gats::Dictionary(); | ||
48 | break; | ||
49 | |||
50 | case 'f': // Normal floats | ||
51 | case 'F': // Special float values | ||
52 | pObj = new Gats::Float(); | ||
53 | break; | ||
54 | |||
55 | case 'e': | ||
56 | return NULL; | ||
57 | |||
58 | default: | ||
59 | throw "Invalid Gats type discovered: "; | ||
60 | } | ||
61 | |||
62 | pObj->read( rIn, buf ); | ||
63 | |||
64 | return pObj; | ||
65 | } | ||
66 | /* | ||
67 | void Gats::Object::skipWs( QByteArray::const_iterator &i ) | ||
68 | { | ||
69 | for(; *i == ' ' || *i == '\t' || *i == '\r' || *i == '\n'; i++ ) { } | ||
70 | } | ||
71 | |||
72 | QByteArray Gats::Object::token( QByteArray::const_iterator &i ) | ||
73 | { | ||
74 | QByteArray sRet; | ||
75 | if( *i == '\"' ) | ||
76 | { | ||
77 | for( i++; i && *i != '\"' ; i++ ) | ||
78 | { | ||
79 | if( *i == '\\' ) | ||
80 | i++; | ||
81 | sRet += i; | ||
82 | } | ||
83 | i++; | ||
84 | } | ||
85 | else | ||
86 | { | ||
87 | for(; i && *i != ' ' && *i != '\t' && *i != '\r' && *i != '\n' && | ||
88 | *i != ',' && *i != ']' && *i != '}' && *i != '[' && | ||
89 | *i != '{'; i++ ) | ||
90 | { | ||
91 | sRet += i; | ||
92 | } | ||
93 | } | ||
94 | |||
95 | return sRet; | ||
96 | } | ||
97 | |||
98 | Gats::Object *Gats::Object::strToGats( QByteArray::const_iterator &i ) | ||
99 | { | ||
100 | skipWs( i ); | ||
101 | |||
102 | switch( *i ) | ||
103 | { | ||
104 | case '[': | ||
105 | { | ||
106 | Gats::List *pLst = new Gats::List(); | ||
107 | i++; | ||
108 | for(;;) | ||
109 | { | ||
110 | Gats::Object *pObj = strToGats( i ); | ||
111 | if( !pObj ) | ||
112 | break; | ||
113 | pLst->append( pObj ); | ||
114 | skipWs( i ); | ||
115 | switch( *i ) | ||
116 | { | ||
117 | case ',': | ||
118 | i++; | ||
119 | break; | ||
120 | |||
121 | case ']': | ||
122 | i++; | ||
123 | return pLst; | ||
124 | |||
125 | default: | ||
126 | throw "PUT GOOD EXCEPTION HERE"; | ||
127 | } | ||
128 | } | ||
129 | } | ||
130 | break; | ||
131 | |||
132 | case '{': | ||
133 | { | ||
134 | Gats::Dictionary *pDict = new Gats::Dictionary(); | ||
135 | i++; | ||
136 | for(;;) | ||
137 | { | ||
138 | skipWs( i ); | ||
139 | if( *i != '\"' ) | ||
140 | throw "PUT GOOD EXCEPTION HERE"; | ||
141 | QByteArray sKey = token( i ); | ||
142 | skipWs( i ); | ||
143 | if( *i != ':' ) | ||
144 | throw "PUT GOOD EXCEPTION HERE"; | ||
145 | "seperated with colons."); | ||
146 | i++; | ||
147 | Gats::Object *pObj = strToGats( i ); | ||
148 | if( !pObj ) | ||
149 | throw "PUT GOOD EXCEPTION HERE"; | ||
150 | pDict->insert( sKey, pObj ); | ||
151 | skipWs( i ); | ||
152 | switch( *i ) | ||
153 | { | ||
154 | case ',': | ||
155 | i++; | ||
156 | break; | ||
157 | |||
158 | case '}': | ||
159 | i++; | ||
160 | return pDict; | ||
161 | |||
162 | default: | ||
163 | throw "PUT GOOD EXCEPTION HERE"; | ||
164 | } | ||
165 | } | ||
166 | } | ||
167 | break; | ||
168 | |||
169 | case '\"': | ||
170 | return new Gats::String( token( i ) ); | ||
171 | break; | ||
172 | |||
173 | case '0': | ||
174 | case '1': | ||
175 | case '2': | ||
176 | case '3': | ||
177 | case '4': | ||
178 | case '5': | ||
179 | case '6': | ||
180 | case '7': | ||
181 | case '8': | ||
182 | case '9': | ||
183 | case '.': | ||
184 | case '+': | ||
185 | case '-': | ||
186 | { | ||
187 | QByteArray s = token( i ); | ||
188 | int iSize = s.getSize(); | ||
189 | if( s[iSize-1] == 'i' ) | ||
190 | { | ||
191 | return new Gats::Integer( | ||
192 | strtoll( s.getStr(), NULL, 10 ) | ||
193 | ); | ||
194 | } | ||
195 | else if( s[iSize-1] == 'f' ) | ||
196 | { | ||
197 | return new Gats::Float( | ||
198 | strtod( s.getStr(), NULL ) | ||
199 | ); | ||
200 | } | ||
201 | else | ||
202 | { | ||
203 | for( QByteArray::iterator i = s.begin(); i; i++ ) | ||
204 | { | ||
205 | if( *i == '.' ) | ||
206 | return new Gats::Float( | ||
207 | strtod( s.getStr(), NULL ) | ||
208 | ); | ||
209 | } | ||
210 | return new Gats::Integer( | ||
211 | strtoll( s.getStr(), NULL, 10 ) | ||
212 | ); | ||
213 | } | ||
214 | } | ||
215 | break; | ||
216 | |||
217 | default: | ||
218 | { | ||
219 | QByteArray s = token( i ); | ||
220 | int iSize = s.getSize(); | ||
221 | // Test for explicit types first | ||
222 | if( iSize > 2 ) | ||
223 | { | ||
224 | if( (s[0] >= '0' && s[0] <= '9') || s[0] == '+' || s[0] == '-' ) | ||
225 | { | ||
226 | } | ||
227 | else | ||
228 | { | ||
229 | QByteArray st = s.toLower(); | ||
230 | if( st == "true" ) | ||
231 | { | ||
232 | return new Gats::Boolean( true ); | ||
233 | } | ||
234 | else if( st == "false" ) | ||
235 | { | ||
236 | return new Gats::Boolean( false ); | ||
237 | } | ||
238 | } | ||
239 | } | ||
240 | } | ||
241 | break; | ||
242 | } | ||
243 | |||
244 | return NULL; | ||
245 | } | ||
246 | |||
247 | Gats::Object *Gats::Object::strToGats( const QByteArray &sStr ) | ||
248 | { | ||
249 | QByteArray::const_iterator i = sStr.begin(); | ||
250 | |||
251 | return strToGats( i ); | ||
252 | } | ||
253 | |||
254 | Bu::Formatter &operator<<( Bu::Formatter &f, const Gats::Object &obj ) | ||
255 | { | ||
256 | switch( obj.getType() ) | ||
257 | { | ||
258 | case Gats::typeDictionary: | ||
259 | return f << dynamic_cast<const Gats::Dictionary &>(obj); | ||
260 | |||
261 | case Gats::typeList: | ||
262 | return f << dynamic_cast<const Gats::List &>(obj); | ||
263 | |||
264 | case Gats::typeString: | ||
265 | return f << dynamic_cast<const Gats::String &>(obj); | ||
266 | |||
267 | case Gats::typeInteger: | ||
268 | return f << dynamic_cast<const Gats::Integer &>(obj); | ||
269 | |||
270 | case Gats::typeFloat: | ||
271 | return f << dynamic_cast<const Gats::Float &>(obj); | ||
272 | |||
273 | case Gats::typeBoolean: | ||
274 | return f << dynamic_cast<const Gats::Boolean &>(obj); | ||
275 | |||
276 | default: | ||
277 | return f << "***ERROR: Bad Gats type***"; | ||
278 | } | ||
279 | } | ||
280 | |||
281 | Bu::Formatter &operator<<( Bu::Formatter &f, const Gats::Type &t ) | ||
282 | { | ||
283 | switch( t ) | ||
284 | { | ||
285 | case Gats::typeDictionary: return f << "dictionary"; | ||
286 | case Gats::typeList: return f << "list"; | ||
287 | case Gats::typeString: return f << "string"; | ||
288 | case Gats::typeInteger: return f << "integer"; | ||
289 | case Gats::typeFloat: return f << "float"; | ||
290 | case Gats::typeBoolean: return f << "boolean"; | ||
291 | } | ||
292 | |||
293 | return f << "***unknown***"; | ||
294 | } | ||
295 | */ | ||
296 | const char *Gats::typeToStr( Gats::Type t ) | ||
297 | { | ||
298 | switch( t ) | ||
299 | { | ||
300 | case Gats::typeDictionary: return "dictionary"; | ||
301 | case Gats::typeList: return "list"; | ||
302 | case Gats::typeString: return "string"; | ||
303 | case Gats::typeInteger: return "integer"; | ||
304 | case Gats::typeFloat: return "float"; | ||
305 | case Gats::typeBoolean: return "boolean"; | ||
306 | } | ||
307 | |||
308 | return "***unknown***"; | ||
309 | } | ||
310 | |||