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

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tclAppInit.c --
  3.  *
  4.  * Provides a default version of the Tcl_AppInit procedure.
  5.  *
  6.  * Copyright (c) 1993 The Regents of the University of California.
  7.  * Copyright (c) 1994 Sun Microsystems, Inc.
  8.  *
  9.  * See the file "license.terms" for information on usage and redistribution
  10.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  11.  */
  12. #ifndef lint
  13. /* static char sccsid[] = "@(#) tclAppInit.c 1.11 94/12/17 16:14:03"; */
  14. #endif /* not lint */
  15. #include <tcl.h>
  16. #include <otcl.h>
  17. #if TCL_MAJOR_VERSION < 7
  18.   #error Tcl distribution TOO OLD
  19. #endif
  20. #ifdef TESTCAPI
  21. #include <stdlib.h>
  22. #include <time.h>
  23. typedef struct {
  24.   time_t started;
  25.   int prior;
  26. } timerdata;
  27. #ifdef STATIC_LIB
  28. #include <tclWinInt.h>
  29. #include <stdlib.h>
  30. extern BOOL APIENTRY
  31. Tcl_LibMain(HINSTANCE hInstance,DWORD reason,LPVOID reserved);
  32. /* procedure to call before exiting to clean up */
  33. void static_exit(void){
  34. HINSTANCE hInstance=TclWinGetTclInstance();
  35. Tcl_LibMain(hInstance, DLL_PROCESS_DETACH, NULL);
  36. }
  37. #endif
  38. static int
  39. TimerInit(ClientData cd, Tcl_Interp* in, int argc, char*argv[]) {
  40.   struct OTclObject* timer = OTclAsObject(in, cd);
  41.   struct OTclClass* tcl = OTclGetClass(in, "Timer");
  42.   timerdata* data;
  43.   if (!timer || !tcl) return TCL_ERROR;
  44.   data = (timerdata*)ckalloc(sizeof(timerdata));
  45.   data->started = time(0);
  46.   data->prior = 0;
  47.   (void)OTclSetObjectData(timer, tcl, (ClientData)data);
  48.   if (!OTclSetInstVar(timer, in, "running", "0", TCL_LEAVE_ERR_MSG))
  49.     return TCL_ERROR;
  50.   return OTclNextMethod(timer, in, argc, argv);
  51. }
  52. static int
  53. TimerDestroy(ClientData cd, Tcl_Interp* in, int argc, char*argv[]) {
  54.   struct OTclObject* timer = OTclAsObject(in, cd);
  55.   struct OTclClass* tcl = OTclGetClass(in, "Timer");
  56.   timerdata* data;
  57.   if (!timer || !tcl) return TCL_ERROR;
  58.   if (!OTclGetObjectData(timer, tcl, (ClientData*)(&data))) return TCL_ERROR;
  59.   (void)OTclUnsetObjectData(timer, tcl);
  60.   ckfree(data);
  61.   return OTclNextMethod(timer, in, argc, argv);
  62. }
  63. static int
  64. TimerStart(ClientData cd, Tcl_Interp* in, int argc, char*argv[]) {
  65.   struct OTclObject* timer = OTclAsObject(in, cd);
  66.   struct OTclClass* tcl = OTclGetClass(in, "Timer");
  67.   timerdata* data;
  68.   if (!timer || !tcl || argc>5) return TCL_ERROR;
  69.   if (!OTclGetObjectData(timer, tcl, (ClientData*)(&data))) return TCL_ERROR;  
  70.   if (data->started == 0) data->started = time(0);
  71.   if (!OTclSetInstVar(timer, in, "running", "1", TCL_LEAVE_ERR_MSG))
  72.     return TCL_ERROR;  
  73.   return TCL_OK;
  74. }
  75. static int
  76. TimerRead(ClientData cd, Tcl_Interp* in, int argc, char*argv[]) {
  77.   struct OTclObject* timer = OTclAsObject(in, cd);
  78.   struct OTclClass* tcl = OTclGetClass(in, "Timer");
  79.   timerdata* data;
  80.   char val[20];
  81.   int total;
  82.   if (!timer || !tcl || argc>5) return TCL_ERROR;
  83.   if (!OTclGetObjectData(timer, tcl, (ClientData*)(&data))) return TCL_ERROR;
  84.   
  85.   total = data->prior;
  86.   if (data->started) total += (int)(time(0) - data->started);
  87.   (void)sprintf(val, "%d", total);
  88.   Tcl_SetResult(in, val, TCL_VOLATILE);
  89.   return TCL_OK;
  90. }
  91. static int
  92. TimerStop(ClientData cd, Tcl_Interp* in, int argc, char*argv[]) {
  93.   struct OTclObject* timer = OTclAsObject(in, cd);
  94.   struct OTclClass* tcl = OTclGetClass(in, "Timer");
  95.   timerdata* data;
  96.   if (!timer || !tcl || argc>5) return TCL_ERROR;
  97.   if (!OTclGetObjectData(timer, tcl, (ClientData*)(&data))) return TCL_ERROR;
  98.   if (data->started != 0) {
  99.     data->prior += (int)(time(0) - data->started);
  100.     data->started = 0;
  101.   }
  102.   return TCL_OK;
  103. }
  104. static int
  105. TestCAPI_Init(Tcl_Interp* in) {
  106.   struct OTclClass* class = OTclGetClass(in, "Class");
  107.   struct OTclClass* object = OTclGetClass(in, "Object");
  108.   struct OTclClass* timer;
  109.   struct OTclObject* dawn;
  110.  
  111.   if (!class || !object) return TCL_ERROR;
  112.   timer = OTclCreateClass(in, "Timer", class);
  113.   if (!timer) return TCL_ERROR;
  114.   OTclAddIMethod(timer, "start", TimerStart, 0, 0);
  115.   OTclAddIMethod(timer, "read", TimerRead, 0, 0);
  116.   OTclAddIMethod(timer, "stop", TimerStop, 0, 0);
  117.   OTclAddIMethod(timer, "init", TimerInit, 0, 0);
  118.   OTclAddIMethod(timer, "destroy", TimerDestroy, 0, 0);
  119.   dawn = OTclCreateObject(in, "dawnoftime", timer);
  120.   if (!dawn) return TCL_ERROR;
  121.   if (Tcl_Eval(in, "dawnoftime start") != TCL_OK) return TCL_ERROR;
  122.   return TCL_OK;
  123. }
  124. #endif
  125. /*
  126.  * The following variable is a special hack that is needed in order for
  127.  * Sun shared libraries to be used for Tcl.
  128.  */
  129. #ifdef NEED_MATHERR
  130. extern int matherr();
  131. int *tclDummyMathPtr = (int *) matherr;
  132. #endif
  133. /*
  134.  *----------------------------------------------------------------------
  135.  *
  136.  * main --
  137.  *
  138.  * This is the main program for the application.
  139.  *
  140.  * Results:
  141.  * None: Tcl_Main never returns here, so this procedure never
  142.  * returns either.
  143.  *
  144.  * Side effects:
  145.  * Whatever the application does.
  146.  *
  147.  *----------------------------------------------------------------------
  148.  */
  149. #if TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION < 4
  150. extern int main();
  151. int *tclDummyMainPtr = (int *) main;
  152. #else
  153. int
  154. main(argc, argv)
  155.     int argc; /* Number of command-line arguments. */
  156.     char **argv; /* Values of command-line arguments. */
  157. {
  158. #ifdef STATIC_LIB
  159.     HINSTANCE hInstance=GetModuleInstance(NULL);
  160.     Tcl_LibMain(hInstance, DLL_PROCESS_ATTACH, NULL);
  161.     atexit(static_exit);
  162. #endif
  163.     Tcl_Main(argc, argv, Tcl_AppInit);
  164.     return 0; /* Needed only to prevent compiler warning. */
  165. }
  166. #endif
  167. /*
  168.  *----------------------------------------------------------------------
  169.  *
  170.  * Tcl_AppInit --
  171.  *
  172.  * This procedure performs application-specific initialization.
  173.  * Most applications, especially those that incorporate additional
  174.  * packages, will have their own version of this procedure.
  175.  *
  176.  * Results:
  177.  * Returns a standard Tcl completion code, and leaves an error
  178.  * message in interp->result if an error occurs.
  179.  *
  180.  * Side effects:
  181.  * Depends on the startup script.
  182.  *
  183.  *----------------------------------------------------------------------
  184.  */
  185. int
  186. Tcl_AppInit(interp)
  187.     Tcl_Interp *interp; /* Interpreter for application. */
  188. {
  189.     if (Tcl_Init(interp) == TCL_ERROR) {
  190. return TCL_ERROR;
  191.     }
  192.     if (Otcl_Init(interp) == TCL_ERROR) {
  193.       return TCL_ERROR;
  194.     }
  195. #ifdef TESTCAPI
  196.     if (TestCAPI_Init(interp) == TCL_ERROR) {
  197.       return TCL_ERROR;
  198.     }
  199. #endif
  200. #if TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION < 5
  201.     tcl_RcFileName = "~/.tclshrc";
  202. #else
  203.     Tcl_SetVar(interp, "tcl_rcFileName", "~/.tclshrc", TCL_GLOBAL_ONLY);
  204. #endif
  205.      return TCL_OK;
  206. }