home *** CD-ROM | disk | FTP | other *** search
/ Netrunner 2004 October / NETRUNNER0410.ISO / regular / ActivePerl-5.8.4.810-MSWin32-x86.msi / _7a0fa5ac32d0f828293562895058717b < prev    next >
Encoding:
Text File  |  2004-06-01  |  85.1 KB  |  2,412 lines

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