Fossil SCM

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

Keyboard Shortcuts

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