236 lines
5.4 KiB
C
236 lines
5.4 KiB
C
/*
|
||
* tclMacTest.c --
|
||
*
|
||
* Contains commands for platform specific tests for
|
||
* the Macintosh platform.
|
||
*
|
||
* Copyright (c) 1996 Sun Microsystems, Inc.
|
||
*
|
||
* See the file "license.terms" for information on usage and redistribution
|
||
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||
*
|
||
* SCCS: @(#) tclMacTest.c 1.6 96/10/03 14:43:25
|
||
*/
|
||
|
||
#define TCL_TEST
|
||
|
||
#include "tclInt.h"
|
||
#include "tclMacInt.h"
|
||
#include "tclMacPort.h"
|
||
#include "Files.h"
|
||
#include <Errors.h>
|
||
#include <Resources.h>
|
||
#include <Script.h>
|
||
#include <Strings.h>
|
||
#include <FSpCompat.h>
|
||
|
||
/*
|
||
* Forward declarations of procedures defined later in this file:
|
||
*/
|
||
|
||
int TclplatformtestInit _ANSI_ARGS_((Tcl_Interp *interp));
|
||
static int DebuggerCmd _ANSI_ARGS_((ClientData dummy,
|
||
Tcl_Interp *interp, int argc, char **argv));
|
||
static int WriteTextResource _ANSI_ARGS_((ClientData dummy,
|
||
Tcl_Interp *interp, int argc, char **argv));
|
||
|
||
|
||
/*
|
||
*----------------------------------------------------------------------
|
||
*
|
||
* TclplatformtestInit --
|
||
*
|
||
* Defines commands that test platform specific functionality for
|
||
* Unix platforms.
|
||
*
|
||
* Results:
|
||
* A standard Tcl result.
|
||
*
|
||
* Side effects:
|
||
* Defines new commands.
|
||
*
|
||
*----------------------------------------------------------------------
|
||
*/
|
||
|
||
int
|
||
TclplatformtestInit(interp)
|
||
Tcl_Interp *interp; /* Interpreter to add commands to. */
|
||
{
|
||
/*
|
||
* Add commands for platform specific tests on MacOS here.
|
||
*/
|
||
|
||
Tcl_CreateCommand(interp, "debugger", DebuggerCmd,
|
||
(ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
|
||
Tcl_CreateCommand(interp, "testWriteTextResource", WriteTextResource,
|
||
(ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
|
||
|
||
return TCL_OK;
|
||
}
|
||
|
||
/*
|
||
*----------------------------------------------------------------------
|
||
*
|
||
* DebuggerCmd --
|
||
*
|
||
* This procedure simply calls the low level debugger.
|
||
*
|
||
* Results:
|
||
* A standard Tcl result.
|
||
*
|
||
* Side effects:
|
||
* None.
|
||
*
|
||
*----------------------------------------------------------------------
|
||
*/
|
||
|
||
static int
|
||
DebuggerCmd(clientData, interp, argc, argv)
|
||
ClientData clientData; /* Not used. */
|
||
Tcl_Interp *interp; /* Not used. */
|
||
int argc; /* Not used. */
|
||
char **argv; /* Not used. */
|
||
{
|
||
Debugger();
|
||
return TCL_OK;
|
||
}
|
||
|
||
/*
|
||
*----------------------------------------------------------------------
|
||
*
|
||
* WriteTextResource --
|
||
*
|
||
* This procedure will write a text resource out to the
|
||
* application or a given file. The format for this command is
|
||
* textwriteresource
|
||
*
|
||
* Results:
|
||
* A standard Tcl result.
|
||
*
|
||
* Side effects:
|
||
* None.
|
||
*
|
||
*----------------------------------------------------------------------
|
||
*/
|
||
|
||
static int
|
||
WriteTextResource(clientData, interp, argc, argv)
|
||
ClientData clientData; /* Not used. */
|
||
Tcl_Interp *interp; /* Current interpreter. */
|
||
int argc; /* Number of arguments. */
|
||
char **argv; /* Argument strings. */
|
||
{
|
||
char *errNum = "wrong # args: ";
|
||
char *errBad = "bad argument: ";
|
||
char *errStr;
|
||
char *fileName = NULL, *rsrcName = NULL;
|
||
char *data = NULL;
|
||
int rsrcID = -1, i;
|
||
short fileRef = -1;
|
||
OSErr err;
|
||
Handle dataHandle;
|
||
Str255 resourceName;
|
||
FSSpec fileSpec;
|
||
|
||
/*
|
||
* Process the arguments.
|
||
*/
|
||
for (i = 1 ; i < argc ; i++) {
|
||
if (!strcmp(argv[i], "-rsrc")) {
|
||
rsrcName = argv[i + 1];
|
||
i++;
|
||
} else if (!strcmp(argv[i], "-rsrcid")) {
|
||
rsrcID = atoi(argv[i + 1]);
|
||
i++;
|
||
} else if (!strcmp(argv[i], "-file")) {
|
||
fileName = argv[i + 1];
|
||
i++;
|
||
} else {
|
||
data = argv[i];
|
||
}
|
||
}
|
||
|
||
if ((rsrcName == NULL && rsrcID < 0) ||
|
||
(fileName == NULL) || (data == NULL)) {
|
||
errStr = errBad;
|
||
goto sourceFmtErr;
|
||
}
|
||
|
||
/*
|
||
* Open the resource file.
|
||
*/
|
||
err = FSpLocationFromPath(strlen(fileName), fileName, &fileSpec);
|
||
if (!(err == noErr || err == fnfErr)) {
|
||
Tcl_AppendResult(interp, "couldn't validate file name", (char *) NULL);
|
||
return TCL_ERROR;
|
||
}
|
||
|
||
if (err == fnfErr) {
|
||
FSpCreateResFile(&fileSpec, 'WIsH', 'rsrc', smSystemScript);
|
||
}
|
||
fileRef = FSpOpenResFileCompat(&fileSpec, fsRdWrPerm);
|
||
if (fileRef == -1) {
|
||
Tcl_AppendResult(interp, "couldn't open resource file", (char *) NULL);
|
||
return TCL_ERROR;
|
||
}
|
||
|
||
UseResFile(fileRef);
|
||
|
||
/*
|
||
* Prepare data needed to create resource.
|
||
*/
|
||
if (rsrcID < 0) {
|
||
rsrcID = UniqueID('TEXT');
|
||
}
|
||
|
||
strcpy((char *) resourceName, rsrcName);
|
||
c2pstr((char *) resourceName);
|
||
|
||
dataHandle = NewHandle(strlen(data) + 1);
|
||
HLock(dataHandle);
|
||
strcpy(*dataHandle, data);
|
||
HUnlock(dataHandle);
|
||
|
||
/*
|
||
* Add the resource to the file and close it.
|
||
*/
|
||
AddResource(dataHandle, 'TEXT', rsrcID, resourceName);
|
||
UpdateResFile(fileRef);
|
||
CloseResFile(fileRef);
|
||
return TCL_OK;
|
||
|
||
sourceFmtErr:
|
||
Tcl_AppendResult(interp, errStr, "error in \"", argv[0], "\"",
|
||
(char *) NULL);
|
||
return TCL_ERROR;
|
||
}
|
||
|
||
int
|
||
TclMacChmod(
|
||
char *path,
|
||
int mode)
|
||
{
|
||
HParamBlockRec hpb;
|
||
OSErr err;
|
||
|
||
c2pstr(path);
|
||
hpb.fileParam.ioNamePtr = (unsigned char *) path;
|
||
hpb.fileParam.ioVRefNum = 0;
|
||
hpb.fileParam.ioDirID = 0;
|
||
|
||
if (mode & 0200) {
|
||
err = PBHRstFLockSync(&hpb);
|
||
} else {
|
||
err = PBHSetFLockSync(&hpb);
|
||
}
|
||
p2cstr((unsigned char *) path);
|
||
|
||
if (err != noErr) {
|
||
errno = TclMacOSErrorToPosixError(err);
|
||
return -1;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|