aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorantirez <antirez>2005-04-18 08:31:25 +0000
committerantirez <antirez>2005-04-18 08:31:25 +0000
commitc2852ab7ad42b320fb64ba07fc644c5593c15adb (patch)
tree6203fe2f41e8561d62cc9a92a999658caa02ed16 /jim.c
parentcdb994e520658916f35015e6eacaf1a10a4f64ce (diff)
downloadjimtcl-c2852ab7ad42b320fb64ba07fc644c5593c15adb.zip
jimtcl-c2852ab7ad42b320fb64ba07fc644c5593c15adb.tar.gz
jimtcl-c2852ab7ad42b320fb64ba07fc644c5593c15adb.tar.bz2
First version of the Jim eventloop extension, exporting
[after], [vwait], and the C API to write other extensions using events. No win32 port for now, just posix. UDP extension will follow shortly and will be the first extension using the event loop.
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c54
1 files changed, 49 insertions, 5 deletions
diff --git a/jim.c b/jim.c
index cf0c9ad..66e3ebe 100644
--- a/jim.c
+++ b/jim.c
@@ -2,7 +2,7 @@
* Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
* Copyright 2005 Clemens Hintze <c.hintze@gmx.net>
*
- * $Id: jim.c,v 1.161 2005/04/12 12:27:15 antirez Exp $
+ * $Id: jim.c,v 1.162 2005/04/18 08:31:26 antirez Exp $
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -3294,6 +3294,20 @@ Jim_Obj *Jim_GetVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, int flags)
}
}
+Jim_Obj *Jim_GetGlobalVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr,
+ int flags)
+{
+ Jim_CallFrame *savedFramePtr;
+ Jim_Obj *objPtr;
+
+ savedFramePtr = interp->framePtr;
+ interp->framePtr = interp->topFramePtr;
+ objPtr = Jim_GetVariable(interp, nameObjPtr, flags);
+ interp->framePtr = savedFramePtr;
+
+ return objPtr;
+}
+
Jim_Obj *Jim_GetVariableStr(Jim_Interp *interp, const char *name, int flags)
{
Jim_Obj *nameObjPtr, *varObjPtr;
@@ -8375,6 +8389,34 @@ int Jim_EvalGlobal(Jim_Interp *interp, const char *script)
return retval;
}
+int Jim_EvalObjBackground(Jim_Interp *interp, Jim_Obj *scriptObjPtr)
+{
+ 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) {
+ Jim_Obj *objv[2];
+
+ objv[0] = Jim_NewStringObj(interp, "bgerror", -1);
+ objv[1] = Jim_GetResult(interp);
+ Jim_IncrRefCount(objv[0]);
+ Jim_IncrRefCount(objv[1]);
+ if (Jim_EvalObjVector(interp, 2, objv) != JIM_OK) {
+ /* Report the error to stderr. */
+ fprintf(stderr, "Background error:\n");
+ Jim_PrintErrorMessage(interp);
+ }
+ Jim_DecrRefCount(interp, objv[0]);
+ Jim_DecrRefCount(interp, objv[1]);
+ }
+ return retval;
+}
+
int Jim_EvalFile(Jim_Interp *interp, const char *filename)
{
char *prg = NULL;
@@ -8662,6 +8704,7 @@ void JimRegisterCoreApi(Jim_Interp *interp)
JIM_REGISTER_API(EvalGlobal);
JIM_REGISTER_API(EvalFile);
JIM_REGISTER_API(EvalObj);
+ JIM_REGISTER_API(EvalObjBackground);
JIM_REGISTER_API(EvalObjVector);
JIM_REGISTER_API(InitHashTable);
JIM_REGISTER_API(ExpandHashTable);
@@ -8746,6 +8789,7 @@ void JimRegisterCoreApi(Jim_Interp *interp)
JIM_REGISTER_API(StrDup);
JIM_REGISTER_API(UnsetVariable);
JIM_REGISTER_API(GetVariableStr);
+ JIM_REGISTER_API(GetGlobalVariable);
JIM_REGISTER_API(GetGlobalVariableStr);
JIM_REGISTER_API(GetAssocData);
JIM_REGISTER_API(SetAssocData);
@@ -11622,9 +11666,9 @@ void Jim_PrintErrorMessage(Jim_Interp *interp)
{
int len, i;
- printf("Runtime error, file \"%s\", line %d:\n",
+ fprintf(stderr, "Runtime error, file \"%s\", line %d:\n",
interp->errorFileName, interp->errorLine);
- printf(" %s\n", Jim_GetString(interp->result, NULL));
+ fprintf(stderr, " %s\n", Jim_GetString(interp->result, NULL));
Jim_ListLength(interp, interp->stackTrace, &len);
for (i = 0; i < len; i+= 3) {
Jim_Obj *objPtr;
@@ -11638,7 +11682,7 @@ void Jim_PrintErrorMessage(Jim_Interp *interp)
Jim_ListIndex(interp, interp->stackTrace, i+2, &objPtr,
JIM_NONE);
line = Jim_GetString(objPtr, NULL);
- printf("In procedure '%s' called at file \"%s\", line %s\n",
+ fprintf(stderr, "In procedure '%s' called at file \"%s\", line %s\n",
proc, file, line);
}
}
@@ -11651,7 +11695,7 @@ int Jim_InteractivePrompt(Jim_Interp *interp)
printf("Welcome to Jim version %d.%d, "
"Copyright (c) 2005 Salvatore Sanfilippo\n",
JIM_VERSION / 100, JIM_VERSION % 100);
- printf("CVS ID: $Id: jim.c,v 1.161 2005/04/12 12:27:15 antirez Exp $\n");
+ printf("CVS ID: $Id: jim.c,v 1.162 2005/04/18 08:31:26 antirez Exp $\n");
Jim_SetVariableStrWithStr(interp, "jim_interactive", "1");
while (1) {
char buf[1024];