tclHistory.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:4k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tclHistory.c --
  3.  *
  4.  * This module and the Tcl library file history.tcl together implement
  5.  * Tcl command history. Tcl_RecordAndEval(Obj) can be called to record
  6.  * commands ("events") before they are executed. Commands defined in
  7.  * history.tcl may be used to perform history substitutions.
  8.  *
  9.  * Copyright (c) 1990-1993 The Regents of the University of California.
  10.  * Copyright (c) 1994-1997 Sun Microsystems, Inc.
  11.  *
  12.  * See the file "license.terms" for information on usage and redistribution
  13.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  14.  *
  15.  * RCS: @(#) $Id: tclHistory.c,v 1.4 2002/01/16 06:02:34 dgp Exp $
  16.  */
  17. #include "tclInt.h"
  18. #include "tclPort.h"
  19. /*
  20.  *----------------------------------------------------------------------
  21.  *
  22.  * Tcl_RecordAndEval --
  23.  *
  24.  * This procedure adds its command argument to the current list of
  25.  * recorded events and then executes the command by calling
  26.  * Tcl_Eval.
  27.  *
  28.  * Results:
  29.  * The return value is a standard Tcl return value, the result of
  30.  * executing cmd.
  31.  *
  32.  * Side effects:
  33.  * The command is recorded and executed.
  34.  *
  35.  *----------------------------------------------------------------------
  36.  */
  37. int
  38. Tcl_RecordAndEval(interp, cmd, flags)
  39.     Tcl_Interp *interp; /* Token for interpreter in which command
  40.  * will be executed. */
  41.     CONST char *cmd; /* Command to record. */
  42.     int flags; /* Additional flags.  TCL_NO_EVAL means
  43.  * only record: don't execute command.
  44.  * TCL_EVAL_GLOBAL means use Tcl_GlobalEval
  45.  * instead of Tcl_Eval. */
  46. {
  47.     register Tcl_Obj *cmdPtr;
  48.     int length = strlen(cmd);
  49.     int result;
  50.     if (length > 0) {
  51. /*
  52.  * Call Tcl_RecordAndEvalObj to do the actual work.
  53.  */
  54. cmdPtr = Tcl_NewStringObj(cmd, length);
  55. Tcl_IncrRefCount(cmdPtr);
  56. result = Tcl_RecordAndEvalObj(interp, cmdPtr, flags);
  57. /*
  58.  * Move the interpreter's object result to the string result, 
  59.  * then reset the object result.
  60.  */
  61. Tcl_SetResult(interp, TclGetString(Tcl_GetObjResult(interp)),
  62.         TCL_VOLATILE);
  63. /*
  64.  * Discard the Tcl object created to hold the command.
  65.  */
  66. Tcl_DecrRefCount(cmdPtr);
  67.     } else {
  68. /*
  69.  * An empty string. Just reset the interpreter's result.
  70.  */
  71. Tcl_ResetResult(interp);
  72. result = TCL_OK;
  73.     }
  74.     return result;
  75. }
  76. /*
  77.  *----------------------------------------------------------------------
  78.  *
  79.  * Tcl_RecordAndEvalObj --
  80.  *
  81.  * This procedure adds the command held in its argument object to the
  82.  * current list of recorded events and then executes the command by
  83.  * calling Tcl_EvalObj.
  84.  *
  85.  * Results:
  86.  * The return value is a standard Tcl return value, the result of
  87.  * executing the command.
  88.  *
  89.  * Side effects:
  90.  * The command is recorded and executed.
  91.  *
  92.  *----------------------------------------------------------------------
  93.  */
  94. int
  95. Tcl_RecordAndEvalObj(interp, cmdPtr, flags)
  96.     Tcl_Interp *interp; /* Token for interpreter in which command
  97.  * will be executed. */
  98.     Tcl_Obj *cmdPtr; /* Points to object holding the command to
  99.  * record and execute. */
  100.     int flags; /* Additional flags. TCL_NO_EVAL means
  101.  * record only: don't execute the command.
  102.  * TCL_EVAL_GLOBAL means evaluate the
  103.  * script in global variable context instead
  104.  * of the current procedure. */
  105. {
  106.     int result;
  107.     Tcl_Obj *list[3];
  108.     register Tcl_Obj *objPtr;
  109.     /*
  110.      * Do recording by eval'ing a tcl history command: history add $cmd.
  111.      */
  112.     list[0] = Tcl_NewStringObj("history", -1);
  113.     list[1] = Tcl_NewStringObj("add", -1);
  114.     list[2] = cmdPtr;
  115.     
  116.     objPtr = Tcl_NewListObj(3, list);
  117.     Tcl_IncrRefCount(objPtr);
  118.     (void) Tcl_EvalObjEx(interp, objPtr, TCL_EVAL_GLOBAL);
  119.     Tcl_DecrRefCount(objPtr);
  120.     /*
  121.      * Execute the command.
  122.      */
  123.     result = TCL_OK;
  124.     if (!(flags & TCL_NO_EVAL)) {
  125. result = Tcl_EvalObjEx(interp, cmdPtr, flags & TCL_EVAL_GLOBAL);
  126.     }
  127.     return result;
  128. }