diff options
author | Steve Bennett <steveb@workware.net.au> | 2023-05-28 11:22:12 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2023-07-04 09:23:43 +1000 |
commit | 41f431f30cc6118ef982c6374914810cd07a8106 (patch) | |
tree | 036384d2c7e90a0236642ebf65686601c92656d5 /jim.c | |
parent | ad720049ec1ae3536d64fbb4c80a79e65ba5af39 (diff) | |
download | jimtcl-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.c | 62 |
1 files changed, 36 insertions, 26 deletions
@@ -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 |