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

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tclMacTest.c --
  3.  *
  4.  * Contains commands for platform specific tests for
  5.  * the Macintosh platform.
  6.  *
  7.  * Copyright (c) 1996 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.  * RCS: @(#) $Id: tclMacTest.c,v 1.6 2002/10/09 11:54:42 das Exp $
  13.  */
  14. #define TCL_TEST
  15. #define USE_COMPAT_CONST
  16. #include "tclInt.h"
  17. #include "tclMacInt.h"
  18. #include "tclMacPort.h"
  19. #include "Files.h"
  20. #include <Errors.h>
  21. #include <Resources.h>
  22. #include <Script.h>
  23. #include <Strings.h>
  24. #include <FSpCompat.h>
  25. /*
  26.  * Forward declarations of procedures defined later in this file:
  27.  */
  28. int TclplatformtestInit _ANSI_ARGS_((Tcl_Interp *interp));
  29. static int DebuggerCmd _ANSI_ARGS_((ClientData dummy,
  30.     Tcl_Interp *interp, int argc, CONST char **argv));
  31. static int WriteTextResource _ANSI_ARGS_((ClientData dummy,
  32.     Tcl_Interp *interp, int argc, CONST char **argv));
  33.     
  34. /*
  35.  *----------------------------------------------------------------------
  36.  *
  37.  * TclplatformtestInit --
  38.  *
  39.  * Defines commands that test platform specific functionality for
  40.  * Unix platforms.
  41.  *
  42.  * Results:
  43.  * A standard Tcl result.
  44.  *
  45.  * Side effects:
  46.  * Defines new commands.
  47.  *
  48.  *----------------------------------------------------------------------
  49.  */
  50. int
  51. TclplatformtestInit(
  52.     Tcl_Interp *interp) /* Interpreter to add commands to. */
  53. {
  54.     /*
  55.      * Add commands for platform specific tests on MacOS here.
  56.      */
  57.     
  58.     Tcl_CreateCommand(interp, "debugger", DebuggerCmd,
  59.             (ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
  60.     Tcl_CreateCommand(interp, "testWriteTextResource", WriteTextResource,
  61.             (ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
  62.     return TCL_OK;
  63. }
  64. /*
  65.  *----------------------------------------------------------------------
  66.  *
  67.  * DebuggerCmd --
  68.  *
  69.  * This procedure simply calls the low level debugger.
  70.  *
  71.  * Results:
  72.  * A standard Tcl result.
  73.  *
  74.  * Side effects:
  75.  * None.
  76.  *
  77.  *----------------------------------------------------------------------
  78.  */
  79. static int
  80. DebuggerCmd(
  81.     ClientData clientData, /* Not used. */
  82.     Tcl_Interp *interp, /* Not used. */
  83.     int argc, /* Not used. */
  84.     CONST char **argv) /* Not used. */
  85. {
  86.     Debugger();
  87.     return TCL_OK;
  88. }
  89. /*
  90.  *----------------------------------------------------------------------
  91.  *
  92.  * WriteTextResource --
  93.  *
  94.  * This procedure will write a text resource out to the 
  95.  * application or a given file.  The format for this command is
  96.  * textwriteresource 
  97.  *
  98.  * Results:
  99.  * A standard Tcl result.
  100.  *
  101.  * Side effects:
  102.  * None.
  103.  *
  104.  *----------------------------------------------------------------------
  105.  */
  106. static int
  107. WriteTextResource(
  108.     ClientData clientData, /* Not used. */
  109.     Tcl_Interp *interp, /* Current interpreter. */
  110.     int argc, /* Number of arguments. */
  111.     CONST char **argv) /* Argument strings. */
  112. {
  113.     char *errNum = "wrong # args: ";
  114.     char *errBad = "bad argument: ";
  115.     char *errStr;
  116.     CONST char *fileName = NULL, *rsrcName = NULL;
  117.     CONST char *data = NULL;
  118.     int rsrcID = -1, i, protectIt = 0;
  119.     short fileRef = -1;
  120.     OSErr err;
  121.     Handle dataHandle;
  122.     Str255 resourceName;
  123.     FSSpec fileSpec;
  124.     /*
  125.      * Process the arguments.
  126.      */
  127.     for (i = 1 ; i < argc ; i++) {
  128. if (!strcmp(argv[i], "-rsrc")) {
  129.     rsrcName = argv[i + 1];
  130.     i++;
  131. } else if (!strcmp(argv[i], "-rsrcid")) {
  132.     rsrcID = atoi(argv[i + 1]);
  133.     i++;
  134. } else if (!strcmp(argv[i], "-file")) {
  135.     fileName = argv[i + 1];
  136.     i++;
  137. } else if (!strcmp(argv[i], "-protected")) {
  138.     protectIt = 1;
  139. } else {
  140.     data = argv[i];
  141. }
  142.     }
  143.     if ((rsrcName == NULL && rsrcID < 0) ||
  144.     (fileName == NULL) || (data == NULL)) {
  145.      errStr = errBad;
  146.      goto sourceFmtErr;
  147.     }
  148.     /*
  149.      * Open the resource file.
  150.      */
  151.     err = FSpLocationFromPath(strlen(fileName), fileName, &fileSpec);
  152.     if (!(err == noErr || err == fnfErr)) {
  153. Tcl_AppendResult(interp, "couldn't validate file name", (char *) NULL);
  154. return TCL_ERROR;
  155.     }
  156.     
  157.     if (err == fnfErr) {
  158. FSpCreateResFile(&fileSpec, 'WIsH', 'rsrc', smSystemScript);
  159.     }
  160.     fileRef = FSpOpenResFile(&fileSpec, fsRdWrPerm);
  161.     if (fileRef == -1) {
  162. Tcl_AppendResult(interp, "couldn't open resource file", (char *) NULL);
  163. return TCL_ERROR;
  164.     }
  165.     UseResFile(fileRef);
  166.     /*
  167.      * Prepare data needed to create resource.
  168.      */
  169.     if (rsrcID < 0) {
  170. rsrcID = UniqueID('TEXT');
  171.     }
  172.     
  173.     strcpy((char *) resourceName, rsrcName);
  174.     c2pstr((char *) resourceName);
  175.     
  176.     dataHandle = NewHandle(strlen(data));
  177.     HLock(dataHandle);
  178.     strcpy(*dataHandle, data);
  179.     HUnlock(dataHandle);
  180.      
  181.     /*
  182.      * Add the resource to the file and close it.
  183.      */
  184.     AddResource(dataHandle, 'TEXT', rsrcID, resourceName);
  185.     
  186.     UpdateResFile(fileRef);
  187.     if (protectIt) {
  188.         SetResAttrs(Get1Resource('TEXT', rsrcID), resProtected);
  189.     }
  190.     
  191.     CloseResFile(fileRef);
  192.     return TCL_OK;
  193.     
  194.     sourceFmtErr:
  195.     Tcl_AppendResult(interp, errStr, "error in "", argv[0], """,
  196.     (char *) NULL);
  197.     return TCL_ERROR;
  198. }