/* Parse a string based on formatting instructions and intelligently create a variable. Number formats: [(+|-)][0][OCTAL_DIGITS] [(+|-)][0][(x|X)][HEX_DIGITS] [(+|-)][DIGITS] [+|-][DIGITS][.][DIGITS][(e|E)[+|-]DIGITS] */ EjsVar *ejsParseVar(Ejs *ejs, cchar *buf, int preferredType) { int type; mprAssert(buf); type = preferredType; if (preferredType == ES_Void || preferredType < 0) { if ((*buf == '-' || *buf == '+') && isdigit((int) buf[1])) { type = ejs->numberType->id; } else if (!isdigit((int) *buf) && *buf != '.') { if (strcmp(buf, "true") == 0) { return (EjsVar*) ejs->trueValue; } else if (strcmp(buf, "false") == 0) { return (EjsVar*) ejs->falseValue; } type = ES_String; } else { type = ES_Number; } } switch (type) { case ES_Object: case ES_Void: case ES_Null: default: break; case ES_Number: return (EjsVar*) ejsCreateNumber(ejs, parseNumber(ejs, buf)); case ES_Boolean: return (EjsVar*) ejsCreateBoolean(ejs, parseBoolean(ejs, buf)); case ES_String: if (strcmp(buf, "null") == 0) { return (EjsVar*) ejsCreateNull(ejs); } else if (strcmp(buf, "undefined") == 0) { return (EjsVar*) ejsCreateUndefined(ejs); } return (EjsVar*) ejsCreateString(ejs, buf); } return (EjsVar*) ejsCreateUndefined(ejs); }
/* * Parse a string based on formatting instructions and intelligently create a variable. * * Float and decimal format: [+|-]DIGITS][DIGITS][(e|E)[+|-]DIGITS] * * TODO - refactor all this number parsing. */ EjsVar *ejsParseVar(Ejs *ejs, cchar *buf, int preferredType) { cchar *cp; int isHex, type; mprAssert(buf); type = preferredType; isHex = 0; if (preferredType == ES_Void || preferredType < 0) { if (*buf == '-' || *buf == '+') { type = ejs->numberType->id; } else if (!isdigit((int) *buf)) { if (strcmp(buf, "true") == 0 || strcmp(buf, "false") == 0) { type = ES_Boolean; } else { type = ES_String; } } else { if (buf[0] == '0' && tolower((int) buf[1]) == 'x') { isHex = 1; for (cp = &buf[2]; *cp; cp++) { if (! isxdigit((int) *cp)) { break; } } } else { for (cp = buf; *cp; cp++) { if (! isdigit((int) *cp)) { #if BLD_FEATURE_FLOATING_POINT int c = tolower((int) *cp); if (c != '.' && c != 'e' && c != 'f') #endif break; } } } if (*cp == '\0') { type = ES_Number; } else { type = ES_String; } } } switch (type) { case ES_Object: case ES_Void: case ES_Null: default: break; case ES_Number: return (EjsVar*) ejsCreateNumber(ejs, parseNumber(ejs, buf, isHex)); case ES_Boolean: return (EjsVar*) ejsCreateBoolean(ejs, parseBoolean(ejs, buf)); case ES_String: if (strcmp(buf, "null") == 0) { return (EjsVar*) ejsCreateNull(ejs); } else if (strcmp(buf, "undefined") == 0) { return (EjsVar*) ejsCreateUndefined(ejs); } return (EjsVar*) ejsCreateString(ejs, buf); } return (EjsVar*) ejsCreateUndefined(ejs); }