1 /* Jim - A small embeddable Tcl interpreter
3 * Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
4 * Copyright 2005 Clemens Hintze <c.hintze@gmx.net>
5 * Copyright 2005 patthoyts - Pat Thoyts <patthoyts@users.sf.net>
6 * Copyright 2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com
7 * Copyright 2008 Andrew Lunn <andrew@lunn.ch>
8 * Copyright 2008 Duane Ellis <openocd@duaneellis.com>
9 * Copyright 2008 Uwe Klein <uklein@klein-messgeraete.de>
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
17 * 1. Redistributions of source code must retain the above copyright
18 * notice, this list of conditions and the following disclaimer.
19 * 2. Redistributions in binary form must reproduce the above
20 * copyright notice, this list of conditions and the following
21 * disclaimer in the documentation and/or other materials
22 * provided with the distribution.
24 * THIS SOFTWARE IS PROVIDED BY THE JIM TCL PROJECT ``AS IS'' AND ANY
25 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
26 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
27 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28 * JIM TCL PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
29 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
33 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
35 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 * The views and conclusions contained in the software and documentation
38 * are those of the authors and should not be interpreted as representing
39 * official policies, either expressed or implied, of the Jim Tcl Project.
41 *--- Inline Header File Documentation ---
42 * [By Duane Ellis, openocd@duaneellis.com, 8/18/8]
44 * Belief is "Jim" would greatly benifit if Jim Internals where
45 * documented in some way - form whatever, and perhaps - the package:
46 * 'doxygen' is the correct approach to do that.
48 * Details, see: http://www.stack.nl/~dimitri/doxygen/
50 * To that end please follow these guide lines:
52 * (A) Document the PUBLIC api in the .H file.
54 * (B) Document JIM Internals, in the .C file.
56 * (C) Remember JIM is embedded in other packages, to that end do
57 * not assume that your way of documenting is the right way, Jim's
58 * public documentation should be agnostic, such that it is some
59 * what agreeable with the "package" that is embedding JIM inside
60 * of it's own doxygen documentation.
62 * (D) Use minimal Doxygen tags.
64 * This will be an "ongoing work in progress" for some time.
76 #include <stdio.h> /* for the FILE typedef definition */
77 #include <stdlib.h> /* In order to export the Jim_Free() macro */
78 #include <stdarg.h> /* In order to get type va_list */
80 /* -----------------------------------------------------------------------------
81 * Some /very/ old compiler maybe do not know how to
82 * handle 'const'. They even do not know, how to ignore
83 * it. For those compiler it may be better to compile with
84 * define JIM_NO_CONST activated
85 * ---------------------------------------------------------------------------*/
91 /* -----------------------------------------------------------------------------
92 * System configuration
93 * For most modern systems, you can leave the default.
94 * For embedded systems some change may be required.
95 * ---------------------------------------------------------------------------*/
97 #define HAVE_LONG_LONG
99 /* -----------------------------------------------------------------------------
100 * Compiler specific fixes.
101 * ---------------------------------------------------------------------------*/
103 /* MSC has _stricmp instead of strcasecmp */
105 # define strcasecmp _stricmp
106 #endif /* _MSC_VER */
108 /* Long Long type and related issues */
109 #ifdef HAVE_LONG_LONG
110 # ifdef _MSC_VER /* MSC compiler */
111 # define jim_wide _int64
113 # define LLONG_MAX 9223372036854775807I64
116 # define LLONG_MIN (-LLONG_MAX - 1I64)
118 # define JIM_WIDE_MIN LLONG_MIN
119 # define JIM_WIDE_MAX LLONG_MAX
120 # else /* Other compilers (mainly GCC) */
121 # define jim_wide long long
123 # define LLONG_MAX 9223372036854775807LL
126 # define LLONG_MIN (-LLONG_MAX - 1LL)
128 # define JIM_WIDE_MIN LLONG_MIN
129 # define JIM_WIDE_MAX LLONG_MAX
132 # define jim_wide long
133 # define JIM_WIDE_MIN LONG_MIN
134 # define JIM_WIDE_MAX LONG_MAX
137 /* -----------------------------------------------------------------------------
138 * LIBC specific fixes
139 * ---------------------------------------------------------------------------*/
141 #ifdef HAVE_LONG_LONG
142 # if defined(_MSC_VER) || defined(__MSVCRT__)
143 # define JIM_WIDE_MODIFIER "I64d"
145 # define JIM_WIDE_MODIFIER "lld"
148 # define JIM_WIDE_MODIFIER "ld"
151 /* -----------------------------------------------------------------------------
153 * ---------------------------------------------------------------------------*/
155 /* Jim version numbering: every version of jim is marked with a
156 * successive integer number. This is version 0. The first
157 * stable version will be 1, then 2, 3, and so on. */
158 #define JIM_VERSION 51
164 #define JIM_CONTINUE 4
167 #define JIM_ERR_ADDSTACK 7
168 #define JIM_MAX_NESTING_DEPTH 10000 /* default max nesting depth */
170 /* Some function get an integer argument with flags to change
172 #define JIM_NONE 0 /* no flags set */
173 #define JIM_ERRMSG 1 /* set an error message in the interpreter. */
175 /* Flags for Jim_SubstObj() */
176 #define JIM_SUBST_NOVAR 1 /* don't perform variables substitutions */
177 #define JIM_SUBST_NOCMD 2 /* don't perform command substitutions */
178 #define JIM_SUBST_NOESC 4 /* don't perform escapes substitutions */
180 /* Unused arguments generate annoying warnings... */
181 #define JIM_NOTUSED(V) ((void) V)
183 /* Flags used by API calls getting a 'nocase' argument. */
184 #define JIM_CASESENS 0 /* case sensitive */
185 #define JIM_NOCASE 1 /* no case */
187 /* Filesystem related */
188 #define JIM_PATH_LEN 1024
190 /* Newline, some embedded system may need -DJIM_CRLF */
192 #define JIM_NL "\r\n"
197 #if defined(__WIN32__) || defined(_WIN32)
198 #define DLLEXPORT __declspec(dllexport)
199 #define DLLIMPORT __declspec(dllimport)
205 /* -----------------------------------------------------------------------------
207 * ---------------------------------------------------------------------------*/
209 typedef struct Jim_Stack
{
215 /* -----------------------------------------------------------------------------
217 * ---------------------------------------------------------------------------*/
219 typedef struct Jim_HashEntry
{
222 struct Jim_HashEntry
*next
;
225 typedef struct Jim_HashTableType
{
226 unsigned int (*hashFunction
)(const void *key
);
227 const void *(*keyDup
)(void *privdata
, const void *key
);
228 void *(*valDup
)(void *privdata
, const void *obj
);
229 int (*keyCompare
)(void *privdata
, const void *key1
, const void *key2
);
230 void (*keyDestructor
)(void *privdata
, const void *key
);
231 void (*valDestructor
)(void *privdata
, void *obj
);
234 typedef struct Jim_HashTable
{
235 Jim_HashEntry
**table
;
236 Jim_HashTableType
*type
;
238 unsigned int sizemask
;
240 unsigned int collisions
;
244 typedef struct Jim_HashTableIterator
{
247 Jim_HashEntry
*entry
, *nextEntry
;
248 } Jim_HashTableIterator
;
250 /* This is the initial size of every hash table */
251 #define JIM_HT_INITIAL_SIZE 16
253 /* ------------------------------- Macros ------------------------------------*/
254 #define Jim_FreeEntryVal(ht, entry) \
255 if ((ht)->type->valDestructor) \
256 (ht)->type->valDestructor((ht)->privdata, (entry)->val)
258 #define Jim_SetHashVal(ht, entry, _val_) do { \
259 if ((ht)->type->valDup) \
260 entry->val = (ht)->type->valDup((ht)->privdata, _val_); \
262 entry->val = (_val_); \
265 #define Jim_FreeEntryKey(ht, entry) \
266 if ((ht)->type->keyDestructor) \
267 (ht)->type->keyDestructor((ht)->privdata, (entry)->key)
269 #define Jim_SetHashKey(ht, entry, _key_) do { \
270 if ((ht)->type->keyDup) \
271 entry->key = (ht)->type->keyDup((ht)->privdata, _key_); \
273 entry->key = (_key_); \
276 #define Jim_CompareHashKeys(ht, key1, key2) \
277 (((ht)->type->keyCompare) ? \
278 (ht)->type->keyCompare((ht)->privdata, key1, key2) : \
281 #define Jim_HashKey(ht, key) (ht)->type->hashFunction(key)
283 #define Jim_GetHashEntryKey(he) ((he)->key)
284 #define Jim_GetHashEntryVal(he) ((he)->val)
285 #define Jim_GetHashTableCollisions(ht) ((ht)->collisions)
286 #define Jim_GetHashTableSize(ht) ((ht)->size)
287 #define Jim_GetHashTableUsed(ht) ((ht)->used)
289 /* -----------------------------------------------------------------------------
291 * ---------------------------------------------------------------------------*/
293 /* -----------------------------------------------------------------------------
294 * Jim object. This is mostly the same as Tcl_Obj itself,
295 * with the addition of the 'prev' and 'next' pointers.
296 * In Jim all the objects are stored into a linked list for GC purposes,
297 * so that it's possible to access every object living in a given interpreter
298 * sequentially. When an object is freed, it's moved into a different
299 * linked list, used as object pool.
301 * The refcount of a freed object is always -1.
302 * ---------------------------------------------------------------------------*/
303 typedef struct Jim_Obj
{
304 int refCount
; /* reference count */
305 char *bytes
; /* string representation buffer. NULL = no string repr. */
306 int length
; /* number of bytes in 'bytes', not including the numterm. */
307 struct Jim_ObjType
*typePtr
; /* object type. */
308 /* Internal representation union */
310 /* integer number type */
312 /* hashed object type value */
316 /* return code type */
318 /* double number type */
320 /* Generic pointer */
322 /* Generic two pointers value */
327 /* Variable object */
329 unsigned jim_wide callFrameId
;
330 struct Jim_Var
*varPtr
;
334 unsigned jim_wide procEpoch
;
335 struct Jim_Cmd
*cmdPtr
;
339 struct Jim_Obj
**ele
; /* Elements vector */
340 int len
; /* Length */
341 int maxLen
; /* Allocated 'ele' length */
350 struct Jim_Reference
*refPtr
;
354 const char *fileName
;
357 /* Dict substitution type */
359 struct Jim_Obj
*varNameObjPtr
;
360 struct Jim_Obj
*indexObjPtr
;
362 /* tagged binary type */
368 /* This are 8 or 16 bytes more for every object
369 * but this is required for efficient garbage collection
370 * of Jim references. */
371 struct Jim_Obj
*prevObjPtr
; /* pointer to the prev object. */
372 struct Jim_Obj
*nextObjPtr
; /* pointer to the next object. */
375 /* Jim_Obj related macros */
376 #define Jim_IncrRefCount(objPtr) \
378 #define Jim_DecrRefCount(interp, objPtr) \
379 if (--(objPtr)->refCount <= 0) Jim_FreeObj(interp, objPtr)
380 #define Jim_IsShared(objPtr) \
381 ((objPtr)->refCount > 1)
383 /* This macro is used when we allocate a new object using
384 * Jim_New...Obj(), but for some error we need to destroy it.
385 * Instead to use Jim_IncrRefCount() + Jim_DecrRefCount() we
386 * can just call Jim_FreeNewObj. To call Jim_Free directly
387 * seems too raw, the object handling may change and we want
388 * that Jim_FreeNewObj() can be called only against objects
389 * that are belived to have refcount == 0. */
390 #define Jim_FreeNewObj Jim_FreeObj
392 /* Free the internal representation of the object. */
393 #define Jim_FreeIntRep(i,o) \
394 if ((o)->typePtr && (o)->typePtr->freeIntRepProc) \
395 (o)->typePtr->freeIntRepProc(i, o)
397 /* Get the internal representation pointer */
398 #define Jim_GetIntRepPtr(o) (o)->internalRep.ptr
400 /* Set the internal representation pointer */
401 #define Jim_SetIntRepPtr(o, p) \
402 (o)->internalRep.ptr = (p)
404 /* The object type structure.
405 * There are four methods.
407 * - FreeIntRep is used to free the internal representation of the object.
408 * Can be NULL if there is nothing to free.
409 * - DupIntRep is used to duplicate the internal representation of the object.
410 * If NULL, when an object is duplicated, the internalRep union is
411 * directly copied from an object to another.
412 * Note that it's up to the caller to free the old internal repr of the
413 * object before to call the Dup method.
414 * - UpdateString is used to create the string from the internal repr.
415 * - setFromAny is used to convert the current object into one of this type.
420 typedef void (Jim_FreeInternalRepProc
)(struct Jim_Interp
*interp
,
421 struct Jim_Obj
*objPtr
);
422 typedef void (Jim_DupInternalRepProc
)(struct Jim_Interp
*interp
,
423 struct Jim_Obj
*srcPtr
, Jim_Obj
*dupPtr
);
424 typedef void (Jim_UpdateStringProc
)(struct Jim_Obj
*objPtr
);
426 typedef struct Jim_ObjType
{
427 const char *name
; /* The name of the type. */
428 Jim_FreeInternalRepProc
*freeIntRepProc
;
429 Jim_DupInternalRepProc
*dupIntRepProc
;
430 Jim_UpdateStringProc
*updateStringProc
;
434 /* Jim_ObjType flags */
435 #define JIM_TYPE_NONE 0 /* No flags */
436 #define JIM_TYPE_REFERENCES 1 /* The object may contain referneces. */
438 /* Starting from 1 << 20 flags are reserved for private uses of
439 * different calls. This way the same 'flags' argument may be used
440 * to pass both global flags and private flags. */
441 #define JIM_PRIV_FLAG_SHIFT 20
443 /* -----------------------------------------------------------------------------
444 * Call frame, vars, commands structures
445 * ---------------------------------------------------------------------------*/
448 typedef struct Jim_CallFrame
{
449 unsigned jim_wide id
; /* Call Frame ID. Used for caching. */
450 struct Jim_HashTable vars
; /* Where local vars are stored */
451 struct Jim_HashTable
*staticVars
; /* pointer to procedure static vars */
452 struct Jim_CallFrame
*parentCallFrame
;
453 Jim_Obj
*const *argv
; /* object vector of the current procedure call. */
454 int argc
; /* number of args of the current procedure call. */
455 Jim_Obj
*procArgsObjPtr
; /* arglist object of the running procedure */
456 Jim_Obj
*procBodyObjPtr
; /* body object of the running procedure */
457 struct Jim_CallFrame
*nextFramePtr
;
460 /* The var structure. It just holds the pointer of the referenced
461 * object. If linkFramePtr is not NULL the variable is a link
462 * to a variable of name store on objPtr living on the given callframe
463 * (this happens when the [global] or [upvar] command is used).
464 * The interp in order to always know how to free the Jim_Obj associated
465 * with a given variable because In Jim objects memory managment is
466 * bound to interpreters. */
467 typedef struct Jim_Var
{
469 struct Jim_CallFrame
*linkFramePtr
;
472 /* The cmd structure. */
473 typedef int (*Jim_CmdProc
)(struct Jim_Interp
*interp
, int argc
,
474 Jim_Obj
*const *argv
);
475 typedef void (*Jim_DelCmdProc
)(struct Jim_Interp
*interp
, void *privData
);
477 /* A command is implemented in C if funcPtr is != NULL, otherwise
478 * it's a Tcl procedure with the arglist and body represented by the
479 * two objects referenced by arglistObjPtr and bodyoObjPtr. */
480 typedef struct Jim_Cmd
{
481 Jim_CmdProc cmdProc
; /* Not-NULL for a C command. */
482 void *privData
; /* Only used for C commands. */
483 Jim_DelCmdProc delProc
; /* Called when the command is deleted if != NULL */
484 Jim_Obj
*argListObjPtr
;
486 Jim_HashTable
*staticVars
; /* Static vars hash table. NULL if no statics. */
487 int arityMin
; /* Min number of arguments. */
488 int arityMax
; /* Max number of arguments. */
491 /* Pseudo Random Number Generator State structure */
492 typedef struct Jim_PrngState
{
493 unsigned char sbox
[256];
497 /* -----------------------------------------------------------------------------
498 * Jim interpreter structure.
499 * Fields similar to the real Tcl interpreter structure have the same names.
500 * ---------------------------------------------------------------------------*/
501 typedef struct Jim_Interp
{
502 Jim_Obj
*result
; /* object returned by the last command called. */
503 int errorLine
; /* Error line where an error occurred. */
504 const char *errorFileName
; /* Error file where an error occurred. */
505 int numLevels
; /* Number of current nested calls. */
506 int maxNestingDepth
; /* Used for infinite loop detection. */
507 int returnCode
; /* Completion code to return on JIM_RETURN. */
508 int exitCode
; /* Code to return to the OS on JIM_EXIT. */
509 Jim_CallFrame
*framePtr
; /* Pointer to the current call frame */
510 Jim_CallFrame
*topFramePtr
; /* toplevel/global frame pointer. */
511 struct Jim_HashTable commands
; /* Commands hash table */
512 unsigned jim_wide procEpoch
; /* Incremented every time the result
513 of procedures names lookup caching
514 may no longer be valid. */
515 unsigned jim_wide callFrameEpoch
; /* Incremented every time a new
516 callframe is created. This id is used for the
517 'ID' field contained in the Jim_CallFrame
519 Jim_Obj
*liveList
; /* Linked list of all the live objects. */
520 Jim_Obj
*freeList
; /* Linked list of all the unused objects. */
521 const char *scriptFileName
; /* File name of the script currently in execution. */
522 Jim_Obj
*emptyObj
; /* Shared empty string object. */
523 unsigned jim_wide referenceNextId
; /* Next id for reference. */
524 struct Jim_HashTable references
; /* References hash table. */
525 jim_wide lastCollectId
; /* reference max Id of the last GC
526 execution. It's set to -1 while the collection
527 is running as sentinel to avoid to recursive
528 calls via the [collect] command inside
530 time_t lastCollectTime
; /* unix time of the last GC execution */
531 struct Jim_HashTable sharedStrings
; /* Shared Strings hash table */
532 Jim_Obj
*stackTrace
; /* Stack trace object. */
533 Jim_Obj
*unknown
; /* Unknown command cache */
534 int unknown_called
; /* The unknown command has been invoked */
535 int errorFlag
; /* Set if an error occurred during execution. */
536 int evalRetcodeLevel
; /* Level where the last return with code JIM_EVAL
538 void *cmdPrivData
; /* Used to pass the private data pointer to
539 a command. It is set to what the user specified
540 via Jim_CreateCommand(). */
542 struct Jim_HashTable stub
; /* Stub hash table to export API */
543 /* Jim_GetApi() function pointer, used to bootstrap the STUB table */
544 int (*getApiFuncPtr
)(struct Jim_Interp
*, const char *, void *);
545 struct Jim_CallFrame
*freeFramesList
; /* list of CallFrame structures. */
546 struct Jim_HashTable assocData
; /* per-interp storage for use by packages */
547 Jim_PrngState
*prngState
; /* per interpreter Random Number Gen. state. */
548 struct Jim_HashTable packages
; /* Provided packages hash table */
549 void *cookie_stdin
; /* input file pointer, 'stdin' by default */
550 void *cookie_stdout
; /* output file pointer, 'stdout' by default */
551 void *cookie_stderr
; /* errors file pointer, 'stderr' by default */
552 size_t (*cb_fwrite
)( const void *ptr
, size_t size
, size_t n
, void *cookie
);
553 size_t (*cb_fread
)( void *ptr
, size_t size
, size_t n
, void *cookie
);
554 int (*cb_vfprintf
)( void *cookie
, const char *fmt
, va_list ap
);
555 int (*cb_fflush
)( void *cookie
);
556 char *(*cb_fgets
)( char *s
, int size
, void *cookie
);
559 /* Currently provided as macro that performs the increment.
560 * At some point may be a real function doing more work.
561 * The proc epoch is used in order to know when a command lookup
562 * cached can no longer considered valid. */
563 #define Jim_InterpIncrProcEpoch(i) (i)->procEpoch++
564 #define Jim_SetResultString(i,s,l) Jim_SetResult(i, Jim_NewStringObj(i,s,l))
565 #define Jim_SetResultInt(i,intval) Jim_SetResult(i, Jim_NewIntObj(i,intval))
566 #define Jim_SetEmptyResult(i) Jim_SetResult(i, (i)->emptyObj)
567 #define Jim_GetResult(i) ((i)->result)
568 #define Jim_CmdPrivData(i) ((i)->cmdPrivData)
570 /* Note that 'o' is expanded only one time inside this macro,
571 * so it's safe to use side effects. */
572 #define Jim_SetResult(i,o) do { \
573 Jim_Obj *_resultObjPtr_ = (o); \
574 Jim_IncrRefCount(_resultObjPtr_); \
575 Jim_DecrRefCount(i,(i)->result); \
576 (i)->result = _resultObjPtr_; \
579 /* Reference structure. The interpreter pointer is held within privdata member in HashTable */
580 #define JIM_REFERENCE_TAGLEN 7 /* The tag is fixed-length, because the reference
581 string representation must be fixed length. */
582 typedef struct Jim_Reference
{
584 Jim_Obj
*finalizerCmdNamePtr
;
585 char tag
[JIM_REFERENCE_TAGLEN
+1];
588 /** Name Value Pairs, aka: NVP
589 * - Given a string - return the associated int.
590 * - Given a number - return the associated string.
593 * Very useful when the number is not a simple index into an array of
594 * known string, or there may be multiple strings (aliases) that mean then same
597 * An NVP Table is terminated with ".name=NULL".
599 * During the 'name2value' operation, if no matching string is found
600 * the pointer to the terminal element (with p->name==NULL) is returned.
604 * const Jim_Nvp yn[] = {
613 * e = Jim_Nvp_name2value( interp, yn, "y", &result );
615 * e = Jim_Nvp_name2value( interp, yn, "n", &result );
617 * e = Jim_Nvp_name2value( interp, yn, "Blah", &result );
621 * During the number2name operation, the first matching value is returned.
629 /* -----------------------------------------------------------------------------
630 * Exported API prototypes.
631 * ---------------------------------------------------------------------------*/
633 /* Macros that are common for extensions and core. */
634 #define Jim_NewEmptyStringObj(i) Jim_NewStringObj(i, "", 0)
636 /* The core includes real prototypes, extensions instead
637 * include a global function pointer for every function exported.
638 * Once the extension calls Jim_InitExtension(), the global
639 * functon pointers are set to the value of the STUB table
640 * contained in the Jim_Interp structure.
642 * This makes Jim able to load extensions even if it is statically
643 * linked itself, and to load extensions compiled with different
644 * versions of Jim (as long as the API is still compatible.) */
646 /* Macros are common for core and extensions */
647 #define Jim_FreeHashTableIterator(iter) Jim_Free(iter)
651 #define JIM_API( X ) X
654 # if defined JIM_EXTENSION || defined JIM_EMBEDDED
655 # define JIM_API(x) (*x)
658 # define JIM_API(x) (*x)
659 # define JIM_STATIC extern
662 # define JIM_API(x) x
663 # if defined(BUILD_Jim)
664 # define JIM_STATIC DLLEXPORT
666 # define JIM_STATIC static
668 #endif /* __JIM_CORE__ */
671 /** Set the result - printf() style */
672 JIM_STATIC
int JIM_API( Jim_SetResult_sprintf
)( Jim_Interp
*p
, const char *fmt
, ... );
674 /* Memory allocation */
675 JIM_STATIC
void * JIM_API(Jim_Alloc
) (int size
);
676 JIM_STATIC
void JIM_API(Jim_Free
) (void *ptr
);
677 JIM_STATIC
char * JIM_API(Jim_StrDup
) (const char *s
);
680 JIM_STATIC
int JIM_API(Jim_Eval
)(Jim_Interp
*interp
, const char *script
);
681 /* in C code, you can do this and get better error messages */
682 /* Jim_Eval_Named( interp, "some tcl commands", __FILE__, __LINE__ ); */
683 JIM_STATIC
int JIM_API(Jim_Eval_Named
)(Jim_Interp
*interp
, const char *script
,const char *filename
, int lineno
);
684 JIM_STATIC
int JIM_API(Jim_EvalGlobal
)(Jim_Interp
*interp
, const char *script
);
685 JIM_STATIC
int JIM_API(Jim_EvalFile
)(Jim_Interp
*interp
, const char *filename
);
686 JIM_STATIC
int JIM_API(Jim_EvalObj
) (Jim_Interp
*interp
, Jim_Obj
*scriptObjPtr
);
687 JIM_STATIC
int JIM_API(Jim_EvalObjBackground
) (Jim_Interp
*interp
,
688 Jim_Obj
*scriptObjPtr
);
689 JIM_STATIC
int JIM_API(Jim_EvalObjVector
) (Jim_Interp
*interp
, int objc
,
690 Jim_Obj
*const *objv
);
691 JIM_STATIC
int JIM_API(Jim_SubstObj
) (Jim_Interp
*interp
, Jim_Obj
*substObjPtr
,
692 Jim_Obj
**resObjPtrPtr
, int flags
);
695 JIM_STATIC
void JIM_API(Jim_InitStack
)(Jim_Stack
*stack
);
696 JIM_STATIC
void JIM_API(Jim_FreeStack
)(Jim_Stack
*stack
);
697 JIM_STATIC
int JIM_API(Jim_StackLen
)(Jim_Stack
*stack
);
698 JIM_STATIC
void JIM_API(Jim_StackPush
)(Jim_Stack
*stack
, void *element
);
699 JIM_STATIC
void * JIM_API(Jim_StackPop
)(Jim_Stack
*stack
);
700 JIM_STATIC
void * JIM_API(Jim_StackPeek
)(Jim_Stack
*stack
);
701 JIM_STATIC
void JIM_API(Jim_FreeStackElements
)(Jim_Stack
*stack
, void (*freeFunc
)(void *ptr
));
704 JIM_STATIC
int JIM_API(Jim_InitHashTable
) (Jim_HashTable
*ht
,
705 Jim_HashTableType
*type
, void *privdata
);
706 JIM_STATIC
int JIM_API(Jim_ExpandHashTable
) (Jim_HashTable
*ht
,
708 JIM_STATIC
int JIM_API(Jim_AddHashEntry
) (Jim_HashTable
*ht
, const void *key
,
710 JIM_STATIC
int JIM_API(Jim_ReplaceHashEntry
) (Jim_HashTable
*ht
,
711 const void *key
, void *val
);
712 JIM_STATIC
int JIM_API(Jim_DeleteHashEntry
) (Jim_HashTable
*ht
,
714 JIM_STATIC
int JIM_API(Jim_FreeHashTable
) (Jim_HashTable
*ht
);
715 JIM_STATIC Jim_HashEntry
* JIM_API(Jim_FindHashEntry
) (Jim_HashTable
*ht
,
717 JIM_STATIC
int JIM_API(Jim_ResizeHashTable
) (Jim_HashTable
*ht
);
718 JIM_STATIC Jim_HashTableIterator
*JIM_API(Jim_GetHashTableIterator
)
720 JIM_STATIC Jim_HashEntry
* JIM_API(Jim_NextHashEntry
)
721 (Jim_HashTableIterator
*iter
);
724 JIM_STATIC Jim_Obj
* JIM_API(Jim_NewObj
) (Jim_Interp
*interp
);
725 JIM_STATIC
void JIM_API(Jim_FreeObj
) (Jim_Interp
*interp
, Jim_Obj
*objPtr
);
726 JIM_STATIC
void JIM_API(Jim_InvalidateStringRep
) (Jim_Obj
*objPtr
);
727 JIM_STATIC
void JIM_API(Jim_InitStringRep
) (Jim_Obj
*objPtr
, const char *bytes
,
729 JIM_STATIC Jim_Obj
* JIM_API(Jim_DuplicateObj
) (Jim_Interp
*interp
,
731 JIM_STATIC
const char * JIM_API(Jim_GetString
)(Jim_Obj
*objPtr
,
733 JIM_STATIC
int JIM_API(Jim_Length
)(Jim_Obj
*objPtr
);
736 JIM_STATIC Jim_Obj
* JIM_API(Jim_NewStringObj
) (Jim_Interp
*interp
,
737 const char *s
, int len
);
738 JIM_STATIC Jim_Obj
* JIM_API(Jim_NewStringObjNoAlloc
) (Jim_Interp
*interp
,
740 JIM_STATIC
void JIM_API(Jim_AppendString
) (Jim_Interp
*interp
, Jim_Obj
*objPtr
,
741 const char *str
, int len
);
742 JIM_STATIC
void JIM_API(Jim_AppendString_sprintf
) (Jim_Interp
*interp
, Jim_Obj
*objPtr
,
743 const char *fmt
, ... );
744 JIM_STATIC
void JIM_API(Jim_AppendObj
) (Jim_Interp
*interp
, Jim_Obj
*objPtr
,
745 Jim_Obj
*appendObjPtr
);
746 JIM_STATIC
void JIM_API(Jim_AppendStrings
) (Jim_Interp
*interp
,
747 Jim_Obj
*objPtr
, ...);
748 JIM_STATIC
int JIM_API(Jim_StringEqObj
) (Jim_Obj
*aObjPtr
,
749 Jim_Obj
*bObjPtr
, int nocase
);
750 JIM_STATIC
int JIM_API(Jim_StringMatchObj
) (Jim_Obj
*patternObjPtr
,
751 Jim_Obj
*objPtr
, int nocase
);
752 JIM_STATIC Jim_Obj
* JIM_API(Jim_StringRangeObj
) (Jim_Interp
*interp
,
753 Jim_Obj
*strObjPtr
, Jim_Obj
*firstObjPtr
,
754 Jim_Obj
*lastObjPtr
);
755 JIM_STATIC Jim_Obj
* JIM_API(Jim_FormatString
) (Jim_Interp
*interp
,
756 Jim_Obj
*fmtObjPtr
, int objc
, Jim_Obj
*const *objv
);
757 JIM_STATIC Jim_Obj
* JIM_API(Jim_ScanString
) (Jim_Interp
*interp
, Jim_Obj
*strObjPtr
,
758 Jim_Obj
*fmtObjPtr
, int flags
);
759 JIM_STATIC
int JIM_API(Jim_CompareStringImmediate
) (Jim_Interp
*interp
,
760 Jim_Obj
*objPtr
, const char *str
);
762 /* reference object */
763 JIM_STATIC Jim_Obj
* JIM_API(Jim_NewReference
) (Jim_Interp
*interp
,
764 Jim_Obj
*objPtr
, Jim_Obj
*tagPtr
, Jim_Obj
*cmdNamePtr
);
765 JIM_STATIC Jim_Reference
* JIM_API(Jim_GetReference
) (Jim_Interp
*interp
,
767 JIM_STATIC
int JIM_API(Jim_SetFinalizer
) (Jim_Interp
*interp
, Jim_Obj
*objPtr
, Jim_Obj
*cmdNamePtr
);
768 JIM_STATIC
int JIM_API(Jim_GetFinalizer
) (Jim_Interp
*interp
, Jim_Obj
*objPtr
, Jim_Obj
**cmdNamePtrPtr
);
771 JIM_STATIC Jim_Interp
* JIM_API(Jim_CreateInterp
) (void);
772 JIM_STATIC
void JIM_API(Jim_FreeInterp
) (Jim_Interp
*i
);
773 JIM_STATIC
int JIM_API(Jim_GetExitCode
) (Jim_Interp
*interp
);
774 JIM_STATIC
void * JIM_API(Jim_SetStdin
) (Jim_Interp
*interp
, void *fp
);
775 JIM_STATIC
void * JIM_API(Jim_SetStdout
) (Jim_Interp
*interp
, void *fp
);
776 JIM_STATIC
void * JIM_API(Jim_SetStderr
) (Jim_Interp
*interp
, void *fp
);
779 JIM_STATIC
void JIM_API(Jim_RegisterCoreCommands
) (Jim_Interp
*interp
);
780 JIM_STATIC
int JIM_API(Jim_CreateCommand
) (Jim_Interp
*interp
,
781 const char *cmdName
, Jim_CmdProc cmdProc
, void *privData
,
782 Jim_DelCmdProc delProc
);
783 JIM_STATIC
int JIM_API(Jim_CreateProcedure
) (Jim_Interp
*interp
,
784 const char *cmdName
, Jim_Obj
*argListObjPtr
, Jim_Obj
*staticsListObjPtr
,
785 Jim_Obj
*bodyObjPtr
, int arityMin
, int arityMax
);
786 JIM_STATIC
int JIM_API(Jim_DeleteCommand
) (Jim_Interp
*interp
,
787 const char *cmdName
);
788 JIM_STATIC
int JIM_API(Jim_RenameCommand
) (Jim_Interp
*interp
,
789 const char *oldName
, const char *newName
);
790 JIM_STATIC Jim_Cmd
* JIM_API(Jim_GetCommand
) (Jim_Interp
*interp
,
791 Jim_Obj
*objPtr
, int flags
);
792 JIM_STATIC
int JIM_API(Jim_SetVariable
) (Jim_Interp
*interp
,
793 Jim_Obj
*nameObjPtr
, Jim_Obj
*valObjPtr
);
794 JIM_STATIC
int JIM_API(Jim_SetVariableStr
) (Jim_Interp
*interp
,
795 const char *name
, Jim_Obj
*objPtr
);
796 JIM_STATIC
int JIM_API(Jim_SetGlobalVariableStr
) (Jim_Interp
*interp
,
797 const char *name
, Jim_Obj
*objPtr
);
798 JIM_STATIC
int JIM_API(Jim_SetVariableStrWithStr
) (Jim_Interp
*interp
,
799 const char *name
, const char *val
);
800 JIM_STATIC
int JIM_API(Jim_SetVariableLink
) (Jim_Interp
*interp
,
801 Jim_Obj
*nameObjPtr
, Jim_Obj
*targetNameObjPtr
,
802 Jim_CallFrame
*targetCallFrame
);
803 JIM_STATIC Jim_Obj
* JIM_API(Jim_GetVariable
) (Jim_Interp
*interp
,
804 Jim_Obj
*nameObjPtr
, int flags
);
805 JIM_STATIC Jim_Obj
* JIM_API(Jim_GetGlobalVariable
) (Jim_Interp
*interp
,
806 Jim_Obj
*nameObjPtr
, int flags
);
807 JIM_STATIC Jim_Obj
* JIM_API(Jim_GetVariableStr
) (Jim_Interp
*interp
,
808 const char *name
, int flags
);
809 JIM_STATIC Jim_Obj
* JIM_API(Jim_GetGlobalVariableStr
) (Jim_Interp
*interp
,
810 const char *name
, int flags
);
811 JIM_STATIC
int JIM_API(Jim_UnsetVariable
) (Jim_Interp
*interp
,
812 Jim_Obj
*nameObjPtr
, int flags
);
815 JIM_STATIC
int JIM_API(Jim_GetCallFrameByLevel
) (Jim_Interp
*interp
,
816 Jim_Obj
*levelObjPtr
, Jim_CallFrame
**framePtrPtr
,
819 /* garbage collection */
820 JIM_STATIC
int JIM_API(Jim_Collect
) (Jim_Interp
*interp
);
821 JIM_STATIC
void JIM_API(Jim_CollectIfNeeded
) (Jim_Interp
*interp
);
824 JIM_STATIC
int JIM_API(Jim_GetIndex
) (Jim_Interp
*interp
, Jim_Obj
*objPtr
,
828 JIM_STATIC Jim_Obj
* JIM_API(Jim_NewListObj
) (Jim_Interp
*interp
,
829 Jim_Obj
*const *elements
, int len
);
830 JIM_STATIC
void JIM_API(Jim_ListInsertElements
) (Jim_Interp
*interp
,
831 Jim_Obj
*listPtr
, int index
, int objc
, Jim_Obj
*const *objVec
);
832 JIM_STATIC
void JIM_API(Jim_ListAppendElement
) (Jim_Interp
*interp
,
833 Jim_Obj
*listPtr
, Jim_Obj
*objPtr
);
834 JIM_STATIC
void JIM_API(Jim_ListAppendList
) (Jim_Interp
*interp
,
835 Jim_Obj
*listPtr
, Jim_Obj
*appendListPtr
);
836 JIM_STATIC
void JIM_API(Jim_ListLength
) (Jim_Interp
*interp
, Jim_Obj
*listPtr
,
838 JIM_STATIC
int JIM_API(Jim_ListIndex
) (Jim_Interp
*interp
, Jim_Obj
*listPrt
,
839 int index
, Jim_Obj
**objPtrPtr
, int seterr
);
840 JIM_STATIC
int JIM_API(Jim_SetListIndex
) (Jim_Interp
*interp
,
841 Jim_Obj
*varNamePtr
, Jim_Obj
*const *indexv
, int indexc
,
843 JIM_STATIC Jim_Obj
* JIM_API(Jim_ConcatObj
) (Jim_Interp
*interp
, int objc
,
844 Jim_Obj
*const *objv
);
847 JIM_STATIC Jim_Obj
* JIM_API(Jim_NewDictObj
) (Jim_Interp
*interp
,
848 Jim_Obj
*const *elements
, int len
);
849 JIM_STATIC
int JIM_API(Jim_DictKey
) (Jim_Interp
*interp
, Jim_Obj
*dictPtr
,
850 Jim_Obj
*keyPtr
, Jim_Obj
**objPtrPtr
, int flags
);
851 JIM_STATIC
int JIM_API(Jim_DictKeysVector
) (Jim_Interp
*interp
,
852 Jim_Obj
*dictPtr
, Jim_Obj
*const *keyv
, int keyc
,
853 Jim_Obj
**objPtrPtr
, int flags
);
854 JIM_STATIC
int JIM_API(Jim_SetDictKeysVector
) (Jim_Interp
*interp
,
855 Jim_Obj
*varNamePtr
, Jim_Obj
*const *keyv
, int keyc
,
858 /* return code object */
859 JIM_STATIC
int JIM_API(Jim_GetReturnCode
) (Jim_Interp
*interp
, Jim_Obj
*objPtr
,
862 /* expression object */
863 JIM_STATIC
int JIM_API(Jim_EvalExpression
) (Jim_Interp
*interp
,
864 Jim_Obj
*exprObjPtr
, Jim_Obj
**exprResultPtrPtr
);
865 JIM_STATIC
int JIM_API(Jim_GetBoolFromExpr
) (Jim_Interp
*interp
,
866 Jim_Obj
*exprObjPtr
, int *boolPtr
);
869 JIM_STATIC
int JIM_API(Jim_GetWide
) (Jim_Interp
*interp
, Jim_Obj
*objPtr
,
871 JIM_STATIC
int JIM_API(Jim_GetLong
) (Jim_Interp
*interp
, Jim_Obj
*objPtr
,
873 JIM_STATIC
void JIM_API(Jim_SetWide
) (Jim_Interp
*interp
, Jim_Obj
*objPtr
,
875 #define Jim_NewWideObj Jim_NewIntObj
876 JIM_STATIC Jim_Obj
* JIM_API(Jim_NewIntObj
) (Jim_Interp
*interp
,
880 JIM_STATIC
int JIM_API(Jim_GetDouble
)(Jim_Interp
*interp
, Jim_Obj
*objPtr
,
882 JIM_STATIC
void JIM_API(Jim_SetDouble
)(Jim_Interp
*interp
, Jim_Obj
*objPtr
,
884 JIM_STATIC Jim_Obj
* JIM_API(Jim_NewDoubleObj
)(Jim_Interp
*interp
, double doubleValue
);
887 JIM_STATIC
const char * JIM_API(Jim_GetSharedString
) (Jim_Interp
*interp
,
889 JIM_STATIC
void JIM_API(Jim_ReleaseSharedString
) (Jim_Interp
*interp
,
892 /* commands utilities */
893 JIM_STATIC
void JIM_API(Jim_WrongNumArgs
) (Jim_Interp
*interp
, int argc
,
894 Jim_Obj
*const *argv
, const char *msg
);
895 JIM_STATIC
int JIM_API(Jim_GetEnum
) (Jim_Interp
*interp
, Jim_Obj
*objPtr
,
896 const char * const *tablePtr
, int *indexPtr
, const char *name
, int flags
);
897 JIM_STATIC
int JIM_API(Jim_GetNvp
) (Jim_Interp
*interp
,
899 const Jim_Nvp
*nvp_table
,
900 const Jim_Nvp
**result
);
901 JIM_STATIC
int JIM_API(Jim_ScriptIsComplete
) (const char *s
, int len
,
904 /* package utilities */
905 typedef void (Jim_InterpDeleteProc
)(Jim_Interp
*interp
, void *data
);
906 JIM_STATIC
void * JIM_API(Jim_GetAssocData
)(Jim_Interp
*interp
, const char *key
);
907 JIM_STATIC
int JIM_API(Jim_SetAssocData
)(Jim_Interp
*interp
, const char *key
,
908 Jim_InterpDeleteProc
*delProc
, void *data
);
909 JIM_STATIC
int JIM_API(Jim_DeleteAssocData
)(Jim_Interp
*interp
, const char *key
);
911 /* API import/export functions */
912 JIM_STATIC
int JIM_API(Jim_GetApi
) (Jim_Interp
*interp
, const char *funcname
,
914 JIM_STATIC
int JIM_API(Jim_RegisterApi
) (Jim_Interp
*interp
,
915 const char *funcname
, void *funcptr
);
918 JIM_STATIC
int JIM_API(Jim_PackageProvide
) (Jim_Interp
*interp
,
919 const char *name
, const char *ver
, int flags
);
920 JIM_STATIC
const char * JIM_API(Jim_PackageRequire
) (Jim_Interp
*interp
,
921 const char *name
, const char *ver
, int flags
);
924 JIM_STATIC
void JIM_API(Jim_PrintErrorMessage
) (Jim_Interp
*interp
);
926 /* interactive mode */
927 JIM_STATIC
int JIM_API(Jim_InteractivePrompt
) (Jim_Interp
*interp
);
930 JIM_STATIC
void JIM_API(Jim_Panic
) (Jim_Interp
*interp
, const char *fmt
, ...);
933 JIM_STATIC
int JIM_API( Jim_fprintf
)( Jim_Interp
*interp
, void *cookie
, const char *fmt
, ... );
934 JIM_STATIC
int JIM_API( Jim_vfprintf
)( Jim_Interp
*interp
, void *cookie
, const char *fmt
, va_list ap
);
935 JIM_STATIC
size_t JIM_API( Jim_fwrite
)( Jim_Interp
*interp
, const void *ptr
, size_t size
, size_t nmeb
, void *cookie
);
936 JIM_STATIC
size_t JIM_API( Jim_fread
)( Jim_Interp
*interp
, void *ptr
, size_t size
, size_t nmeb
, void *cookie
);
937 JIM_STATIC
int JIM_API( Jim_fflush
)( Jim_Interp
*interp
, void *cookie
);
938 JIM_STATIC
char * JIM_API( Jim_fgets
)( Jim_Interp
*interp
, char *s
, int size
, void *cookie
);
940 /* Name Value Pairs Operations */
941 JIM_STATIC Jim_Nvp
*JIM_API(Jim_Nvp_name2value_simple
)( const Jim_Nvp
*nvp_table
, const char *name
);
942 JIM_STATIC Jim_Nvp
*JIM_API(Jim_Nvp_name2value_nocase_simple
)( const Jim_Nvp
*nvp_table
, const char *name
);
943 JIM_STATIC Jim_Nvp
*JIM_API(Jim_Nvp_value2name_simple
)( const Jim_Nvp
*nvp_table
, int v
);
945 JIM_STATIC
int JIM_API(Jim_Nvp_name2value
)( Jim_Interp
*interp
, const Jim_Nvp
*nvp_table
, const char *name
, Jim_Nvp
**result
);
946 JIM_STATIC
int JIM_API(Jim_Nvp_name2value_nocase
)( Jim_Interp
*interp
, const Jim_Nvp
*nvp_table
, const char *name
, Jim_Nvp
**result
);
947 JIM_STATIC
int JIM_API(Jim_Nvp_value2name
)( Jim_Interp
*interp
, const Jim_Nvp
*nvp_table
, int value
, Jim_Nvp
**result
);
949 JIM_STATIC
int JIM_API(Jim_Nvp_name2value_obj
)( Jim_Interp
*interp
, const Jim_Nvp
*nvp_table
, Jim_Obj
*name_obj
, Jim_Nvp
**result
);
950 JIM_STATIC
int JIM_API(Jim_Nvp_name2value_obj_nocase
)( Jim_Interp
*interp
, const Jim_Nvp
*nvp_table
, Jim_Obj
*name_obj
, Jim_Nvp
**result
);
951 JIM_STATIC
int JIM_API(Jim_Nvp_value2name_obj
)( Jim_Interp
*interp
, const Jim_Nvp
*nvp_table
, Jim_Obj
*value_obj
, Jim_Nvp
**result
);
953 /** prints a nice 'unknown' parameter error message to the 'result' */
954 JIM_STATIC
void JIM_API(Jim_SetResult_NvpUnknown
)( Jim_Interp
*interp
,
956 Jim_Obj
*param_value
,
957 const Jim_Nvp
*nvp_table
);
960 /** Debug: convert argc/argv into a printable string for printf() debug
962 * \param interp - the interpeter
963 * \param argc - arg count
964 * \param argv - the objects
966 * \returns string pointer holding the text.
968 * Note, next call to this function will free the old (last) string.
970 * For example might want do this:
972 * fp = fopen("some.file.log", "a" );
973 * fprintf( fp, "PARAMS are: %s\n", Jim_DebugArgvString( interp, argc, argv ) );
977 JIM_STATIC
const char *JIM_API( Jim_Debug_ArgvString
)( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
980 /** A TCL -ish GetOpt like code.
982 * Some TCL objects have various "configuration" values.
983 * For example - in Tcl/Tk the "buttons" have many options.
985 * Usefull when dealing with command options.
986 * that may come in any order...
988 * Does not support "-foo=123" type options.
989 * Only supports tcl type options, like "-foo 123"
992 typedef struct jim_getopt
{
995 Jim_Obj
* const * argv
;
996 int isconfigure
; /* non-zero if configure */
1001 * Example (short and incomplete):
1003 * Jim_GetOptInfo goi;
1005 * Jim_GetOpt_Setup( &goi, interp, argc, argv );
1007 * while( goi.argc ){
1008 * e = Jim_GetOpt_Nvp( &goi, nvp_options, &n );
1009 * if( e != JIM_OK ){
1010 * Jim_GetOpt_NvpUnknown( &goi, nvp_options, 0 );
1014 * switch( n->value ){
1016 * printf("Option ALIVE specified\n");
1019 * if( goi.argc < 1 ){
1020 * .. not enough args error ..
1022 * Jim_GetOpt_String( &goi, &cp, NULL );
1023 * printf("FIRSTNAME: %s\n", cp );
1025 * Jim_GetOpt_Wide( &goi, &w );
1026 * printf("AGE: %d\n", (int)(w) );
1029 * e = Jim_GetOpt_Nvp( &goi, nvp_politics, &n );
1030 * if( e != JIM_OK ){
1031 * Jim_GetOpt_NvpUnknown( &goi, nvp_politics, 1 );
1043 * \param goi - get opt info to be initialized
1044 * \param interp - jim interp
1045 * \param argc - argc count.
1046 * \param argv - argv (will be copied)
1049 * Jim_GetOptInfo goi;
1051 * Jim_GetOptSetup( &goi, interp, argc, argv );
1055 JIM_STATIC
int JIM_API( Jim_GetOpt_Setup
)( Jim_GetOptInfo
*goi
,
1058 Jim_Obj
* const * argv
);
1061 /** Debug - Dump parameters to stderr
1062 * \param goi - current parameters
1064 JIM_STATIC
void JIM_API( Jim_GetOpt_Debug
)( Jim_GetOptInfo
*goi
);
1068 /** Remove argv[0] from the list.
1070 * \param goi - get opt info
1071 * \param puthere - where param is put
1074 JIM_STATIC
int JIM_API( Jim_GetOpt_Obj
)( Jim_GetOptInfo
*goi
, Jim_Obj
**puthere
);
1076 /** Remove argv[0] as string.
1078 * \param goi - get opt info
1079 * \param puthere - where param is put
1081 JIM_STATIC
int JIM_API( Jim_GetOpt_String
)( Jim_GetOptInfo
*goi
, char **puthere
, int *len
);
1083 /** Remove argv[0] as double.
1085 * \param goi - get opt info
1086 * \param puthere - where param is put.
1089 JIM_STATIC
int JIM_API( Jim_GetOpt_Double
)( Jim_GetOptInfo
*goi
, double *puthere
);
1091 /** Remove argv[0] as wide.
1093 * \param goi - get opt info
1094 * \param puthere - where param is put.
1096 JIM_STATIC
int JIM_API( Jim_GetOpt_Wide
)( Jim_GetOptInfo
*goi
, jim_wide
*puthere
);
1098 /** Remove argv[0] as NVP.
1100 * \param goi - get opt info
1101 * \param lookup - nvp lookup table
1102 * \param puthere - where param is put.
1105 JIM_STATIC
int JIM_API( Jim_GetOpt_Nvp
)( Jim_GetOptInfo
*goi
, const Jim_Nvp
*lookup
, Jim_Nvp
**puthere
);
1107 /** Create an appropriate error message for an NVP.
1109 * \param goi - options info
1110 * \param lookup - the NVP table that was used.
1111 * \param hadprefix - 0 or 1 if the option had a prefix.
1113 * This function will set the "interp->result" to a human readable
1114 * error message listing the available options.
1116 * This function assumes the previous option argv[-1] is the unknown string.
1118 * If this option had some prefix, then pass "hadprefix=1" else pass "hadprefix=0"
1123 * while( goi.argc ){
1124 * // Get the next option
1125 * e = Jim_GetOpt_Nvp( &goi, cmd_options, &n );
1126 * if( e != JIM_OK ){
1127 * // option was not recognized
1128 * // pass 'hadprefix=0' because there is no prefix
1129 * Jim_GetOpt_NvpUnknown( &goi, cmd_options, 0 );
1133 * switch( n->value ){
1135 * // handle: --sex male|female|lots|needmore
1136 * e = Jim_GetOpt_Nvp( &goi, &nvp_sex, &n );
1137 * if( e != JIM_OK ){
1138 * Jim_GetOpt_NvpUnknown( &ogi, nvp_sex, 1 );
1141 * printf("Code: (%d) is %s\n", n->value, n->name );
1150 JIM_STATIC
void JIM_API( Jim_GetOpt_NvpUnknown
)( Jim_GetOptInfo
*goi
, const Jim_Nvp
*lookup
, int hadprefix
);
1153 /** Remove argv[0] as Enum
1155 * \param goi - get opt info
1156 * \param lookup - lookup table.
1157 * \param puthere - where param is put.
1160 JIM_STATIC
int JIM_API( Jim_GetOpt_Enum
)( Jim_GetOptInfo
*goi
, const char * const * lookup
, int *puthere
);
1166 #ifndef __JIM_CORE__
1168 #define JIM_GET_API(name) \
1169 Jim_GetApi(interp, "Jim_" #name, ((void *)&Jim_ ## name))
1171 #if defined JIM_EXTENSION || defined JIM_EMBEDDED
1172 /* This must be included "inline" inside the extension */
1173 static void Jim_InitExtension(Jim_Interp
*interp
)
1175 Jim_GetApi
= interp
->getApiFuncPtr
;
1180 JIM_GET_API(Eval_Named
);
1181 JIM_GET_API(EvalGlobal
);
1182 JIM_GET_API(EvalFile
);
1183 JIM_GET_API(EvalObj
);
1184 JIM_GET_API(EvalObjBackground
);
1185 JIM_GET_API(EvalObjVector
);
1186 JIM_GET_API(InitHashTable
);
1187 JIM_GET_API(ExpandHashTable
);
1188 JIM_GET_API(AddHashEntry
);
1189 JIM_GET_API(ReplaceHashEntry
);
1190 JIM_GET_API(DeleteHashEntry
);
1191 JIM_GET_API(FreeHashTable
);
1192 JIM_GET_API(FindHashEntry
);
1193 JIM_GET_API(ResizeHashTable
);
1194 JIM_GET_API(GetHashTableIterator
);
1195 JIM_GET_API(NextHashEntry
);
1196 JIM_GET_API(NewObj
);
1197 JIM_GET_API(FreeObj
);
1198 JIM_GET_API(InvalidateStringRep
);
1199 JIM_GET_API(InitStringRep
);
1200 JIM_GET_API(DuplicateObj
);
1201 JIM_GET_API(GetString
);
1202 JIM_GET_API(Length
);
1203 JIM_GET_API(InvalidateStringRep
);
1204 JIM_GET_API(NewStringObj
);
1205 JIM_GET_API(NewStringObjNoAlloc
);
1206 JIM_GET_API(AppendString
);
1207 JIM_GET_API(AppendString_sprintf
);
1208 JIM_GET_API(AppendObj
);
1209 JIM_GET_API(AppendStrings
);
1210 JIM_GET_API(StringEqObj
);
1211 JIM_GET_API(StringMatchObj
);
1212 JIM_GET_API(StringRangeObj
);
1213 JIM_GET_API(FormatString
);
1214 JIM_GET_API(ScanString
);
1215 JIM_GET_API(CompareStringImmediate
);
1216 JIM_GET_API(NewReference
);
1217 JIM_GET_API(GetReference
);
1218 JIM_GET_API(SetFinalizer
);
1219 JIM_GET_API(GetFinalizer
);
1220 JIM_GET_API(CreateInterp
);
1221 JIM_GET_API(FreeInterp
);
1222 JIM_GET_API(GetExitCode
);
1223 JIM_GET_API(SetStdin
);
1224 JIM_GET_API(SetStdout
);
1225 JIM_GET_API(SetStderr
);
1226 JIM_GET_API(CreateCommand
);
1227 JIM_GET_API(CreateProcedure
);
1228 JIM_GET_API(DeleteCommand
);
1229 JIM_GET_API(RenameCommand
);
1230 JIM_GET_API(GetCommand
);
1231 JIM_GET_API(SetVariable
);
1232 JIM_GET_API(SetVariableStr
);
1233 JIM_GET_API(SetGlobalVariableStr
);
1234 JIM_GET_API(SetVariableStrWithStr
);
1235 JIM_GET_API(SetVariableLink
);
1236 JIM_GET_API(GetVariable
);
1237 JIM_GET_API(GetCallFrameByLevel
);
1238 JIM_GET_API(Collect
);
1239 JIM_GET_API(CollectIfNeeded
);
1240 JIM_GET_API(GetIndex
);
1241 JIM_GET_API(NewListObj
);
1242 JIM_GET_API(ListInsertElements
);
1243 JIM_GET_API(ListAppendElement
);
1244 JIM_GET_API(ListAppendList
);
1245 JIM_GET_API(ListLength
);
1246 JIM_GET_API(ListIndex
);
1247 JIM_GET_API(SetListIndex
);
1248 JIM_GET_API(ConcatObj
);
1249 JIM_GET_API(NewDictObj
);
1250 JIM_GET_API(DictKey
);
1251 JIM_GET_API(DictKeysVector
);
1252 JIM_GET_API(GetIndex
);
1253 JIM_GET_API(GetReturnCode
);
1254 JIM_GET_API(EvalExpression
);
1255 JIM_GET_API(GetBoolFromExpr
);
1256 JIM_GET_API(GetWide
);
1257 JIM_GET_API(GetLong
);
1258 JIM_GET_API(SetWide
);
1259 JIM_GET_API(NewIntObj
);
1260 JIM_GET_API(GetDouble
);
1261 JIM_GET_API(SetDouble
);
1262 JIM_GET_API(NewDoubleObj
);
1263 JIM_GET_API(WrongNumArgs
);
1264 JIM_GET_API(SetDictKeysVector
);
1265 JIM_GET_API(SubstObj
);
1266 JIM_GET_API(RegisterApi
);
1267 JIM_GET_API(PrintErrorMessage
);
1268 JIM_GET_API(InteractivePrompt
);
1269 JIM_GET_API(RegisterCoreCommands
);
1270 JIM_GET_API(GetSharedString
);
1271 JIM_GET_API(ReleaseSharedString
);
1273 JIM_GET_API(StrDup
);
1274 JIM_GET_API(UnsetVariable
);
1275 JIM_GET_API(GetVariableStr
);
1276 JIM_GET_API(GetGlobalVariable
);
1277 JIM_GET_API(GetGlobalVariableStr
);
1278 JIM_GET_API(GetAssocData
);
1279 JIM_GET_API(SetAssocData
);
1280 JIM_GET_API(DeleteAssocData
);
1281 JIM_GET_API(GetEnum
);
1282 JIM_GET_API(GetNvp
);
1283 JIM_GET_API(ScriptIsComplete
);
1284 JIM_GET_API(PackageProvide
);
1285 JIM_GET_API(PackageRequire
);
1286 JIM_GET_API(InitStack
);
1287 JIM_GET_API(FreeStack
);
1288 JIM_GET_API(StackLen
);
1289 JIM_GET_API(StackPush
);
1290 JIM_GET_API(StackPop
);
1291 JIM_GET_API(StackPeek
);
1292 JIM_GET_API(FreeStackElements
);
1293 JIM_GET_API(fprintf
);
1294 JIM_GET_API(vfprintf
);
1295 JIM_GET_API(fwrite
);
1296 JIM_GET_API(fread
);
1297 JIM_GET_API(fflush
);
1298 JIM_GET_API(fgets
);
1299 JIM_GET_API(Nvp_name2value
);
1300 JIM_GET_API(Nvp_name2value_nocase
);
1301 JIM_GET_API(Nvp_name2value_simple
);
1303 JIM_GET_API(Nvp_value2name
);
1304 JIM_GET_API(Nvp_value2name_simple
);
1307 JIM_GET_API(Nvp_name2value_obj
);
1308 JIM_GET_API(Nvp_value2name_obj
);
1309 JIM_GET_API(Nvp_name2value_obj_nocase
);
1311 JIM_GET_API(GetOpt_Setup
);
1312 JIM_GET_API(GetOpt_Obj
);
1313 JIM_GET_API(GetOpt_String
);
1314 JIM_GET_API(GetOpt_Double
);
1315 JIM_GET_API(GetOpt_Wide
);
1316 JIM_GET_API(GetOpt_Nvp
);
1317 JIM_GET_API(GetOpt_NvpUnknown
);
1318 JIM_GET_API(GetOpt_Enum
);
1319 JIM_GET_API(GetOpt_Debug
);
1320 JIM_GET_API(SetResult_sprintf
);
1321 JIM_GET_API(SetResult_NvpUnknown
);
1322 JIM_GET_API(Debug_ArgvString
);
1324 #endif /* defined JIM_EXTENSION || defined JIM_EMBEDDED */
1329 Jim_Interp
*ExportedJimCreateInterp(void);
1330 static __inline__
void Jim_InitEmbedded(void) {
1331 Jim_Interp
*i
= ExportedJimCreateInterp();
1332 Jim_InitExtension(i
);
1335 #endif /* JIM_EMBEDDED */
1336 #endif /* __JIM_CORE__ */
1342 #endif /* __JIM__H */
1345 * Local Variables: ***
1346 * c-basic-offset: 4 ***
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)