diff options
author | Steve Bennett <steveb@workware.net.au> | 2022-06-14 22:18:00 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2024-08-28 11:35:37 +1000 |
commit | 9e87e77b5ca06664d4be47ede440b2932aaf6d34 (patch) | |
tree | 02e978c5cd730d2eb43e33d2634abe81438969c7 | |
parent | 1e832085a798d4e8b50347a7f2c16594a1449cd2 (diff) | |
download | jimtcl-tip424-exec.zip jimtcl-tip424-exec.tar.gz jimtcl-tip424-exec.tar.bz2 |
Jim_EvalFile: accept input from any readable filetip424-exec
It is no longer necessary to stat the file and read it all at once.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim.c | 55 |
1 files changed, 21 insertions, 34 deletions
@@ -3203,7 +3203,7 @@ static void JimSetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj *fileNameObj, int lineNumber) { JimPanic((Jim_IsShared(objPtr), "JimSetSourceInfo called with shared object")); - JimPanic((objPtr->typePtr != NULL, "JimSetSourceInfo called with typed object")); + Jim_FreeIntRep(interp, objPtr); Jim_IncrRefCount(fileNameObj); objPtr->internalRep.sourceValue.fileNameObj = fileNameObj; objPtr->internalRep.sourceValue.lineNumber = lineNumber; @@ -11673,51 +11673,38 @@ int Jim_EvalFileGlobal(Jim_Interp *interp, const char *filename) * Reads the text file contents into an object and returns with a zero ref count. * Returns NULL and sets an error if can't read the file. */ -static Jim_Obj *JimReadTextFile(Jim_Interp *interp, const char *filename) +int Jim_EvalFile(Jim_Interp *interp, const char *filename) { - jim_stat_t sb; - int fd; + FILE *fp; char *buf; + Jim_Obj *scriptObjPtr; + Jim_Obj *filenameObj, *oldFilenameObj; + int retcode = JIM_ERR; int readlen; +#define READ_BUF_SIZE 256 - if (Jim_Stat(filename, &sb) == -1 || (fd = open(filename, O_RDONLY | O_TEXT, 0666)) < 0) { + if ((fp = fopen(filename, "rt")) == NULL) { Jim_SetResultFormatted(interp, "couldn't read file \"%s\": %s", filename, strerror(errno)); - return NULL; - } - buf = Jim_Alloc(sb.st_size + 1); - readlen = read(fd, buf, sb.st_size); - close(fd); - if (readlen < 0) { - Jim_Free(buf); - Jim_SetResultFormatted(interp, "failed to load file \"%s\": %s", filename, strerror(errno)); - return NULL; + return JIM_ERR; } - else { - Jim_Obj *objPtr; - buf[readlen] = 0; - - objPtr = Jim_NewStringObjNoAlloc(interp, buf, readlen); + scriptObjPtr = Jim_NewStringObj(interp, NULL, 0); - return objPtr; + buf = Jim_Alloc(READ_BUF_SIZE); + while ((readlen = fread(buf, 1, READ_BUF_SIZE, fp)) > 0) { + Jim_AppendString(interp, scriptObjPtr, buf, readlen); } -} - - -int Jim_EvalFile(Jim_Interp *interp, const char *filename) -{ - Jim_Obj *filenameObj; - Jim_Obj *oldFilenameObj; - Jim_Obj *scriptObjPtr; - int retcode; - - scriptObjPtr = JimReadTextFile(interp, filename); - if (!scriptObjPtr) { - return JIM_ERR; + Jim_Free(buf); + if (ferror(fp)) { + fclose(fp); + Jim_SetResultFormatted(interp, "failed to load file \"%s\": %s", filename, strerror(errno)); + Jim_FreeNewObj(interp, scriptObjPtr); + return retcode; } + fclose(fp); + /* Convert the stringObjType to a sourceObjType with filename and line */ filenameObj = Jim_NewStringObj(interp, filename, -1); JimSetSourceInfo(interp, scriptObjPtr, filenameObj, 1); - oldFilenameObj = JimPushInterpObj(interp->currentFilenameObj, filenameObj); retcode = Jim_EvalObj(interp, scriptObjPtr); |