⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tclobj.c

📁 tcl是工具命令语言
💻 C
📖 第 1 页 / 共 5 页
字号:
 *	invalid string representation. The returned object has ref count 0. * * Side effects: *	None. * *---------------------------------------------------------------------- */#ifdef TCL_MEM_DEBUGTcl_Obj *Tcl_DbNewDoubleObj(dblValue, file, line)    register double dblValue;	/* Double used to initialize the object. */    CONST char *file;		/* The name of the source file calling this				 * procedure; used for debugging. */    int line;			/* Line number in the source file; used				 * for debugging. */{    register Tcl_Obj *objPtr;    TclDbNewObj(objPtr, file, line);    objPtr->bytes = NULL;        objPtr->internalRep.doubleValue = dblValue;    objPtr->typePtr = &tclDoubleType;    return objPtr;}#else /* if not TCL_MEM_DEBUG */Tcl_Obj *Tcl_DbNewDoubleObj(dblValue, file, line)    register double dblValue;	/* Double used to initialize the object. */    CONST char *file;		/* The name of the source file calling this				 * procedure; used for debugging. */    int line;			/* Line number in the source file; used				 * for debugging. */{    return Tcl_NewDoubleObj(dblValue);}#endif /* TCL_MEM_DEBUG *//* *---------------------------------------------------------------------- * * Tcl_SetDoubleObj -- * *	Modify an object to be a double object and to have the specified *	double value. * * Results: *	None. * * Side effects: *	The object's old string rep, if any, is freed. Also, any old *	internal rep is freed. * *---------------------------------------------------------------------- */voidTcl_SetDoubleObj(objPtr, dblValue)    register Tcl_Obj *objPtr;	/* Object whose internal rep to init. */    register double dblValue;	/* Double used to set the object's value. */{    register Tcl_ObjType *oldTypePtr = objPtr->typePtr;    if (Tcl_IsShared(objPtr)) {	panic("Tcl_SetDoubleObj called with shared object");    }    if ((oldTypePtr != NULL) && (oldTypePtr->freeIntRepProc != NULL)) {	oldTypePtr->freeIntRepProc(objPtr);    }        objPtr->internalRep.doubleValue = dblValue;    objPtr->typePtr = &tclDoubleType;    Tcl_InvalidateStringRep(objPtr);}/* *---------------------------------------------------------------------- * * Tcl_GetDoubleFromObj -- * *	Attempt to return a double from the Tcl object "objPtr". If the *	object is not already a double, an attempt will be made to convert *	it to one. * * Results: *	The return value is a standard Tcl object result. If an error occurs *	during conversion, an error message is left in the interpreter's *	result unless "interp" is NULL. * * Side effects: *	If the object is not already a double, the conversion will free *	any old internal representation. * *---------------------------------------------------------------------- */intTcl_GetDoubleFromObj(interp, objPtr, dblPtr)    Tcl_Interp *interp; 	/* Used for error reporting if not NULL. */    register Tcl_Obj *objPtr;	/* The object from which to get a double. */    register double *dblPtr;	/* Place to store resulting double. */{    register int result;        if (objPtr->typePtr == &tclDoubleType) {	*dblPtr = objPtr->internalRep.doubleValue;	return TCL_OK;    }    result = SetDoubleFromAny(interp, objPtr);    if (result == TCL_OK) {	*dblPtr = objPtr->internalRep.doubleValue;    }    return result;}/* *---------------------------------------------------------------------- * * SetDoubleFromAny -- * *	Attempt to generate an double-precision floating point internal form *	for the Tcl object "objPtr". * * Results: *	The return value is a standard Tcl object result. If an error occurs *	during conversion, an error message is left in the interpreter's *	result unless "interp" is NULL. * * Side effects: *	If no error occurs, a double is stored as "objPtr"s internal *	representation. * *---------------------------------------------------------------------- */static intSetDoubleFromAny(interp, objPtr)    Tcl_Interp *interp;		/* Used for error reporting if not NULL. */    register Tcl_Obj *objPtr;	/* The object to convert. */{    Tcl_ObjType *oldTypePtr = objPtr->typePtr;    char *string, *end;    double newDouble;    int length;    /*     * Get the string representation. Make it up-to-date if necessary.     */    string = Tcl_GetStringFromObj(objPtr, &length);    /*     * Now parse "objPtr"s string as an double. Numbers can't have embedded     * NULLs. We use an implementation here that doesn't report errors in     * interp if interp is NULL.     */    errno = 0;    newDouble = strtod(string, &end);    if (end == string) {	badDouble:	if (interp != NULL) {	    /*	     * Must copy string before resetting the result in case a caller	     * is trying to convert the interpreter's result to an int.	     */	    	    char buf[100];	    sprintf(buf, "expected floating-point number but got \"%.50s\"",	            string);	    Tcl_ResetResult(interp);	    Tcl_AppendToObj(Tcl_GetObjResult(interp), buf, -1);	}	return TCL_ERROR;    }    if (errno != 0) {	if (interp != NULL) {	    TclExprFloatError(interp, newDouble);	}	return TCL_ERROR;    }    /*     * Make sure that the string has no garbage after the end of the double.     */        while ((end < (string+length))	    && isspace(UCHAR(*end))) { /* INTL: ISO space. */	end++;    }    if (end != (string+length)) {	goto badDouble;    }        /*     * The conversion to double succeeded. Free the old internalRep before     * setting the new one. We do this as late as possible to allow the     * conversion code, in particular Tcl_GetStringFromObj, to use that old     * internalRep.     */        if ((oldTypePtr != NULL) &&	(oldTypePtr->freeIntRepProc != NULL)) {	oldTypePtr->freeIntRepProc(objPtr);    }    objPtr->internalRep.doubleValue = newDouble;    objPtr->typePtr = &tclDoubleType;    return TCL_OK;}/* *---------------------------------------------------------------------- * * UpdateStringOfDouble -- * *	Update the string representation for a double-precision floating *	point object. This must obey the current tcl_precision value for *	double-to-string conversions. Note: This procedure does not free an *	existing old string rep so storage will be lost if this has not *	already been done. * * Results: *	None. * * Side effects: *	The object's string is set to a valid string that results from *	the double-to-string conversion. * *---------------------------------------------------------------------- */static voidUpdateStringOfDouble(objPtr)    register Tcl_Obj *objPtr;	/* Double obj with string rep to update. */{    char buffer[TCL_DOUBLE_SPACE];    register int len;        Tcl_PrintDouble((Tcl_Interp *) NULL, objPtr->internalRep.doubleValue,	    buffer);    len = strlen(buffer);        objPtr->bytes = (char *) ckalloc((unsigned) len + 1);    strcpy(objPtr->bytes, buffer);    objPtr->length = len;}/* *---------------------------------------------------------------------- * * Tcl_NewIntObj -- * *	If a client is compiled with TCL_MEM_DEBUG defined, calls to *	Tcl_NewIntObj to create a new integer object end up calling the *	debugging procedure Tcl_DbNewLongObj instead. * *	Otherwise, if the client is compiled without TCL_MEM_DEBUG defined, *	calls to Tcl_NewIntObj result in a call to one of the two *	Tcl_NewIntObj implementations below. We provide two implementations *	so that the Tcl core can be compiled to do memory debugging of the  *	core even if a client does not request it for itself. * *	Integer and long integer objects share the same "integer" type *	implementation. We store all integers as longs and Tcl_GetIntFromObj *	checks whether the current value of the long can be represented by *	an int. * * Results: *	The newly created object is returned. This object will have an *	invalid string representation. The returned object has ref count 0. * * Side effects: *	None. * *---------------------------------------------------------------------- */#ifdef TCL_MEM_DEBUG#undef Tcl_NewIntObjTcl_Obj *Tcl_NewIntObj(intValue)    register int intValue;	/* Int used to initialize the new object. */{    return Tcl_DbNewLongObj((long)intValue, "unknown", 0);}#else /* if not TCL_MEM_DEBUG */Tcl_Obj *Tcl_NewIntObj(intValue)    register int intValue;	/* Int used to initialize the new object. */{    register Tcl_Obj *objPtr;    TclNewObj(objPtr);    objPtr->bytes = NULL;        objPtr->internalRep.longValue = (long)intValue;    objPtr->typePtr = &tclIntType;    return objPtr;}#endif /* if TCL_MEM_DEBUG *//* *---------------------------------------------------------------------- * * Tcl_SetIntObj -- * *	Modify an object to be an integer and to have the specified integer *	value. * * Results: *	None. * * Side effects: *	The object's old string rep, if any, is freed. Also, any old *	internal rep is freed.  * *---------------------------------------------------------------------- */voidTcl_SetIntObj(objPtr, intValue)    register Tcl_Obj *objPtr;	/* Object whose internal rep to init. */    register int intValue;	/* Integer used to set object's value. */{    register Tcl_ObjType *oldTypePtr = objPtr->typePtr;    if (Tcl_IsShared(objPtr)) {	panic("Tcl_SetIntObj called with shared object");    }        if ((oldTypePtr != NULL) && (oldTypePtr->freeIntRepProc != NULL)) {	oldTypePtr->freeIntRepProc(objPtr);    }        objPtr->internalRep.longValue = (long) intValue;    objPtr->typePtr = &tclIntType;    Tcl_InvalidateStringRep(objPtr);}/* *---------------------------------------------------------------------- * * Tcl_GetIntFromObj -- * *	Attempt to return an int from the Tcl object "objPtr". If the object *	is not already an int, an attempt will be made to convert it to one. * *	Integer and long integer objects share the same "integer" type *	implementation. We store all integers as longs and Tcl_GetIntFromObj *	checks whether the current value of the long can be represented by *	an int. * * Results: *	The return value is a standard Tcl object result. If an error occurs *	during conversion or if the long integer held by the object *	can not be represented by an int, an error message is left in *	the interpreter's result unless "interp" is NULL. * * Side effects: *	If the object is not already an int, the conversion will free *	any old internal representation. * *---------------------------------------------------------------------- */intTcl_GetIntFromObj(interp, objPtr, intPtr)    Tcl_Interp *interp; 	/* Used for error reporting if not NULL. */    register Tcl_Obj *objPtr;	/* The object from which to get a int. */    register int *intPtr;	/* Place to store resulting int. */{    register long l;    int result;        if (objPtr->typePtr != &tclIntType) {	result = SetIntFromAny(interp, objPtr);	if (result != TCL_OK) {	    return result;	}    }    l = objPtr->internalRep.longValue;    if (((long)((int)l)) == l) {	*intPtr = (int)objPtr->internalRep.longValue;	return TCL_OK;    }    if (interp != NULL) {	Tcl_ResetResult(interp);	Tcl_AppendToObj(Tcl_GetObjResult(interp),		"integer value too large to represent as non-long integer", -1);    }    return TCL_ERROR;}/* *---------------------------------------------------------------------- * * SetIntFromAny -- * *	Attempt to generate an integer internal form for the Tcl object *	"objPtr". * * Results: *	The return value is a standard object Tcl result. If an error occurs *	during conversion, an error message is left in the interpreter's *	result unless "interp" is NULL. * * Side effects: *	If no error occurs, an int is stored as "objPtr"s internal *	representation.  * *---------------------------------------------------------------------- */static intSetIntFromAny(interp, objPtr)    Tcl_Interp *interp;		/* Used for error reporting if not NULL. */    register Tcl_Obj *objPtr;	/* The object to convert. */{    Tcl_ObjType *oldTypePtr = objPtr->typePtr;    char *string, *end;    int length;    register char *p;    long newLong;    /*     * Get the string representation. Make it up-to-date if necessary.     */    p = string = Tcl_GetStringFromObj(objPtr, &length);    /*     * Now parse "objPtr"s string as an int. We use an implementation here     * that doesn't report errors in interp if interp is NULL. Note: use     * strtoul instead of strtol for integer conversions to allow full-size     * unsigned numbers, but don't depend on strtoul to handle sign     * characters; it won't in some implementations.     */    errno = 0;#ifdef TCL_STRTOUL_SIGN_CHECK    for ( ;  isspace(UCHAR(*p));  p++) { /* INTL: ISO space. */	/* Empty loop body. */    }    if (*p == '-') {

⌨️ 快捷键说明

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