The code from https://github.com/vpcola/Nucleo

Committer:
sinrab
Date:
Wed Oct 08 11:00:24 2014 +0000
Revision:
0:5464d5e415e5
The code from https://github.com/vpcola/Nucleo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sinrab 0:5464d5e415e5 1 /*
sinrab 0:5464d5e415e5 2 *
sinrab 0:5464d5e415e5 3 * Compact JSON format parsing lib (native cross-platform c++)
sinrab 0:5464d5e415e5 4 *
sinrab 0:5464d5e415e5 5 * Copyright (C) 2013 Victor Laskin (victor.laskin@gmail.com)
sinrab 0:5464d5e415e5 6 * Details: http://vitiy.info/?p=102
sinrab 0:5464d5e415e5 7 *
sinrab 0:5464d5e415e5 8 * Redistribution and use in source and binary forms, with or without
sinrab 0:5464d5e415e5 9 * modification, are permitted provided that the following conditions
sinrab 0:5464d5e415e5 10 * are met:
sinrab 0:5464d5e415e5 11 * 1. Redistributions of source code must retain the above copyright
sinrab 0:5464d5e415e5 12 * notice, this list of conditions and the following disclaimer.
sinrab 0:5464d5e415e5 13 * 2. Redistributions in binary form must reproduce the above copyright
sinrab 0:5464d5e415e5 14 * notice, this list of conditions and the following disclaimer in
sinrab 0:5464d5e415e5 15 * the documentation and/or other materials provided with the
sinrab 0:5464d5e415e5 16 * distribution.
sinrab 0:5464d5e415e5 17 * 3. The names of the authors may not be used to endorse or promote
sinrab 0:5464d5e415e5 18 * products derived from this software without specific prior
sinrab 0:5464d5e415e5 19 * written permission.
sinrab 0:5464d5e415e5 20 *
sinrab 0:5464d5e415e5 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
sinrab 0:5464d5e415e5 22 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
sinrab 0:5464d5e415e5 23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
sinrab 0:5464d5e415e5 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
sinrab 0:5464d5e415e5 25 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
sinrab 0:5464d5e415e5 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
sinrab 0:5464d5e415e5 27 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
sinrab 0:5464d5e415e5 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
sinrab 0:5464d5e415e5 29 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
sinrab 0:5464d5e415e5 30 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
sinrab 0:5464d5e415e5 31 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
sinrab 0:5464d5e415e5 32 *
sinrab 0:5464d5e415e5 33 */
sinrab 0:5464d5e415e5 34
sinrab 0:5464d5e415e5 35
sinrab 0:5464d5e415e5 36 #include <string>
sinrab 0:5464d5e415e5 37 #include <vector>
sinrab 0:5464d5e415e5 38 #include <stdlib.h>
sinrab 0:5464d5e415e5 39
sinrab 0:5464d5e415e5 40 #ifndef MVJSON_H_
sinrab 0:5464d5e415e5 41 #define MVJSON_H_
sinrab 0:5464d5e415e5 42
sinrab 0:5464d5e415e5 43 using namespace std;
sinrab 0:5464d5e415e5 44
sinrab 0:5464d5e415e5 45 namespace JSON {
sinrab 0:5464d5e415e5 46
sinrab 0:5464d5e415e5 47 /// JSON node types
sinrab 0:5464d5e415e5 48 enum MVJSON_TYPE
sinrab 0:5464d5e415e5 49 {
sinrab 0:5464d5e415e5 50 MVJSON_TYPE_NULL,
sinrab 0:5464d5e415e5 51 MVJSON_TYPE_OBJECT,
sinrab 0:5464d5e415e5 52 MVJSON_TYPE_ARRAY,
sinrab 0:5464d5e415e5 53 MVJSON_TYPE_STRING,
sinrab 0:5464d5e415e5 54 MVJSON_TYPE_INT,
sinrab 0:5464d5e415e5 55 MVJSON_TYPE_DOUBLE,
sinrab 0:5464d5e415e5 56 MVJSON_TYPE_BOOL
sinrab 0:5464d5e415e5 57 };
sinrab 0:5464d5e415e5 58
sinrab 0:5464d5e415e5 59 class MVJSONUtils {
sinrab 0:5464d5e415e5 60 protected:
sinrab 0:5464d5e415e5 61
sinrab 0:5464d5e415e5 62 // string parsing functions
sinrab 0:5464d5e415e5 63 inline static int stringToInt(const string & s); ///< convert string to int
sinrab 0:5464d5e415e5 64 inline static double stringToDouble(const string & s); ///< convert string to float
sinrab 0:5464d5e415e5 65 inline static bool symbolToBeTrimmed(const char& c); ///< check if symbol is space, tab or new line break
sinrab 0:5464d5e415e5 66 inline static string trim(const string & text); ///< trim spaces, tabs and line break
sinrab 0:5464d5e415e5 67 inline static void replace(string & target, const string & oldStr, const string & newStr); ///< replace all occurrences of substring
sinrab 0:5464d5e415e5 68 inline static void splitInHalf(const string & s, const string & separator, string & begin, string & end); ///< second half (output)
sinrab 0:5464d5e415e5 69 inline static void splitList(const string & s, vector<string> & parts);
sinrab 0:5464d5e415e5 70 };
sinrab 0:5464d5e415e5 71
sinrab 0:5464d5e415e5 72
sinrab 0:5464d5e415e5 73 class MVJSONNode;
sinrab 0:5464d5e415e5 74
sinrab 0:5464d5e415e5 75 /// JSON Value
sinrab 0:5464d5e415e5 76 class MVJSONValue : public MVJSONUtils {
sinrab 0:5464d5e415e5 77 public:
sinrab 0:5464d5e415e5 78 MVJSONValue(string name, MVJSON_TYPE valueType);
sinrab 0:5464d5e415e5 79 MVJSONValue(string name, bool value);
sinrab 0:5464d5e415e5 80 MVJSONValue(string name, string value);
sinrab 0:5464d5e415e5 81 MVJSONValue(string name, int value);
sinrab 0:5464d5e415e5 82 MVJSONValue(string name, double value);
sinrab 0:5464d5e415e5 83 MVJSONValue(string name, MVJSONNode* value);
sinrab 0:5464d5e415e5 84 virtual ~MVJSONValue();
sinrab 0:5464d5e415e5 85
sinrab 0:5464d5e415e5 86 string name; ///< value name [optional]
sinrab 0:5464d5e415e5 87 MVJSON_TYPE valueType; ///< type of node
sinrab 0:5464d5e415e5 88
sinrab 0:5464d5e415e5 89 string stringValue; ///< value if data has string type
sinrab 0:5464d5e415e5 90 bool boolValue; ///< value if data has bool type
sinrab 0:5464d5e415e5 91 int intValue; ///< value if data has int type
sinrab 0:5464d5e415e5 92 double doubleValue; ///< value if data has double type
sinrab 0:5464d5e415e5 93 MVJSONNode* objValue; ///< value if data has object type
sinrab 0:5464d5e415e5 94
sinrab 0:5464d5e415e5 95 vector<MVJSONValue*> arrayValue; ///< array of values
sinrab 0:5464d5e415e5 96
sinrab 0:5464d5e415e5 97 double getFieldDouble(string name); ///< get value of double field of VALUE OBJECT (objValue)
sinrab 0:5464d5e415e5 98 int getFieldInt(string name); ///< get value of int field of VALUE OBJECT (objValue)
sinrab 0:5464d5e415e5 99 string getFieldString(string name); ///< get value of string field of VALUE OBJECT (objValue)
sinrab 0:5464d5e415e5 100 bool getFieldBool(string name); ///< get value of bool field of VALUE OBJECT (objValue)
sinrab 0:5464d5e415e5 101
sinrab 0:5464d5e415e5 102 inline MVJSONValue* at(unsigned int i){ return arrayValue.at(i); }
sinrab 0:5464d5e415e5 103 inline int size() { if (valueType == MVJSON_TYPE_ARRAY) return arrayValue.size(); else return 1; }
sinrab 0:5464d5e415e5 104 private:
sinrab 0:5464d5e415e5 105 void init(MVJSON_TYPE valueType);
sinrab 0:5464d5e415e5 106 };
sinrab 0:5464d5e415e5 107
sinrab 0:5464d5e415e5 108 /// JSON Node (Object)
sinrab 0:5464d5e415e5 109 class MVJSONNode {
sinrab 0:5464d5e415e5 110 public:
sinrab 0:5464d5e415e5 111
sinrab 0:5464d5e415e5 112 virtual ~MVJSONNode();
sinrab 0:5464d5e415e5 113
sinrab 0:5464d5e415e5 114 vector<MVJSONValue*> values; ///< values (props)
sinrab 0:5464d5e415e5 115
sinrab 0:5464d5e415e5 116 bool hasField(string name); ///< check that object has field
sinrab 0:5464d5e415e5 117 MVJSONValue* getField(string name); ///< get field by name
sinrab 0:5464d5e415e5 118
sinrab 0:5464d5e415e5 119 double getFieldDouble(string name); ///< get value of double field
sinrab 0:5464d5e415e5 120 int getFieldInt(string name); ///< get value of int field
sinrab 0:5464d5e415e5 121 string getFieldString(string name); ///< get value of string field
sinrab 0:5464d5e415e5 122 bool getFieldBool(string name); ///< get value of bool field
sinrab 0:5464d5e415e5 123 };
sinrab 0:5464d5e415e5 124
sinrab 0:5464d5e415e5 125 /// Compact JSON parser (based on specification: http://www.json.org/)
sinrab 0:5464d5e415e5 126 class MVJSONReader : public MVJSONUtils {
sinrab 0:5464d5e415e5 127 public:
sinrab 0:5464d5e415e5 128 MVJSONReader(const string & source); ///< constructor from json source
sinrab 0:5464d5e415e5 129 virtual ~MVJSONReader();
sinrab 0:5464d5e415e5 130
sinrab 0:5464d5e415e5 131 MVJSONNode* root; ///< root object (if its null - parsing was failed)
sinrab 0:5464d5e415e5 132
sinrab 0:5464d5e415e5 133 private:
sinrab 0:5464d5e415e5 134 MVJSONValue* parseValue(string text, bool hasNoName); ///< parse value
sinrab 0:5464d5e415e5 135 MVJSONNode* parse(string text); ///< parse node
sinrab 0:5464d5e415e5 136
sinrab 0:5464d5e415e5 137
sinrab 0:5464d5e415e5 138 };
sinrab 0:5464d5e415e5 139
sinrab 0:5464d5e415e5 140
sinrab 0:5464d5e415e5 141
sinrab 0:5464d5e415e5 142 // ------------------- inlined string processing functions ------------->
sinrab 0:5464d5e415e5 143
sinrab 0:5464d5e415e5 144
sinrab 0:5464d5e415e5 145 inline int MVJSONUtils::stringToInt(const string & s)
sinrab 0:5464d5e415e5 146 {
sinrab 0:5464d5e415e5 147 return atoi(s.c_str());
sinrab 0:5464d5e415e5 148 }
sinrab 0:5464d5e415e5 149
sinrab 0:5464d5e415e5 150
sinrab 0:5464d5e415e5 151 inline double MVJSONUtils::stringToDouble(const string & s)
sinrab 0:5464d5e415e5 152 {
sinrab 0:5464d5e415e5 153 return atof(s.c_str());
sinrab 0:5464d5e415e5 154 }
sinrab 0:5464d5e415e5 155
sinrab 0:5464d5e415e5 156
sinrab 0:5464d5e415e5 157 inline bool MVJSONUtils::symbolToBeTrimmed(const char& c ///< the char to test
sinrab 0:5464d5e415e5 158 )
sinrab 0:5464d5e415e5 159 {
sinrab 0:5464d5e415e5 160 if (c == ' ') return true;
sinrab 0:5464d5e415e5 161 if (c == '\n') return true;
sinrab 0:5464d5e415e5 162 if (c == '\r') return true;
sinrab 0:5464d5e415e5 163 if (c == '\t') return true;
sinrab 0:5464d5e415e5 164 return false;
sinrab 0:5464d5e415e5 165 }
sinrab 0:5464d5e415e5 166
sinrab 0:5464d5e415e5 167
sinrab 0:5464d5e415e5 168 inline string MVJSONUtils::trim(const string & text ///< the text to trim
sinrab 0:5464d5e415e5 169 )
sinrab 0:5464d5e415e5 170 {
sinrab 0:5464d5e415e5 171 if (text.length() == 0) return "";
sinrab 0:5464d5e415e5 172 int start = 0;
sinrab 0:5464d5e415e5 173 while ((start < text.length()) && (symbolToBeTrimmed(text[start]))) start++;
sinrab 0:5464d5e415e5 174 int end = text.length() - 1;
sinrab 0:5464d5e415e5 175 while ((end > 0) && (symbolToBeTrimmed(text[end]))) end--;
sinrab 0:5464d5e415e5 176 if (start > end) return "";
sinrab 0:5464d5e415e5 177
sinrab 0:5464d5e415e5 178 return text.substr(start, end - start + 1);
sinrab 0:5464d5e415e5 179 }
sinrab 0:5464d5e415e5 180
sinrab 0:5464d5e415e5 181 inline void MVJSONUtils::splitInHalf(const string & s, ///< source string to split up
sinrab 0:5464d5e415e5 182 const string & separator, ///< separator string)
sinrab 0:5464d5e415e5 183 string & begin, ///< first part (output)
sinrab 0:5464d5e415e5 184 string & end ///< second half (output)
sinrab 0:5464d5e415e5 185 )
sinrab 0:5464d5e415e5 186 {
sinrab 0:5464d5e415e5 187 int pos = s.find(separator);
sinrab 0:5464d5e415e5 188 if (pos == string::npos) { begin = s; end = ""; return; }
sinrab 0:5464d5e415e5 189
sinrab 0:5464d5e415e5 190 begin = s.substr(0, pos);
sinrab 0:5464d5e415e5 191 end = s.substr(pos + separator.length(), s.length() - pos - separator.length());
sinrab 0:5464d5e415e5 192 }
sinrab 0:5464d5e415e5 193
sinrab 0:5464d5e415e5 194 /// split string by "," - ignore content inside of "{", "}", "[", "]" and quotations "...."
sinrab 0:5464d5e415e5 195 /// also take \" into account
sinrab 0:5464d5e415e5 196 /// (Code should be cleared of comments beforehand)
sinrab 0:5464d5e415e5 197 inline void MVJSONUtils::splitList(const string & s, ///< string to be splitted
sinrab 0:5464d5e415e5 198 vector<string> & parts ///< result parts
sinrab 0:5464d5e415e5 199 )
sinrab 0:5464d5e415e5 200 {
sinrab 0:5464d5e415e5 201
sinrab 0:5464d5e415e5 202 bool isNotInQuotes = true;
sinrab 0:5464d5e415e5 203 int b1 = 0;
sinrab 0:5464d5e415e5 204 int b2 = 0;
sinrab 0:5464d5e415e5 205 int lastPos = 0;
sinrab 0:5464d5e415e5 206
sinrab 0:5464d5e415e5 207 const char* start = s.c_str();
sinrab 0:5464d5e415e5 208 const char* ps = start;
sinrab 0:5464d5e415e5 209
sinrab 0:5464d5e415e5 210 while (*ps) // *ps != 0
sinrab 0:5464d5e415e5 211 {
sinrab 0:5464d5e415e5 212 if ((*ps == ',') && (isNotInQuotes) && (b1 == 0) && (b2 == 0))
sinrab 0:5464d5e415e5 213 {
sinrab 0:5464d5e415e5 214 parts.push_back(s.substr(lastPos, ps - start - lastPos));
sinrab 0:5464d5e415e5 215 lastPos = ps - start + 1;
sinrab 0:5464d5e415e5 216 }
sinrab 0:5464d5e415e5 217
sinrab 0:5464d5e415e5 218 if (isNotInQuotes)
sinrab 0:5464d5e415e5 219 {
sinrab 0:5464d5e415e5 220 if (*ps == '{') b1++;
sinrab 0:5464d5e415e5 221 if (*ps == '}') b1--;
sinrab 0:5464d5e415e5 222 if (*ps == '[') b2++;
sinrab 0:5464d5e415e5 223 if (*ps == ']') b2--;
sinrab 0:5464d5e415e5 224 }
sinrab 0:5464d5e415e5 225
sinrab 0:5464d5e415e5 226 if (*ps == '"')
sinrab 0:5464d5e415e5 227 {
sinrab 0:5464d5e415e5 228 isNotInQuotes = !isNotInQuotes;
sinrab 0:5464d5e415e5 229 if (ps != start)
sinrab 0:5464d5e415e5 230 if (*(ps-1) == '\\')
sinrab 0:5464d5e415e5 231 isNotInQuotes = !isNotInQuotes;
sinrab 0:5464d5e415e5 232 }
sinrab 0:5464d5e415e5 233
sinrab 0:5464d5e415e5 234 ps++;
sinrab 0:5464d5e415e5 235 }
sinrab 0:5464d5e415e5 236
sinrab 0:5464d5e415e5 237 parts.push_back(s.substr(lastPos, s.length() - lastPos));
sinrab 0:5464d5e415e5 238 }
sinrab 0:5464d5e415e5 239
sinrab 0:5464d5e415e5 240 inline void MVJSONUtils::replace(string & target, ///< text to be modified
sinrab 0:5464d5e415e5 241 const string & oldStr, ///< old string
sinrab 0:5464d5e415e5 242 const string & newStr ///< new string
sinrab 0:5464d5e415e5 243 )
sinrab 0:5464d5e415e5 244 {
sinrab 0:5464d5e415e5 245 unsigned int pos = 0;
sinrab 0:5464d5e415e5 246 unsigned int oldLen = oldStr.length();
sinrab 0:5464d5e415e5 247 unsigned int newLen = newStr.length();
sinrab 0:5464d5e415e5 248
sinrab 0:5464d5e415e5 249 for (;;)
sinrab 0:5464d5e415e5 250 {
sinrab 0:5464d5e415e5 251 pos = target.find(oldStr, pos);
sinrab 0:5464d5e415e5 252 if (pos == string::npos) break;
sinrab 0:5464d5e415e5 253 target.replace(pos, oldLen, newStr);
sinrab 0:5464d5e415e5 254 pos += newLen;
sinrab 0:5464d5e415e5 255 }
sinrab 0:5464d5e415e5 256 }
sinrab 0:5464d5e415e5 257
sinrab 0:5464d5e415e5 258
sinrab 0:5464d5e415e5 259 } /* namespace F2 */
sinrab 0:5464d5e415e5 260 #endif /* MVJSON_H_ */
sinrab 0:5464d5e415e5 261