Jim Tcl
Diff
Not logged in

Differences From Artifact [0f818ae7c91985a0]:

To Artifact [90ee96a468a1cc90]:


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 }