9e9c7dc5cf46d152d7f041b57dc3584df1f4e8d4
[openocd.git] / src / helper / 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 */

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)