change code
Fork of MbedJSONValue_copy by
MbedJSONValue.cpp@9:c917476c802b, 2016-07-29 (annotated)
- Committer:
- joon874
- Date:
- Fri Jul 29 08:14:15 2016 +0000
- Revision:
- 9:c917476c802b
- Parent:
- 8:fb820325a830
change code
Who changed what in which revision?
User | Revision | Line number | New 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 | { |
joon874 | 8:fb820325a830 | 8 | printf("No callback function\r\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: |
samux | 0:0cf0e27feaad | 20 | case TypeObject: |
samux | 0:0cf0e27feaad | 21 | for (int i = 0; i < index_token; i++) { |
joon874 | 8:fb820325a830 | 22 | #ifdef DEBUG_MJSON |
joon874 | 8:fb820325a830 | 23 | printf("%d : this[%s] = %d\r\n",i, token_name[i]->c_str(), token[i]->_value.asInt); |
joon874 | 8:fb820325a830 | 24 | #endif |
samux | 0:0cf0e27feaad | 25 | delete token[i]; |
samux | 0:0cf0e27feaad | 26 | delete token_name[i]; |
samux | 0:0cf0e27feaad | 27 | } |
samux | 0:0cf0e27feaad | 28 | index_token = 0; |
joon874 | 8:fb820325a830 | 29 | index_array = 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 | } |
samux | 0:0cf0e27feaad | 36 | |
samux | 0:0cf0e27feaad | 37 | bool MbedJSONValue::hasMember(char * name) |
samux | 0:0cf0e27feaad | 38 | { |
samux | 0:0cf0e27feaad | 39 | for(int i = 0; i < index_token; i++) |
samux | 0:0cf0e27feaad | 40 | if( !strcmp(name, (*(token_name[i])).c_str() )) |
samux | 0:0cf0e27feaad | 41 | return true; |
samux | 0:0cf0e27feaad | 42 | return false; |
samux | 0:0cf0e27feaad | 43 | } |
samux | 0:0cf0e27feaad | 44 | |
samux | 0:0cf0e27feaad | 45 | |
samux | 0:0cf0e27feaad | 46 | void copy(const std::string& s, std::back_insert_iterator<std::string> oi) { |
samux | 0:0cf0e27feaad | 47 | std::copy(s.begin(), s.end(), oi); |
samux | 0:0cf0e27feaad | 48 | } |
samux | 0:0cf0e27feaad | 49 | |
samux | 0:0cf0e27feaad | 50 | void serialize_str(const std::string& s, std::back_insert_iterator<std::string> oi) { |
samux | 0:0cf0e27feaad | 51 | *oi++ = '"'; |
samux | 0:0cf0e27feaad | 52 | for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) { |
samux | 0:0cf0e27feaad | 53 | switch (*i) { |
samux | 0:0cf0e27feaad | 54 | #define MAP(val, sym) case val: copy(sym, oi); break |
samux | 0:0cf0e27feaad | 55 | MAP('"', "\\\""); |
samux | 0:0cf0e27feaad | 56 | MAP('\\', "\\\\"); |
samux | 0:0cf0e27feaad | 57 | MAP('/', "\\/"); |
samux | 0:0cf0e27feaad | 58 | MAP('\b', "\\b"); |
samux | 0:0cf0e27feaad | 59 | MAP('\f', "\\f"); |
samux | 0:0cf0e27feaad | 60 | MAP('\n', "\\n"); |
samux | 0:0cf0e27feaad | 61 | MAP('\r', "\\r"); |
samux | 0:0cf0e27feaad | 62 | MAP('\t', "\\t"); |
samux | 0:0cf0e27feaad | 63 | #undef MAP |
samux | 0:0cf0e27feaad | 64 | default: |
samux | 0:0cf0e27feaad | 65 | if ((unsigned char)*i < 0x20 || *i == 0x7f) { |
samux | 0:0cf0e27feaad | 66 | char buf[7]; |
samux | 0:0cf0e27feaad | 67 | sprintf(buf, "\\u%04x", *i & 0xff); |
samux | 0:0cf0e27feaad | 68 | copy(buf, buf + 6, oi); |
samux | 0:0cf0e27feaad | 69 | } else { |
samux | 0:0cf0e27feaad | 70 | *oi++ = *i; |
samux | 0:0cf0e27feaad | 71 | } |
samux | 0:0cf0e27feaad | 72 | break; |
samux | 0:0cf0e27feaad | 73 | } |
samux | 0:0cf0e27feaad | 74 | } |
samux | 0:0cf0e27feaad | 75 | *oi++ = '"'; |
samux | 0:0cf0e27feaad | 76 | } |
samux | 0:0cf0e27feaad | 77 | |
samux | 0:0cf0e27feaad | 78 | std::string MbedJSONValue::serialize(){ |
samux | 0:0cf0e27feaad | 79 | std::string s; |
samux | 0:0cf0e27feaad | 80 | serialize(std::back_inserter(s)); |
samux | 0:0cf0e27feaad | 81 | return s; |
samux | 0:0cf0e27feaad | 82 | } |
samux | 0:0cf0e27feaad | 83 | |
samux | 0:0cf0e27feaad | 84 | std::string MbedJSONValue::to_str(){ |
samux | 0:0cf0e27feaad | 85 | switch (_type) { |
samux | 0:0cf0e27feaad | 86 | case TypeNull: |
samux | 0:0cf0e27feaad | 87 | return "null"; |
samux | 0:0cf0e27feaad | 88 | case TypeBoolean: |
samux | 0:0cf0e27feaad | 89 | return _value.asBool ? "true" : "false"; |
samux | 0:0cf0e27feaad | 90 | case TypeInt: { |
samux | 0:0cf0e27feaad | 91 | char buf[10]; |
samux | 0:0cf0e27feaad | 92 | sprintf(buf, "%d", _value.asInt); |
samux | 0:0cf0e27feaad | 93 | return buf; |
samux | 0:0cf0e27feaad | 94 | } |
samux | 0:0cf0e27feaad | 95 | case TypeDouble: { |
samux | 0:0cf0e27feaad | 96 | char buf[10]; |
samux | 0:0cf0e27feaad | 97 | sprintf(buf, "%f", _value.asDouble); |
samux | 0:0cf0e27feaad | 98 | return buf; |
samux | 0:0cf0e27feaad | 99 | } |
samux | 0:0cf0e27feaad | 100 | default: |
samux | 0:0cf0e27feaad | 101 | break; |
samux | 0:0cf0e27feaad | 102 | } |
samux | 0:0cf0e27feaad | 103 | return NULL; |
samux | 0:0cf0e27feaad | 104 | } |
samux | 0:0cf0e27feaad | 105 | |
samux | 0:0cf0e27feaad | 106 | |
samux | 0:0cf0e27feaad | 107 | |
samux | 0:0cf0e27feaad | 108 | void MbedJSONValue::serialize(std::back_insert_iterator<std::string> oi) { |
joon874 | 7:62ce68f5a38c | 109 | #ifdef DEBUG_MJSON |
MidnightCow | 6:f8bec9cada34 | 110 | printf("SP:%X _type=%d, index=%d\r\n",__current_sp(),_type, index_token); |
joon874 | 7:62ce68f5a38c | 111 | #endif |
MidnightCow | 6:f8bec9cada34 | 112 | |
samux | 0:0cf0e27feaad | 113 | switch (_type) { |
samux | 0:0cf0e27feaad | 114 | case TypeString: |
joon874 | 7:62ce68f5a38c | 115 | #ifdef DEBUG_MJSON |
MidnightCow | 6:f8bec9cada34 | 116 | printf("typestring\r\n"); |
joon874 | 7:62ce68f5a38c | 117 | #endif |
samux | 0:0cf0e27feaad | 118 | serialize_str(*_value.asString, oi); |
samux | 0:0cf0e27feaad | 119 | break; |
joon874 | 8:fb820325a830 | 120 | case TypeArray: /*{ |
joon874 | 7:62ce68f5a38c | 121 | #ifdef DEBUG_MJSON |
MidnightCow | 6:f8bec9cada34 | 122 | printf("typearray\r\n"); |
joon874 | 7:62ce68f5a38c | 123 | #endif |
samux | 0:0cf0e27feaad | 124 | *oi++ = '['; |
samux | 0:0cf0e27feaad | 125 | for (int i = 0; i < index_array; i++) { |
samux | 0:0cf0e27feaad | 126 | if (i) |
samux | 0:0cf0e27feaad | 127 | *oi++ = ','; |
samux | 0:0cf0e27feaad | 128 | (*this)[i].serialize(oi); |
samux | 0:0cf0e27feaad | 129 | } |
samux | 0:0cf0e27feaad | 130 | *oi++ = ']'; |
samux | 0:0cf0e27feaad | 131 | break; |
joon874 | 8:fb820325a830 | 132 | }*/ |
samux | 0:0cf0e27feaad | 133 | case TypeObject: { |
joon874 | 7:62ce68f5a38c | 134 | #ifdef DEBUG_MJSON |
MidnightCow | 6:f8bec9cada34 | 135 | printf("typeObject\r\n"); |
joon874 | 7:62ce68f5a38c | 136 | #endif |
samux | 0:0cf0e27feaad | 137 | *oi++ = '{'; |
samux | 0:0cf0e27feaad | 138 | for (int i = 0; i < index_token; i++) { |
joon874 | 7:62ce68f5a38c | 139 | #ifdef DEBUG_MJSON |
MidnightCow | 6:f8bec9cada34 | 140 | printf("i=%d ",i); |
joon874 | 7:62ce68f5a38c | 141 | #endif |
samux | 0:0cf0e27feaad | 142 | if (i) |
samux | 0:0cf0e27feaad | 143 | *oi++ = ','; |
joon874 | 7:62ce68f5a38c | 144 | #ifdef DEBUG_MJSON |
MidnightCow | 6:f8bec9cada34 | 145 | printf("token_name[%d]=%s\r\n",i,token_name[i]->c_str()); |
joon874 | 7:62ce68f5a38c | 146 | #endif |
samux | 0:0cf0e27feaad | 147 | serialize_str(*(token_name[i]), oi); |
samux | 0:0cf0e27feaad | 148 | *oi++ = ':'; |
joon874 | 9:c917476c802b | 149 | if(!token[i]->accessible) token[i]->cb_action(token[i]); |
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) { |
joon874 | 8:fb820325a830 | 167 | _type = TypeObject; |
MidnightCow | 6:f8bec9cada34 | 168 | //if (i < NB_TOKEN && index_array == i ) { |
joon874 | 8:fb820325a830 | 169 | if( index_token == i){ |
joon874 | 8:fb820325a830 | 170 | #ifdef DEBUG_MJSON |
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()); |
joon874 | 8:fb820325a830 | 176 | index_token++; |
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) |
joon874 | 8:fb820325a830 | 181 | if(index_token > i) |
joon874 | 8:fb820325a830 | 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++) { |
joon874 | 7:62ce68f5a38c | 193 | #ifdef DEBUG_MJSON |
samux | 0:0cf0e27feaad | 194 | printf("k: %s\r\n", k.c_str()); |
samux | 0:0cf0e27feaad | 195 | printf("str: %s\r\n", token_name[i]->c_str()); |
samux | 0:0cf0e27feaad | 196 | #endif |
samux | 0:0cf0e27feaad | 197 | //existing token |
MidnightCow | 6:f8bec9cada34 | 198 | |
samux | 0:0cf0e27feaad | 199 | if (!strcmp(k.c_str(), token_name[i]->c_str())) { |
joon874 | 7:62ce68f5a38c | 200 | #ifdef DEBUG_MJSON |
samux | 0:0cf0e27feaad | 201 | printf("token found: %d\r\n", i); |
samux | 0:0cf0e27feaad | 202 | #endif |
samux | 0:0cf0e27feaad | 203 | return *(token[i]); |
samux | 0:0cf0e27feaad | 204 | } |
samux | 0:0cf0e27feaad | 205 | } |
samux | 0:0cf0e27feaad | 206 | |
MidnightCow | 6:f8bec9cada34 | 207 | //if(index_token >= NB_TOKEN) |
MidnightCow | 6:f8bec9cada34 | 208 | // index_token = NB_TOKEN - 1; |
samux | 0:0cf0e27feaad | 209 | //non existing token |
MidnightCow | 6:f8bec9cada34 | 210 | //token_name[index_token] = new std::string(k); |
MidnightCow | 6:f8bec9cada34 | 211 | token_name.push_back(new std::string(k)); |
joon874 | 7:62ce68f5a38c | 212 | #ifdef DEBUG_MJSON |
MidnightCow | 6:f8bec9cada34 | 213 | printf("New token_name[%d]=%X, %s\r\n", index_token, token_name[index_token], token_name[index_token]->c_str()); |
joon874 | 7:62ce68f5a38c | 214 | #endif |
MidnightCow | 6:f8bec9cada34 | 215 | //token[index_token] = new MbedJSONValue(); |
MidnightCow | 6:f8bec9cada34 | 216 | token.push_back(new MbedJSONValue()); |
joon874 | 7:62ce68f5a38c | 217 | #ifdef DEBUG_MJSON |
MidnightCow | 6:f8bec9cada34 | 218 | printf("New token[%d]=%X, %d\r\n", index_token, token[index_token], token[index_token]->getType()); |
joon874 | 7:62ce68f5a38c | 219 | #endif |
samux | 0:0cf0e27feaad | 220 | index_token++; |
samux | 0:0cf0e27feaad | 221 | return *(token[index_token - 1]); |
samux | 0:0cf0e27feaad | 222 | } |
samux | 0:0cf0e27feaad | 223 | |
samux | 0:0cf0e27feaad | 224 | MbedJSONValue& MbedJSONValue::operator[](std::string k) const |
samux | 0:0cf0e27feaad | 225 | { |
samux | 0:0cf0e27feaad | 226 | for (int i = 0; i < index_token; i++) { |
joon874 | 7:62ce68f5a38c | 227 | #ifdef DEBUG_MJSON |
samux | 0:0cf0e27feaad | 228 | printf("k: %s\r\n", k.c_str()); |
MidnightCow | 6:f8bec9cada34 | 229 | //printf("str: %s\r\n", token_name[i]->c_str()); |
samux | 0:0cf0e27feaad | 230 | #endif |
MidnightCow | 6:f8bec9cada34 | 231 | printf("[%s]", k.c_str()); |
MidnightCow | 6:f8bec9cada34 | 232 | printf(" comp "); |
MidnightCow | 6:f8bec9cada34 | 233 | printf("[%s]\r\n", token_name[i]->c_str()); |
samux | 0:0cf0e27feaad | 234 | if (!strcmp(k.c_str(), token_name[i]->c_str())) { |
joon874 | 7:62ce68f5a38c | 235 | #ifdef DEBUG_MJSON |
samux | 0:0cf0e27feaad | 236 | printf("token found: %d\r\n", i); |
samux | 0:0cf0e27feaad | 237 | #endif |
samux | 0:0cf0e27feaad | 238 | return *(token[i]); |
samux | 0:0cf0e27feaad | 239 | } |
samux | 0:0cf0e27feaad | 240 | } |
samux | 0:0cf0e27feaad | 241 | |
samux | 0:0cf0e27feaad | 242 | //if the user is not doing something wrong, this code is never executed!! |
samux | 0:0cf0e27feaad | 243 | return *(new MbedJSONValue()); |
MidnightCow | 6:f8bec9cada34 | 244 | //return 0; |
samux | 0:0cf0e27feaad | 245 | } |
samux | 0:0cf0e27feaad | 246 | |
samux | 0:0cf0e27feaad | 247 | |
samux | 0:0cf0e27feaad | 248 | // Operators |
samux | 0:0cf0e27feaad | 249 | MbedJSONValue& MbedJSONValue::operator=(MbedJSONValue const& rhs) { |
MidnightCow | 6:f8bec9cada34 | 250 | //printf("=json\r\n"); |
samux | 0:0cf0e27feaad | 251 | if (this != &rhs) { |
samux | 0:0cf0e27feaad | 252 | clean(); |
samux | 0:0cf0e27feaad | 253 | _type = rhs._type; |
samux | 0:0cf0e27feaad | 254 | switch (_type) { |
samux | 0:0cf0e27feaad | 255 | case TypeBoolean: |
samux | 0:0cf0e27feaad | 256 | _value.asBool = rhs._value.asBool; |
samux | 0:0cf0e27feaad | 257 | break; |
samux | 0:0cf0e27feaad | 258 | case TypeInt: |
samux | 0:0cf0e27feaad | 259 | _value.asInt = rhs._value.asInt; |
samux | 0:0cf0e27feaad | 260 | break; |
samux | 0:0cf0e27feaad | 261 | case TypeDouble: |
samux | 0:0cf0e27feaad | 262 | _value.asDouble = rhs._value.asDouble; |
samux | 0:0cf0e27feaad | 263 | break; |
samux | 0:0cf0e27feaad | 264 | case TypeString: |
samux | 0:0cf0e27feaad | 265 | _value.asString = new std::string(*rhs._value.asString); |
samux | 0:0cf0e27feaad | 266 | break; |
samux | 0:0cf0e27feaad | 267 | case TypeArray: |
samux | 0:0cf0e27feaad | 268 | for (int i = 0; i < rhs.index_array; i++) |
samux | 0:0cf0e27feaad | 269 | (*this)[i] = rhs[i]; |
samux | 0:0cf0e27feaad | 270 | case TypeObject: |
samux | 0:0cf0e27feaad | 271 | for (int i = 0; i < rhs.index_token; i++) |
samux | 0:0cf0e27feaad | 272 | (*this)[*(rhs.token_name[i])] = rhs[*(rhs.token_name[i])]; |
samux | 0:0cf0e27feaad | 273 | default: |
samux | 0:0cf0e27feaad | 274 | break; |
samux | 0:0cf0e27feaad | 275 | } |
samux | 0:0cf0e27feaad | 276 | } |
samux | 0:0cf0e27feaad | 277 | return *this; |
samux | 0:0cf0e27feaad | 278 | } |
samux | 0:0cf0e27feaad | 279 | |
samux | 0:0cf0e27feaad | 280 | |
samux | 0:0cf0e27feaad | 281 | // Works for strings, arrays, and structs. |
samux | 0:0cf0e27feaad | 282 | int MbedJSONValue::size() const { |
samux | 0:0cf0e27feaad | 283 | switch (_type) { |
samux | 0:0cf0e27feaad | 284 | case TypeString: |
samux | 0:0cf0e27feaad | 285 | return int(_value.asString->size()); |
samux | 0:0cf0e27feaad | 286 | case TypeArray: |
samux | 0:0cf0e27feaad | 287 | return index_array; |
samux | 0:0cf0e27feaad | 288 | case TypeObject: |
samux | 0:0cf0e27feaad | 289 | return index_token; |
samux | 0:0cf0e27feaad | 290 | default: |
samux | 0:0cf0e27feaad | 291 | break; |
samux | 0:0cf0e27feaad | 292 | } |
samux | 0:0cf0e27feaad | 293 | return -1; |
samux | 0:0cf0e27feaad | 294 | } |
samux | 0:0cf0e27feaad | 295 | |
MidnightCow | 6:f8bec9cada34 | 296 |