Posted to tcl by APN at Thu Aug 08 06:25:12 GMT 2013view raw
- Tcl_Obj *ObjFromULONGLONG(ULONGLONG ull)
- {
- /*
- * Unsigned 64-bit ints with the high bit set will not fit in Tcl_WideInt.
- * We need to convert to a bignum from a hex string.
- */
- if (ull & 0x8000000000000000) {
- Tcl_Obj *objP;
- mp_int mpi;
- #if defined(TWAPI_REPLACE_CRT) || defined(TWAPI_MINIMIZE_CRT)
- Tcl_Obj *mpobj;
- objP = ObjFromWideInt((Tcl_WideInt) ull);
- mpobj = Tcl_Format(NULL, "0x%lx", 1, &objP);
- Tcl_DecrRefCount(objP);
- objP = mpobj;
- #else
- char buf[40];
- _snprintf(buf, sizeof(buf), "%I64u", ull);
- objP = ObjFromString(buf);
- #endif
- /* Force to bignum because COM interface sometimes needs to check type*/
- if (Tcl_GetBignumFromObj(NULL, objP, &mpi) == TCL_ERROR)
- return objP;
- #if defined(TWAPI_REPLACE_CRT) || defined(TWAPI_MINIMIZE_CRT)
- Tcl_InvalidateStringRep(objP); /* So we get a decimal string rep */
- #endif
- TclBN_mp_clear(&mpi);
- return objP;
- } else {
- return ObjFromWideInt((Tcl_WideInt) ull);
- }
- }