Differences From Artifact [0f818ae7c91985a0]:
- File
jim.c
- 2006-11-05 00:26:57 - part of checkin [d0f143ac97] on branch trunk - {*} as alias for {expand} like in recent Tcl 8.5 versions (user: antirez
To Artifact [90ee96a468a1cc90]:
- File
jim.c
- 2006-11-06 20:29:15 - part of checkin [b95ab1c02b] on branch trunk - Jim_GetStdin/out/err API removed, now Jim-SetStdin/out/err returns the old value if called with NULL. JIM_NL define introduced in order to force Jim to output CRLF instead of just LF in the core output printf/fwrite calls. This appears to be useful in some kind of terminal under eCos. (user: antirez
1 1 /* Jim - A small embeddable Tcl interpreter
2 2 * Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
3 3 * Copyright 2005 Clemens Hintze <c.hintze@gmx.net>
4 4 *
5 - * $Id: jim.c,v 1.168 2006/11/05 00:26:57 antirez Exp $
5 + * $Id: jim.c,v 1.169 2006/11/06 20:29:15 antirez Exp $
6 6 *
7 7 * Licensed under the Apache License, Version 2.0 (the "License");
8 8 * you may not use this file except in compliance with the License.
9 9 * You may obtain a copy of the License at
10 10 *
11 11 * http://www.apache.org/licenses/LICENSE-2.0
12 12 *
................................................................................
454 454 * file descriptor, it will default to stderr otherwise. */
455 455 void Jim_Panic(Jim_Interp *interp, const char *fmt, ...)
456 456 {
457 457 va_list ap;
458 458 FILE *fp = interp ? interp->stderr : stderr;
459 459
460 460 va_start(ap, fmt);
461 - fprintf(fp, "\nJIM INTERPRETER PANIC: ");
461 + fprintf(fp, JIM_NL "JIM INTERPRETER PANIC: ");
462 462 vfprintf(fp, fmt, ap);
463 - fprintf(fp, "\n\n");
463 + fprintf(fp, JIM_NL JIM_NL);
464 464 va_end(ap);
465 465 #ifdef HAVE_BACKTRACE
466 466 {
467 467 void *array[40];
468 468 int size, i;
469 469 char **strings;
470 470
471 471 size = backtrace(array, 40);
472 472 strings = backtrace_symbols(array, size);
473 473 for (i = 0; i < size; i++)
474 - fprintf(fp,"[backtrace] %s\n", strings[i]);
475 - fprintf(fp,"[backtrace] Include the above lines and the output\n");
476 - fprintf(fp,"[backtrace] of 'nm <executable>' in the bug report.\n");
474 + fprintf(fp,"[backtrace] %s" JIM_NL, strings[i]);
475 + fprintf(fp,"[backtrace] Include the above lines and the output" JIM_NL);
476 + fprintf(fp,"[backtrace] of 'nm <executable>' in the bug report." JIM_NL);
477 477 }
478 478 #endif
479 479 abort();
480 480 }
481 481
482 482 /* -----------------------------------------------------------------------------
483 483 * Memory allocation
................................................................................
3882 3882 /* If the object is of type reference, to get the
3883 3883 * Id is simple... */
3884 3884 if (objPtr->typePtr == &referenceObjType) {
3885 3885 Jim_AddHashEntry(&marks,
3886 3886 &objPtr->internalRep.refValue.id, NULL);
3887 3887 #ifdef JIM_DEBUG_GC
3888 3888 fprintf(interp->stdout,
3889 - "MARK (reference): %d refcount: %d\n",
3889 + "MARK (reference): %d refcount: %d" JIM_NL,
3890 3890 (int) objPtr->internalRep.refValue.id,
3891 3891 objPtr->refCount);
3892 3892 #endif
3893 3893 objPtr = objPtr->nextObjPtr;
3894 3894 continue;
3895 3895 }
3896 3896 /* Get the string repr of the object we want
................................................................................
3920 3920 buf[20] = '\0';
3921 3921 Jim_StringToWide(buf, &id, 10);
3922 3922
3923 3923 /* Ok, a reference for the given ID
3924 3924 * was found. Mark it. */
3925 3925 Jim_AddHashEntry(&marks, &id, NULL);
3926 3926 #ifdef JIM_DEBUG_GC
3927 - fprintf(interp->stdout,"MARK: %d\n", (int)id);
3927 + fprintf(interp->stdout,"MARK: %d" JIM_NL, (int)id);
3928 3928 #endif
3929 3929 p += JIM_REFERENCE_SPACE;
3930 3930 }
3931 3931 }
3932 3932 objPtr = objPtr->nextObjPtr;
3933 3933 }
3934 3934
................................................................................
3940 3940 Jim_Reference *refPtr;
3941 3941
3942 3942 refId = he->key;
3943 3943 /* Check if in the mark phase we encountered
3944 3944 * this reference. */
3945 3945 if (Jim_FindHashEntry(&marks, refId) == NULL) {
3946 3946 #ifdef JIM_DEBUG_GC
3947 - fprintf(interp->stdout,"COLLECTING %d\n", (int)*refId);
3947 + fprintf(interp->stdout,"COLLECTING %d" JIM_NL, (int)*refId);
3948 3948 #endif
3949 3949 collected++;
3950 3950 /* Drop the reference, but call the
3951 3951 * finalizer first if registered. */
3952 3952 refPtr = he->val;
3953 3953 if (refPtr->finalizerCmdNamePtr) {
3954 3954 char *refstr = Jim_Alloc(JIM_REFERENCE_SPACE+1);
................................................................................
4099 4099 cf = prevcf;
4100 4100 }
4101 4101 /* Check that the live object list is empty, otherwise
4102 4102 * there is a memory leak. */
4103 4103 if (i->liveList != NULL) {
4104 4104 Jim_Obj *objPtr = i->liveList;
4105 4105
4106 - fprintf(i->stdout,"\n-------------------------------------\n");
4107 - fprintf(i->stdout,"Objects still in the free list:\n");
4106 + fprintf(i->stdout,JIM_NL "-------------------------------------" JIM_NL);
4107 + fprintf(i->stdout,"Objects still in the free list:" JIM_NL);
4108 4108 while(objPtr) {
4109 4109 const char *type = objPtr->typePtr ?
4110 4110 objPtr->typePtr->name : "";
4111 - fprintf(i->stdout,"%p \"%-10s\": '%.20s' (refCount: %d)\n",
4111 + fprintf(i->stdout,"%p \"%-10s\": '%.20s' (refCount: %d)" JIM_NL,
4112 4112 objPtr, type,
4113 4113 objPtr->bytes ? objPtr->bytes
4114 4114 : "(null)", objPtr->refCount);
4115 4115 if (objPtr->typePtr == &sourceObjType) {
4116 - fprintf(i->stdout, "FILE %s LINE %d\n",
4116 + fprintf(i->stdout, "FILE %s LINE %d" JIM_NL,
4117 4117 objPtr->internalRep.sourceValue.fileName,
4118 4118 objPtr->internalRep.sourceValue.lineNumber);
4119 4119 }
4120 4120 objPtr = objPtr->nextObjPtr;
4121 4121 }
4122 - fprintf(stdout, "-------------------------------------\n\n");
4122 + fprintf(stdout, "-------------------------------------" JIM_NL JIM_NL);
4123 4123 Jim_Panic(i,"Live list non empty freeing the interpreter! Leak?");
4124 4124 }
4125 4125 /* Free all the freed objects. */
4126 4126 objPtr = i->freeList;
4127 4127 while (objPtr) {
4128 4128 nextObjPtr = objPtr->nextObjPtr;
4129 4129 Jim_Free(objPtr);
................................................................................
4301 4301 return Jim_DeleteHashEntry(&interp->assocData, key);
4302 4302 }
4303 4303
4304 4304 int Jim_GetExitCode(Jim_Interp *interp) {
4305 4305 return interp->exitCode;
4306 4306 }
4307 4307
4308 -void Jim_SetStdin(Jim_Interp *interp, FILE *fp) {interp->stdin = fp;}
4309 -void Jim_SetStdout(Jim_Interp *interp, FILE *fp) {interp->stdout = fp;}
4310 -void Jim_SetStderr(Jim_Interp *interp, FILE *fp) {interp->stderr = fp;}
4311 -FILE *Jim_GetStdin(Jim_Interp *interp) {return interp->stdin;}
4312 -FILE *Jim_GetStdout(Jim_Interp *interp) {return interp->stdout;}
4313 -FILE *Jim_GetStderr(Jim_Interp *interp) {return interp->stderr;}
4308 +FILE *Jim_SetStdin(Jim_Interp *interp, FILE *fp)
4309 +{
4310 + if (fp != NULL) interp->stdin = fp;
4311 + return interp->stdin;
4312 +}
4313 +
4314 +FILE *Jim_SetStdout(Jim_Interp *interp, FILE *fp)
4315 +{
4316 + if (fp != NULL) interp->stdout = fp;
4317 + return interp->stdout;
4318 +}
4319 +
4320 +FILE *Jim_SetStderr(Jim_Interp *interp, FILE *fp)
4321 +{
4322 + if (fp != NULL) interp->stderr = fp;
4323 + return interp->stderr;
4324 +}
4314 4325
4315 4326 /* -----------------------------------------------------------------------------
4316 4327 * Shared strings.
4317 4328 * Every interpreter has an hash table where to put shared dynamically
4318 4329 * allocate strings that are likely to be used a lot of times.
4319 4330 * For example, in the 'source' object type, there is a pointer to
4320 4331 * the filename associated with that object. Every script has a lot
................................................................................
8428 8439
8429 8440 objv[0] = Jim_NewStringObj(interp, "bgerror", -1);
8430 8441 objv[1] = Jim_GetResult(interp);
8431 8442 Jim_IncrRefCount(objv[0]);
8432 8443 Jim_IncrRefCount(objv[1]);
8433 8444 if (Jim_EvalObjVector(interp, 2, objv) != JIM_OK) {
8434 8445 /* Report the error to stderr. */
8435 - fprintf(interp->stderr, "Background error:\n");
8446 + fprintf(interp->stderr, "Background error:" JIM_NL);
8436 8447 Jim_PrintErrorMessage(interp);
8437 8448 }
8438 8449 Jim_DecrRefCount(interp, objv[0]);
8439 8450 Jim_DecrRefCount(interp, objv[1]);
8440 8451 }
8441 8452 return retval;
8442 8453 }
................................................................................
8764 8775 JIM_REGISTER_API(GetFinalizer);
8765 8776 JIM_REGISTER_API(CreateInterp);
8766 8777 JIM_REGISTER_API(FreeInterp);
8767 8778 JIM_REGISTER_API(GetExitCode);
8768 8779 JIM_REGISTER_API(SetStdin);
8769 8780 JIM_REGISTER_API(SetStdout);
8770 8781 JIM_REGISTER_API(SetStderr);
8771 - JIM_REGISTER_API(GetStdin);
8772 - JIM_REGISTER_API(GetStdout);
8773 - JIM_REGISTER_API(GetStderr);
8774 8782 JIM_REGISTER_API(CreateCommand);
8775 8783 JIM_REGISTER_API(CreateProcedure);
8776 8784 JIM_REGISTER_API(DeleteCommand);
8777 8785 JIM_REGISTER_API(RenameCommand);
8778 8786 JIM_REGISTER_API(GetCommand);
8779 8787 JIM_REGISTER_API(SetVariable);
8780 8788 JIM_REGISTER_API(SetVariableStr);
................................................................................
8965 8973 } else {
8966 8974 nonewline = 1;
8967 8975 argv++;
8968 8976 }
8969 8977 }
8970 8978 str = Jim_GetString(argv[1], &len);
8971 8979 fwrite(str, 1, len, interp->stdout);
8972 - if (!nonewline) fprintf(interp->stdout, "\n");
8980 + if (!nonewline) fprintf(interp->stdout, JIM_NL);
8973 8981 return JIM_OK;
8974 8982 }
8975 8983
8976 8984 /* Helper for [+] and [*] */
8977 8985 static int Jim_AddMulHelper(Jim_Interp *interp, int argc,
8978 8986 Jim_Obj *const *argv, int op)
8979 8987 {
................................................................................
11697 11705 /* -----------------------------------------------------------------------------
11698 11706 * Interactive prompt
11699 11707 * ---------------------------------------------------------------------------*/
11700 11708 void Jim_PrintErrorMessage(Jim_Interp *interp)
11701 11709 {
11702 11710 int len, i;
11703 11711
11704 - fprintf(interp->stderr, "Runtime error, file \"%s\", line %d:\n",
11712 + fprintf(interp->stderr, "Runtime error, file \"%s\", line %d:" JIM_NL,
11705 11713 interp->errorFileName, interp->errorLine);
11706 - fprintf(interp->stderr, " %s\n", Jim_GetString(interp->result, NULL));
11714 + fprintf(interp->stderr, " %s" JIM_NL,
11715 + Jim_GetString(interp->result, NULL));
11707 11716 Jim_ListLength(interp, interp->stackTrace, &len);
11708 11717 for (i = 0; i < len; i+= 3) {
11709 11718 Jim_Obj *objPtr;
11710 11719 const char *proc, *file, *line;
11711 11720
11712 11721 Jim_ListIndex(interp, interp->stackTrace, i, &objPtr, JIM_NONE);
11713 11722 proc = Jim_GetString(objPtr, NULL);
................................................................................
11714 11723 Jim_ListIndex(interp, interp->stackTrace, i+1, &objPtr,
11715 11724 JIM_NONE);
11716 11725 file = Jim_GetString(objPtr, NULL);
11717 11726 Jim_ListIndex(interp, interp->stackTrace, i+2, &objPtr,
11718 11727 JIM_NONE);
11719 11728 line = Jim_GetString(objPtr, NULL);
11720 11729 fprintf(interp->stderr,
11721 - "In procedure '%s' called at file \"%s\", line %s\n",
11730 + "In procedure '%s' called at file \"%s\", line %s" JIM_NL,
11722 11731 proc, file, line);
11723 11732 }
11724 11733 }
11725 11734
11726 11735 int Jim_InteractivePrompt(Jim_Interp *interp)
11727 11736 {
11728 11737 int retcode = JIM_OK;
11729 11738 Jim_Obj *scriptObjPtr;
11730 11739
11731 11740 fprintf(interp->stdout, "Welcome to Jim version %d.%d, "
11732 - "Copyright (c) 2005 Salvatore Sanfilippo\n",
11741 + "Copyright (c) 2005 Salvatore Sanfilippo" JIM_NL,
11733 11742 JIM_VERSION / 100, JIM_VERSION % 100);
11734 11743 fprintf(interp->stdout,
11735 - "CVS ID: $Id: jim.c,v 1.168 2006/11/05 00:26:57 antirez Exp $\n");
11744 + "CVS ID: $Id: jim.c,v 1.169 2006/11/06 20:29:15 antirez Exp $"
11745 + JIM_NL);
11736 11746 Jim_SetVariableStrWithStr(interp, "jim_interactive", "1");
11737 11747 while (1) {
11738 11748 char buf[1024];
11739 11749 const char *result;
11740 11750 const char *retcodestr[] = {
11741 11751 "ok", "error", "return", "break", "continue", "eval", "exit"
11742 11752 };
................................................................................
11774 11784 if (retcode == JIM_ERR) {
11775 11785 Jim_PrintErrorMessage(interp);
11776 11786 } else if (retcode == JIM_EXIT) {
11777 11787 exit(Jim_GetExitCode(interp));
11778 11788 } else {
11779 11789 if (reslen) {
11780 11790 fwrite(result, 1, reslen, interp->stdout);
11781 - fprintf(interp->stdout, "\n");
11791 + fprintf(interp->stdout, JIM_NL);
11782 11792 }
11783 11793 }
11784 11794 }
11785 11795 out:
11786 11796 return 0;
11787 11797 }