aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2023-05-28 11:22:12 +1000
committerSteve Bennett <steveb@workware.net.au>2023-07-04 09:23:43 +1000
commit41f431f30cc6118ef982c6374914810cd07a8106 (patch)
tree036384d2c7e90a0236642ebf65686601c92656d5 /jim.c
parentad720049ec1ae3536d64fbb4c80a79e65ba5af39 (diff)
downloadjimtcl-41f431f30cc6118ef982c6374914810cd07a8106.zip
jimtcl-41f431f30cc6118ef982c6374914810cd07a8106.tar.gz
jimtcl-41f431f30cc6118ef982c6374914810cd07a8106.tar.bz2
aio: change to use unix io, not stdio
This changes especially makes buffered I/O work with non-blocking channels. - separate read and write buffering - support for timeout on blocking read - read/write on same channel in event loop with buffering - read buffer is the same across read, gets, copyto - autoflush non-blocking writes via event loop - copyto can now copy to any filehandle-like command - add some copyto tests Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c62
1 files changed, 36 insertions, 26 deletions
diff --git a/jim.c b/jim.c
index 908cc31..0e21f29 100644
--- a/jim.c
+++ b/jim.c
@@ -11539,39 +11539,52 @@ int Jim_EvalFileGlobal(Jim_Interp *interp, const char *filename)
}
#include <sys/stat.h>
+#include "jimiocompat.h"
-int Jim_EvalFile(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)
{
- FILE *fp;
+ jim_stat_t sb;
+ int fd;
char *buf;
- Jim_Obj *scriptObjPtr;
- struct stat sb;
- int retcode;
int readlen;
- if (stat(filename, &sb) != 0 || (fp = fopen(filename, "rt")) == NULL) {
+ if (Jim_Stat(filename, &sb) == -1 || (fd = open(filename, O_RDONLY | O_TEXT, 0666)) < 0) {
Jim_SetResultFormatted(interp, "couldn't read file \"%s\": %s", filename, strerror(errno));
- return JIM_ERR;
- }
- if (sb.st_size == 0) {
- fclose(fp);
- return JIM_OK;
+ return NULL;
}
-
buf = Jim_Alloc(sb.st_size + 1);
- readlen = fread(buf, 1, sb.st_size, fp);
- if (ferror(fp)) {
- fclose(fp);
+ 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 JIM_ERR;
+ return NULL;
+ }
+ else {
+ Jim_Obj *objPtr;
+ buf[readlen] = 0;
+
+ objPtr = Jim_NewStringObjNoAlloc(interp, buf, readlen);
+
+ return objPtr;
}
- fclose(fp);
- buf[readlen] = 0;
+}
+
+
+int Jim_EvalFile(Jim_Interp *interp, const char *filename)
+{
+ Jim_Obj *scriptObjPtr;
+ int retcode;
- scriptObjPtr = Jim_NewStringObjNoAlloc(interp, buf, readlen);
+ scriptObjPtr = JimReadTextFile(interp, filename);
+ if (!scriptObjPtr) {
+ return JIM_ERR;
+ }
JimSetSourceInfo(interp, scriptObjPtr, Jim_NewStringObj(interp, filename, -1), 1);
- Jim_IncrRefCount(scriptObjPtr);
retcode = Jim_EvalObj(interp, scriptObjPtr);
@@ -11584,8 +11597,6 @@ int Jim_EvalFile(Jim_Interp *interp, const char *filename)
}
}
- Jim_DecrRefCount(interp, scriptObjPtr);
-
return retcode;
}
@@ -11806,7 +11817,7 @@ static void JimCommandMatch(Jim_Interp *interp, Jim_Obj *listObjPtr,
Jim_IncrRefCount(keyObj);
- if (type != JIM_CMDLIST_CHANNELS || Jim_AioFilehandle(interp, keyObj)) {
+ if (type != JIM_CMDLIST_CHANNELS || Jim_AioFilehandle(interp, keyObj) >= 0) {
int match = 1;
if (patternObj) {
int plen, slen;
@@ -16677,10 +16688,9 @@ int Jim_PackageProvide(Jim_Interp *interp, const char *name, const char *ver, in
}
#endif
#ifndef jim_ext_aio
-FILE *Jim_AioFilehandle(Jim_Interp *interp, Jim_Obj *fhObj)
+int Jim_AioFilehandle(Jim_Interp *interp, Jim_Obj *fhObj)
{
- Jim_SetResultString(interp, "aio not enabled", -1);
- return NULL;
+ return -1;
}
#endif