home *** CD-ROM | disk | FTP | other *** search
/ Practical Programming in Tcl & Tk (4th Edition) / TCLBOOK4.BIN / pc / exsource.old / 45_7.c < prev    next >
Text File  |  2003-04-15  |  2KB  |  69 lines

  1. /*
  2.  * Example 45-7
  3.  * The Blob_Init and BlobCleanup procedures.
  4.  */
  5.  
  6. /*
  7. * Forward references.
  8. */
  9.  
  10. int BlobCmd(ClientData data, Tcl_Interp *interp,
  11.         int objc, Tcl_Obj *CONST objv[]);
  12. int BlobCreate(Tcl_Interp *interp, BlobState *statePtr);
  13. void BlobCleanup(ClientData data);
  14.  
  15. /*
  16. * Blob_Init --
  17. *
  18. *        Initialize the blob module.
  19. *
  20. * Side Effects:
  21. *         This allocates the hash table used to keep track
  22. *        of blobs. It creates the blob command.
  23. */
  24. int 
  25. Blob_Init(Tcl_Interp *interp)
  26. {
  27.     BlobState *statePtr;
  28.     /*
  29.      * Allocate and initialize the hash table. Associate the
  30.      * BlobState with the command by using the ClientData.
  31.      */
  32.     statePtr = (BlobState *)ckalloc(sizeof(BlobState));
  33.     Tcl_InitHashTable(&statePtr->hash, TCL_STRING_KEYS);
  34.     statePtr->uid = 0;
  35.     Tcl_CreateObjCommand(interp, "blob", BlobCmd, 
  36.             (ClientData)statePtr, BlobCleanup);
  37.     return TCL_OK;
  38. }
  39. /*
  40. * BlobCleanup --
  41. *        This is called when the blob command is destroyed.
  42. *
  43. * Side Effects:
  44. *        This walks the hash table and deletes the blobs it
  45. *        contains. Then it deallocates the hash table.
  46. */
  47. void
  48. BlobCleanup(ClientData data)
  49. {
  50.     BlobState *statePtr = (BlobState *)data;
  51.     Blob *blobPtr;
  52.     Tcl_HashEntry *entryPtr;
  53.     Tcl_HashSearch search;
  54.  
  55.     entryPtr = Tcl_FirstHashEntry(&statePtr->hash, &search);
  56.     while (entryPtr != NULL) {
  57.         blobPtr = Tcl_GetHashValue(entryPtr);
  58.         BlobDelete(blobPtr, entryPtr);
  59.         /*
  60.          * Get the first entry again, not the "next" one,
  61.          * because we just modified the hash table.
  62.          */
  63.         entryPtr = Tcl_FirstHashEntry(&statePtr->hash, &search);
  64.     }
  65.     ckfree((char *)statePtr);
  66. }
  67.  
  68.  
  69.