home *** CD-ROM | disk | FTP | other *** search
/ Practical Programming in Tcl & Tk (4th Edition) / TCLBOOK4.BIN / pc / exsource / 47_9.c < prev    next >
Text File  |  2003-04-16  |  1KB  |  52 lines

  1. /*
  2.  * Example 47-9
  3.  * BlobCreate and BlobDelete.
  4.  */
  5.  
  6. int
  7. BlobCreate(Tcl_Interp *interp, BlobState *statePtr)
  8. {
  9.     Tcl_HashEntry *entryPtr;
  10.     Blob *blobPtr;
  11.     int new;
  12.     char name[20];
  13.     /*
  14.      * Generate a blob name and put it in the hash table
  15.      */
  16.     statePtr->uid++;
  17.     sprintf(name, "blob%d", statePtr->uid);
  18.     entryPtr = Tcl_CreateHashEntry(&statePtr->hash, name, &new);
  19.     /*
  20.      * Assert new == 1 
  21.      */
  22.     blobPtr = (Blob *)ckalloc(sizeof(Blob));
  23.     blobPtr->N = 0;
  24.     blobPtr->objPtr = NULL;
  25.     blobPtr->cmdPtr = NULL;
  26.     Tcl_SetHashValue(entryPtr, (ClientData)blobPtr);
  27.     /*
  28.      * Copy the name into the interpreter result.
  29.      */
  30.     Tcl_SetStringObj(Tcl_GetObjResult(interp), name, -1);
  31.     return TCL_OK;
  32. }
  33. int
  34. BlobDelete(Blob *blobPtr, Tcl_HashEntry *entryPtr)
  35. {
  36.     Tcl_DeleteHashEntry(entryPtr);
  37.     if (blobPtr->cmdPtr != NULL) {
  38.         Tcl_DecrRefCount(blobPtr->cmdPtr);
  39.     }
  40.     if (blobPtr->objPtr != NULL) {
  41.         Tcl_DecrRefCount(blobPtr->objPtr);
  42.     }
  43.     /*
  44.      * Use Tcl_EventuallyFree because of the Tcl_Preserve
  45.      * done in BlobPoke. See page 682.
  46.      */
  47.     Tcl_EventuallyFree((char *)blobPtr, Tcl_Free);
  48.     return TCL_OK;
  49. }
  50.  
  51.  
  52.