var.c
来自「samba最新软件」· C语言 代码 · 共 2,216 行 · 第 1/4 页
C
2,216 行
mprAllocSprintf(out, size, "%d", obj->integer); } else { mprAllocSprintf(out, size, fmt, obj->integer); } break;#if BLD_FEATURE_INT64 case MPR_TYPE_INT64: if (fmt == NULL || *fmt == '\0') {#if BLD_GOAHEAD_WEBSERVER mprAllocSprintf(out, size, "%d", (int) obj->integer64);#else mprAllocSprintf(out, size, "%lld", (long long)obj->integer64);#endif } else { mprAllocSprintf(out, size, fmt, obj->integer64); } break;#endif case MPR_TYPE_CFUNCTION: mprAllocSprintf(out, size, "[C Function]"); break; case MPR_TYPE_STRING_CFUNCTION: mprAllocSprintf(out, size, "[C StringFunction]"); break; case MPR_TYPE_FUNCTION: mprAllocSprintf(out, size, "[JavaScript Function]"); break; case MPR_TYPE_OBJECT: /* FUTURE -- really want: [object class: name] */ mprAllocSprintf(out, size, "[object %s]", obj->name); break; case MPR_TYPE_STRING: src = obj->string; mprAssert(src); if (fmt && *fmt) { mprAllocSprintf(out, size, fmt, src); } else if (src == NULL) { *out = mprStrdup("null"); } else { *out = mprStrdup(src); } break; default: mprAssert(0); }}/******************************************************************************//* * Parse a string based on formatting instructions and intelligently * create a variable. */MprVar mprParseVar(char *buf, MprType preferredType){ MprType type; char *cp; mprAssert(buf); type = preferredType; if (preferredType == MPR_TYPE_UNDEFINED) { if (*buf == '-') { type = MPR_NUM_VAR; } else if (!isdigit((int) *buf)) { if (strcmp(buf, "true") == 0 || strcmp(buf, "false") == 0) { type = MPR_TYPE_BOOL; } else { type = MPR_TYPE_STRING; } } else if (isdigit((int) *buf)) { type = MPR_NUM_VAR; cp = buf; if (*cp && tolower(cp[1]) == 'x') { cp = &cp[2]; } for (cp = buf; *cp; cp++) { if (! isdigit((int) *cp)) { break; } } if (*cp != '\0') {#if BLD_FEATURE_FLOATING_POINT if (*cp == '.' || tolower(*cp) == 'e') { type = MPR_TYPE_FLOAT; } else#endif { type = MPR_NUM_VAR; } } } } switch (type) { case MPR_TYPE_OBJECT: case MPR_TYPE_UNDEFINED: case MPR_TYPE_NULL: case MPR_TYPE_PTR: default: break; case MPR_TYPE_BOOL: return mprCreateBoolVar(buf[0] == 't' ? 1 : 0); case MPR_TYPE_INT: return mprCreateIntegerVar(mprParseInteger(buf));#if BLD_FEATURE_INT64 case MPR_TYPE_INT64: return mprCreateInteger64Var(mprParseInteger64(buf));#endif case MPR_TYPE_STRING: if (strcmp(buf, "null") == 0) { return mprCreateNullVar(); } else if (strcmp(buf, "undefined") == 0) { return mprCreateUndefinedVar(); } return mprCreateStringVar(buf, 1);#if BLD_FEATURE_FLOATING_POINT case MPR_TYPE_FLOAT: return mprCreateFloatVar(atof(buf));#endif } return mprCreateUndefinedVar();}/******************************************************************************//* * Convert the variable to a boolean. Only for primitive types. */bool mprVarToBool(const MprVar *vp){ mprAssert(vp); switch (vp->type) { case MPR_TYPE_UNDEFINED: case MPR_TYPE_NULL: case MPR_TYPE_STRING_CFUNCTION: case MPR_TYPE_CFUNCTION: case MPR_TYPE_FUNCTION: case MPR_TYPE_OBJECT: return 0; case MPR_TYPE_PTR: return (vp->ptr != NULL); case MPR_TYPE_BOOL: return vp->boolean;#if BLD_FEATURE_FLOATING_POINT case MPR_TYPE_FLOAT: return (vp->floating != 0 && !mprIsNan(vp->floating));#endif case MPR_TYPE_INT: return (vp->integer != 0);#if BLD_FEATURE_INT64 case MPR_TYPE_INT64: return (vp->integer64 != 0);#endif case MPR_TYPE_STRING: mprAssert(vp->string); return (vp->string[0] != '\0'); } /* Not reached */ return 0;}/******************************************************************************/#if BLD_FEATURE_FLOATING_POINT/* * Convert the variable to a floating point number. Only for primitive types. */double mprVarToFloat(const MprVar *vp){ mprAssert(vp); switch (vp->type) { case MPR_TYPE_UNDEFINED: case MPR_TYPE_NULL: case MPR_TYPE_STRING_CFUNCTION: case MPR_TYPE_CFUNCTION: case MPR_TYPE_FUNCTION: case MPR_TYPE_OBJECT: case MPR_TYPE_PTR: return 0; case MPR_TYPE_BOOL: return (vp->boolean) ? 1.0 : 0.0; case MPR_TYPE_FLOAT: return vp->floating; case MPR_TYPE_INT: return (double) vp->integer;#if BLD_FEATURE_INT64 case MPR_TYPE_INT64: return (double) vp->integer64;#endif case MPR_TYPE_STRING: mprAssert(vp->string); return atof(vp->string); } /* Not reached */ return 0;}#endif/******************************************************************************//* * Convert the variable to a number type. Only works for primitive types. */MprNum mprVarToNumber(const MprVar *vp){#if BLD_FEATURE_NUM_TYPE_ID == MPR_TYPE_INT64 return mprVarToInteger64(vp);#elif BLD_FEATURE_NUM_TYPE_ID == MPR_TYPE_FLOAT return mprVarToFloat(vp);#else return mprVarToInteger(vp);#endif}/******************************************************************************//* * Convert the variable to a number type. Only works for primitive types. */MprNum mprParseNumber(char *s){#if BLD_FEATURE_NUM_TYPE_ID == MPR_TYPE_INT64 return mprParseInteger64(s);#elif BLD_FEATURE_NUM_TYPE_ID == MPR_TYPE_FLOAT return mprParseFloat(s);#else return mprParseInteger(s);#endif}/******************************************************************************/#if BLD_FEATURE_INT64/* * Convert the variable to an Integer64 type. Only works for primitive types. */int64 mprVarToInteger64(const MprVar *vp){ mprAssert(vp); switch (vp->type) { case MPR_TYPE_UNDEFINED: case MPR_TYPE_NULL: case MPR_TYPE_STRING_CFUNCTION: case MPR_TYPE_CFUNCTION: case MPR_TYPE_FUNCTION: case MPR_TYPE_OBJECT: case MPR_TYPE_PTR: return 0; case MPR_TYPE_BOOL: return (vp->boolean) ? 1 : 0;#if BLD_FEATURE_FLOATING_POINT case MPR_TYPE_FLOAT: if (mprIsNan(vp->floating)) { return 0; } return (int64) vp->floating;#endif case MPR_TYPE_INT: return vp->integer; case MPR_TYPE_INT64: return vp->integer64; case MPR_TYPE_STRING: return mprParseInteger64(vp->string); } /* Not reached */ return 0;}/******************************************************************************//* * Convert the string buffer to an Integer64. */int64 mprParseInteger64(char *str){ char *cp; int64 num64; int radix, c, negative; mprAssert(str); cp = str; num64 = 0; negative = 0; if (*cp == '-') { cp++; negative = 1; } /* * Parse a number. Observe hex and octal prefixes (0x, 0) */ if (*cp != '0') { /* * Normal numbers (Radix 10) */ while (isdigit((int) *cp)) { num64 = (*cp - '0') + (num64 * 10); cp++; } } else { cp++; if (tolower(*cp) == 'x') { cp++; radix = 16; while (*cp) { c = tolower(*cp); if (isdigit(c)) { num64 = (c - '0') + (num64 * radix); } else if (c >= 'a' && c <= 'f') { num64 = (c - ('a' - 10)) + (num64 * radix); } else { break; } cp++; } } else{ radix = 8; while (*cp) { c = tolower(*cp); if (isdigit(c) && c < '8') { num64 = (c - '0') + (num64 * radix); } else { break; } cp++; } } } if (negative) { return 0 - num64; } return num64;}#endif /* BLD_FEATURE_INT64 *//******************************************************************************//* * Convert the variable to an Integer type. Only works for primitive types. */int mprVarToInteger(const MprVar *vp){ mprAssert(vp); switch (vp->type) { case MPR_TYPE_UNDEFINED: case MPR_TYPE_NULL: case MPR_TYPE_STRING_CFUNCTION: case MPR_TYPE_CFUNCTION: case MPR_TYPE_FUNCTION: case MPR_TYPE_OBJECT: case MPR_TYPE_PTR: return 0; case MPR_TYPE_BOOL: return (vp->boolean) ? 1 : 0;#if BLD_FEATURE_FLOATING_POINT case MPR_TYPE_FLOAT: if (mprIsNan(vp->floating)) { return 0; } return (int) vp->floating;#endif case MPR_TYPE_INT: return vp->integer;#if BLD_FEATURE_INT64 case MPR_TYPE_INT64: return (int) vp->integer64;#endif case MPR_TYPE_STRING: return mprParseInteger(vp->string); } /* Not reached */ return 0;}/******************************************************************************//* * Convert the string buffer to an Integer. */int mprParseInteger(char *str){ char *cp; int num; int radix, c, negative; mprAssert(str); cp = str; num = 0; negative = 0; if (*cp == '-') { cp++; negative = 1; } /* * Parse a number. Observe hex and octal prefixes (0x, 0) */ if (*cp != '0') { /* * Normal numbers (Radix 10) */ while (isdigit((int) *cp)) { num = (*cp - '0') + (num * 10); cp++; } } else { cp++; if (tolower(*cp) == 'x') { cp++; radix = 16; while (*cp) { c = tolower(*cp); if (isdigit(c)) { num = (c - '0') + (num * radix); } else if (c >= 'a' && c <= 'f') { num = (c - ('a' - 10)) + (num * radix); } else { break; } cp++; } } else{ radix = 8; while (*cp) { c = tolower(*cp); if (isdigit(c) && c < '8') { num = (c - '0') + (num * radix); } else { break; } cp++; } } } if (negative) { return 0 - num; } return num;}/******************************************************************************/#if BLD_FEATURE_FLOATING_POINT/* * Convert the string buffer to an Floating. */double mprParseFloat(char *str){ return atof(str);}/******************************************************************************/bool mprIsNan(double f){#if WIN return _isnan(f);#elif VXWORKS /* FUTURE */ return (0);#elif defined(FP_NAN) return (f == FP_NAN);#else return 0;#endif}/******************************************************************************/bool mprIsInfinite(double f){#if WIN return !_finite(f);#elif VXWORKS /* FUTURE */ return (0);#elif defined(FP_INFINITE) return (f == FP_INFINITE);#else return 0;#endif}#endif /* BLD_FEATURE_FLOATING_POINT *//******************************************************************************//* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim:tw=78 * vim600: sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?