/* * Parse "interface" keyword. */ static int InterfaceFunc(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { struct mystate *softc; struct iface *iface; Jim_Obj *ipobj; const char *ip; const char *name; int error; iface = NULL; ipobj = NULL; ip = name = NULL; error = 0; if (argc != 3) return (JIM_ERR); softc = Jim_CmdPrivData(interp); /* Name of the interface. */ name = Jim_GetString(argv[1], NULL); softc->block_parsing = 1; /* Body of the block */ error = Jim_EvalObj(interp, argv[2]); if (error) { printf("couldn't evaluate\n"); return (JIM_ERR); } softc->block_parsing = 0; /* Take our hidden variable */ ipobj = Jim_GetVariableStr(interp, JCONF_VAR_IP, JIM_NONE); assert(ipobj != NULL); ip = Jim_GetString(ipobj, NULL); if (ip == NULL) { Jim_fprintf(interp, interp->cookie_stdout, "NULL!\n"); return (JIM_ERR); } iface = iface_alloc(ip, name); assert(iface != NULL); INSERT(softc->head, iface); return (JIM_OK); }
static int interp_cmd_eval(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int ret; Jim_Interp *child = Jim_CmdPrivData(interp); Jim_Obj *scriptObj; Jim_Obj *targetScriptObj; scriptObj = Jim_ConcatObj(interp, argc, argv); targetScriptObj = JimInterpCopyObj(child, scriptObj); Jim_FreeNewObj(interp, scriptObj); Jim_IncrRefCount(targetScriptObj); ret = Jim_EvalObj(child, targetScriptObj); Jim_DecrRefCount(child, targetScriptObj); JimInterpCopyResult(interp, child); return ret; }
static int JimInterpAliasProc(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int i, ret; Jim_Interp *parent = Jim_GetAssocData(interp, "interp.parent"); Jim_Obj *targetPrefixObj = Jim_CmdPrivData(interp); Jim_Obj *targetScriptObj; assert(parent); /* Build the complete command */ targetScriptObj = Jim_DuplicateObj(parent, targetPrefixObj); for (i = 1; i < argc; i++) { Jim_ListAppendElement(parent, targetScriptObj, JimInterpCopyObj(parent, argv[i])); } Jim_IncrRefCount(targetScriptObj); ret = Jim_EvalObj(parent, targetScriptObj); Jim_DecrRefCount(parent, targetScriptObj); JimInterpCopyResult(interp, parent); return ret; }
int Jim_EvalObjBackground(Jim_Interp *interp, Jim_Obj *scriptObjPtr) { Jim_EventLoop *eventLoop = Jim_GetAssocData(interp, "eventloop"); Jim_CallFrame *savedFramePtr; int retval; savedFramePtr = interp->framePtr; interp->framePtr = interp->topFramePtr; retval = Jim_EvalObj(interp, scriptObjPtr); interp->framePtr = savedFramePtr; /* Try to report the error (if any) via the bgerror proc */ if (retval != JIM_OK && retval != JIM_RETURN && !eventLoop->suppress_bgerror) { Jim_Obj *objv[2]; int rc = JIM_ERR; objv[0] = Jim_NewStringObj(interp, "bgerror", -1); objv[1] = Jim_GetResult(interp); Jim_IncrRefCount(objv[0]); Jim_IncrRefCount(objv[1]); if (Jim_GetCommand(interp, objv[0], JIM_NONE) == NULL || (rc = Jim_EvalObjVector(interp, 2, objv)) != JIM_OK) { if (rc == JIM_BREAK) { /* No more bgerror calls */ eventLoop->suppress_bgerror++; } else { /* Report the error to stderr. */ Jim_MakeErrorMessage(interp); fprintf(stderr, "%s\n", Jim_String(Jim_GetResult(interp))); /* And reset the result */ Jim_SetResultString(interp, "", -1); } } Jim_DecrRefCount(interp, objv[0]); Jim_DecrRefCount(interp, objv[1]); } return retval; }
int Jim_InteractivePrompt(Jim_Interp *interp) { int retcode = JIM_OK; char *history_file = NULL; #ifdef USE_LINENOISE const char *home; home = getenv("HOME"); if (home && isatty(STDIN_FILENO)) { int history_len = strlen(home) + sizeof("/.jim_history"); history_file = Jim_Alloc(history_len); snprintf(history_file, history_len, "%s/.jim_history", home); Jim_HistoryLoad(history_file); } #endif printf("Welcome to Jim version %d.%d" JIM_NL, JIM_VERSION / 100, JIM_VERSION % 100); Jim_SetVariableStrWithStr(interp, JIM_INTERACTIVE, "1"); while (1) { Jim_Obj *scriptObjPtr; const char *result; int reslen; char prompt[20]; const char *str; if (retcode != 0) { const char *retcodestr = Jim_ReturnCode(retcode); if (*retcodestr == '?') { snprintf(prompt, sizeof(prompt) - 3, "[%d] ", retcode); } else { snprintf(prompt, sizeof(prompt) - 3, "[%s] ", retcodestr); } } else { prompt[0] = '\0'; } strcat(prompt, ". "); scriptObjPtr = Jim_NewStringObj(interp, "", 0); Jim_IncrRefCount(scriptObjPtr); while (1) { char state; int len; char *line; line = Jim_HistoryGetline(prompt); if (line == NULL) { if (errno == EINTR) { continue; } Jim_DecrRefCount(interp, scriptObjPtr); retcode = JIM_OK; goto out; } if (Jim_Length(scriptObjPtr) != 0) { Jim_AppendString(interp, scriptObjPtr, "\n", 1); } Jim_AppendString(interp, scriptObjPtr, line, -1); free(line); str = Jim_GetString(scriptObjPtr, &len); if (len == 0) { continue; } if (Jim_ScriptIsComplete(str, len, &state)) break; snprintf(prompt, sizeof(prompt), "%c> ", state); } #ifdef USE_LINENOISE if (strcmp(str, "h") == 0) { /* built-in history command */ Jim_HistoryShow(); Jim_DecrRefCount(interp, scriptObjPtr); continue; } Jim_HistoryAdd(Jim_String(scriptObjPtr)); if (history_file) { Jim_HistorySave(history_file); } #endif retcode = Jim_EvalObj(interp, scriptObjPtr); Jim_DecrRefCount(interp, scriptObjPtr); if (retcode == JIM_EXIT) { retcode = JIM_EXIT; break; } if (retcode == JIM_ERR) { Jim_MakeErrorMessage(interp); } result = Jim_GetString(Jim_GetResult(interp), &reslen); if (reslen) { printf("%s\n", result); } } out: Jim_Free(history_file); return retcode; }