aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2022-06-14 22:18:00 +1000
committerSteve Bennett <steveb@workware.net.au>2024-08-28 11:35:37 +1000
commit9e87e77b5ca06664d4be47ede440b2932aaf6d34 (patch)
tree02e978c5cd730d2eb43e33d2634abe81438969c7
parent1e832085a798d4e8b50347a7f2c16594a1449cd2 (diff)
downloadjimtcl-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.c55
1 files changed, 21 insertions, 34 deletions
diff --git a/jim.c b/jim.c
index fba53ac..cc382f1 100644
--- a/jim.c
+++ b/jim.c
@@ -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);