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

  1. /*
  2.  * Example 47-5
  3.  * The Plus1ObjCmd procedure.
  4.  */
  5.  
  6. /*
  7. * Plus1ObjCmd --
  8. * This adds one to its input argument.
  9. */
  10. int
  11. Plus1ObjCmd(ClientData clientData, Tcl_Interp *interp,
  12.         int objc, Tcl_Obj *CONST objv[])
  13. {
  14.     Tcl_Obj *objPtr;
  15.     int i;
  16.     if (objc != 2) {
  17.         Tcl_WrongNumArgs(interp, 1, objv, "value");
  18.         return TCL_ERROR;
  19.     }
  20.     objPtr = objv[1];
  21.     if (Tcl_GetIntFromObj(interp, objPtr, &i) != TCL_OK) {
  22.         return TCL_ERROR;
  23.     }
  24.     if (Tcl_IsShared(objPtr)) {
  25.         objPtr = Tcl_DuplicateObj(objPtr);                                            /* refCount 0 */
  26.         Tcl_IncrRefCount(objPtr);                                            /* refCount 1*/
  27.     }
  28.     /*
  29.      * Assert objPtr has a refCount of one here.
  30.      * OK to set the unshared value to something new.
  31.      * Tcl_SetIntObj overwrites the old value.
  32.      */
  33.     Tcl_SetIntObj(objPtr, i+1);
  34.     /*
  35.      * Setting the result object adds a new reference,
  36.      * so we decrement because we no longer care about
  37.      * the integer object we modified.
  38.      */
  39.     Tcl_SetObjResult(interp, objPtr);                                                /* refCount 2*/
  40.     Tcl_DecrRefCount(objPtr);                                                /* refCount 1*/
  41.     /*
  42.      * Now only the interpreter result has a reference to objPtr.
  43.      */
  44.     return TCL_OK;
  45. }
  46.  
  47.  
  48.