1 |
/* $Header$ */ |
2 |
/* |
3 |
* tcl.h -- |
4 |
* |
5 |
* This header file describes the externally-visible facilities |
6 |
* of the Tcl interpreter. |
7 |
* |
8 |
* Copyright (c) 1987-1994 The Regents of the University of California. |
9 |
* Copyright (c) 1993-1996 Lucent Technologies. |
10 |
* Copyright (c) 1994-1998 Sun Microsystems, Inc. |
11 |
* Copyright (c) 1998-2000 by Scriptics Corporation. |
12 |
* |
13 |
* See the file "license.terms" for information on usage and redistribution |
14 |
* of this file, and for a DISCLAIMER OF ALL WARRANTIES. |
15 |
* |
16 |
* RCS: @(#) $Id: tcl.h,v 1.1.1.1 2001/06/13 04:32:55 dtashley Exp $ |
17 |
*/ |
18 |
|
19 |
#ifndef _TCL |
20 |
#define _TCL |
21 |
|
22 |
/* |
23 |
* For C++ compilers, use extern "C" |
24 |
*/ |
25 |
|
26 |
#ifdef __cplusplus |
27 |
extern "C" { |
28 |
#endif |
29 |
|
30 |
/* |
31 |
* The following defines are used to indicate the various release levels. |
32 |
*/ |
33 |
|
34 |
#define TCL_ALPHA_RELEASE 0 |
35 |
#define TCL_BETA_RELEASE 1 |
36 |
#define TCL_FINAL_RELEASE 2 |
37 |
|
38 |
/* |
39 |
* When version numbers change here, must also go into the following files |
40 |
* and update the version numbers: |
41 |
* |
42 |
* library/init.tcl (only if Major.minor changes, not patchlevel) 1 LOC |
43 |
* unix/configure.in (2 LOC Major, 2 LOC minor, 1 LOC patch) |
44 |
* win/configure.in (as above) |
45 |
* win/tcl.m4 (not patchlevel) |
46 |
* win/makefile.vc (not patchlevel) 2 LOC |
47 |
* win/pkgIndex.tcl (not patchlevel, for tclregNN.dll) |
48 |
* README (sections 0 and 2) |
49 |
* mac/README (2 LOC, not patchlevel) |
50 |
* win/README.binary (sections 0-4) |
51 |
* win/README (not patchlevel) (sections 0 and 2) |
52 |
* unix/README (not patchlevel) (part (h)) |
53 |
* unix/tcl.spec (2 LOC Major/Minor, 1 LOC patch) |
54 |
* tests/basic.test (not patchlevel) (version checks) |
55 |
* tools/tcl.hpj.in (not patchlevel, for windows installer) |
56 |
* tools/tcl.wse.in (for windows installer) |
57 |
* tools/tclSplash.bmp (not patchlevel) |
58 |
*/ |
59 |
|
60 |
#define TCL_MAJOR_VERSION 8 |
61 |
#define TCL_MINOR_VERSION 3 |
62 |
#define TCL_RELEASE_LEVEL TCL_FINAL_RELEASE |
63 |
#define TCL_RELEASE_SERIAL 1 |
64 |
|
65 |
#define TCL_VERSION "8.3" |
66 |
#define TCL_PATCH_LEVEL "8.3.1" |
67 |
|
68 |
/* |
69 |
* The following definitions set up the proper options for Windows |
70 |
* compilers. We use this method because there is no autoconf equivalent. |
71 |
*/ |
72 |
|
73 |
#ifndef __WIN32__ |
74 |
# if defined(_WIN32) || defined(WIN32) |
75 |
# define __WIN32__ |
76 |
# endif |
77 |
#endif |
78 |
|
79 |
#ifdef __WIN32__ |
80 |
# ifndef STRICT |
81 |
# define STRICT |
82 |
# endif |
83 |
# ifndef USE_PROTOTYPE |
84 |
# define USE_PROTOTYPE 1 |
85 |
# endif |
86 |
# ifndef HAS_STDARG |
87 |
# define HAS_STDARG 1 |
88 |
# endif |
89 |
# ifndef USE_PROTOTYPE |
90 |
# define USE_PROTOTYPE 1 |
91 |
# endif |
92 |
|
93 |
/* |
94 |
* Under Windows we need to call Tcl_Alloc in all cases to avoid competing |
95 |
* C run-time library issues. |
96 |
*/ |
97 |
|
98 |
# ifndef USE_TCLALLOC |
99 |
# define USE_TCLALLOC 0 |
100 |
/* Changed to 0 so could swap in new alloc module, DTA, |
101 |
** 07/06/00. |
102 |
*/ |
103 |
# endif |
104 |
#endif /* __WIN32__ */ |
105 |
|
106 |
/* |
107 |
* The following definitions set up the proper options for Macintosh |
108 |
* compilers. We use this method because there is no autoconf equivalent. |
109 |
*/ |
110 |
|
111 |
#ifdef MAC_TCL |
112 |
# ifndef HAS_STDARG |
113 |
# define HAS_STDARG 1 |
114 |
# endif |
115 |
# ifndef USE_TCLALLOC |
116 |
# define USE_TCLALLOC 1 |
117 |
# endif |
118 |
# ifndef NO_STRERROR |
119 |
# define NO_STRERROR 1 |
120 |
# endif |
121 |
# define INLINE |
122 |
#endif |
123 |
|
124 |
/* |
125 |
* Utility macros: STRINGIFY takes an argument and wraps it in "" (double |
126 |
* quotation marks), JOIN joins two arguments. |
127 |
*/ |
128 |
|
129 |
#define VERBATIM(x) x |
130 |
#ifdef _MSC_VER |
131 |
# define STRINGIFY(x) STRINGIFY1(x) |
132 |
# define STRINGIFY1(x) #x |
133 |
# define JOIN(a,b) JOIN1(a,b) |
134 |
# define JOIN1(a,b) a##b |
135 |
#else |
136 |
# ifdef RESOURCE_INCLUDED |
137 |
# define STRINGIFY(x) STRINGIFY1(x) |
138 |
# define STRINGIFY1(x) #x |
139 |
# define JOIN(a,b) JOIN1(a,b) |
140 |
# define JOIN1(a,b) a##b |
141 |
# else |
142 |
# ifdef __STDC__ |
143 |
# define STRINGIFY(x) #x |
144 |
# define JOIN(a,b) a##b |
145 |
# else |
146 |
# define STRINGIFY(x) "x" |
147 |
# define JOIN(a,b) VERBATIM(a)VERBATIM(b) |
148 |
# endif |
149 |
# endif |
150 |
#endif |
151 |
|
152 |
/* |
153 |
* Special macro to define mutexes, that doesn't do anything |
154 |
* if we are not using threads. |
155 |
*/ |
156 |
|
157 |
#ifdef TCL_THREADS |
158 |
#define TCL_DECLARE_MUTEX(name) static Tcl_Mutex name; |
159 |
#else |
160 |
#define TCL_DECLARE_MUTEX(name) |
161 |
#endif |
162 |
|
163 |
/* |
164 |
* Macros that eliminate the overhead of the thread synchronization |
165 |
* functions when compiling without thread support. |
166 |
*/ |
167 |
|
168 |
#ifndef TCL_THREADS |
169 |
#define Tcl_MutexLock(mutexPtr) |
170 |
#define Tcl_MutexUnlock(mutexPtr) |
171 |
#define Tcl_MutexFinalize(mutexPtr) |
172 |
#define Tcl_ConditionNotify(condPtr) |
173 |
#define Tcl_ConditionWait(condPtr, mutexPtr, timePtr) |
174 |
#define Tcl_ConditionFinalize(condPtr) |
175 |
#endif /* TCL_THREADS */ |
176 |
|
177 |
/* |
178 |
* A special definition used to allow this header file to be included |
179 |
* in resource files so that they can get obtain version information from |
180 |
* this file. Resource compilers don't like all the C stuff, like typedefs |
181 |
* and procedure declarations, that occur below. |
182 |
*/ |
183 |
|
184 |
#ifndef RESOURCE_INCLUDED |
185 |
|
186 |
#ifndef BUFSIZ |
187 |
#include <stdio.h> |
188 |
#endif |
189 |
|
190 |
/* |
191 |
* Definitions that allow Tcl functions with variable numbers of |
192 |
* arguments to be used with either varargs.h or stdarg.h. TCL_VARARGS |
193 |
* is used in procedure prototypes. TCL_VARARGS_DEF is used to declare |
194 |
* the arguments in a function definiton: it takes the type and name of |
195 |
* the first argument and supplies the appropriate argument declaration |
196 |
* string for use in the function definition. TCL_VARARGS_START |
197 |
* initializes the va_list data structure and returns the first argument. |
198 |
*/ |
199 |
|
200 |
#if defined(__STDC__) || defined(HAS_STDARG) |
201 |
# include <stdarg.h> |
202 |
|
203 |
# define TCL_VARARGS(type, name) (type name, ...) |
204 |
# define TCL_VARARGS_DEF(type, name) (type name, ...) |
205 |
# define TCL_VARARGS_START(type, name, list) (va_start(list, name), name) |
206 |
#else |
207 |
# include <varargs.h> |
208 |
|
209 |
# ifdef __cplusplus |
210 |
# define TCL_VARARGS(type, name) (type name, ...) |
211 |
# define TCL_VARARGS_DEF(type, name) (type va_alist, ...) |
212 |
# else |
213 |
# define TCL_VARARGS(type, name) () |
214 |
# define TCL_VARARGS_DEF(type, name) (va_alist) |
215 |
# endif |
216 |
# define TCL_VARARGS_START(type, name, list) \ |
217 |
(va_start(list), va_arg(list, type)) |
218 |
#endif |
219 |
|
220 |
/* |
221 |
* Macros used to declare a function to be exported by a DLL. |
222 |
* Used by Windows, maps to no-op declarations on non-Windows systems. |
223 |
* The default build on windows is for a DLL, which causes the DLLIMPORT |
224 |
* and DLLEXPORT macros to be nonempty. To build a static library, the |
225 |
* macro STATIC_BUILD should be defined. |
226 |
*/ |
227 |
|
228 |
#ifdef STATIC_BUILD |
229 |
# define DLLIMPORT |
230 |
# define DLLEXPORT |
231 |
#else |
232 |
# if defined(__WIN32__) && (defined(_MSC_VER) || (defined(__GNUC__) && defined(__declspec))) |
233 |
# define DLLIMPORT __declspec(dllimport) |
234 |
# define DLLEXPORT __declspec(dllexport) |
235 |
# else |
236 |
# define DLLIMPORT |
237 |
# define DLLEXPORT |
238 |
# endif |
239 |
#endif |
240 |
|
241 |
/* |
242 |
* These macros are used to control whether functions are being declared for |
243 |
* import or export. If a function is being declared while it is being built |
244 |
* to be included in a shared library, then it should have the DLLEXPORT |
245 |
* storage class. If is being declared for use by a module that is going to |
246 |
* link against the shared library, then it should have the DLLIMPORT storage |
247 |
* class. If the symbol is beind declared for a static build or for use from a |
248 |
* stub library, then the storage class should be empty. |
249 |
* |
250 |
* The convention is that a macro called BUILD_xxxx, where xxxx is the |
251 |
* name of a library we are building, is set on the compile line for sources |
252 |
* that are to be placed in the library. When this macro is set, the |
253 |
* storage class will be set to DLLEXPORT. At the end of the header file, the |
254 |
* storage class will be reset to DLLIMPORt. |
255 |
*/ |
256 |
|
257 |
#undef TCL_STORAGE_CLASS |
258 |
#ifdef BUILD_tcl |
259 |
# define TCL_STORAGE_CLASS DLLEXPORT |
260 |
#else |
261 |
# ifdef USE_TCL_STUBS |
262 |
# define TCL_STORAGE_CLASS |
263 |
# else |
264 |
# define TCL_STORAGE_CLASS DLLIMPORT |
265 |
# endif |
266 |
#endif |
267 |
|
268 |
/* |
269 |
* Definitions that allow this header file to be used either with or |
270 |
* without ANSI C features like function prototypes. |
271 |
*/ |
272 |
|
273 |
#undef _ANSI_ARGS_ |
274 |
#undef CONST |
275 |
#ifndef INLINE |
276 |
# define INLINE |
277 |
#endif |
278 |
|
279 |
#if ((defined(__STDC__) || defined(SABER)) && !defined(NO_PROTOTYPE)) || defined(__cplusplus) || defined(USE_PROTOTYPE) |
280 |
# define _USING_PROTOTYPES_ 1 |
281 |
# define _ANSI_ARGS_(x) x |
282 |
# define CONST const |
283 |
#else |
284 |
# define _ANSI_ARGS_(x) () |
285 |
# define CONST |
286 |
#endif |
287 |
|
288 |
/* |
289 |
* Make sure EXTERN isn't defined elsewhere |
290 |
*/ |
291 |
#ifdef EXTERN |
292 |
#undef EXTERN |
293 |
#endif /* EXTERN */ |
294 |
|
295 |
#ifdef __cplusplus |
296 |
# define EXTERN extern "C" TCL_STORAGE_CLASS |
297 |
#else |
298 |
# define EXTERN extern TCL_STORAGE_CLASS |
299 |
#endif |
300 |
|
301 |
/* |
302 |
* Macro to use instead of "void" for arguments that must have |
303 |
* type "void *" in ANSI C; maps them to type "char *" in |
304 |
* non-ANSI systems. |
305 |
*/ |
306 |
#ifndef __WIN32__ |
307 |
#ifndef VOID |
308 |
# ifdef __STDC__ |
309 |
# define VOID void |
310 |
# else |
311 |
# define VOID char |
312 |
# endif |
313 |
#endif |
314 |
#else /* __WIN32__ */ |
315 |
/* |
316 |
* The following code is copied from winnt.h |
317 |
*/ |
318 |
#ifndef VOID |
319 |
#define VOID void |
320 |
typedef char CHAR; |
321 |
typedef short SHORT; |
322 |
typedef long LONG; |
323 |
#endif |
324 |
#endif /* __WIN32__ */ |
325 |
|
326 |
/* |
327 |
* Miscellaneous declarations. |
328 |
*/ |
329 |
|
330 |
#ifndef NULL |
331 |
#define NULL 0 |
332 |
#endif |
333 |
|
334 |
#ifndef _CLIENTDATA |
335 |
# if defined(__STDC__) || defined(__cplusplus) |
336 |
typedef void *ClientData; |
337 |
# else |
338 |
typedef int *ClientData; |
339 |
# endif /* __STDC__ */ |
340 |
#define _CLIENTDATA |
341 |
#endif |
342 |
|
343 |
/* |
344 |
* Data structures defined opaquely in this module. The definitions below |
345 |
* just provide dummy types. A few fields are made visible in Tcl_Interp |
346 |
* structures, namely those used for returning a string result from |
347 |
* commands. Direct access to the result field is discouraged in Tcl 8.0. |
348 |
* The interpreter result is either an object or a string, and the two |
349 |
* values are kept consistent unless some C code sets interp->result |
350 |
* directly. Programmers should use either the procedure Tcl_GetObjResult() |
351 |
* or Tcl_GetStringResult() to read the interpreter's result. See the |
352 |
* SetResult man page for details. |
353 |
* |
354 |
* Note: any change to the Tcl_Interp definition below must be mirrored |
355 |
* in the "real" definition in tclInt.h. |
356 |
* |
357 |
* Note: Tcl_ObjCmdProc procedures do not directly set result and freeProc. |
358 |
* Instead, they set a Tcl_Obj member in the "real" structure that can be |
359 |
* accessed with Tcl_GetObjResult() and Tcl_SetObjResult(). |
360 |
*/ |
361 |
|
362 |
typedef struct Tcl_Interp { |
363 |
char *result; /* If the last command returned a string |
364 |
* result, this points to it. */ |
365 |
void (*freeProc) _ANSI_ARGS_((char *blockPtr)); |
366 |
/* Zero means the string result is |
367 |
* statically allocated. TCL_DYNAMIC means |
368 |
* it was allocated with ckalloc and should |
369 |
* be freed with ckfree. Other values give |
370 |
* the address of procedure to invoke to |
371 |
* free the result. Tcl_Eval must free it |
372 |
* before executing next command. */ |
373 |
int errorLine; /* When TCL_ERROR is returned, this gives |
374 |
* the line number within the command where |
375 |
* the error occurred (1 if first line). */ |
376 |
} Tcl_Interp; |
377 |
|
378 |
typedef struct Tcl_AsyncHandler_ *Tcl_AsyncHandler; |
379 |
typedef struct Tcl_Channel_ *Tcl_Channel; |
380 |
typedef struct Tcl_Command_ *Tcl_Command; |
381 |
typedef struct Tcl_Condition_ *Tcl_Condition; |
382 |
typedef struct Tcl_EncodingState_ *Tcl_EncodingState; |
383 |
typedef struct Tcl_Encoding_ *Tcl_Encoding; |
384 |
typedef struct Tcl_Event Tcl_Event; |
385 |
typedef struct Tcl_Mutex_ *Tcl_Mutex; |
386 |
typedef struct Tcl_Pid_ *Tcl_Pid; |
387 |
typedef struct Tcl_RegExp_ *Tcl_RegExp; |
388 |
typedef struct Tcl_ThreadDataKey_ *Tcl_ThreadDataKey; |
389 |
typedef struct Tcl_ThreadId_ *Tcl_ThreadId; |
390 |
typedef struct Tcl_TimerToken_ *Tcl_TimerToken; |
391 |
typedef struct Tcl_Trace_ *Tcl_Trace; |
392 |
typedef struct Tcl_Var_ *Tcl_Var; |
393 |
|
394 |
/* |
395 |
* Definition of the interface to procedures implementing threads. |
396 |
* A procedure following this definition is given to each call of |
397 |
* 'Tcl_CreateThread' and will be called as the main fuction of |
398 |
* the new thread created by that call. |
399 |
*/ |
400 |
|
401 |
#ifdef MAC_TCL |
402 |
typedef pascal void *(Tcl_ThreadCreateProc) _ANSI_ARGS_((ClientData clientData)); |
403 |
#elif defined __WIN32__ |
404 |
typedef unsigned (__stdcall Tcl_ThreadCreateProc) _ANSI_ARGS_((ClientData clientData)); |
405 |
#else |
406 |
typedef void (Tcl_ThreadCreateProc) _ANSI_ARGS_((ClientData clientData)); |
407 |
#endif |
408 |
|
409 |
|
410 |
/* |
411 |
* Threading function return types used for abstracting away platform |
412 |
* differences when writing a Tcl_ThreadCreateProc. See the NewThread |
413 |
* function in generic/tclThreadTest.c for it's usage. |
414 |
*/ |
415 |
#ifdef MAC_TCL |
416 |
# define Tcl_ThreadCreateType pascal void * |
417 |
# define TCL_THREAD_CREATE_RETURN return NULL |
418 |
#elif defined __WIN32__ |
419 |
# define Tcl_ThreadCreateType unsigned __stdcall |
420 |
# define TCL_THREAD_CREATE_RETURN return 0 |
421 |
#else |
422 |
# define Tcl_ThreadCreateType void |
423 |
# define TCL_THREAD_CREATE_RETURN |
424 |
#endif |
425 |
|
426 |
|
427 |
|
428 |
/* |
429 |
* Definition of values for default stacksize and the possible flags to be |
430 |
* given to Tcl_CreateThread. |
431 |
*/ |
432 |
|
433 |
#define TCL_THREAD_STACK_DEFAULT (0) /* Use default size for stack */ |
434 |
#define TCL_THREAD_NOFLAGS (0000) /* Standard flags, default behaviour */ |
435 |
#define TCL_THREAD_JOINABLE (0001) /* Mark the thread as joinable */ |
436 |
|
437 |
/* |
438 |
* Flag values passed to Tcl_GetRegExpFromObj. |
439 |
*/ |
440 |
|
441 |
#define TCL_REG_BASIC 000000 /* BREs (convenience) */ |
442 |
#define TCL_REG_EXTENDED 000001 /* EREs */ |
443 |
#define TCL_REG_ADVF 000002 /* advanced features in EREs */ |
444 |
#define TCL_REG_ADVANCED 000003 /* AREs (which are also EREs) */ |
445 |
#define TCL_REG_QUOTE 000004 /* no special characters, none */ |
446 |
#define TCL_REG_NOCASE 000010 /* ignore case */ |
447 |
#define TCL_REG_NOSUB 000020 /* don't care about subexpressions */ |
448 |
#define TCL_REG_EXPANDED 000040 /* expanded format, white space & |
449 |
* comments */ |
450 |
#define TCL_REG_NLSTOP 000100 /* \n doesn't match . or [^ ] */ |
451 |
#define TCL_REG_NLANCH 000200 /* ^ matches after \n, $ before */ |
452 |
#define TCL_REG_NEWLINE 000300 /* newlines are line terminators */ |
453 |
#define TCL_REG_CANMATCH 001000 /* report details on partial/limited |
454 |
* matches */ |
455 |
|
456 |
/* |
457 |
* The following flag is experimental and only intended for use by Expect. It |
458 |
* will probably go away in a later release. |
459 |
*/ |
460 |
|
461 |
#define TCL_REG_BOSONLY 002000 /* prepend \A to pattern so it only |
462 |
* matches at the beginning of the |
463 |
* string. */ |
464 |
|
465 |
/* |
466 |
* Flags values passed to Tcl_RegExpExecObj. |
467 |
*/ |
468 |
|
469 |
#define TCL_REG_NOTBOL 0001 /* Beginning of string does not match ^. */ |
470 |
#define TCL_REG_NOTEOL 0002 /* End of string does not match $. */ |
471 |
|
472 |
/* |
473 |
* Structures filled in by Tcl_RegExpInfo. Note that all offset values are |
474 |
* relative to the start of the match string, not the beginning of the |
475 |
* entire string. |
476 |
*/ |
477 |
|
478 |
typedef struct Tcl_RegExpIndices { |
479 |
long start; /* character offset of first character in match */ |
480 |
long end; /* character offset of first character after the |
481 |
* match. */ |
482 |
} Tcl_RegExpIndices; |
483 |
|
484 |
typedef struct Tcl_RegExpInfo { |
485 |
int nsubs; /* number of subexpressions in the |
486 |
* compiled expression */ |
487 |
Tcl_RegExpIndices *matches; /* array of nsubs match offset |
488 |
* pairs */ |
489 |
long extendStart; /* The offset at which a subsequent |
490 |
* match might begin. */ |
491 |
long reserved; /* Reserved for later use. */ |
492 |
} Tcl_RegExpInfo; |
493 |
|
494 |
/* |
495 |
* Picky compilers complain if this typdef doesn't appear before the |
496 |
* struct's reference in tclDecls.h. |
497 |
*/ |
498 |
|
499 |
typedef struct stat *Tcl_Stat_; |
500 |
|
501 |
/* |
502 |
* When a TCL command returns, the interpreter contains a result from the |
503 |
* command. Programmers are strongly encouraged to use one of the |
504 |
* procedures Tcl_GetObjResult() or Tcl_GetStringResult() to read the |
505 |
* interpreter's result. See the SetResult man page for details. Besides |
506 |
* this result, the command procedure returns an integer code, which is |
507 |
* one of the following: |
508 |
* |
509 |
* TCL_OK Command completed normally; the interpreter's |
510 |
* result contains the command's result. |
511 |
* TCL_ERROR The command couldn't be completed successfully; |
512 |
* the interpreter's result describes what went wrong. |
513 |
* TCL_RETURN The command requests that the current procedure |
514 |
* return; the interpreter's result contains the |
515 |
* procedure's return value. |
516 |
* TCL_BREAK The command requests that the innermost loop |
517 |
* be exited; the interpreter's result is meaningless. |
518 |
* TCL_CONTINUE Go on to the next iteration of the current loop; |
519 |
* the interpreter's result is meaningless. |
520 |
*/ |
521 |
|
522 |
#define TCL_OK 0 |
523 |
#define TCL_ERROR 1 |
524 |
#define TCL_RETURN 2 |
525 |
#define TCL_BREAK 3 |
526 |
#define TCL_CONTINUE 4 |
527 |
|
528 |
#define TCL_RESULT_SIZE 200 |
529 |
|
530 |
/* |
531 |
* Argument descriptors for math function callbacks in expressions: |
532 |
*/ |
533 |
|
534 |
typedef enum {TCL_INT, TCL_DOUBLE, TCL_EITHER} Tcl_ValueType; |
535 |
typedef struct Tcl_Value { |
536 |
Tcl_ValueType type; /* Indicates intValue or doubleValue is |
537 |
* valid, or both. */ |
538 |
long intValue; /* Integer value. */ |
539 |
double doubleValue; /* Double-precision floating value. */ |
540 |
} Tcl_Value; |
541 |
|
542 |
/* |
543 |
* Forward declaration of Tcl_Obj to prevent an error when the forward |
544 |
* reference to Tcl_Obj is encountered in the procedure types declared |
545 |
* below. |
546 |
*/ |
547 |
|
548 |
struct Tcl_Obj; |
549 |
|
550 |
/* |
551 |
* Procedure types defined by Tcl: |
552 |
*/ |
553 |
|
554 |
typedef int (Tcl_AppInitProc) _ANSI_ARGS_((Tcl_Interp *interp)); |
555 |
typedef int (Tcl_AsyncProc) _ANSI_ARGS_((ClientData clientData, |
556 |
Tcl_Interp *interp, int code)); |
557 |
typedef void (Tcl_ChannelProc) _ANSI_ARGS_((ClientData clientData, int mask)); |
558 |
typedef void (Tcl_CloseProc) _ANSI_ARGS_((ClientData data)); |
559 |
typedef void (Tcl_CmdDeleteProc) _ANSI_ARGS_((ClientData clientData)); |
560 |
typedef int (Tcl_CmdProc) _ANSI_ARGS_((ClientData clientData, |
561 |
Tcl_Interp *interp, int argc, char *argv[])); |
562 |
typedef void (Tcl_CmdTraceProc) _ANSI_ARGS_((ClientData clientData, |
563 |
Tcl_Interp *interp, int level, char *command, Tcl_CmdProc *proc, |
564 |
ClientData cmdClientData, int argc, char *argv[])); |
565 |
typedef void (Tcl_DupInternalRepProc) _ANSI_ARGS_((struct Tcl_Obj *srcPtr, |
566 |
struct Tcl_Obj *dupPtr)); |
567 |
typedef int (Tcl_EncodingConvertProc)_ANSI_ARGS_((ClientData clientData, |
568 |
CONST char *src, int srcLen, int flags, Tcl_EncodingState *statePtr, |
569 |
char *dst, int dstLen, int *srcReadPtr, int *dstWrotePtr, |
570 |
int *dstCharsPtr)); |
571 |
typedef void (Tcl_EncodingFreeProc)_ANSI_ARGS_((ClientData clientData)); |
572 |
typedef int (Tcl_EventProc) _ANSI_ARGS_((Tcl_Event *evPtr, int flags)); |
573 |
typedef void (Tcl_EventCheckProc) _ANSI_ARGS_((ClientData clientData, |
574 |
int flags)); |
575 |
typedef int (Tcl_EventDeleteProc) _ANSI_ARGS_((Tcl_Event *evPtr, |
576 |
ClientData clientData)); |
577 |
typedef void (Tcl_EventSetupProc) _ANSI_ARGS_((ClientData clientData, |
578 |
int flags)); |
579 |
typedef void (Tcl_ExitProc) _ANSI_ARGS_((ClientData clientData)); |
580 |
typedef void (Tcl_FileProc) _ANSI_ARGS_((ClientData clientData, int mask)); |
581 |
typedef void (Tcl_FileFreeProc) _ANSI_ARGS_((ClientData clientData)); |
582 |
typedef void (Tcl_FreeInternalRepProc) _ANSI_ARGS_((struct Tcl_Obj *objPtr)); |
583 |
typedef void (Tcl_FreeProc) _ANSI_ARGS_((char *blockPtr)); |
584 |
typedef void (Tcl_IdleProc) _ANSI_ARGS_((ClientData clientData)); |
585 |
typedef void (Tcl_InterpDeleteProc) _ANSI_ARGS_((ClientData clientData, |
586 |
Tcl_Interp *interp)); |
587 |
typedef int (Tcl_MathProc) _ANSI_ARGS_((ClientData clientData, |
588 |
Tcl_Interp *interp, Tcl_Value *args, Tcl_Value *resultPtr)); |
589 |
typedef void (Tcl_NamespaceDeleteProc) _ANSI_ARGS_((ClientData clientData)); |
590 |
typedef int (Tcl_ObjCmdProc) _ANSI_ARGS_((ClientData clientData, |
591 |
Tcl_Interp *interp, int objc, struct Tcl_Obj *CONST objv[])); |
592 |
typedef int (Tcl_PackageInitProc) _ANSI_ARGS_((Tcl_Interp *interp)); |
593 |
typedef void (Tcl_PanicProc) _ANSI_ARGS_(TCL_VARARGS(char *, format)); |
594 |
typedef void (Tcl_TcpAcceptProc) _ANSI_ARGS_((ClientData callbackData, |
595 |
Tcl_Channel chan, char *address, int port)); |
596 |
typedef void (Tcl_TimerProc) _ANSI_ARGS_((ClientData clientData)); |
597 |
typedef int (Tcl_SetFromAnyProc) _ANSI_ARGS_((Tcl_Interp *interp, |
598 |
struct Tcl_Obj *objPtr)); |
599 |
typedef void (Tcl_UpdateStringProc) _ANSI_ARGS_((struct Tcl_Obj *objPtr)); |
600 |
typedef char *(Tcl_VarTraceProc) _ANSI_ARGS_((ClientData clientData, |
601 |
Tcl_Interp *interp, char *part1, char *part2, int flags)); |
602 |
typedef void (Tcl_CreateFileHandlerProc) _ANSI_ARGS_((int fd, int mask, |
603 |
Tcl_FileProc *proc, ClientData clientData)); |
604 |
typedef void (Tcl_DeleteFileHandlerProc) _ANSI_ARGS_((int fd)); |
605 |
|
606 |
/* |
607 |
* The following structure represents a type of object, which is a |
608 |
* particular internal representation for an object plus a set of |
609 |
* procedures that provide standard operations on objects of that type. |
610 |
*/ |
611 |
|
612 |
typedef struct Tcl_ObjType { |
613 |
char *name; /* Name of the type, e.g. "int". */ |
614 |
Tcl_FreeInternalRepProc *freeIntRepProc; |
615 |
/* Called to free any storage for the type's |
616 |
* internal rep. NULL if the internal rep |
617 |
* does not need freeing. */ |
618 |
Tcl_DupInternalRepProc *dupIntRepProc; |
619 |
/* Called to create a new object as a copy |
620 |
* of an existing object. */ |
621 |
Tcl_UpdateStringProc *updateStringProc; |
622 |
/* Called to update the string rep from the |
623 |
* type's internal representation. */ |
624 |
Tcl_SetFromAnyProc *setFromAnyProc; |
625 |
/* Called to convert the object's internal |
626 |
* rep to this type. Frees the internal rep |
627 |
* of the old type. Returns TCL_ERROR on |
628 |
* failure. */ |
629 |
} Tcl_ObjType; |
630 |
|
631 |
/* |
632 |
* One of the following structures exists for each object in the Tcl |
633 |
* system. An object stores a value as either a string, some internal |
634 |
* representation, or both. |
635 |
*/ |
636 |
|
637 |
typedef struct Tcl_Obj { |
638 |
int refCount; /* When 0 the object will be freed. */ |
639 |
char *bytes; /* This points to the first byte of the |
640 |
* object's string representation. The array |
641 |
* must be followed by a null byte (i.e., at |
642 |
* offset length) but may also contain |
643 |
* embedded null characters. The array's |
644 |
* storage is allocated by ckalloc. NULL |
645 |
* means the string rep is invalid and must |
646 |
* be regenerated from the internal rep. |
647 |
* Clients should use Tcl_GetStringFromObj |
648 |
* or Tcl_GetString to get a pointer to the |
649 |
* byte array as a readonly value. */ |
650 |
int length; /* The number of bytes at *bytes, not |
651 |
* including the terminating null. */ |
652 |
Tcl_ObjType *typePtr; /* Denotes the object's type. Always |
653 |
* corresponds to the type of the object's |
654 |
* internal rep. NULL indicates the object |
655 |
* has no internal rep (has no type). */ |
656 |
union { /* The internal representation: */ |
657 |
long longValue; /* - an long integer value */ |
658 |
double doubleValue; /* - a double-precision floating value */ |
659 |
VOID *otherValuePtr; /* - another, type-specific value */ |
660 |
struct { /* - internal rep as two pointers */ |
661 |
VOID *ptr1; |
662 |
VOID *ptr2; |
663 |
} twoPtrValue; |
664 |
} internalRep; |
665 |
} Tcl_Obj; |
666 |
|
667 |
/* |
668 |
* Macros to increment and decrement a Tcl_Obj's reference count, and to |
669 |
* test whether an object is shared (i.e. has reference count > 1). |
670 |
* Note: clients should use Tcl_DecrRefCount() when they are finished using |
671 |
* an object, and should never call TclFreeObj() directly. TclFreeObj() is |
672 |
* only defined and made public in tcl.h to support Tcl_DecrRefCount's macro |
673 |
* definition. Note also that Tcl_DecrRefCount() refers to the parameter |
674 |
* "obj" twice. This means that you should avoid calling it with an |
675 |
* expression that is expensive to compute or has side effects. |
676 |
*/ |
677 |
|
678 |
void Tcl_IncrRefCount _ANSI_ARGS_((Tcl_Obj *objPtr)); |
679 |
void Tcl_DecrRefCount _ANSI_ARGS_((Tcl_Obj *objPtr)); |
680 |
int Tcl_IsShared _ANSI_ARGS_((Tcl_Obj *objPtr)); |
681 |
|
682 |
#ifdef TCL_MEM_DEBUG |
683 |
# define Tcl_IncrRefCount(objPtr) \ |
684 |
Tcl_DbIncrRefCount(objPtr, __FILE__, __LINE__) |
685 |
# define Tcl_DecrRefCount(objPtr) \ |
686 |
Tcl_DbDecrRefCount(objPtr, __FILE__, __LINE__) |
687 |
# define Tcl_IsShared(objPtr) \ |
688 |
Tcl_DbIsShared(objPtr, __FILE__, __LINE__) |
689 |
#else |
690 |
# define Tcl_IncrRefCount(objPtr) \ |
691 |
++(objPtr)->refCount |
692 |
# define Tcl_DecrRefCount(objPtr) \ |
693 |
if (--(objPtr)->refCount <= 0) TclFreeObj(objPtr) |
694 |
# define Tcl_IsShared(objPtr) \ |
695 |
((objPtr)->refCount > 1) |
696 |
#endif |
697 |
|
698 |
/* |
699 |
* Macros and definitions that help to debug the use of Tcl objects. |
700 |
* When TCL_MEM_DEBUG is defined, the Tcl_New declarations are |
701 |
* overridden to call debugging versions of the object creation procedures. |
702 |
*/ |
703 |
|
704 |
#ifdef TCL_MEM_DEBUG |
705 |
# define Tcl_NewBooleanObj(val) \ |
706 |
Tcl_DbNewBooleanObj(val, __FILE__, __LINE__) |
707 |
# define Tcl_NewByteArrayObj(bytes, len) \ |
708 |
Tcl_DbNewByteArrayObj(bytes, len, __FILE__, __LINE__) |
709 |
# define Tcl_NewDoubleObj(val) \ |
710 |
Tcl_DbNewDoubleObj(val, __FILE__, __LINE__) |
711 |
# define Tcl_NewIntObj(val) \ |
712 |
Tcl_DbNewLongObj(val, __FILE__, __LINE__) |
713 |
# define Tcl_NewListObj(objc, objv) \ |
714 |
Tcl_DbNewListObj(objc, objv, __FILE__, __LINE__) |
715 |
# define Tcl_NewLongObj(val) \ |
716 |
Tcl_DbNewLongObj(val, __FILE__, __LINE__) |
717 |
# define Tcl_NewObj() \ |
718 |
Tcl_DbNewObj(__FILE__, __LINE__) |
719 |
# define Tcl_NewStringObj(bytes, len) \ |
720 |
Tcl_DbNewStringObj(bytes, len, __FILE__, __LINE__) |
721 |
#endif /* TCL_MEM_DEBUG */ |
722 |
|
723 |
/* |
724 |
* The following structure contains the state needed by |
725 |
* Tcl_SaveResult. No-one outside of Tcl should access any of these |
726 |
* fields. This structure is typically allocated on the stack. |
727 |
*/ |
728 |
|
729 |
typedef struct Tcl_SavedResult { |
730 |
char *result; |
731 |
Tcl_FreeProc *freeProc; |
732 |
Tcl_Obj *objResultPtr; |
733 |
char *appendResult; |
734 |
int appendAvl; |
735 |
int appendUsed; |
736 |
char resultSpace[TCL_RESULT_SIZE+1]; |
737 |
} Tcl_SavedResult; |
738 |
|
739 |
|
740 |
/* |
741 |
* The following definitions support Tcl's namespace facility. |
742 |
* Note: the first five fields must match exactly the fields in a |
743 |
* Namespace structure (see tclInt.h). |
744 |
*/ |
745 |
|
746 |
typedef struct Tcl_Namespace { |
747 |
char *name; /* The namespace's name within its parent |
748 |
* namespace. This contains no ::'s. The |
749 |
* name of the global namespace is "" |
750 |
* although "::" is an synonym. */ |
751 |
char *fullName; /* The namespace's fully qualified name. |
752 |
* This starts with ::. */ |
753 |
ClientData clientData; /* Arbitrary value associated with this |
754 |
* namespace. */ |
755 |
Tcl_NamespaceDeleteProc* deleteProc; |
756 |
/* Procedure invoked when deleting the |
757 |
* namespace to, e.g., free clientData. */ |
758 |
struct Tcl_Namespace* parentPtr; |
759 |
/* Points to the namespace that contains |
760 |
* this one. NULL if this is the global |
761 |
* namespace. */ |
762 |
} Tcl_Namespace; |
763 |
|
764 |
/* |
765 |
* The following structure represents a call frame, or activation record. |
766 |
* A call frame defines a naming context for a procedure call: its local |
767 |
* scope (for local variables) and its namespace scope (used for non-local |
768 |
* variables; often the global :: namespace). A call frame can also define |
769 |
* the naming context for a namespace eval or namespace inscope command: |
770 |
* the namespace in which the command's code should execute. The |
771 |
* Tcl_CallFrame structures exist only while procedures or namespace |
772 |
* eval/inscope's are being executed, and provide a Tcl call stack. |
773 |
* |
774 |
* A call frame is initialized and pushed using Tcl_PushCallFrame and |
775 |
* popped using Tcl_PopCallFrame. Storage for a Tcl_CallFrame must be |
776 |
* provided by the Tcl_PushCallFrame caller, and callers typically allocate |
777 |
* them on the C call stack for efficiency. For this reason, Tcl_CallFrame |
778 |
* is defined as a structure and not as an opaque token. However, most |
779 |
* Tcl_CallFrame fields are hidden since applications should not access |
780 |
* them directly; others are declared as "dummyX". |
781 |
* |
782 |
* WARNING!! The structure definition must be kept consistent with the |
783 |
* CallFrame structure in tclInt.h. If you change one, change the other. |
784 |
*/ |
785 |
|
786 |
typedef struct Tcl_CallFrame { |
787 |
Tcl_Namespace *nsPtr; |
788 |
int dummy1; |
789 |
int dummy2; |
790 |
char *dummy3; |
791 |
char *dummy4; |
792 |
char *dummy5; |
793 |
int dummy6; |
794 |
char *dummy7; |
795 |
char *dummy8; |
796 |
int dummy9; |
797 |
char* dummy10; |
798 |
} Tcl_CallFrame; |
799 |
|
800 |
/* |
801 |
* Information about commands that is returned by Tcl_GetCommandInfo and |
802 |
* passed to Tcl_SetCommandInfo. objProc is an objc/objv object-based |
803 |
* command procedure while proc is a traditional Tcl argc/argv |
804 |
* string-based procedure. Tcl_CreateObjCommand and Tcl_CreateCommand |
805 |
* ensure that both objProc and proc are non-NULL and can be called to |
806 |
* execute the command. However, it may be faster to call one instead of |
807 |
* the other. The member isNativeObjectProc is set to 1 if an |
808 |
* object-based procedure was registered by Tcl_CreateObjCommand, and to |
809 |
* 0 if a string-based procedure was registered by Tcl_CreateCommand. |
810 |
* The other procedure is typically set to a compatibility wrapper that |
811 |
* does string-to-object or object-to-string argument conversions then |
812 |
* calls the other procedure. |
813 |
*/ |
814 |
|
815 |
typedef struct Tcl_CmdInfo { |
816 |
int isNativeObjectProc; /* 1 if objProc was registered by a call to |
817 |
* Tcl_CreateObjCommand; 0 otherwise. |
818 |
* Tcl_SetCmdInfo does not modify this |
819 |
* field. */ |
820 |
Tcl_ObjCmdProc *objProc; /* Command's object-based procedure. */ |
821 |
ClientData objClientData; /* ClientData for object proc. */ |
822 |
Tcl_CmdProc *proc; /* Command's string-based procedure. */ |
823 |
ClientData clientData; /* ClientData for string proc. */ |
824 |
Tcl_CmdDeleteProc *deleteProc; |
825 |
/* Procedure to call when command is |
826 |
* deleted. */ |
827 |
ClientData deleteData; /* Value to pass to deleteProc (usually |
828 |
* the same as clientData). */ |
829 |
Tcl_Namespace *namespacePtr; /* Points to the namespace that contains |
830 |
* this command. Note that Tcl_SetCmdInfo |
831 |
* will not change a command's namespace; |
832 |
* use Tcl_RenameCommand to do that. */ |
833 |
|
834 |
} Tcl_CmdInfo; |
835 |
|
836 |
/* |
837 |
* The structure defined below is used to hold dynamic strings. The only |
838 |
* field that clients should use is the string field, and they should |
839 |
* never modify it. |
840 |
*/ |
841 |
|
842 |
#define TCL_DSTRING_STATIC_SIZE 200 |
843 |
typedef struct Tcl_DString { |
844 |
char *string; /* Points to beginning of string: either |
845 |
* staticSpace below or a malloced array. */ |
846 |
int length; /* Number of non-NULL characters in the |
847 |
* string. */ |
848 |
int spaceAvl; /* Total number of bytes available for the |
849 |
* string and its terminating NULL char. */ |
850 |
char staticSpace[TCL_DSTRING_STATIC_SIZE]; |
851 |
/* Space to use in common case where string |
852 |
* is small. */ |
853 |
} Tcl_DString; |
854 |
|
855 |
#define Tcl_DStringLength(dsPtr) ((dsPtr)->length) |
856 |
#define Tcl_DStringValue(dsPtr) ((dsPtr)->string) |
857 |
#define Tcl_DStringTrunc Tcl_DStringSetLength |
858 |
|
859 |
/* |
860 |
* Definitions for the maximum number of digits of precision that may |
861 |
* be specified in the "tcl_precision" variable, and the number of |
862 |
* bytes of buffer space required by Tcl_PrintDouble. |
863 |
*/ |
864 |
|
865 |
#define TCL_MAX_PREC 17 |
866 |
#define TCL_DOUBLE_SPACE (TCL_MAX_PREC+10) |
867 |
|
868 |
/* |
869 |
* Definition for a number of bytes of buffer space sufficient to hold the |
870 |
* string representation of an integer in base 10 (assuming the existence |
871 |
* of 64-bit integers). |
872 |
*/ |
873 |
|
874 |
#define TCL_INTEGER_SPACE 24 |
875 |
|
876 |
/* |
877 |
* Flag that may be passed to Tcl_ConvertElement to force it not to |
878 |
* output braces (careful! if you change this flag be sure to change |
879 |
* the definitions at the front of tclUtil.c). |
880 |
*/ |
881 |
|
882 |
#define TCL_DONT_USE_BRACES 1 |
883 |
|
884 |
/* |
885 |
* Flag that may be passed to Tcl_GetIndexFromObj to force it to disallow |
886 |
* abbreviated strings. |
887 |
*/ |
888 |
|
889 |
#define TCL_EXACT 1 |
890 |
|
891 |
/* |
892 |
* Flag values passed to Tcl_RecordAndEval and/or Tcl_EvalObj. |
893 |
* WARNING: these bit choices must not conflict with the bit choices |
894 |
* for evalFlag bits in tclInt.h!! |
895 |
*/ |
896 |
|
897 |
#define TCL_NO_EVAL 0x10000 |
898 |
#define TCL_EVAL_GLOBAL 0x20000 |
899 |
#define TCL_EVAL_DIRECT 0x40000 |
900 |
|
901 |
/* |
902 |
* Special freeProc values that may be passed to Tcl_SetResult (see |
903 |
* the man page for details): |
904 |
*/ |
905 |
|
906 |
#define TCL_VOLATILE ((Tcl_FreeProc *) 1) |
907 |
#define TCL_STATIC ((Tcl_FreeProc *) 0) |
908 |
#define TCL_DYNAMIC ((Tcl_FreeProc *) 3) |
909 |
|
910 |
/* |
911 |
* Flag values passed to variable-related procedures. |
912 |
*/ |
913 |
|
914 |
#define TCL_GLOBAL_ONLY 1 |
915 |
#define TCL_NAMESPACE_ONLY 2 |
916 |
#define TCL_APPEND_VALUE 4 |
917 |
#define TCL_LIST_ELEMENT 8 |
918 |
#define TCL_TRACE_READS 0x10 |
919 |
#define TCL_TRACE_WRITES 0x20 |
920 |
#define TCL_TRACE_UNSETS 0x40 |
921 |
#define TCL_TRACE_DESTROYED 0x80 |
922 |
#define TCL_INTERP_DESTROYED 0x100 |
923 |
#define TCL_LEAVE_ERR_MSG 0x200 |
924 |
#define TCL_TRACE_ARRAY 0x800 |
925 |
|
926 |
/* |
927 |
* The TCL_PARSE_PART1 flag is deprecated and has no effect. |
928 |
* The part1 is now always parsed whenever the part2 is NULL. |
929 |
* (This is to avoid a common error when converting code to |
930 |
* use the new object based APIs and forgetting to give the |
931 |
* flag) |
932 |
*/ |
933 |
#ifndef TCL_NO_DEPRECATED |
934 |
#define TCL_PARSE_PART1 0x400 |
935 |
#endif |
936 |
|
937 |
|
938 |
/* |
939 |
* Types for linked variables: |
940 |
*/ |
941 |
|
942 |
#define TCL_LINK_INT 1 |
943 |
#define TCL_LINK_DOUBLE 2 |
944 |
#define TCL_LINK_BOOLEAN 3 |
945 |
#define TCL_LINK_STRING 4 |
946 |
#define TCL_LINK_READ_ONLY 0x80 |
947 |
|
948 |
/* |
949 |
* Forward declaration of Tcl_HashTable. Needed by some C++ compilers |
950 |
* to prevent errors when the forward reference to Tcl_HashTable is |
951 |
* encountered in the Tcl_HashEntry structure. |
952 |
*/ |
953 |
|
954 |
#ifdef __cplusplus |
955 |
struct Tcl_HashTable; |
956 |
#endif |
957 |
|
958 |
/* |
959 |
* Structure definition for an entry in a hash table. No-one outside |
960 |
* Tcl should access any of these fields directly; use the macros |
961 |
* defined below. |
962 |
*/ |
963 |
|
964 |
typedef struct Tcl_HashEntry { |
965 |
struct Tcl_HashEntry *nextPtr; /* Pointer to next entry in this |
966 |
* hash bucket, or NULL for end of |
967 |
* chain. */ |
968 |
struct Tcl_HashTable *tablePtr; /* Pointer to table containing entry. */ |
969 |
struct Tcl_HashEntry **bucketPtr; /* Pointer to bucket that points to |
970 |
* first entry in this entry's chain: |
971 |
* used for deleting the entry. */ |
972 |
ClientData clientData; /* Application stores something here |
973 |
* with Tcl_SetHashValue. */ |
974 |
union { /* Key has one of these forms: */ |
975 |
char *oneWordValue; /* One-word value for key. */ |
976 |
int words[1]; /* Multiple integer words for key. |
977 |
* The actual size will be as large |
978 |
* as necessary for this table's |
979 |
* keys. */ |
980 |
char string[4]; /* String for key. The actual size |
981 |
* will be as large as needed to hold |
982 |
* the key. */ |
983 |
} key; /* MUST BE LAST FIELD IN RECORD!! */ |
984 |
} Tcl_HashEntry; |
985 |
|
986 |
/* |
987 |
* Structure definition for a hash table. Must be in tcl.h so clients |
988 |
* can allocate space for these structures, but clients should never |
989 |
* access any fields in this structure. |
990 |
*/ |
991 |
|
992 |
#define TCL_SMALL_HASH_TABLE 4 |
993 |
typedef struct Tcl_HashTable { |
994 |
Tcl_HashEntry **buckets; /* Pointer to bucket array. Each |
995 |
* element points to first entry in |
996 |
* bucket's hash chain, or NULL. */ |
997 |
Tcl_HashEntry *staticBuckets[TCL_SMALL_HASH_TABLE]; |
998 |
/* Bucket array used for small tables |
999 |
* (to avoid mallocs and frees). */ |
1000 |
int numBuckets; /* Total number of buckets allocated |
1001 |
* at **bucketPtr. */ |
1002 |
int numEntries; /* Total number of entries present |
1003 |
* in table. */ |
1004 |
int rebuildSize; /* Enlarge table when numEntries gets |
1005 |
* to be this large. */ |
1006 |
int downShift; /* Shift count used in hashing |
1007 |
* function. Designed to use high- |
1008 |
* order bits of randomized keys. */ |
1009 |
int mask; /* Mask value used in hashing |
1010 |
* function. */ |
1011 |
int keyType; /* Type of keys used in this table. |
1012 |
* It's either TCL_STRING_KEYS, |
1013 |
* TCL_ONE_WORD_KEYS, or an integer |
1014 |
* giving the number of ints that |
1015 |
* is the size of the key. |
1016 |
*/ |
1017 |
Tcl_HashEntry *(*findProc) _ANSI_ARGS_((struct Tcl_HashTable *tablePtr, |
1018 |
CONST char *key)); |
1019 |
Tcl_HashEntry *(*createProc) _ANSI_ARGS_((struct Tcl_HashTable *tablePtr, |
1020 |
CONST char *key, int *newPtr)); |
1021 |
} Tcl_HashTable; |
1022 |
|
1023 |
/* |
1024 |
* Structure definition for information used to keep track of searches |
1025 |
* through hash tables: |
1026 |
*/ |
1027 |
|
1028 |
typedef struct Tcl_HashSearch { |
1029 |
Tcl_HashTable *tablePtr; /* Table being searched. */ |
1030 |
int nextIndex; /* Index of next bucket to be |
1031 |
* enumerated after present one. */ |
1032 |
Tcl_HashEntry *nextEntryPtr; /* Next entry to be enumerated in the |
1033 |
* the current bucket. */ |
1034 |
} Tcl_HashSearch; |
1035 |
|
1036 |
/* |
1037 |
* Acceptable key types for hash tables: |
1038 |
*/ |
1039 |
|
1040 |
#define TCL_STRING_KEYS 0 |
1041 |
#define TCL_ONE_WORD_KEYS 1 |
1042 |
|
1043 |
/* |
1044 |
* Macros for clients to use to access fields of hash entries: |
1045 |
*/ |
1046 |
|
1047 |
#define Tcl_GetHashValue(h) ((h)->clientData) |
1048 |
#define Tcl_SetHashValue(h, value) ((h)->clientData = (ClientData) (value)) |
1049 |
#define Tcl_GetHashKey(tablePtr, h) \ |
1050 |
((char *) (((tablePtr)->keyType == TCL_ONE_WORD_KEYS) ? (h)->key.oneWordValue \ |
1051 |
: (h)->key.string)) |
1052 |
|
1053 |
/* |
1054 |
* Macros to use for clients to use to invoke find and create procedures |
1055 |
* for hash tables: |
1056 |
*/ |
1057 |
|
1058 |
#define Tcl_FindHashEntry(tablePtr, key) \ |
1059 |
(*((tablePtr)->findProc))(tablePtr, key) |
1060 |
#define Tcl_CreateHashEntry(tablePtr, key, newPtr) \ |
1061 |
(*((tablePtr)->createProc))(tablePtr, key, newPtr) |
1062 |
|
1063 |
/* |
1064 |
* Flag values to pass to Tcl_DoOneEvent to disable searches |
1065 |
* for some kinds of events: |
1066 |
*/ |
1067 |
|
1068 |
#define TCL_DONT_WAIT (1<<1) |
1069 |
#define TCL_WINDOW_EVENTS (1<<2) |
1070 |
#define TCL_FILE_EVENTS (1<<3) |
1071 |
#define TCL_TIMER_EVENTS (1<<4) |
1072 |
#define TCL_IDLE_EVENTS (1<<5) /* WAS 0x10 ???? */ |
1073 |
#define TCL_ALL_EVENTS (~TCL_DONT_WAIT) |
1074 |
|
1075 |
/* |
1076 |
* The following structure defines a generic event for the Tcl event |
1077 |
* system. These are the things that are queued in calls to Tcl_QueueEvent |
1078 |
* and serviced later by Tcl_DoOneEvent. There can be many different |
1079 |
* kinds of events with different fields, corresponding to window events, |
1080 |
* timer events, etc. The structure for a particular event consists of |
1081 |
* a Tcl_Event header followed by additional information specific to that |
1082 |
* event. |
1083 |
*/ |
1084 |
|
1085 |
struct Tcl_Event { |
1086 |
Tcl_EventProc *proc; /* Procedure to call to service this event. */ |
1087 |
struct Tcl_Event *nextPtr; /* Next in list of pending events, or NULL. */ |
1088 |
}; |
1089 |
|
1090 |
/* |
1091 |
* Positions to pass to Tcl_QueueEvent: |
1092 |
*/ |
1093 |
|
1094 |
typedef enum { |
1095 |
TCL_QUEUE_TAIL, TCL_QUEUE_HEAD, TCL_QUEUE_MARK |
1096 |
} Tcl_QueuePosition; |
1097 |
|
1098 |
/* |
1099 |
* Values to pass to Tcl_SetServiceMode to specify the behavior of notifier |
1100 |
* event routines. |
1101 |
*/ |
1102 |
|
1103 |
#define TCL_SERVICE_NONE 0 |
1104 |
#define TCL_SERVICE_ALL 1 |
1105 |
|
1106 |
/* |
1107 |
* The following structure keeps is used to hold a time value, either as |
1108 |
* an absolute time (the number of seconds from the epoch) or as an |
1109 |
* elapsed time. On Unix systems the epoch is Midnight Jan 1, 1970 GMT. |
1110 |
* On Macintosh systems the epoch is Midnight Jan 1, 1904 GMT. |
1111 |
*/ |
1112 |
|
1113 |
typedef struct Tcl_Time { |
1114 |
long sec; /* Seconds. */ |
1115 |
long usec; /* Microseconds. */ |
1116 |
} Tcl_Time; |
1117 |
|
1118 |
typedef void (Tcl_SetTimerProc) _ANSI_ARGS_((Tcl_Time *timePtr)); |
1119 |
typedef int (Tcl_WaitForEventProc) _ANSI_ARGS_((Tcl_Time *timePtr)); |
1120 |
|
1121 |
/* |
1122 |
* Bits to pass to Tcl_CreateFileHandler and Tcl_CreateChannelHandler |
1123 |
* to indicate what sorts of events are of interest: |
1124 |
*/ |
1125 |
|
1126 |
#define TCL_READABLE (1<<1) |
1127 |
#define TCL_WRITABLE (1<<2) |
1128 |
#define TCL_EXCEPTION (1<<3) |
1129 |
|
1130 |
/* |
1131 |
* Flag values to pass to Tcl_OpenCommandChannel to indicate the |
1132 |
* disposition of the stdio handles. TCL_STDIN, TCL_STDOUT, TCL_STDERR, |
1133 |
* are also used in Tcl_GetStdChannel. |
1134 |
*/ |
1135 |
|
1136 |
#define TCL_STDIN (1<<1) |
1137 |
#define TCL_STDOUT (1<<2) |
1138 |
#define TCL_STDERR (1<<3) |
1139 |
#define TCL_ENFORCE_MODE (1<<4) |
1140 |
|
1141 |
/* |
1142 |
* Bits passed to Tcl_DriverClose2Proc to indicate which side of a channel |
1143 |
* should be closed. |
1144 |
*/ |
1145 |
|
1146 |
#define TCL_CLOSE_READ (1<<1) |
1147 |
#define TCL_CLOSE_WRITE (1<<2) |
1148 |
|
1149 |
/* |
1150 |
* Value to use as the closeProc for a channel that supports the |
1151 |
* close2Proc interface. |
1152 |
*/ |
1153 |
|
1154 |
#define TCL_CLOSE2PROC ((Tcl_DriverCloseProc *)1) |
1155 |
|
1156 |
/* |
1157 |
* Typedefs for the various operations in a channel type: |
1158 |
*/ |
1159 |
|
1160 |
typedef int (Tcl_DriverBlockModeProc) _ANSI_ARGS_(( |
1161 |
ClientData instanceData, int mode)); |
1162 |
typedef int (Tcl_DriverCloseProc) _ANSI_ARGS_((ClientData instanceData, |
1163 |
Tcl_Interp *interp)); |
1164 |
typedef int (Tcl_DriverClose2Proc) _ANSI_ARGS_((ClientData instanceData, |
1165 |
Tcl_Interp *interp, int flags)); |
1166 |
typedef int (Tcl_DriverInputProc) _ANSI_ARGS_((ClientData instanceData, |
1167 |
char *buf, int toRead, int *errorCodePtr)); |
1168 |
typedef int (Tcl_DriverOutputProc) _ANSI_ARGS_((ClientData instanceData, |
1169 |
char *buf, int toWrite, int *errorCodePtr)); |
1170 |
typedef int (Tcl_DriverSeekProc) _ANSI_ARGS_((ClientData instanceData, |
1171 |
long offset, int mode, int *errorCodePtr)); |
1172 |
typedef int (Tcl_DriverSetOptionProc) _ANSI_ARGS_(( |
1173 |
ClientData instanceData, Tcl_Interp *interp, |
1174 |
char *optionName, char *value)); |
1175 |
typedef int (Tcl_DriverGetOptionProc) _ANSI_ARGS_(( |
1176 |
ClientData instanceData, Tcl_Interp *interp, |
1177 |
char *optionName, Tcl_DString *dsPtr)); |
1178 |
typedef void (Tcl_DriverWatchProc) _ANSI_ARGS_(( |
1179 |
ClientData instanceData, int mask)); |
1180 |
typedef int (Tcl_DriverGetHandleProc) _ANSI_ARGS_(( |
1181 |
ClientData instanceData, int direction, |
1182 |
ClientData *handlePtr)); |
1183 |
|
1184 |
/* |
1185 |
* The following declarations either map ckalloc and ckfree to |
1186 |
* malloc and free, or they map them to procedures with all sorts |
1187 |
* of debugging hooks defined in tclCkalloc.c. |
1188 |
*/ |
1189 |
|
1190 |
#ifdef TCL_MEM_DEBUG |
1191 |
|
1192 |
# define ckalloc(x) Tcl_DbCkalloc(x, __FILE__, __LINE__) |
1193 |
# define ckfree(x) Tcl_DbCkfree(x, __FILE__, __LINE__) |
1194 |
# define ckrealloc(x,y) Tcl_DbCkrealloc((x), (y),__FILE__, __LINE__) |
1195 |
|
1196 |
#else /* !TCL_MEM_DEBUG */ |
1197 |
|
1198 |
/* |
1199 |
* If we are not using the debugging allocator, we should call the |
1200 |
* Tcl_Alloc, et al. routines in order to guarantee that every module |
1201 |
* is using the same memory allocator both inside and outside of the |
1202 |
* Tcl library. |
1203 |
*/ |
1204 |
|
1205 |
# define ckalloc(x) Tcl_Alloc(x) |
1206 |
# define ckfree(x) Tcl_Free(x) |
1207 |
# define ckrealloc(x,y) Tcl_Realloc(x,y) |
1208 |
# define Tcl_InitMemory(x) |
1209 |
# define Tcl_DumpActiveMemory(x) |
1210 |
# define Tcl_ValidateAllMemory(x,y) |
1211 |
|
1212 |
#endif /* !TCL_MEM_DEBUG */ |
1213 |
|
1214 |
/* |
1215 |
* Enum for different end of line translation and recognition modes. |
1216 |
*/ |
1217 |
|
1218 |
typedef enum Tcl_EolTranslation { |
1219 |
TCL_TRANSLATE_AUTO, /* Eol == \r, \n and \r\n. */ |
1220 |
TCL_TRANSLATE_CR, /* Eol == \r. */ |
1221 |
TCL_TRANSLATE_LF, /* Eol == \n. */ |
1222 |
TCL_TRANSLATE_CRLF /* Eol == \r\n. */ |
1223 |
} Tcl_EolTranslation; |
1224 |
|
1225 |
/* |
1226 |
* struct Tcl_ChannelType: |
1227 |
* |
1228 |
* One such structure exists for each type (kind) of channel. |
1229 |
* It collects together in one place all the functions that are |
1230 |
* part of the specific channel type. |
1231 |
*/ |
1232 |
|
1233 |
typedef struct Tcl_ChannelType { |
1234 |
char *typeName; /* The name of the channel type in Tcl |
1235 |
* commands. This storage is owned by |
1236 |
* channel type. */ |
1237 |
Tcl_DriverBlockModeProc *blockModeProc; |
1238 |
/* Set blocking mode for the |
1239 |
* raw channel. May be NULL. */ |
1240 |
Tcl_DriverCloseProc *closeProc; /* Procedure to call to close the |
1241 |
* channel, or TCL_CLOSE2PROC if the |
1242 |
* close2Proc should be used |
1243 |
* instead. */ |
1244 |
Tcl_DriverInputProc *inputProc; /* Procedure to call for input |
1245 |
* on channel. */ |
1246 |
Tcl_DriverOutputProc *outputProc; /* Procedure to call for output |
1247 |
* on channel. */ |
1248 |
Tcl_DriverSeekProc *seekProc; /* Procedure to call to seek |
1249 |
* on the channel. May be NULL. */ |
1250 |
Tcl_DriverSetOptionProc *setOptionProc; |
1251 |
/* Set an option on a channel. */ |
1252 |
Tcl_DriverGetOptionProc *getOptionProc; |
1253 |
/* Get an option from a channel. */ |
1254 |
Tcl_DriverWatchProc *watchProc; /* Set up the notifier to watch |
1255 |
* for events on this channel. */ |
1256 |
Tcl_DriverGetHandleProc *getHandleProc; |
1257 |
/* Get an OS handle from the channel |
1258 |
* or NULL if not supported. */ |
1259 |
Tcl_DriverClose2Proc *close2Proc; /* Procedure to call to close the |
1260 |
* channel if the device supports |
1261 |
* closing the read & write sides |
1262 |
* independently. */ |
1263 |
} Tcl_ChannelType; |
1264 |
|
1265 |
/* |
1266 |
* The following flags determine whether the blockModeProc above should |
1267 |
* set the channel into blocking or nonblocking mode. They are passed |
1268 |
* as arguments to the blockModeProc procedure in the above structure. |
1269 |
*/ |
1270 |
|
1271 |
#define TCL_MODE_BLOCKING 0 /* Put channel into blocking mode. */ |
1272 |
#define TCL_MODE_NONBLOCKING 1 /* Put channel into nonblocking |
1273 |
* mode. */ |
1274 |
|
1275 |
/* |
1276 |
* Enum for different types of file paths. |
1277 |
*/ |
1278 |
|
1279 |
typedef enum Tcl_PathType { |
1280 |
TCL_PATH_ABSOLUTE, |
1281 |
TCL_PATH_RELATIVE, |
1282 |
TCL_PATH_VOLUME_RELATIVE |
1283 |
} Tcl_PathType; |
1284 |
|
1285 |
/* |
1286 |
* The following structure represents the Notifier functions that |
1287 |
* you can override with the Tcl_SetNotifier call. |
1288 |
*/ |
1289 |
|
1290 |
typedef struct Tcl_NotifierProcs { |
1291 |
Tcl_SetTimerProc *setTimerProc; |
1292 |
Tcl_WaitForEventProc *waitForEventProc; |
1293 |
Tcl_CreateFileHandlerProc *createFileHandlerProc; |
1294 |
Tcl_DeleteFileHandlerProc *deleteFileHandlerProc; |
1295 |
} Tcl_NotifierProcs; |
1296 |
|
1297 |
/* |
1298 |
* The following structure represents a user-defined encoding. It collects |
1299 |
* together all the functions that are used by the specific encoding. |
1300 |
*/ |
1301 |
|
1302 |
typedef struct Tcl_EncodingType { |
1303 |
CONST char *encodingName; /* The name of the encoding, e.g. "euc-jp". |
1304 |
* This name is the unique key for this |
1305 |
* encoding type. */ |
1306 |
Tcl_EncodingConvertProc *toUtfProc; |
1307 |
/* Procedure to convert from external |
1308 |
* encoding into UTF-8. */ |
1309 |
Tcl_EncodingConvertProc *fromUtfProc; |
1310 |
/* Procedure to convert from UTF-8 into |
1311 |
* external encoding. */ |
1312 |
Tcl_EncodingFreeProc *freeProc; |
1313 |
/* If non-NULL, procedure to call when this |
1314 |
* encoding is deleted. */ |
1315 |
ClientData clientData; /* Arbitrary value associated with encoding |
1316 |
* type. Passed to conversion procedures. */ |
1317 |
int nullSize; /* Number of zero bytes that signify |
1318 |
* end-of-string in this encoding. This |
1319 |
* number is used to determine the source |
1320 |
* string length when the srcLen argument is |
1321 |
* negative. Must be 1 or 2. */ |
1322 |
} Tcl_EncodingType; |
1323 |
|
1324 |
/* |
1325 |
* The following definitions are used as values for the conversion control |
1326 |
* flags argument when converting text from one character set to another: |
1327 |
* |
1328 |
* TCL_ENCODING_START: Signifies that the source buffer is the first |
1329 |
* block in a (potentially multi-block) input |
1330 |
* stream. Tells the conversion procedure to |
1331 |
* reset to an initial state and perform any |
1332 |
* initialization that needs to occur before the |
1333 |
* first byte is converted. If the source |
1334 |
* buffer contains the entire input stream to be |
1335 |
* converted, this flag should be set. |
1336 |
* |
1337 |
* TCL_ENCODING_END: Signifies that the source buffer is the last |
1338 |
* block in a (potentially multi-block) input |
1339 |
* stream. Tells the conversion routine to |
1340 |
* perform any finalization that needs to occur |
1341 |
* after the last byte is converted and then to |
1342 |
* reset to an initial state. If the source |
1343 |
* buffer contains the entire input stream to be |
1344 |
* converted, this flag should be set. |
1345 |
* |
1346 |
* TCL_ENCODING_STOPONERROR: If set, then the converter will return |
1347 |
* immediately upon encountering an invalid |
1348 |
* byte sequence or a source character that has |
1349 |
* no mapping in the target encoding. If clear, |
1350 |
* then the converter will skip the problem, |
1351 |
* substituting one or more "close" characters |
1352 |
* in the destination buffer and then continue |
1353 |
* to sonvert the source. |
1354 |
*/ |
1355 |
|
1356 |
#define TCL_ENCODING_START 0x01 |
1357 |
#define TCL_ENCODING_END 0x02 |
1358 |
#define TCL_ENCODING_STOPONERROR 0x04 |
1359 |
|
1360 |
/* |
1361 |
*---------------------------------------------------------------- |
1362 |
* The following data structures and declarations are for the new |
1363 |
* Tcl parser. This stuff should all move to tcl.h eventually. |
1364 |
*---------------------------------------------------------------- |
1365 |
*/ |
1366 |
|
1367 |
/* |
1368 |
* For each word of a command, and for each piece of a word such as a |
1369 |
* variable reference, one of the following structures is created to |
1370 |
* describe the token. |
1371 |
*/ |
1372 |
|
1373 |
typedef struct Tcl_Token { |
1374 |
int type; /* Type of token, such as TCL_TOKEN_WORD; |
1375 |
* see below for valid types. */ |
1376 |
char *start; /* First character in token. */ |
1377 |
int size; /* Number of bytes in token. */ |
1378 |
int numComponents; /* If this token is composed of other |
1379 |
* tokens, this field tells how many of |
1380 |
* them there are (including components of |
1381 |
* components, etc.). The component tokens |
1382 |
* immediately follow this one. */ |
1383 |
} Tcl_Token; |
1384 |
|
1385 |
/* |
1386 |
* Type values defined for Tcl_Token structures. These values are |
1387 |
* defined as mask bits so that it's easy to check for collections of |
1388 |
* types. |
1389 |
* |
1390 |
* TCL_TOKEN_WORD - The token describes one word of a command, |
1391 |
* from the first non-blank character of |
1392 |
* the word (which may be " or {) up to but |
1393 |
* not including the space, semicolon, or |
1394 |
* bracket that terminates the word. |
1395 |
* NumComponents counts the total number of |
1396 |
* sub-tokens that make up the word. This |
1397 |
* includes, for example, sub-tokens of |
1398 |
* TCL_TOKEN_VARIABLE tokens. |
1399 |
* TCL_TOKEN_SIMPLE_WORD - This token is just like TCL_TOKEN_WORD |
1400 |
* except that the word is guaranteed to |
1401 |
* consist of a single TCL_TOKEN_TEXT |
1402 |
* sub-token. |
1403 |
* TCL_TOKEN_TEXT - The token describes a range of literal |
1404 |
* text that is part of a word. |
1405 |
* NumComponents is always 0. |
1406 |
* TCL_TOKEN_BS - The token describes a backslash sequence |
1407 |
* that must be collapsed. NumComponents |
1408 |
* is always 0. |
1409 |
* TCL_TOKEN_COMMAND - The token describes a command whose result |
1410 |
* must be substituted into the word. The |
1411 |
* token includes the enclosing brackets. |
1412 |
* NumComponents is always 0. |
1413 |
* TCL_TOKEN_VARIABLE - The token describes a variable |
1414 |
* substitution, including the dollar sign, |
1415 |
* variable name, and array index (if there |
1416 |
* is one) up through the right |
1417 |
* parentheses. NumComponents tells how |
1418 |
* many additional tokens follow to |
1419 |
* represent the variable name. The first |
1420 |
* token will be a TCL_TOKEN_TEXT token |
1421 |
* that describes the variable name. If |
1422 |
* the variable is an array reference then |
1423 |
* there will be one or more additional |
1424 |
* tokens, of type TCL_TOKEN_TEXT, |
1425 |
* TCL_TOKEN_BS, TCL_TOKEN_COMMAND, and |
1426 |
* TCL_TOKEN_VARIABLE, that describe the |
1427 |
* array index; numComponents counts the |
1428 |
* total number of nested tokens that make |
1429 |
* up the variable reference, including |
1430 |
* sub-tokens of TCL_TOKEN_VARIABLE tokens. |
1431 |
* TCL_TOKEN_SUB_EXPR - The token describes one subexpression of a |
1432 |
* expression, from the first non-blank |
1433 |
* character of the subexpression up to but not |
1434 |
* including the space, brace, or bracket |
1435 |
* that terminates the subexpression. |
1436 |
* NumComponents counts the total number of |
1437 |
* following subtokens that make up the |
1438 |
* subexpression; this includes all subtokens |
1439 |
* for any nested TCL_TOKEN_SUB_EXPR tokens. |
1440 |
* For example, a numeric value used as a |
1441 |
* primitive operand is described by a |
1442 |
* TCL_TOKEN_SUB_EXPR token followed by a |
1443 |
* TCL_TOKEN_TEXT token. A binary subexpression |
1444 |
* is described by a TCL_TOKEN_SUB_EXPR token |
1445 |
* followed by the TCL_TOKEN_OPERATOR token |
1446 |
* for the operator, then TCL_TOKEN_SUB_EXPR |
1447 |
* tokens for the left then the right operands. |
1448 |
* TCL_TOKEN_OPERATOR - The token describes one expression operator. |
1449 |
* An operator might be the name of a math |
1450 |
* function such as "abs". A TCL_TOKEN_OPERATOR |
1451 |
* token is always preceeded by one |
1452 |
* TCL_TOKEN_SUB_EXPR token for the operator's |
1453 |
* subexpression, and is followed by zero or |
1454 |
* more TCL_TOKEN_SUB_EXPR tokens for the |
1455 |
* operator's operands. NumComponents is |
1456 |
* always 0. |
1457 |
*/ |
1458 |
|
1459 |
#define TCL_TOKEN_WORD 1 |
1460 |
#define TCL_TOKEN_SIMPLE_WORD 2 |
1461 |
#define TCL_TOKEN_TEXT 4 |
1462 |
#define TCL_TOKEN_BS 8 |
1463 |
#define TCL_TOKEN_COMMAND 16 |
1464 |
#define TCL_TOKEN_VARIABLE 32 |
1465 |
#define TCL_TOKEN_SUB_EXPR 64 |
1466 |
#define TCL_TOKEN_OPERATOR 128 |
1467 |
|
1468 |
/* |
1469 |
* Parsing error types. On any parsing error, one of these values |
1470 |
* will be stored in the error field of the Tcl_Parse structure |
1471 |
* defined below. |
1472 |
*/ |
1473 |
|
1474 |
#define TCL_PARSE_SUCCESS 0 |
1475 |
#define TCL_PARSE_QUOTE_EXTRA 1 |
1476 |
#define TCL_PARSE_BRACE_EXTRA 2 |
1477 |
#define TCL_PARSE_MISSING_BRACE 3 |
1478 |
#define TCL_PARSE_MISSING_BRACKET 4 |
1479 |
#define TCL_PARSE_MISSING_PAREN 5 |
1480 |
#define TCL_PARSE_MISSING_QUOTE 6 |
1481 |
#define TCL_PARSE_MISSING_VAR_BRACE 7 |
1482 |
#define TCL_PARSE_SYNTAX 8 |
1483 |
#define TCL_PARSE_BAD_NUMBER 9 |
1484 |
|
1485 |
/* |
1486 |
* A structure of the following type is filled in by Tcl_ParseCommand. |
1487 |
* It describes a single command parsed from an input string. |
1488 |
*/ |
1489 |
|
1490 |
#define NUM_STATIC_TOKENS 20 |
1491 |
|
1492 |
typedef struct Tcl_Parse { |
1493 |
char *commentStart; /* Pointer to # that begins the first of |
1494 |
* one or more comments preceding the |
1495 |
* command. */ |
1496 |
int commentSize; /* Number of bytes in comments (up through |
1497 |
* newline character that terminates the |
1498 |
* last comment). If there were no |
1499 |
* comments, this field is 0. */ |
1500 |
char *commandStart; /* First character in first word of command. */ |
1501 |
int commandSize; /* Number of bytes in command, including |
1502 |
* first character of first word, up |
1503 |
* through the terminating newline, |
1504 |
* close bracket, or semicolon. */ |
1505 |
int numWords; /* Total number of words in command. May |
1506 |
* be 0. */ |
1507 |
Tcl_Token *tokenPtr; /* Pointer to first token representing |
1508 |
* the words of the command. Initially |
1509 |
* points to staticTokens, but may change |
1510 |
* to point to malloc-ed space if command |
1511 |
* exceeds space in staticTokens. */ |
1512 |
int numTokens; /* Total number of tokens in command. */ |
1513 |
int tokensAvailable; /* Total number of tokens available at |
1514 |
* *tokenPtr. */ |
1515 |
int errorType; /* One of the parsing error types defined |
1516 |
* above. */ |
1517 |
|
1518 |
/* |
1519 |
* The fields below are intended only for the private use of the |
1520 |
* parser. They should not be used by procedures that invoke |
1521 |
* Tcl_ParseCommand. |
1522 |
*/ |
1523 |
|
1524 |
char *string; /* The original command string passed to |
1525 |
* Tcl_ParseCommand. */ |
1526 |
char *end; /* Points to the character just after the |
1527 |
* last one in the command string. */ |
1528 |
Tcl_Interp *interp; /* Interpreter to use for error reporting, |
1529 |
* or NULL. */ |
1530 |
char *term; /* Points to character in string that |
1531 |
* terminated most recent token. Filled in |
1532 |
* by ParseTokens. If an error occurs, |
1533 |
* points to beginning of region where the |
1534 |
* error occurred (e.g. the open brace if |
1535 |
* the close brace is missing). */ |
1536 |
int incomplete; /* This field is set to 1 by Tcl_ParseCommand |
1537 |
* if the command appears to be incomplete. |
1538 |
* This information is used by |
1539 |
* Tcl_CommandComplete. */ |
1540 |
Tcl_Token staticTokens[NUM_STATIC_TOKENS]; |
1541 |
/* Initial space for tokens for command. |
1542 |
* This space should be large enough to |
1543 |
* accommodate most commands; dynamic |
1544 |
* space is allocated for very large |
1545 |
* commands that don't fit here. */ |
1546 |
} Tcl_Parse; |
1547 |
|
1548 |
/* |
1549 |
* The following definitions are the error codes returned by the conversion |
1550 |
* routines: |
1551 |
* |
1552 |
* TCL_OK: All characters were converted. |
1553 |
* |
1554 |
* TCL_CONVERT_NOSPACE: The output buffer would not have been large |
1555 |
* enough for all of the converted data; as many |
1556 |
* characters as could fit were converted though. |
1557 |
* |
1558 |
* TCL_CONVERT_MULTIBYTE: The last few bytes in the source string were |
1559 |
* the beginning of a multibyte sequence, but |
1560 |
* more bytes were needed to complete this |
1561 |
* sequence. A subsequent call to the conversion |
1562 |
* routine should pass the beginning of this |
1563 |
* unconverted sequence plus additional bytes |
1564 |
* from the source stream to properly convert |
1565 |
* the formerly split-up multibyte sequence. |
1566 |
* |
1567 |
* TCL_CONVERT_SYNTAX: The source stream contained an invalid |
1568 |
* character sequence. This may occur if the |
1569 |
* input stream has been damaged or if the input |
1570 |
* encoding method was misidentified. This error |
1571 |
* is reported only if TCL_ENCODING_STOPONERROR |
1572 |
* was specified. |
1573 |
* |
1574 |
* TCL_CONVERT_UNKNOWN: The source string contained a character |
1575 |
* that could not be represented in the target |
1576 |
* encoding. This error is reported only if |
1577 |
* TCL_ENCODING_STOPONERROR was specified. |
1578 |
*/ |
1579 |
|
1580 |
#define TCL_CONVERT_MULTIBYTE -1 |
1581 |
#define TCL_CONVERT_SYNTAX -2 |
1582 |
#define TCL_CONVERT_UNKNOWN -3 |
1583 |
#define TCL_CONVERT_NOSPACE -4 |
1584 |
|
1585 |
/* |
1586 |
* The maximum number of bytes that are necessary to represent a single |
1587 |
* Unicode character in UTF-8. |
1588 |
*/ |
1589 |
|
1590 |
#define TCL_UTF_MAX 3 |
1591 |
|
1592 |
/* |
1593 |
* This represents a Unicode character. |
1594 |
*/ |
1595 |
|
1596 |
typedef unsigned short Tcl_UniChar; |
1597 |
|
1598 |
/* |
1599 |
* Deprecated Tcl procedures: |
1600 |
*/ |
1601 |
|
1602 |
#ifndef TCL_NO_DEPRECATED |
1603 |
#define Tcl_EvalObj(interp,objPtr) Tcl_EvalObjEx((interp),(objPtr),0) |
1604 |
#define Tcl_GlobalEvalObj(interp,objPtr) \ |
1605 |
Tcl_EvalObjEx((interp),(objPtr),TCL_EVAL_GLOBAL) |
1606 |
#endif |
1607 |
|
1608 |
/* |
1609 |
* These function have been renamed. The old names are deprecated, but we |
1610 |
* define these macros for backwards compatibilty. |
1611 |
*/ |
1612 |
|
1613 |
#define Tcl_Ckalloc Tcl_Alloc |
1614 |
#define Tcl_Ckfree Tcl_Free |
1615 |
#define Tcl_Ckrealloc Tcl_Realloc |
1616 |
#define Tcl_Return Tcl_SetResult |
1617 |
#define Tcl_TildeSubst Tcl_TranslateFileName |
1618 |
#define panic Tcl_Panic |
1619 |
#define panicVA Tcl_PanicVA |
1620 |
|
1621 |
/* |
1622 |
* The following constant is used to test for older versions of Tcl |
1623 |
* in the stubs tables. |
1624 |
* |
1625 |
* Jan Nijtman's plus patch uses 0xFCA1BACF, so we need to pick a different |
1626 |
* value since the stubs tables don't match. |
1627 |
*/ |
1628 |
|
1629 |
#define TCL_STUB_MAGIC 0xFCA3BACF |
1630 |
|
1631 |
/* |
1632 |
* The following function is required to be defined in all stubs aware |
1633 |
* extensions. The function is actually implemented in the stub |
1634 |
* library, not the main Tcl library, although there is a trivial |
1635 |
* implementation in the main library in case an extension is statically |
1636 |
* linked into an application. |
1637 |
*/ |
1638 |
|
1639 |
EXTERN char * Tcl_InitStubs _ANSI_ARGS_((Tcl_Interp *interp, |
1640 |
char *version, int exact)); |
1641 |
|
1642 |
#ifndef USE_TCL_STUBS |
1643 |
|
1644 |
/* |
1645 |
* When not using stubs, make it a macro. |
1646 |
*/ |
1647 |
|
1648 |
#define Tcl_InitStubs(interp, version, exact) \ |
1649 |
Tcl_PkgRequire(interp, "Tcl", version, exact) |
1650 |
|
1651 |
#endif |
1652 |
|
1653 |
|
1654 |
/* |
1655 |
* Include the public function declarations that are accessible via |
1656 |
* the stubs table. |
1657 |
*/ |
1658 |
|
1659 |
#include "tclDecls.h" |
1660 |
|
1661 |
/* |
1662 |
* Public functions that are not accessible via the stubs table. |
1663 |
*/ |
1664 |
|
1665 |
EXTERN void Tcl_Main _ANSI_ARGS_((int argc, char **argv, |
1666 |
Tcl_AppInitProc *appInitProc)); |
1667 |
|
1668 |
/* |
1669 |
* Convenience declaration of Tcl_AppInit for backwards compatibility. |
1670 |
* This function is not *implemented* by the tcl library, so the storage |
1671 |
* class is neither DLLEXPORT nor DLLIMPORT |
1672 |
*/ |
1673 |
|
1674 |
#undef TCL_STORAGE_CLASS |
1675 |
#define TCL_STORAGE_CLASS |
1676 |
|
1677 |
EXTERN int Tcl_AppInit _ANSI_ARGS_((Tcl_Interp *interp)); |
1678 |
|
1679 |
#endif /* RESOURCE_INCLUDED */ |
1680 |
|
1681 |
#undef TCL_STORAGE_CLASS |
1682 |
#define TCL_STORAGE_CLASS DLLIMPORT |
1683 |
|
1684 |
/* |
1685 |
* end block for C++ |
1686 |
*/ |
1687 |
|
1688 |
#ifdef __cplusplus |
1689 |
} |
1690 |
#endif |
1691 |
|
1692 |
#endif /* _TCL */ |
1693 |
|
1694 |
/* End of tcl.h */ |