aboutsummaryrefslogtreecommitdiff
path: root/jim-interactive.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2009-07-27 10:11:30 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 10:11:01 +1000
commit0423aa4420d853a8f81a0579910d7f39b720f851 (patch)
tree65d9210088f9986fc6a1ca25a05c044d8f024000 /jim-interactive.c
parentb991f24341f4eaf7da1c32f8362ccb2a2d4dc355 (diff)
downloadjimtcl-0423aa4420d853a8f81a0579910d7f39b720f851.zip
jimtcl-0423aa4420d853a8f81a0579910d7f39b720f851.tar.gz
jimtcl-0423aa4420d853a8f81a0579910d7f39b720f851.tar.bz2
Strip out unneeded junk from Jim
Nvp, getopt, move interactive processing to jim-interactive.c
Diffstat (limited to 'jim-interactive.c')
-rw-r--r--jim-interactive.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/jim-interactive.c b/jim-interactive.c
new file mode 100644
index 0000000..89b133a
--- /dev/null
+++ b/jim-interactive.c
@@ -0,0 +1,62 @@
+#include <jim.h>
+
+int Jim_InteractivePrompt(Jim_Interp *interp)
+{
+ int retcode = JIM_OK;
+ Jim_Obj *scriptObjPtr;
+
+ printf("Welcome to Jim version %d.%d, "
+ "Copyright (c) 2005-8 Salvatore Sanfilippo" JIM_NL,
+ JIM_VERSION / 100, JIM_VERSION % 100);
+ Jim_SetVariableStrWithStr(interp, "jim_interactive", "1");
+ while (1) {
+ char buf[1024];
+ const char *result;
+ const char *retcodestr[] = {
+ "ok", "error", "return", "break", "continue", "eval", "exit"
+ };
+ int reslen;
+
+ if (retcode != 0) {
+ if (retcode >= 2 && retcode <= 6)
+ printf("[%s] . ", retcodestr[retcode]);
+ else
+ printf("[%d] . ", retcode);
+ } else
+ printf(". ");
+ fflush(stdout);
+ scriptObjPtr = Jim_NewStringObj(interp, "", 0);
+ Jim_IncrRefCount(scriptObjPtr);
+ while(1) {
+ const char *str;
+ char state;
+ int len;
+
+ if ( fgets(buf, 1024, stdin) == NULL) {
+ Jim_DecrRefCount(interp, scriptObjPtr);
+ goto out;
+ }
+ Jim_AppendString(interp, scriptObjPtr, buf, -1);
+ str = Jim_GetString(scriptObjPtr, &len);
+ if (Jim_ScriptIsComplete(str, len, &state))
+ break;
+ printf("%c> ", state);
+ fflush(stdout);
+ }
+ retcode = Jim_EvalObj(interp, scriptObjPtr);
+ Jim_DecrRefCount(interp, scriptObjPtr);
+ result = Jim_GetString(Jim_GetResult(interp), &reslen);
+ if (retcode == JIM_ERR) {
+ Jim_PrintErrorMessage(interp);
+ } else if (retcode == JIM_EXIT) {
+ exit(Jim_GetExitCode(interp));
+ } else {
+ if (reslen) {
+ printf("%s\n", result);
+ }
+ }
+ }
+out:
+ return 0;
+}
+