PageRenderTime 48ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/c++-qt/src/object.cpp

https://github.com/eichlan/libgats
C++ | 322 lines | 67 code | 19 blank | 236 comment | 0 complexity | 1bf84c5981ed2a99636270876d0faf31 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. /*
  2. * Copyright (C) 2007-2013 Xagasoft, All rights reserved.
  3. *
  4. * This file is part of the libgats library and is released under the
  5. * terms of the license contained in the file LICENSE.
  6. */
  7. #include "gats-qt/object.h"
  8. #include "gats-qt/integer.h"
  9. #include "gats-qt/float.h"
  10. #include "gats-qt/boolean.h"
  11. #include "gats-qt/string.h"
  12. #include "gats-qt/list.h"
  13. #include "gats-qt/dictionary.h"
  14. #include "gats-qt/null.h"
  15. #include <stdlib.h>
  16. #include <QIODevice>
  17. Gats::Object::Object()
  18. {
  19. }
  20. Gats::Object::~Object()
  21. {
  22. }
  23. Gats::Object *Gats::Object::read( QIODevice &rIn )
  24. {
  25. char buf;
  26. rIn.read( &buf, 1 );
  27. Object *pObj = NULL;
  28. switch( buf )
  29. {
  30. case 'i':
  31. pObj = new Gats::Integer();
  32. break;
  33. case 's':
  34. pObj = new Gats::String();
  35. break;
  36. case '0':
  37. case '1':
  38. pObj = new Gats::Boolean();
  39. break;
  40. case 'l':
  41. pObj = new Gats::List();
  42. break;
  43. case 'd':
  44. pObj = new Gats::Dictionary();
  45. break;
  46. case 'f': // Normal floats
  47. case 'F': // Special float values
  48. pObj = new Gats::Float();
  49. break;
  50. case 'n':
  51. pObj = new Gats::Null();
  52. break;
  53. case 'e':
  54. return NULL;
  55. default:
  56. throw "Invalid Gats type discovered: ";
  57. }
  58. pObj->read( rIn, buf );
  59. return pObj;
  60. }
  61. /*
  62. void Gats::Object::skipWs( QByteArray::const_iterator &i )
  63. {
  64. for(; *i == ' ' || *i == '\t' || *i == '\r' || *i == '\n'; i++ ) { }
  65. }
  66. QByteArray Gats::Object::token( QByteArray::const_iterator &i )
  67. {
  68. QByteArray sRet;
  69. if( *i == '\"' )
  70. {
  71. for( i++; i && *i != '\"' ; i++ )
  72. {
  73. if( *i == '\\' )
  74. i++;
  75. sRet += i;
  76. }
  77. i++;
  78. }
  79. else
  80. {
  81. for(; i && *i != ' ' && *i != '\t' && *i != '\r' && *i != '\n' &&
  82. *i != ',' && *i != ']' && *i != '}' && *i != '[' &&
  83. *i != '{'; i++ )
  84. {
  85. sRet += i;
  86. }
  87. }
  88. return sRet;
  89. }
  90. Gats::Object *Gats::Object::strToGats( QByteArray::const_iterator &i )
  91. {
  92. skipWs( i );
  93. switch( *i )
  94. {
  95. case '[':
  96. {
  97. Gats::List *pLst = new Gats::List();
  98. i++;
  99. for(;;)
  100. {
  101. Gats::Object *pObj = strToGats( i );
  102. if( !pObj )
  103. break;
  104. pLst->append( pObj );
  105. skipWs( i );
  106. switch( *i )
  107. {
  108. case ',':
  109. i++;
  110. break;
  111. case ']':
  112. i++;
  113. return pLst;
  114. default:
  115. throw "PUT GOOD EXCEPTION HERE";
  116. }
  117. }
  118. }
  119. break;
  120. case '{':
  121. {
  122. Gats::Dictionary *pDict = new Gats::Dictionary();
  123. i++;
  124. for(;;)
  125. {
  126. skipWs( i );
  127. if( *i != '\"' )
  128. throw "PUT GOOD EXCEPTION HERE";
  129. QByteArray sKey = token( i );
  130. skipWs( i );
  131. if( *i != ':' )
  132. throw "PUT GOOD EXCEPTION HERE";
  133. "seperated with colons.");
  134. i++;
  135. Gats::Object *pObj = strToGats( i );
  136. if( !pObj )
  137. throw "PUT GOOD EXCEPTION HERE";
  138. pDict->insert( sKey, pObj );
  139. skipWs( i );
  140. switch( *i )
  141. {
  142. case ',':
  143. i++;
  144. break;
  145. case '}':
  146. i++;
  147. return pDict;
  148. default:
  149. throw "PUT GOOD EXCEPTION HERE";
  150. }
  151. }
  152. }
  153. break;
  154. case '\"':
  155. return new Gats::String( token( i ) );
  156. break;
  157. case '0':
  158. case '1':
  159. case '2':
  160. case '3':
  161. case '4':
  162. case '5':
  163. case '6':
  164. case '7':
  165. case '8':
  166. case '9':
  167. case '.':
  168. case '+':
  169. case '-':
  170. {
  171. QByteArray s = token( i );
  172. int iSize = s.getSize();
  173. if( s[iSize-1] == 'i' )
  174. {
  175. return new Gats::Integer(
  176. strtoll( s.getStr(), NULL, 10 )
  177. );
  178. }
  179. else if( s[iSize-1] == 'f' )
  180. {
  181. return new Gats::Float(
  182. strtod( s.getStr(), NULL )
  183. );
  184. }
  185. else
  186. {
  187. for( QByteArray::iterator i = s.begin(); i; i++ )
  188. {
  189. if( *i == '.' )
  190. return new Gats::Float(
  191. strtod( s.getStr(), NULL )
  192. );
  193. }
  194. return new Gats::Integer(
  195. strtoll( s.getStr(), NULL, 10 )
  196. );
  197. }
  198. }
  199. break;
  200. default:
  201. {
  202. QByteArray s = token( i );
  203. int iSize = s.getSize();
  204. // Test for explicit types first
  205. if( iSize > 2 )
  206. {
  207. if( (s[0] >= '0' && s[0] <= '9') || s[0] == '+' || s[0] == '-' )
  208. {
  209. }
  210. else
  211. {
  212. QByteArray st = s.toLower();
  213. if( st == "true" )
  214. {
  215. return new Gats::Boolean( true );
  216. }
  217. else if( st == "false" )
  218. {
  219. return new Gats::Boolean( false );
  220. }
  221. }
  222. }
  223. }
  224. break;
  225. }
  226. return NULL;
  227. }
  228. Gats::Object *Gats::Object::strToGats( const QByteArray &sStr )
  229. {
  230. QByteArray::const_iterator i = sStr.begin();
  231. return strToGats( i );
  232. }
  233. Bu::Formatter &operator<<( Bu::Formatter &f, const Gats::Object &obj )
  234. {
  235. switch( obj.getType() )
  236. {
  237. case Gats::typeDictionary:
  238. return f << dynamic_cast<const Gats::Dictionary &>(obj);
  239. case Gats::typeList:
  240. return f << dynamic_cast<const Gats::List &>(obj);
  241. case Gats::typeString:
  242. return f << dynamic_cast<const Gats::String &>(obj);
  243. case Gats::typeInteger:
  244. return f << dynamic_cast<const Gats::Integer &>(obj);
  245. case Gats::typeFloat:
  246. return f << dynamic_cast<const Gats::Float &>(obj);
  247. case Gats::typeBoolean:
  248. return f << dynamic_cast<const Gats::Boolean &>(obj);
  249. default:
  250. return f << "***ERROR: Bad Gats type***";
  251. }
  252. }
  253. Bu::Formatter &operator<<( Bu::Formatter &f, const Gats::Type &t )
  254. {
  255. switch( t )
  256. {
  257. case Gats::typeDictionary: return f << "dictionary";
  258. case Gats::typeList: return f << "list";
  259. case Gats::typeString: return f << "string";
  260. case Gats::typeInteger: return f << "integer";
  261. case Gats::typeFloat: return f << "float";
  262. case Gats::typeBoolean: return f << "boolean";
  263. }
  264. return f << "***unknown***";
  265. }
  266. */
  267. const char *Gats::typeToStr( Gats::Type t )
  268. {
  269. switch( t )
  270. {
  271. case Gats::typeDictionary: return "dictionary";
  272. case Gats::typeList: return "list";
  273. case Gats::typeString: return "string";
  274. case Gats::typeInteger: return "integer";
  275. case Gats::typeFloat: return "float";
  276. case Gats::typeBoolean: return "boolean";
  277. }
  278. return "***unknown***";
  279. }