Greetings, The Fedora project is moving from Tcl/Tk 8.6 to 9.0. The code in gcl-tk/tkMain.c needs a few adjustments for version 9.
- The Tcl_TildeSubst function is gone. In addition, Tcl/Tk functions no longer expand ~ by default. - The CONST macro has been removed, since ANSI compilers have been standard for multiple decades. - No prototype is provided for Tcl_AppInit() anymore. - The Tk_CreateFileHandler and TK_READABLE backwards compatibility macros have been removed due to the length of time for which the Tcl_CreateFileHandler and TCL_READABLE replacements have been available. The attached patch is my attempt at dealing with these changes, as follows: - Replace Tcl_TildeSubst with wordexp, defined in POSIX.1-2001. Caution: this does more than just tilde expansion. - Comment out the isatty and strrchr prototypes, as they are provided by unistd.h and string.h, respectively. - Add a prototype for Tcl_AppInit to gcl-tk/tkMain.c. - Use Tcl_CreateFileHandler and TCL_READABLE. With this patch, the code at least compiles. Whether it behaves correctly remains to be seen. Regards, -- Jerry James http://www.jamezone.org/
--- gcl-2.6.14/gcl-tk/tkMain.c.orig 2023-01-13 08:48:26.000000000 -0700 +++ gcl-2.6.14/gcl-tk/tkMain.c 2025-02-04 13:43:18.876253637 -0700 @@ -36,7 +36,9 @@ #include <stdlib.h> #include <tcl.h> #include <tk.h> - +#if TCL_MAJOR_VERSION >= 9 +#include <wordexp.h> +#endif #if (TK_MINOR_VERSION==0 && TK_MAJOR_VERSION==4) @@ -67,12 +69,12 @@ struct connection_state *dsfd; * file out of the Tk source directory to make their own modified versions). */ -/* extern void exit _ANSI_ARGS_((int status)); */ +/* extern void exit _ANSI_ARGS_((int status)); extern int isatty _ANSI_ARGS_((int fd)); -/* extern int read _ANSI_ARGS_((int fd, char *buf, size_t size)); -*/ extern char * strrchr _ANSI_ARGS_((CONST char *string, int c)); +*/ +extern int Tcl_AppInit(Tcl_Interp *interp); /* * Global variables used by the main program: @@ -331,11 +333,17 @@ TkX_Wish (argc, argv) */ if (tcl_RcFileName != NULL) { - Tcl_DString buffer; char *fullName; FILE *f; +#if TCL_MAJOR_VERSION >= 9 + wordexp_t exp_result; + wordexp(tcl_RcFileName, &exp_result, WRDE_NOCMD); + fullName = exp_result.we_wordv[0]; +#else + Tcl_DString buffer; fullName = Tcl_TildeSubst(interp, tcl_RcFileName, &buffer); +#endif if (fullName == NULL) { fprintf(stderr, "%s\n", INTERP_RESULT(interp)); } else { @@ -348,12 +356,16 @@ TkX_Wish (argc, argv) fclose(f); } } +#if TCL_MAJOR_VERSION >= 9 + wordfree(&exp_result); +#else Tcl_DStringFree(&buffer); +#endif } dfprintf(stderr, "guis : Creating file handler for %d\n", dsfd->fd); #ifndef __MINGW32__ - Tk_CreateFileHandler(dsfd->fd, TK_READABLE, StdinProc, (ClientData) 0); + Tcl_CreateFileHandler(dsfd->fd, TCL_READABLE, StdinProc, (ClientData) 0); #endif } fflush(stdout); @@ -466,7 +478,7 @@ StdinProc(clientData, mask) */ dfprintf(stderr, "\nguis : Disabling file handler for %d\n", dsfd->fd); -/* Tk_CreateFileHandler(dsfd->fd, 0, StdinProc, (ClientData) 0); */ +/* Tcl_CreateFileHandler(dsfd->fd, 0, StdinProc, (ClientData) 0); */ do { @@ -478,7 +490,7 @@ StdinProc(clientData, mask) /*dfprintf(stderr, "Yoo !!! Empty command\n"); */ if (debug)perror("zero message"); #ifndef __MINGW32__ - Tk_CreateFileHandler(dsfd->fd, TK_READABLE, StdinProc, (ClientData) 0); + Tcl_CreateFileHandler(dsfd->fd, TCL_READABLE, StdinProc, (ClientData) 0); #endif return; } @@ -580,7 +592,7 @@ StdinProc(clientData, mask) } while (fNotDone > 0); - /* Tk_CreateFileHandler(dsfd->fd, TK_READABLE, StdinProc, (ClientData) 0); */ + /* Tcl_CreateFileHandler(dsfd->fd, TCL_READABLE, StdinProc, (ClientData) 0); */ if ((void *)msg != (void *) buf) free ((void *) msg); }