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 + -
显示快捷键?