change code

Fork of MbedJSONValue_copy by Lawrence Lee

Committer:
joon874
Date:
Tue May 03 02:31:26 2016 +0000
Revision:
7:62ce68f5a38c
Parent:
6:f8bec9cada34
Child:
8:fb820325a830
DDDD

Who changed what in which revision?

UserRevisionLine numberNew contents of line
samux 0:0cf0e27feaad 1 #include "MbedJSONValue.h"
samux 0:0cf0e27feaad 2
samux 0:0cf0e27feaad 3 # include <stdlib.h>
samux 0:0cf0e27feaad 4 # include <stdio.h>
samux 0:0cf0e27feaad 5
MidnightCow 6:f8bec9cada34 6 bool default_json_cb(void* param)
MidnightCow 6:f8bec9cada34 7 {
MidnightCow 6:f8bec9cada34 8 printf("No callback function\n");
MidnightCow 6:f8bec9cada34 9 return false;
MidnightCow 6:f8bec9cada34 10 }
MidnightCow 6:f8bec9cada34 11
MidnightCow 6:f8bec9cada34 12
samux 0:0cf0e27feaad 13 // Clean up
samux 0:0cf0e27feaad 14 void MbedJSONValue::clean() {
samux 0:0cf0e27feaad 15 switch (_type) {
samux 0:0cf0e27feaad 16 case TypeString:
samux 0:0cf0e27feaad 17 delete _value.asString;
samux 0:0cf0e27feaad 18 break;
samux 0:0cf0e27feaad 19 case TypeArray:
MidnightCow 6:f8bec9cada34 20 //for (int i = 0; i < index_array; i++)
MidnightCow 6:f8bec9cada34 21 //delete array[i];
samux 0:0cf0e27feaad 22 index_array = 0;
samux 0:0cf0e27feaad 23 break;
samux 0:0cf0e27feaad 24 case TypeObject:
samux 0:0cf0e27feaad 25 for (int i = 0; i < index_token; i++) {
samux 0:0cf0e27feaad 26 delete token[i];
samux 0:0cf0e27feaad 27 delete token_name[i];
samux 0:0cf0e27feaad 28 }
samux 0:0cf0e27feaad 29 index_token = 0;
samux 0:0cf0e27feaad 30 break;
samux 0:0cf0e27feaad 31 default:
samux 0:0cf0e27feaad 32 break;
samux 0:0cf0e27feaad 33 }
samux 0:0cf0e27feaad 34 _type = TypeNull;
samux 0:0cf0e27feaad 35 _type = TypeNull;
samux 0:0cf0e27feaad 36 }
samux 0:0cf0e27feaad 37
samux 0:0cf0e27feaad 38 bool MbedJSONValue::hasMember(char * name)
samux 0:0cf0e27feaad 39 {
samux 0:0cf0e27feaad 40 for(int i = 0; i < index_token; i++)
samux 0:0cf0e27feaad 41 if( !strcmp(name, (*(token_name[i])).c_str() ))
samux 0:0cf0e27feaad 42 return true;
samux 0:0cf0e27feaad 43 return false;
samux 0:0cf0e27feaad 44 }
samux 0:0cf0e27feaad 45
samux 0:0cf0e27feaad 46
samux 0:0cf0e27feaad 47 void copy(const std::string& s, std::back_insert_iterator<std::string> oi) {
samux 0:0cf0e27feaad 48 std::copy(s.begin(), s.end(), oi);
samux 0:0cf0e27feaad 49 }
samux 0:0cf0e27feaad 50
samux 0:0cf0e27feaad 51 void serialize_str(const std::string& s, std::back_insert_iterator<std::string> oi) {
samux 0:0cf0e27feaad 52 *oi++ = '"';
samux 0:0cf0e27feaad 53 for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) {
samux 0:0cf0e27feaad 54 switch (*i) {
samux 0:0cf0e27feaad 55 #define MAP(val, sym) case val: copy(sym, oi); break
samux 0:0cf0e27feaad 56 MAP('"', "\\\"");
samux 0:0cf0e27feaad 57 MAP('\\', "\\\\");
samux 0:0cf0e27feaad 58 MAP('/', "\\/");
samux 0:0cf0e27feaad 59 MAP('\b', "\\b");
samux 0:0cf0e27feaad 60 MAP('\f', "\\f");
samux 0:0cf0e27feaad 61 MAP('\n', "\\n");
samux 0:0cf0e27feaad 62 MAP('\r', "\\r");
samux 0:0cf0e27feaad 63 MAP('\t', "\\t");
samux 0:0cf0e27feaad 64 #undef MAP
samux 0:0cf0e27feaad 65 default:
samux 0:0cf0e27feaad 66 if ((unsigned char)*i < 0x20 || *i == 0x7f) {
samux 0:0cf0e27feaad 67 char buf[7];
samux 0:0cf0e27feaad 68 sprintf(buf, "\\u%04x", *i & 0xff);
samux 0:0cf0e27feaad 69 copy(buf, buf + 6, oi);
samux 0:0cf0e27feaad 70 } else {
samux 0:0cf0e27feaad 71 *oi++ = *i;
samux 0:0cf0e27feaad 72 }
samux 0:0cf0e27feaad 73 break;
samux 0:0cf0e27feaad 74 }
samux 0:0cf0e27feaad 75 }
samux 0:0cf0e27feaad 76 *oi++ = '"';
samux 0:0cf0e27feaad 77 }
samux 0:0cf0e27feaad 78
samux 0:0cf0e27feaad 79 std::string MbedJSONValue::serialize(){
samux 0:0cf0e27feaad 80 std::string s;
samux 0:0cf0e27feaad 81 serialize(std::back_inserter(s));
samux 0:0cf0e27feaad 82 return s;
samux 0:0cf0e27feaad 83 }
samux 0:0cf0e27feaad 84
samux 0:0cf0e27feaad 85 std::string MbedJSONValue::to_str(){
samux 0:0cf0e27feaad 86 switch (_type) {
samux 0:0cf0e27feaad 87 case TypeNull:
samux 0:0cf0e27feaad 88 return "null";
samux 0:0cf0e27feaad 89 case TypeBoolean:
samux 0:0cf0e27feaad 90 return _value.asBool ? "true" : "false";
samux 0:0cf0e27feaad 91 case TypeInt: {
samux 0:0cf0e27feaad 92 char buf[10];
samux 0:0cf0e27feaad 93 sprintf(buf, "%d", _value.asInt);
samux 0:0cf0e27feaad 94 return buf;
samux 0:0cf0e27feaad 95 }
samux 0:0cf0e27feaad 96 case TypeDouble: {
samux 0:0cf0e27feaad 97 char buf[10];
samux 0:0cf0e27feaad 98 sprintf(buf, "%f", _value.asDouble);
samux 0:0cf0e27feaad 99 return buf;
samux 0:0cf0e27feaad 100 }
samux 0:0cf0e27feaad 101 default:
samux 0:0cf0e27feaad 102 break;
samux 0:0cf0e27feaad 103 }
samux 0:0cf0e27feaad 104 return NULL;
samux 0:0cf0e27feaad 105 }
samux 0:0cf0e27feaad 106
samux 0:0cf0e27feaad 107
samux 0:0cf0e27feaad 108
samux 0:0cf0e27feaad 109 void MbedJSONValue::serialize(std::back_insert_iterator<std::string> oi) {
joon874 7:62ce68f5a38c 110 #ifdef DEBUG_MJSON
MidnightCow 6:f8bec9cada34 111 printf("SP:%X _type=%d, index=%d\r\n",__current_sp(),_type, index_token);
joon874 7:62ce68f5a38c 112 #endif
MidnightCow 6:f8bec9cada34 113
samux 0:0cf0e27feaad 114 switch (_type) {
samux 0:0cf0e27feaad 115 case TypeString:
joon874 7:62ce68f5a38c 116 #ifdef DEBUG_MJSON
MidnightCow 6:f8bec9cada34 117 printf("typestring\r\n");
joon874 7:62ce68f5a38c 118 #endif
samux 0:0cf0e27feaad 119 serialize_str(*_value.asString, oi);
samux 0:0cf0e27feaad 120 break;
samux 0:0cf0e27feaad 121 case TypeArray: {
joon874 7:62ce68f5a38c 122 #ifdef DEBUG_MJSON
MidnightCow 6:f8bec9cada34 123 printf("typearray\r\n");
joon874 7:62ce68f5a38c 124 #endif
samux 0:0cf0e27feaad 125 *oi++ = '[';
samux 0:0cf0e27feaad 126 for (int i = 0; i < index_array; i++) {
samux 0:0cf0e27feaad 127 if (i)
samux 0:0cf0e27feaad 128 *oi++ = ',';
samux 0:0cf0e27feaad 129 (*this)[i].serialize(oi);
samux 0:0cf0e27feaad 130 }
samux 0:0cf0e27feaad 131 *oi++ = ']';
samux 0:0cf0e27feaad 132 break;
samux 0:0cf0e27feaad 133 }
samux 0:0cf0e27feaad 134 case TypeObject: {
joon874 7:62ce68f5a38c 135 #ifdef DEBUG_MJSON
MidnightCow 6:f8bec9cada34 136 printf("typeObject\r\n");
joon874 7:62ce68f5a38c 137 #endif
samux 0:0cf0e27feaad 138 *oi++ = '{';
samux 0:0cf0e27feaad 139 for (int i = 0; i < index_token; i++) {
joon874 7:62ce68f5a38c 140 #ifdef DEBUG_MJSON
MidnightCow 6:f8bec9cada34 141 printf("i=%d ",i);
joon874 7:62ce68f5a38c 142 #endif
samux 0:0cf0e27feaad 143 if (i)
samux 0:0cf0e27feaad 144 *oi++ = ',';
joon874 7:62ce68f5a38c 145 #ifdef DEBUG_MJSON
MidnightCow 6:f8bec9cada34 146 printf("token_name[%d]=%s\r\n",i,token_name[i]->c_str());
joon874 7:62ce68f5a38c 147 #endif
samux 0:0cf0e27feaad 148 serialize_str(*(token_name[i]), oi);
samux 0:0cf0e27feaad 149 *oi++ = ':';
samux 0:0cf0e27feaad 150 (*(token[i])).serialize(oi);
samux 0:0cf0e27feaad 151 }
samux 0:0cf0e27feaad 152 *oi++ = '}';
samux 0:0cf0e27feaad 153 break;
samux 0:0cf0e27feaad 154 }
samux 0:0cf0e27feaad 155 default:
joon874 7:62ce68f5a38c 156 #ifdef DEBUG_MJSON
MidnightCow 6:f8bec9cada34 157 printf("default\r\n");
joon874 7:62ce68f5a38c 158 #endif
samux 0:0cf0e27feaad 159 copy(to_str(), oi);
samux 0:0cf0e27feaad 160 break;
samux 0:0cf0e27feaad 161 }
samux 0:0cf0e27feaad 162 }
samux 0:0cf0e27feaad 163
samux 0:0cf0e27feaad 164
samux 0:0cf0e27feaad 165
samux 0:0cf0e27feaad 166 MbedJSONValue& MbedJSONValue::operator[](int i) {
samux 0:0cf0e27feaad 167 _type = TypeArray;
MidnightCow 6:f8bec9cada34 168 //if (i < NB_TOKEN && index_array == i ) {
MidnightCow 6:f8bec9cada34 169 if( index_array == i){
samux 0:0cf0e27feaad 170 #ifdef DEBUG
samux 0:0cf0e27feaad 171 printf("will add an element to the array\r\n");
samux 0:0cf0e27feaad 172 #endif
MidnightCow 6:f8bec9cada34 173 //array[i] = new MbedJSONValue();
MidnightCow 6:f8bec9cada34 174 //array.push_back(new MbedJSONValue());
MidnightCow 6:f8bec9cada34 175 token.push_back(new MbedJSONValue());
samux 0:0cf0e27feaad 176 index_array++;
MidnightCow 6:f8bec9cada34 177 //return *(array[i]);
MidnightCow 6:f8bec9cada34 178 return *(token[i]);
samux 0:0cf0e27feaad 179 }
MidnightCow 6:f8bec9cada34 180 //if (i < NB_TOKEN && index_array > i)
MidnightCow 6:f8bec9cada34 181 if(index_array > i)
MidnightCow 6:f8bec9cada34 182 // return *(array[i]);
MidnightCow 6:f8bec9cada34 183 return *(token[i]);
samux 0:0cf0e27feaad 184
samux 0:0cf0e27feaad 185 //if the user is not doing something wrong, this code is never executed!!
samux 0:0cf0e27feaad 186 return *(new MbedJSONValue());
MidnightCow 6:f8bec9cada34 187 //return 0;
samux 0:0cf0e27feaad 188 }
samux 0:0cf0e27feaad 189
samux 0:0cf0e27feaad 190 MbedJSONValue& MbedJSONValue::operator[](std::string k) {
samux 0:0cf0e27feaad 191 _type = TypeObject;
samux 0:0cf0e27feaad 192 for (int i = 0; i < index_token; i++) {
samux 0:0cf0e27feaad 193 #ifdef DEBUG
joon874 7:62ce68f5a38c 194 #ifdef DEBUG_MJSON
samux 0:0cf0e27feaad 195 printf("k: %s\r\n", k.c_str());
samux 0:0cf0e27feaad 196 printf("str: %s\r\n", token_name[i]->c_str());
samux 0:0cf0e27feaad 197 #endif
samux 0:0cf0e27feaad 198 //existing token
MidnightCow 6:f8bec9cada34 199
samux 0:0cf0e27feaad 200 if (!strcmp(k.c_str(), token_name[i]->c_str())) {
samux 0:0cf0e27feaad 201 #ifdef DEBUG
joon874 7:62ce68f5a38c 202 #ifdef DEBUG_MJSON
samux 0:0cf0e27feaad 203 printf("token found: %d\r\n", i);
samux 0:0cf0e27feaad 204 #endif
samux 0:0cf0e27feaad 205 return *(token[i]);
samux 0:0cf0e27feaad 206 }
samux 0:0cf0e27feaad 207 }
samux 0:0cf0e27feaad 208
MidnightCow 6:f8bec9cada34 209 //if(index_token >= NB_TOKEN)
MidnightCow 6:f8bec9cada34 210 // index_token = NB_TOKEN - 1;
samux 0:0cf0e27feaad 211 //non existing token
MidnightCow 6:f8bec9cada34 212 //token_name[index_token] = new std::string(k);
MidnightCow 6:f8bec9cada34 213 token_name.push_back(new std::string(k));
joon874 7:62ce68f5a38c 214 #ifdef DEBUG_MJSON
MidnightCow 6:f8bec9cada34 215 printf("New token_name[%d]=%X, %s\r\n", index_token, token_name[index_token], token_name[index_token]->c_str());
joon874 7:62ce68f5a38c 216 #endif
MidnightCow 6:f8bec9cada34 217 //token[index_token] = new MbedJSONValue();
MidnightCow 6:f8bec9cada34 218 token.push_back(new MbedJSONValue());
joon874 7:62ce68f5a38c 219 #ifdef DEBUG_MJSON
MidnightCow 6:f8bec9cada34 220 printf("New token[%d]=%X, %d\r\n", index_token, token[index_token], token[index_token]->getType());
joon874 7:62ce68f5a38c 221 #endif
samux 0:0cf0e27feaad 222 index_token++;
samux 0:0cf0e27feaad 223 return *(token[index_token - 1]);
samux 0:0cf0e27feaad 224 }
samux 0:0cf0e27feaad 225
samux 0:0cf0e27feaad 226 MbedJSONValue& MbedJSONValue::operator[](std::string k) const
samux 0:0cf0e27feaad 227 {
samux 0:0cf0e27feaad 228 for (int i = 0; i < index_token; i++) {
samux 0:0cf0e27feaad 229 #ifdef DEBUG
joon874 7:62ce68f5a38c 230 #ifdef DEBUG_MJSON
samux 0:0cf0e27feaad 231 printf("k: %s\r\n", k.c_str());
MidnightCow 6:f8bec9cada34 232 //printf("str: %s\r\n", token_name[i]->c_str());
samux 0:0cf0e27feaad 233 #endif
MidnightCow 6:f8bec9cada34 234 printf("[%s]", k.c_str());
MidnightCow 6:f8bec9cada34 235 printf(" comp ");
MidnightCow 6:f8bec9cada34 236 printf("[%s]\r\n", token_name[i]->c_str());
samux 0:0cf0e27feaad 237 if (!strcmp(k.c_str(), token_name[i]->c_str())) {
samux 0:0cf0e27feaad 238 #ifdef DEBUG
joon874 7:62ce68f5a38c 239 #ifdef DEBUG_MJSON
samux 0:0cf0e27feaad 240 printf("token found: %d\r\n", i);
samux 0:0cf0e27feaad 241 #endif
samux 0:0cf0e27feaad 242 return *(token[i]);
samux 0:0cf0e27feaad 243 }
samux 0:0cf0e27feaad 244 }
samux 0:0cf0e27feaad 245
samux 0:0cf0e27feaad 246 //if the user is not doing something wrong, this code is never executed!!
samux 0:0cf0e27feaad 247 return *(new MbedJSONValue());
MidnightCow 6:f8bec9cada34 248 //return 0;
samux 0:0cf0e27feaad 249 }
samux 0:0cf0e27feaad 250
samux 0:0cf0e27feaad 251
samux 0:0cf0e27feaad 252 // Operators
samux 0:0cf0e27feaad 253 MbedJSONValue& MbedJSONValue::operator=(MbedJSONValue const& rhs) {
MidnightCow 6:f8bec9cada34 254 //printf("=json\r\n");
samux 0:0cf0e27feaad 255 if (this != &rhs) {
samux 0:0cf0e27feaad 256 clean();
samux 0:0cf0e27feaad 257 _type = rhs._type;
samux 0:0cf0e27feaad 258 switch (_type) {
samux 0:0cf0e27feaad 259 case TypeBoolean:
samux 0:0cf0e27feaad 260 _value.asBool = rhs._value.asBool;
samux 0:0cf0e27feaad 261 break;
samux 0:0cf0e27feaad 262 case TypeInt:
samux 0:0cf0e27feaad 263 _value.asInt = rhs._value.asInt;
samux 0:0cf0e27feaad 264 break;
samux 0:0cf0e27feaad 265 case TypeDouble:
samux 0:0cf0e27feaad 266 _value.asDouble = rhs._value.asDouble;
samux 0:0cf0e27feaad 267 break;
samux 0:0cf0e27feaad 268 case TypeString:
MidnightCow 6:f8bec9cada34 269 //printf("=json=%s\r\n",rhs._value.asString->c_str());
samux 0:0cf0e27feaad 270 _value.asString = new std::string(*rhs._value.asString);
samux 0:0cf0e27feaad 271 break;
samux 0:0cf0e27feaad 272 case TypeArray:
samux 0:0cf0e27feaad 273 for (int i = 0; i < rhs.index_array; i++)
samux 0:0cf0e27feaad 274 (*this)[i] = rhs[i];
samux 0:0cf0e27feaad 275 case TypeObject:
samux 0:0cf0e27feaad 276 for (int i = 0; i < rhs.index_token; i++)
samux 0:0cf0e27feaad 277 (*this)[*(rhs.token_name[i])] = rhs[*(rhs.token_name[i])];
samux 0:0cf0e27feaad 278 default:
samux 0:0cf0e27feaad 279 break;
samux 0:0cf0e27feaad 280 }
samux 0:0cf0e27feaad 281 }
samux 0:0cf0e27feaad 282 return *this;
samux 0:0cf0e27feaad 283 }
samux 0:0cf0e27feaad 284
samux 0:0cf0e27feaad 285
samux 0:0cf0e27feaad 286 // Works for strings, arrays, and structs.
samux 0:0cf0e27feaad 287 int MbedJSONValue::size() const {
samux 0:0cf0e27feaad 288 switch (_type) {
samux 0:0cf0e27feaad 289 case TypeString:
samux 0:0cf0e27feaad 290 return int(_value.asString->size());
samux 0:0cf0e27feaad 291 case TypeArray:
samux 0:0cf0e27feaad 292 return index_array;
samux 0:0cf0e27feaad 293 case TypeObject:
samux 0:0cf0e27feaad 294 return index_token;
samux 0:0cf0e27feaad 295 default:
samux 0:0cf0e27feaad 296 break;
samux 0:0cf0e27feaad 297 }
samux 0:0cf0e27feaad 298 return -1;
samux 0:0cf0e27feaad 299 }
samux 0:0cf0e27feaad 300
MidnightCow 6:f8bec9cada34 301