FundamentalValue* FundamentalValue::DeepCopy() const { switch(GetType()) { case TYPE_BOOLEAN: return CreateBooleanValue(boolean_value_); case TYPE_INTEGER: return CreateIntegerValue(integer_value_); case TYPE_DOUBLE: return CreateDoubleValue(double_value_); default: NOTREACHED(); return NULL; } }
int JSONdecodeSub(ScriptValue &s, unsigned char * &b) { while (*b == ' ' || *b == '\t' || *b == '\n' || *b == '\r') b++; CreateNullValue(s); if (b[0] == '"') { return JSONParseString(s, b); } else if (b[0] == '[') { if (!CreateListValue(s, 4)) return 0; b++; while (*b == ' ' || *b == '\t' || *b == '\n' || *b == '\r') b++; if (*b == ']') { b++; return 1; } while (1) { ScriptValue sv; int res = JSONdecodeSub(sv, b); int res2; if (sv.type != SCRIPT_NULL) { res2 = s.listVal->PushBack(sv); } if (!res || !res2) return 0; while (*b == ' ' || *b == '\t' || *b == '\n' || *b == '\r') b++; if (*b == ']') { b++; return 1; } // ??? if (*b != ',') return 0; b++; } } else if (b[0] == '{') { if (!CreateDictValue(s, 4)) return 0; b++; while (*b == ' ' || *b == '\t' || *b == '\n' || *b == '\r') b++; if (*b == '}') { b++; return 1; } while (1) { ScriptValue sv, sv2; if (!JSONParseString(sv, b)) { sv.Release(); return 0; } while (*b == ' ' || *b == '\t' || *b == '\n' || *b == '\r') b++; if (*b != ':') { sv.Release(); return 0; } b++; int res = JSONdecodeSub(sv2, b); int res2 = s.dictVal->Add(sv, sv2); if (!res || !res2) return 0; while (*b == ' ' || *b == '\t' || *b == '\n' || *b == '\r') b++; if (*b == '}') { b++; return 1; } // ??? if (*b != ',') return 0; b++; } } else if ((b[0] >= '0' && b[0] <= '9') || b[0] == '-' || b[0] == '.') { unsigned char *t1, *t2; __int64 i = strtoi64((char*)b, (char**)&t1, 0); double d = strtod((char*)b, (char**)&t2); if (t1 >= t2) { if (t1) { b = t1; CreateIntValue(s, i); return 1; } } else { b = t2; CreateDoubleValue(s, d); return 1; } } else { if (LCASE(b[0]) == 'n' && LCASE(b[1]) == 'u' && LCASE(b[2]) == 'l' && LCASE(b[3]) == 'l') { b+=4; return 1; } if (LCASE(b[0]) == 'f' && LCASE(b[1]) == 'a' && LCASE(b[2]) == 'l' && LCASE(b[3]) == 's' && LCASE(b[4]) == 'e') { b+=5; return 1; } if (LCASE(b[0]) == 't' && LCASE(b[1]) == 'r' && LCASE(b[2]) == 'u' && LCASE(b[3]) == 'e') { CreateIntValue(s, 1); b+=4; return 1; } } return 0; }
int BeDecode(ScriptValue &sv, StringValue *s, int *pos) { if (s->len < pos[0]) return 0; if (s->value[pos[0]] == 'i') { pos[0] ++; unsigned char *end = strchr(s->value + pos[0], 'e'); __int64 val; if (!ReadInt(s->value + pos[0], end, val)) return 0; CreateIntValue(sv, val); pos[0] = 1+(int)(end-s->value); } else if (s->value[pos[0]] == 'l') { pos[0] ++; CreateListValue(sv, 3); while (s->len > pos[0]) { if (s->value[pos[0]] == 'e') { pos[0] ++; return 1; } ScriptValue sv2; if (!BeDecode(sv2, s, pos) || !sv.listVal->PushBack(sv2)) { sv.Release(); return 0; } } sv.Release(); return 0; } else if (s->value[pos[0]] == 'd') { pos[0] ++; CreateDictValue(sv, 3); while (s->len > pos[0]) { if (s->value[pos[0]] == 'e') { pos[0] ++; return 1; } ScriptValue sv2, sv3; if (!BeDecode(sv2, s, pos)) { sv.Release(); return 0; } if (sv2.type != SCRIPT_STRING || !BeDecode(sv3, s, pos)) { sv2.Release(); sv.Release(); return 0; } if (!sv.dictVal->Add(sv, sv2)) { sv.Release(); return 0; } } sv.Release(); return 0; } else if (s->value[pos[0]] == 'n') { CreateNullValue(sv); pos[0]++; } else if (s->value[pos[0]] == 'f') { pos[0]++; if (pos[0] + 8 > s->len) return 0; double d; memcpy(&d, s->value+pos[0], 8); pos[0] += 8; CreateDoubleValue(sv, d); return 1; } else { unsigned char *end = strchr(s->value + pos[0], ':'); __int64 val; if (!ReadInt(s->value + pos[0], end, val) || val < 0) return 0; pos[0] = 1+(int)(end-s->value); if (pos[0] + val > s->len) return 0; if (!CreateStringValue(sv, s->value+pos[0], (int) val)) return 0; pos[0] += (int) val; } return 1; }
void DictionaryValue::SetDouble(const std::string& path, double in_value) { Set(path, CreateDoubleValue(in_value)); }