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