1 /*
2  * tcl.h --
3  *
4  *	This header file describes the externally-visible facilities of the
5  *	Tcl interpreter.
6  *
7  * Copyright (c) 1987-1994 The Regents of the University of California.
8  * Copyright (c) 1993-1996 Lucent Technologies.
9  * Copyright (c) 1994-1998 Sun Microsystems, Inc.
10  * Copyright (c) 1998-2000 by Scriptics Corporation.
11  * Copyright (c) 2002 by Kevin B. Kenny.  All rights reserved.
12  *
13  * See the file "license.terms" for information on usage and redistribution of
14  * this file, and for a DISCLAIMER OF ALL WARRANTIES.
15  */
16 
17 #ifndef _TCL
18 #define _TCL
19 
20 /*
21  * For C++ compilers, use extern "C"
22  */
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 /*
29  * The following defines are used to indicate the various release levels.
30  */
31 
32 #define TCL_ALPHA_RELEASE	0
33 #define TCL_BETA_RELEASE	1
34 #define TCL_FINAL_RELEASE	2
35 
36 /*
37  * When version numbers change here, must also go into the following files and
38  * update the version numbers:
39  *
40  * library/init.tcl	(1 LOC patch)
41  * unix/configure.in	(2 LOC Major, 2 LOC minor, 1 LOC patch)
42  * win/configure.in	(as above)
43  * win/tcl.m4		(not patchlevel)
44  * win/makefile.bc	(not patchlevel) 2 LOC
45  * README		(sections 0 and 2, with and without separator)
46  * macosx/Tcl.pbproj/project.pbxproj (not patchlevel) 1 LOC
47  * macosx/Tcl.pbproj/default.pbxuser (not patchlevel) 1 LOC
48  * macosx/Tcl.xcode/project.pbxproj (not patchlevel) 2 LOC
49  * macosx/Tcl.xcode/default.pbxuser (not patchlevel) 1 LOC
50  * macosx/Tcl-Common.xcconfig (not patchlevel) 1 LOC
51  * win/README		(not patchlevel) (sections 0 and 2)
52  * unix/tcl.spec	(1 LOC patch)
53  * tools/tcl.hpj.in	(not patchlevel, for windows installer)
54  */
55 
56 #define TCL_MAJOR_VERSION   8
57 #define TCL_MINOR_VERSION   6
58 #define TCL_RELEASE_LEVEL   TCL_FINAL_RELEASE
59 #define TCL_RELEASE_SERIAL  0
60 
61 #define TCL_VERSION	    "8.6"
62 #define TCL_PATCH_LEVEL	    "8.6.0"
63 
64 /*
65  *----------------------------------------------------------------------------
66  * The following definitions set up the proper options for Windows compilers.
67  * We use this method because there is no autoconf equivalent.
68  */
69 
70 #ifndef __WIN32__
71 #   if defined(_WIN32) || defined(WIN32) || defined(__MINGW32__) || defined(__BORLANDC__) || (defined(__WATCOMC__) && defined(__WINDOWS_386__))
72 #	define __WIN32__
73 #	ifndef WIN32
74 #	    define WIN32
75 #	endif
76 #	ifndef _WIN32
77 #	    define _WIN32
78 #	endif
79 #   endif
80 #endif
81 
82 /*
83  * STRICT: See MSDN Article Q83456
84  */
85 
86 #ifdef __WIN32__
87 #   ifndef STRICT
88 #	define STRICT
89 #   endif
90 #endif /* __WIN32__ */
91 
92 /*
93  * Utility macros: STRINGIFY takes an argument and wraps it in "" (double
94  * quotation marks), JOIN joins two arguments.
95  */
96 
97 #ifndef STRINGIFY
98 #  define STRINGIFY(x) STRINGIFY1(x)
99 #  define STRINGIFY1(x) #x
100 #endif
101 #ifndef JOIN
102 #  define JOIN(a,b) JOIN1(a,b)
103 #  define JOIN1(a,b) a##b
104 #endif
105 
106 /*
107  * A special definition used to allow this header file to be included from
108  * windows resource files so that they can obtain version information.
109  * RC_INVOKED is defined by default by the windows RC tool.
110  *
111  * Resource compilers don't like all the C stuff, like typedefs and function
112  * declarations, that occur below, so block them out.
113  */
114 
115 #ifndef RC_INVOKED
116 
117 /*
118  * Special macro to define mutexes, that doesn't do anything if we are not
119  * using threads.
120  */
121 
122 #ifdef TCL_THREADS
123 #define TCL_DECLARE_MUTEX(name) static Tcl_Mutex name;
124 #else
125 #define TCL_DECLARE_MUTEX(name)
126 #endif
127 
128 /*
129  * Tcl's public routine Tcl_FSSeek() uses the values SEEK_SET, SEEK_CUR, and
130  * SEEK_END, all #define'd by stdio.h .
131  *
132  * Also, many extensions need stdio.h, and they've grown accustomed to tcl.h
133  * providing it for them rather than #include-ing it themselves as they
134  * should, so also for their sake, we keep the #include to be consistent with
135  * prior Tcl releases.
136  */
137 
138 #include <stdio.h>
139 
140 /*
141  *----------------------------------------------------------------------------
142  * Support for functions with a variable number of arguments.
143  *
144  * The following TCL_VARARGS* macros are to support old extensions
145  * written for older versions of Tcl where the macros permitted
146  * support for the varargs.h system as well as stdarg.h .
147  *
148  * New code should just directly be written to use stdarg.h conventions.
149  */
150 
151 #include <stdarg.h>
152 #ifndef TCL_NO_DEPRECATED
153 #    define TCL_VARARGS(type, name) (type name, ...)
154 #    define TCL_VARARGS_DEF(type, name) (type name, ...)
155 #    define TCL_VARARGS_START(type, name, list) (va_start(list, name), name)
156 #endif
157 #if defined(__GNUC__) && (__GNUC__ > 2)
158 #   define TCL_FORMAT_PRINTF(a,b) __attribute__ ((__format__ (__printf__, a, b)))
159 #else
160 #   define TCL_FORMAT_PRINTF(a,b)
161 #endif
162 
163 /*
164  * Allow a part of Tcl's API to be explicitly marked as deprecated.
165  *
166  * Used to make TIP 330/336 generate moans even if people use the
167  * compatibility macros. Change your code, guys! We won't support you forever.
168  */
169 
170 #if defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
171 #   if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC__MINOR__ >= 5))
172 #	define TCL_DEPRECATED_API(msg)	__attribute__ ((__deprecated__ (msg)))
173 #   else
174 #	define TCL_DEPRECATED_API(msg)	__attribute__ ((__deprecated__))
175 #   endif
176 #else
177 #   define TCL_DEPRECATED_API(msg)	/* nothing portable */
178 #endif
179 
180 /*
181  *----------------------------------------------------------------------------
182  * Macros used to declare a function to be exported by a DLL. Used by Windows,
183  * maps to no-op declarations on non-Windows systems. The default build on
184  * windows is for a DLL, which causes the DLLIMPORT and DLLEXPORT macros to be
185  * nonempty. To build a static library, the macro STATIC_BUILD should be
186  * defined.
187  *
188  * Note: when building static but linking dynamically to MSVCRT we must still
189  *       correctly decorate the C library imported function.  Use CRTIMPORT
190  *       for this purpose.  _DLL is defined by the compiler when linking to
191  *       MSVCRT.
192  */
193 
194 #if (defined(__WIN32__) && (defined(_MSC_VER) || (__BORLANDC__ >= 0x0550) || defined(__LCC__) || defined(__WATCOMC__) || (defined(__GNUC__) && defined(__declspec))))
195 #   define HAVE_DECLSPEC 1
196 #   ifdef STATIC_BUILD
197 #       define DLLIMPORT
198 #       define DLLEXPORT
199 #       ifdef _DLL
200 #           define CRTIMPORT __declspec(dllimport)
201 #       else
202 #           define CRTIMPORT
203 #       endif
204 #   else
205 #       define DLLIMPORT __declspec(dllimport)
206 #       define DLLEXPORT __declspec(dllexport)
207 #       define CRTIMPORT __declspec(dllimport)
208 #   endif
209 #else
210 #   define DLLIMPORT
211 #   if defined(__GNUC__) && __GNUC__ > 3
212 #       define DLLEXPORT __attribute__ ((visibility("default")))
213 #   else
214 #       define DLLEXPORT
215 #   endif
216 #   define CRTIMPORT
217 #endif
218 
219 /*
220  * These macros are used to control whether functions are being declared for
221  * import or export. If a function is being declared while it is being built
222  * to be included in a shared library, then it should have the DLLEXPORT
223  * storage class. If is being declared for use by a module that is going to
224  * link against the shared library, then it should have the DLLIMPORT storage
225  * class. If the symbol is beind declared for a static build or for use from a
226  * stub library, then the storage class should be empty.
227  *
228  * The convention is that a macro called BUILD_xxxx, where xxxx is the name of
229  * a library we are building, is set on the compile line for sources that are
230  * to be placed in the library. When this macro is set, the storage class will
231  * be set to DLLEXPORT. At the end of the header file, the storage class will
232  * be reset to DLLIMPORT.
233  */
234 
235 #undef TCL_STORAGE_CLASS
236 #ifdef BUILD_tcl
237 #   define TCL_STORAGE_CLASS DLLEXPORT
238 #else
239 #   ifdef USE_TCL_STUBS
240 #      define TCL_STORAGE_CLASS
241 #   else
242 #      define TCL_STORAGE_CLASS DLLIMPORT
243 #   endif
244 #endif
245 
246 /*
247  * The following _ANSI_ARGS_ macro is to support old extensions
248  * written for older versions of Tcl where it permitted support
249  * for compilers written in the pre-prototype era of C.
250  *
251  * New code should use prototypes.
252  */
253 
254 #ifndef TCL_NO_DEPRECATED
255 #   undef _ANSI_ARGS_
256 #   define _ANSI_ARGS_(x)	x
257 #endif
258 
259 /*
260  * Definitions that allow this header file to be used either with or without
261  * ANSI C features.
262  */
263 
264 #ifndef INLINE
265 #   define INLINE
266 #endif
267 
268 #ifdef NO_CONST
269 #   ifndef const
270 #      define const
271 #   endif
272 #endif
273 #ifndef CONST
274 #   define CONST const
275 #endif
276 
277 #ifdef USE_NON_CONST
278 #   ifdef USE_COMPAT_CONST
279 #      error define at most one of USE_NON_CONST and USE_COMPAT_CONST
280 #   endif
281 #   define CONST84
282 #   define CONST84_RETURN
283 #else
284 #   ifdef USE_COMPAT_CONST
285 #      define CONST84
286 #      define CONST84_RETURN const
287 #   else
288 #      define CONST84 const
289 #      define CONST84_RETURN const
290 #   endif
291 #endif
292 
293 #ifndef CONST86
294 #      define CONST86 CONST84
295 #endif
296 
297 /*
298  * Make sure EXTERN isn't defined elsewhere.
299  */
300 
301 #ifdef EXTERN
302 #   undef EXTERN
303 #endif /* EXTERN */
304 
305 #ifdef __cplusplus
306 #   define EXTERN extern "C" TCL_STORAGE_CLASS
307 #else
308 #   define EXTERN extern TCL_STORAGE_CLASS
309 #endif
310 
311 /*
312  *----------------------------------------------------------------------------
313  * The following code is copied from winnt.h. If we don't replicate it here,
314  * then <windows.h> can't be included after tcl.h, since tcl.h also defines
315  * VOID. This block is skipped under Cygwin and Mingw.
316  */
317 
318 #if defined(__WIN32__) && !defined(HAVE_WINNT_IGNORE_VOID)
319 #ifndef VOID
320 #define VOID void
321 typedef char CHAR;
322 typedef short SHORT;
323 typedef long LONG;
324 #endif
325 #endif /* __WIN32__ && !HAVE_WINNT_IGNORE_VOID */
326 
327 /*
328  * Macro to use instead of "void" for arguments that must have type "void *"
329  * in ANSI C; maps them to type "char *" in non-ANSI systems.
330  */
331 
332 #ifndef NO_VOID
333 #   define VOID void
334 #else
335 #   define VOID char
336 #endif
337 
338 /*
339  * Miscellaneous declarations.
340  */
341 
342 #ifndef _CLIENTDATA
343 #   ifndef NO_VOID
344 	typedef void *ClientData;
345 #   else
346 	typedef int *ClientData;
347 #   endif
348 #   define _CLIENTDATA
349 #endif
350 
351 /*
352  * Darwin specific configure overrides (to support fat compiles, where
353  * configure runs only once for multiple architectures):
354  */
355 
356 #ifdef __APPLE__
357 #   ifdef __LP64__
358 #	undef TCL_WIDE_INT_TYPE
359 #	define TCL_WIDE_INT_IS_LONG 1
360 #	define TCL_CFG_DO64BIT 1
361 #    else /* !__LP64__ */
362 #	define TCL_WIDE_INT_TYPE long long
363 #	undef TCL_WIDE_INT_IS_LONG
364 #	undef TCL_CFG_DO64BIT
365 #    endif /* __LP64__ */
366 #    undef HAVE_STRUCT_STAT64
367 #endif /* __APPLE__ */
368 
369 /*
370  * Define Tcl_WideInt to be a type that is (at least) 64-bits wide, and define
371  * Tcl_WideUInt to be the unsigned variant of that type (assuming that where
372  * we have one, we can have the other.)
373  *
374  * Also defines the following macros:
375  * TCL_WIDE_INT_IS_LONG - if wide ints are really longs (i.e. we're on a real
376  *	64-bit system.)
377  * Tcl_WideAsLong - forgetful converter from wideInt to long.
378  * Tcl_LongAsWide - sign-extending converter from long to wideInt.
379  * Tcl_WideAsDouble - converter from wideInt to double.
380  * Tcl_DoubleAsWide - converter from double to wideInt.
381  *
382  * The following invariant should hold for any long value 'longVal':
383  *	longVal == Tcl_WideAsLong(Tcl_LongAsWide(longVal))
384  *
385  * Note on converting between Tcl_WideInt and strings. This implementation (in
386  * tclObj.c) depends on the function
387  * sprintf(...,"%" TCL_LL_MODIFIER "d",...).
388  */
389 
390 #if !defined(TCL_WIDE_INT_TYPE)&&!defined(TCL_WIDE_INT_IS_LONG)
391 #   if defined(__WIN32__)
392 #      define TCL_WIDE_INT_TYPE __int64
393 #      ifdef __BORLANDC__
394 #         define TCL_LL_MODIFIER	"L"
395 #      else /* __BORLANDC__ */
396 #         define TCL_LL_MODIFIER	"I64"
397 #      endif /* __BORLANDC__ */
398 #   elif defined(__GNUC__)
399 #      define TCL_WIDE_INT_TYPE long long
400 #      define TCL_LL_MODIFIER	"ll"
401 #   else /* ! __WIN32__ && ! __GNUC__ */
402 /*
403  * Don't know what platform it is and configure hasn't discovered what is
404  * going on for us. Try to guess...
405  */
406 #      ifdef NO_LIMITS_H
407 #	  error please define either TCL_WIDE_INT_TYPE or TCL_WIDE_INT_IS_LONG
408 #      else /* !NO_LIMITS_H */
409 #	  include <limits.h>
410 #	  if (INT_MAX < LONG_MAX)
411 #	     define TCL_WIDE_INT_IS_LONG	1
412 #	  else
413 #	     define TCL_WIDE_INT_TYPE long long
414 #         endif
415 #      endif /* NO_LIMITS_H */
416 #   endif /* __WIN32__ */
417 #endif /* !TCL_WIDE_INT_TYPE & !TCL_WIDE_INT_IS_LONG */
418 #ifdef TCL_WIDE_INT_IS_LONG
419 #   undef TCL_WIDE_INT_TYPE
420 #   define TCL_WIDE_INT_TYPE	long
421 #endif /* TCL_WIDE_INT_IS_LONG */
422 
423 typedef TCL_WIDE_INT_TYPE		Tcl_WideInt;
424 typedef unsigned TCL_WIDE_INT_TYPE	Tcl_WideUInt;
425 
426 #ifdef TCL_WIDE_INT_IS_LONG
427 #   define Tcl_WideAsLong(val)		((long)(val))
428 #   define Tcl_LongAsWide(val)		((long)(val))
429 #   define Tcl_WideAsDouble(val)	((double)((long)(val)))
430 #   define Tcl_DoubleAsWide(val)	((long)((double)(val)))
431 #   ifndef TCL_LL_MODIFIER
432 #      define TCL_LL_MODIFIER		"l"
433 #   endif /* !TCL_LL_MODIFIER */
434 #else /* TCL_WIDE_INT_IS_LONG */
435 /*
436  * The next short section of defines are only done when not running on Windows
437  * or some other strange platform.
438  */
439 #   ifndef TCL_LL_MODIFIER
440 #      define TCL_LL_MODIFIER		"ll"
441 #   endif /* !TCL_LL_MODIFIER */
442 #   define Tcl_WideAsLong(val)		((long)((Tcl_WideInt)(val)))
443 #   define Tcl_LongAsWide(val)		((Tcl_WideInt)((long)(val)))
444 #   define Tcl_WideAsDouble(val)	((double)((Tcl_WideInt)(val)))
445 #   define Tcl_DoubleAsWide(val)	((Tcl_WideInt)((double)(val)))
446 #endif /* TCL_WIDE_INT_IS_LONG */
447 
448 #if defined(__WIN32__)
449 #   ifdef __BORLANDC__
450 	typedef struct stati64 Tcl_StatBuf;
451 #   elif defined(_WIN64)
452 	typedef struct __stat64 Tcl_StatBuf;
453 #   elif (defined(_MSC_VER) && (_MSC_VER < 1400)) || defined(_USE_32BIT_TIME_T)
454 	typedef struct _stati64	Tcl_StatBuf;
455 #   else
456 	typedef struct _stat32i64 Tcl_StatBuf;
457 #   endif /* _MSC_VER < 1400 */
458 #elif defined(__CYGWIN__)
459     typedef struct _stat32i64 {
460 	dev_t st_dev;
461 	unsigned short st_ino;
462 	unsigned short st_mode;
463 	short st_nlink;
464 	short st_uid;
465 	short st_gid;
466 	/* Here is a 2-byte gap */
467 	dev_t st_rdev;
468 	/* Here is a 4-byte gap */
469 	long long st_size;
470 	struct {long tv_sec;} st_atim;
471 	struct {long tv_sec;} st_mtim;
472 	struct {long tv_sec;} st_ctim;
473 	/* Here is a 4-byte gap */
474     } Tcl_StatBuf;
475 #elif defined(HAVE_STRUCT_STAT64)
476     typedef struct stat64 Tcl_StatBuf;
477 #else
478     typedef struct stat Tcl_StatBuf;
479 #endif
480 
481 /*
482  *----------------------------------------------------------------------------
483  * Data structures defined opaquely in this module. The definitions below just
484  * provide dummy types. A few fields are made visible in Tcl_Interp
485  * structures, namely those used for returning a string result from commands.
486  * Direct access to the result field is discouraged in Tcl 8.0. The
487  * interpreter result is either an object or a string, and the two values are
488  * kept consistent unless some C code sets interp->result directly.
489  * Programmers should use either the function Tcl_GetObjResult() or
490  * Tcl_GetStringResult() to read the interpreter's result. See the SetResult
491  * man page for details.
492  *
493  * Note: any change to the Tcl_Interp definition below must be mirrored in the
494  * "real" definition in tclInt.h.
495  *
496  * Note: Tcl_ObjCmdProc functions do not directly set result and freeProc.
497  * Instead, they set a Tcl_Obj member in the "real" structure that can be
498  * accessed with Tcl_GetObjResult() and Tcl_SetObjResult().
499  */
500 
501 typedef struct Tcl_Interp
502 #ifndef TCL_NO_DEPRECATED
503 {
504     /* TIP #330: Strongly discourage extensions from using the string
505      * result. */
506 #ifdef USE_INTERP_RESULT
507     char *result TCL_DEPRECATED_API("use Tcl_GetResult/Tcl_SetResult");
508 				/* If the last command returned a string
509 				 * result, this points to it. */
510     void (*freeProc) (char *blockPtr)
511 	    TCL_DEPRECATED_API("use Tcl_GetResult/Tcl_SetResult");
512 				/* Zero means the string result is statically
513 				 * allocated. TCL_DYNAMIC means it was
514 				 * allocated with ckalloc and should be freed
515 				 * with ckfree. Other values give the address
516 				 * of function to invoke to free the result.
517 				 * Tcl_Eval must free it before executing next
518 				 * command. */
519 #else
520     char *resultDontUse; /* Don't use in extensions! */
521     void (*freeProcDontUse) (char *); /* Don't use in extensions! */
522 #endif
523 #ifdef USE_INTERP_ERRORLINE
524     int errorLine TCL_DEPRECATED_API("use Tcl_GetErrorLine/Tcl_SetErrorLine");
525 				/* When TCL_ERROR is returned, this gives the
526 				 * line number within the command where the
527 				 * error occurred (1 if first line). */
528 #else
529     int errorLineDontUse; /* Don't use in extensions! */
530 #endif
531 }
532 #endif /* TCL_NO_DEPRECATED */
533 Tcl_Interp;
534 
535 typedef struct Tcl_AsyncHandler_ *Tcl_AsyncHandler;
536 typedef struct Tcl_Channel_ *Tcl_Channel;
537 typedef struct Tcl_ChannelTypeVersion_ *Tcl_ChannelTypeVersion;
538 typedef struct Tcl_Command_ *Tcl_Command;
539 typedef struct Tcl_Condition_ *Tcl_Condition;
540 typedef struct Tcl_Dict_ *Tcl_Dict;
541 typedef struct Tcl_EncodingState_ *Tcl_EncodingState;
542 typedef struct Tcl_Encoding_ *Tcl_Encoding;
543 typedef struct Tcl_Event Tcl_Event;
544 typedef struct Tcl_InterpState_ *Tcl_InterpState;
545 typedef struct Tcl_LoadHandle_ *Tcl_LoadHandle;
546 typedef struct Tcl_Mutex_ *Tcl_Mutex;
547 typedef struct Tcl_Pid_ *Tcl_Pid;
548 typedef struct Tcl_RegExp_ *Tcl_RegExp;
549 typedef struct Tcl_ThreadDataKey_ *Tcl_ThreadDataKey;
550 typedef struct Tcl_ThreadId_ *Tcl_ThreadId;
551 typedef struct Tcl_TimerToken_ *Tcl_TimerToken;
552 typedef struct Tcl_Trace_ *Tcl_Trace;
553 typedef struct Tcl_Var_ *Tcl_Var;
554 typedef struct Tcl_ZLibStream_ *Tcl_ZlibStream;
555 
556 /*
557  *----------------------------------------------------------------------------
558  * Definition of the interface to functions implementing threads. A function
559  * following this definition is given to each call of 'Tcl_CreateThread' and
560  * will be called as the main fuction of the new thread created by that call.
561  */
562 
563 #if defined __WIN32__
564 typedef unsigned (__stdcall Tcl_ThreadCreateProc) (ClientData clientData);
565 #else
566 typedef void (Tcl_ThreadCreateProc) (ClientData clientData);
567 #endif
568 
569 /*
570  * Threading function return types used for abstracting away platform
571  * differences when writing a Tcl_ThreadCreateProc. See the NewThread function
572  * in generic/tclThreadTest.c for it's usage.
573  */
574 
575 #if defined __WIN32__
576 #   define Tcl_ThreadCreateType		unsigned __stdcall
577 #   define TCL_THREAD_CREATE_RETURN	return 0
578 #else
579 #   define Tcl_ThreadCreateType		void
580 #   define TCL_THREAD_CREATE_RETURN
581 #endif
582 
583 /*
584  * Definition of values for default stacksize and the possible flags to be
585  * given to Tcl_CreateThread.
586  */
587 
588 #define TCL_THREAD_STACK_DEFAULT (0)    /* Use default size for stack. */
589 #define TCL_THREAD_NOFLAGS	 (0000) /* Standard flags, default
590 					 * behaviour. */
591 #define TCL_THREAD_JOINABLE	 (0001) /* Mark the thread as joinable. */
592 
593 /*
594  * Flag values passed to Tcl_StringCaseMatch.
595  */
596 
597 #define TCL_MATCH_NOCASE	(1<<0)
598 
599 /*
600  * Flag values passed to Tcl_GetRegExpFromObj.
601  */
602 
603 #define	TCL_REG_BASIC		000000	/* BREs (convenience). */
604 #define	TCL_REG_EXTENDED	000001	/* EREs. */
605 #define	TCL_REG_ADVF		000002	/* Advanced features in EREs. */
606 #define	TCL_REG_ADVANCED	000003	/* AREs (which are also EREs). */
607 #define	TCL_REG_QUOTE		000004	/* No special characters, none. */
608 #define	TCL_REG_NOCASE		000010	/* Ignore case. */
609 #define	TCL_REG_NOSUB		000020	/* Don't care about subexpressions. */
610 #define	TCL_REG_EXPANDED	000040	/* Expanded format, white space &
611 					 * comments. */
612 #define	TCL_REG_NLSTOP		000100  /* \n doesn't match . or [^ ] */
613 #define	TCL_REG_NLANCH		000200  /* ^ matches after \n, $ before. */
614 #define	TCL_REG_NEWLINE		000300  /* Newlines are line terminators. */
615 #define	TCL_REG_CANMATCH	001000  /* Report details on partial/limited
616 					 * matches. */
617 
618 /*
619  * Flags values passed to Tcl_RegExpExecObj.
620  */
621 
622 #define	TCL_REG_NOTBOL	0001	/* Beginning of string does not match ^.  */
623 #define	TCL_REG_NOTEOL	0002	/* End of string does not match $. */
624 
625 /*
626  * Structures filled in by Tcl_RegExpInfo. Note that all offset values are
627  * relative to the start of the match string, not the beginning of the entire
628  * string.
629  */
630 
631 typedef struct Tcl_RegExpIndices {
632     long start;			/* Character offset of first character in
633 				 * match. */
634     long end;			/* Character offset of first character after
635 				 * the match. */
636 } Tcl_RegExpIndices;
637 
638 typedef struct Tcl_RegExpInfo {
639     int nsubs;			/* Number of subexpressions in the compiled
640 				 * expression. */
641     Tcl_RegExpIndices *matches;	/* Array of nsubs match offset pairs. */
642     long extendStart;		/* The offset at which a subsequent match
643 				 * might begin. */
644     long reserved;		/* Reserved for later use. */
645 } Tcl_RegExpInfo;
646 
647 /*
648  * Picky compilers complain if this typdef doesn't appear before the struct's
649  * reference in tclDecls.h.
650  */
651 
652 typedef Tcl_StatBuf *Tcl_Stat_;
653 typedef struct stat *Tcl_OldStat_;
654 
655 /*
656  *----------------------------------------------------------------------------
657  * When a TCL command returns, the interpreter contains a result from the
658  * command. Programmers are strongly encouraged to use one of the functions
659  * Tcl_GetObjResult() or Tcl_GetStringResult() to read the interpreter's
660  * result. See the SetResult man page for details. Besides this result, the
661  * command function returns an integer code, which is one of the following:
662  *
663  * TCL_OK		Command completed normally; the interpreter's result
664  *			contains the command's result.
665  * TCL_ERROR		The command couldn't be completed successfully; the
666  *			interpreter's result describes what went wrong.
667  * TCL_RETURN		The command requests that the current function return;
668  *			the interpreter's result contains the function's
669  *			return value.
670  * TCL_BREAK		The command requests that the innermost loop be
671  *			exited; the interpreter's result is meaningless.
672  * TCL_CONTINUE		Go on to the next iteration of the current loop; the
673  *			interpreter's result is meaningless.
674  */
675 
676 #define TCL_OK			0
677 #define TCL_ERROR		1
678 #define TCL_RETURN		2
679 #define TCL_BREAK		3
680 #define TCL_CONTINUE		4
681 
682 #define TCL_RESULT_SIZE		200
683 
684 /*
685  *----------------------------------------------------------------------------
686  * Flags to control what substitutions are performed by Tcl_SubstObj():
687  */
688 
689 #define TCL_SUBST_COMMANDS	001
690 #define TCL_SUBST_VARIABLES	002
691 #define TCL_SUBST_BACKSLASHES	004
692 #define TCL_SUBST_ALL		007
693 
694 /*
695  * Argument descriptors for math function callbacks in expressions:
696  */
697 
698 typedef enum {
699     TCL_INT, TCL_DOUBLE, TCL_EITHER, TCL_WIDE_INT
700 } Tcl_ValueType;
701 
702 typedef struct Tcl_Value {
703     Tcl_ValueType type;		/* Indicates intValue or doubleValue is valid,
704 				 * or both. */
705     long intValue;		/* Integer value. */
706     double doubleValue;		/* Double-precision floating value. */
707     Tcl_WideInt wideValue;	/* Wide (min. 64-bit) integer value. */
708 } Tcl_Value;
709 
710 /*
711  * Forward declaration of Tcl_Obj to prevent an error when the forward
712  * reference to Tcl_Obj is encountered in the function types declared below.
713  */
714 
715 struct Tcl_Obj;
716 
717 /*
718  *----------------------------------------------------------------------------
719  * Function types defined by Tcl:
720  */
721 
722 typedef int (Tcl_AppInitProc) (Tcl_Interp *interp);
723 typedef int (Tcl_AsyncProc) (ClientData clientData, Tcl_Interp *interp,
724 	int code);
725 typedef void (Tcl_ChannelProc) (ClientData clientData, int mask);
726 typedef void (Tcl_CloseProc) (ClientData data);
727 typedef void (Tcl_CmdDeleteProc) (ClientData clientData);
728 typedef int (Tcl_CmdProc) (ClientData clientData, Tcl_Interp *interp,
729 	int argc, CONST84 char *argv[]);
730 typedef void (Tcl_CmdTraceProc) (ClientData clientData, Tcl_Interp *interp,
731 	int level, char *command, Tcl_CmdProc *proc,
732 	ClientData cmdClientData, int argc, CONST84 char *argv[]);
733 typedef int (Tcl_CmdObjTraceProc) (ClientData clientData, Tcl_Interp *interp,
734 	int level, const char *command, Tcl_Command commandInfo, int objc,
735 	struct Tcl_Obj *const *objv);
736 typedef void (Tcl_CmdObjTraceDeleteProc) (ClientData clientData);
737 typedef void (Tcl_DupInternalRepProc) (struct Tcl_Obj *srcPtr,
738 	struct Tcl_Obj *dupPtr);
739 typedef int (Tcl_EncodingConvertProc) (ClientData clientData, const char *src,
740 	int srcLen, int flags, Tcl_EncodingState *statePtr, char *dst,
741 	int dstLen, int *srcReadPtr, int *dstWrotePtr, int *dstCharsPtr);
742 typedef void (Tcl_EncodingFreeProc) (ClientData clientData);
743 typedef int (Tcl_EventProc) (Tcl_Event *evPtr, int flags);
744 typedef void (Tcl_EventCheckProc) (ClientData clientData, int flags);
745 typedef int (Tcl_EventDeleteProc) (Tcl_Event *evPtr, ClientData clientData);
746 typedef void (Tcl_EventSetupProc) (ClientData clientData, int flags);
747 typedef void (Tcl_ExitProc) (ClientData clientData);
748 typedef void (Tcl_FileProc) (ClientData clientData, int mask);
749 typedef void (Tcl_FileFreeProc) (ClientData clientData);
750 typedef void (Tcl_FreeInternalRepProc) (struct Tcl_Obj *objPtr);
751 typedef void (Tcl_FreeProc) (char *blockPtr);
752 typedef void (Tcl_IdleProc) (ClientData clientData);
753 typedef void (Tcl_InterpDeleteProc) (ClientData clientData,
754 	Tcl_Interp *interp);
755 typedef int (Tcl_MathProc) (ClientData clientData, Tcl_Interp *interp,
756 	Tcl_Value *args, Tcl_Value *resultPtr);
757 typedef void (Tcl_NamespaceDeleteProc) (ClientData clientData);
758 typedef int (Tcl_ObjCmdProc) (ClientData clientData, Tcl_Interp *interp,
759 	int objc, struct Tcl_Obj *const *objv);
760 typedef int (Tcl_PackageInitProc) (Tcl_Interp *interp);
761 typedef int (Tcl_PackageUnloadProc) (Tcl_Interp *interp, int flags);
762 typedef void (Tcl_PanicProc) (const char *format, ...);
763 typedef void (Tcl_TcpAcceptProc) (ClientData callbackData, Tcl_Channel chan,
764 	char *address, int port);
765 typedef void (Tcl_TimerProc) (ClientData clientData);
766 typedef int (Tcl_SetFromAnyProc) (Tcl_Interp *interp, struct Tcl_Obj *objPtr);
767 typedef void (Tcl_UpdateStringProc) (struct Tcl_Obj *objPtr);
768 typedef char * (Tcl_VarTraceProc) (ClientData clientData, Tcl_Interp *interp,
769 	CONST84 char *part1, CONST84 char *part2, int flags);
770 typedef void (Tcl_CommandTraceProc) (ClientData clientData, Tcl_Interp *interp,
771 	const char *oldName, const char *newName, int flags);
772 typedef void (Tcl_CreateFileHandlerProc) (int fd, int mask, Tcl_FileProc *proc,
773 	ClientData clientData);
774 typedef void (Tcl_DeleteFileHandlerProc) (int fd);
775 typedef void (Tcl_AlertNotifierProc) (ClientData clientData);
776 typedef void (Tcl_ServiceModeHookProc) (int mode);
777 typedef ClientData (Tcl_InitNotifierProc) (void);
778 typedef void (Tcl_FinalizeNotifierProc) (ClientData clientData);
779 typedef void (Tcl_MainLoopProc) (void);
780 
781 /*
782  *----------------------------------------------------------------------------
783  * The following structure represents a type of object, which is a particular
784  * internal representation for an object plus a set of functions that provide
785  * standard operations on objects of that type.
786  */
787 
788 typedef struct Tcl_ObjType {
789     const char *name;		/* Name of the type, e.g. "int". */
790     Tcl_FreeInternalRepProc *freeIntRepProc;
791 				/* Called to free any storage for the type's
792 				 * internal rep. NULL if the internal rep does
793 				 * not need freeing. */
794     Tcl_DupInternalRepProc *dupIntRepProc;
795 				/* Called to create a new object as a copy of
796 				 * an existing object. */
797     Tcl_UpdateStringProc *updateStringProc;
798 				/* Called to update the string rep from the
799 				 * type's internal representation. */
800     Tcl_SetFromAnyProc *setFromAnyProc;
801 				/* Called to convert the object's internal rep
802 				 * to this type. Frees the internal rep of the
803 				 * old type. Returns TCL_ERROR on failure. */
804 } Tcl_ObjType;
805 
806 /*
807  * One of the following structures exists for each object in the Tcl system.
808  * An object stores a value as either a string, some internal representation,
809  * or both.
810  */
811 
812 typedef struct Tcl_Obj {
813     int refCount;		/* When 0 the object will be freed. */
814     char *bytes;		/* This points to the first byte of the
815 				 * object's string representation. The array
816 				 * must be followed by a null byte (i.e., at
817 				 * offset length) but may also contain
818 				 * embedded null characters. The array's
819 				 * storage is allocated by ckalloc. NULL means
820 				 * the string rep is invalid and must be
821 				 * regenerated from the internal rep.  Clients
822 				 * should use Tcl_GetStringFromObj or
823 				 * Tcl_GetString to get a pointer to the byte
824 				 * array as a readonly value. */
825     int length;			/* The number of bytes at *bytes, not
826 				 * including the terminating null. */
827     const Tcl_ObjType *typePtr;	/* Denotes the object's type. Always
828 				 * corresponds to the type of the object's
829 				 * internal rep. NULL indicates the object has
830 				 * no internal rep (has no type). */
831     union {			/* The internal representation: */
832 	long longValue;		/*   - an long integer value. */
833 	double doubleValue;	/*   - a double-precision floating value. */
834 	void *otherValuePtr;	/*   - another, type-specific value. */
835 	Tcl_WideInt wideValue;	/*   - a long long value. */
836 	struct {		/*   - internal rep as two pointers. */
837 	    void *ptr1;
838 	    void *ptr2;
839 	} twoPtrValue;
840 	struct {		/*   - internal rep as a pointer and a long,
841 				 *     the main use of which is a bignum's
842 				 *     tightly packed fields, where the alloc,
843 				 *     used and signum flags are packed into a
844 				 *     single word with everything else hung
845 				 *     off the pointer. */
846 	    void *ptr;
847 	    unsigned long value;
848 	} ptrAndLongRep;
849     } internalRep;
850 } Tcl_Obj;
851 
852 /*
853  * Macros to increment and decrement a Tcl_Obj's reference count, and to test
854  * whether an object is shared (i.e. has reference count > 1). Note: clients
855  * should use Tcl_DecrRefCount() when they are finished using an object, and
856  * should never call TclFreeObj() directly. TclFreeObj() is only defined and
857  * made public in tcl.h to support Tcl_DecrRefCount's macro definition.
858  */
859 
860 void		Tcl_IncrRefCount(Tcl_Obj *objPtr);
861 void		Tcl_DecrRefCount(Tcl_Obj *objPtr);
862 int		Tcl_IsShared(Tcl_Obj *objPtr);
863 
864 /*
865  *----------------------------------------------------------------------------
866  * The following structure contains the state needed by Tcl_SaveResult. No-one
867  * outside of Tcl should access any of these fields. This structure is
868  * typically allocated on the stack.
869  */
870 
871 typedef struct Tcl_SavedResult {
872     char *result;
873     Tcl_FreeProc *freeProc;
874     Tcl_Obj *objResultPtr;
875     char *appendResult;
876     int appendAvl;
877     int appendUsed;
878     char resultSpace[TCL_RESULT_SIZE+1];
879 } Tcl_SavedResult;
880 
881 /*
882  *----------------------------------------------------------------------------
883  * The following definitions support Tcl's namespace facility. Note: the first
884  * five fields must match exactly the fields in a Namespace structure (see
885  * tclInt.h).
886  */
887 
888 typedef struct Tcl_Namespace {
889     char *name;			/* The namespace's name within its parent
890 				 * namespace. This contains no ::'s. The name
891 				 * of the global namespace is "" although "::"
892 				 * is an synonym. */
893     char *fullName;		/* The namespace's fully qualified name. This
894 				 * starts with ::. */
895     ClientData clientData;	/* Arbitrary value associated with this
896 				 * namespace. */
897     Tcl_NamespaceDeleteProc *deleteProc;
898 				/* Function invoked when deleting the
899 				 * namespace to, e.g., free clientData. */
900     struct Tcl_Namespace *parentPtr;
901 				/* Points to the namespace that contains this
902 				 * one. NULL if this is the global
903 				 * namespace. */
904 } Tcl_Namespace;
905 
906 /*
907  *----------------------------------------------------------------------------
908  * The following structure represents a call frame, or activation record. A
909  * call frame defines a naming context for a procedure call: its local scope
910  * (for local variables) and its namespace scope (used for non-local
911  * variables; often the global :: namespace). A call frame can also define the
912  * naming context for a namespace eval or namespace inscope command: the
913  * namespace in which the command's code should execute. The Tcl_CallFrame
914  * structures exist only while procedures or namespace eval/inscope's are
915  * being executed, and provide a Tcl call stack.
916  *
917  * A call frame is initialized and pushed using Tcl_PushCallFrame and popped
918  * using Tcl_PopCallFrame. Storage for a Tcl_CallFrame must be provided by the
919  * Tcl_PushCallFrame caller, and callers typically allocate them on the C call
920  * stack for efficiency. For this reason, Tcl_CallFrame is defined as a
921  * structure and not as an opaque token. However, most Tcl_CallFrame fields
922  * are hidden since applications should not access them directly; others are
923  * declared as "dummyX".
924  *
925  * WARNING!! The structure definition must be kept consistent with the
926  * CallFrame structure in tclInt.h. If you change one, change the other.
927  */
928 
929 typedef struct Tcl_CallFrame {
930     Tcl_Namespace *nsPtr;
931     int dummy1;
932     int dummy2;
933     void *dummy3;
934     void *dummy4;
935     void *dummy5;
936     int dummy6;
937     void *dummy7;
938     void *dummy8;
939     int dummy9;
940     void *dummy10;
941     void *dummy11;
942     void *dummy12;
943     void *dummy13;
944 } Tcl_CallFrame;
945 
946 /*
947  *----------------------------------------------------------------------------
948  * Information about commands that is returned by Tcl_GetCommandInfo and
949  * passed to Tcl_SetCommandInfo. objProc is an objc/objv object-based command
950  * function while proc is a traditional Tcl argc/argv string-based function.
951  * Tcl_CreateObjCommand and Tcl_CreateCommand ensure that both objProc and
952  * proc are non-NULL and can be called to execute the command. However, it may
953  * be faster to call one instead of the other. The member isNativeObjectProc
954  * is set to 1 if an object-based function was registered by
955  * Tcl_CreateObjCommand, and to 0 if a string-based function was registered by
956  * Tcl_CreateCommand. The other function is typically set to a compatibility
957  * wrapper that does string-to-object or object-to-string argument conversions
958  * then calls the other function.
959  */
960 
961 typedef struct Tcl_CmdInfo {
962     int isNativeObjectProc;	/* 1 if objProc was registered by a call to
963 				 * Tcl_CreateObjCommand; 0 otherwise.
964 				 * Tcl_SetCmdInfo does not modify this
965 				 * field. */
966     Tcl_ObjCmdProc *objProc;	/* Command's object-based function. */
967     ClientData objClientData;	/* ClientData for object proc. */
968     Tcl_CmdProc *proc;		/* Command's string-based function. */
969     ClientData clientData;	/* ClientData for string proc. */
970     Tcl_CmdDeleteProc *deleteProc;
971 				/* Function to call when command is
972 				 * deleted. */
973     ClientData deleteData;	/* Value to pass to deleteProc (usually the
974 				 * same as clientData). */
975     Tcl_Namespace *namespacePtr;/* Points to the namespace that contains this
976 				 * command. Note that Tcl_SetCmdInfo will not
977 				 * change a command's namespace; use
978 				 * TclRenameCommand or Tcl_Eval (of 'rename')
979 				 * to do that. */
980 } Tcl_CmdInfo;
981 
982 /*
983  *----------------------------------------------------------------------------
984  * The structure defined below is used to hold dynamic strings. The only
985  * fields that clients should use are string and length, accessible via the
986  * macros Tcl_DStringValue and Tcl_DStringLength.
987  */
988 
989 #define TCL_DSTRING_STATIC_SIZE 200
990 typedef struct Tcl_DString {
991     char *string;		/* Points to beginning of string: either
992 				 * staticSpace below or a malloced array. */
993     int length;			/* Number of non-NULL characters in the
994 				 * string. */
995     int spaceAvl;		/* Total number of bytes available for the
996 				 * string and its terminating NULL char. */
997     char staticSpace[TCL_DSTRING_STATIC_SIZE];
998 				/* Space to use in common case where string is
999 				 * small. */
1000 } Tcl_DString;
1001 
1002 #define Tcl_DStringLength(dsPtr) ((dsPtr)->length)
1003 #define Tcl_DStringValue(dsPtr) ((dsPtr)->string)
1004 #define Tcl_DStringTrunc Tcl_DStringSetLength
1005 
1006 /*
1007  * Definitions for the maximum number of digits of precision that may be
1008  * specified in the "tcl_precision" variable, and the number of bytes of
1009  * buffer space required by Tcl_PrintDouble.
1010  */
1011 
1012 #define TCL_MAX_PREC		17
1013 #define TCL_DOUBLE_SPACE	(TCL_MAX_PREC+10)
1014 
1015 /*
1016  * Definition for a number of bytes of buffer space sufficient to hold the
1017  * string representation of an integer in base 10 (assuming the existence of
1018  * 64-bit integers).
1019  */
1020 
1021 #define TCL_INTEGER_SPACE	24
1022 
1023 /*
1024  * Flag values passed to Tcl_ConvertElement.
1025  * TCL_DONT_USE_BRACES forces it not to enclose the element in braces, but to
1026  *	use backslash quoting instead.
1027  * TCL_DONT_QUOTE_HASH disables the default quoting of the '#' character. It
1028  *	is safe to leave the hash unquoted when the element is not the first
1029  *	element of a list, and this flag can be used by the caller to indicate
1030  *	that condition.
1031  */
1032 
1033 #define TCL_DONT_USE_BRACES	1
1034 #define TCL_DONT_QUOTE_HASH	8
1035 
1036 /*
1037  * Flag that may be passed to Tcl_GetIndexFromObj to force it to disallow
1038  * abbreviated strings.
1039  */
1040 
1041 #define TCL_EXACT	1
1042 
1043 /*
1044  *----------------------------------------------------------------------------
1045  * Flag values passed to Tcl_RecordAndEval, Tcl_EvalObj, Tcl_EvalObjv.
1046  * WARNING: these bit choices must not conflict with the bit choices for
1047  * evalFlag bits in tclInt.h!
1048  *
1049  * Meanings:
1050  *	TCL_NO_EVAL:		Just record this command
1051  *	TCL_EVAL_GLOBAL:	Execute script in global namespace
1052  *	TCL_EVAL_DIRECT:	Do not compile this script
1053  *	TCL_EVAL_INVOKE:	Magical Tcl_EvalObjv mode for aliases/ensembles
1054  *				o Run in iPtr->lookupNsPtr or global namespace
1055  *				o Cut out of error traces
1056  *				o Don't reset the flags controlling ensemble
1057  *				  error message rewriting.
1058  *	TCL_CANCEL_UNWIND:	Magical Tcl_CancelEval mode that causes the
1059  *				stack for the script in progress to be
1060  *				completely unwound.
1061  *	TCL_EVAL_NOERR:	Do no exception reporting at all, just return
1062  *				as the caller will report.
1063  */
1064 
1065 #define TCL_NO_EVAL		0x010000
1066 #define TCL_EVAL_GLOBAL		0x020000
1067 #define TCL_EVAL_DIRECT		0x040000
1068 #define TCL_EVAL_INVOKE		0x080000
1069 #define TCL_CANCEL_UNWIND	0x100000
1070 #define TCL_EVAL_NOERR          0x200000
1071 
1072 /*
1073  * Special freeProc values that may be passed to Tcl_SetResult (see the man
1074  * page for details):
1075  */
1076 
1077 #define TCL_VOLATILE		((Tcl_FreeProc *) 1)
1078 #define TCL_STATIC		((Tcl_FreeProc *) 0)
1079 #define TCL_DYNAMIC		((Tcl_FreeProc *) 3)
1080 
1081 /*
1082  * Flag values passed to variable-related functions.
1083  * WARNING: these bit choices must not conflict with the bit choice for
1084  * TCL_CANCEL_UNWIND, above.
1085  */
1086 
1087 #define TCL_GLOBAL_ONLY		 1
1088 #define TCL_NAMESPACE_ONLY	 2
1089 #define TCL_APPEND_VALUE	 4
1090 #define TCL_LIST_ELEMENT	 8
1091 #define TCL_TRACE_READS		 0x10
1092 #define TCL_TRACE_WRITES	 0x20
1093 #define TCL_TRACE_UNSETS	 0x40
1094 #define TCL_TRACE_DESTROYED	 0x80
1095 #define TCL_INTERP_DESTROYED	 0x100
1096 #define TCL_LEAVE_ERR_MSG	 0x200
1097 #define TCL_TRACE_ARRAY		 0x800
1098 #ifndef TCL_REMOVE_OBSOLETE_TRACES
1099 /* Required to support old variable/vdelete/vinfo traces. */
1100 #define TCL_TRACE_OLD_STYLE	 0x1000
1101 #endif
1102 /* Indicate the semantics of the result of a trace. */
1103 #define TCL_TRACE_RESULT_DYNAMIC 0x8000
1104 #define TCL_TRACE_RESULT_OBJECT  0x10000
1105 
1106 /*
1107  * Flag values for ensemble commands.
1108  */
1109 
1110 #define TCL_ENSEMBLE_PREFIX 0x02/* Flag value to say whether to allow
1111 				 * unambiguous prefixes of commands or to
1112 				 * require exact matches for command names. */
1113 
1114 /*
1115  * Flag values passed to command-related functions.
1116  */
1117 
1118 #define TCL_TRACE_RENAME	0x2000
1119 #define TCL_TRACE_DELETE	0x4000
1120 
1121 #define TCL_ALLOW_INLINE_COMPILATION 0x20000
1122 
1123 /*
1124  * The TCL_PARSE_PART1 flag is deprecated and has no effect. The part1 is now
1125  * always parsed whenever the part2 is NULL. (This is to avoid a common error
1126  * when converting code to use the new object based APIs and forgetting to
1127  * give the flag)
1128  */
1129 
1130 #ifndef TCL_NO_DEPRECATED
1131 #   define TCL_PARSE_PART1	0x400
1132 #endif
1133 
1134 /*
1135  * Types for linked variables:
1136  */
1137 
1138 #define TCL_LINK_INT		1
1139 #define TCL_LINK_DOUBLE		2
1140 #define TCL_LINK_BOOLEAN	3
1141 #define TCL_LINK_STRING		4
1142 #define TCL_LINK_WIDE_INT	5
1143 #define TCL_LINK_CHAR		6
1144 #define TCL_LINK_UCHAR		7
1145 #define TCL_LINK_SHORT		8
1146 #define TCL_LINK_USHORT		9
1147 #define TCL_LINK_UINT		10
1148 #define TCL_LINK_LONG		11
1149 #define TCL_LINK_ULONG		12
1150 #define TCL_LINK_FLOAT		13
1151 #define TCL_LINK_WIDE_UINT	14
1152 #define TCL_LINK_READ_ONLY	0x80
1153 
1154 /*
1155  *----------------------------------------------------------------------------
1156  * Forward declarations of Tcl_HashTable and related types.
1157  */
1158 
1159 typedef struct Tcl_HashKeyType Tcl_HashKeyType;
1160 typedef struct Tcl_HashTable Tcl_HashTable;
1161 typedef struct Tcl_HashEntry Tcl_HashEntry;
1162 
1163 typedef unsigned (Tcl_HashKeyProc) (Tcl_HashTable *tablePtr, void *keyPtr);
1164 typedef int (Tcl_CompareHashKeysProc) (void *keyPtr, Tcl_HashEntry *hPtr);
1165 typedef Tcl_HashEntry * (Tcl_AllocHashEntryProc) (Tcl_HashTable *tablePtr,
1166 	void *keyPtr);
1167 typedef void (Tcl_FreeHashEntryProc) (Tcl_HashEntry *hPtr);
1168 
1169 /*
1170  * This flag controls whether the hash table stores the hash of a key, or
1171  * recalculates it. There should be no reason for turning this flag off as it
1172  * is completely binary and source compatible unless you directly access the
1173  * bucketPtr member of the Tcl_HashTableEntry structure. This member has been
1174  * removed and the space used to store the hash value.
1175  */
1176 
1177 #ifndef TCL_HASH_KEY_STORE_HASH
1178 #   define TCL_HASH_KEY_STORE_HASH 1
1179 #endif
1180 
1181 /*
1182  * Structure definition for an entry in a hash table. No-one outside Tcl
1183  * should access any of these fields directly; use the macros defined below.
1184  */
1185 
1186 struct Tcl_HashEntry {
1187     Tcl_HashEntry *nextPtr;	/* Pointer to next entry in this hash bucket,
1188 				 * or NULL for end of chain. */
1189     Tcl_HashTable *tablePtr;	/* Pointer to table containing entry. */
1190 #if TCL_HASH_KEY_STORE_HASH
1191     void *hash;			/* Hash value, stored as pointer to ensure
1192 				 * that the offsets of the fields in this
1193 				 * structure are not changed. */
1194 #else
1195     Tcl_HashEntry **bucketPtr;	/* Pointer to bucket that points to first
1196 				 * entry in this entry's chain: used for
1197 				 * deleting the entry. */
1198 #endif
1199     ClientData clientData;	/* Application stores something here with
1200 				 * Tcl_SetHashValue. */
1201     union {			/* Key has one of these forms: */
1202 	char *oneWordValue;	/* One-word value for key. */
1203 	Tcl_Obj *objPtr;	/* Tcl_Obj * key value. */
1204 	int words[1];		/* Multiple integer words for key. The actual
1205 				 * size will be as large as necessary for this
1206 				 * table's keys. */
1207 	char string[1];		/* String for key. The actual size will be as
1208 				 * large as needed to hold the key. */
1209     } key;			/* MUST BE LAST FIELD IN RECORD!! */
1210 };
1211 
1212 /*
1213  * Flags used in Tcl_HashKeyType.
1214  *
1215  * TCL_HASH_KEY_RANDOMIZE_HASH -
1216  *				There are some things, pointers for example
1217  *				which don't hash well because they do not use
1218  *				the lower bits. If this flag is set then the
1219  *				hash table will attempt to rectify this by
1220  *				randomising the bits and then using the upper
1221  *				N bits as the index into the table.
1222  * TCL_HASH_KEY_SYSTEM_HASH -	If this flag is set then all memory internally
1223  *                              allocated for the hash table that is not for an
1224  *                              entry will use the system heap.
1225  */
1226 
1227 #define TCL_HASH_KEY_RANDOMIZE_HASH 0x1
1228 #define TCL_HASH_KEY_SYSTEM_HASH    0x2
1229 
1230 /*
1231  * Structure definition for the methods associated with a hash table key type.
1232  */
1233 
1234 #define TCL_HASH_KEY_TYPE_VERSION 1
1235 struct Tcl_HashKeyType {
1236     int version;		/* Version of the table. If this structure is
1237 				 * extended in future then the version can be
1238 				 * used to distinguish between different
1239 				 * structures. */
1240     int flags;			/* Flags, see above for details. */
1241     Tcl_HashKeyProc *hashKeyProc;
1242 				/* Calculates a hash value for the key. If
1243 				 * this is NULL then the pointer itself is
1244 				 * used as a hash value. */
1245     Tcl_CompareHashKeysProc *compareKeysProc;
1246 				/* Compares two keys and returns zero if they
1247 				 * do not match, and non-zero if they do. If
1248 				 * this is NULL then the pointers are
1249 				 * compared. */
1250     Tcl_AllocHashEntryProc *allocEntryProc;
1251 				/* Called to allocate memory for a new entry,
1252 				 * i.e. if the key is a string then this could
1253 				 * allocate a single block which contains
1254 				 * enough space for both the entry and the
1255 				 * string. Only the key field of the allocated
1256 				 * Tcl_HashEntry structure needs to be filled
1257 				 * in. If something else needs to be done to
1258 				 * the key, i.e. incrementing a reference
1259 				 * count then that should be done by this
1260 				 * function. If this is NULL then Tcl_Alloc is
1261 				 * used to allocate enough space for a
1262 				 * Tcl_HashEntry and the key pointer is
1263 				 * assigned to key.oneWordValue. */
1264     Tcl_FreeHashEntryProc *freeEntryProc;
1265 				/* Called to free memory associated with an
1266 				 * entry. If something else needs to be done
1267 				 * to the key, i.e. decrementing a reference
1268 				 * count then that should be done by this
1269 				 * function. If this is NULL then Tcl_Free is
1270 				 * used to free the Tcl_HashEntry. */
1271 };
1272 
1273 /*
1274  * Structure definition for a hash table.  Must be in tcl.h so clients can
1275  * allocate space for these structures, but clients should never access any
1276  * fields in this structure.
1277  */
1278 
1279 #define TCL_SMALL_HASH_TABLE 4
1280 struct Tcl_HashTable {
1281     Tcl_HashEntry **buckets;	/* Pointer to bucket array. Each element
1282 				 * points to first entry in bucket's hash
1283 				 * chain, or NULL. */
1284     Tcl_HashEntry *staticBuckets[TCL_SMALL_HASH_TABLE];
1285 				/* Bucket array used for small tables (to
1286 				 * avoid mallocs and frees). */
1287     int numBuckets;		/* Total number of buckets allocated at
1288 				 * **bucketPtr. */
1289     int numEntries;		/* Total number of entries present in
1290 				 * table. */
1291     int rebuildSize;		/* Enlarge table when numEntries gets to be
1292 				 * this large. */
1293     int downShift;		/* Shift count used in hashing function.
1294 				 * Designed to use high-order bits of
1295 				 * randomized keys. */
1296     int mask;			/* Mask value used in hashing function. */
1297     int keyType;		/* Type of keys used in this table. It's
1298 				 * either TCL_CUSTOM_KEYS, TCL_STRING_KEYS,
1299 				 * TCL_ONE_WORD_KEYS, or an integer giving the
1300 				 * number of ints that is the size of the
1301 				 * key. */
1302     Tcl_HashEntry *(*findProc) (Tcl_HashTable *tablePtr, const char *key);
1303     Tcl_HashEntry *(*createProc) (Tcl_HashTable *tablePtr, const char *key,
1304 	    int *newPtr);
1305     const Tcl_HashKeyType *typePtr;
1306 				/* Type of the keys used in the
1307 				 * Tcl_HashTable. */
1308 };
1309 
1310 /*
1311  * Structure definition for information used to keep track of searches through
1312  * hash tables:
1313  */
1314 
1315 typedef struct Tcl_HashSearch {
1316     Tcl_HashTable *tablePtr;	/* Table being searched. */
1317     int nextIndex;		/* Index of next bucket to be enumerated after
1318 				 * present one. */
1319     Tcl_HashEntry *nextEntryPtr;/* Next entry to be enumerated in the current
1320 				 * bucket. */
1321 } Tcl_HashSearch;
1322 
1323 /*
1324  * Acceptable key types for hash tables:
1325  *
1326  * TCL_STRING_KEYS:		The keys are strings, they are copied into the
1327  *				entry.
1328  * TCL_ONE_WORD_KEYS:		The keys are pointers, the pointer is stored
1329  *				in the entry.
1330  * TCL_CUSTOM_TYPE_KEYS:	The keys are arbitrary types which are copied
1331  *				into the entry.
1332  * TCL_CUSTOM_PTR_KEYS:		The keys are pointers to arbitrary types, the
1333  *				pointer is stored in the entry.
1334  *
1335  * While maintaining binary compatability the above have to be distinct values
1336  * as they are used to differentiate between old versions of the hash table
1337  * which don't have a typePtr and new ones which do. Once binary compatability
1338  * is discarded in favour of making more wide spread changes TCL_STRING_KEYS
1339  * can be the same as TCL_CUSTOM_TYPE_KEYS, and TCL_ONE_WORD_KEYS can be the
1340  * same as TCL_CUSTOM_PTR_KEYS because they simply determine how the key is
1341  * accessed from the entry and not the behaviour.
1342  */
1343 
1344 #define TCL_STRING_KEYS		(0)
1345 #define TCL_ONE_WORD_KEYS	(1)
1346 #define TCL_CUSTOM_TYPE_KEYS	(-2)
1347 #define TCL_CUSTOM_PTR_KEYS	(-1)
1348 
1349 /*
1350  * Structure definition for information used to keep track of searches through
1351  * dictionaries. These fields should not be accessed by code outside
1352  * tclDictObj.c
1353  */
1354 
1355 typedef struct {
1356     void *next;			/* Search position for underlying hash
1357 				 * table. */
1358     int epoch;			/* Epoch marker for dictionary being searched,
1359 				 * or -1 if search has terminated. */
1360     Tcl_Dict dictionaryPtr;	/* Reference to dictionary being searched. */
1361 } Tcl_DictSearch;
1362 
1363 /*
1364  *----------------------------------------------------------------------------
1365  * Flag values to pass to Tcl_DoOneEvent to disable searches for some kinds of
1366  * events:
1367  */
1368 
1369 #define TCL_DONT_WAIT		(1<<1)
1370 #define TCL_WINDOW_EVENTS	(1<<2)
1371 #define TCL_FILE_EVENTS		(1<<3)
1372 #define TCL_TIMER_EVENTS	(1<<4)
1373 #define TCL_IDLE_EVENTS		(1<<5)	/* WAS 0x10 ???? */
1374 #define TCL_ALL_EVENTS		(~TCL_DONT_WAIT)
1375 
1376 /*
1377  * The following structure defines a generic event for the Tcl event system.
1378  * These are the things that are queued in calls to Tcl_QueueEvent and
1379  * serviced later by Tcl_DoOneEvent. There can be many different kinds of
1380  * events with different fields, corresponding to window events, timer events,
1381  * etc. The structure for a particular event consists of a Tcl_Event header
1382  * followed by additional information specific to that event.
1383  */
1384 
1385 struct Tcl_Event {
1386     Tcl_EventProc *proc;	/* Function to call to service this event. */
1387     struct Tcl_Event *nextPtr;	/* Next in list of pending events, or NULL. */
1388 };
1389 
1390 /*
1391  * Positions to pass to Tcl_QueueEvent:
1392  */
1393 
1394 typedef enum {
1395     TCL_QUEUE_TAIL, TCL_QUEUE_HEAD, TCL_QUEUE_MARK
1396 } Tcl_QueuePosition;
1397 
1398 /*
1399  * Values to pass to Tcl_SetServiceMode to specify the behavior of notifier
1400  * event routines.
1401  */
1402 
1403 #define TCL_SERVICE_NONE 0
1404 #define TCL_SERVICE_ALL 1
1405 
1406 /*
1407  * The following structure keeps is used to hold a time value, either as an
1408  * absolute time (the number of seconds from the epoch) or as an elapsed time.
1409  * On Unix systems the epoch is Midnight Jan 1, 1970 GMT.
1410  */
1411 
1412 typedef struct Tcl_Time {
1413     long sec;			/* Seconds. */
1414     long usec;			/* Microseconds. */
1415 } Tcl_Time;
1416 
1417 typedef void (Tcl_SetTimerProc) (CONST86 Tcl_Time *timePtr);
1418 typedef int (Tcl_WaitForEventProc) (CONST86 Tcl_Time *timePtr);
1419 
1420 /*
1421  * TIP #233 (Virtualized Time)
1422  */
1423 
1424 typedef void (Tcl_GetTimeProc)   (Tcl_Time *timebuf, ClientData clientData);
1425 typedef void (Tcl_ScaleTimeProc) (Tcl_Time *timebuf, ClientData clientData);
1426 
1427 /*
1428  *----------------------------------------------------------------------------
1429  * Bits to pass to Tcl_CreateFileHandler and Tcl_CreateChannelHandler to
1430  * indicate what sorts of events are of interest:
1431  */
1432 
1433 #define TCL_READABLE		(1<<1)
1434 #define TCL_WRITABLE		(1<<2)
1435 #define TCL_EXCEPTION		(1<<3)
1436 
1437 /*
1438  * Flag values to pass to Tcl_OpenCommandChannel to indicate the disposition
1439  * of the stdio handles. TCL_STDIN, TCL_STDOUT, TCL_STDERR, are also used in
1440  * Tcl_GetStdChannel.
1441  */
1442 
1443 #define TCL_STDIN		(1<<1)
1444 #define TCL_STDOUT		(1<<2)
1445 #define TCL_STDERR		(1<<3)
1446 #define TCL_ENFORCE_MODE	(1<<4)
1447 
1448 /*
1449  * Bits passed to Tcl_DriverClose2Proc to indicate which side of a channel
1450  * should be closed.
1451  */
1452 
1453 #define TCL_CLOSE_READ		(1<<1)
1454 #define TCL_CLOSE_WRITE		(1<<2)
1455 
1456 /*
1457  * Value to use as the closeProc for a channel that supports the close2Proc
1458  * interface.
1459  */
1460 
1461 #define TCL_CLOSE2PROC		((Tcl_DriverCloseProc *) 1)
1462 
1463 /*
1464  * Channel version tag. This was introduced in 8.3.2/8.4.
1465  */
1466 
1467 #define TCL_CHANNEL_VERSION_1	((Tcl_ChannelTypeVersion) 0x1)
1468 #define TCL_CHANNEL_VERSION_2	((Tcl_ChannelTypeVersion) 0x2)
1469 #define TCL_CHANNEL_VERSION_3	((Tcl_ChannelTypeVersion) 0x3)
1470 #define TCL_CHANNEL_VERSION_4	((Tcl_ChannelTypeVersion) 0x4)
1471 #define TCL_CHANNEL_VERSION_5	((Tcl_ChannelTypeVersion) 0x5)
1472 
1473 /*
1474  * TIP #218: Channel Actions, Ids for Tcl_DriverThreadActionProc.
1475  */
1476 
1477 #define TCL_CHANNEL_THREAD_INSERT (0)
1478 #define TCL_CHANNEL_THREAD_REMOVE (1)
1479 
1480 /*
1481  * Typedefs for the various operations in a channel type:
1482  */
1483 
1484 typedef int	(Tcl_DriverBlockModeProc) (ClientData instanceData, int mode);
1485 typedef int	(Tcl_DriverCloseProc) (ClientData instanceData,
1486 			Tcl_Interp *interp);
1487 typedef int	(Tcl_DriverClose2Proc) (ClientData instanceData,
1488 			Tcl_Interp *interp, int flags);
1489 typedef int	(Tcl_DriverInputProc) (ClientData instanceData, char *buf,
1490 			int toRead, int *errorCodePtr);
1491 typedef int	(Tcl_DriverOutputProc) (ClientData instanceData,
1492 			CONST84 char *buf, int toWrite, int *errorCodePtr);
1493 typedef int	(Tcl_DriverSeekProc) (ClientData instanceData, long offset,
1494 			int mode, int *errorCodePtr);
1495 typedef int	(Tcl_DriverSetOptionProc) (ClientData instanceData,
1496 			Tcl_Interp *interp, const char *optionName,
1497 			const char *value);
1498 typedef int	(Tcl_DriverGetOptionProc) (ClientData instanceData,
1499 			Tcl_Interp *interp, CONST84 char *optionName,
1500 			Tcl_DString *dsPtr);
1501 typedef void	(Tcl_DriverWatchProc) (ClientData instanceData, int mask);
1502 typedef int	(Tcl_DriverGetHandleProc) (ClientData instanceData,
1503 			int direction, ClientData *handlePtr);
1504 typedef int	(Tcl_DriverFlushProc) (ClientData instanceData);
1505 typedef int	(Tcl_DriverHandlerProc) (ClientData instanceData,
1506 			int interestMask);
1507 typedef Tcl_WideInt (Tcl_DriverWideSeekProc) (ClientData instanceData,
1508 			Tcl_WideInt offset, int mode, int *errorCodePtr);
1509 /*
1510  * TIP #218, Channel Thread Actions
1511  */
1512 typedef void	(Tcl_DriverThreadActionProc) (ClientData instanceData,
1513 			int action);
1514 /*
1515  * TIP #208, File Truncation (etc.)
1516  */
1517 typedef int	(Tcl_DriverTruncateProc) (ClientData instanceData,
1518 			Tcl_WideInt length);
1519 
1520 /*
1521  * struct Tcl_ChannelType:
1522  *
1523  * One such structure exists for each type (kind) of channel. It collects
1524  * together in one place all the functions that are part of the specific
1525  * channel type.
1526  *
1527  * It is recommend that the Tcl_Channel* functions are used to access elements
1528  * of this structure, instead of direct accessing.
1529  */
1530 
1531 typedef struct Tcl_ChannelType {
1532     const char *typeName;	/* The name of the channel type in Tcl
1533 				 * commands. This storage is owned by channel
1534 				 * type. */
1535     Tcl_ChannelTypeVersion version;
1536 				/* Version of the channel type. */
1537     Tcl_DriverCloseProc *closeProc;
1538 				/* Function to call to close the channel, or
1539 				 * TCL_CLOSE2PROC if the close2Proc should be
1540 				 * used instead. */
1541     Tcl_DriverInputProc *inputProc;
1542 				/* Function to call for input on channel. */
1543     Tcl_DriverOutputProc *outputProc;
1544 				/* Function to call for output on channel. */
1545     Tcl_DriverSeekProc *seekProc;
1546 				/* Function to call to seek on the channel.
1547 				 * May be NULL. */
1548     Tcl_DriverSetOptionProc *setOptionProc;
1549 				/* Set an option on a channel. */
1550     Tcl_DriverGetOptionProc *getOptionProc;
1551 				/* Get an option from a channel. */
1552     Tcl_DriverWatchProc *watchProc;
1553 				/* Set up the notifier to watch for events on
1554 				 * this channel. */
1555     Tcl_DriverGetHandleProc *getHandleProc;
1556 				/* Get an OS handle from the channel or NULL
1557 				 * if not supported. */
1558     Tcl_DriverClose2Proc *close2Proc;
1559 				/* Function to call to close the channel if
1560 				 * the device supports closing the read &
1561 				 * write sides independently. */
1562     Tcl_DriverBlockModeProc *blockModeProc;
1563 				/* Set blocking mode for the raw channel. May
1564 				 * be NULL. */
1565     /*
1566      * Only valid in TCL_CHANNEL_VERSION_2 channels or later.
1567      */
1568     Tcl_DriverFlushProc *flushProc;
1569 				/* Function to call to flush a channel. May be
1570 				 * NULL. */
1571     Tcl_DriverHandlerProc *handlerProc;
1572 				/* Function to call to handle a channel event.
1573 				 * This will be passed up the stacked channel
1574 				 * chain. */
1575     /*
1576      * Only valid in TCL_CHANNEL_VERSION_3 channels or later.
1577      */
1578     Tcl_DriverWideSeekProc *wideSeekProc;
1579 				/* Function to call to seek on the channel
1580 				 * which can handle 64-bit offsets. May be
1581 				 * NULL, and must be NULL if seekProc is
1582 				 * NULL. */
1583     /*
1584      * Only valid in TCL_CHANNEL_VERSION_4 channels or later.
1585      * TIP #218, Channel Thread Actions.
1586      */
1587     Tcl_DriverThreadActionProc *threadActionProc;
1588 				/* Function to call to notify the driver of
1589 				 * thread specific activity for a channel. May
1590 				 * be NULL. */
1591     /*
1592      * Only valid in TCL_CHANNEL_VERSION_5 channels or later.
1593      * TIP #208, File Truncation.
1594      */
1595     Tcl_DriverTruncateProc *truncateProc;
1596 				/* Function to call to truncate the underlying
1597 				 * file to a particular length. May be NULL if
1598 				 * the channel does not support truncation. */
1599 } Tcl_ChannelType;
1600 
1601 /*
1602  * The following flags determine whether the blockModeProc above should set
1603  * the channel into blocking or nonblocking mode. They are passed as arguments
1604  * to the blockModeProc function in the above structure.
1605  */
1606 
1607 #define TCL_MODE_BLOCKING	0	/* Put channel into blocking mode. */
1608 #define TCL_MODE_NONBLOCKING	1	/* Put channel into nonblocking
1609 					 * mode. */
1610 
1611 /*
1612  *----------------------------------------------------------------------------
1613  * Enum for different types of file paths.
1614  */
1615 
1616 typedef enum Tcl_PathType {
1617     TCL_PATH_ABSOLUTE,
1618     TCL_PATH_RELATIVE,
1619     TCL_PATH_VOLUME_RELATIVE
1620 } Tcl_PathType;
1621 
1622 /*
1623  * The following structure is used to pass glob type data amongst the various
1624  * glob routines and Tcl_FSMatchInDirectory.
1625  */
1626 
1627 typedef struct Tcl_GlobTypeData {
1628     int type;			/* Corresponds to bcdpfls as in 'find -t'. */
1629     int perm;			/* Corresponds to file permissions. */
1630     Tcl_Obj *macType;		/* Acceptable Mac type. */
1631     Tcl_Obj *macCreator;	/* Acceptable Mac creator. */
1632 } Tcl_GlobTypeData;
1633 
1634 /*
1635  * Type and permission definitions for glob command.
1636  */
1637 
1638 #define TCL_GLOB_TYPE_BLOCK		(1<<0)
1639 #define TCL_GLOB_TYPE_CHAR		(1<<1)
1640 #define TCL_GLOB_TYPE_DIR		(1<<2)
1641 #define TCL_GLOB_TYPE_PIPE		(1<<3)
1642 #define TCL_GLOB_TYPE_FILE		(1<<4)
1643 #define TCL_GLOB_TYPE_LINK		(1<<5)
1644 #define TCL_GLOB_TYPE_SOCK		(1<<6)
1645 #define TCL_GLOB_TYPE_MOUNT		(1<<7)
1646 
1647 #define TCL_GLOB_PERM_RONLY		(1<<0)
1648 #define TCL_GLOB_PERM_HIDDEN		(1<<1)
1649 #define TCL_GLOB_PERM_R			(1<<2)
1650 #define TCL_GLOB_PERM_W			(1<<3)
1651 #define TCL_GLOB_PERM_X			(1<<4)
1652 
1653 /*
1654  * Flags for the unload callback function.
1655  */
1656 
1657 #define TCL_UNLOAD_DETACH_FROM_INTERPRETER	(1<<0)
1658 #define TCL_UNLOAD_DETACH_FROM_PROCESS		(1<<1)
1659 
1660 /*
1661  * Typedefs for the various filesystem operations:
1662  */
1663 
1664 typedef int (Tcl_FSStatProc) (Tcl_Obj *pathPtr, Tcl_StatBuf *buf);
1665 typedef int (Tcl_FSAccessProc) (Tcl_Obj *pathPtr, int mode);
1666 typedef Tcl_Channel (Tcl_FSOpenFileChannelProc) (Tcl_Interp *interp,
1667 	Tcl_Obj *pathPtr, int mode, int permissions);
1668 typedef int (Tcl_FSMatchInDirectoryProc) (Tcl_Interp *interp, Tcl_Obj *result,
1669 	Tcl_Obj *pathPtr, const char *pattern, Tcl_GlobTypeData *types);
1670 typedef Tcl_Obj * (Tcl_FSGetCwdProc) (Tcl_Interp *interp);
1671 typedef int (Tcl_FSChdirProc) (Tcl_Obj *pathPtr);
1672 typedef int (Tcl_FSLstatProc) (Tcl_Obj *pathPtr, Tcl_StatBuf *buf);
1673 typedef int (Tcl_FSCreateDirectoryProc) (Tcl_Obj *pathPtr);
1674 typedef int (Tcl_FSDeleteFileProc) (Tcl_Obj *pathPtr);
1675 typedef int (Tcl_FSCopyDirectoryProc) (Tcl_Obj *srcPathPtr,
1676 	Tcl_Obj *destPathPtr, Tcl_Obj **errorPtr);
1677 typedef int (Tcl_FSCopyFileProc) (Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr);
1678 typedef int (Tcl_FSRemoveDirectoryProc) (Tcl_Obj *pathPtr, int recursive,
1679 	Tcl_Obj **errorPtr);
1680 typedef int (Tcl_FSRenameFileProc) (Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr);
1681 typedef void (Tcl_FSUnloadFileProc) (Tcl_LoadHandle loadHandle);
1682 typedef Tcl_Obj * (Tcl_FSListVolumesProc) (void);
1683 /* We have to declare the utime structure here. */
1684 struct utimbuf;
1685 typedef int (Tcl_FSUtimeProc) (Tcl_Obj *pathPtr, struct utimbuf *tval);
1686 typedef int (Tcl_FSNormalizePathProc) (Tcl_Interp *interp, Tcl_Obj *pathPtr,
1687 	int nextCheckpoint);
1688 typedef int (Tcl_FSFileAttrsGetProc) (Tcl_Interp *interp, int index,
1689 	Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef);
1690 typedef const char *CONST86 * (Tcl_FSFileAttrStringsProc) (Tcl_Obj *pathPtr,
1691 	Tcl_Obj **objPtrRef);
1692 typedef int (Tcl_FSFileAttrsSetProc) (Tcl_Interp *interp, int index,
1693 	Tcl_Obj *pathPtr, Tcl_Obj *objPtr);
1694 typedef Tcl_Obj * (Tcl_FSLinkProc) (Tcl_Obj *pathPtr, Tcl_Obj *toPtr,
1695 	int linkType);
1696 typedef int (Tcl_FSLoadFileProc) (Tcl_Interp *interp, Tcl_Obj *pathPtr,
1697 	Tcl_LoadHandle *handlePtr, Tcl_FSUnloadFileProc **unloadProcPtr);
1698 typedef int (Tcl_FSPathInFilesystemProc) (Tcl_Obj *pathPtr,
1699 	ClientData *clientDataPtr);
1700 typedef Tcl_Obj * (Tcl_FSFilesystemPathTypeProc) (Tcl_Obj *pathPtr);
1701 typedef Tcl_Obj * (Tcl_FSFilesystemSeparatorProc) (Tcl_Obj *pathPtr);
1702 typedef void (Tcl_FSFreeInternalRepProc) (ClientData clientData);
1703 typedef ClientData (Tcl_FSDupInternalRepProc) (ClientData clientData);
1704 typedef Tcl_Obj * (Tcl_FSInternalToNormalizedProc) (ClientData clientData);
1705 typedef ClientData (Tcl_FSCreateInternalRepProc) (Tcl_Obj *pathPtr);
1706 
1707 typedef struct Tcl_FSVersion_ *Tcl_FSVersion;
1708 
1709 /*
1710  *----------------------------------------------------------------------------
1711  * Data structures related to hooking into the filesystem
1712  */
1713 
1714 /*
1715  * Filesystem version tag.  This was introduced in 8.4.
1716  */
1717 
1718 #define TCL_FILESYSTEM_VERSION_1	((Tcl_FSVersion) 0x1)
1719 
1720 /*
1721  * struct Tcl_Filesystem:
1722  *
1723  * One such structure exists for each type (kind) of filesystem. It collects
1724  * together in one place all the functions that are part of the specific
1725  * filesystem. Tcl always accesses the filesystem through one of these
1726  * structures.
1727  *
1728  * Not all entries need be non-NULL; any which are NULL are simply ignored.
1729  * However, a complete filesystem should provide all of these functions. The
1730  * explanations in the structure show the importance of each function.
1731  */
1732 
1733 typedef struct Tcl_Filesystem {
1734     const char *typeName;	/* The name of the filesystem. */
1735     int structureLength;	/* Length of this structure, so future binary
1736 				 * compatibility can be assured. */
1737     Tcl_FSVersion version;	/* Version of the filesystem type. */
1738     Tcl_FSPathInFilesystemProc *pathInFilesystemProc;
1739 				/* Function to check whether a path is in this
1740 				 * filesystem. This is the most important
1741 				 * filesystem function. */
1742     Tcl_FSDupInternalRepProc *dupInternalRepProc;
1743 				/* Function to duplicate internal fs rep. May
1744 				 * be NULL (but then fs is less efficient). */
1745     Tcl_FSFreeInternalRepProc *freeInternalRepProc;
1746 				/* Function to free internal fs rep. Must be
1747 				 * implemented if internal representations
1748 				 * need freeing, otherwise it can be NULL. */
1749     Tcl_FSInternalToNormalizedProc *internalToNormalizedProc;
1750 				/* Function to convert internal representation
1751 				 * to a normalized path. Only required if the
1752 				 * fs creates pure path objects with no
1753 				 * string/path representation. */
1754     Tcl_FSCreateInternalRepProc *createInternalRepProc;
1755 				/* Function to create a filesystem-specific
1756 				 * internal representation. May be NULL if
1757 				 * paths have no internal representation, or
1758 				 * if the Tcl_FSPathInFilesystemProc for this
1759 				 * filesystem always immediately creates an
1760 				 * internal representation for paths it
1761 				 * accepts. */
1762     Tcl_FSNormalizePathProc *normalizePathProc;
1763 				/* Function to normalize a path.  Should be
1764 				 * implemented for all filesystems which can
1765 				 * have multiple string representations for
1766 				 * the same path object. */
1767     Tcl_FSFilesystemPathTypeProc *filesystemPathTypeProc;
1768 				/* Function to determine the type of a path in
1769 				 * this filesystem. May be NULL. */
1770     Tcl_FSFilesystemSeparatorProc *filesystemSeparatorProc;
1771 				/* Function to return the separator
1772 				 * character(s) for this filesystem. Must be
1773 				 * implemented. */
1774     Tcl_FSStatProc *statProc;	/* Function to process a 'Tcl_FSStat()' call.
1775 				 * Must be implemented for any reasonable
1776 				 * filesystem. */
1777     Tcl_FSAccessProc *accessProc;
1778 				/* Function to process a 'Tcl_FSAccess()'
1779 				 * call. Must be implemented for any
1780 				 * reasonable filesystem. */
1781     Tcl_FSOpenFileChannelProc *openFileChannelProc;
1782 				/* Function to process a
1783 				 * 'Tcl_FSOpenFileChannel()' call. Must be
1784 				 * implemented for any reasonable
1785 				 * filesystem. */
1786     Tcl_FSMatchInDirectoryProc *matchInDirectoryProc;
1787 				/* Function to process a
1788 				 * 'Tcl_FSMatchInDirectory()'.  If not
1789 				 * implemented, then glob and recursive copy
1790 				 * functionality will be lacking in the
1791 				 * filesystem. */
1792     Tcl_FSUtimeProc *utimeProc;	/* Function to process a 'Tcl_FSUtime()' call.
1793 				 * Required to allow setting (not reading) of
1794 				 * times with 'file mtime', 'file atime' and
1795 				 * the open-r/open-w/fcopy implementation of
1796 				 * 'file copy'. */
1797     Tcl_FSLinkProc *linkProc;	/* Function to process a 'Tcl_FSLink()' call.
1798 				 * Should be implemented only if the
1799 				 * filesystem supports links (reading or
1800 				 * creating). */
1801     Tcl_FSListVolumesProc *listVolumesProc;
1802 				/* Function to list any filesystem volumes
1803 				 * added by this filesystem. Should be
1804 				 * implemented only if the filesystem adds
1805 				 * volumes at the head of the filesystem. */
1806     Tcl_FSFileAttrStringsProc *fileAttrStringsProc;
1807 				/* Function to list all attributes strings
1808 				 * which are valid for this filesystem. If not
1809 				 * implemented the filesystem will not support
1810 				 * the 'file attributes' command. This allows
1811 				 * arbitrary additional information to be
1812 				 * attached to files in the filesystem. */
1813     Tcl_FSFileAttrsGetProc *fileAttrsGetProc;
1814 				/* Function to process a
1815 				 * 'Tcl_FSFileAttrsGet()' call, used by 'file
1816 				 * attributes'. */
1817     Tcl_FSFileAttrsSetProc *fileAttrsSetProc;
1818 				/* Function to process a
1819 				 * 'Tcl_FSFileAttrsSet()' call, used by 'file
1820 				 * attributes'.  */
1821     Tcl_FSCreateDirectoryProc *createDirectoryProc;
1822 				/* Function to process a
1823 				 * 'Tcl_FSCreateDirectory()' call. Should be
1824 				 * implemented unless the FS is read-only. */
1825     Tcl_FSRemoveDirectoryProc *removeDirectoryProc;
1826 				/* Function to process a
1827 				 * 'Tcl_FSRemoveDirectory()' call. Should be
1828 				 * implemented unless the FS is read-only. */
1829     Tcl_FSDeleteFileProc *deleteFileProc;
1830 				/* Function to process a 'Tcl_FSDeleteFile()'
1831 				 * call. Should be implemented unless the FS
1832 				 * is read-only. */
1833     Tcl_FSCopyFileProc *copyFileProc;
1834 				/* Function to process a 'Tcl_FSCopyFile()'
1835 				 * call. If not implemented Tcl will fall back
1836 				 * on open-r, open-w and fcopy as a copying
1837 				 * mechanism, for copying actions initiated in
1838 				 * Tcl (not C). */
1839     Tcl_FSRenameFileProc *renameFileProc;
1840 				/* Function to process a 'Tcl_FSRenameFile()'
1841 				 * call. If not implemented, Tcl will fall
1842 				 * back on a copy and delete mechanism, for
1843 				 * rename actions initiated in Tcl (not C). */
1844     Tcl_FSCopyDirectoryProc *copyDirectoryProc;
1845 				/* Function to process a
1846 				 * 'Tcl_FSCopyDirectory()' call. If not
1847 				 * implemented, Tcl will fall back on a
1848 				 * recursive create-dir, file copy mechanism,
1849 				 * for copying actions initiated in Tcl (not
1850 				 * C). */
1851     Tcl_FSLstatProc *lstatProc;	/* Function to process a 'Tcl_FSLstat()' call.
1852 				 * If not implemented, Tcl will attempt to use
1853 				 * the 'statProc' defined above instead. */
1854     Tcl_FSLoadFileProc *loadFileProc;
1855 				/* Function to process a 'Tcl_FSLoadFile()'
1856 				 * call. If not implemented, Tcl will fall
1857 				 * back on a copy to native-temp followed by a
1858 				 * Tcl_FSLoadFile on that temporary copy. */
1859     Tcl_FSGetCwdProc *getCwdProc;
1860 				/* Function to process a 'Tcl_FSGetCwd()'
1861 				 * call. Most filesystems need not implement
1862 				 * this. It will usually only be called once,
1863 				 * if 'getcwd' is called before 'chdir'. May
1864 				 * be NULL. */
1865     Tcl_FSChdirProc *chdirProc;	/* Function to process a 'Tcl_FSChdir()' call.
1866 				 * If filesystems do not implement this, it
1867 				 * will be emulated by a series of directory
1868 				 * access checks. Otherwise, virtual
1869 				 * filesystems which do implement it need only
1870 				 * respond with a positive return result if
1871 				 * the dirName is a valid directory in their
1872 				 * filesystem. They need not remember the
1873 				 * result, since that will be automatically
1874 				 * remembered for use by GetCwd. Real
1875 				 * filesystems should carry out the correct
1876 				 * action (i.e. call the correct system
1877 				 * 'chdir' api). If not implemented, then 'cd'
1878 				 * and 'pwd' will fail inside the
1879 				 * filesystem. */
1880 } Tcl_Filesystem;
1881 
1882 /*
1883  * The following definitions are used as values for the 'linkAction' flag to
1884  * Tcl_FSLink, or the linkProc of any filesystem. Any combination of flags can
1885  * be given. For link creation, the linkProc should create a link which
1886  * matches any of the types given.
1887  *
1888  * TCL_CREATE_SYMBOLIC_LINK -	Create a symbolic or soft link.
1889  * TCL_CREATE_HARD_LINK -	Create a hard link.
1890  */
1891 
1892 #define TCL_CREATE_SYMBOLIC_LINK	0x01
1893 #define TCL_CREATE_HARD_LINK		0x02
1894 
1895 /*
1896  *----------------------------------------------------------------------------
1897  * The following structure represents the Notifier functions that you can
1898  * override with the Tcl_SetNotifier call.
1899  */
1900 
1901 typedef struct Tcl_NotifierProcs {
1902     Tcl_SetTimerProc *setTimerProc;
1903     Tcl_WaitForEventProc *waitForEventProc;
1904     Tcl_CreateFileHandlerProc *createFileHandlerProc;
1905     Tcl_DeleteFileHandlerProc *deleteFileHandlerProc;
1906     Tcl_InitNotifierProc *initNotifierProc;
1907     Tcl_FinalizeNotifierProc *finalizeNotifierProc;
1908     Tcl_AlertNotifierProc *alertNotifierProc;
1909     Tcl_ServiceModeHookProc *serviceModeHookProc;
1910 } Tcl_NotifierProcs;
1911 
1912 /*
1913  *----------------------------------------------------------------------------
1914  * The following data structures and declarations are for the new Tcl parser.
1915  *
1916  * For each word of a command, and for each piece of a word such as a variable
1917  * reference, one of the following structures is created to describe the
1918  * token.
1919  */
1920 
1921 typedef struct Tcl_Token {
1922     int type;			/* Type of token, such as TCL_TOKEN_WORD; see
1923 				 * below for valid types. */
1924     const char *start;		/* First character in token. */
1925     int size;			/* Number of bytes in token. */
1926     int numComponents;		/* If this token is composed of other tokens,
1927 				 * this field tells how many of them there are
1928 				 * (including components of components, etc.).
1929 				 * The component tokens immediately follow
1930 				 * this one. */
1931 } Tcl_Token;
1932 
1933 /*
1934  * Type values defined for Tcl_Token structures. These values are defined as
1935  * mask bits so that it's easy to check for collections of types.
1936  *
1937  * TCL_TOKEN_WORD -		The token describes one word of a command,
1938  *				from the first non-blank character of the word
1939  *				(which may be " or {) up to but not including
1940  *				the space, semicolon, or bracket that
1941  *				terminates the word. NumComponents counts the
1942  *				total number of sub-tokens that make up the
1943  *				word. This includes, for example, sub-tokens
1944  *				of TCL_TOKEN_VARIABLE tokens.
1945  * TCL_TOKEN_SIMPLE_WORD -	This token is just like TCL_TOKEN_WORD except
1946  *				that the word is guaranteed to consist of a
1947  *				single TCL_TOKEN_TEXT sub-token.
1948  * TCL_TOKEN_TEXT -		The token describes a range of literal text
1949  *				that is part of a word. NumComponents is
1950  *				always 0.
1951  * TCL_TOKEN_BS -		The token describes a backslash sequence that
1952  *				must be collapsed. NumComponents is always 0.
1953  * TCL_TOKEN_COMMAND -		The token describes a command whose result
1954  *				must be substituted into the word. The token
1955  *				includes the enclosing brackets. NumComponents
1956  *				is always 0.
1957  * TCL_TOKEN_VARIABLE -		The token describes a variable substitution,
1958  *				including the dollar sign, variable name, and
1959  *				array index (if there is one) up through the
1960  *				right parentheses. NumComponents tells how
1961  *				many additional tokens follow to represent the
1962  *				variable name. The first token will be a
1963  *				TCL_TOKEN_TEXT token that describes the
1964  *				variable name. If the variable is an array
1965  *				reference then there will be one or more
1966  *				additional tokens, of type TCL_TOKEN_TEXT,
1967  *				TCL_TOKEN_BS, TCL_TOKEN_COMMAND, and
1968  *				TCL_TOKEN_VARIABLE, that describe the array
1969  *				index; numComponents counts the total number
1970  *				of nested tokens that make up the variable
1971  *				reference, including sub-tokens of
1972  *				TCL_TOKEN_VARIABLE tokens.
1973  * TCL_TOKEN_SUB_EXPR -		The token describes one subexpression of an
1974  *				expression, from the first non-blank character
1975  *				of the subexpression up to but not including
1976  *				the space, brace, or bracket that terminates
1977  *				the subexpression. NumComponents counts the
1978  *				total number of following subtokens that make
1979  *				up the subexpression; this includes all
1980  *				subtokens for any nested TCL_TOKEN_SUB_EXPR
1981  *				tokens. For example, a numeric value used as a
1982  *				primitive operand is described by a
1983  *				TCL_TOKEN_SUB_EXPR token followed by a
1984  *				TCL_TOKEN_TEXT token. A binary subexpression
1985  *				is described by a TCL_TOKEN_SUB_EXPR token
1986  *				followed by the TCL_TOKEN_OPERATOR token for
1987  *				the operator, then TCL_TOKEN_SUB_EXPR tokens
1988  *				for the left then the right operands.
1989  * TCL_TOKEN_OPERATOR -		The token describes one expression operator.
1990  *				An operator might be the name of a math
1991  *				function such as "abs". A TCL_TOKEN_OPERATOR
1992  *				token is always preceeded by one
1993  *				TCL_TOKEN_SUB_EXPR token for the operator's
1994  *				subexpression, and is followed by zero or more
1995  *				TCL_TOKEN_SUB_EXPR tokens for the operator's
1996  *				operands. NumComponents is always 0.
1997  * TCL_TOKEN_EXPAND_WORD -	This token is just like TCL_TOKEN_WORD except
1998  *				that it marks a word that began with the
1999  *				literal character prefix "{*}". This word is
2000  *				marked to be expanded - that is, broken into
2001  *				words after substitution is complete.
2002  */
2003 
2004 #define TCL_TOKEN_WORD		1
2005 #define TCL_TOKEN_SIMPLE_WORD	2
2006 #define TCL_TOKEN_TEXT		4
2007 #define TCL_TOKEN_BS		8
2008 #define TCL_TOKEN_COMMAND	16
2009 #define TCL_TOKEN_VARIABLE	32
2010 #define TCL_TOKEN_SUB_EXPR	64
2011 #define TCL_TOKEN_OPERATOR	128
2012 #define TCL_TOKEN_EXPAND_WORD	256
2013 
2014 /*
2015  * Parsing error types. On any parsing error, one of these values will be
2016  * stored in the error field of the Tcl_Parse structure defined below.
2017  */
2018 
2019 #define TCL_PARSE_SUCCESS		0
2020 #define TCL_PARSE_QUOTE_EXTRA		1
2021 #define TCL_PARSE_BRACE_EXTRA		2
2022 #define TCL_PARSE_MISSING_BRACE		3
2023 #define TCL_PARSE_MISSING_BRACKET	4
2024 #define TCL_PARSE_MISSING_PAREN		5
2025 #define TCL_PARSE_MISSING_QUOTE		6
2026 #define TCL_PARSE_MISSING_VAR_BRACE	7
2027 #define TCL_PARSE_SYNTAX		8
2028 #define TCL_PARSE_BAD_NUMBER		9
2029 
2030 /*
2031  * A structure of the following type is filled in by Tcl_ParseCommand. It
2032  * describes a single command parsed from an input string.
2033  */
2034 
2035 #define NUM_STATIC_TOKENS 20
2036 
2037 typedef struct Tcl_Parse {
2038     const char *commentStart;	/* Pointer to # that begins the first of one
2039 				 * or more comments preceding the command. */
2040     int commentSize;		/* Number of bytes in comments (up through
2041 				 * newline character that terminates the last
2042 				 * comment). If there were no comments, this
2043 				 * field is 0. */
2044     const char *commandStart;	/* First character in first word of
2045 				 * command. */
2046     int commandSize;		/* Number of bytes in command, including first
2047 				 * character of first word, up through the
2048 				 * terminating newline, close bracket, or
2049 				 * semicolon. */
2050     int numWords;		/* Total number of words in command. May be
2051 				 * 0. */
2052     Tcl_Token *tokenPtr;	/* Pointer to first token representing the
2053 				 * words of the command. Initially points to
2054 				 * staticTokens, but may change to point to
2055 				 * malloc-ed space if command exceeds space in
2056 				 * staticTokens. */
2057     int numTokens;		/* Total number of tokens in command. */
2058     int tokensAvailable;	/* Total number of tokens available at
2059 				 * *tokenPtr. */
2060     int errorType;		/* One of the parsing error types defined
2061 				 * above. */
2062 
2063     /*
2064      * The fields below are intended only for the private use of the parser.
2065      * They should not be used by functions that invoke Tcl_ParseCommand.
2066      */
2067 
2068     const char *string;		/* The original command string passed to
2069 				 * Tcl_ParseCommand. */
2070     const char *end;		/* Points to the character just after the last
2071 				 * one in the command string. */
2072     Tcl_Interp *interp;		/* Interpreter to use for error reporting, or
2073 				 * NULL. */
2074     const char *term;		/* Points to character in string that
2075 				 * terminated most recent token. Filled in by
2076 				 * ParseTokens. If an error occurs, points to
2077 				 * beginning of region where the error
2078 				 * occurred (e.g. the open brace if the close
2079 				 * brace is missing). */
2080     int incomplete;		/* This field is set to 1 by Tcl_ParseCommand
2081 				 * if the command appears to be incomplete.
2082 				 * This information is used by
2083 				 * Tcl_CommandComplete. */
2084     Tcl_Token staticTokens[NUM_STATIC_TOKENS];
2085 				/* Initial space for tokens for command. This
2086 				 * space should be large enough to accommodate
2087 				 * most commands; dynamic space is allocated
2088 				 * for very large commands that don't fit
2089 				 * here. */
2090 } Tcl_Parse;
2091 
2092 /*
2093  *----------------------------------------------------------------------------
2094  * The following structure represents a user-defined encoding. It collects
2095  * together all the functions that are used by the specific encoding.
2096  */
2097 
2098 typedef struct Tcl_EncodingType {
2099     const char *encodingName;	/* The name of the encoding, e.g. "euc-jp".
2100 				 * This name is the unique key for this
2101 				 * encoding type. */
2102     Tcl_EncodingConvertProc *toUtfProc;
2103 				/* Function to convert from external encoding
2104 				 * into UTF-8. */
2105     Tcl_EncodingConvertProc *fromUtfProc;
2106 				/* Function to convert from UTF-8 into
2107 				 * external encoding. */
2108     Tcl_EncodingFreeProc *freeProc;
2109 				/* If non-NULL, function to call when this
2110 				 * encoding is deleted. */
2111     ClientData clientData;	/* Arbitrary value associated with encoding
2112 				 * type. Passed to conversion functions. */
2113     int nullSize;		/* Number of zero bytes that signify
2114 				 * end-of-string in this encoding. This number
2115 				 * is used to determine the source string
2116 				 * length when the srcLen argument is
2117 				 * negative. Must be 1 or 2. */
2118 } Tcl_EncodingType;
2119 
2120 /*
2121  * The following definitions are used as values for the conversion control
2122  * flags argument when converting text from one character set to another:
2123  *
2124  * TCL_ENCODING_START -		Signifies that the source buffer is the first
2125  *				block in a (potentially multi-block) input
2126  *				stream. Tells the conversion function to reset
2127  *				to an initial state and perform any
2128  *				initialization that needs to occur before the
2129  *				first byte is converted. If the source buffer
2130  *				contains the entire input stream to be
2131  *				converted, this flag should be set.
2132  * TCL_ENCODING_END -		Signifies that the source buffer is the last
2133  *				block in a (potentially multi-block) input
2134  *				stream. Tells the conversion routine to
2135  *				perform any finalization that needs to occur
2136  *				after the last byte is converted and then to
2137  *				reset to an initial state. If the source
2138  *				buffer contains the entire input stream to be
2139  *				converted, this flag should be set.
2140  * TCL_ENCODING_STOPONERROR -	If set, then the converter will return
2141  *				immediately upon encountering an invalid byte
2142  *				sequence or a source character that has no
2143  *				mapping in the target encoding. If clear, then
2144  *				the converter will skip the problem,
2145  *				substituting one or more "close" characters in
2146  *				the destination buffer and then continue to
2147  *				convert the source.
2148  */
2149 
2150 #define TCL_ENCODING_START		0x01
2151 #define TCL_ENCODING_END		0x02
2152 #define TCL_ENCODING_STOPONERROR	0x04
2153 
2154 /*
2155  * The following definitions are the error codes returned by the conversion
2156  * routines:
2157  *
2158  * TCL_OK -			All characters were converted.
2159  * TCL_CONVERT_NOSPACE -	The output buffer would not have been large
2160  *				enough for all of the converted data; as many
2161  *				characters as could fit were converted though.
2162  * TCL_CONVERT_MULTIBYTE -	The last few bytes in the source string were
2163  *				the beginning of a multibyte sequence, but
2164  *				more bytes were needed to complete this
2165  *				sequence. A subsequent call to the conversion
2166  *				routine should pass the beginning of this
2167  *				unconverted sequence plus additional bytes
2168  *				from the source stream to properly convert the
2169  *				formerly split-up multibyte sequence.
2170  * TCL_CONVERT_SYNTAX -		The source stream contained an invalid
2171  *				character sequence. This may occur if the
2172  *				input stream has been damaged or if the input
2173  *				encoding method was misidentified. This error
2174  *				is reported only if TCL_ENCODING_STOPONERROR
2175  *				was specified.
2176  * TCL_CONVERT_UNKNOWN -	The source string contained a character that
2177  *				could not be represented in the target
2178  *				encoding. This error is reported only if
2179  *				TCL_ENCODING_STOPONERROR was specified.
2180  */
2181 
2182 #define TCL_CONVERT_MULTIBYTE	(-1)
2183 #define TCL_CONVERT_SYNTAX	(-2)
2184 #define TCL_CONVERT_UNKNOWN	(-3)
2185 #define TCL_CONVERT_NOSPACE	(-4)
2186 
2187 /*
2188  * The maximum number of bytes that are necessary to represent a single
2189  * Unicode character in UTF-8. The valid values should be 3, 4 or 6
2190  * (or perhaps 1 if we want to support a non-unicode enabled core). If 3 or
2191  * 4, then Tcl_UniChar must be 2-bytes in size (UCS-2) (the default). If 6,
2192  * then Tcl_UniChar must be 4-bytes in size (UCS-4). At this time UCS-2 mode
2193  * is the default and recommended mode. UCS-4 is experimental and not
2194  * recommended. It works for the core, but most extensions expect UCS-2.
2195  */
2196 
2197 #ifndef TCL_UTF_MAX
2198 #define TCL_UTF_MAX		3
2199 #endif
2200 
2201 /*
2202  * This represents a Unicode character. Any changes to this should also be
2203  * reflected in regcustom.h.
2204  */
2205 
2206 #if TCL_UTF_MAX > 4
2207     /*
2208      * unsigned int isn't 100% accurate as it should be a strict 4-byte value
2209      * (perhaps wchar_t). 64-bit systems may have troubles. The size of this
2210      * value must be reflected correctly in regcustom.h and
2211      * in tclEncoding.c.
2212      * XXX: Tcl is currently UCS-2 and planning UTF-16 for the Unicode
2213      * XXX: string rep that Tcl_UniChar represents.  Changing the size
2214      * XXX: of Tcl_UniChar is /not/ supported.
2215      */
2216 typedef unsigned int Tcl_UniChar;
2217 #else
2218 typedef unsigned short Tcl_UniChar;
2219 #endif
2220 
2221 /*
2222  *----------------------------------------------------------------------------
2223  * TIP #59: The following structure is used in calls 'Tcl_RegisterConfig' to
2224  * provide the system with the embedded configuration data.
2225  */
2226 
2227 typedef struct Tcl_Config {
2228     const char *key;		/* Configuration key to register. ASCII
2229 				 * encoded, thus UTF-8. */
2230     const char *value;		/* The value associated with the key. System
2231 				 * encoding. */
2232 } Tcl_Config;
2233 
2234 /*
2235  *----------------------------------------------------------------------------
2236  * Flags for TIP#143 limits, detailing which limits are active in an
2237  * interpreter. Used for Tcl_{Add,Remove}LimitHandler type argument.
2238  */
2239 
2240 #define TCL_LIMIT_COMMANDS	0x01
2241 #define TCL_LIMIT_TIME		0x02
2242 
2243 /*
2244  * Structure containing information about a limit handler to be called when a
2245  * command- or time-limit is exceeded by an interpreter.
2246  */
2247 
2248 typedef void (Tcl_LimitHandlerProc) (ClientData clientData, Tcl_Interp *interp);
2249 typedef void (Tcl_LimitHandlerDeleteProc) (ClientData clientData);
2250 
2251 /*
2252  *----------------------------------------------------------------------------
2253  * Override definitions for libtommath.
2254  */
2255 
2256 typedef struct mp_int mp_int;
2257 #define MP_INT_DECLARED
2258 typedef unsigned int mp_digit;
2259 #define MP_DIGIT_DECLARED
2260 
2261 /*
2262  *----------------------------------------------------------------------------
2263  * Definitions needed for Tcl_ParseArgvObj routines.
2264  * Based on tkArgv.c.
2265  * Modifications from the original are copyright (c) Sam Bromley 2006
2266  */
2267 
2268 typedef struct {
2269     int type;			/* Indicates the option type; see below. */
2270     const char *keyStr;		/* The key string that flags the option in the
2271 				 * argv array. */
2272     void *srcPtr;		/* Value to be used in setting dst; usage
2273 				 * depends on type.*/
2274     void *dstPtr;		/* Address of value to be modified; usage
2275 				 * depends on type.*/
2276     const char *helpStr;	/* Documentation message describing this
2277 				 * option. */
2278     ClientData clientData;	/* Word to pass to function callbacks. */
2279 } Tcl_ArgvInfo;
2280 
2281 /*
2282  * Legal values for the type field of a Tcl_ArgInfo: see the user
2283  * documentation for details.
2284  */
2285 
2286 #define TCL_ARGV_CONSTANT	15
2287 #define TCL_ARGV_INT		16
2288 #define TCL_ARGV_STRING		17
2289 #define TCL_ARGV_REST		18
2290 #define TCL_ARGV_FLOAT		19
2291 #define TCL_ARGV_FUNC		20
2292 #define TCL_ARGV_GENFUNC	21
2293 #define TCL_ARGV_HELP		22
2294 #define TCL_ARGV_END		23
2295 
2296 /*
2297  * Types of callback functions for the TCL_ARGV_FUNC and TCL_ARGV_GENFUNC
2298  * argument types:
2299  */
2300 
2301 typedef int (Tcl_ArgvFuncProc)(ClientData clientData, Tcl_Obj *objPtr,
2302 	void *dstPtr);
2303 typedef int (Tcl_ArgvGenFuncProc)(ClientData clientData, Tcl_Interp *interp,
2304 	int objc, Tcl_Obj *const *objv, void *dstPtr);
2305 
2306 /*
2307  * Shorthand for commonly used argTable entries.
2308  */
2309 
2310 #define TCL_ARGV_AUTO_HELP \
2311     {TCL_ARGV_HELP,	"-help",	NULL,	NULL, \
2312 	    "Print summary of command-line options and abort", NULL}
2313 #define TCL_ARGV_AUTO_REST \
2314     {TCL_ARGV_REST,	"--",		NULL,	NULL, \
2315 	    "Marks the end of the options", NULL}
2316 #define TCL_ARGV_TABLE_END \
2317     {TCL_ARGV_END, NULL, NULL, NULL, NULL, NULL}
2318 
2319 /*
2320  *----------------------------------------------------------------------------
2321  * Definitions needed for Tcl_Zlib routines. [TIP #234]
2322  *
2323  * Constants for the format flags describing what sort of data format is
2324  * desired/expected for the Tcl_ZlibDeflate, Tcl_ZlibInflate and
2325  * Tcl_ZlibStreamInit functions.
2326  */
2327 
2328 #define TCL_ZLIB_FORMAT_RAW	1
2329 #define TCL_ZLIB_FORMAT_ZLIB	2
2330 #define TCL_ZLIB_FORMAT_GZIP	4
2331 #define TCL_ZLIB_FORMAT_AUTO	8
2332 
2333 /*
2334  * Constants that describe whether the stream is to operate in compressing or
2335  * decompressing mode.
2336  */
2337 
2338 #define TCL_ZLIB_STREAM_DEFLATE	16
2339 #define TCL_ZLIB_STREAM_INFLATE	32
2340 
2341 /*
2342  * Constants giving compression levels. Use of TCL_ZLIB_COMPRESS_DEFAULT is
2343  * recommended.
2344  */
2345 
2346 #define TCL_ZLIB_COMPRESS_NONE	0
2347 #define TCL_ZLIB_COMPRESS_FAST	1
2348 #define TCL_ZLIB_COMPRESS_BEST	9
2349 #define TCL_ZLIB_COMPRESS_DEFAULT (-1)
2350 
2351 /*
2352  * Constants for types of flushing, used with Tcl_ZlibFlush.
2353  */
2354 
2355 #define TCL_ZLIB_NO_FLUSH	0
2356 #define TCL_ZLIB_FLUSH		2
2357 #define TCL_ZLIB_FULLFLUSH	3
2358 #define TCL_ZLIB_FINALIZE	4
2359 
2360 /*
2361  *----------------------------------------------------------------------------
2362  * Definitions needed for the Tcl_LoadFile function. [TIP #416]
2363  */
2364 
2365 #define TCL_LOAD_GLOBAL 1
2366 #define TCL_LOAD_LAZY 2
2367 
2368 /*
2369  *----------------------------------------------------------------------------
2370  * Single public declaration for NRE.
2371  */
2372 
2373 typedef int (Tcl_NRPostProc) (ClientData data[], Tcl_Interp *interp,
2374 				int result);
2375 
2376 /*
2377  *----------------------------------------------------------------------------
2378  * The following constant is used to test for older versions of Tcl in the
2379  * stubs tables.
2380  *
2381  * Jan Nijtman's plus patch uses 0xFCA1BACF, so we need to pick a different
2382  * value since the stubs tables don't match.
2383  */
2384 
2385 #define TCL_STUB_MAGIC		((int) 0xFCA3BACF)
2386 
2387 /*
2388  * The following function is required to be defined in all stubs aware
2389  * extensions. The function is actually implemented in the stub library, not
2390  * the main Tcl library, although there is a trivial implementation in the
2391  * main library in case an extension is statically linked into an application.
2392  */
2393 
2394 const char *		Tcl_InitStubs(Tcl_Interp *interp, const char *version,
2395 			    int exact);
2396 const char *		TclTomMathInitializeStubs(Tcl_Interp *interp,
2397 			    const char *version, int epoch, int revision);
2398 
2399 /*
2400  * When not using stubs, make it a macro.
2401  */
2402 
2403 #ifndef USE_TCL_STUBS
2404 #define Tcl_InitStubs(interp, version, exact) \
2405     Tcl_PkgInitStubsCheck(interp, version, exact)
2406 #endif
2407 
2408 /*
2409  * TODO - tommath stubs export goes here!
2410  */
2411 
2412 /*
2413  * Public functions that are not accessible via the stubs table.
2414  * Tcl_GetMemoryInfo is needed for AOLserver. [Bug 1868171]
2415  */
2416 
2417 #define Tcl_Main(argc, argv, proc) Tcl_MainEx(argc, argv, proc, \
2418 	    (Tcl_FindExecutable(argv[0]), (Tcl_CreateInterp)()))
2419 EXTERN void		Tcl_MainEx(int argc, char **argv,
2420 			    Tcl_AppInitProc *appInitProc, Tcl_Interp *interp);
2421 EXTERN const char *	Tcl_PkgInitStubsCheck(Tcl_Interp *interp,
2422 			    const char *version, int exact);
2423 #if defined(TCL_THREADS) && defined(USE_THREAD_ALLOC)
2424 EXTERN void		Tcl_GetMemoryInfo(Tcl_DString *dsPtr);
2425 #endif
2426 
2427 /*
2428  *----------------------------------------------------------------------------
2429  * Include the public function declarations that are accessible via the stubs
2430  * table.
2431  */
2432 
2433 #include "tclDecls.h"
2434 
2435 /*
2436  * Include platform specific public function declarations that are accessible
2437  * via the stubs table.
2438  */
2439 
2440 #include "tclPlatDecls.h"
2441 
2442 /*
2443  *----------------------------------------------------------------------------
2444  * The following declarations either map ckalloc and ckfree to malloc and
2445  * free, or they map them to functions with all sorts of debugging hooks
2446  * defined in tclCkalloc.c.
2447  */
2448 
2449 #ifdef TCL_MEM_DEBUG
2450 
2451 #   define ckalloc(x) \
2452     ((VOID *) Tcl_DbCkalloc((unsigned)(x), __FILE__, __LINE__))
2453 #   define ckfree(x) \
2454     Tcl_DbCkfree((char *)(x), __FILE__, __LINE__)
2455 #   define ckrealloc(x,y) \
2456     ((VOID *) Tcl_DbCkrealloc((char *)(x), (unsigned)(y), __FILE__, __LINE__))
2457 #   define attemptckalloc(x) \
2458     ((VOID *) Tcl_AttemptDbCkalloc((unsigned)(x), __FILE__, __LINE__))
2459 #   define attemptckrealloc(x,y) \
2460     ((VOID *) Tcl_AttemptDbCkrealloc((char *)(x), (unsigned)(y), __FILE__, __LINE__))
2461 
2462 #else /* !TCL_MEM_DEBUG */
2463 
2464 /*
2465  * If we are not using the debugging allocator, we should call the Tcl_Alloc,
2466  * et al. routines in order to guarantee that every module is using the same
2467  * memory allocator both inside and outside of the Tcl library.
2468  */
2469 
2470 #   define ckalloc(x) \
2471     ((VOID *) Tcl_Alloc((unsigned)(x)))
2472 #   define ckfree(x) \
2473     Tcl_Free((char *)(x))
2474 #   define ckrealloc(x,y) \
2475     ((VOID *) Tcl_Realloc((char *)(x), (unsigned)(y)))
2476 #   define attemptckalloc(x) \
2477     ((VOID *) Tcl_AttemptAlloc((unsigned)(x)))
2478 #   define attemptckrealloc(x,y) \
2479     ((VOID *) Tcl_AttemptRealloc((char *)(x), (unsigned)(y)))
2480 #   undef  Tcl_InitMemory
2481 #   define Tcl_InitMemory(x)
2482 #   undef  Tcl_DumpActiveMemory
2483 #   define Tcl_DumpActiveMemory(x)
2484 #   undef  Tcl_ValidateAllMemory
2485 #   define Tcl_ValidateAllMemory(x,y)
2486 
2487 #endif /* !TCL_MEM_DEBUG */
2488 
2489 #ifdef TCL_MEM_DEBUG
2490 #   define Tcl_IncrRefCount(objPtr) \
2491 	Tcl_DbIncrRefCount(objPtr, __FILE__, __LINE__)
2492 #   define Tcl_DecrRefCount(objPtr) \
2493 	Tcl_DbDecrRefCount(objPtr, __FILE__, __LINE__)
2494 #   define Tcl_IsShared(objPtr) \
2495 	Tcl_DbIsShared(objPtr, __FILE__, __LINE__)
2496 #else
2497 #   define Tcl_IncrRefCount(objPtr) \
2498 	++(objPtr)->refCount
2499     /*
2500      * Use do/while0 idiom for optimum correctness without compiler warnings.
2501      * http://c2.com/cgi/wiki?TrivialDoWhileLoop
2502      */
2503 #   define Tcl_DecrRefCount(objPtr) \
2504 	do { \
2505 	    Tcl_Obj *_objPtr = (objPtr); \
2506 	    if (--(_objPtr)->refCount <= 0) { \
2507 		TclFreeObj(_objPtr); \
2508 	    } \
2509 	} while(0)
2510 #   define Tcl_IsShared(objPtr) \
2511 	((objPtr)->refCount > 1)
2512 #endif
2513 
2514 /*
2515  * Macros and definitions that help to debug the use of Tcl objects. When
2516  * TCL_MEM_DEBUG is defined, the Tcl_New declarations are overridden to call
2517  * debugging versions of the object creation functions.
2518  */
2519 
2520 #ifdef TCL_MEM_DEBUG
2521 #  undef  Tcl_NewBignumObj
2522 #  define Tcl_NewBignumObj(val) \
2523      Tcl_DbNewBignumObj(val, __FILE__, __LINE__)
2524 #  undef  Tcl_NewBooleanObj
2525 #  define Tcl_NewBooleanObj(val) \
2526      Tcl_DbNewBooleanObj(val, __FILE__, __LINE__)
2527 #  undef  Tcl_NewByteArrayObj
2528 #  define Tcl_NewByteArrayObj(bytes, len) \
2529      Tcl_DbNewByteArrayObj(bytes, len, __FILE__, __LINE__)
2530 #  undef  Tcl_NewDoubleObj
2531 #  define Tcl_NewDoubleObj(val) \
2532      Tcl_DbNewDoubleObj(val, __FILE__, __LINE__)
2533 #  undef  Tcl_NewIntObj
2534 #  define Tcl_NewIntObj(val) \
2535      Tcl_DbNewLongObj(val, __FILE__, __LINE__)
2536 #  undef  Tcl_NewListObj
2537 #  define Tcl_NewListObj(objc, objv) \
2538      Tcl_DbNewListObj(objc, objv, __FILE__, __LINE__)
2539 #  undef  Tcl_NewLongObj
2540 #  define Tcl_NewLongObj(val) \
2541      Tcl_DbNewLongObj(val, __FILE__, __LINE__)
2542 #  undef  Tcl_NewObj
2543 #  define Tcl_NewObj() \
2544      Tcl_DbNewObj(__FILE__, __LINE__)
2545 #  undef  Tcl_NewStringObj
2546 #  define Tcl_NewStringObj(bytes, len) \
2547      Tcl_DbNewStringObj(bytes, len, __FILE__, __LINE__)
2548 #  undef  Tcl_NewWideIntObj
2549 #  define Tcl_NewWideIntObj(val) \
2550      Tcl_DbNewWideIntObj(val, __FILE__, __LINE__)
2551 #endif /* TCL_MEM_DEBUG */
2552 
2553 /*
2554  *----------------------------------------------------------------------------
2555  * Macros for clients to use to access fields of hash entries:
2556  */
2557 
2558 #define Tcl_GetHashValue(h) ((h)->clientData)
2559 #define Tcl_SetHashValue(h, value) ((h)->clientData = (ClientData) (value))
2560 #define Tcl_GetHashKey(tablePtr, h) \
2561 	((void *) (((tablePtr)->keyType == TCL_ONE_WORD_KEYS || \
2562 		    (tablePtr)->keyType == TCL_CUSTOM_PTR_KEYS) \
2563 		   ? (h)->key.oneWordValue \
2564 		   : (h)->key.string))
2565 
2566 /*
2567  * Macros to use for clients to use to invoke find and create functions for
2568  * hash tables:
2569  */
2570 
2571 #undef  Tcl_FindHashEntry
2572 #define Tcl_FindHashEntry(tablePtr, key) \
2573 	(*((tablePtr)->findProc))(tablePtr, (const char *)(key))
2574 #undef  Tcl_CreateHashEntry
2575 #define Tcl_CreateHashEntry(tablePtr, key, newPtr) \
2576 	(*((tablePtr)->createProc))(tablePtr, (const char *)(key), newPtr)
2577 
2578 /*
2579  *----------------------------------------------------------------------------
2580  * Macros that eliminate the overhead of the thread synchronization functions
2581  * when compiling without thread support.
2582  */
2583 
2584 #ifndef TCL_THREADS
2585 #undef  Tcl_MutexLock
2586 #define Tcl_MutexLock(mutexPtr)
2587 #undef  Tcl_MutexUnlock
2588 #define Tcl_MutexUnlock(mutexPtr)
2589 #undef  Tcl_MutexFinalize
2590 #define Tcl_MutexFinalize(mutexPtr)
2591 #undef  Tcl_ConditionNotify
2592 #define Tcl_ConditionNotify(condPtr)
2593 #undef  Tcl_ConditionWait
2594 #define Tcl_ConditionWait(condPtr, mutexPtr, timePtr)
2595 #undef  Tcl_ConditionFinalize
2596 #define Tcl_ConditionFinalize(condPtr)
2597 #endif /* TCL_THREADS */
2598 
2599 /*
2600  *----------------------------------------------------------------------------
2601  * Deprecated Tcl functions:
2602  */
2603 
2604 #ifndef TCL_NO_DEPRECATED
2605 #   undef  Tcl_EvalObj
2606 #   define Tcl_EvalObj(interp,objPtr) \
2607 	Tcl_EvalObjEx((interp),(objPtr),0)
2608 #   undef  Tcl_GlobalEvalObj
2609 #   define Tcl_GlobalEvalObj(interp,objPtr) \
2610 	Tcl_EvalObjEx((interp),(objPtr),TCL_EVAL_GLOBAL)
2611 
2612 /*
2613  * These function have been renamed. The old names are deprecated, but we
2614  * define these macros for backwards compatibilty.
2615  */
2616 
2617 #   define Tcl_Ckalloc		Tcl_Alloc
2618 #   define Tcl_Ckfree		Tcl_Free
2619 #   define Tcl_Ckrealloc	Tcl_Realloc
2620 #   define Tcl_Return		Tcl_SetResult
2621 #   define Tcl_TildeSubst	Tcl_TranslateFileName
2622 #   define panic		Tcl_Panic
2623 #   define panicVA		Tcl_PanicVA
2624 #endif /* !TCL_NO_DEPRECATED */
2625 
2626 /*
2627  *----------------------------------------------------------------------------
2628  * Convenience declaration of Tcl_AppInit for backwards compatibility. This
2629  * function is not *implemented* by the tcl library, so the storage class is
2630  * neither DLLEXPORT nor DLLIMPORT.
2631  */
2632 
2633 extern Tcl_AppInitProc Tcl_AppInit;
2634 
2635 #endif /* RC_INVOKED */
2636 
2637 /*
2638  * end block for C++
2639  */
2640 
2641 #ifdef __cplusplus
2642 }
2643 #endif
2644 
2645 #endif /* _TCL */
2646 
2647 /*
2648  * Local Variables:
2649  * mode: c
2650  * c-basic-offset: 4
2651  * fill-column: 78
2652  * End:
2653  */
2654