aboutsummaryrefslogtreecommitdiff
path: root/src/base/io/init.c
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2021-12-04 14:10:21 -0800
committerNicholas Noll <nbnoll@eml.cc>2021-12-04 14:10:21 -0800
commit12e09f9f85ac48ff891adf92f3b2c9a5fea27273 (patch)
tree60051793885e9978dadf6672ef85cdda216676a2 /src/base/io/init.c
parentb80a3d28ce42be4fdec451f74620b10ee75219dc (diff)
Chore(REMOVE): finished deprecation of old io functions.
The old methods were simple wrappers of C standard library functions. We've moved (painfully) over to a new interface that allows for files to live on the stack. All users of the functionality are ported over.
Diffstat (limited to 'src/base/io/init.c')
-rw-r--r--src/base/io/init.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/base/io/init.c b/src/base/io/init.c
new file mode 100644
index 0000000..81b26c2
--- /dev/null
+++ b/src/base/io/init.c
@@ -0,0 +1,102 @@
+#include "internal.h"
+
+#define MAXHEADERS 20
+static io·Header *tracked[MAXHEADERS];
+static int doexit;
+
+static void
+untrackall(void *arg)
+{
+ int i;
+ io·Header *it;
+
+ for(i=0; i < MAXHEADERS; i++){
+ it = tracked[i];
+ if(it){
+ tracked[i] = nil;
+ io·flush(it);
+ }
+ }
+}
+
+static void
+untrack(io·Header *io)
+{
+ int i;
+
+ for(i=0; i<arrlen(tracked); i++){
+ if(tracked[i] == io)
+ tracked[i] = nil;
+ }
+}
+
+static void
+track(io·Header *io)
+{
+ int i;
+
+ untrack(io);
+ for(i=0; i<arrlen(tracked); i++){
+ if(!tracked[i]){
+ tracked[i] = io;
+ break;
+ }
+ }
+
+ if(!doexit){
+ doexit = 1;
+ rt·atexit(untrackall, nil);
+ }
+}
+
+int
+io·initcap(io·Header *io, int fd, int mode, int cap, uchar *buf)
+{
+ buf += io·BufUngets;
+ cap += io·BufUngets;
+
+ switch(mode & ~(sys·OCloseExec|sys·OTrunc)){
+ default:
+ /* fmt·fprint(2, "initcap: unknown mode %d\n" , mode); */
+ return io·BufErr;
+ case sys·ORead:
+ io->state = io·BufRdr;
+ io->olen = 0;
+ break;
+ case sys·OWrite:
+ track(io);
+ io->state = io·BufWtr;
+ io->olen = -cap;
+ break;
+ }
+
+ io->b = buf;
+ io->e = buf+cap;
+ io->g = io->e;
+ io->fd = fd;
+ io->cap = cap;
+ io->pos = io->runesz = io->flag = io->ilen = io->nread = 0;
+ return 0;
+}
+
+int
+io·init(io·Buffer *io, int fd, int mode)
+{
+ return io·initcap(header(io), fd, mode, io·BufLen + io·BufUngets, io->bytes);
+}
+
+int
+io·close(io·Header *io)
+{
+ int err;
+
+ untrack(io);
+
+ err = io·flush(io);
+ if(io->flag == io·BufMagic){
+ io->flag = 0;
+ if((err=sys·close(io->fd)))
+ return err;
+ }
+ return 0;
+}