4 * This header file describes the externally-visible facilities of the
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.
13 * See the file "license.terms" for information on usage and redistribution of
14 * this file, and for a DISCLAIMER OF ALL WARRANTIES.
21 * For C++ compilers, use extern "C"
29 * The following defines are used to indicate the various release levels.
32 #define TCL_ALPHA_RELEASE 0
33 #define TCL_BETA_RELEASE 1
34 #define TCL_FINAL_RELEASE 2
37 * When version numbers change here, must also go into the following files and
38 * update the version numbers:
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 * tools/tcl.wse.in (for windows installer)
55 * tools/tclSplash.bmp (not patchlevel)
58 #define TCL_MAJOR_VERSION 8
59 #define TCL_MINOR_VERSION 5
60 #define TCL_RELEASE_LEVEL TCL_FINAL_RELEASE
61 #define TCL_RELEASE_SERIAL 11
63 #define TCL_VERSION "8.5"
64 #define TCL_PATCH_LEVEL "8.5.11"
67 * The following definitions set up the proper options for Windows compilers.
68 * We use this method because there is no autoconf equivalent.
72 # if defined(_WIN32) || defined(WIN32) || defined(__MINGW32__) || defined(__BORLANDC__) || (defined(__WATCOMC__) && defined(__WINDOWS_386__))
84 * STRICT: See MSDN Article Q83456
91 #endif /* __WIN32__ */
94 * Utility macros: STRINGIFY takes an argument and wraps it in "" (double
95 * quotation marks), JOIN joins two arguments.
99 # define STRINGIFY(x) STRINGIFY1(x)
100 # define STRINGIFY1(x) #x
103 # define JOIN(a,b) JOIN1(a,b)
104 # define JOIN1(a,b) a##b
108 * A special definition used to allow this header file to be included from
109 * windows resource files so that they can obtain version information.
110 * RC_INVOKED is defined by default by the windows RC tool.
112 * Resource compilers don't like all the C stuff, like typedefs and function
113 * declarations, that occur below, so block them out.
119 * Special macro to define mutexes, that doesn't do anything if we are not
124 #define TCL_DECLARE_MUTEX(name) static Tcl_Mutex name;
126 #define TCL_DECLARE_MUTEX(name)
130 * Tcl's public routine Tcl_FSSeek() uses the values SEEK_SET, SEEK_CUR, and
131 * SEEK_END, all #define'd by stdio.h .
133 * Also, many extensions need stdio.h, and they've grown accustomed to tcl.h
134 * providing it for them rather than #include-ing it themselves as they
135 * should, so also for their sake, we keep the #include to be consistent with
136 * prior Tcl releases.
142 * Support for functions with a variable number of arguments.
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 .
148 * New code should just directly be written to use stdarg.h conventions.
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)
159 * Macros used to declare a function to be exported by a DLL. Used by Windows,
160 * maps to no-op declarations on non-Windows systems. The default build on
161 * windows is for a DLL, which causes the DLLIMPORT and DLLEXPORT macros to be
162 * nonempty. To build a static library, the macro STATIC_BUILD should be
165 * Note: when building static but linking dynamically to MSVCRT we must still
166 * correctly decorate the C library imported function. Use CRTIMPORT
167 * for this purpose. _DLL is defined by the compiler when linking to
171 #if (defined(__WIN32__) && (defined(_MSC_VER) || (__BORLANDC__ >= 0x0550) || defined(__LCC__) || defined(__WATCOMC__) || (defined(__GNUC__) && defined(__declspec))))
172 # define HAVE_DECLSPEC 1
177 # define CRTIMPORT __declspec(dllimport)
182 # define DLLIMPORT __declspec(dllimport)
183 # define DLLEXPORT __declspec(dllexport)
184 # define CRTIMPORT __declspec(dllimport)
188 # if defined(__GNUC__) && __GNUC__ > 3
189 # define DLLEXPORT __attribute__ ((visibility("default")))
197 * These macros are used to control whether functions are being declared for
198 * import or export. If a function is being declared while it is being built
199 * to be included in a shared library, then it should have the DLLEXPORT
200 * storage class. If is being declared for use by a module that is going to
201 * link against the shared library, then it should have the DLLIMPORT storage
202 * class. If the symbol is beind declared for a static build or for use from a
203 * stub library, then the storage class should be empty.
205 * The convention is that a macro called BUILD_xxxx, where xxxx is the name of
206 * a library we are building, is set on the compile line for sources that are
207 * to be placed in the library. When this macro is set, the storage class will
208 * be set to DLLEXPORT. At the end of the header file, the storage class will
209 * be reset to DLLIMPORT.
212 #undef TCL_STORAGE_CLASS
214 # define TCL_STORAGE_CLASS DLLEXPORT
216 # ifdef USE_TCL_STUBS
217 # define TCL_STORAGE_CLASS
219 # define TCL_STORAGE_CLASS DLLIMPORT
224 * Definitions that allow this header file to be used either with or without
225 * ANSI C features like function prototypes.
240 #ifndef NO_PROTOTYPES
241 # define _ANSI_ARGS_(x) x
243 # define _ANSI_ARGS_(x) ()
247 # ifdef USE_COMPAT_CONST
248 # error define at most one of USE_NON_CONST and USE_COMPAT_CONST
251 # define CONST84_RETURN
253 # ifdef USE_COMPAT_CONST
255 # define CONST84_RETURN CONST
257 # define CONST84 CONST
258 # define CONST84_RETURN CONST
263 * Make sure EXTERN isn't defined elsewhere.
271 # define EXTERN extern "C" TCL_STORAGE_CLASS
273 # define EXTERN extern TCL_STORAGE_CLASS
277 * The following code is copied from winnt.h. If we don't replicate it here,
278 * then <windows.h> can't be included after tcl.h, since tcl.h also defines
279 * VOID. This block is skipped under Cygwin and Mingw.
282 #if defined(__WIN32__) && !defined(HAVE_WINNT_IGNORE_VOID)
289 #endif /* __WIN32__ && !HAVE_WINNT_IGNORE_VOID */
292 * Macro to use instead of "void" for arguments that must have type "void *"
293 * in ANSI C; maps them to type "char *" in non-ANSI systems.
303 * Miscellaneous declarations.
308 typedef void *ClientData
;
310 typedef int *ClientData
;
316 * Darwin specific configure overrides (to support fat compiles, where
317 * configure runs only once for multiple architectures):
322 # undef TCL_WIDE_INT_TYPE
323 # define TCL_WIDE_INT_IS_LONG 1
324 # define TCL_CFG_DO64BIT 1
325 # else /* !__LP64__ */
326 # define TCL_WIDE_INT_TYPE long long
327 # undef TCL_WIDE_INT_IS_LONG
328 # undef TCL_CFG_DO64BIT
329 # endif /* __LP64__ */
330 # undef HAVE_STRUCT_STAT64
331 #endif /* __APPLE__ */
334 * Define Tcl_WideInt to be a type that is (at least) 64-bits wide, and define
335 * Tcl_WideUInt to be the unsigned variant of that type (assuming that where
336 * we have one, we can have the other.)
338 * Also defines the following macros:
339 * TCL_WIDE_INT_IS_LONG - if wide ints are really longs (i.e. we're on a real
341 * Tcl_WideAsLong - forgetful converter from wideInt to long.
342 * Tcl_LongAsWide - sign-extending converter from long to wideInt.
343 * Tcl_WideAsDouble - converter from wideInt to double.
344 * Tcl_DoubleAsWide - converter from double to wideInt.
346 * The following invariant should hold for any long value 'longVal':
347 * longVal == Tcl_WideAsLong(Tcl_LongAsWide(longVal))
349 * Note on converting between Tcl_WideInt and strings. This implementation (in
350 * tclObj.c) depends on the function
351 * sprintf(...,"%" TCL_LL_MODIFIER "d",...).
354 #if !defined(TCL_WIDE_INT_TYPE)&&!defined(TCL_WIDE_INT_IS_LONG)
355 # if defined(__WIN32__) && !defined(__CYGWIN__)
356 # define TCL_WIDE_INT_TYPE __int64
358 typedef struct stati64 Tcl_StatBuf
;
359 # define TCL_LL_MODIFIER "L"
360 # else /* __BORLANDC__ */
362 typedef struct __stat64 Tcl_StatBuf
;
363 # elif (defined(_MSC_VER) && (_MSC_VER < 1400))
364 typedef struct _stati64 Tcl_StatBuf
;
366 typedef struct _stat32i64 Tcl_StatBuf
;
367 # endif /* _MSC_VER < 1400 */
368 # define TCL_LL_MODIFIER "I64"
369 # endif /* __BORLANDC__ */
370 # elif defined(__GNUC__)
371 # define TCL_WIDE_INT_TYPE long long
372 # define TCL_LL_MODIFIER "ll"
373 # if defined(__WIN32__)
374 typedef struct _stat32i64 Tcl_StatBuf
;
376 typedef struct stat Tcl_StatBuf
;
378 # else /* ! __WIN32__ && ! __GNUC__ */
380 * Don't know what platform it is and configure hasn't discovered what is
381 * going on for us. Try to guess...
384 # error please define either TCL_WIDE_INT_TYPE or TCL_WIDE_INT_IS_LONG
385 # else /* !NO_LIMITS_H */
387 # if (INT_MAX < LONG_MAX)
388 # define TCL_WIDE_INT_IS_LONG 1
390 # define TCL_WIDE_INT_TYPE long long
392 # endif /* NO_LIMITS_H */
393 # endif /* __WIN32__ */
394 #endif /* !TCL_WIDE_INT_TYPE & !TCL_WIDE_INT_IS_LONG */
395 #ifdef TCL_WIDE_INT_IS_LONG
396 # undef TCL_WIDE_INT_TYPE
397 # define TCL_WIDE_INT_TYPE long
398 #endif /* TCL_WIDE_INT_IS_LONG */
400 typedef TCL_WIDE_INT_TYPE Tcl_WideInt
;
401 typedef unsigned TCL_WIDE_INT_TYPE Tcl_WideUInt
;
403 #ifdef TCL_WIDE_INT_IS_LONG
404 typedef struct stat Tcl_StatBuf
;
405 # define Tcl_WideAsLong(val) ((long)(val))
406 # define Tcl_LongAsWide(val) ((long)(val))
407 # define Tcl_WideAsDouble(val) ((double)((long)(val)))
408 # define Tcl_DoubleAsWide(val) ((long)((double)(val)))
409 # ifndef TCL_LL_MODIFIER
410 # define TCL_LL_MODIFIER "l"
411 # endif /* !TCL_LL_MODIFIER */
412 #else /* TCL_WIDE_INT_IS_LONG */
414 * The next short section of defines are only done when not running on Windows
415 * or some other strange platform.
417 # ifndef TCL_LL_MODIFIER
418 # ifdef HAVE_STRUCT_STAT64
419 typedef struct stat64 Tcl_StatBuf
;
421 typedef struct stat Tcl_StatBuf
;
422 # endif /* HAVE_STRUCT_STAT64 */
423 # define TCL_LL_MODIFIER "ll"
424 # endif /* !TCL_LL_MODIFIER */
425 # define Tcl_WideAsLong(val) ((long)((Tcl_WideInt)(val)))
426 # define Tcl_LongAsWide(val) ((Tcl_WideInt)((long)(val)))
427 # define Tcl_WideAsDouble(val) ((double)((Tcl_WideInt)(val)))
428 # define Tcl_DoubleAsWide(val) ((Tcl_WideInt)((double)(val)))
429 #endif /* TCL_WIDE_INT_IS_LONG */
432 * Data structures defined opaquely in this module. The definitions below just
433 * provide dummy types. A few fields are made visible in Tcl_Interp
434 * structures, namely those used for returning a string result from commands.
435 * Direct access to the result field is discouraged in Tcl 8.0. The
436 * interpreter result is either an object or a string, and the two values are
437 * kept consistent unless some C code sets interp->result directly.
438 * Programmers should use either the function Tcl_GetObjResult() or
439 * Tcl_GetStringResult() to read the interpreter's result. See the SetResult
440 * man page for details.
442 * Note: any change to the Tcl_Interp definition below must be mirrored in the
443 * "real" definition in tclInt.h.
445 * Note: Tcl_ObjCmdProc functions do not directly set result and freeProc.
446 * Instead, they set a Tcl_Obj member in the "real" structure that can be
447 * accessed with Tcl_GetObjResult() and Tcl_SetObjResult().
450 typedef struct Tcl_Interp
{
451 char *result
; /* If the last command returned a string
452 * result, this points to it. */
453 void (*freeProc
) _ANSI_ARGS_((char *blockPtr
));
454 /* Zero means the string result is statically
455 * allocated. TCL_DYNAMIC means it was
456 * allocated with ckalloc and should be freed
457 * with ckfree. Other values give the address
458 * of function to invoke to free the result.
459 * Tcl_Eval must free it before executing next
461 int errorLine
; /* When TCL_ERROR is returned, this gives the
462 * line number within the command where the
463 * error occurred (1 if first line). */
466 typedef struct Tcl_AsyncHandler_
*Tcl_AsyncHandler
;
467 typedef struct Tcl_Channel_
*Tcl_Channel
;
468 typedef struct Tcl_ChannelTypeVersion_
*Tcl_ChannelTypeVersion
;
469 typedef struct Tcl_Command_
*Tcl_Command
;
470 typedef struct Tcl_Condition_
*Tcl_Condition
;
471 typedef struct Tcl_Dict_
*Tcl_Dict
;
472 typedef struct Tcl_EncodingState_
*Tcl_EncodingState
;
473 typedef struct Tcl_Encoding_
*Tcl_Encoding
;
474 typedef struct Tcl_Event Tcl_Event
;
475 typedef struct Tcl_InterpState_
*Tcl_InterpState
;
476 typedef struct Tcl_LoadHandle_
*Tcl_LoadHandle
;
477 typedef struct Tcl_Mutex_
*Tcl_Mutex
;
478 typedef struct Tcl_Pid_
*Tcl_Pid
;
479 typedef struct Tcl_RegExp_
*Tcl_RegExp
;
480 typedef struct Tcl_ThreadDataKey_
*Tcl_ThreadDataKey
;
481 typedef struct Tcl_ThreadId_
*Tcl_ThreadId
;
482 typedef struct Tcl_TimerToken_
*Tcl_TimerToken
;
483 typedef struct Tcl_Trace_
*Tcl_Trace
;
484 typedef struct Tcl_Var_
*Tcl_Var
;
487 * Definition of the interface to functions implementing threads. A function
488 * following this definition is given to each call of 'Tcl_CreateThread' and
489 * will be called as the main fuction of the new thread created by that call.
492 #if defined __WIN32__
493 typedef unsigned (__stdcall Tcl_ThreadCreateProc
) _ANSI_ARGS_((ClientData clientData
));
495 typedef void (Tcl_ThreadCreateProc
) _ANSI_ARGS_((ClientData clientData
));
499 * Threading function return types used for abstracting away platform
500 * differences when writing a Tcl_ThreadCreateProc. See the NewThread function
501 * in generic/tclThreadTest.c for it's usage.
504 #if defined __WIN32__
505 # define Tcl_ThreadCreateType unsigned __stdcall
506 # define TCL_THREAD_CREATE_RETURN return 0
508 # define Tcl_ThreadCreateType void
509 # define TCL_THREAD_CREATE_RETURN
513 * Definition of values for default stacksize and the possible flags to be
514 * given to Tcl_CreateThread.
517 #define TCL_THREAD_STACK_DEFAULT (0) /* Use default size for stack. */
518 #define TCL_THREAD_NOFLAGS (0000) /* Standard flags, default
520 #define TCL_THREAD_JOINABLE (0001) /* Mark the thread as joinable. */
523 * Flag values passed to Tcl_StringCaseMatch.
526 #define TCL_MATCH_NOCASE (1<<0)
529 * Flag values passed to Tcl_GetRegExpFromObj.
532 #define TCL_REG_BASIC 000000 /* BREs (convenience). */
533 #define TCL_REG_EXTENDED 000001 /* EREs. */
534 #define TCL_REG_ADVF 000002 /* Advanced features in EREs. */
535 #define TCL_REG_ADVANCED 000003 /* AREs (which are also EREs). */
536 #define TCL_REG_QUOTE 000004 /* No special characters, none. */
537 #define TCL_REG_NOCASE 000010 /* Ignore case. */
538 #define TCL_REG_NOSUB 000020 /* Don't care about subexpressions. */
539 #define TCL_REG_EXPANDED 000040 /* Expanded format, white space &
541 #define TCL_REG_NLSTOP 000100 /* \n doesn't match . or [^ ] */
542 #define TCL_REG_NLANCH 000200 /* ^ matches after \n, $ before. */
543 #define TCL_REG_NEWLINE 000300 /* Newlines are line terminators. */
544 #define TCL_REG_CANMATCH 001000 /* Report details on partial/limited
548 * Flags values passed to Tcl_RegExpExecObj.
551 #define TCL_REG_NOTBOL 0001 /* Beginning of string does not match ^. */
552 #define TCL_REG_NOTEOL 0002 /* End of string does not match $. */
555 * Structures filled in by Tcl_RegExpInfo. Note that all offset values are
556 * relative to the start of the match string, not the beginning of the entire
560 typedef struct Tcl_RegExpIndices
{
561 long start
; /* Character offset of first character in
563 long end
; /* Character offset of first character after
567 typedef struct Tcl_RegExpInfo
{
568 int nsubs
; /* Number of subexpressions in the compiled
570 Tcl_RegExpIndices
*matches
; /* Array of nsubs match offset pairs. */
571 long extendStart
; /* The offset at which a subsequent match
573 long reserved
; /* Reserved for later use. */
577 * Picky compilers complain if this typdef doesn't appear before the struct's
578 * reference in tclDecls.h.
581 typedef Tcl_StatBuf
*Tcl_Stat_
;
582 typedef struct stat
*Tcl_OldStat_
;
585 * When a TCL command returns, the interpreter contains a result from the
586 * command. Programmers are strongly encouraged to use one of the functions
587 * Tcl_GetObjResult() or Tcl_GetStringResult() to read the interpreter's
588 * result. See the SetResult man page for details. Besides this result, the
589 * command function returns an integer code, which is one of the following:
591 * TCL_OK Command completed normally; the interpreter's result
592 * contains the command's result.
593 * TCL_ERROR The command couldn't be completed successfully; the
594 * interpreter's result describes what went wrong.
595 * TCL_RETURN The command requests that the current function return;
596 * the interpreter's result contains the function's
598 * TCL_BREAK The command requests that the innermost loop be
599 * exited; the interpreter's result is meaningless.
600 * TCL_CONTINUE Go on to the next iteration of the current loop; the
601 * interpreter's result is meaningless.
608 #define TCL_CONTINUE 4
610 #define TCL_RESULT_SIZE 200
613 * Flags to control what substitutions are performed by Tcl_SubstObj():
616 #define TCL_SUBST_COMMANDS 001
617 #define TCL_SUBST_VARIABLES 002
618 #define TCL_SUBST_BACKSLASHES 004
619 #define TCL_SUBST_ALL 007
622 * Argument descriptors for math function callbacks in expressions:
626 TCL_INT
, TCL_DOUBLE
, TCL_EITHER
, TCL_WIDE_INT
629 typedef struct Tcl_Value
{
630 Tcl_ValueType type
; /* Indicates intValue or doubleValue is valid,
632 long intValue
; /* Integer value. */
633 double doubleValue
; /* Double-precision floating value. */
634 Tcl_WideInt wideValue
; /* Wide (min. 64-bit) integer value. */
638 * Forward declaration of Tcl_Obj to prevent an error when the forward
639 * reference to Tcl_Obj is encountered in the function types declared below.
645 * Function types defined by Tcl:
648 typedef int (Tcl_AppInitProc
) _ANSI_ARGS_((Tcl_Interp
*interp
));
649 typedef int (Tcl_AsyncProc
) _ANSI_ARGS_((ClientData clientData
,
650 Tcl_Interp
*interp
, int code
));
651 typedef void (Tcl_ChannelProc
) _ANSI_ARGS_((ClientData clientData
, int mask
));
652 typedef void (Tcl_CloseProc
) _ANSI_ARGS_((ClientData data
));
653 typedef void (Tcl_CmdDeleteProc
) _ANSI_ARGS_((ClientData clientData
));
654 typedef int (Tcl_CmdProc
) _ANSI_ARGS_((ClientData clientData
,
655 Tcl_Interp
*interp
, int argc
, CONST84
char *argv
[]));
656 typedef void (Tcl_CmdTraceProc
) _ANSI_ARGS_((ClientData clientData
,
657 Tcl_Interp
*interp
, int level
, char *command
, Tcl_CmdProc
*proc
,
658 ClientData cmdClientData
, int argc
, CONST84
char *argv
[]));
659 typedef int (Tcl_CmdObjTraceProc
) _ANSI_ARGS_((ClientData clientData
,
660 Tcl_Interp
*interp
, int level
, CONST
char *command
,
661 Tcl_Command commandInfo
, int objc
, struct Tcl_Obj
* CONST
* objv
));
662 typedef void (Tcl_CmdObjTraceDeleteProc
) _ANSI_ARGS_((ClientData clientData
));
663 typedef void (Tcl_DupInternalRepProc
) _ANSI_ARGS_((struct Tcl_Obj
*srcPtr
,
664 struct Tcl_Obj
*dupPtr
));
665 typedef int (Tcl_EncodingConvertProc
)_ANSI_ARGS_((ClientData clientData
,
666 CONST
char *src
, int srcLen
, int flags
, Tcl_EncodingState
*statePtr
,
667 char *dst
, int dstLen
, int *srcReadPtr
, int *dstWrotePtr
,
669 typedef void (Tcl_EncodingFreeProc
)_ANSI_ARGS_((ClientData clientData
));
670 typedef int (Tcl_EventProc
) _ANSI_ARGS_((Tcl_Event
*evPtr
, int flags
));
671 typedef void (Tcl_EventCheckProc
) _ANSI_ARGS_((ClientData clientData
,
673 typedef int (Tcl_EventDeleteProc
) _ANSI_ARGS_((Tcl_Event
*evPtr
,
674 ClientData clientData
));
675 typedef void (Tcl_EventSetupProc
) _ANSI_ARGS_((ClientData clientData
,
677 typedef void (Tcl_ExitProc
) _ANSI_ARGS_((ClientData clientData
));
678 typedef void (Tcl_FileProc
) _ANSI_ARGS_((ClientData clientData
, int mask
));
679 typedef void (Tcl_FileFreeProc
) _ANSI_ARGS_((ClientData clientData
));
680 typedef void (Tcl_FreeInternalRepProc
) _ANSI_ARGS_((struct Tcl_Obj
*objPtr
));
681 typedef void (Tcl_FreeProc
) _ANSI_ARGS_((char *blockPtr
));
682 typedef void (Tcl_IdleProc
) _ANSI_ARGS_((ClientData clientData
));
683 typedef void (Tcl_InterpDeleteProc
) _ANSI_ARGS_((ClientData clientData
,
684 Tcl_Interp
*interp
));
685 typedef int (Tcl_MathProc
) _ANSI_ARGS_((ClientData clientData
,
686 Tcl_Interp
*interp
, Tcl_Value
*args
, Tcl_Value
*resultPtr
));
687 typedef void (Tcl_NamespaceDeleteProc
) _ANSI_ARGS_((ClientData clientData
));
688 typedef int (Tcl_ObjCmdProc
) _ANSI_ARGS_((ClientData clientData
,
689 Tcl_Interp
*interp
, int objc
, struct Tcl_Obj
* CONST
* objv
));
690 typedef int (Tcl_PackageInitProc
) _ANSI_ARGS_((Tcl_Interp
*interp
));
691 typedef int (Tcl_PackageUnloadProc
) _ANSI_ARGS_((Tcl_Interp
*interp
,
693 typedef void (Tcl_PanicProc
) _ANSI_ARGS_((CONST
char *format
, ...));
694 typedef void (Tcl_TcpAcceptProc
) _ANSI_ARGS_((ClientData callbackData
,
695 Tcl_Channel chan
, char *address
, int port
));
696 typedef void (Tcl_TimerProc
) _ANSI_ARGS_((ClientData clientData
));
697 typedef int (Tcl_SetFromAnyProc
) _ANSI_ARGS_((Tcl_Interp
*interp
,
698 struct Tcl_Obj
*objPtr
));
699 typedef void (Tcl_UpdateStringProc
) _ANSI_ARGS_((struct Tcl_Obj
*objPtr
));
700 typedef char *(Tcl_VarTraceProc
) _ANSI_ARGS_((ClientData clientData
,
701 Tcl_Interp
*interp
, CONST84
char *part1
, CONST84
char *part2
,
703 typedef void (Tcl_CommandTraceProc
) _ANSI_ARGS_((ClientData clientData
,
704 Tcl_Interp
*interp
, CONST
char *oldName
, CONST
char *newName
,
706 typedef void (Tcl_CreateFileHandlerProc
) _ANSI_ARGS_((int fd
, int mask
,
707 Tcl_FileProc
*proc
, ClientData clientData
));
708 typedef void (Tcl_DeleteFileHandlerProc
) _ANSI_ARGS_((int fd
));
709 typedef void (Tcl_AlertNotifierProc
) _ANSI_ARGS_((ClientData clientData
));
710 typedef void (Tcl_ServiceModeHookProc
) _ANSI_ARGS_((int mode
));
711 typedef ClientData (Tcl_InitNotifierProc
) _ANSI_ARGS_((VOID
));
712 typedef void (Tcl_FinalizeNotifierProc
) _ANSI_ARGS_((ClientData clientData
));
713 typedef void (Tcl_MainLoopProc
) _ANSI_ARGS_((void));
716 * The following structure represents a type of object, which is a particular
717 * internal representation for an object plus a set of functions that provide
718 * standard operations on objects of that type.
721 typedef struct Tcl_ObjType
{
722 char *name
; /* Name of the type, e.g. "int". */
723 Tcl_FreeInternalRepProc
*freeIntRepProc
;
724 /* Called to free any storage for the type's
725 * internal rep. NULL if the internal rep does
726 * not need freeing. */
727 Tcl_DupInternalRepProc
*dupIntRepProc
;
728 /* Called to create a new object as a copy of
729 * an existing object. */
730 Tcl_UpdateStringProc
*updateStringProc
;
731 /* Called to update the string rep from the
732 * type's internal representation. */
733 Tcl_SetFromAnyProc
*setFromAnyProc
;
734 /* Called to convert the object's internal rep
735 * to this type. Frees the internal rep of the
736 * old type. Returns TCL_ERROR on failure. */
740 * One of the following structures exists for each object in the Tcl system.
741 * An object stores a value as either a string, some internal representation,
745 typedef struct Tcl_Obj
{
746 int refCount
; /* When 0 the object will be freed. */
747 char *bytes
; /* This points to the first byte of the
748 * object's string representation. The array
749 * must be followed by a null byte (i.e., at
750 * offset length) but may also contain
751 * embedded null characters. The array's
752 * storage is allocated by ckalloc. NULL means
753 * the string rep is invalid and must be
754 * regenerated from the internal rep. Clients
755 * should use Tcl_GetStringFromObj or
756 * Tcl_GetString to get a pointer to the byte
757 * array as a readonly value. */
758 int length
; /* The number of bytes at *bytes, not
759 * including the terminating null. */
760 Tcl_ObjType
*typePtr
; /* Denotes the object's type. Always
761 * corresponds to the type of the object's
762 * internal rep. NULL indicates the object has
763 * no internal rep (has no type). */
764 union { /* The internal representation: */
765 long longValue
; /* - an long integer value. */
766 double doubleValue
; /* - a double-precision floating value. */
767 VOID
*otherValuePtr
; /* - another, type-specific value. */
768 Tcl_WideInt wideValue
; /* - a long long value. */
769 struct { /* - internal rep as two pointers. */
773 struct { /* - internal rep as a wide int, tightly
775 VOID
*ptr
; /* Pointer to digits. */
776 unsigned long value
;/* Alloc, used, and signum packed into a
783 * Macros to increment and decrement a Tcl_Obj's reference count, and to test
784 * whether an object is shared (i.e. has reference count > 1). Note: clients
785 * should use Tcl_DecrRefCount() when they are finished using an object, and
786 * should never call TclFreeObj() directly. TclFreeObj() is only defined and
787 * made public in tcl.h to support Tcl_DecrRefCount's macro definition. Note
788 * also that Tcl_DecrRefCount() refers to the parameter "obj" twice. This
789 * means that you should avoid calling it with an expression that is expensive
790 * to compute or has side effects.
793 void Tcl_IncrRefCount
_ANSI_ARGS_((Tcl_Obj
*objPtr
));
794 void Tcl_DecrRefCount
_ANSI_ARGS_((Tcl_Obj
*objPtr
));
795 int Tcl_IsShared
_ANSI_ARGS_((Tcl_Obj
*objPtr
));
798 * The following structure contains the state needed by Tcl_SaveResult. No-one
799 * outside of Tcl should access any of these fields. This structure is
800 * typically allocated on the stack.
803 typedef struct Tcl_SavedResult
{
805 Tcl_FreeProc
*freeProc
;
806 Tcl_Obj
*objResultPtr
;
810 char resultSpace
[TCL_RESULT_SIZE
+1];
814 * The following definitions support Tcl's namespace facility. Note: the first
815 * five fields must match exactly the fields in a Namespace structure (see
819 typedef struct Tcl_Namespace
{
820 char *name
; /* The namespace's name within its parent
821 * namespace. This contains no ::'s. The name
822 * of the global namespace is "" although "::"
824 char *fullName
; /* The namespace's fully qualified name. This
826 ClientData clientData
; /* Arbitrary value associated with this
828 Tcl_NamespaceDeleteProc
*deleteProc
;
829 /* Function invoked when deleting the
830 * namespace to, e.g., free clientData. */
831 struct Tcl_Namespace
*parentPtr
;
832 /* Points to the namespace that contains this
833 * one. NULL if this is the global
838 * The following structure represents a call frame, or activation record. A
839 * call frame defines a naming context for a procedure call: its local scope
840 * (for local variables) and its namespace scope (used for non-local
841 * variables; often the global :: namespace). A call frame can also define the
842 * naming context for a namespace eval or namespace inscope command: the
843 * namespace in which the command's code should execute. The Tcl_CallFrame
844 * structures exist only while procedures or namespace eval/inscope's are
845 * being executed, and provide a Tcl call stack.
847 * A call frame is initialized and pushed using Tcl_PushCallFrame and popped
848 * using Tcl_PopCallFrame. Storage for a Tcl_CallFrame must be provided by the
849 * Tcl_PushCallFrame caller, and callers typically allocate them on the C call
850 * stack for efficiency. For this reason, Tcl_CallFrame is defined as a
851 * structure and not as an opaque token. However, most Tcl_CallFrame fields
852 * are hidden since applications should not access them directly; others are
853 * declared as "dummyX".
855 * WARNING!! The structure definition must be kept consistent with the
856 * CallFrame structure in tclInt.h. If you change one, change the other.
859 typedef struct Tcl_CallFrame
{
860 Tcl_Namespace
*nsPtr
;
877 * Information about commands that is returned by Tcl_GetCommandInfo and
878 * passed to Tcl_SetCommandInfo. objProc is an objc/objv object-based command
879 * function while proc is a traditional Tcl argc/argv string-based function.
880 * Tcl_CreateObjCommand and Tcl_CreateCommand ensure that both objProc and
881 * proc are non-NULL and can be called to execute the command. However, it may
882 * be faster to call one instead of the other. The member isNativeObjectProc
883 * is set to 1 if an object-based function was registered by
884 * Tcl_CreateObjCommand, and to 0 if a string-based function was registered by
885 * Tcl_CreateCommand. The other function is typically set to a compatibility
886 * wrapper that does string-to-object or object-to-string argument conversions
887 * then calls the other function.
890 typedef struct Tcl_CmdInfo
{
891 int isNativeObjectProc
; /* 1 if objProc was registered by a call to
892 * Tcl_CreateObjCommand; 0 otherwise.
893 * Tcl_SetCmdInfo does not modify this
895 Tcl_ObjCmdProc
*objProc
; /* Command's object-based function. */
896 ClientData objClientData
; /* ClientData for object proc. */
897 Tcl_CmdProc
*proc
; /* Command's string-based function. */
898 ClientData clientData
; /* ClientData for string proc. */
899 Tcl_CmdDeleteProc
*deleteProc
;
900 /* Function to call when command is
902 ClientData deleteData
; /* Value to pass to deleteProc (usually the
903 * same as clientData). */
904 Tcl_Namespace
*namespacePtr
;/* Points to the namespace that contains this
905 * command. Note that Tcl_SetCmdInfo will not
906 * change a command's namespace; use
907 * TclRenameCommand or Tcl_Eval (of 'rename')
912 * The structure defined below is used to hold dynamic strings. The only
913 * fields that clients should use are string and length, accessible via the
914 * macros Tcl_DStringValue and Tcl_DStringLength.
917 #define TCL_DSTRING_STATIC_SIZE 200
918 typedef struct Tcl_DString
{
919 char *string
; /* Points to beginning of string: either
920 * staticSpace below or a malloced array. */
921 int length
; /* Number of non-NULL characters in the
923 int spaceAvl
; /* Total number of bytes available for the
924 * string and its terminating NULL char. */
925 char staticSpace
[TCL_DSTRING_STATIC_SIZE
];
926 /* Space to use in common case where string is
930 #define Tcl_DStringLength(dsPtr) ((dsPtr)->length)
931 #define Tcl_DStringValue(dsPtr) ((dsPtr)->string)
932 #define Tcl_DStringTrunc Tcl_DStringSetLength
935 * Definitions for the maximum number of digits of precision that may be
936 * specified in the "tcl_precision" variable, and the number of bytes of
937 * buffer space required by Tcl_PrintDouble.
940 #define TCL_MAX_PREC 17
941 #define TCL_DOUBLE_SPACE (TCL_MAX_PREC+10)
944 * Definition for a number of bytes of buffer space sufficient to hold the
945 * string representation of an integer in base 10 (assuming the existence of
949 #define TCL_INTEGER_SPACE 24
952 * Flag values passed to Tcl_ConvertElement.
953 * TCL_DONT_USE_BRACES forces it not to enclose the element in braces, but to
954 * use backslash quoting instead.
955 * TCL_DONT_QUOTE_HASH disables the default quoting of the '#' character. It
956 * is safe to leave the hash unquoted when the element is not the first
957 * element of a list, and this flag can be used by the caller to indicate
961 #define TCL_DONT_USE_BRACES 1
962 #define TCL_DONT_QUOTE_HASH 8
965 * Flag that may be passed to Tcl_GetIndexFromObj to force it to disallow
966 * abbreviated strings.
972 * Flag values passed to Tcl_RecordAndEval, Tcl_EvalObj, Tcl_EvalObjv.
973 * WARNING: these bit choices must not conflict with the bit choices for
974 * evalFlag bits in tclInt.h!
977 * TCL_NO_EVAL: Just record this command
978 * TCL_EVAL_GLOBAL: Execute script in global namespace
979 * TCL_EVAL_DIRECT: Do not compile this script
980 * TCL_EVAL_INVOKE: Magical Tcl_EvalObjv mode for aliases/ensembles
981 * o Run in iPtr->lookupNsPtr or global namespace
982 * o Cut out of error traces
983 * o Don't reset the flags controlling ensemble
984 * error message rewriting.
986 #define TCL_NO_EVAL 0x10000
987 #define TCL_EVAL_GLOBAL 0x20000
988 #define TCL_EVAL_DIRECT 0x40000
989 #define TCL_EVAL_INVOKE 0x80000
992 * Special freeProc values that may be passed to Tcl_SetResult (see the man
996 #define TCL_VOLATILE ((Tcl_FreeProc *) 1)
997 #define TCL_STATIC ((Tcl_FreeProc *) 0)
998 #define TCL_DYNAMIC ((Tcl_FreeProc *) 3)
1001 * Flag values passed to variable-related functions.
1004 #define TCL_GLOBAL_ONLY 1
1005 #define TCL_NAMESPACE_ONLY 2
1006 #define TCL_APPEND_VALUE 4
1007 #define TCL_LIST_ELEMENT 8
1008 #define TCL_TRACE_READS 0x10
1009 #define TCL_TRACE_WRITES 0x20
1010 #define TCL_TRACE_UNSETS 0x40
1011 #define TCL_TRACE_DESTROYED 0x80
1012 #define TCL_INTERP_DESTROYED 0x100
1013 #define TCL_LEAVE_ERR_MSG 0x200
1014 #define TCL_TRACE_ARRAY 0x800
1015 #ifndef TCL_REMOVE_OBSOLETE_TRACES
1016 /* Required to support old variable/vdelete/vinfo traces */
1017 #define TCL_TRACE_OLD_STYLE 0x1000
1019 /* Indicate the semantics of the result of a trace */
1020 #define TCL_TRACE_RESULT_DYNAMIC 0x8000
1021 #define TCL_TRACE_RESULT_OBJECT 0x10000
1024 * Flag values for ensemble commands.
1027 #define TCL_ENSEMBLE_PREFIX 0x02/* Flag value to say whether to allow
1028 * unambiguous prefixes of commands or to
1029 * require exact matches for command names. */
1032 * Flag values passed to command-related functions.
1035 #define TCL_TRACE_RENAME 0x2000
1036 #define TCL_TRACE_DELETE 0x4000
1038 #define TCL_ALLOW_INLINE_COMPILATION 0x20000
1041 * The TCL_PARSE_PART1 flag is deprecated and has no effect. The part1 is now
1042 * always parsed whenever the part2 is NULL. (This is to avoid a common error
1043 * when converting code to use the new object based APIs and forgetting to
1047 #ifndef TCL_NO_DEPRECATED
1048 # define TCL_PARSE_PART1 0x400
1052 * Types for linked variables:
1055 #define TCL_LINK_INT 1
1056 #define TCL_LINK_DOUBLE 2
1057 #define TCL_LINK_BOOLEAN 3
1058 #define TCL_LINK_STRING 4
1059 #define TCL_LINK_WIDE_INT 5
1060 #define TCL_LINK_CHAR 6
1061 #define TCL_LINK_UCHAR 7
1062 #define TCL_LINK_SHORT 8
1063 #define TCL_LINK_USHORT 9
1064 #define TCL_LINK_UINT 10
1065 #define TCL_LINK_LONG 11
1066 #define TCL_LINK_ULONG 12
1067 #define TCL_LINK_FLOAT 13
1068 #define TCL_LINK_WIDE_UINT 14
1069 #define TCL_LINK_READ_ONLY 0x80
1072 * Forward declarations of Tcl_HashTable and related types.
1075 typedef struct Tcl_HashKeyType Tcl_HashKeyType
;
1076 typedef struct Tcl_HashTable Tcl_HashTable
;
1077 typedef struct Tcl_HashEntry Tcl_HashEntry
;
1079 typedef unsigned int (Tcl_HashKeyProc
) _ANSI_ARGS_((Tcl_HashTable
*tablePtr
,
1081 typedef int (Tcl_CompareHashKeysProc
) _ANSI_ARGS_((VOID
*keyPtr
,
1082 Tcl_HashEntry
*hPtr
));
1083 typedef Tcl_HashEntry
*(Tcl_AllocHashEntryProc
) _ANSI_ARGS_((
1084 Tcl_HashTable
*tablePtr
, VOID
*keyPtr
));
1085 typedef void (Tcl_FreeHashEntryProc
) _ANSI_ARGS_((Tcl_HashEntry
*hPtr
));
1088 * This flag controls whether the hash table stores the hash of a key, or
1089 * recalculates it. There should be no reason for turning this flag off as it
1090 * is completely binary and source compatible unless you directly access the
1091 * bucketPtr member of the Tcl_HashTableEntry structure. This member has been
1092 * removed and the space used to store the hash value.
1095 #ifndef TCL_HASH_KEY_STORE_HASH
1096 # define TCL_HASH_KEY_STORE_HASH 1
1100 * Structure definition for an entry in a hash table. No-one outside Tcl
1101 * should access any of these fields directly; use the macros defined below.
1104 struct Tcl_HashEntry
{
1105 Tcl_HashEntry
*nextPtr
; /* Pointer to next entry in this hash bucket,
1106 * or NULL for end of chain. */
1107 Tcl_HashTable
*tablePtr
; /* Pointer to table containing entry. */
1108 #if TCL_HASH_KEY_STORE_HASH
1109 VOID
*hash
; /* Hash value, stored as pointer to ensure
1110 * that the offsets of the fields in this
1111 * structure are not changed. */
1113 Tcl_HashEntry
**bucketPtr
; /* Pointer to bucket that points to first
1114 * entry in this entry's chain: used for
1115 * deleting the entry. */
1117 ClientData clientData
; /* Application stores something here with
1118 * Tcl_SetHashValue. */
1119 union { /* Key has one of these forms: */
1120 char *oneWordValue
; /* One-word value for key. */
1121 Tcl_Obj
*objPtr
; /* Tcl_Obj * key value. */
1122 int words
[1]; /* Multiple integer words for key. The actual
1123 * size will be as large as necessary for this
1125 char string
[4]; /* String for key. The actual size will be as
1126 * large as needed to hold the key. */
1127 } key
; /* MUST BE LAST FIELD IN RECORD!! */
1131 * Flags used in Tcl_HashKeyType.
1133 * TCL_HASH_KEY_RANDOMIZE_HASH -
1134 * There are some things, pointers for example
1135 * which don't hash well because they do not use
1136 * the lower bits. If this flag is set then the
1137 * hash table will attempt to rectify this by
1138 * randomising the bits and then using the upper
1139 * N bits as the index into the table.
1140 * TCL_HASH_KEY_SYSTEM_HASH - If this flag is set then all memory internally
1141 * allocated for the hash table that is not for an
1142 * entry will use the system heap.
1145 #define TCL_HASH_KEY_RANDOMIZE_HASH 0x1
1146 #define TCL_HASH_KEY_SYSTEM_HASH 0x2
1149 * Structure definition for the methods associated with a hash table key type.
1152 #define TCL_HASH_KEY_TYPE_VERSION 1
1153 struct Tcl_HashKeyType
{
1154 int version
; /* Version of the table. If this structure is
1155 * extended in future then the version can be
1156 * used to distinguish between different
1158 int flags
; /* Flags, see above for details. */
1159 Tcl_HashKeyProc
*hashKeyProc
;
1160 /* Calculates a hash value for the key. If
1161 * this is NULL then the pointer itself is
1162 * used as a hash value. */
1163 Tcl_CompareHashKeysProc
*compareKeysProc
;
1164 /* Compares two keys and returns zero if they
1165 * do not match, and non-zero if they do. If
1166 * this is NULL then the pointers are
1168 Tcl_AllocHashEntryProc
*allocEntryProc
;
1169 /* Called to allocate memory for a new entry,
1170 * i.e. if the key is a string then this could
1171 * allocate a single block which contains
1172 * enough space for both the entry and the
1173 * string. Only the key field of the allocated
1174 * Tcl_HashEntry structure needs to be filled
1175 * in. If something else needs to be done to
1176 * the key, i.e. incrementing a reference
1177 * count then that should be done by this
1178 * function. If this is NULL then Tcl_Alloc is
1179 * used to allocate enough space for a
1180 * Tcl_HashEntry and the key pointer is
1181 * assigned to key.oneWordValue. */
1182 Tcl_FreeHashEntryProc
*freeEntryProc
;
1183 /* Called to free memory associated with an
1184 * entry. If something else needs to be done
1185 * to the key, i.e. decrementing a reference
1186 * count then that should be done by this
1187 * function. If this is NULL then Tcl_Free is
1188 * used to free the Tcl_HashEntry. */
1192 * Structure definition for a hash table. Must be in tcl.h so clients can
1193 * allocate space for these structures, but clients should never access any
1194 * fields in this structure.
1197 #define TCL_SMALL_HASH_TABLE 4
1198 struct Tcl_HashTable
{
1199 Tcl_HashEntry
**buckets
; /* Pointer to bucket array. Each element
1200 * points to first entry in bucket's hash
1201 * chain, or NULL. */
1202 Tcl_HashEntry
*staticBuckets
[TCL_SMALL_HASH_TABLE
];
1203 /* Bucket array used for small tables (to
1204 * avoid mallocs and frees). */
1205 int numBuckets
; /* Total number of buckets allocated at
1207 int numEntries
; /* Total number of entries present in
1209 int rebuildSize
; /* Enlarge table when numEntries gets to be
1211 int downShift
; /* Shift count used in hashing function.
1212 * Designed to use high-order bits of
1213 * randomized keys. */
1214 int mask
; /* Mask value used in hashing function. */
1215 int keyType
; /* Type of keys used in this table. It's
1216 * either TCL_CUSTOM_KEYS, TCL_STRING_KEYS,
1217 * TCL_ONE_WORD_KEYS, or an integer giving the
1218 * number of ints that is the size of the
1220 Tcl_HashEntry
*(*findProc
) _ANSI_ARGS_((Tcl_HashTable
*tablePtr
,
1222 Tcl_HashEntry
*(*createProc
) _ANSI_ARGS_((Tcl_HashTable
*tablePtr
,
1223 CONST
char *key
, int *newPtr
));
1224 Tcl_HashKeyType
*typePtr
; /* Type of the keys used in the
1229 * Structure definition for information used to keep track of searches through
1233 typedef struct Tcl_HashSearch
{
1234 Tcl_HashTable
*tablePtr
; /* Table being searched. */
1235 int nextIndex
; /* Index of next bucket to be enumerated after
1237 Tcl_HashEntry
*nextEntryPtr
;/* Next entry to be enumerated in the current
1242 * Acceptable key types for hash tables:
1244 * TCL_STRING_KEYS: The keys are strings, they are copied into the
1246 * TCL_ONE_WORD_KEYS: The keys are pointers, the pointer is stored
1248 * TCL_CUSTOM_TYPE_KEYS: The keys are arbitrary types which are copied
1250 * TCL_CUSTOM_PTR_KEYS: The keys are pointers to arbitrary types, the
1251 * pointer is stored in the entry.
1253 * While maintaining binary compatability the above have to be distinct values
1254 * as they are used to differentiate between old versions of the hash table
1255 * which don't have a typePtr and new ones which do. Once binary compatability
1256 * is discarded in favour of making more wide spread changes TCL_STRING_KEYS
1257 * can be the same as TCL_CUSTOM_TYPE_KEYS, and TCL_ONE_WORD_KEYS can be the
1258 * same as TCL_CUSTOM_PTR_KEYS because they simply determine how the key is
1259 * accessed from the entry and not the behaviour.
1262 #define TCL_STRING_KEYS 0
1263 #define TCL_ONE_WORD_KEYS 1
1264 #define TCL_CUSTOM_TYPE_KEYS -2
1265 #define TCL_CUSTOM_PTR_KEYS -1
1268 * Structure definition for information used to keep track of searches through
1269 * dictionaries. These fields should not be accessed by code outside
1274 void *next
; /* Search position for underlying hash
1276 int epoch
; /* Epoch marker for dictionary being searched,
1277 * or -1 if search has terminated. */
1278 Tcl_Dict dictionaryPtr
; /* Reference to dictionary being searched. */
1282 * Flag values to pass to Tcl_DoOneEvent to disable searches for some kinds of
1286 #define TCL_DONT_WAIT (1<<1)
1287 #define TCL_WINDOW_EVENTS (1<<2)
1288 #define TCL_FILE_EVENTS (1<<3)
1289 #define TCL_TIMER_EVENTS (1<<4)
1290 #define TCL_IDLE_EVENTS (1<<5) /* WAS 0x10 ???? */
1291 #define TCL_ALL_EVENTS (~TCL_DONT_WAIT)
1294 * The following structure defines a generic event for the Tcl event system.
1295 * These are the things that are queued in calls to Tcl_QueueEvent and
1296 * serviced later by Tcl_DoOneEvent. There can be many different kinds of
1297 * events with different fields, corresponding to window events, timer events,
1298 * etc. The structure for a particular event consists of a Tcl_Event header
1299 * followed by additional information specific to that event.
1303 Tcl_EventProc
*proc
; /* Function to call to service this event. */
1304 struct Tcl_Event
*nextPtr
; /* Next in list of pending events, or NULL. */
1308 * Positions to pass to Tcl_QueueEvent:
1312 TCL_QUEUE_TAIL
, TCL_QUEUE_HEAD
, TCL_QUEUE_MARK
1313 } Tcl_QueuePosition
;
1316 * Values to pass to Tcl_SetServiceMode to specify the behavior of notifier
1320 #define TCL_SERVICE_NONE 0
1321 #define TCL_SERVICE_ALL 1
1324 * The following structure keeps is used to hold a time value, either as an
1325 * absolute time (the number of seconds from the epoch) or as an elapsed time.
1326 * On Unix systems the epoch is Midnight Jan 1, 1970 GMT.
1329 typedef struct Tcl_Time
{
1330 long sec
; /* Seconds. */
1331 long usec
; /* Microseconds. */
1334 typedef void (Tcl_SetTimerProc
) _ANSI_ARGS_((Tcl_Time
*timePtr
));
1335 typedef int (Tcl_WaitForEventProc
) _ANSI_ARGS_((Tcl_Time
*timePtr
));
1338 * TIP #233 (Virtualized Time)
1341 typedef void (Tcl_GetTimeProc
) _ANSI_ARGS_((Tcl_Time
*timebuf
,
1342 ClientData clientData
));
1343 typedef void (Tcl_ScaleTimeProc
) _ANSI_ARGS_((Tcl_Time
*timebuf
,
1344 ClientData clientData
));
1347 * Bits to pass to Tcl_CreateFileHandler and Tcl_CreateChannelHandler to
1348 * indicate what sorts of events are of interest:
1351 #define TCL_READABLE (1<<1)
1352 #define TCL_WRITABLE (1<<2)
1353 #define TCL_EXCEPTION (1<<3)
1356 * Flag values to pass to Tcl_OpenCommandChannel to indicate the disposition
1357 * of the stdio handles. TCL_STDIN, TCL_STDOUT, TCL_STDERR, are also used in
1358 * Tcl_GetStdChannel.
1361 #define TCL_STDIN (1<<1)
1362 #define TCL_STDOUT (1<<2)
1363 #define TCL_STDERR (1<<3)
1364 #define TCL_ENFORCE_MODE (1<<4)
1367 * Bits passed to Tcl_DriverClose2Proc to indicate which side of a channel
1371 #define TCL_CLOSE_READ (1<<1)
1372 #define TCL_CLOSE_WRITE (1<<2)
1375 * Value to use as the closeProc for a channel that supports the close2Proc
1379 #define TCL_CLOSE2PROC ((Tcl_DriverCloseProc *) 1)
1382 * Channel version tag. This was introduced in 8.3.2/8.4.
1385 #define TCL_CHANNEL_VERSION_1 ((Tcl_ChannelTypeVersion) 0x1)
1386 #define TCL_CHANNEL_VERSION_2 ((Tcl_ChannelTypeVersion) 0x2)
1387 #define TCL_CHANNEL_VERSION_3 ((Tcl_ChannelTypeVersion) 0x3)
1388 #define TCL_CHANNEL_VERSION_4 ((Tcl_ChannelTypeVersion) 0x4)
1389 #define TCL_CHANNEL_VERSION_5 ((Tcl_ChannelTypeVersion) 0x5)
1392 * TIP #218: Channel Actions, Ids for Tcl_DriverThreadActionProc.
1395 #define TCL_CHANNEL_THREAD_INSERT (0)
1396 #define TCL_CHANNEL_THREAD_REMOVE (1)
1399 * Typedefs for the various operations in a channel type:
1402 typedef int (Tcl_DriverBlockModeProc
) _ANSI_ARGS_((
1403 ClientData instanceData
, int mode
));
1404 typedef int (Tcl_DriverCloseProc
) _ANSI_ARGS_((ClientData instanceData
,
1405 Tcl_Interp
*interp
));
1406 typedef int (Tcl_DriverClose2Proc
) _ANSI_ARGS_((ClientData instanceData
,
1407 Tcl_Interp
*interp
, int flags
));
1408 typedef int (Tcl_DriverInputProc
) _ANSI_ARGS_((ClientData instanceData
,
1409 char *buf
, int toRead
, int *errorCodePtr
));
1410 typedef int (Tcl_DriverOutputProc
) _ANSI_ARGS_((ClientData instanceData
,
1411 CONST84
char *buf
, int toWrite
, int *errorCodePtr
));
1412 typedef int (Tcl_DriverSeekProc
) _ANSI_ARGS_((ClientData instanceData
,
1413 long offset
, int mode
, int *errorCodePtr
));
1414 typedef int (Tcl_DriverSetOptionProc
) _ANSI_ARGS_((
1415 ClientData instanceData
, Tcl_Interp
*interp
,
1416 CONST
char *optionName
, CONST
char *value
));
1417 typedef int (Tcl_DriverGetOptionProc
) _ANSI_ARGS_((
1418 ClientData instanceData
, Tcl_Interp
*interp
,
1419 CONST84
char *optionName
, Tcl_DString
*dsPtr
));
1420 typedef void (Tcl_DriverWatchProc
) _ANSI_ARGS_((
1421 ClientData instanceData
, int mask
));
1422 typedef int (Tcl_DriverGetHandleProc
) _ANSI_ARGS_((
1423 ClientData instanceData
, int direction
,
1424 ClientData
*handlePtr
));
1425 typedef int (Tcl_DriverFlushProc
) _ANSI_ARGS_((ClientData instanceData
));
1426 typedef int (Tcl_DriverHandlerProc
) _ANSI_ARGS_((
1427 ClientData instanceData
, int interestMask
));
1428 typedef Tcl_WideInt (Tcl_DriverWideSeekProc
) _ANSI_ARGS_((
1429 ClientData instanceData
, Tcl_WideInt offset
,
1430 int mode
, int *errorCodePtr
));
1432 * TIP #218, Channel Thread Actions
1434 typedef void (Tcl_DriverThreadActionProc
) _ANSI_ARGS_ ((
1435 ClientData instanceData
, int action
));
1437 * TIP #208, File Truncation (etc.)
1439 typedef int (Tcl_DriverTruncateProc
) _ANSI_ARGS_((
1440 ClientData instanceData
, Tcl_WideInt length
));
1443 * struct Tcl_ChannelType:
1445 * One such structure exists for each type (kind) of channel. It collects
1446 * together in one place all the functions that are part of the specific
1449 * It is recommend that the Tcl_Channel* functions are used to access elements
1450 * of this structure, instead of direct accessing.
1453 typedef struct Tcl_ChannelType
{
1454 char *typeName
; /* The name of the channel type in Tcl
1455 * commands. This storage is owned by channel
1457 Tcl_ChannelTypeVersion version
;
1458 /* Version of the channel type. */
1459 Tcl_DriverCloseProc
*closeProc
;
1460 /* Function to call to close the channel, or
1461 * TCL_CLOSE2PROC if the close2Proc should be
1463 Tcl_DriverInputProc
*inputProc
;
1464 /* Function to call for input on channel. */
1465 Tcl_DriverOutputProc
*outputProc
;
1466 /* Function to call for output on channel. */
1467 Tcl_DriverSeekProc
*seekProc
;
1468 /* Function to call to seek on the channel.
1470 Tcl_DriverSetOptionProc
*setOptionProc
;
1471 /* Set an option on a channel. */
1472 Tcl_DriverGetOptionProc
*getOptionProc
;
1473 /* Get an option from a channel. */
1474 Tcl_DriverWatchProc
*watchProc
;
1475 /* Set up the notifier to watch for events on
1477 Tcl_DriverGetHandleProc
*getHandleProc
;
1478 /* Get an OS handle from the channel or NULL
1479 * if not supported. */
1480 Tcl_DriverClose2Proc
*close2Proc
;
1481 /* Function to call to close the channel if
1482 * the device supports closing the read &
1483 * write sides independently. */
1484 Tcl_DriverBlockModeProc
*blockModeProc
;
1485 /* Set blocking mode for the raw channel. May
1488 * Only valid in TCL_CHANNEL_VERSION_2 channels or later.
1490 Tcl_DriverFlushProc
*flushProc
;
1491 /* Function to call to flush a channel. May be
1493 Tcl_DriverHandlerProc
*handlerProc
;
1494 /* Function to call to handle a channel event.
1495 * This will be passed up the stacked channel
1498 * Only valid in TCL_CHANNEL_VERSION_3 channels or later.
1500 Tcl_DriverWideSeekProc
*wideSeekProc
;
1501 /* Function to call to seek on the channel
1502 * which can handle 64-bit offsets. May be
1503 * NULL, and must be NULL if seekProc is
1506 * Only valid in TCL_CHANNEL_VERSION_4 channels or later.
1507 * TIP #218, Channel Thread Actions.
1509 Tcl_DriverThreadActionProc
*threadActionProc
;
1510 /* Function to call to notify the driver of
1511 * thread specific activity for a channel. May
1515 * Only valid in TCL_CHANNEL_VERSION_5 channels or later.
1516 * TIP #208, File Truncation.
1518 Tcl_DriverTruncateProc
*truncateProc
;
1519 /* Function to call to truncate the underlying
1520 * file to a particular length. May be NULL if
1521 * the channel does not support truncation. */
1525 * The following flags determine whether the blockModeProc above should set
1526 * the channel into blocking or nonblocking mode. They are passed as arguments
1527 * to the blockModeProc function in the above structure.
1530 #define TCL_MODE_BLOCKING 0 /* Put channel into blocking mode. */
1531 #define TCL_MODE_NONBLOCKING 1 /* Put channel into nonblocking
1535 * Enum for different types of file paths.
1538 typedef enum Tcl_PathType
{
1541 TCL_PATH_VOLUME_RELATIVE
1545 * The following structure is used to pass glob type data amongst the various
1546 * glob routines and Tcl_FSMatchInDirectory.
1549 typedef struct Tcl_GlobTypeData
{
1550 int type
; /* Corresponds to bcdpfls as in 'find -t'. */
1551 int perm
; /* Corresponds to file permissions. */
1552 Tcl_Obj
*macType
; /* Acceptable Mac type. */
1553 Tcl_Obj
*macCreator
; /* Acceptable Mac creator. */
1557 * Type and permission definitions for glob command.
1560 #define TCL_GLOB_TYPE_BLOCK (1<<0)
1561 #define TCL_GLOB_TYPE_CHAR (1<<1)
1562 #define TCL_GLOB_TYPE_DIR (1<<2)
1563 #define TCL_GLOB_TYPE_PIPE (1<<3)
1564 #define TCL_GLOB_TYPE_FILE (1<<4)
1565 #define TCL_GLOB_TYPE_LINK (1<<5)
1566 #define TCL_GLOB_TYPE_SOCK (1<<6)
1567 #define TCL_GLOB_TYPE_MOUNT (1<<7)
1569 #define TCL_GLOB_PERM_RONLY (1<<0)
1570 #define TCL_GLOB_PERM_HIDDEN (1<<1)
1571 #define TCL_GLOB_PERM_R (1<<2)
1572 #define TCL_GLOB_PERM_W (1<<3)
1573 #define TCL_GLOB_PERM_X (1<<4)
1576 * Flags for the unload callback function.
1579 #define TCL_UNLOAD_DETACH_FROM_INTERPRETER (1<<0)
1580 #define TCL_UNLOAD_DETACH_FROM_PROCESS (1<<1)
1583 * Typedefs for the various filesystem operations:
1586 typedef int (Tcl_FSStatProc
) _ANSI_ARGS_((Tcl_Obj
*pathPtr
, Tcl_StatBuf
*buf
));
1587 typedef int (Tcl_FSAccessProc
) _ANSI_ARGS_((Tcl_Obj
*pathPtr
, int mode
));
1588 typedef Tcl_Channel (Tcl_FSOpenFileChannelProc
) _ANSI_ARGS_((
1589 Tcl_Interp
*interp
, Tcl_Obj
*pathPtr
, int mode
, int permissions
));
1590 typedef int (Tcl_FSMatchInDirectoryProc
) _ANSI_ARGS_((Tcl_Interp
*interp
,
1591 Tcl_Obj
*result
, Tcl_Obj
*pathPtr
, CONST
char *pattern
,
1592 Tcl_GlobTypeData
* types
));
1593 typedef Tcl_Obj
* (Tcl_FSGetCwdProc
) _ANSI_ARGS_((Tcl_Interp
*interp
));
1594 typedef int (Tcl_FSChdirProc
) _ANSI_ARGS_((Tcl_Obj
*pathPtr
));
1595 typedef int (Tcl_FSLstatProc
) _ANSI_ARGS_((Tcl_Obj
*pathPtr
,
1597 typedef int (Tcl_FSCreateDirectoryProc
) _ANSI_ARGS_((Tcl_Obj
*pathPtr
));
1598 typedef int (Tcl_FSDeleteFileProc
) _ANSI_ARGS_((Tcl_Obj
*pathPtr
));
1599 typedef int (Tcl_FSCopyDirectoryProc
) _ANSI_ARGS_((Tcl_Obj
*srcPathPtr
,
1600 Tcl_Obj
*destPathPtr
, Tcl_Obj
**errorPtr
));
1601 typedef int (Tcl_FSCopyFileProc
) _ANSI_ARGS_((Tcl_Obj
*srcPathPtr
,
1602 Tcl_Obj
*destPathPtr
));
1603 typedef int (Tcl_FSRemoveDirectoryProc
) _ANSI_ARGS_((Tcl_Obj
*pathPtr
,
1604 int recursive
, Tcl_Obj
**errorPtr
));
1605 typedef int (Tcl_FSRenameFileProc
) _ANSI_ARGS_((Tcl_Obj
*srcPathPtr
,
1606 Tcl_Obj
*destPathPtr
));
1607 typedef void (Tcl_FSUnloadFileProc
) _ANSI_ARGS_((Tcl_LoadHandle loadHandle
));
1608 typedef Tcl_Obj
* (Tcl_FSListVolumesProc
) _ANSI_ARGS_((void));
1609 /* We have to declare the utime structure here. */
1611 typedef int (Tcl_FSUtimeProc
) _ANSI_ARGS_((Tcl_Obj
*pathPtr
,
1612 struct utimbuf
*tval
));
1613 typedef int (Tcl_FSNormalizePathProc
) _ANSI_ARGS_((Tcl_Interp
*interp
,
1614 Tcl_Obj
*pathPtr
, int nextCheckpoint
));
1615 typedef int (Tcl_FSFileAttrsGetProc
) _ANSI_ARGS_((Tcl_Interp
*interp
,
1616 int index
, Tcl_Obj
*pathPtr
, Tcl_Obj
**objPtrRef
));
1617 typedef CONST
char ** (Tcl_FSFileAttrStringsProc
) _ANSI_ARGS_((
1618 Tcl_Obj
*pathPtr
, Tcl_Obj
**objPtrRef
));
1619 typedef int (Tcl_FSFileAttrsSetProc
) _ANSI_ARGS_((Tcl_Interp
*interp
,
1620 int index
, Tcl_Obj
*pathPtr
, Tcl_Obj
*objPtr
));
1621 typedef Tcl_Obj
* (Tcl_FSLinkProc
) _ANSI_ARGS_((Tcl_Obj
*pathPtr
,
1622 Tcl_Obj
*toPtr
, int linkType
));
1623 typedef int (Tcl_FSLoadFileProc
) _ANSI_ARGS_((Tcl_Interp
* interp
,
1624 Tcl_Obj
*pathPtr
, Tcl_LoadHandle
*handlePtr
,
1625 Tcl_FSUnloadFileProc
**unloadProcPtr
));
1626 typedef int (Tcl_FSPathInFilesystemProc
) _ANSI_ARGS_((Tcl_Obj
*pathPtr
,
1627 ClientData
*clientDataPtr
));
1628 typedef Tcl_Obj
* (Tcl_FSFilesystemPathTypeProc
) _ANSI_ARGS_((
1630 typedef Tcl_Obj
* (Tcl_FSFilesystemSeparatorProc
) _ANSI_ARGS_((
1632 typedef void (Tcl_FSFreeInternalRepProc
) _ANSI_ARGS_((ClientData clientData
));
1633 typedef ClientData (Tcl_FSDupInternalRepProc
) _ANSI_ARGS_((
1634 ClientData clientData
));
1635 typedef Tcl_Obj
* (Tcl_FSInternalToNormalizedProc
) _ANSI_ARGS_((
1636 ClientData clientData
));
1637 typedef ClientData (Tcl_FSCreateInternalRepProc
) _ANSI_ARGS_((
1640 typedef struct Tcl_FSVersion_
*Tcl_FSVersion
;
1643 *----------------------------------------------------------------
1644 * Data structures related to hooking into the filesystem
1645 *----------------------------------------------------------------
1649 * Filesystem version tag. This was introduced in 8.4.
1651 #define TCL_FILESYSTEM_VERSION_1 ((Tcl_FSVersion) 0x1)
1654 * struct Tcl_Filesystem:
1656 * One such structure exists for each type (kind) of filesystem. It collects
1657 * together in one place all the functions that are part of the specific
1658 * filesystem. Tcl always accesses the filesystem through one of these
1661 * Not all entries need be non-NULL; any which are NULL are simply ignored.
1662 * However, a complete filesystem should provide all of these functions. The
1663 * explanations in the structure show the importance of each function.
1666 typedef struct Tcl_Filesystem
{
1667 CONST
char *typeName
; /* The name of the filesystem. */
1668 int structureLength
; /* Length of this structure, so future binary
1669 * compatibility can be assured. */
1670 Tcl_FSVersion version
; /* Version of the filesystem type. */
1671 Tcl_FSPathInFilesystemProc
*pathInFilesystemProc
;
1672 /* Function to check whether a path is in this
1673 * filesystem. This is the most important
1674 * filesystem function. */
1675 Tcl_FSDupInternalRepProc
*dupInternalRepProc
;
1676 /* Function to duplicate internal fs rep. May
1677 * be NULL (but then fs is less efficient). */
1678 Tcl_FSFreeInternalRepProc
*freeInternalRepProc
;
1679 /* Function to free internal fs rep. Must be
1680 * implemented if internal representations
1681 * need freeing, otherwise it can be NULL. */
1682 Tcl_FSInternalToNormalizedProc
*internalToNormalizedProc
;
1683 /* Function to convert internal representation
1684 * to a normalized path. Only required if the
1685 * fs creates pure path objects with no
1686 * string/path representation. */
1687 Tcl_FSCreateInternalRepProc
*createInternalRepProc
;
1688 /* Function to create a filesystem-specific
1689 * internal representation. May be NULL if
1690 * paths have no internal representation, or
1691 * if the Tcl_FSPathInFilesystemProc for this
1692 * filesystem always immediately creates an
1693 * internal representation for paths it
1695 Tcl_FSNormalizePathProc
*normalizePathProc
;
1696 /* Function to normalize a path. Should be
1697 * implemented for all filesystems which can
1698 * have multiple string representations for
1699 * the same path object. */
1700 Tcl_FSFilesystemPathTypeProc
*filesystemPathTypeProc
;
1701 /* Function to determine the type of a path in
1702 * this filesystem. May be NULL. */
1703 Tcl_FSFilesystemSeparatorProc
*filesystemSeparatorProc
;
1704 /* Function to return the separator
1705 * character(s) for this filesystem. Must be
1707 Tcl_FSStatProc
*statProc
; /* Function to process a 'Tcl_FSStat()' call.
1708 * Must be implemented for any reasonable
1710 Tcl_FSAccessProc
*accessProc
;
1711 /* Function to process a 'Tcl_FSAccess()'
1712 * call. Must be implemented for any
1713 * reasonable filesystem. */
1714 Tcl_FSOpenFileChannelProc
*openFileChannelProc
;
1715 /* Function to process a
1716 * 'Tcl_FSOpenFileChannel()' call. Must be
1717 * implemented for any reasonable
1719 Tcl_FSMatchInDirectoryProc
*matchInDirectoryProc
;
1720 /* Function to process a
1721 * 'Tcl_FSMatchInDirectory()'. If not
1722 * implemented, then glob and recursive copy
1723 * functionality will be lacking in the
1725 Tcl_FSUtimeProc
*utimeProc
; /* Function to process a 'Tcl_FSUtime()' call.
1726 * Required to allow setting (not reading) of
1727 * times with 'file mtime', 'file atime' and
1728 * the open-r/open-w/fcopy implementation of
1730 Tcl_FSLinkProc
*linkProc
; /* Function to process a 'Tcl_FSLink()' call.
1731 * Should be implemented only if the
1732 * filesystem supports links (reading or
1734 Tcl_FSListVolumesProc
*listVolumesProc
;
1735 /* Function to list any filesystem volumes
1736 * added by this filesystem. Should be
1737 * implemented only if the filesystem adds
1738 * volumes at the head of the filesystem. */
1739 Tcl_FSFileAttrStringsProc
*fileAttrStringsProc
;
1740 /* Function to list all attributes strings
1741 * which are valid for this filesystem. If not
1742 * implemented the filesystem will not support
1743 * the 'file attributes' command. This allows
1744 * arbitrary additional information to be
1745 * attached to files in the filesystem. */
1746 Tcl_FSFileAttrsGetProc
*fileAttrsGetProc
;
1747 /* Function to process a
1748 * 'Tcl_FSFileAttrsGet()' call, used by 'file
1750 Tcl_FSFileAttrsSetProc
*fileAttrsSetProc
;
1751 /* Function to process a
1752 * 'Tcl_FSFileAttrsSet()' call, used by 'file
1754 Tcl_FSCreateDirectoryProc
*createDirectoryProc
;
1755 /* Function to process a
1756 * 'Tcl_FSCreateDirectory()' call. Should be
1757 * implemented unless the FS is read-only. */
1758 Tcl_FSRemoveDirectoryProc
*removeDirectoryProc
;
1759 /* Function to process a
1760 * 'Tcl_FSRemoveDirectory()' call. Should be
1761 * implemented unless the FS is read-only. */
1762 Tcl_FSDeleteFileProc
*deleteFileProc
;
1763 /* Function to process a 'Tcl_FSDeleteFile()'
1764 * call. Should be implemented unless the FS
1766 Tcl_FSCopyFileProc
*copyFileProc
;
1767 /* Function to process a 'Tcl_FSCopyFile()'
1768 * call. If not implemented Tcl will fall back
1769 * on open-r, open-w and fcopy as a copying
1770 * mechanism, for copying actions initiated in
1772 Tcl_FSRenameFileProc
*renameFileProc
;
1773 /* Function to process a 'Tcl_FSRenameFile()'
1774 * call. If not implemented, Tcl will fall
1775 * back on a copy and delete mechanism, for
1776 * rename actions initiated in Tcl (not C). */
1777 Tcl_FSCopyDirectoryProc
*copyDirectoryProc
;
1778 /* Function to process a
1779 * 'Tcl_FSCopyDirectory()' call. If not
1780 * implemented, Tcl will fall back on a
1781 * recursive create-dir, file copy mechanism,
1782 * for copying actions initiated in Tcl (not
1784 Tcl_FSLstatProc
*lstatProc
; /* Function to process a 'Tcl_FSLstat()' call.
1785 * If not implemented, Tcl will attempt to use
1786 * the 'statProc' defined above instead. */
1787 Tcl_FSLoadFileProc
*loadFileProc
;
1788 /* Function to process a 'Tcl_FSLoadFile()'
1789 * call. If not implemented, Tcl will fall
1790 * back on a copy to native-temp followed by a
1791 * Tcl_FSLoadFile on that temporary copy. */
1792 Tcl_FSGetCwdProc
*getCwdProc
;
1793 /* Function to process a 'Tcl_FSGetCwd()'
1794 * call. Most filesystems need not implement
1795 * this. It will usually only be called once,
1796 * if 'getcwd' is called before 'chdir'. May
1798 Tcl_FSChdirProc
*chdirProc
; /* Function to process a 'Tcl_FSChdir()' call.
1799 * If filesystems do not implement this, it
1800 * will be emulated by a series of directory
1801 * access checks. Otherwise, virtual
1802 * filesystems which do implement it need only
1803 * respond with a positive return result if
1804 * the dirName is a valid directory in their
1805 * filesystem. They need not remember the
1806 * result, since that will be automatically
1807 * remembered for use by GetCwd. Real
1808 * filesystems should carry out the correct
1809 * action (i.e. call the correct system
1810 * 'chdir' api). If not implemented, then 'cd'
1811 * and 'pwd' will fail inside the
1816 * The following definitions are used as values for the 'linkAction' flag to
1817 * Tcl_FSLink, or the linkProc of any filesystem. Any combination of flags can
1818 * be given. For link creation, the linkProc should create a link which
1819 * matches any of the types given.
1821 * TCL_CREATE_SYMBOLIC_LINK - Create a symbolic or soft link.
1822 * TCL_CREATE_HARD_LINK - Create a hard link.
1825 #define TCL_CREATE_SYMBOLIC_LINK 0x01
1826 #define TCL_CREATE_HARD_LINK 0x02
1829 * The following structure represents the Notifier functions that you can
1830 * override with the Tcl_SetNotifier call.
1833 typedef struct Tcl_NotifierProcs
{
1834 Tcl_SetTimerProc
*setTimerProc
;
1835 Tcl_WaitForEventProc
*waitForEventProc
;
1836 Tcl_CreateFileHandlerProc
*createFileHandlerProc
;
1837 Tcl_DeleteFileHandlerProc
*deleteFileHandlerProc
;
1838 Tcl_InitNotifierProc
*initNotifierProc
;
1839 Tcl_FinalizeNotifierProc
*finalizeNotifierProc
;
1840 Tcl_AlertNotifierProc
*alertNotifierProc
;
1841 Tcl_ServiceModeHookProc
*serviceModeHookProc
;
1842 } Tcl_NotifierProcs
;
1845 * The following structure represents a user-defined encoding. It collects
1846 * together all the functions that are used by the specific encoding.
1849 typedef struct Tcl_EncodingType
{
1850 CONST
char *encodingName
; /* The name of the encoding, e.g. "euc-jp".
1851 * This name is the unique key for this
1853 Tcl_EncodingConvertProc
*toUtfProc
;
1854 /* Function to convert from external encoding
1856 Tcl_EncodingConvertProc
*fromUtfProc
;
1857 /* Function to convert from UTF-8 into
1858 * external encoding. */
1859 Tcl_EncodingFreeProc
*freeProc
;
1860 /* If non-NULL, function to call when this
1861 * encoding is deleted. */
1862 ClientData clientData
; /* Arbitrary value associated with encoding
1863 * type. Passed to conversion functions. */
1864 int nullSize
; /* Number of zero bytes that signify
1865 * end-of-string in this encoding. This number
1866 * is used to determine the source string
1867 * length when the srcLen argument is
1868 * negative. Must be 1 or 2. */
1872 * The following definitions are used as values for the conversion control
1873 * flags argument when converting text from one character set to another:
1875 * TCL_ENCODING_START - Signifies that the source buffer is the first
1876 * block in a (potentially multi-block) input
1877 * stream. Tells the conversion function to reset
1878 * to an initial state and perform any
1879 * initialization that needs to occur before the
1880 * first byte is converted. If the source buffer
1881 * contains the entire input stream to be
1882 * converted, this flag should be set.
1883 * TCL_ENCODING_END - Signifies that the source buffer is the last
1884 * block in a (potentially multi-block) input
1885 * stream. Tells the conversion routine to
1886 * perform any finalization that needs to occur
1887 * after the last byte is converted and then to
1888 * reset to an initial state. If the source
1889 * buffer contains the entire input stream to be
1890 * converted, this flag should be set.
1891 * TCL_ENCODING_STOPONERROR - If set, then the converter will return
1892 * immediately upon encountering an invalid byte
1893 * sequence or a source character that has no
1894 * mapping in the target encoding. If clear, then
1895 * the converter will skip the problem,
1896 * substituting one or more "close" characters in
1897 * the destination buffer and then continue to
1898 * convert the source.
1901 #define TCL_ENCODING_START 0x01
1902 #define TCL_ENCODING_END 0x02
1903 #define TCL_ENCODING_STOPONERROR 0x04
1906 * The following data structures and declarations are for the new Tcl parser.
1910 * For each word of a command, and for each piece of a word such as a variable
1911 * reference, one of the following structures is created to describe the
1915 typedef struct Tcl_Token
{
1916 int type
; /* Type of token, such as TCL_TOKEN_WORD; see
1917 * below for valid types. */
1918 CONST
char *start
; /* First character in token. */
1919 int size
; /* Number of bytes in token. */
1920 int numComponents
; /* If this token is composed of other tokens,
1921 * this field tells how many of them there are
1922 * (including components of components, etc.).
1923 * The component tokens immediately follow
1928 * Type values defined for Tcl_Token structures. These values are defined as
1929 * mask bits so that it's easy to check for collections of types.
1931 * TCL_TOKEN_WORD - The token describes one word of a command,
1932 * from the first non-blank character of the word
1933 * (which may be " or {) up to but not including
1934 * the space, semicolon, or bracket that
1935 * terminates the word. NumComponents counts the
1936 * total number of sub-tokens that make up the
1937 * word. This includes, for example, sub-tokens
1938 * of TCL_TOKEN_VARIABLE tokens.
1939 * TCL_TOKEN_SIMPLE_WORD - This token is just like TCL_TOKEN_WORD except
1940 * that the word is guaranteed to consist of a
1941 * single TCL_TOKEN_TEXT sub-token.
1942 * TCL_TOKEN_TEXT - The token describes a range of literal text
1943 * that is part of a word. NumComponents is
1945 * TCL_TOKEN_BS - The token describes a backslash sequence that
1946 * must be collapsed. NumComponents is always 0.
1947 * TCL_TOKEN_COMMAND - The token describes a command whose result
1948 * must be substituted into the word. The token
1949 * includes the enclosing brackets. NumComponents
1951 * TCL_TOKEN_VARIABLE - The token describes a variable substitution,
1952 * including the dollar sign, variable name, and
1953 * array index (if there is one) up through the
1954 * right parentheses. NumComponents tells how
1955 * many additional tokens follow to represent the
1956 * variable name. The first token will be a
1957 * TCL_TOKEN_TEXT token that describes the
1958 * variable name. If the variable is an array
1959 * reference then there will be one or more
1960 * additional tokens, of type TCL_TOKEN_TEXT,
1961 * TCL_TOKEN_BS, TCL_TOKEN_COMMAND, and
1962 * TCL_TOKEN_VARIABLE, that describe the array
1963 * index; numComponents counts the total number
1964 * of nested tokens that make up the variable
1965 * reference, including sub-tokens of
1966 * TCL_TOKEN_VARIABLE tokens.
1967 * TCL_TOKEN_SUB_EXPR - The token describes one subexpression of an
1968 * expression, from the first non-blank character
1969 * of the subexpression up to but not including
1970 * the space, brace, or bracket that terminates
1971 * the subexpression. NumComponents counts the
1972 * total number of following subtokens that make
1973 * up the subexpression; this includes all
1974 * subtokens for any nested TCL_TOKEN_SUB_EXPR
1975 * tokens. For example, a numeric value used as a
1976 * primitive operand is described by a
1977 * TCL_TOKEN_SUB_EXPR token followed by a
1978 * TCL_TOKEN_TEXT token. A binary subexpression
1979 * is described by a TCL_TOKEN_SUB_EXPR token
1980 * followed by the TCL_TOKEN_OPERATOR token for
1981 * the operator, then TCL_TOKEN_SUB_EXPR tokens
1982 * for the left then the right operands.
1983 * TCL_TOKEN_OPERATOR - The token describes one expression operator.
1984 * An operator might be the name of a math
1985 * function such as "abs". A TCL_TOKEN_OPERATOR
1986 * token is always preceeded by one
1987 * TCL_TOKEN_SUB_EXPR token for the operator's
1988 * subexpression, and is followed by zero or more
1989 * TCL_TOKEN_SUB_EXPR tokens for the operator's
1990 * operands. NumComponents is always 0.
1991 * TCL_TOKEN_EXPAND_WORD - This token is just like TCL_TOKEN_WORD except
1992 * that it marks a word that began with the
1993 * literal character prefix "{*}". This word is
1994 * marked to be expanded - that is, broken into
1995 * words after substitution is complete.
1998 #define TCL_TOKEN_WORD 1
1999 #define TCL_TOKEN_SIMPLE_WORD 2
2000 #define TCL_TOKEN_TEXT 4
2001 #define TCL_TOKEN_BS 8
2002 #define TCL_TOKEN_COMMAND 16
2003 #define TCL_TOKEN_VARIABLE 32
2004 #define TCL_TOKEN_SUB_EXPR 64
2005 #define TCL_TOKEN_OPERATOR 128
2006 #define TCL_TOKEN_EXPAND_WORD 256
2009 * Parsing error types. On any parsing error, one of these values will be
2010 * stored in the error field of the Tcl_Parse structure defined below.
2013 #define TCL_PARSE_SUCCESS 0
2014 #define TCL_PARSE_QUOTE_EXTRA 1
2015 #define TCL_PARSE_BRACE_EXTRA 2
2016 #define TCL_PARSE_MISSING_BRACE 3
2017 #define TCL_PARSE_MISSING_BRACKET 4
2018 #define TCL_PARSE_MISSING_PAREN 5
2019 #define TCL_PARSE_MISSING_QUOTE 6
2020 #define TCL_PARSE_MISSING_VAR_BRACE 7
2021 #define TCL_PARSE_SYNTAX 8
2022 #define TCL_PARSE_BAD_NUMBER 9
2025 * A structure of the following type is filled in by Tcl_ParseCommand. It
2026 * describes a single command parsed from an input string.
2029 #define NUM_STATIC_TOKENS 20
2031 typedef struct Tcl_Parse
{
2032 CONST
char *commentStart
; /* Pointer to # that begins the first of one
2033 * or more comments preceding the command. */
2034 int commentSize
; /* Number of bytes in comments (up through
2035 * newline character that terminates the last
2036 * comment). If there were no comments, this
2038 CONST
char *commandStart
; /* First character in first word of
2040 int commandSize
; /* Number of bytes in command, including first
2041 * character of first word, up through the
2042 * terminating newline, close bracket, or
2044 int numWords
; /* Total number of words in command. May be
2046 Tcl_Token
*tokenPtr
; /* Pointer to first token representing the
2047 * words of the command. Initially points to
2048 * staticTokens, but may change to point to
2049 * malloc-ed space if command exceeds space in
2051 int numTokens
; /* Total number of tokens in command. */
2052 int tokensAvailable
; /* Total number of tokens available at
2054 int errorType
; /* One of the parsing error types defined
2058 * The fields below are intended only for the private use of the parser.
2059 * They should not be used by functions that invoke Tcl_ParseCommand.
2062 CONST
char *string
; /* The original command string passed to
2063 * Tcl_ParseCommand. */
2064 CONST
char *end
; /* Points to the character just after the last
2065 * one in the command string. */
2066 Tcl_Interp
*interp
; /* Interpreter to use for error reporting, or
2068 CONST
char *term
; /* Points to character in string that
2069 * terminated most recent token. Filled in by
2070 * ParseTokens. If an error occurs, points to
2071 * beginning of region where the error
2072 * occurred (e.g. the open brace if the close
2073 * brace is missing). */
2074 int incomplete
; /* This field is set to 1 by Tcl_ParseCommand
2075 * if the command appears to be incomplete.
2076 * This information is used by
2077 * Tcl_CommandComplete. */
2078 Tcl_Token staticTokens
[NUM_STATIC_TOKENS
];
2079 /* Initial space for tokens for command. This
2080 * space should be large enough to accommodate
2081 * most commands; dynamic space is allocated
2082 * for very large commands that don't fit
2087 * The following definitions are the error codes returned by the conversion
2090 * TCL_OK - All characters were converted.
2091 * TCL_CONVERT_NOSPACE - The output buffer would not have been large
2092 * enough for all of the converted data; as many
2093 * characters as could fit were converted though.
2094 * TCL_CONVERT_MULTIBYTE - The last few bytes in the source string were
2095 * the beginning of a multibyte sequence, but
2096 * more bytes were needed to complete this
2097 * sequence. A subsequent call to the conversion
2098 * routine should pass the beginning of this
2099 * unconverted sequence plus additional bytes
2100 * from the source stream to properly convert the
2101 * formerly split-up multibyte sequence.
2102 * TCL_CONVERT_SYNTAX - The source stream contained an invalid
2103 * character sequence. This may occur if the
2104 * input stream has been damaged or if the input
2105 * encoding method was misidentified. This error
2106 * is reported only if TCL_ENCODING_STOPONERROR
2108 * TCL_CONVERT_UNKNOWN - The source string contained a character that
2109 * could not be represented in the target
2110 * encoding. This error is reported only if
2111 * TCL_ENCODING_STOPONERROR was specified.
2114 #define TCL_CONVERT_MULTIBYTE -1
2115 #define TCL_CONVERT_SYNTAX -2
2116 #define TCL_CONVERT_UNKNOWN -3
2117 #define TCL_CONVERT_NOSPACE -4
2120 * The maximum number of bytes that are necessary to represent a single
2121 * Unicode character in UTF-8. The valid values should be 3 or 6 (or perhaps 1
2122 * if we want to support a non-unicode enabled core). If 3, then Tcl_UniChar
2123 * must be 2-bytes in size (UCS-2) (the default). If 6, then Tcl_UniChar must
2124 * be 4-bytes in size (UCS-4). At this time UCS-2 mode is the default and
2125 * recommended mode. UCS-4 is experimental and not recommended. It works for
2126 * the core, but most extensions expect UCS-2.
2130 #define TCL_UTF_MAX 3
2134 * This represents a Unicode character. Any changes to this should also be
2135 * reflected in regcustom.h.
2140 * unsigned int isn't 100% accurate as it should be a strict 4-byte value
2141 * (perhaps wchar_t). 64-bit systems may have troubles. The size of this
2142 * value must be reflected correctly in regcustom.h and
2144 * XXX: Tcl is currently UCS-2 and planning UTF-16 for the Unicode
2145 * XXX: string rep that Tcl_UniChar represents. Changing the size
2146 * XXX: of Tcl_UniChar is /not/ supported.
2148 typedef unsigned int Tcl_UniChar
;
2150 typedef unsigned short Tcl_UniChar
;
2154 * TIP #59: The following structure is used in calls 'Tcl_RegisterConfig' to
2155 * provide the system with the embedded configuration data.
2158 typedef struct Tcl_Config
{
2159 CONST
char *key
; /* Configuration key to register. ASCII
2160 * encoded, thus UTF-8. */
2161 CONST
char *value
; /* The value associated with the key. System
2166 * Flags for TIP#143 limits, detailing which limits are active in an
2167 * interpreter. Used for Tcl_{Add,Remove}LimitHandler type argument.
2170 #define TCL_LIMIT_COMMANDS 0x01
2171 #define TCL_LIMIT_TIME 0x02
2174 * Structure containing information about a limit handler to be called when a
2175 * command- or time-limit is exceeded by an interpreter.
2178 typedef void (Tcl_LimitHandlerProc
) _ANSI_ARGS_((ClientData clientData
,
2179 Tcl_Interp
*interp
));
2180 typedef void (Tcl_LimitHandlerDeleteProc
) _ANSI_ARGS_((ClientData clientData
));
2182 typedef struct mp_int mp_int
;
2183 #define MP_INT_DECLARED
2184 typedef unsigned int mp_digit
;
2185 #define MP_DIGIT_DECLARED
2188 * The following constant is used to test for older versions of Tcl in the
2191 * Jan Nijtman's plus patch uses 0xFCA1BACF, so we need to pick a different
2192 * value since the stubs tables don't match.
2195 #define TCL_STUB_MAGIC ((int) 0xFCA3BACF)
2198 * The following function is required to be defined in all stubs aware
2199 * extensions. The function is actually implemented in the stub library, not
2200 * the main Tcl library, although there is a trivial implementation in the
2201 * main library in case an extension is statically linked into an application.
2204 EXTERN CONST
char * Tcl_InitStubs
_ANSI_ARGS_((Tcl_Interp
*interp
,
2205 CONST
char *version
, int exact
));
2206 EXTERN CONST
char * TclTomMathInitializeStubs
_ANSI_ARGS_((
2207 Tcl_Interp
*interp
, CONST
char *version
,
2208 int epoch
, int revision
));
2210 #ifndef USE_TCL_STUBS
2213 * When not using stubs, make it a macro.
2216 #define Tcl_InitStubs(interp, version, exact) \
2217 Tcl_PkgInitStubsCheck(interp, version, exact)
2222 * TODO - tommath stubs export goes here!
2227 * Public functions that are not accessible via the stubs table.
2228 * Tcl_GetMemoryInfo is needed for AOLserver. [Bug 1868171]
2231 EXTERN
void Tcl_Main
_ANSI_ARGS_((int argc
, char **argv
,
2232 Tcl_AppInitProc
*appInitProc
));
2233 EXTERN CONST
char * Tcl_PkgInitStubsCheck
_ANSI_ARGS_((Tcl_Interp
*interp
,
2234 CONST
char *version
, int exact
));
2235 #if defined(TCL_THREADS) && defined(USE_THREAD_ALLOC)
2236 EXTERN
void Tcl_GetMemoryInfo
_ANSI_ARGS_((Tcl_DString
*dsPtr
));
2240 * Include the public function declarations that are accessible via the stubs
2244 #include "tclDecls.h"
2247 * Include platform specific public function declarations that are accessible
2248 * via the stubs table.
2251 #include "tclPlatDecls.h"
2254 * The following declarations either map ckalloc and ckfree to malloc and
2255 * free, or they map them to functions with all sorts of debugging hooks
2256 * defined in tclCkalloc.c.
2259 #ifdef TCL_MEM_DEBUG
2261 # define ckalloc(x) Tcl_DbCkalloc(x, __FILE__, __LINE__)
2262 # define ckfree(x) Tcl_DbCkfree(x, __FILE__, __LINE__)
2263 # define ckrealloc(x,y) Tcl_DbCkrealloc((x), (y),__FILE__, __LINE__)
2264 # define attemptckalloc(x) Tcl_AttemptDbCkalloc(x, __FILE__, __LINE__)
2265 # define attemptckrealloc(x,y) Tcl_AttemptDbCkrealloc((x), (y), __FILE__, __LINE__)
2267 #else /* !TCL_MEM_DEBUG */
2270 * If we are not using the debugging allocator, we should call the Tcl_Alloc,
2271 * et al. routines in order to guarantee that every module is using the same
2272 * memory allocator both inside and outside of the Tcl library.
2275 # define ckalloc(x) Tcl_Alloc(x)
2276 # define ckfree(x) Tcl_Free(x)
2277 # define ckrealloc(x,y) Tcl_Realloc(x,y)
2278 # define attemptckalloc(x) Tcl_AttemptAlloc(x)
2279 # define attemptckrealloc(x,y) Tcl_AttemptRealloc(x,y)
2280 # undef Tcl_InitMemory
2281 # define Tcl_InitMemory(x)
2282 # undef Tcl_DumpActiveMemory
2283 # define Tcl_DumpActiveMemory(x)
2284 # undef Tcl_ValidateAllMemory
2285 # define Tcl_ValidateAllMemory(x,y)
2287 #endif /* !TCL_MEM_DEBUG */
2289 #ifdef TCL_MEM_DEBUG
2290 # define Tcl_IncrRefCount(objPtr) \
2291 Tcl_DbIncrRefCount(objPtr, __FILE__, __LINE__)
2292 # define Tcl_DecrRefCount(objPtr) \
2293 Tcl_DbDecrRefCount(objPtr, __FILE__, __LINE__)
2294 # define Tcl_IsShared(objPtr) \
2295 Tcl_DbIsShared(objPtr, __FILE__, __LINE__)
2297 # define Tcl_IncrRefCount(objPtr) \
2298 ++(objPtr)->refCount
2300 * Use do/while0 idiom for optimum correctness without compiler warnings.
2301 * http://c2.com/cgi/wiki?TrivialDoWhileLoop
2303 # define Tcl_DecrRefCount(objPtr) \
2304 do { if (--(objPtr)->refCount <= 0) TclFreeObj(objPtr); } while(0)
2305 # define Tcl_IsShared(objPtr) \
2306 ((objPtr)->refCount > 1)
2310 * Macros and definitions that help to debug the use of Tcl objects. When
2311 * TCL_MEM_DEBUG is defined, the Tcl_New declarations are overridden to call
2312 * debugging versions of the object creation functions.
2315 #ifdef TCL_MEM_DEBUG
2316 # undef Tcl_NewBignumObj
2317 # define Tcl_NewBignumObj(val) \
2318 Tcl_DbNewBignumObj(val, __FILE__, __LINE__)
2319 # undef Tcl_NewBooleanObj
2320 # define Tcl_NewBooleanObj(val) \
2321 Tcl_DbNewBooleanObj(val, __FILE__, __LINE__)
2322 # undef Tcl_NewByteArrayObj
2323 # define Tcl_NewByteArrayObj(bytes, len) \
2324 Tcl_DbNewByteArrayObj(bytes, len, __FILE__, __LINE__)
2325 # undef Tcl_NewDoubleObj
2326 # define Tcl_NewDoubleObj(val) \
2327 Tcl_DbNewDoubleObj(val, __FILE__, __LINE__)
2328 # undef Tcl_NewIntObj
2329 # define Tcl_NewIntObj(val) \
2330 Tcl_DbNewLongObj(val, __FILE__, __LINE__)
2331 # undef Tcl_NewListObj
2332 # define Tcl_NewListObj(objc, objv) \
2333 Tcl_DbNewListObj(objc, objv, __FILE__, __LINE__)
2334 # undef Tcl_NewLongObj
2335 # define Tcl_NewLongObj(val) \
2336 Tcl_DbNewLongObj(val, __FILE__, __LINE__)
2338 # define Tcl_NewObj() \
2339 Tcl_DbNewObj(__FILE__, __LINE__)
2340 # undef Tcl_NewStringObj
2341 # define Tcl_NewStringObj(bytes, len) \
2342 Tcl_DbNewStringObj(bytes, len, __FILE__, __LINE__)
2343 # undef Tcl_NewWideIntObj
2344 # define Tcl_NewWideIntObj(val) \
2345 Tcl_DbNewWideIntObj(val, __FILE__, __LINE__)
2346 #endif /* TCL_MEM_DEBUG */
2349 * Macros for clients to use to access fields of hash entries:
2352 #define Tcl_GetHashValue(h) ((h)->clientData)
2353 #define Tcl_SetHashValue(h, value) ((h)->clientData = (ClientData) (value))
2354 #define Tcl_GetHashKey(tablePtr, h) \
2355 ((char *) (((tablePtr)->keyType == TCL_ONE_WORD_KEYS || \
2356 (tablePtr)->keyType == TCL_CUSTOM_PTR_KEYS) \
2357 ? (h)->key.oneWordValue \
2361 * Macros to use for clients to use to invoke find and create functions for
2365 #undef Tcl_FindHashEntry
2366 #define Tcl_FindHashEntry(tablePtr, key) \
2367 (*((tablePtr)->findProc))(tablePtr, key)
2368 #undef Tcl_CreateHashEntry
2369 #define Tcl_CreateHashEntry(tablePtr, key, newPtr) \
2370 (*((tablePtr)->createProc))(tablePtr, key, newPtr)
2373 * Macros that eliminate the overhead of the thread synchronization functions
2374 * when compiling without thread support.
2378 #undef Tcl_MutexLock
2379 #define Tcl_MutexLock(mutexPtr)
2380 #undef Tcl_MutexUnlock
2381 #define Tcl_MutexUnlock(mutexPtr)
2382 #undef Tcl_MutexFinalize
2383 #define Tcl_MutexFinalize(mutexPtr)
2384 #undef Tcl_ConditionNotify
2385 #define Tcl_ConditionNotify(condPtr)
2386 #undef Tcl_ConditionWait
2387 #define Tcl_ConditionWait(condPtr, mutexPtr, timePtr)
2388 #undef Tcl_ConditionFinalize
2389 #define Tcl_ConditionFinalize(condPtr)
2390 #endif /* TCL_THREADS */
2392 #ifndef TCL_NO_DEPRECATED
2394 * Deprecated Tcl functions:
2398 # define Tcl_EvalObj(interp,objPtr) \
2399 Tcl_EvalObjEx((interp),(objPtr),0)
2400 # undef Tcl_GlobalEvalObj
2401 # define Tcl_GlobalEvalObj(interp,objPtr) \
2402 Tcl_EvalObjEx((interp),(objPtr),TCL_EVAL_GLOBAL)
2405 * These function have been renamed. The old names are deprecated, but we
2406 * define these macros for backwards compatibilty.
2409 # define Tcl_Ckalloc Tcl_Alloc
2410 # define Tcl_Ckfree Tcl_Free
2411 # define Tcl_Ckrealloc Tcl_Realloc
2412 # define Tcl_Return Tcl_SetResult
2413 # define Tcl_TildeSubst Tcl_TranslateFileName
2414 # define panic Tcl_Panic
2415 # define panicVA Tcl_PanicVA
2419 * Convenience declaration of Tcl_AppInit for backwards compatibility. This
2420 * function is not *implemented* by the tcl library, so the storage class is
2421 * neither DLLEXPORT nor DLLIMPORT.
2424 #undef TCL_STORAGE_CLASS
2425 #define TCL_STORAGE_CLASS
2427 EXTERN
int Tcl_AppInit
_ANSI_ARGS_((Tcl_Interp
*interp
));
2429 #undef TCL_STORAGE_CLASS
2430 #define TCL_STORAGE_CLASS DLLIMPORT
2432 #endif /* RC_INVOKED */