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

📄 tclobj.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 4 页
字号:
	dbl = strtod(string, &end);	if (end == string) {	    goto badBoolean;	}	/*	 * Make sure the string has no garbage after the end of the double.	 */		while ((end < (string+length)) && isspace(UCHAR(*end))) {	    end++;	}	if (end != (string+length)) {	    goto badBoolean;	}	newBool = (dbl != 0.0);    }    /*     * 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.longValue = newBool;    objPtr->typePtr = &tclBooleanType;    return TCL_OK;    badBoolean:    if (interp != NULL) {	/*	 * Must copy string before resetting the result in case a caller	 * is trying to convert the interpreter's result to a boolean.	 */		char buf[100];	sprintf(buf, "expected boolean value but got \"%.50s\"", string);	Tcl_ResetResult(interp);	Tcl_AppendToObj(Tcl_GetObjResult(interp), buf, -1);    }    return TCL_ERROR;}/* *---------------------------------------------------------------------- * * UpdateStringOfBoolean -- * *	Update the string representation for a boolean object. *	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 boolean-to-string conversion. * *---------------------------------------------------------------------- */static voidUpdateStringOfBoolean(objPtr)    register Tcl_Obj *objPtr;	/* Int object whose string rep to update. */{    char *s = ckalloc((unsigned) 2);        s[0] = (char) (objPtr->internalRep.longValue? '1' : '0');    s[1] = '\0';    objPtr->bytes = s;    objPtr->length = 1;}/* *---------------------------------------------------------------------- * * Tcl_NewDoubleObj -- * *	This procedure is normally called when not debugging: i.e., when *	TCL_MEM_DEBUG is not defined. It creates a new double object and *	initializes it from the argument double value. * *	When TCL_MEM_DEBUG is defined, this procedure just returns the *	result of calling the debugging version Tcl_DbNewDoubleObj. * * 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_NewDoubleObjTcl_Obj *Tcl_NewDoubleObj(dblValue)    register double dblValue;	/* Double used to initialize the object. */{    return Tcl_DbNewDoubleObj(dblValue, "unknown", 0);}#else /* if not TCL_MEM_DEBUG */Tcl_Obj *Tcl_NewDoubleObj(dblValue)    register double dblValue;	/* Double used to initialize the object. */{    register Tcl_Obj *objPtr;    TclNewObj(objPtr);    objPtr->bytes = NULL;        objPtr->internalRep.doubleValue = dblValue;    objPtr->typePtr = &tclDoubleType;    return objPtr;}#endif /* if TCL_MEM_DEBUG *//* *---------------------------------------------------------------------- * * Tcl_DbNewDoubleObj -- * *	This procedure is normally called when debugging: i.e., when *	TCL_MEM_DEBUG is defined. It creates new double objects. It is the *	same as the Tcl_NewDoubleObj procedure above except that it calls *	Tcl_DbCkalloc directly with the file name and line number from its *	caller. This simplifies debugging since then the checkmem command *	will report the correct file name and line number when reporting *	objects that haven't been freed. * *	When TCL_MEM_DEBUG is not defined, this procedure just returns the *	result of calling Tcl_NewDoubleObj. * * 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_DEBUGTcl_Obj *Tcl_DbNewDoubleObj(dblValue, file, line)    register double dblValue;	/* Double used to initialize the object. */    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. */    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");    }    Tcl_InvalidateStringRep(objPtr);    if ((oldTypePtr != NULL) && (oldTypePtr->freeIntRepProc != NULL)) {	oldTypePtr->freeIntRepProc(objPtr);    }        objPtr->internalRep.doubleValue = dblValue;    objPtr->typePtr = &tclDoubleType;}/* *---------------------------------------------------------------------- * * 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;}/* *---------------------------------------------------------------------- * * DupDoubleInternalRep -- * *	Initialize the internal representation of a double Tcl_Obj to a *	copy of the internal representation of an existing double object.  * * Results: *	None. * * Side effects: *	"copyPtr"s internal rep is set to the double precision floating  *	point number corresponding to "srcPtr"s internal rep. * *---------------------------------------------------------------------- */static voidDupDoubleInternalRep(srcPtr, copyPtr)    register Tcl_Obj *srcPtr;	/* Object with internal rep to copy. */    register Tcl_Obj *copyPtr;	/* Object with internal rep to set. */{    copyPtr->internalRep.doubleValue = srcPtr->internalRep.doubleValue;    copyPtr->typePtr = &tclDoubleType;}/* *---------------------------------------------------------------------- * * 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 = TclGetStringFromObj(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))) {	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");    }        Tcl_InvalidateStringRep(objPtr);    if ((oldTypePtr != NULL) && (oldTypePtr->freeIntRepProc != NULL)) {	oldTypePtr->freeIntRepProc(objPtr);    }        objPtr->internalRep.longValue = (long) intValue;    objPtr->typePtr = &tclIntType;}/* *---------------------------------------------------------------------- * * 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

⌨️ 快捷键说明

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