]> granicus.if.org Git - graphviz/commitdiff
add changes for tcldot on Windows
authorellson <devnull@localhost>
Sat, 19 Nov 2005 22:08:14 +0000 (22:08 +0000)
committerellson <devnull@localhost>
Sat, 19 Nov 2005 22:08:14 +0000 (22:08 +0000)
Michael Schlenker <schlenk@uni-oldenburg.de>

tclpkg/gdtclft/gdtclft.c
tclpkg/tcldot/tcldot.c

index f749ff3a95ebd02bfd44e3fdcabecf9dfb4cc4ac..2f77f9da61fd2afd891dc39683cc792e1a344e9f 100644 (file)
@@ -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
index ca428f264de14cc9ff16e0646656a859d990465f..eb05b93315eda2e1baffd0b218513394392f4bd0 100644 (file)
@@ -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);
 }