It was possible to create a bad ref
[jimtcl.git] / jim-interactive.c
blob4aa2923669dff18b5b272b4e81aca546bdeab6c9
1 #include "jim.h"
2 #include <errno.h>
4 #define MAX_LINE_LEN 512
6 int Jim_InteractivePrompt(Jim_Interp *interp)
8 int retcode = JIM_OK;
9 Jim_Obj *scriptObjPtr;
10 char *buf = Jim_Alloc(MAX_LINE_LEN);
12 printf("Welcome to Jim version %d.%d, "
13 "Copyright (c) 2005-8 Salvatore Sanfilippo" JIM_NL, JIM_VERSION / 100, JIM_VERSION % 100);
14 Jim_SetVariableStrWithStr(interp, JIM_INTERACTIVE, "1");
15 while (1) {
16 const char *result;
17 int reslen;
19 if (retcode != 0) {
20 const char *retcodestr = Jim_ReturnCode(retcode);
22 if (*retcodestr == '?') {
23 printf("[%d] . ", retcode);
25 else {
26 printf("[%s] . ", retcodestr);
29 else
30 printf(". ");
31 fflush(stdout);
32 scriptObjPtr = Jim_NewStringObj(interp, "", 0);
33 Jim_IncrRefCount(scriptObjPtr);
34 while (1) {
35 const char *str;
36 char state;
37 int len;
39 errno = 0;
40 if (fgets(buf, MAX_LINE_LEN, stdin) == NULL) {
41 if (errno == EINTR) {
42 continue;
44 Jim_DecrRefCount(interp, scriptObjPtr);
45 goto out;
47 Jim_AppendString(interp, scriptObjPtr, buf, -1);
48 str = Jim_GetString(scriptObjPtr, &len);
49 if (Jim_ScriptIsComplete(str, len, &state))
50 break;
51 printf("%c> ", state);
52 fflush(stdout);
54 retcode = Jim_EvalObj(interp, scriptObjPtr);
55 Jim_DecrRefCount(interp, scriptObjPtr);
56 result = Jim_GetString(Jim_GetResult(interp), &reslen);
57 if (retcode == JIM_ERR) {
58 Jim_PrintErrorMessage(interp);
60 else if (retcode == JIM_EXIT) {
61 Jim_Free(buf);
62 exit(Jim_GetExitCode(interp));
64 else {
65 if (reslen) {
66 printf("%s\n", result);
70 out:
71 Jim_Free(buf);
72 return 0;