Example #1
0
    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;
        }
    }
Example #2
0
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;
}
Example #3
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;
}
Example #4
0
 void DictionaryValue::SetDouble(const std::string& path, double in_value)
 {
     Set(path, CreateDoubleValue(in_value));
 }