]> git.sur5r.net Git - openocd/blob - src/jim.h
src/helper/configuration.h
[openocd] / src / jim.h
1 /* Jim - A small embeddable Tcl interpreter
2  * Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
3  * Copyright 2005 Clemens Hintze <c.hintze@gmx.net>
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * A copy of the license is also included in the source distribution
12  * of Jim, as a TXT file name called LICENSE.
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20
21 #ifndef __JIM__H
22 #define __JIM__H
23
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27
28 #include <time.h>
29 #include <limits.h>
30 #include <stdio.h>  /* for the FILE typedef definition */
31 #include <stdlib.h> /* In order to export the Jim_Free() macro */
32
33 /* -----------------------------------------------------------------------------
34 * Some /very/ old compiler maybe do not know how to
35 * handle 'const'. They even do not know, how to ignore
36 * it. For those compiler it may be better to compile with
37 * define JIM_NO_CONST activated
38 * ---------------------------------------------------------------------------*/
39
40 #ifdef JIM_NO_CONST
41 #  define const
42 #endif
43
44 /* -----------------------------------------------------------------------------
45  * System configuration
46  * For most modern systems, you can leave the default.
47  * For embedded systems some change may be required.
48  * ---------------------------------------------------------------------------*/
49
50 #define HAVE_LONG_LONG
51
52 /* -----------------------------------------------------------------------------
53  * Compiler specific fixes.
54  * ---------------------------------------------------------------------------*/
55
56 /* MSC has _stricmp instead of strcasecmp */
57 #ifdef _MSC_VER
58 #  define strcasecmp _stricmp
59 #endif /* _MSC_VER */
60
61 /* Long Long type and related issues */
62 #ifdef HAVE_LONG_LONG
63 #  ifdef _MSC_VER /* MSC compiler */
64 #    define jim_wide _int64
65 #    ifndef LLONG_MAX
66 #      define LLONG_MAX    9223372036854775807I64
67 #    endif
68 #    ifndef LLONG_MIN
69 #      define LLONG_MIN    (-LLONG_MAX - 1I64)
70 #    endif
71 #    define JIM_WIDE_MIN LLONG_MIN
72 #    define JIM_WIDE_MAX LLONG_MAX
73 #  else /* Other compilers (mainly GCC) */
74 #    define jim_wide long long
75 #    ifndef LLONG_MAX
76 #      define LLONG_MAX    9223372036854775807LL
77 #    endif
78 #    ifndef LLONG_MIN
79 #      define LLONG_MIN    (-LLONG_MAX - 1LL)
80 #    endif
81 #    define JIM_WIDE_MIN LLONG_MIN
82 #    define JIM_WIDE_MAX LLONG_MAX
83 #  endif
84 #else
85 #  define jim_wide long
86 #  define JIM_WIDE_MIN LONG_MIN
87 #  define JIM_WIDE_MAX LONG_MAX
88 #endif
89
90 /* -----------------------------------------------------------------------------
91  * LIBC specific fixes
92  * ---------------------------------------------------------------------------*/
93
94 #ifdef HAVE_LONG_LONG
95 # if defined(_MSC_VER) || defined(__MSVCRT__)
96 #    define JIM_WIDE_MODIFIER "I64d"
97 # else
98 #    define JIM_WIDE_MODIFIER "lld"
99 # endif
100 #else
101 #    define JIM_WIDE_MODIFIER "ld"
102 #endif
103
104 /* -----------------------------------------------------------------------------
105  * Exported defines
106  * ---------------------------------------------------------------------------*/
107
108 /* Jim version numbering: every version of jim is marked with a
109  * successive integer number. This is version 0. The first
110  * stable version will be 1, then 2, 3, and so on. */
111 #define JIM_VERSION 51
112
113 #define JIM_OK 0
114 #define JIM_ERR 1
115 #define JIM_RETURN 2
116 #define JIM_BREAK 3
117 #define JIM_CONTINUE 4
118 #define JIM_EVAL 5
119 #define JIM_EXIT 6
120 #define JIM_MAX_NESTING_DEPTH 10000 /* default max nesting depth */
121
122 /* Some function get an integer argument with flags to change
123  * the behaviour. */
124 #define JIM_NONE 0    /* no flags set */
125 #define JIM_ERRMSG 1    /* set an error message in the interpreter. */
126
127 /* Flags for Jim_SubstObj() */
128 #define JIM_SUBST_NOVAR 1 /* don't perform variables substitutions */
129 #define JIM_SUBST_NOCMD 2 /* don't perform command substitutions */
130 #define JIM_SUBST_NOESC 4 /* don't perform escapes substitutions */
131
132 /* Unused arguments generate annoying warnings... */
133 #define JIM_NOTUSED(V) ((void) V)
134
135 /* Flags used by API calls getting a 'nocase' argument. */
136 #define JIM_CASESENS    0   /* case sensitive */
137 #define JIM_NOCASE      1   /* no case */
138
139 /* Filesystem related */
140 #define JIM_PATH_LEN 1024
141
142 /* Newline, some embedded system may need -DJIM_CRLF */
143 #ifdef JIM_CRLF
144 #define JIM_NL "\r\n"
145 #else
146 #define JIM_NL "\n"
147 #endif
148
149 #if defined(__WIN32__) || defined(_WIN32)
150 #define DLLEXPORT __declspec(dllexport)
151 #define DLLIMPORT __declspec(dllimport)
152 #else
153 #define DLLEXPORT
154 #define DLLIMPORT
155 #endif
156
157 /* -----------------------------------------------------------------------------
158  * Stack
159  * ---------------------------------------------------------------------------*/
160
161 typedef struct Jim_Stack {
162     int len;
163     int maxlen;
164     void **vector;
165 } Jim_Stack;
166
167 /* -----------------------------------------------------------------------------
168  * Hash table
169  * ---------------------------------------------------------------------------*/
170
171 typedef struct Jim_HashEntry {
172     const void *key;
173     void *val;
174     struct Jim_HashEntry *next;
175 } Jim_HashEntry;
176
177 typedef struct Jim_HashTableType {
178     unsigned int (*hashFunction)(const void *key);
179     const void *(*keyDup)(void *privdata, const void *key);
180     void *(*valDup)(void *privdata, const void *obj);
181     int (*keyCompare)(void *privdata, const void *key1, const void *key2);
182     void (*keyDestructor)(void *privdata, const void *key);
183     void (*valDestructor)(void *privdata, void *obj);
184 } Jim_HashTableType;
185
186 typedef struct Jim_HashTable {
187     Jim_HashEntry **table;
188     Jim_HashTableType *type;
189     unsigned int size;
190     unsigned int sizemask;
191     unsigned int used;
192     unsigned int collisions;
193     void *privdata;
194 } Jim_HashTable;
195
196 typedef struct Jim_HashTableIterator {
197     Jim_HashTable *ht;
198     int index;
199     Jim_HashEntry *entry, *nextEntry;
200 } Jim_HashTableIterator;
201
202 /* This is the initial size of every hash table */
203 #define JIM_HT_INITIAL_SIZE     16
204
205 /* ------------------------------- Macros ------------------------------------*/
206 #define Jim_FreeEntryVal(ht, entry) \
207     if ((ht)->type->valDestructor) \
208         (ht)->type->valDestructor((ht)->privdata, (entry)->val)
209
210 #define Jim_SetHashVal(ht, entry, _val_) do { \
211     if ((ht)->type->valDup) \
212         entry->val = (ht)->type->valDup((ht)->privdata, _val_); \
213     else \
214         entry->val = (_val_); \
215 } while(0)
216
217 #define Jim_FreeEntryKey(ht, entry) \
218     if ((ht)->type->keyDestructor) \
219         (ht)->type->keyDestructor((ht)->privdata, (entry)->key)
220
221 #define Jim_SetHashKey(ht, entry, _key_) do { \
222     if ((ht)->type->keyDup) \
223         entry->key = (ht)->type->keyDup((ht)->privdata, _key_); \
224     else \
225         entry->key = (_key_); \
226 } while(0)
227
228 #define Jim_CompareHashKeys(ht, key1, key2) \
229     (((ht)->type->keyCompare) ? \
230         (ht)->type->keyCompare((ht)->privdata, key1, key2) : \
231         (key1) == (key2))
232
233 #define Jim_HashKey(ht, key) (ht)->type->hashFunction(key)
234
235 #define Jim_GetHashEntryKey(he) ((he)->key)
236 #define Jim_GetHashEntryVal(he) ((he)->val)
237 #define Jim_GetHashTableCollisions(ht) ((ht)->collisions)
238 #define Jim_GetHashTableSize(ht) ((ht)->size)
239 #define Jim_GetHashTableUsed(ht) ((ht)->used)
240
241 /* -----------------------------------------------------------------------------
242  * Jim_Obj structure
243  * ---------------------------------------------------------------------------*/
244
245 /* -----------------------------------------------------------------------------
246  * Jim object. This is mostly the same as Tcl_Obj itself,
247  * with the addition of the 'prev' and 'next' pointers.
248  * In Jim all the objects are stored into a linked list for GC purposes,
249  * so that it's possible to access every object living in a given interpreter
250  * sequentially. When an object is freed, it's moved into a different
251  * linked list, used as object pool.
252  *
253  * The refcount of a freed object is always -1.
254  * ---------------------------------------------------------------------------*/
255 typedef struct Jim_Obj {
256     int refCount; /* reference count */
257     char *bytes; /* string representation buffer. NULL = no string repr. */
258     int length; /* number of bytes in 'bytes', not including the numterm. */
259     struct Jim_ObjType *typePtr; /* object type. */
260     /* Internal representation union */
261     union {
262         /* integer number type */
263         jim_wide wideValue;
264         /* hashed object type value */
265         int hashValue;
266         /* index type */
267         int indexValue;
268         /* return code type */
269         int returnCode;
270         /* double number type */
271         double doubleValue;
272         /* Generic pointer */
273         void *ptr;
274         /* Generic two pointers value */
275         struct {
276             void *ptr1;
277             void *ptr2;
278         } twoPtrValue;
279         /* Variable object */
280         struct {
281             unsigned jim_wide callFrameId;
282             struct Jim_Var *varPtr;
283         } varValue;
284         /* Command object */
285         struct {
286             unsigned jim_wide procEpoch;
287             struct Jim_Cmd *cmdPtr;
288         } cmdValue;
289         /* List object */
290         struct {
291             struct Jim_Obj **ele;    /* Elements vector */
292             int len;        /* Length */
293             int maxLen;        /* Allocated 'ele' length */
294         } listValue;
295         /* String type */
296         struct {
297             int maxLength;
298         } strValue;
299         /* Reference type */
300         struct {
301             jim_wide id;
302             struct Jim_Reference *refPtr;
303         } refValue;
304         /* Source type */
305         struct {
306             const char *fileName;
307             int lineNumber;
308         } sourceValue;
309         /* Dict substitution type */
310         struct {
311             struct Jim_Obj *varNameObjPtr;
312             struct Jim_Obj *indexObjPtr;
313         } dictSubstValue;
314         /* tagged binary type */
315         struct {
316             unsigned char *data;
317             size_t         len;
318         } binaryValue;
319     } internalRep;
320     /* This are 8 or 16 bytes more for every object
321      * but this is required for efficient garbage collection
322      * of Jim references. */
323     struct Jim_Obj *prevObjPtr; /* pointer to the prev object. */
324     struct Jim_Obj *nextObjPtr; /* pointer to the next object. */
325 } Jim_Obj;
326
327 /* Jim_Obj related macros */
328 #define Jim_IncrRefCount(objPtr) \
329     ++(objPtr)->refCount
330 #define Jim_DecrRefCount(interp, objPtr) \
331     if (--(objPtr)->refCount <= 0) Jim_FreeObj(interp, objPtr)
332 #define Jim_IsShared(objPtr) \
333     ((objPtr)->refCount > 1)
334
335 /* This macro is used when we allocate a new object using
336  * Jim_New...Obj(), but for some error we need to destroy it.
337  * Instead to use Jim_IncrRefCount() + Jim_DecrRefCount() we
338  * can just call Jim_FreeNewObj. To call Jim_Free directly
339  * seems too raw, the object handling may change and we want
340  * that Jim_FreeNewObj() can be called only against objects
341  * that are belived to have refcount == 0. */
342 #define Jim_FreeNewObj Jim_FreeObj
343
344 /* Free the internal representation of the object. */
345 #define Jim_FreeIntRep(i,o) \
346     if ((o)->typePtr && (o)->typePtr->freeIntRepProc) \
347         (o)->typePtr->freeIntRepProc(i, o)
348
349 /* Get the internal representation pointer */
350 #define Jim_GetIntRepPtr(o) (o)->internalRep.ptr
351
352 /* Set the internal representation pointer */
353 #define Jim_SetIntRepPtr(o, p) \
354     (o)->internalRep.ptr = (p)
355
356 /* The object type structure.
357  * There are four methods.
358  *
359  * - FreeIntRep is used to free the internal representation of the object.
360  *   Can be NULL if there is nothing to free.
361  * - DupIntRep is used to duplicate the internal representation of the object.
362  *   If NULL, when an object is duplicated, the internalRep union is
363  *   directly copied from an object to another.
364  *   Note that it's up to the caller to free the old internal repr of the
365  *   object before to call the Dup method.
366  * - UpdateString is used to create the string from the internal repr.
367  * - setFromAny is used to convert the current object into one of this type.
368  */
369
370 struct Jim_Interp;
371
372 typedef void (Jim_FreeInternalRepProc)(struct Jim_Interp *interp,
373         struct Jim_Obj *objPtr);
374 typedef void (Jim_DupInternalRepProc)(struct Jim_Interp *interp,
375         struct Jim_Obj *srcPtr, Jim_Obj *dupPtr);
376 typedef void (Jim_UpdateStringProc)(struct Jim_Obj *objPtr);
377     
378 typedef struct Jim_ObjType {
379     const char *name; /* The name of the type. */
380     Jim_FreeInternalRepProc *freeIntRepProc;
381     Jim_DupInternalRepProc *dupIntRepProc;
382     Jim_UpdateStringProc *updateStringProc;
383     int flags;
384 } Jim_ObjType;
385
386 /* Jim_ObjType flags */
387 #define JIM_TYPE_NONE 0        /* No flags */
388 #define JIM_TYPE_REFERENCES 1    /* The object may contain referneces. */
389
390 /* Starting from 1 << 20 flags are reserved for private uses of
391  * different calls. This way the same 'flags' argument may be used
392  * to pass both global flags and private flags. */
393 #define JIM_PRIV_FLAG_SHIFT 20
394
395 /* -----------------------------------------------------------------------------
396  * Call frame, vars, commands structures
397  * ---------------------------------------------------------------------------*/
398
399 /* Call frame */
400 typedef struct Jim_CallFrame {
401     unsigned jim_wide id; /* Call Frame ID. Used for caching. */
402     struct Jim_HashTable vars; /* Where local vars are stored */
403     struct Jim_HashTable *staticVars; /* pointer to procedure static vars */
404     struct Jim_CallFrame *parentCallFrame;
405     Jim_Obj *const *argv; /* object vector of the current procedure call. */
406     int argc; /* number of args of the current procedure call. */
407     Jim_Obj *procArgsObjPtr; /* arglist object of the running procedure */
408     Jim_Obj *procBodyObjPtr; /* body object of the running procedure */
409     struct Jim_CallFrame *nextFramePtr;
410 } Jim_CallFrame;
411
412 /* The var structure. It just holds the pointer of the referenced
413  * object. If linkFramePtr is not NULL the variable is a link
414  * to a variable of name store on objPtr living on the given callframe
415  * (this happens when the [global] or [upvar] command is used).
416  * The interp in order to always know how to free the Jim_Obj associated
417  * with a given variable because In Jim objects memory managment is
418  * bound to interpreters. */
419 typedef struct Jim_Var {
420     Jim_Obj *objPtr;
421     struct Jim_CallFrame *linkFramePtr;
422 } Jim_Var;
423     
424 /* The cmd structure. */
425 typedef int (*Jim_CmdProc)(struct Jim_Interp *interp, int argc,
426     Jim_Obj *const *argv);
427 typedef void (*Jim_DelCmdProc)(struct Jim_Interp *interp, void *privData);
428
429 /* A command is implemented in C if funcPtr is != NULL, otherwise
430  * it's a Tcl procedure with the arglist and body represented by the
431  * two objects referenced by arglistObjPtr and bodyoObjPtr. */
432 typedef struct Jim_Cmd {
433     Jim_CmdProc cmdProc; /* Not-NULL for a C command. */
434     void *privData; /* Only used for C commands. */
435     Jim_DelCmdProc delProc; /* Called when the command is deleted if != NULL */
436     Jim_Obj *argListObjPtr;
437     Jim_Obj *bodyObjPtr;
438     Jim_HashTable *staticVars; /* Static vars hash table. NULL if no statics. */
439     int arityMin; /* Min number of arguments. */
440     int arityMax; /* Max number of arguments. */
441 } Jim_Cmd;
442
443 /* Pseudo Random Number Generator State structure */
444 typedef struct Jim_PrngState {
445     unsigned char sbox[256];
446     unsigned int i, j;
447 } Jim_PrngState;
448
449 /* -----------------------------------------------------------------------------
450  * Jim interpreter structure.
451  * Fields similar to the real Tcl interpreter structure have the same names.
452  * ---------------------------------------------------------------------------*/
453 typedef struct Jim_Interp {
454     Jim_Obj *result; /* object returned by the last command called. */
455     int errorLine; /* Error line where an error occurred. */
456     const char *errorFileName; /* Error file where an error occurred. */
457     int numLevels; /* Number of current nested calls. */
458     int maxNestingDepth; /* Used for infinite loop detection. */
459     int returnCode; /* Completion code to return on JIM_RETURN. */
460     int exitCode; /* Code to return to the OS on JIM_EXIT. */
461     Jim_CallFrame *framePtr; /* Pointer to the current call frame */
462     Jim_CallFrame *topFramePtr; /* toplevel/global frame pointer. */
463     struct Jim_HashTable commands; /* Commands hash table */
464     unsigned jim_wide procEpoch; /* Incremented every time the result
465                 of procedures names lookup caching
466                 may no longer be valid. */
467     unsigned jim_wide callFrameEpoch; /* Incremented every time a new
468                 callframe is created. This id is used for the
469                 'ID' field contained in the Jim_CallFrame
470                 structure. */
471     Jim_Obj *liveList; /* Linked list of all the live objects. */
472     Jim_Obj *freeList; /* Linked list of all the unused objects. */
473     const char *scriptFileName; /* File name of the script currently in execution. */
474     Jim_Obj *emptyObj; /* Shared empty string object. */
475     unsigned jim_wide referenceNextId; /* Next id for reference. */
476     struct Jim_HashTable references; /* References hash table. */
477     jim_wide lastCollectId; /* reference max Id of the last GC
478                 execution. It's set to -1 while the collection
479                 is running as sentinel to avoid to recursive
480                 calls via the [collect] command inside
481                 finalizers. */
482     time_t lastCollectTime; /* unix time of the last GC execution */
483     struct Jim_HashTable sharedStrings; /* Shared Strings hash table */
484     Jim_Obj *stackTrace; /* Stack trace object. */
485     Jim_Obj *unknown; /* Unknown command cache */
486     int errorFlag; /* Set if an error occurred during execution. */
487     int evalRetcodeLevel; /* Level where the last return with code JIM_EVAL
488                              happened. */
489     void *cmdPrivData; /* Used to pass the private data pointer to
490                   a command. It is set to what the user specified
491                   via Jim_CreateCommand(). */
492
493     struct Jim_HashTable stub; /* Stub hash table to export API */
494     /* Jim_GetApi() function pointer, used to bootstrap the STUB table */
495     int (*getApiFuncPtr)(struct Jim_Interp *, const char *, void *);
496     struct Jim_CallFrame *freeFramesList; /* list of CallFrame structures. */
497     struct Jim_HashTable assocData; /* per-interp storage for use by packages */
498     Jim_PrngState *prngState; /* per interpreter Random Number Gen. state. */
499     struct Jim_HashTable packages; /* Provided packages hash table */
500     void *cookie_stdin; /* input file pointer, 'stdin' by default */
501     void *cookie_stdout; /* output file pointer, 'stdout' by default */
502     void *cookie_stderr; /* errors file pointer, 'stderr' by default */
503     size_t (*cb_fwrite  )( const void *ptr, size_t size, size_t n, void *cookie );
504         size_t (*cb_fread   )( void *ptr, size_t size, size_t n, void *cookie );
505         int    (*cb_vfprintf)( void *cookie, const char *fmt, va_list ap );
506         int    (*cb_fflush  )( void *cookie );
507         char  *(*cb_fgets   )( char *s, int size, void *cookie );
508 } Jim_Interp;
509
510 /* Currently provided as macro that performs the increment.
511  * At some point may be a real function doing more work.
512  * The proc epoch is used in order to know when a command lookup
513  * cached can no longer considered valid. */
514 #define Jim_InterpIncrProcEpoch(i) (i)->procEpoch++
515 #define Jim_SetResultString(i,s,l) Jim_SetResult(i, Jim_NewStringObj(i,s,l))
516 #define Jim_SetEmptyResult(i) Jim_SetResult(i, (i)->emptyObj)
517 #define Jim_GetResult(i) ((i)->result)
518 #define Jim_CmdPrivData(i) ((i)->cmdPrivData)
519
520 /* Note that 'o' is expanded only one time inside this macro,
521  * so it's safe to use side effects. */
522 #define Jim_SetResult(i,o) do {     \
523     Jim_Obj *_resultObjPtr_ = (o);    \
524     Jim_IncrRefCount(_resultObjPtr_); \
525     Jim_DecrRefCount(i,(i)->result);  \
526     (i)->result = _resultObjPtr_;     \
527 } while(0)
528
529 /* Reference structure. The interpreter pointer is held within privdata member in HashTable */
530 #define JIM_REFERENCE_TAGLEN 7 /* The tag is fixed-length, because the reference
531                                   string representation must be fixed length. */
532 typedef struct Jim_Reference {
533     Jim_Obj *objPtr;
534     Jim_Obj *finalizerCmdNamePtr;
535     char tag[JIM_REFERENCE_TAGLEN+1];
536 } Jim_Reference;
537
538 /* -----------------------------------------------------------------------------
539  * Exported API prototypes.
540  * ---------------------------------------------------------------------------*/
541
542 /* Macros that are common for extensions and core. */
543 #define Jim_NewEmptyStringObj(i) Jim_NewStringObj(i, "", 0)
544
545 /* The core includes real prototypes, extensions instead
546  * include a global function pointer for every function exported.
547  * Once the extension calls Jim_InitExtension(), the global
548  * functon pointers are set to the value of the STUB table
549  * contained in the Jim_Interp structure.
550  *
551  * This makes Jim able to load extensions even if it is statically
552  * linked itself, and to load extensions compiled with different
553  * versions of Jim (as long as the API is still compatible.) */
554
555 /* Macros are common for core and extensions */
556 #define Jim_FreeHashTableIterator(iter) Jim_Free(iter)
557
558 #ifndef __JIM_CORE__
559 # if defined JIM_EXTENSION || defined JIM_EMBEDDED
560 #  define JIM_API(x) (*x)
561 #  define JIM_STATIC
562 # else
563 #  define JIM_API(x) (*x)
564 #  define JIM_STATIC extern
565 # endif
566 #else
567 # define JIM_API(x) x
568 # if defined(BUILD_Jim)
569 #   define JIM_STATIC DLLEXPORT
570 # else
571 #   define JIM_STATIC static
572 # endif
573 #endif /* __JIM_CORE__ */
574
575 /* Memory allocation */
576 JIM_STATIC void * JIM_API(Jim_Alloc) (int size);
577 JIM_STATIC void JIM_API(Jim_Free) (void *ptr);
578 JIM_STATIC char * JIM_API(Jim_StrDup) (const char *s);
579
580 /* evaluation */
581 JIM_STATIC int JIM_API(Jim_Eval)(Jim_Interp *interp, const char *script);
582 JIM_STATIC int JIM_API(Jim_EvalGlobal)(Jim_Interp *interp, const char *script);
583 JIM_STATIC int JIM_API(Jim_EvalFile)(Jim_Interp *interp, const char *filename);
584 JIM_STATIC int JIM_API(Jim_EvalObj) (Jim_Interp *interp, Jim_Obj *scriptObjPtr);
585 JIM_STATIC int JIM_API(Jim_EvalObjBackground) (Jim_Interp *interp,
586         Jim_Obj *scriptObjPtr);
587 JIM_STATIC int JIM_API(Jim_EvalObjVector) (Jim_Interp *interp, int objc,
588         Jim_Obj *const *objv);
589 JIM_STATIC int JIM_API(Jim_SubstObj) (Jim_Interp *interp, Jim_Obj *substObjPtr,
590         Jim_Obj **resObjPtrPtr, int flags);
591
592 /* stack */
593 JIM_STATIC void JIM_API(Jim_InitStack)(Jim_Stack *stack);
594 JIM_STATIC void JIM_API(Jim_FreeStack)(Jim_Stack *stack);
595 JIM_STATIC int JIM_API(Jim_StackLen)(Jim_Stack *stack);
596 JIM_STATIC void JIM_API(Jim_StackPush)(Jim_Stack *stack, void *element);
597 JIM_STATIC void * JIM_API(Jim_StackPop)(Jim_Stack *stack);
598 JIM_STATIC void * JIM_API(Jim_StackPeek)(Jim_Stack *stack);
599 JIM_STATIC void JIM_API(Jim_FreeStackElements)(Jim_Stack *stack, void (*freeFunc)(void *ptr));
600
601 /* hash table */
602 JIM_STATIC int JIM_API(Jim_InitHashTable) (Jim_HashTable *ht,
603         Jim_HashTableType *type, void *privdata);
604 JIM_STATIC int JIM_API(Jim_ExpandHashTable) (Jim_HashTable *ht,
605         unsigned int size);
606 JIM_STATIC int JIM_API(Jim_AddHashEntry) (Jim_HashTable *ht, const void *key,
607         void *val);
608 JIM_STATIC int JIM_API(Jim_ReplaceHashEntry) (Jim_HashTable *ht,
609         const void *key, void *val);
610 JIM_STATIC int JIM_API(Jim_DeleteHashEntry) (Jim_HashTable *ht,
611         const void *key);
612 JIM_STATIC int JIM_API(Jim_FreeHashTable) (Jim_HashTable *ht);
613 JIM_STATIC Jim_HashEntry * JIM_API(Jim_FindHashEntry) (Jim_HashTable *ht,
614         const void *key);
615 JIM_STATIC int JIM_API(Jim_ResizeHashTable) (Jim_HashTable *ht);
616 JIM_STATIC Jim_HashTableIterator *JIM_API(Jim_GetHashTableIterator)
617         (Jim_HashTable *ht);
618 JIM_STATIC Jim_HashEntry * JIM_API(Jim_NextHashEntry)
619         (Jim_HashTableIterator *iter);
620
621 /* objects */
622 JIM_STATIC Jim_Obj * JIM_API(Jim_NewObj) (Jim_Interp *interp);
623 JIM_STATIC void JIM_API(Jim_FreeObj) (Jim_Interp *interp, Jim_Obj *objPtr);
624 JIM_STATIC void JIM_API(Jim_InvalidateStringRep) (Jim_Obj *objPtr);
625 JIM_STATIC void JIM_API(Jim_InitStringRep) (Jim_Obj *objPtr, const char *bytes,
626         int length);
627 JIM_STATIC Jim_Obj * JIM_API(Jim_DuplicateObj) (Jim_Interp *interp,
628         Jim_Obj *objPtr);
629 JIM_STATIC const char * JIM_API(Jim_GetString)(Jim_Obj *objPtr,
630         int *lenPtr);
631 JIM_STATIC int JIM_API(Jim_Length)(Jim_Obj *objPtr);
632
633 /* string object */
634 JIM_STATIC Jim_Obj * JIM_API(Jim_NewStringObj) (Jim_Interp *interp,
635         const char *s, int len);
636 JIM_STATIC Jim_Obj * JIM_API(Jim_NewStringObjNoAlloc) (Jim_Interp *interp,
637         char *s, int len);
638 JIM_STATIC void JIM_API(Jim_AppendString) (Jim_Interp *interp, Jim_Obj *objPtr,
639         const char *str, int len);
640 JIM_STATIC void JIM_API(Jim_AppendObj) (Jim_Interp *interp, Jim_Obj *objPtr,
641         Jim_Obj *appendObjPtr);
642 JIM_STATIC void JIM_API(Jim_AppendStrings) (Jim_Interp *interp,
643         Jim_Obj *objPtr, ...);
644 JIM_STATIC int JIM_API(Jim_StringEqObj) (Jim_Obj *aObjPtr,
645         Jim_Obj *bObjPtr, int nocase);
646 JIM_STATIC int JIM_API(Jim_StringMatchObj) (Jim_Obj *patternObjPtr,
647         Jim_Obj *objPtr, int nocase);
648 JIM_STATIC Jim_Obj * JIM_API(Jim_StringRangeObj) (Jim_Interp *interp,
649         Jim_Obj *strObjPtr, Jim_Obj *firstObjPtr,
650         Jim_Obj *lastObjPtr);
651 JIM_STATIC Jim_Obj * JIM_API(Jim_FormatString) (Jim_Interp *interp,
652         Jim_Obj *fmtObjPtr, int objc, Jim_Obj *const *objv);
653 JIM_STATIC Jim_Obj * JIM_API(Jim_ScanString) (Jim_Interp *interp, Jim_Obj *strObjPtr,
654         Jim_Obj *fmtObjPtr, int flags);
655 JIM_STATIC int JIM_API(Jim_CompareStringImmediate) (Jim_Interp *interp,
656         Jim_Obj *objPtr, const char *str);
657
658 /* reference object */
659 JIM_STATIC Jim_Obj * JIM_API(Jim_NewReference) (Jim_Interp *interp,
660         Jim_Obj *objPtr, Jim_Obj *tagPtr, Jim_Obj *cmdNamePtr);
661 JIM_STATIC Jim_Reference * JIM_API(Jim_GetReference) (Jim_Interp *interp,
662         Jim_Obj *objPtr);
663 JIM_STATIC int JIM_API(Jim_SetFinalizer) (Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj *cmdNamePtr);
664 JIM_STATIC int JIM_API(Jim_GetFinalizer) (Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj **cmdNamePtrPtr);
665
666 /* interpreter */
667 JIM_STATIC Jim_Interp * JIM_API(Jim_CreateInterp) (void);
668 JIM_STATIC void JIM_API(Jim_FreeInterp) (Jim_Interp *i);
669 JIM_STATIC int JIM_API(Jim_GetExitCode) (Jim_Interp *interp);
670 JIM_STATIC void * JIM_API(Jim_SetStdin) (Jim_Interp *interp, void *fp);
671 JIM_STATIC void * JIM_API(Jim_SetStdout) (Jim_Interp *interp, void *fp);
672 JIM_STATIC void * JIM_API(Jim_SetStderr) (Jim_Interp *interp, void *fp);
673
674 /* commands */
675 JIM_STATIC void JIM_API(Jim_RegisterCoreCommands) (Jim_Interp *interp);
676 JIM_STATIC int JIM_API(Jim_CreateCommand) (Jim_Interp *interp, 
677         const char *cmdName, Jim_CmdProc cmdProc, void *privData,
678          Jim_DelCmdProc delProc);
679 JIM_STATIC int JIM_API(Jim_CreateProcedure) (Jim_Interp *interp, 
680         const char *cmdName, Jim_Obj *argListObjPtr, Jim_Obj *staticsListObjPtr,
681         Jim_Obj *bodyObjPtr, int arityMin, int arityMax);
682 JIM_STATIC int JIM_API(Jim_DeleteCommand) (Jim_Interp *interp,
683         const char *cmdName);
684 JIM_STATIC int JIM_API(Jim_RenameCommand) (Jim_Interp *interp, 
685         const char *oldName, const char *newName);
686 JIM_STATIC Jim_Cmd * JIM_API(Jim_GetCommand) (Jim_Interp *interp,
687         Jim_Obj *objPtr, int flags);
688 JIM_STATIC int JIM_API(Jim_SetVariable) (Jim_Interp *interp,
689         Jim_Obj *nameObjPtr, Jim_Obj *valObjPtr);
690 JIM_STATIC int JIM_API(Jim_SetVariableStr) (Jim_Interp *interp,
691         const char *name, Jim_Obj *objPtr);
692 JIM_STATIC int JIM_API(Jim_SetGlobalVariableStr) (Jim_Interp *interp,
693         const char *name, Jim_Obj *objPtr);
694 JIM_STATIC int JIM_API(Jim_SetVariableStrWithStr) (Jim_Interp *interp,
695         const char *name, const char *val);
696 JIM_STATIC int JIM_API(Jim_SetVariableLink) (Jim_Interp *interp,
697         Jim_Obj *nameObjPtr, Jim_Obj *targetNameObjPtr,
698         Jim_CallFrame *targetCallFrame);
699 JIM_STATIC Jim_Obj * JIM_API(Jim_GetVariable) (Jim_Interp *interp,
700         Jim_Obj *nameObjPtr, int flags);
701 JIM_STATIC Jim_Obj * JIM_API(Jim_GetGlobalVariable) (Jim_Interp *interp,
702         Jim_Obj *nameObjPtr, int flags);
703 JIM_STATIC Jim_Obj * JIM_API(Jim_GetVariableStr) (Jim_Interp *interp,
704         const char *name, int flags);
705 JIM_STATIC Jim_Obj * JIM_API(Jim_GetGlobalVariableStr) (Jim_Interp *interp,
706         const char *name, int flags);
707 JIM_STATIC int JIM_API(Jim_UnsetVariable) (Jim_Interp *interp,
708         Jim_Obj *nameObjPtr, int flags);
709
710 /* call frame */
711 JIM_STATIC int JIM_API(Jim_GetCallFrameByLevel) (Jim_Interp *interp,
712         Jim_Obj *levelObjPtr, Jim_CallFrame **framePtrPtr,
713         int *newLevelPtr);
714
715 /* garbage collection */
716 JIM_STATIC int JIM_API(Jim_Collect) (Jim_Interp *interp);
717 JIM_STATIC void JIM_API(Jim_CollectIfNeeded) (Jim_Interp *interp);
718
719 /* index object */
720 JIM_STATIC int JIM_API(Jim_GetIndex) (Jim_Interp *interp, Jim_Obj *objPtr,
721         int *indexPtr);
722
723 /* list object */
724 JIM_STATIC Jim_Obj * JIM_API(Jim_NewListObj) (Jim_Interp *interp,
725         Jim_Obj *const *elements, int len);
726 JIM_STATIC void JIM_API(Jim_ListInsertElements) (Jim_Interp *interp,
727         Jim_Obj *listPtr, int index, int objc, Jim_Obj *const *objVec);
728 JIM_STATIC void JIM_API(Jim_ListAppendElement) (Jim_Interp *interp,
729         Jim_Obj *listPtr, Jim_Obj *objPtr);
730 JIM_STATIC void JIM_API(Jim_ListAppendList) (Jim_Interp *interp,
731         Jim_Obj *listPtr, Jim_Obj *appendListPtr);
732 JIM_STATIC void JIM_API(Jim_ListLength) (Jim_Interp *interp, Jim_Obj *listPtr,
733         int *intPtr);
734 JIM_STATIC int JIM_API(Jim_ListIndex) (Jim_Interp *interp, Jim_Obj *listPrt,
735         int index, Jim_Obj **objPtrPtr, int seterr);
736 JIM_STATIC int JIM_API(Jim_SetListIndex) (Jim_Interp *interp,
737         Jim_Obj *varNamePtr, Jim_Obj *const *indexv, int indexc,
738         Jim_Obj *newObjPtr);
739 JIM_STATIC Jim_Obj * JIM_API(Jim_ConcatObj) (Jim_Interp *interp, int objc,
740         Jim_Obj *const *objv);
741
742 /* dict object */
743 JIM_STATIC Jim_Obj * JIM_API(Jim_NewDictObj) (Jim_Interp *interp,
744         Jim_Obj *const *elements, int len);
745 JIM_STATIC int JIM_API(Jim_DictKey) (Jim_Interp *interp, Jim_Obj *dictPtr,
746         Jim_Obj *keyPtr, Jim_Obj **objPtrPtr, int flags);
747 JIM_STATIC int JIM_API(Jim_DictKeysVector) (Jim_Interp *interp,
748         Jim_Obj *dictPtr, Jim_Obj *const *keyv, int keyc,
749         Jim_Obj **objPtrPtr, int flags);
750 JIM_STATIC int JIM_API(Jim_SetDictKeysVector) (Jim_Interp *interp,
751         Jim_Obj *varNamePtr, Jim_Obj *const *keyv, int keyc,
752         Jim_Obj *newObjPtr);
753
754 /* return code object */
755 JIM_STATIC int JIM_API(Jim_GetReturnCode) (Jim_Interp *interp, Jim_Obj *objPtr,
756         int *intPtr);
757
758 /* expression object */
759 JIM_STATIC int JIM_API(Jim_EvalExpression) (Jim_Interp *interp,
760         Jim_Obj *exprObjPtr, Jim_Obj **exprResultPtrPtr);
761 JIM_STATIC int JIM_API(Jim_GetBoolFromExpr) (Jim_Interp *interp,
762         Jim_Obj *exprObjPtr, int *boolPtr);
763
764 /* integer object */
765 JIM_STATIC int JIM_API(Jim_GetWide) (Jim_Interp *interp, Jim_Obj *objPtr,
766         jim_wide *widePtr);
767 JIM_STATIC int JIM_API(Jim_GetLong) (Jim_Interp *interp, Jim_Obj *objPtr,
768         long *longPtr);
769 JIM_STATIC void JIM_API(Jim_SetWide) (Jim_Interp *interp, Jim_Obj *objPtr,
770         jim_wide wideValue);
771 JIM_STATIC Jim_Obj * JIM_API(Jim_NewIntObj) (Jim_Interp *interp,
772         jim_wide wideValue);
773
774 /* double object */
775 JIM_STATIC int JIM_API(Jim_GetDouble)(Jim_Interp *interp, Jim_Obj *objPtr,
776         double *doublePtr);
777 JIM_STATIC void JIM_API(Jim_SetDouble)(Jim_Interp *interp, Jim_Obj *objPtr,
778         double doubleValue);
779 JIM_STATIC Jim_Obj * JIM_API(Jim_NewDoubleObj)(Jim_Interp *interp, double doubleValue);
780
781 /* shared strings */
782 JIM_STATIC const char * JIM_API(Jim_GetSharedString) (Jim_Interp *interp, 
783         const char *str);
784 JIM_STATIC void JIM_API(Jim_ReleaseSharedString) (Jim_Interp *interp,
785         const char *str);
786
787 /* commands utilities */
788 JIM_STATIC void JIM_API(Jim_WrongNumArgs) (Jim_Interp *interp, int argc,
789         Jim_Obj *const *argv, const char *msg);
790 JIM_STATIC int JIM_API(Jim_GetEnum) (Jim_Interp *interp, Jim_Obj *objPtr,
791         const char **tablePtr, int *indexPtr, const char *name, int flags);
792 JIM_STATIC int JIM_API(Jim_ScriptIsComplete) (const char *s, int len,
793         char *stateCharPtr);
794
795 /* package utilities */
796 typedef void (Jim_InterpDeleteProc)(Jim_Interp *interp, void *data);
797 JIM_STATIC void * JIM_API(Jim_GetAssocData)(Jim_Interp *interp, const char *key);
798 JIM_STATIC int JIM_API(Jim_SetAssocData)(Jim_Interp *interp, const char *key,
799         Jim_InterpDeleteProc *delProc, void *data);
800 JIM_STATIC int JIM_API(Jim_DeleteAssocData)(Jim_Interp *interp, const char *key);
801
802 /* API import/export functions */
803 JIM_STATIC int JIM_API(Jim_GetApi) (Jim_Interp *interp, const char *funcname,
804         void *targetPtrPtr);
805 JIM_STATIC int JIM_API(Jim_RegisterApi) (Jim_Interp *interp, 
806         const char *funcname, void *funcptr);
807
808 /* Packages C API */
809 JIM_STATIC int JIM_API(Jim_PackageProvide) (Jim_Interp *interp,
810         const char *name, const char *ver, int flags);
811 JIM_STATIC const char * JIM_API(Jim_PackageRequire) (Jim_Interp *interp,
812         const char *name, const char *ver, int flags);
813
814 /* error messages */
815 JIM_STATIC void JIM_API(Jim_PrintErrorMessage) (Jim_Interp *interp);
816
817 /* interactive mode */
818 JIM_STATIC int JIM_API(Jim_InteractivePrompt) (Jim_Interp *interp);
819
820 /* Misc */
821 JIM_STATIC void JIM_API(Jim_Panic) (Jim_Interp *interp, const char *fmt, ...);
822
823 /* Jim's STDIO */
824 JIM_STATIC int     JIM_API( Jim_fprintf  )( Jim_Interp *interp, void *cookie, const char *fmt, ... );
825 JIM_STATIC int     JIM_API( Jim_vfprintf )( Jim_Interp *interp, void *cookie, const char *fmt, va_list ap );
826 JIM_STATIC size_t  JIM_API( Jim_fwrite   )( Jim_Interp *interp, const void *ptr, size_t size, size_t nmeb, void *cookie );
827 JIM_STATIC size_t  JIM_API( Jim_fread    )( Jim_Interp *interp, void *ptr, size_t size, size_t nmeb, void *cookie );
828 JIM_STATIC int     JIM_API( Jim_fflush   )( Jim_Interp *interp, void *cookie );
829 JIM_STATIC char *  JIM_API( Jim_fgets    )( Jim_Interp *interp, char *s, int size, void *cookie );
830
831
832 #undef JIM_STATIC
833 #undef JIM_API
834
835 #ifndef __JIM_CORE__
836
837 #define JIM_GET_API(name) \
838     Jim_GetApi(interp, "Jim_" #name, ((void *)&Jim_ ## name))
839
840 #if defined JIM_EXTENSION || defined JIM_EMBEDDED
841 /* This must be included "inline" inside the extension */
842 static void Jim_InitExtension(Jim_Interp *interp)
843 {
844   Jim_GetApi = interp->getApiFuncPtr;
845
846   JIM_GET_API(Alloc);
847   JIM_GET_API(Free);
848   JIM_GET_API(Eval);
849   JIM_GET_API(EvalGlobal);
850   JIM_GET_API(EvalFile);
851   JIM_GET_API(EvalObj);
852   JIM_GET_API(EvalObjBackground);
853   JIM_GET_API(EvalObjVector);
854   JIM_GET_API(InitHashTable);
855   JIM_GET_API(ExpandHashTable);
856   JIM_GET_API(AddHashEntry);
857   JIM_GET_API(ReplaceHashEntry);
858   JIM_GET_API(DeleteHashEntry);
859   JIM_GET_API(FreeHashTable);
860   JIM_GET_API(FindHashEntry);
861   JIM_GET_API(ResizeHashTable);
862   JIM_GET_API(GetHashTableIterator);
863   JIM_GET_API(NextHashEntry);
864   JIM_GET_API(NewObj);
865   JIM_GET_API(FreeObj);
866   JIM_GET_API(InvalidateStringRep);
867   JIM_GET_API(InitStringRep);
868   JIM_GET_API(DuplicateObj);
869   JIM_GET_API(GetString);
870   JIM_GET_API(Length);
871   JIM_GET_API(InvalidateStringRep);
872   JIM_GET_API(NewStringObj);
873   JIM_GET_API(NewStringObjNoAlloc);
874   JIM_GET_API(AppendString);
875   JIM_GET_API(AppendObj);
876   JIM_GET_API(AppendStrings);
877   JIM_GET_API(StringEqObj);
878   JIM_GET_API(StringMatchObj);
879   JIM_GET_API(StringRangeObj);
880   JIM_GET_API(FormatString);
881   JIM_GET_API(ScanString);
882   JIM_GET_API(CompareStringImmediate);
883   JIM_GET_API(NewReference);
884   JIM_GET_API(GetReference);
885   JIM_GET_API(SetFinalizer);
886   JIM_GET_API(GetFinalizer);
887   JIM_GET_API(CreateInterp);
888   JIM_GET_API(FreeInterp);
889   JIM_GET_API(GetExitCode);
890   JIM_GET_API(SetStdin);
891   JIM_GET_API(SetStdout);
892   JIM_GET_API(SetStderr);
893   JIM_GET_API(CreateCommand);
894   JIM_GET_API(CreateProcedure);
895   JIM_GET_API(DeleteCommand);
896   JIM_GET_API(RenameCommand);
897   JIM_GET_API(GetCommand);
898   JIM_GET_API(SetVariable);
899   JIM_GET_API(SetVariableStr);
900   JIM_GET_API(SetGlobalVariableStr);
901   JIM_GET_API(SetVariableStrWithStr);
902   JIM_GET_API(SetVariableLink);
903   JIM_GET_API(GetVariable);
904   JIM_GET_API(GetCallFrameByLevel);
905   JIM_GET_API(Collect);
906   JIM_GET_API(CollectIfNeeded);
907   JIM_GET_API(GetIndex);
908   JIM_GET_API(NewListObj);
909   JIM_GET_API(ListInsertElements);
910   JIM_GET_API(ListAppendElement);
911   JIM_GET_API(ListAppendList);
912   JIM_GET_API(ListLength);
913   JIM_GET_API(ListIndex);
914   JIM_GET_API(SetListIndex);
915   JIM_GET_API(ConcatObj);
916   JIM_GET_API(NewDictObj);
917   JIM_GET_API(DictKey);
918   JIM_GET_API(DictKeysVector);
919   JIM_GET_API(GetIndex);
920   JIM_GET_API(GetReturnCode);
921   JIM_GET_API(EvalExpression);
922   JIM_GET_API(GetBoolFromExpr);
923   JIM_GET_API(GetWide);
924   JIM_GET_API(GetLong);
925   JIM_GET_API(SetWide);
926   JIM_GET_API(NewIntObj);
927   JIM_GET_API(GetDouble);
928   JIM_GET_API(SetDouble);
929   JIM_GET_API(NewDoubleObj);
930   JIM_GET_API(WrongNumArgs);
931   JIM_GET_API(SetDictKeysVector);
932   JIM_GET_API(SubstObj);
933   JIM_GET_API(RegisterApi);
934   JIM_GET_API(PrintErrorMessage);
935   JIM_GET_API(InteractivePrompt);
936   JIM_GET_API(RegisterCoreCommands);
937   JIM_GET_API(GetSharedString);
938   JIM_GET_API(ReleaseSharedString);
939   JIM_GET_API(Panic);
940   JIM_GET_API(StrDup);
941   JIM_GET_API(UnsetVariable);
942   JIM_GET_API(GetVariableStr);
943   JIM_GET_API(GetGlobalVariable);
944   JIM_GET_API(GetGlobalVariableStr);
945   JIM_GET_API(GetAssocData);
946   JIM_GET_API(SetAssocData);
947   JIM_GET_API(DeleteAssocData);
948   JIM_GET_API(GetEnum);
949   JIM_GET_API(ScriptIsComplete);
950   JIM_GET_API(PackageProvide);
951   JIM_GET_API(PackageRequire);
952   JIM_GET_API(InitStack);
953   JIM_GET_API(FreeStack);
954   JIM_GET_API(StackLen);
955   JIM_GET_API(StackPush);
956   JIM_GET_API(StackPop);
957   JIM_GET_API(StackPeek);
958   JIM_GET_API(FreeStackElements);
959   JIM_GET_API(fprintf  );
960   JIM_GET_API(vfprintf );
961   JIM_GET_API(fwrite   );
962   JIM_GET_API(fread    );
963   JIM_GET_API(fflush   );
964   JIM_GET_API(fgets    );
965   
966 }
967 #endif /* defined JIM_EXTENSION || defined JIM_EMBEDDED */
968
969 #undef JIM_GET_API
970
971 #ifdef JIM_EMBEDDED
972 Jim_Interp *ExportedJimCreateInterp(void);
973 static void Jim_InitEmbedded(void) {
974     Jim_Interp *i = ExportedJimCreateInterp();
975     Jim_InitExtension(i);
976     Jim_FreeInterp(i);
977 }
978 #endif /* JIM_EMBEDDED */
979 #endif /* __JIM_CORE__ */
980
981 #ifdef __cplusplus
982 }
983 #endif
984
985 #endif /* __JIM__H */
986
987 /*
988  * Local Variables: **
989  * tab-width: 4 **
990  * c-basic-offset: 4 **
991  * End: **
992  */
993