Fossil SCM

merge fork

jan.nijtmans 2013-09-16 07:26 trunk merge
Commit fea040240f513450fd1671ac64cdc54ae6bbb0a3
3 files changed +1 -1 +1 +40 -8
+1 -1
--- auto.def
+++ auto.def
@@ -6,11 +6,11 @@
66
with-openssl:path|auto|none
77
=> {Look for openssl in the given path, or auto or none}
88
with-zlib:path => {Look for zlib in the given path}
99
with-tcl:path => {Enable Tcl integration, with Tcl in the specified path}
1010
with-tcl-stubs=0 => {Enable Tcl integration via stubs mechanism}
11
- internal-sqlite=1 => {Don't use the internal sqlite, use the system one}
11
+ internal-sqlite=1 => {Don't use the internal SQLite, use the system one}
1212
static=0 => {Link a static executable}
1313
lineedit=1 => {Disable line editing}
1414
fossil-debug=0 => {Build with fossil debugging enabled}
1515
json=0 => {Build with fossil JSON API enabled}
1616
}
1717
--- auto.def
+++ auto.def
@@ -6,11 +6,11 @@
6 with-openssl:path|auto|none
7 => {Look for openssl in the given path, or auto or none}
8 with-zlib:path => {Look for zlib in the given path}
9 with-tcl:path => {Enable Tcl integration, with Tcl in the specified path}
10 with-tcl-stubs=0 => {Enable Tcl integration via stubs mechanism}
11 internal-sqlite=1 => {Don't use the internal sqlite, use the system one}
12 static=0 => {Link a static executable}
13 lineedit=1 => {Disable line editing}
14 fossil-debug=0 => {Build with fossil debugging enabled}
15 json=0 => {Build with fossil JSON API enabled}
16 }
17
--- auto.def
+++ auto.def
@@ -6,11 +6,11 @@
6 with-openssl:path|auto|none
7 => {Look for openssl in the given path, or auto or none}
8 with-zlib:path => {Look for zlib in the given path}
9 with-tcl:path => {Enable Tcl integration, with Tcl in the specified path}
10 with-tcl-stubs=0 => {Enable Tcl integration via stubs mechanism}
11 internal-sqlite=1 => {Don't use the internal SQLite, use the system one}
12 static=0 => {Link a static executable}
13 lineedit=1 => {Disable line editing}
14 fossil-debug=0 => {Build with fossil debugging enabled}
15 json=0 => {Build with fossil JSON API enabled}
16 }
17
+1
--- src/main.c
+++ src/main.c
@@ -99,10 +99,11 @@
9999
int argc; /* Number of original (expanded) arguments. */
100100
char **argv; /* Full copy of the original (expanded) arguments. */
101101
void *library; /* The Tcl library module handle. */
102102
void *xFindExecutable; /* See tcl_FindExecutableProc in th_tcl.c. */
103103
void *xCreateInterp; /* See tcl_CreateInterpProc in th_tcl.c. */
104
+ void *xDeleteInterp; /* See tcl_DeleteInterpProc in th_tcl.c. */
104105
Tcl_Interp *interp; /* The on-demand created Tcl interpreter. */
105106
char *setup; /* The optional Tcl setup script. */
106107
void *xPreEval; /* Optional, called before Tcl_Eval*(). */
107108
void *pPreContext; /* Optional, provided to xPreEval(). */
108109
void *xPostEval; /* Optional, called after Tcl_Eval*(). */
109110
--- src/main.c
+++ src/main.c
@@ -99,10 +99,11 @@
99 int argc; /* Number of original (expanded) arguments. */
100 char **argv; /* Full copy of the original (expanded) arguments. */
101 void *library; /* The Tcl library module handle. */
102 void *xFindExecutable; /* See tcl_FindExecutableProc in th_tcl.c. */
103 void *xCreateInterp; /* See tcl_CreateInterpProc in th_tcl.c. */
 
104 Tcl_Interp *interp; /* The on-demand created Tcl interpreter. */
105 char *setup; /* The optional Tcl setup script. */
106 void *xPreEval; /* Optional, called before Tcl_Eval*(). */
107 void *pPreContext; /* Optional, provided to xPreEval(). */
108 void *xPostEval; /* Optional, called after Tcl_Eval*(). */
109
--- src/main.c
+++ src/main.c
@@ -99,10 +99,11 @@
99 int argc; /* Number of original (expanded) arguments. */
100 char **argv; /* Full copy of the original (expanded) arguments. */
101 void *library; /* The Tcl library module handle. */
102 void *xFindExecutable; /* See tcl_FindExecutableProc in th_tcl.c. */
103 void *xCreateInterp; /* See tcl_CreateInterpProc in th_tcl.c. */
104 void *xDeleteInterp; /* See tcl_DeleteInterpProc in th_tcl.c. */
105 Tcl_Interp *interp; /* The on-demand created Tcl interpreter. */
106 char *setup; /* The optional Tcl setup script. */
107 void *xPreEval; /* Optional, called before Tcl_Eval*(). */
108 void *pPreContext; /* Optional, provided to xPreEval(). */
109 void *xPostEval; /* Optional, called after Tcl_Eval*(). */
110
+40 -8
--- src/th_tcl.c
+++ src/th_tcl.c
@@ -119,21 +119,27 @@
119119
# define TCL_FINDEXECUTABLE_NAME "_Tcl_FindExecutable"
120120
# endif
121121
# ifndef TCL_CREATEINTERP_NAME
122122
# define TCL_CREATEINTERP_NAME "_Tcl_CreateInterp"
123123
# endif
124
+# ifndef TCL_DELETEINTERP_NAME
125
+# define TCL_DELETEINTERP_NAME "_Tcl_DeleteInterp"
126
+# endif
124127
#endif /* defined(USE_TCL_STUBS) */
125128
126129
/*
127130
** The function types for Tcl_FindExecutable and Tcl_CreateInterp are needed
128131
** when the Tcl library is being loaded dynamically by a stubs-enabled
129132
** application (i.e. the inverse of using a stubs-enabled package). These are
130133
** the only Tcl API functions that MUST be called prior to being able to call
131
-** Tcl_InitStubs (i.e. because it requires a Tcl interpreter).
134
+** Tcl_InitStubs (i.e. because it requires a Tcl interpreter). For complete
135
+** cleanup if the Tcl stubs initialization fails somehow, the Tcl_DeleteInterp
136
+** function type is also required.
132137
*/
133138
typedef void (tcl_FindExecutableProc) (const char * argv0);
134139
typedef Tcl_Interp *(tcl_CreateInterpProc) (void);
140
+typedef void (tcl_DeleteInterpProc) (Tcl_Interp *interp);
135141
136142
/*
137143
** The function types for the "hook" functions to be called before and after a
138144
** TH1 command makes a call to evaluate a Tcl script. If the "pre" function
139145
** returns anything but TH_OK, then evaluation of the Tcl script is skipped and
@@ -189,10 +195,11 @@
189195
int argc; /* Number of original arguments. */
190196
char **argv; /* Full copy of the original arguments. */
191197
void *library; /* The Tcl library module handle. */
192198
tcl_FindExecutableProc *xFindExecutable; /* Tcl_FindExecutable() pointer. */
193199
tcl_CreateInterpProc *xCreateInterp; /* Tcl_CreateInterp() pointer. */
200
+ tcl_DeleteInterpProc *xDeleteInterp; /* Tcl_DeleteInterp() pointer. */
194201
Tcl_Interp *interp; /* The on-demand created Tcl interpreter. */
195202
char *setup; /* The optional Tcl setup script. */
196203
tcl_NotifyProc *xPreEval; /* Optional, called before Tcl_Eval*(). */
197204
void *pPreContext; /* Optional, provided to xPreEval(). */
198205
tcl_NotifyProc *xPostEval; /* Optional, called after Tcl_Eval*(). */
@@ -526,11 +533,12 @@
526533
*/
527534
static int loadTcl(
528535
Th_Interp *interp,
529536
void **pLibrary,
530537
tcl_FindExecutableProc **pxFindExecutable,
531
- tcl_CreateInterpProc **pxCreateInterp
538
+ tcl_CreateInterpProc **pxCreateInterp,
539
+ tcl_DeleteInterpProc **pxDeleteInterp
532540
){
533541
#if defined(USE_TCL_STUBS)
534542
char fileName[] = TCL_LIBRARY_NAME;
535543
#endif
536544
if( !pLibrary || !pxFindExecutable || !pxCreateInterp ){
@@ -542,10 +550,11 @@
542550
do {
543551
void *library = dlopen(fileName, RTLD_NOW | RTLD_GLOBAL);
544552
if( library ){
545553
tcl_FindExecutableProc *xFindExecutable;
546554
tcl_CreateInterpProc *xCreateInterp;
555
+ tcl_DeleteInterpProc *xDeleteInterp;
547556
const char *procName = TCL_FINDEXECUTABLE_NAME;
548557
xFindExecutable = (tcl_FindExecutableProc *)dlsym(library, procName + 1);
549558
if( !xFindExecutable ){
550559
xFindExecutable = (tcl_FindExecutableProc *)dlsym(library, procName);
551560
}
@@ -563,14 +572,26 @@
563572
if( !xCreateInterp ){
564573
Th_ErrorMessage(interp,
565574
"could not locate Tcl_CreateInterp", (const char *)"", 0);
566575
dlclose(library);
567576
return TH_ERROR;
577
+ }
578
+ procName = TCL_DELETEINTERP_NAME;
579
+ xDeleteInterp = (tcl_DeleteInterpProc *)dlsym(library, procName + 1);
580
+ if( !xDeleteInterp ){
581
+ xDeleteInterp = (tcl_DeleteInterpProc *)dlsym(library, procName);
582
+ }
583
+ if( !xDeleteInterp ){
584
+ Th_ErrorMessage(interp,
585
+ "could not locate Tcl_DeleteInterp", (const char *)"", 0);
586
+ dlclose(library);
587
+ return TH_ERROR;
568588
}
569589
*pLibrary = library;
570590
*pxFindExecutable = xFindExecutable;
571591
*pxCreateInterp = xCreateInterp;
592
+ *pxDeleteInterp = xDeleteInterp;
572593
return TH_OK;
573594
}
574595
} while( --fileName[TCL_MINOR_OFFSET]>'3' ); /* Tcl 8.4+ */
575596
Th_ErrorMessage(interp,
576597
"could not load Tcl shared library \"" TCL_LIBRARY_NAME "\"",
@@ -578,10 +599,11 @@
578599
return TH_ERROR;
579600
#else
580601
*pLibrary = 0;
581602
*pxFindExecutable = Tcl_FindExecutable;
582603
*pxCreateInterp = Tcl_CreateInterp;
604
+ *pxDeleteInterp = Tcl_DeleteInterp;
583605
return TH_OK;
584606
#endif
585607
}
586608
587609
/*
@@ -663,28 +685,38 @@
663685
}
664686
if ( tclContext->interp ){
665687
return TH_OK;
666688
}
667689
if( loadTcl(interp, &tclContext->library, &tclContext->xFindExecutable,
668
- &tclContext->xCreateInterp)!=TH_OK ){
690
+ &tclContext->xCreateInterp, &tclContext->xDeleteInterp)!=TH_OK ){
669691
return TH_ERROR;
670692
}
671693
argc = tclContext->argc;
672694
argv = tclContext->argv;
673695
if( argc>0 && argv ){
674696
argv0 = argv[0];
675697
}
676698
tclContext->xFindExecutable(argv0);
677699
tclInterp = tclContext->xCreateInterp();
678
- if( !tclInterp ||
679
-#if defined(USE_TCL_STUBS)
680
- !Tcl_InitStubs(tclInterp, "8.4", 0) ||
681
-#endif
682
- Tcl_InterpDeleted(tclInterp) ){
700
+ if( !tclInterp ){
683701
Th_ErrorMessage(interp,
684702
"could not create Tcl interpreter", (const char *)"", 0);
685703
return TH_ERROR;
704
+ }
705
+#if defined(USE_TCL_STUBS)
706
+ if( !Tcl_InitStubs(tclInterp, "8.4", 0) ){
707
+ Th_ErrorMessage(interp,
708
+ "could not initialize Tcl stubs", (const char *)"", 0);
709
+ tclContext->xDeleteInterp(tclInterp);
710
+ return TH_ERROR;
711
+ }
712
+#endif
713
+ if( Tcl_InterpDeleted(tclInterp) ){
714
+ Th_ErrorMessage(interp,
715
+ "Tcl interpreter appears to be deleted", (const char *)"", 0);
716
+ tclContext->xDeleteInterp(tclInterp); /* TODO: Redundant? */
717
+ return TH_ERROR;
686718
}
687719
tclContext->interp = tclInterp;
688720
if( Tcl_Init(tclInterp)!=TCL_OK ){
689721
Th_ErrorMessage(interp,
690722
"Tcl initialization error:", Tcl_GetStringResult(tclInterp), -1);
691723
--- src/th_tcl.c
+++ src/th_tcl.c
@@ -119,21 +119,27 @@
119 # define TCL_FINDEXECUTABLE_NAME "_Tcl_FindExecutable"
120 # endif
121 # ifndef TCL_CREATEINTERP_NAME
122 # define TCL_CREATEINTERP_NAME "_Tcl_CreateInterp"
123 # endif
 
 
 
124 #endif /* defined(USE_TCL_STUBS) */
125
126 /*
127 ** The function types for Tcl_FindExecutable and Tcl_CreateInterp are needed
128 ** when the Tcl library is being loaded dynamically by a stubs-enabled
129 ** application (i.e. the inverse of using a stubs-enabled package). These are
130 ** the only Tcl API functions that MUST be called prior to being able to call
131 ** Tcl_InitStubs (i.e. because it requires a Tcl interpreter).
 
 
132 */
133 typedef void (tcl_FindExecutableProc) (const char * argv0);
134 typedef Tcl_Interp *(tcl_CreateInterpProc) (void);
 
135
136 /*
137 ** The function types for the "hook" functions to be called before and after a
138 ** TH1 command makes a call to evaluate a Tcl script. If the "pre" function
139 ** returns anything but TH_OK, then evaluation of the Tcl script is skipped and
@@ -189,10 +195,11 @@
189 int argc; /* Number of original arguments. */
190 char **argv; /* Full copy of the original arguments. */
191 void *library; /* The Tcl library module handle. */
192 tcl_FindExecutableProc *xFindExecutable; /* Tcl_FindExecutable() pointer. */
193 tcl_CreateInterpProc *xCreateInterp; /* Tcl_CreateInterp() pointer. */
 
194 Tcl_Interp *interp; /* The on-demand created Tcl interpreter. */
195 char *setup; /* The optional Tcl setup script. */
196 tcl_NotifyProc *xPreEval; /* Optional, called before Tcl_Eval*(). */
197 void *pPreContext; /* Optional, provided to xPreEval(). */
198 tcl_NotifyProc *xPostEval; /* Optional, called after Tcl_Eval*(). */
@@ -526,11 +533,12 @@
526 */
527 static int loadTcl(
528 Th_Interp *interp,
529 void **pLibrary,
530 tcl_FindExecutableProc **pxFindExecutable,
531 tcl_CreateInterpProc **pxCreateInterp
 
532 ){
533 #if defined(USE_TCL_STUBS)
534 char fileName[] = TCL_LIBRARY_NAME;
535 #endif
536 if( !pLibrary || !pxFindExecutable || !pxCreateInterp ){
@@ -542,10 +550,11 @@
542 do {
543 void *library = dlopen(fileName, RTLD_NOW | RTLD_GLOBAL);
544 if( library ){
545 tcl_FindExecutableProc *xFindExecutable;
546 tcl_CreateInterpProc *xCreateInterp;
 
547 const char *procName = TCL_FINDEXECUTABLE_NAME;
548 xFindExecutable = (tcl_FindExecutableProc *)dlsym(library, procName + 1);
549 if( !xFindExecutable ){
550 xFindExecutable = (tcl_FindExecutableProc *)dlsym(library, procName);
551 }
@@ -563,14 +572,26 @@
563 if( !xCreateInterp ){
564 Th_ErrorMessage(interp,
565 "could not locate Tcl_CreateInterp", (const char *)"", 0);
566 dlclose(library);
567 return TH_ERROR;
 
 
 
 
 
 
 
 
 
 
 
568 }
569 *pLibrary = library;
570 *pxFindExecutable = xFindExecutable;
571 *pxCreateInterp = xCreateInterp;
 
572 return TH_OK;
573 }
574 } while( --fileName[TCL_MINOR_OFFSET]>'3' ); /* Tcl 8.4+ */
575 Th_ErrorMessage(interp,
576 "could not load Tcl shared library \"" TCL_LIBRARY_NAME "\"",
@@ -578,10 +599,11 @@
578 return TH_ERROR;
579 #else
580 *pLibrary = 0;
581 *pxFindExecutable = Tcl_FindExecutable;
582 *pxCreateInterp = Tcl_CreateInterp;
 
583 return TH_OK;
584 #endif
585 }
586
587 /*
@@ -663,28 +685,38 @@
663 }
664 if ( tclContext->interp ){
665 return TH_OK;
666 }
667 if( loadTcl(interp, &tclContext->library, &tclContext->xFindExecutable,
668 &tclContext->xCreateInterp)!=TH_OK ){
669 return TH_ERROR;
670 }
671 argc = tclContext->argc;
672 argv = tclContext->argv;
673 if( argc>0 && argv ){
674 argv0 = argv[0];
675 }
676 tclContext->xFindExecutable(argv0);
677 tclInterp = tclContext->xCreateInterp();
678 if( !tclInterp ||
679 #if defined(USE_TCL_STUBS)
680 !Tcl_InitStubs(tclInterp, "8.4", 0) ||
681 #endif
682 Tcl_InterpDeleted(tclInterp) ){
683 Th_ErrorMessage(interp,
684 "could not create Tcl interpreter", (const char *)"", 0);
685 return TH_ERROR;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
686 }
687 tclContext->interp = tclInterp;
688 if( Tcl_Init(tclInterp)!=TCL_OK ){
689 Th_ErrorMessage(interp,
690 "Tcl initialization error:", Tcl_GetStringResult(tclInterp), -1);
691
--- src/th_tcl.c
+++ src/th_tcl.c
@@ -119,21 +119,27 @@
119 # define TCL_FINDEXECUTABLE_NAME "_Tcl_FindExecutable"
120 # endif
121 # ifndef TCL_CREATEINTERP_NAME
122 # define TCL_CREATEINTERP_NAME "_Tcl_CreateInterp"
123 # endif
124 # ifndef TCL_DELETEINTERP_NAME
125 # define TCL_DELETEINTERP_NAME "_Tcl_DeleteInterp"
126 # endif
127 #endif /* defined(USE_TCL_STUBS) */
128
129 /*
130 ** The function types for Tcl_FindExecutable and Tcl_CreateInterp are needed
131 ** when the Tcl library is being loaded dynamically by a stubs-enabled
132 ** application (i.e. the inverse of using a stubs-enabled package). These are
133 ** the only Tcl API functions that MUST be called prior to being able to call
134 ** Tcl_InitStubs (i.e. because it requires a Tcl interpreter). For complete
135 ** cleanup if the Tcl stubs initialization fails somehow, the Tcl_DeleteInterp
136 ** function type is also required.
137 */
138 typedef void (tcl_FindExecutableProc) (const char * argv0);
139 typedef Tcl_Interp *(tcl_CreateInterpProc) (void);
140 typedef void (tcl_DeleteInterpProc) (Tcl_Interp *interp);
141
142 /*
143 ** The function types for the "hook" functions to be called before and after a
144 ** TH1 command makes a call to evaluate a Tcl script. If the "pre" function
145 ** returns anything but TH_OK, then evaluation of the Tcl script is skipped and
@@ -189,10 +195,11 @@
195 int argc; /* Number of original arguments. */
196 char **argv; /* Full copy of the original arguments. */
197 void *library; /* The Tcl library module handle. */
198 tcl_FindExecutableProc *xFindExecutable; /* Tcl_FindExecutable() pointer. */
199 tcl_CreateInterpProc *xCreateInterp; /* Tcl_CreateInterp() pointer. */
200 tcl_DeleteInterpProc *xDeleteInterp; /* Tcl_DeleteInterp() pointer. */
201 Tcl_Interp *interp; /* The on-demand created Tcl interpreter. */
202 char *setup; /* The optional Tcl setup script. */
203 tcl_NotifyProc *xPreEval; /* Optional, called before Tcl_Eval*(). */
204 void *pPreContext; /* Optional, provided to xPreEval(). */
205 tcl_NotifyProc *xPostEval; /* Optional, called after Tcl_Eval*(). */
@@ -526,11 +533,12 @@
533 */
534 static int loadTcl(
535 Th_Interp *interp,
536 void **pLibrary,
537 tcl_FindExecutableProc **pxFindExecutable,
538 tcl_CreateInterpProc **pxCreateInterp,
539 tcl_DeleteInterpProc **pxDeleteInterp
540 ){
541 #if defined(USE_TCL_STUBS)
542 char fileName[] = TCL_LIBRARY_NAME;
543 #endif
544 if( !pLibrary || !pxFindExecutable || !pxCreateInterp ){
@@ -542,10 +550,11 @@
550 do {
551 void *library = dlopen(fileName, RTLD_NOW | RTLD_GLOBAL);
552 if( library ){
553 tcl_FindExecutableProc *xFindExecutable;
554 tcl_CreateInterpProc *xCreateInterp;
555 tcl_DeleteInterpProc *xDeleteInterp;
556 const char *procName = TCL_FINDEXECUTABLE_NAME;
557 xFindExecutable = (tcl_FindExecutableProc *)dlsym(library, procName + 1);
558 if( !xFindExecutable ){
559 xFindExecutable = (tcl_FindExecutableProc *)dlsym(library, procName);
560 }
@@ -563,14 +572,26 @@
572 if( !xCreateInterp ){
573 Th_ErrorMessage(interp,
574 "could not locate Tcl_CreateInterp", (const char *)"", 0);
575 dlclose(library);
576 return TH_ERROR;
577 }
578 procName = TCL_DELETEINTERP_NAME;
579 xDeleteInterp = (tcl_DeleteInterpProc *)dlsym(library, procName + 1);
580 if( !xDeleteInterp ){
581 xDeleteInterp = (tcl_DeleteInterpProc *)dlsym(library, procName);
582 }
583 if( !xDeleteInterp ){
584 Th_ErrorMessage(interp,
585 "could not locate Tcl_DeleteInterp", (const char *)"", 0);
586 dlclose(library);
587 return TH_ERROR;
588 }
589 *pLibrary = library;
590 *pxFindExecutable = xFindExecutable;
591 *pxCreateInterp = xCreateInterp;
592 *pxDeleteInterp = xDeleteInterp;
593 return TH_OK;
594 }
595 } while( --fileName[TCL_MINOR_OFFSET]>'3' ); /* Tcl 8.4+ */
596 Th_ErrorMessage(interp,
597 "could not load Tcl shared library \"" TCL_LIBRARY_NAME "\"",
@@ -578,10 +599,11 @@
599 return TH_ERROR;
600 #else
601 *pLibrary = 0;
602 *pxFindExecutable = Tcl_FindExecutable;
603 *pxCreateInterp = Tcl_CreateInterp;
604 *pxDeleteInterp = Tcl_DeleteInterp;
605 return TH_OK;
606 #endif
607 }
608
609 /*
@@ -663,28 +685,38 @@
685 }
686 if ( tclContext->interp ){
687 return TH_OK;
688 }
689 if( loadTcl(interp, &tclContext->library, &tclContext->xFindExecutable,
690 &tclContext->xCreateInterp, &tclContext->xDeleteInterp)!=TH_OK ){
691 return TH_ERROR;
692 }
693 argc = tclContext->argc;
694 argv = tclContext->argv;
695 if( argc>0 && argv ){
696 argv0 = argv[0];
697 }
698 tclContext->xFindExecutable(argv0);
699 tclInterp = tclContext->xCreateInterp();
700 if( !tclInterp ){
 
 
 
 
701 Th_ErrorMessage(interp,
702 "could not create Tcl interpreter", (const char *)"", 0);
703 return TH_ERROR;
704 }
705 #if defined(USE_TCL_STUBS)
706 if( !Tcl_InitStubs(tclInterp, "8.4", 0) ){
707 Th_ErrorMessage(interp,
708 "could not initialize Tcl stubs", (const char *)"", 0);
709 tclContext->xDeleteInterp(tclInterp);
710 return TH_ERROR;
711 }
712 #endif
713 if( Tcl_InterpDeleted(tclInterp) ){
714 Th_ErrorMessage(interp,
715 "Tcl interpreter appears to be deleted", (const char *)"", 0);
716 tclContext->xDeleteInterp(tclInterp); /* TODO: Redundant? */
717 return TH_ERROR;
718 }
719 tclContext->interp = tclInterp;
720 if( Tcl_Init(tclInterp)!=TCL_OK ){
721 Th_ErrorMessage(interp,
722 "Tcl initialization error:", Tcl_GetStringResult(tclInterp), -1);
723

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button