From: ellson Date: Sat, 19 Nov 2005 22:08:14 +0000 (+0000) Subject: add changes for tcldot on Windows X-Git-Tag: LAST_LIBGRAPH~32^2~6957 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7cdb8dbe5fa414e72502484c368718a05209e3bc;p=graphviz add changes for tcldot on Windows Michael Schlenker --- diff --git a/tclpkg/gdtclft/gdtclft.c b/tclpkg/gdtclft/gdtclft.c index f749ff3a9..2f77f9da6 100644 --- a/tclpkg/gdtclft/gdtclft.c +++ b/tclpkg/gdtclft/gdtclft.c @@ -498,10 +498,11 @@ tclGdCreateCmd(Tcl_Interp * interp, GdData * gdData, int w, h; unsigned long idx; gdImagePtr im = NULL; - FILE *filePtr; + FILE *filePtr = NULL; ClientData clientdata; char *cmd, buf[50]; - int fileByName; + Tcl_Channel chan; + int fileByName, mode; cmd = Tcl_GetString(objv[1]); if (strcmp(cmd, "create") == 0) { @@ -517,14 +518,17 @@ tclGdCreateCmd(Tcl_Interp * interp, GdData * gdData, } } else { fileByName = 0; /* first try to get file from open channel */ - if (Tcl_GetOpenFile - (interp, Tcl_GetString(objv[2]), 0, 1, - &clientdata) == TCL_OK) { - filePtr = (FILE *) clientdata; + if ((chan = Tcl_GetChannel(interp,Tcl_GetString(objv[2]),&mode)) != NULL) { + if (!strncmp(Tcl_ChannelName(Tcl_GetChannelType(chan)),"file",4)) { + Tcl_AppendResult(interp, "Bad channel: \"", Tcl_GetString(objv[2]), + "\". Not a file.", (char *)NULL); + return TCL_ERROR; + } + if (Tcl_GetChannelHandle(chan,TCL_READABLE, &clientdata) == TCL_OK) { + filePtr = (FILE *) clientdata; + } } else { - /* Not a channel, or Tcl_GetOpenFile() not supported. - * See if we can open directly. - */ + /* Not a channel. See if we can open directly. */ fileByName++; if ((filePtr = fopen(Tcl_GetString(objv[2]), "rb")) == NULL) { return TCL_ERROR; @@ -602,7 +606,8 @@ tclGdWriteCmd(Tcl_Interp * interp, GdData * gdData, int argc, FILE *filePtr; ClientData clientdata; char *cmd; - int fileByName; + Tcl_Channel chan; + int fileByName, mode; cmd = Tcl_GetString(objv[1]); /* Get the image pointer. */ @@ -611,9 +616,22 @@ tclGdWriteCmd(Tcl_Interp * interp, GdData * gdData, int argc, /* Get the file reference. */ fileByName = 0; /* first try to get file from open channel */ - if (Tcl_GetOpenFile(interp, Tcl_GetString(objv[3]), 1, 1, &clientdata) - == TCL_OK) { - filePtr = (FILE *) clientdata; + if ((chan = Tcl_GetChannel(interp,Tcl_GetString(objv[2]),&mode)) != NULL) { + if (!strncmp(Tcl_ChannelName(Tcl_GetChannelType(chan)),"file",4)) { + Tcl_AppendResult(interp, "Bad channel: \"", Tcl_GetString(objv[2]), + "\". Not a file.", (char *)NULL); + return TCL_ERROR; + } + if (!(mode & TCL_WRITABLE)) { + Tcl_AppendResult(interp, "Bad channel: \"", Tcl_GetString(objv[2]), + "\". Not writeable.", (char *)NULL); + return TCL_ERROR; + } + if (Tcl_GetChannelHandle(chan,TCL_WRITABLE, &clientdata) == TCL_OK) { + filePtr = (FILE *) clientdata; + } else { + return TCL_ERROR; + } } else { /* Not a channel, or Tcl_GetOpenFile() not supported. * See if we can open directly. @@ -1351,7 +1369,10 @@ tclGdTextCmd(Tcl_Interp * interp, GdData * gdData, int Gdtclft_Init(Tcl_Interp * interp) #else #ifdef __WIN32__ -EXPORT(int, Gdtclft_Init) (interp) +__declspec(dllexport) int Gdtclft_Init(Tcl_Interp *interp) +/* +EXPORT(Gdtclft_Init) (interp) +*/ #else int Gdtclft_Init(Tcl_Interp * interp) #endif @@ -1389,7 +1410,10 @@ int Gdtclft_Init(Tcl_Interp * interp) int Gdtclft_SafeInit(Tcl_Interp * interp) #else #ifdef __WIN32__ +__declspec(dllexport) int Gdtclft_Init(Tcl_Interp *interp) +/* EXPORT(int, Gdtclft_SafeInit) (interp) +*/ #else int Gdtclft_SafeInit(Tcl_Interp * interp) #endif diff --git a/tclpkg/tcldot/tcldot.c b/tclpkg/tcldot/tcldot.c index ca428f264..eb05b9331 100644 --- a/tclpkg/tcldot/tcldot.c +++ b/tclpkg/tcldot/tcldot.c @@ -614,7 +614,8 @@ static int graphcmd(ClientData clientData, Tcl_Interp * interp, Agedge_t **ep, *e; Agsym_t *a; char c, buf[256], **argv2; - int i, j, length, argc2, rc; + int i, j, length, argc2, rc, chanmode; + Tcl_Channel chan; unsigned long id; GVC_t *gvc = (GVC_t *) clientData; @@ -1260,9 +1261,33 @@ static int graphcmd(ClientData clientData, Tcl_Interp * interp, gvc->job->output_lang = gvrender_select(gvc->job, gvc->job->output_langname); + /* NEW CODE: Use new Tcl_Channel based API */ + chanmode = 0; + chan = Tcl_GetChannel(interp,argv[2],&chanmode); + if (chan == NULL) { + Tcl_AppendResult(interp, "Bad channel: \"", argv[2], + "\"", (char *)NULL); + return TCL_ERROR; + } + if (!(chanmode & TCL_WRITABLE)) { + Tcl_AppendResult(interp, "Bad channel: \"", argv[2], + "\". Not writeable.", (char *)NULL); + return TCL_ERROR; + } + if (!strncmp(Tcl_ChannelName(Tcl_GetChannelType(chan)),"file",4)) { + Tcl_AppendResult(interp, "Bad channel: \"", argv[2], + "\". Not a file.", (char *)NULL); + return TCL_ERROR; + } + if (Tcl_GetChannelHandle(chan,TCL_WRITABLE, + (ClientData*) &(gvc->job->output_file)) != TCL_OK) + return TCL_ERROR; + + /* OLD UNIX only code if (Tcl_GetOpenFile (interp, argv[2], 1, 1, (ClientData *) &(gvc->job->output_file)) != TCL_OK) return TCL_ERROR; + */ /* make sure that layout is done - unless canonical output */ if ((!GD_drawing(g) || argc > 4) @@ -1622,7 +1647,11 @@ static int dotstring(ClientData clientData, Tcl_Interp * interp, #if defined(_BLD_tcldot) && defined(_DLL) __EXPORT__ #endif +#ifdef __WIN32__ +__declspec(dllexport) int Tcldot_Init(Tcl_Interp * interp) +#else int Tcldot_Init(Tcl_Interp * interp) +#endif { GVC_t *gvc; #ifndef DISABLE_CODEGENS @@ -1683,7 +1712,11 @@ int Tcldot_Init(Tcl_Interp * interp) return TCL_OK; } +#ifdef __WIN32__ +__declspec(dllexport) int Tcldot_SafeInit(Tcl_Interp * interp) +#else int Tcldot_SafeInit(Tcl_Interp * interp) +#endif { return Tcldot_Init(interp); }