var.c

来自「samba最新软件」· C语言 代码 · 共 2,216 行 · 第 1/4 页

C
2,216
字号
	sum = 0;	while (*property) {		sum += (sum * 33) + *property++;	}	return sum % pp->hashSize;}/******************************************************************************//*********************************** Constructors *****************************//******************************************************************************//* *	Initialize an undefined value. */MprVar mprCreateUndefinedVar(){	MprVar	v;	memset(&v, 0x0, sizeof(v));	v.type = MPR_TYPE_UNDEFINED;	return v;}/******************************************************************************//* *	Initialize an null value. */MprVar mprCreateNullVar(){	MprVar	v;	memset(&v, 0x0, sizeof(v));	v.type = MPR_TYPE_NULL;	return v;}/******************************************************************************/MprVar mprCreateBoolVar(bool value){	MprVar	v;	memset(&v, 0x0, sizeof(v));	v.type = MPR_TYPE_BOOL;	v.boolean = value;	return v;}/******************************************************************************//* *	Initialize a C function. */MprVar mprCreateCFunctionVar(MprCFunction fn, void *thisPtr, int flags){	MprVar	v;	memset(&v, 0x0, sizeof(v));	v.type = MPR_TYPE_CFUNCTION;	v.cFunction.fn = fn;	v.cFunction.thisPtr = thisPtr;	v.flags = flags;	return v;}/******************************************************************************//* *	Initialize a C function. */MprVar mprCreateStringCFunctionVar(MprStringCFunction fn, void *thisPtr, 	int flags){	MprVar	v;	memset(&v, 0x0, sizeof(v));	v.type = MPR_TYPE_STRING_CFUNCTION;	v.cFunctionWithStrings.fn = fn;	v.cFunctionWithStrings.thisPtr = thisPtr;	v.flags = flags;	return v;}/******************************************************************************//* *	Initialize an opaque pointer. */MprVar mprCreatePtrVar(void *ptr){	MprVar	v;	memset(&v, 0x0, sizeof(v));	v.type = MPR_TYPE_PTR;	v.ptr = ptr;	return v;}/******************************************************************************/#if BLD_FEATURE_FLOATING_POINT/* *	Initialize a floating value. */MprVar mprCreateFloatVar(double value){	MprVar	v;	memset(&v, 0x0, sizeof(v));	v.type = MPR_TYPE_FLOAT;	v.floating = value;	return v;}#endif/******************************************************************************//* *	Initialize an integer value. */MprVar mprCreateIntegerVar(int value){	MprVar	v;	memset(&v, 0x0, sizeof(v));	v.type = MPR_TYPE_INT;	v.integer = value;	return v;}/******************************************************************************/#if BLD_FEATURE_INT64/* *	Initialize a 64-bit integer value. */MprVar mprCreateInteger64Var(int64 value){	MprVar	v;	memset(&v, 0x0, sizeof(v));	v.type = MPR_TYPE_INT64;	v.integer64 = value;	return v;}#endif /* BLD_FEATURE_INT64 *//******************************************************************************//* *	Initialize an number variable. Type is defined by configure. */MprVar mprCreateNumberVar(MprNum value){	MprVar	v;	memset(&v, 0x0, sizeof(v));	v.type = BLD_FEATURE_NUM_TYPE_ID;#if   BLD_FEATURE_NUM_TYPE_ID == MPR_TYPE_INT64	v.integer64 = value;#elif BLD_FEATURE_NUM_TYPE_ID == MPR_TYPE_FLOAT	v.float = value;#else	v.integer = value;#endif	return v;}/******************************************************************************//* *	Initialize a (bare) JavaScript function. args and body can be null. */MprVar mprCreateFunctionVar(char *args, char *body, int flags){	MprVar		v;	char		*cp, *arg, *last;	int			aid;	memset(&v, 0x0, sizeof(v));	v.type = MPR_TYPE_FUNCTION;	v.flags = flags;	v.function.args = mprCreateArray();	if (args) {		args = mprStrdup(args);		arg = mprStrTok(args, ",", &last);		while (arg) {			while (isspace((int) *arg))				arg++;			for (cp = &arg[strlen(arg) - 1]; cp > arg; cp--) {				if (!isspace((int) *cp)) {					break;				}			}			cp[1] = '\0';								aid = mprAddToArray(v.function.args, mprStrdup(arg));			arg = mprStrTok(0, ",", &last);		}		mprFree(args);	}	if (body) {		v.function.body = mprStrdup(body);	}	v.allocatedData = 1;	return v;}/******************************************************************************//* *	Initialize an object variable. Return type == MPR_TYPE_UNDEFINED if the *	memory allocation for the properties table failed. */MprVar mprCreateObjVar(const char *name, int hashSize){	MprVar	v;	mprAssert(name && *name);	memset(&v, 0x0, sizeof(MprVar));	v.type = MPR_TYPE_OBJECT;	if (hashSize <= 0) {		hashSize = MPR_DEFAULT_HASH_SIZE;	}	v.properties = createProperties(name, hashSize);	if (v.properties == 0) {		/* Indicate failed memory allocation */		v.type = MPR_TYPE_UNDEFINED;	}	v.allocatedData = 1;	v.name = mprStrdup(name);	mprLog(7, "mprCreateObjVar %s, 0x%p\n", name, v.properties);	return v;}/******************************************************************************//* *	Initialize a string value. */MprVar mprCreateStringVar(const char *value, bool allocate){	MprVar	v;	memset(&v, 0x0, sizeof(v));	v.type = MPR_TYPE_STRING;	if (value == 0) {		v.string = (char*) "";	} else if (allocate) {		v.string = mprStrdup(value);		v.allocatedData = 1;	} else {		v.string = (char*) value;	}	return v;}/******************************************************************************//* *	Copy an objects core value (only). This preserves the destination object's  *	name. This implements copy by reference for objects and copy by value for  *	strings and other types. Caller must free dest prior to calling. */static void copyVarCore(MprVar *dest, MprVar *src, int copyDepth){	MprVarTrigger	saveTrigger;	MprVar			*srcProp, *destProp, *last;	char			**srcArgs;	int				i;	mprAssert(dest);	mprAssert(src);	if (dest == src) {		return;	}	/* 	 *	FUTURE: we should allow read-only triggers where the value is never	 *	stored in the object. Currently, triggers override the readonly	 *	status.	 */	if (dest->type != MPR_TYPE_UNDEFINED && dest->readonly && !dest->trigger) {		mprAssert(0);		return;	}	if (dest->type != MPR_TYPE_UNDEFINED) {		saveTrigger = dest->trigger;		freeVarStorage(dest, 0);	} else {		saveTrigger = 0;	}	switch (src->type) {	default:	case MPR_TYPE_UNDEFINED:	case MPR_TYPE_NULL:		break;	case MPR_TYPE_BOOL:		dest->boolean = src->boolean;		break;	case MPR_TYPE_PTR:		/* we have to reference here so talloc structures survive a		   copy */		if (src->allocatedData) {			dest->ptr = talloc_reference(mprMemCtx(), src->ptr);			dest->allocatedData = 1;		} else {			dest->ptr = src->ptr;		}		break;	case MPR_TYPE_STRING_CFUNCTION:		dest->cFunctionWithStrings = src->cFunctionWithStrings;		break;	case MPR_TYPE_CFUNCTION:		dest->cFunction = src->cFunction;		break;#if BLD_FEATURE_FLOATING_POINT	case MPR_TYPE_FLOAT:		dest->floating = src->floating;		break;#endif	case MPR_TYPE_INT:		dest->integer = src->integer;		break;#if BLD_FEATURE_INT64	case MPR_TYPE_INT64:		dest->integer64 = src->integer64;		break;#endif	case MPR_TYPE_OBJECT:		if (copyDepth == MPR_DEEP_COPY) {			dest->properties = createProperties(src->name, 				src->properties->hashSize);			dest->allocatedData = 1;			for (i = 0; i < (int) src->properties->hashSize; i++) {				last = 0;				for (srcProp = src->properties->buckets[i]; srcProp; 						srcProp = srcProp->forw) {					if (srcProp->visited) {						continue;					}					destProp = allocProperty(srcProp->name);					if (destProp == 0) {						mprAssert(destProp);						return;					}					destProp->bucketIndex = i;					if (last) {						last->forw = destProp;					} else {						dest->properties->buckets[i] = destProp;					}					destProp->parentProperties = dest->properties;					/*					 *	Recursively copy the object					 */					srcProp->visited = 1;					copyVarCore(destProp, srcProp, copyDepth);					srcProp->visited = 0;					last = destProp;				}			}			dest->properties->numItems = src->properties->numItems;			dest->properties->numDataItems = src->properties->numDataItems;			dest->allocatedData = 1;		} else if (copyDepth == MPR_SHALLOW_COPY) {			dest->properties = src->properties;			adjustVarRefCount(src, 1);			dest->allocatedData = 1;		} else {			dest->properties = src->properties;			dest->allocatedData = 0;		}		break;	case MPR_TYPE_FUNCTION:		if (copyDepth != MPR_NO_COPY) {			dest->function.args = mprCreateArray();			srcArgs = (char**) src->function.args->handles;			for (i = 0; i < src->function.args->max; i++) {				if (srcArgs[i]) {					mprAddToArray(dest->function.args, mprStrdup(srcArgs[i]));				}			}			dest->function.body = mprStrdup(src->function.body);			dest->allocatedData = 1;		} else {			dest->function.args = src->function.args;			dest->function.body = src->function.body;			dest->allocatedData = 0;		}		break;	case MPR_TYPE_STRING:		if (src->string && copyDepth != MPR_NO_COPY) {			dest->string = mprStrdup(src->string);			dest->allocatedData = 1;		} else {			dest->string = src->string;			dest->allocatedData = 0;		}		break;	}	dest->type = src->type;	dest->flags = src->flags;	dest->trigger = saveTrigger;	/*	 *	Just for safety	 */	dest->spare = 0;}/******************************************************************************//* *	Copy an entire object including name. */void mprCopyVar(MprVar *dest, MprVar *src, int copyDepth){	mprAssert(dest);	mprAssert(src);	copyVarCore(dest, src, copyDepth);	mprFree(dest->name);	dest->name = mprStrdup(src->name);#if VAR_DEBUG	if (src->type == MPR_TYPE_OBJECT) {		mprFree(dest->fullName);		dest->fullName = mprStrdup(src->fullName);		mprLog(7, "mprCopyVar: object \"%s\", FDQ \"%s\" 0x%x, refCount %d\n", 			dest->name, dest->fullName, dest->properties, 			dest->properties->refCount);	}#endif}/******************************************************************************//* *	Copy an entire object including name. */void mprCopyVarValue(MprVar *dest, MprVar src, int copyDepth){	mprAssert(dest);	mprCopyVar(dest, &src, copyDepth); }/******************************************************************************//* *	Copy an object. This implements copy by reference for objects and copy by *	value for strings and other types. Caller must free dest prior to calling. */MprVar *mprDupVar(MprVar *src, int copyDepth){	MprVar	*dest;	mprAssert(src);	dest = (MprVar*) mprMalloc(sizeof(MprVar));	memset(dest, 0, sizeof(MprVar));	mprCopyVar(dest, src, copyDepth);	return dest;}/******************************************************************************//* *	Convert a value to a text based representation of its value *	FUTURE -- conver this to use the format string in all cases. Allow *	arbitrary format strings. */void mprVarToString(char** out, int size, char *fmt, MprVar *obj){	char	*src;	mprAssert(out);	*out = NULL;	if (obj->trigger) {		mprReadProperty(obj, 0);	}	switch (obj->type) {	case MPR_TYPE_UNDEFINED:		/*	FUTURE -- spec says convert to "undefined" */		*out = mprStrdup("");		break;	case MPR_TYPE_NULL:		*out = mprStrdup("null");		break;	case MPR_TYPE_PTR:		mprAllocSprintf(out, size, "[Opaque Pointer %p]", obj->ptr);		break;	case MPR_TYPE_BOOL:		if (obj->boolean) {			*out = mprStrdup("true");		} else {			*out = mprStrdup("false");		}		break;#if BLD_FEATURE_FLOATING_POINT	case MPR_TYPE_FLOAT:		if (fmt == NULL || *fmt == '\0') {			mprAllocSprintf(out, size, "%f", obj->floating);		} else {			mprAllocSprintf(out, size, fmt, obj->floating);		}		break;#endif	case MPR_TYPE_INT:		if (fmt == NULL || *fmt == '\0') {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?