diff options
Diffstat (limited to 'src/base')
-rw-r--r-- | src/base/bufio/flush.c | 36 | ||||
-rw-r--r-- | src/base/bufio/internal.h | 4 | ||||
-rw-r--r-- | src/base/bufio/open.c | 27 | ||||
-rw-r--r-- | src/base/bufio/read.c | 54 | ||||
-rw-r--r-- | src/base/bufio/rules.mk | 18 | ||||
-rw-r--r-- | src/base/bufio/seek.c | 57 | ||||
-rw-r--r-- | src/base/bufio/write.c | 40 | ||||
-rw-r--r-- | src/base/fs/walk.c | 11 | ||||
-rw-r--r-- | src/base/io/close.c | 7 | ||||
-rw-r--r-- | src/base/io/fd.c | 7 | ||||
-rw-r--r-- | src/base/io/flush.c | 33 | ||||
-rw-r--r-- | src/base/io/get.c | 7 | ||||
-rw-r--r-- | src/base/io/getc.c (renamed from src/base/bufio/getc.c) | 2 | ||||
-rw-r--r-- | src/base/io/getr.c (renamed from src/base/bufio/getr.c) | 8 | ||||
-rw-r--r-- | src/base/io/init.c (renamed from src/base/bufio/init.c) | 14 | ||||
-rw-r--r-- | src/base/io/interface.c | 70 | ||||
-rw-r--r-- | src/base/io/internal.h | 4 | ||||
-rw-r--r-- | src/base/io/offset.c (renamed from src/base/bufio/offset.c) | 2 | ||||
-rw-r--r-- | src/base/io/open.c | 27 | ||||
-rw-r--r-- | src/base/io/openfd.c (renamed from src/base/bufio/openfd.c) | 4 | ||||
-rw-r--r-- | src/base/io/print.c (renamed from src/base/bufio/print.c) | 4 | ||||
-rw-r--r-- | src/base/io/putbyte.c | 7 | ||||
-rw-r--r-- | src/base/io/putc.c (renamed from src/base/bufio/putc.c) | 4 | ||||
-rw-r--r-- | src/base/io/putstring.c | 7 | ||||
-rw-r--r-- | src/base/io/read.c | 53 | ||||
-rw-r--r-- | src/base/io/readline.c (renamed from src/base/bufio/readline.c) | 4 | ||||
-rw-r--r-- | src/base/io/readln.c | 12 | ||||
-rw-r--r-- | src/base/io/readuntil.c (renamed from src/base/bufio/readuntil.c) | 2 | ||||
-rw-r--r-- | src/base/io/rules.mk | 21 | ||||
-rw-r--r-- | src/base/io/seek.c | 54 | ||||
-rw-r--r-- | src/base/io/stat.c | 7 | ||||
-rw-r--r-- | src/base/io/tell.c | 7 | ||||
-rw-r--r-- | src/base/io/unget.c | 7 | ||||
-rw-r--r-- | src/base/io/ungetc.c (renamed from src/base/bufio/ungetc.c) | 2 | ||||
-rw-r--r-- | src/base/io/ungetr.c (renamed from src/base/bufio/ungetr.c) | 2 | ||||
-rw-r--r-- | src/base/io/vprint.c (renamed from src/base/bufio/vprint.c) | 4 | ||||
-rw-r--r-- | src/base/io/write.c | 39 | ||||
-rw-r--r-- | src/base/mmap/internal.h | 1 | ||||
-rw-r--r-- | src/base/mmap/mmap.c | 35 | ||||
-rw-r--r-- | src/base/rules.mk | 3 | ||||
-rw-r--r-- | src/base/string/itoa.c | 23 | ||||
-rw-r--r-- | src/base/string/rules.mk | 1 | ||||
-rw-r--r-- | src/base/utf/rules.mk | 9 | ||||
-rw-r--r-- | src/base/utf/vendor/common.c | 45 | ||||
-rw-r--r-- | src/base/utf/vendor/common.h | 5 | ||||
-rw-r--r-- | src/base/utf/vendor/mkgraphemedata.c | 1 | ||||
-rw-r--r-- | src/base/utf/vendor/mkrunetype.c | 43 | ||||
-rw-r--r-- | src/base/utf/vendor/mkrunewidth.c | 50 |
48 files changed, 352 insertions, 532 deletions
diff --git a/src/base/bufio/flush.c b/src/base/bufio/flush.c deleted file mode 100644 index 0974766..0000000 --- a/src/base/bufio/flush.c +++ /dev/null @@ -1,36 +0,0 @@ -#include "internal.h" - -int -bio·flush(io·Header *io) -{ - intptr ni, no; - - switch(io->state){ - case io·BufWtr: - if((ni = io->cap + io->olen)) - return 0; - - sys·write(io->fd, ni, io->b, &no); - - if(no!=ni){ - io->pos += ni; - io->olen = -io->cap; - return 0; - } - - io->state = io·BufNil; - io->olen = 0; - break; - - case io·BufEof: - io->state = io·BufRdr; - /* fallthrough */ - case io·BufRdr: - io->ilen = 0; - io->g = io->e; - return 0; - default: - ; - } - return io·BufEof; -} diff --git a/src/base/bufio/internal.h b/src/base/bufio/internal.h deleted file mode 100644 index a59e787..0000000 --- a/src/base/bufio/internal.h +++ /dev/null @@ -1,4 +0,0 @@ -#include <u.h> -#include <base.h> - -#define header(io) ((io·Header*)(io)) diff --git a/src/base/bufio/open.c b/src/base/bufio/open.c deleted file mode 100644 index 29ccae1..0000000 --- a/src/base/bufio/open.c +++ /dev/null @@ -1,27 +0,0 @@ -#include "internal.h" - -int -bio·open(char *path, int flag, io·Buffer *io) -{ - int fd; - switch(flag & ~(sys·OCloseExec|sys·OTrunc)){ - default: - fmt·fprint(2, "open: unknown flag %d\n", flag); - return 1; - - case sys·ORead: - if(sys·open(path, flag, 0, &fd)) - return 1; - break; - - case sys·OWrite: - if(sys·open(path, flag, 0666, &fd)) - return 1; - break; - } - if(bio·openfd(fd, flag, io)){ - sys·close(fd); - return 1; - } - return 0; -} diff --git a/src/base/bufio/read.c b/src/base/bufio/read.c deleted file mode 100644 index ad0275c..0000000 --- a/src/base/bufio/read.c +++ /dev/null @@ -1,54 +0,0 @@ -#include "internal.h" - -intptr -bio·read(io·Header *io, intptr len, void *buf) -{ - uchar *b; - intptr c0, c, nr, n, ic; - - b = buf; - c = len; - ic = io->ilen; // how many bytes we've read and not flushed - - while(c > 0){ - n = -ic; - if(n > c) - n = c; - if(n == 0){ - /* only continue if we are a file reader */ - if(io->state != io·BufRdr) - break; - - /* get more bytes */ - if(sys·read(io->fd, io->cap, io->b, &nr)){ - io->state = io·BufNil; - break; - } - - if(nr == 0){ - io->state = io·BufEnd; - break; - } - - /* shift bytes within buffer so they end at terminal */ - io->g = io->b; - io->pos += nr; - if(nr < io->cap){ - io->g = io->e-nr; - mem·move(io->g, io->b, nr); - } - ic -= nr; - continue; - } - /* move our read bytes into the caller's buffer */ - mem·move(b, io->e+ic, n); - c -= n; - ic += n; - b += n; - } - io->ilen = ic; - if(c == len && io->state == io·BufNil) - return -1; - - return len-c; -} diff --git a/src/base/bufio/rules.mk b/src/base/bufio/rules.mk deleted file mode 100644 index f367b8e..0000000 --- a/src/base/bufio/rules.mk +++ /dev/null @@ -1,18 +0,0 @@ -SRCS_$(d)+=\ - $(d)/bufio/flush.c\ - $(d)/bufio/getc.c\ - $(d)/bufio/getr.c\ - $(d)/bufio/init.c\ - $(d)/bufio/offset.c\ - $(d)/bufio/open.c\ - $(d)/bufio/openfd.c\ - $(d)/bufio/print.c\ - $(d)/bufio/putc.c\ - $(d)/bufio/read.c\ - $(d)/bufio/readline.c\ - $(d)/bufio/readuntil.c\ - $(d)/bufio/seek.c\ - $(d)/bufio/ungetc.c\ - $(d)/bufio/ungetr.c\ - $(d)/bufio/vprint.c\ - $(d)/bufio/write.c diff --git a/src/base/bufio/seek.c b/src/base/bufio/seek.c deleted file mode 100644 index 5d25173..0000000 --- a/src/base/bufio/seek.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "internal.h" - -int -bio·seek(io·Header *io, intptr offset, int whence, intptr *pos) -{ - intptr n,d,cap; - - switch(io->state){ - default: - fmt·fprint(2, "seek: unknown state %d\n", io->state); - return io·BufEof; - case io·BufEnd: - io->state = io·BufRdr; - io->ilen = 0; - io->g = io->e; - /* fallthrough */ - case io·BufRdr: - n = offset; - if(whence == sys·SeekCur){ - n += bio·offset(io); - whence = sys·SeekSet; - } - - /* can we seek inside our buffer */ - if(whence == sys·SeekSet){ - d = n - bio·offset(io); - cap = io->e - io->g; - if(-cap <= d && d <= cap){ - io->ilen += d; - if(d >= 0){ - if(io->ilen <= 0){ - *pos = n; - return 0; - } - }else{ - if(io->e - io->g >= -io->ilen){ - *pos = n; - return 0; - } - } - } - } - - /* nope, call the kernel to do it for us */ - sys·seek(io->fd, offset, whence, &n); - io->ilen = 0; - io->g = io->e; - break; - - case io·BufWtr: - bio·flush(io); - sys·seek(io->fd, offset, whence, &n); - break; - } - io->pos = *pos = n; - return 0; -} diff --git a/src/base/bufio/write.c b/src/base/bufio/write.c deleted file mode 100644 index 8b64055..0000000 --- a/src/base/bufio/write.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "internal.h" - -intptr -bio·write(io·Header *io, intptr len, void *buf) -{ - char *b; - intptr c, o, nw, n; - - b = buf; - c = len; - o = io->olen; - - while(c > 0){ - n = -o; - if(n > c) - n = c; - if(n == 0){ - if(io->state != io·BufWtr) - return io·BufEof; - switch(sys·write(io->fd, io->cap, io->b, &nw)){ - case 0: - if(nw != io->cap) goto error; - io->pos += nw; - o = -io->cap; - continue; - case sys·ErrorInterrupt: - io->state = io·BufNil; - /* fallthrough */ - default: error: - return io·BufEof; - } - } - mem·move(io->e+o, b, n); - o += n; - c -= n; - b += n; - } - io->olen = o; - return len-c; -} diff --git a/src/base/fs/walk.c b/src/base/fs/walk.c index 8842633..752791d 100644 --- a/src/base/fs/walk.c +++ b/src/base/fs/walk.c @@ -3,22 +3,19 @@ #define hash(k) ((int32)k.ino ^ (int32)k.dev) #define equal(k1, k2) (k1.ino == k2.ino && k1.dev == k2.dev) -static -int +static int morehistory(fs·History *h, int n) { SET_GROW(h, struct Key, n, hash, sys·Memory, nil); } -static -int +static int addentry(fs·History *h, struct Key key, int *err) { SET_PUT(h, key, hash, equal, morehistory, err); } -static -void +static void forget(fs·History *h) { if (!h) @@ -35,7 +32,7 @@ fs·walk(fs·Walker *fs) int new, fd, ofd, flags; fs·History *h; struct dirent *d; - io·Stat cwd; + struct stat cwd; struct fs·Entry *it; flags = 0; diff --git a/src/base/io/close.c b/src/base/io/close.c deleted file mode 100644 index 5a773cd..0000000 --- a/src/base/io/close.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "internal.h" - -int -io·close(io·Stream *s) -{ - return fclose(s); -} diff --git a/src/base/io/fd.c b/src/base/io/fd.c deleted file mode 100644 index ded1b02..0000000 --- a/src/base/io/fd.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "internal.h" - -int -io·fd(io·Stream *s) -{ - return fileno(s); -} diff --git a/src/base/io/flush.c b/src/base/io/flush.c index 0f1217a..ff970b4 100644 --- a/src/base/io/flush.c +++ b/src/base/io/flush.c @@ -1,7 +1,36 @@ #include "internal.h" int -io·flush(io·Stream *s) +io·flush(io·Header *io) { - return fflush(s); + intptr ni, no; + + switch(io->state){ + case io·BufWtr: + if((ni = io->cap + io->olen)) + return 0; + + sys·write(io->fd, ni, io->b, &no); + + if(no!=ni){ + io->pos += ni; + io->olen = -io->cap; + return 0; + } + + io->state = io·BufNil; + io->olen = 0; + break; + + case io·BufEof: + io->state = io·BufRdr; + /* fallthrough */ + case io·BufRdr: + io->ilen = 0; + io->g = io->e; + return 0; + default: + ; + } + return io·BufEof; } diff --git a/src/base/io/get.c b/src/base/io/get.c deleted file mode 100644 index d4e52f8..0000000 --- a/src/base/io/get.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "internal.h" - -byte -io·getbyte(io·Stream *s) -{ - return fgetc(s); -} diff --git a/src/base/bufio/getc.c b/src/base/io/getc.c index 264e01d..68e1772 100644 --- a/src/base/bufio/getc.c +++ b/src/base/io/getc.c @@ -1,7 +1,7 @@ #include "internal.h" int -bio·getc(io·Header *io) +io·getc(io·Header *io) { int i; intptr nr; diff --git a/src/base/bufio/getr.c b/src/base/io/getr.c index 579a387..01b0f45 100644 --- a/src/base/bufio/getr.c +++ b/src/base/io/getr.c @@ -1,13 +1,13 @@ #include "internal.h" rune -bio·getr(io·Header *io) +io·getr(io·Header *io) { int c, i; rune r; char buf[UTFmax]; - c = bio·getc(io); + c = io·getc(io); if(utf8·onebyte(c)){ io->runesz = 1; return c; @@ -15,14 +15,14 @@ bio·getr(io·Header *io) buf[0] = c; for(i=1;;){ - if((c = bio·getc(io))<0) + if((c = io·getc(io))<0) return c; buf[i++] = c; if(utf8·fullrune(buf, i)){ io->runesz = utf8·decode(buf, &r); while(i-- > io->runesz) - bio·ungetc(io); + io·ungetc(io); return r; } } diff --git a/src/base/bufio/init.c b/src/base/io/init.c index b6814e1..81b26c2 100644 --- a/src/base/bufio/init.c +++ b/src/base/io/init.c @@ -14,7 +14,7 @@ untrackall(void *arg) it = tracked[i]; if(it){ tracked[i] = nil; - bio·flush(it); + io·flush(it); } } } @@ -50,14 +50,14 @@ track(io·Header *io) } int -bio·initcap(io·Header *io, int fd, int mode, int cap, uchar *buf) +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); + /* fmt·fprint(2, "initcap: unknown mode %d\n" , mode); */ return io·BufErr; case sys·ORead: io->state = io·BufRdr; @@ -80,19 +80,19 @@ bio·initcap(io·Header *io, int fd, int mode, int cap, uchar *buf) } int -bio·init(io·Buffer *io, int fd, int mode) +io·init(io·Buffer *io, int fd, int mode) { - return bio·initcap(header(io), fd, mode, io·BufLen + io·BufUngets, io->bytes); + return io·initcap(header(io), fd, mode, io·BufLen + io·BufUngets, io->bytes); } int -bio·close(io·Header *io) +io·close(io·Header *io) { int err; untrack(io); - err = bio·flush(io); + err = io·flush(io); if(io->flag == io·BufMagic){ io->flag = 0; if((err=sys·close(io->fd))) diff --git a/src/base/io/interface.c b/src/base/io/interface.c deleted file mode 100644 index 80469bf..0000000 --- a/src/base/io/interface.c +++ /dev/null @@ -1,70 +0,0 @@ -#include "internal.h" - -static -int -·read(void *rdr, int size, int n, void *buf) -{ - return io·read((io·Stream *)rdr, size, n, buf); -} - -static -byte -·get(void *rdr) -{ - return io·getbyte((io·Stream *)rdr); -} - -static -int -·unget(void *rdr, byte c) -{ - return io·ungetbyte((io·Stream *)rdr, c); -} - -static -int -·write(void *wtr, int sz, int n, void *buf) -{ - return io·write((io·Stream *)wtr, sz, n, buf); -} - -static -int -·put(void *wtr, byte c) -{ - return io·putbyte((io·Stream *)wtr, c); -} - -static -int -·puts(void *wtr, string s) -{ - return io·putstring((io·Stream *)wtr, s); -} - -static -int -·seek(void *skr, long off, int whence) -{ - return io·seek((io·Stream *)skr, off, whence); -} - -static -long -·tell(void *skr) -{ - return io·tell((io·Stream *)skr); -} - -/* actual interfaces */ -io·Reader sys·Reader = (io·Reader){ ·read }; -io·Seeker sys·Seeker = (io·Seeker){ ·seek, ·tell }; -io·Peeker sys·Peeker = (io·Peeker){ ·get, ·unget }; -io·SeekReader sys·SeekReader = (io·SeekReader){ ·seek, ·tell, ·read }; -io·PeekReader sys·PeekReader = (io·PeekReader){ ·read, ·get, ·unget }; - -io·Writer sys·Writer = (io·Writer){ ·write }; -io·Putter sys·Putter = (io·Putter){ ·put, ·puts }; -io·PutWriter sys·PutWriter = (io·PutWriter){ ·write, ·put, ·puts }; - -io·ReadWriter sys·ReadWriter = (io·ReadWriter){ ·read, ·write }; diff --git a/src/base/io/internal.h b/src/base/io/internal.h index 302c035..a59e787 100644 --- a/src/base/io/internal.h +++ b/src/base/io/internal.h @@ -1,4 +1,4 @@ -#pragma once - #include <u.h> #include <base.h> + +#define header(io) ((io·Header*)(io)) diff --git a/src/base/bufio/offset.c b/src/base/io/offset.c index 15579c4..81ef994 100644 --- a/src/base/bufio/offset.c +++ b/src/base/io/offset.c @@ -1,7 +1,7 @@ #include "internal.h" intptr -bio·offset(io·Header *io) +io·offset(io·Header *io) { intptr n; switch(io->state){ diff --git a/src/base/io/open.c b/src/base/io/open.c index fe78255..ed0be92 100644 --- a/src/base/io/open.c +++ b/src/base/io/open.c @@ -1,7 +1,28 @@ #include "internal.h" -io·Stream* -io·open(byte *name, byte *mode) +int +io·open(char *path, int flag, io·Buffer *io) { - return fopen(name, mode); + int err,fd; + switch(flag & ~(sys·OCloseExec|sys·OTrunc)){ + default: + /* fmt·fprint(2, "open: unknown flag %d\n", flag); */ + return 1; + + case sys·ORead: + if((err=sys·open(path, flag, 0, &fd))) + return err; + break; + + case sys·OWrite: + if((err=sys·open(path, flag, 0666, &fd))) + return err; + break; + } + + if((err=io·openfd(fd, flag, io))){ + sys·close(fd); + return err; + } + return 0; } diff --git a/src/base/bufio/openfd.c b/src/base/io/openfd.c index 66ca967..db13413 100644 --- a/src/base/bufio/openfd.c +++ b/src/base/io/openfd.c @@ -1,10 +1,10 @@ #include "internal.h" int -bio·openfd(int fd, int flag, io·Buffer *io) +io·openfd(int fd, int flag, io·Buffer *io) { int err; - if((err=bio·init(io, fd, flag))) + if((err=io·init(io, fd, flag))) return err; io->flag = io·BufMagic; diff --git a/src/base/bufio/print.c b/src/base/io/print.c index 04a85f9..00d39d9 100644 --- a/src/base/bufio/print.c +++ b/src/base/io/print.c @@ -1,13 +1,13 @@ #include "internal.h" int -bio·print(io·Header *io, char *fmt, ...) +io·print(io·Header *io, char *fmt, ...) { int n; va_list args; va_start(args, fmt); - n = bio·vprint(io, fmt, args); + n = io·vprint(io, fmt, args); va_end(args); return n; diff --git a/src/base/io/putbyte.c b/src/base/io/putbyte.c deleted file mode 100644 index 2350a8d..0000000 --- a/src/base/io/putbyte.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "internal.h" - -int -io·putbyte(io·Stream *s, byte c) -{ - return fputc(c, s); -} diff --git a/src/base/bufio/putc.c b/src/base/io/putc.c index e91a1f1..167f10f 100644 --- a/src/base/bufio/putc.c +++ b/src/base/io/putc.c @@ -1,7 +1,7 @@ #include "internal.h" int -bio·putc(io·Header *io, int c) +io·putc(io·Header *io, int c) { intptr i; @@ -12,7 +12,7 @@ bio·putc(io·Header *io, int c) io->olen = i; return 0; } - if(bio·flush(io) == io·BufEof) + if(io·flush(io) == io·BufEof) break; } return io·BufEof; diff --git a/src/base/io/putstring.c b/src/base/io/putstring.c deleted file mode 100644 index 53fa993..0000000 --- a/src/base/io/putstring.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "internal.h" - -int -io·putstring(io·Stream *s, string str) -{ - return fputs(str, s); -} diff --git a/src/base/io/read.c b/src/base/io/read.c index b0ed3d2..d4f7bd9 100644 --- a/src/base/io/read.c +++ b/src/base/io/read.c @@ -1,7 +1,54 @@ #include "internal.h" -int -io·read(io·Stream *s, int sz, int n, void *buf) +intptr +io·read(io·Header *io, intptr len, void *buf) { - return fread(buf, sz, n, s); + uchar *b; + intptr c0, c, nr, n, ic; + + b = buf; + c = len; + ic = io->ilen; // how many bytes we've read and not flushed + + while(c > 0){ + n = -ic; + if(n > c) + n = c; + if(n == 0){ + /* only continue if we are a file reader */ + if(io->state != io·BufRdr) + break; + + /* get more bytes */ + if(sys·read(io->fd, io->cap, io->b, &nr)){ + io->state = io·BufNil; + break; + } + + if(nr == 0){ + io->state = io·BufEnd; + break; + } + + /* shift bytes within buffer so they end at terminal */ + io->g = io->b; + io->pos += nr; + if(nr < io->cap){ + io->g = io->e-nr; + mem·move(io->g, io->b, nr); + } + ic -= nr; + continue; + } + /* move our read bytes into the caller's buffer */ + mem·move(b, io->e+ic, n); + c -= n; + ic += n; + b += n; + } + io->ilen = ic; + if(c == len && io->state == io·BufNil) + return -1; + + return len-c; } diff --git a/src/base/bufio/readline.c b/src/base/io/readline.c index 0a50098..2be19db 100644 --- a/src/base/bufio/readline.c +++ b/src/base/io/readline.c @@ -1,9 +1,9 @@ #include "internal.h" void * -bio·readline(io·Header *io, int null) +io·readline(io·Header *io, int null) { - char *start = bio·readuntil(io, '\n'); + char *start = io·readuntil(io, '\n'); if(null && start) start[io->nread-1] = 0; diff --git a/src/base/io/readln.c b/src/base/io/readln.c deleted file mode 100644 index 283472d..0000000 --- a/src/base/io/readln.c +++ /dev/null @@ -1,12 +0,0 @@ -#include "internal.h" - -int -io·readln(io·Stream *s, int n, byte* buf) -{ - byte* b; - b = fgets(buf, n+1, s); - if(b == nil) - return -1; - - return strlen(buf); -} diff --git a/src/base/bufio/readuntil.c b/src/base/io/readuntil.c index 1a0faaf..d5c2ed6 100644 --- a/src/base/bufio/readuntil.c +++ b/src/base/io/readuntil.c @@ -1,7 +1,7 @@ #include "internal.h" void * -bio·readuntil(io·Header *io, int delim) +io·readuntil(io·Header *io, int delim) { char *b, *e; intptr i, j; diff --git a/src/base/io/rules.mk b/src/base/io/rules.mk index 124cd09..3a091be 100644 --- a/src/base/io/rules.mk +++ b/src/base/io/rules.mk @@ -1,15 +1,18 @@ SRCS_$(d)+=\ - $(d)/io/fd.c\ $(d)/io/flush.c\ - $(d)/io/interface.c\ + $(d)/io/getc.c\ + $(d)/io/getr.c\ + $(d)/io/init.c\ + $(d)/io/offset.c\ $(d)/io/open.c\ - $(d)/io/close.c\ - $(d)/io/putbyte.c\ - $(d)/io/putstring.c\ + $(d)/io/openfd.c\ + $(d)/io/print.c\ + $(d)/io/putc.c\ $(d)/io/read.c\ - $(d)/io/readln.c\ + $(d)/io/readline.c\ + $(d)/io/readuntil.c\ $(d)/io/seek.c\ - $(d)/io/stat.c\ - $(d)/io/tell.c\ - $(d)/io/unget.c\ + $(d)/io/ungetc.c\ + $(d)/io/ungetr.c\ + $(d)/io/vprint.c\ $(d)/io/write.c diff --git a/src/base/io/seek.c b/src/base/io/seek.c index 1be4ee7..4fa1aff 100644 --- a/src/base/io/seek.c +++ b/src/base/io/seek.c @@ -1,7 +1,57 @@ #include "internal.h" int -io·seek(io·Stream *s, long off, int whence) +io·seek(io·Header *io, intptr offset, int whence, intptr *pos) { - return fseek(s, off, whence); + intptr n,d,cap; + + switch(io->state){ + default: + fmt·fprint(2, "seek: unknown state %d\n", io->state); + return io·BufEof; + case io·BufEnd: + io->state = io·BufRdr; + io->ilen = 0; + io->g = io->e; + /* fallthrough */ + case io·BufRdr: + n = offset; + if(whence == sys·SeekCur){ + n += io·offset(io); + whence = sys·SeekSet; + } + + /* can we seek inside our buffer */ + if(whence == sys·SeekSet){ + d = n - io·offset(io); + cap = io->e - io->g; + if(-cap <= d && d <= cap){ + io->ilen += d; + if(d >= 0){ + if(io->ilen <= 0){ + *pos = n; + return 0; + } + }else{ + if(io->e - io->g >= -io->ilen){ + *pos = n; + return 0; + } + } + } + } + + /* nope, call the kernel to do it for us */ + sys·seek(io->fd, offset, whence, &n); + io->ilen = 0; + io->g = io->e; + break; + + case io·BufWtr: + io·flush(io); + sys·seek(io->fd, offset, whence, &n); + break; + } + io->pos = *pos = n; + return 0; } diff --git a/src/base/io/stat.c b/src/base/io/stat.c deleted file mode 100644 index 063ff8f..0000000 --- a/src/base/io/stat.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "internal.h" - -int -io·stat(io·Stream *s, io·Stat *buf) -{ - return fstat(fileno(s), buf); -} diff --git a/src/base/io/tell.c b/src/base/io/tell.c deleted file mode 100644 index 1c50439..0000000 --- a/src/base/io/tell.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "internal.h" - -long -io·tell(io·Stream *s) -{ - return ftell(s); -} diff --git a/src/base/io/unget.c b/src/base/io/unget.c deleted file mode 100644 index 5c37433..0000000 --- a/src/base/io/unget.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "internal.h" - -int -io·ungetbyte(io·Stream *s, byte c) -{ - return ungetc(c, s); -} diff --git a/src/base/bufio/ungetc.c b/src/base/io/ungetc.c index 70abbab..201ffd6 100644 --- a/src/base/bufio/ungetc.c +++ b/src/base/io/ungetc.c @@ -1,7 +1,7 @@ #include "internal.h" int -bio·ungetc(io·Header *io) +io·ungetc(io·Header *io) { if(io->state == io·BufEnd) io->state = io·BufRdr; diff --git a/src/base/bufio/ungetr.c b/src/base/io/ungetr.c index 8abdc39..c0b8e9d 100644 --- a/src/base/bufio/ungetr.c +++ b/src/base/io/ungetr.c @@ -1,7 +1,7 @@ #include "internal.h" rune -bio·ungetr(io·Header *io) +io·ungetr(io·Header *io) { if(io->state == io·BufEnd) io->state = io·BufRdr; diff --git a/src/base/bufio/vprint.c b/src/base/io/vprint.c index 70be6bf..6fa446e 100644 --- a/src/base/bufio/vprint.c +++ b/src/base/io/vprint.c @@ -5,7 +5,7 @@ flush(fmt·State *fmt) { io·Header *io = fmt->file; io->olen = fmt->buffer.cur - fmt->buffer.end; - if(bio·flush(io)) + if(io·flush(io)) return 0; fmt->buffer.end = (char*)io->e; @@ -14,7 +14,7 @@ flush(fmt·State *fmt) } int -bio·vprint(io·Header *io, char *fmt, va_list args) +io·vprint(io·Header *io, char *fmt, va_list args) { int n; fmt·State f; diff --git a/src/base/io/write.c b/src/base/io/write.c index 63df664..2f37200 100644 --- a/src/base/io/write.c +++ b/src/base/io/write.c @@ -1,7 +1,40 @@ #include "internal.h" -int -io·write(io·Stream *s, int sz, int n, void *buf) +intptr +io·write(io·Header *io, intptr len, void *buf) { - return fwrite(buf, sz, n, s); + char *b; + intptr c, o, nw, n; + + b = buf; + c = len; + o = io->olen; + + while(c > 0){ + n = -o; + if(n > c) + n = c; + if(n == 0){ + if(io->state != io·BufWtr) + return io·BufEof; + switch(sys·write(io->fd, io->cap, io->b, &nw)){ + case 0: + if(nw != io->cap) goto error; + io->pos += nw; + o = -io->cap; + continue; + case sys·ErrorInterrupt: + io->state = io·BufNil; + /* fallthrough */ + default: error: + return io·BufEof; + } + } + mem·move(io->e+o, b, n); + o += n; + c -= n; + b += n; + } + io->olen = o; + return len-c; } diff --git a/src/base/mmap/internal.h b/src/base/mmap/internal.h index 7606c7e..302c035 100644 --- a/src/base/mmap/internal.h +++ b/src/base/mmap/internal.h @@ -2,4 +2,3 @@ #include <u.h> #include <base.h> -#include <sys/mman.h> diff --git a/src/base/mmap/mmap.c b/src/base/mmap/mmap.c index e5cedbb..c3709d7 100644 --- a/src/base/mmap/mmap.c +++ b/src/base/mmap/mmap.c @@ -3,37 +3,36 @@ mmap·Reader mmap·open(byte *filename) { - int fd; int err; void *buf; - io·Stream *s; - io·Stat st; + io·Buffer io; + sys·Info info; + mmap·Reader rdr = {0}; - s = io·open(filename, "r"); - fd = io·fd(s); - err = io·stat(s, &st); - if(err){ + if(io·open(filename, sys·ORead, &io)){ + errorf("failed to open %s", filename); + goto done; + } + + if(sys·infofd(io.fd, &info)){ errorf("file stat: error code %d", err); - goto ERROR; + goto done; } - buf = mmap(nil, st.st_size, PROT_READ, MAP_SHARED, fd, 0); - if(!buf){ + if(sys·mmap(nil, info.size, sys·ProtRead, sys·MapShared, io.fd, 0, &buf)){ errorf("mmap: failed"); - goto ERROR; + goto done; } // NOTE: posix systems require that reference kept to mmap file after fd is closed - io·close(s); - return (mmap·Reader){.len=st.st_size, .b=buf}; - -ERROR: - io·close(s); - return (mmap·Reader){ 0 }; + rdr = (mmap·Reader){.len=info.size, .b=buf}; +done: + io·close((io·Header*)&io); + return rdr; } int mmap·close(mmap·Reader rdr) { - munmap(rdr.b, rdr.len); + sys·munmap(rdr.b, rdr.len); return 0; } diff --git a/src/base/rules.mk b/src/base/rules.mk index 64f0797..0fefead 100644 --- a/src/base/rules.mk +++ b/src/base/rules.mk @@ -6,14 +6,13 @@ include share/push.mk SRCS_$(d):=\ $(d)/arg.c -include $(d)/bufio/rules.mk +include $(d)/io/rules.mk include $(d)/coro/rules.mk include $(d)/error/rules.mk include $(d)/flate/rules.mk include $(d)/fmt/rules.mk include $(d)/fs/rules.mk include $(d)/gz/rules.mk -include $(d)/io/rules.mk include $(d)/mem/rules.mk include $(d)/mmap/rules.mk include $(d)/os/rules.mk diff --git a/src/base/string/itoa.c b/src/base/string/itoa.c new file mode 100644 index 0000000..a2910f4 --- /dev/null +++ b/src/base/string/itoa.c @@ -0,0 +1,23 @@ +#include "internal.h" + +static char * +kernel(char *s, int x) +{ + if(x/10) + s = kernel(s, x/10); + *s++ = x%10 + '0'; + return s; +} + +char * +str·itoa(char *s, int x) +{ + if(x<0){ + *s++ = '-'; + x=-x; + } + s = kernel(s, x); + *s = '0'; + + return s; +} diff --git a/src/base/string/rules.mk b/src/base/string/rules.mk index 0352f54..5fa6c5e 100644 --- a/src/base/string/rules.mk +++ b/src/base/string/rules.mk @@ -1,5 +1,6 @@ SRCS_$(d)+=\ $(d)/string/atoi.c\ + $(d)/string/itoa.c\ $(d)/string/append.c\ $(d)/string/appendf.c\ $(d)/string/clear.c\ diff --git a/src/base/utf/rules.mk b/src/base/utf/rules.mk index dfe2da1..554ba6a 100644 --- a/src/base/utf/rules.mk +++ b/src/base/utf/rules.mk @@ -20,9 +20,14 @@ NEED_OBJS=\ $(OBJ_DIR)/base/arg.o\ $(OBJ_DIR)/base/utf/decode.o\ $(OBJ_DIR)/base/error/panicf.o\ - $(OBJ_DIR)/base/io/readln.o\ + $(OBJ_DIR)/base/io/readline.o\ + $(OBJ_DIR)/base/io/readuntil.o\ $(OBJ_DIR)/base/io/open.o\ - $(OBJ_DIR)/base/io/close.o\ + $(OBJ_DIR)/base/io/openfd.o\ + $(OBJ_DIR)/base/io/flush.o\ + $(OBJ_DIR)/base/io/init.o\ + $(OBJ_DIR)/base/mem/move.o\ + $(OBJ_DIR)/base/mem/findc.o\ $(d)/utf/vendor/common.o $(d)/utf/vendor/common.o: $(d)/utf/vendor/common.c diff --git a/src/base/utf/vendor/common.c b/src/base/utf/vendor/common.c index fcf1177..c35d022 100644 --- a/src/base/utf/vendor/common.c +++ b/src/base/utf/vendor/common.c @@ -4,36 +4,32 @@ // input functions int -parse(io·Stream *io, int nfield, char **field, int len, char *line) +parse(io·Buffer *io, int nfield, char field[][FieldLen]) { int n; - if((n=io·readln(io, len, line)) <= 0) - return ParseEOF; - - if(n == len) - panicf("line too long"); - - if(line[n-1] != '\n') - panicf("invalid line: expected '\n', found '%c'", line[n]); + char *b, *e; - line[n-1] = 0; + if(!(b=io·readline((io·Header*)io,1))) + return ParseEOF; - if(line[0] == '#' || line[0] == 0) + if(b[0] == '#' || b[0] == 0) return ParseSkip; /* tokenize line into fields */ n = 0; - field[n] = line; - while(*line){ - if(*line == ';'){ - *line = 0; - field[++n] = line+1; - } - line++; + e = b; + while(*e){ + if(*e == ';'){ + *e = 0; + strcpy(field[n++], b); + b = ++e; + }else + ++e; } + strcpy(field[n++], b); - if(n != nfield-1) - panicf("expected %d number of fields, got %d: %s", nfield, n, line); + if(n != nfield) + panicf("expected %d number of fields, got %d: %s", nfield, n, b); return ParseOK; } @@ -58,10 +54,10 @@ codepoint(char *s) } void -codepointrange(io·Stream *utf8, char *field[NumFields], int *start, int *stop) +codepointrange(io·Buffer *utf8, char field[NumFields][FieldLen], int *start, int *stop) { int e, c; - char *other[NumFields], line[1024]; + char other[NumFields][FieldLen]; // XXX: the stop variable passes in the previous stopping character e = *stop; @@ -74,7 +70,7 @@ codepointrange(io·Stream *utf8, char *field[NumFields], int *start, int *stop) e = c; if(strstr(field[Fname], ", First>") != nil){ - if(!parse(utf8, arrlen(other), other, arrlen(line), line)) + if(!parse(utf8, arrlen(other), other)) panicf("range start at end of file"); if(strstr(other[Fname], ", Last>") == nil) panicf("range start not followed by range end"); @@ -101,8 +97,7 @@ putsearch(void) "#include <u.h>\n" "#include <base/utf.h>\n" "\n" - "static\n" - "rune*\n" + "static rune*\n" "rangesearch(rune c, rune *t, int n, int ne)\n" "{\n" " rune *p;\n" diff --git a/src/base/utf/vendor/common.h b/src/base/utf/vendor/common.h index 51a53bd..95d7eaf 100644 --- a/src/base/utf/vendor/common.h +++ b/src/base/utf/vendor/common.h @@ -25,6 +25,7 @@ enum NumFields, NumRunes = 1 << 21, }; +#define FieldLen 128 /* input functions */ enum @@ -34,9 +35,9 @@ enum ParseSkip, }; -int parse(io·Stream *io, int nfield, char **field, int len, char *line); +int parse(io·Buffer *io, int nfield, char field[][FieldLen]); int codepoint(char *s); -void codepointrange(io·Stream *utf8, char *field[NumFields], int *start, int *stop); +void codepointrange(io·Buffer *utf8, char field[NumFields][FieldLen], int *start, int *stop); /* output functions */ void putsearch(void); diff --git a/src/base/utf/vendor/mkgraphemedata.c b/src/base/utf/vendor/mkgraphemedata.c index ce5a952..1d2394f 100644 --- a/src/base/utf/vendor/mkgraphemedata.c +++ b/src/base/utf/vendor/mkgraphemedata.c @@ -1,6 +1,5 @@ #include <u.h> #include <base.h> -#include <libutf.h> // ----------------------------------------------------------------------- // main point of entry diff --git a/src/base/utf/vendor/mkrunetype.c b/src/base/utf/vendor/mkrunetype.c index b33df32..3d75ce8 100644 --- a/src/base/utf/vendor/mkrunetype.c +++ b/src/base/utf/vendor/mkrunetype.c @@ -34,8 +34,7 @@ static struct Table table; // ----------------------------------------------------------------------- // internal functions -static -int +static int isrange(char *label, char *prop, int force) { char ident[128]; @@ -45,8 +44,7 @@ isrange(char *label, char *prop, int force) return putrange(ident, prop, force); } -static -int +static int ispair(char *label, char *prop) { char ident[128]; @@ -56,8 +54,7 @@ ispair(char *label, char *prop) return putpair(ident, prop); } -static -int +static int issingle(char *label, char *prop) { char ident[128]; @@ -67,8 +64,7 @@ issingle(char *label, char *prop) return putsingle(ident, prop); } -static -void +static void makeis(char *label, char *table, int pairs, int onlyranges) { int hasr, hasp=0, hass=0; @@ -116,8 +112,7 @@ makeis(char *label, char *table, int pairs, int onlyranges) "\n"); } -static -int +static int torange(char *label, int *index, int force) { int l, r, d, start = 0; @@ -154,8 +149,7 @@ torange(char *label, int *index, int force) return start; } -static -int +static int topair(char *label, int *index) { int l, r, d, start = 0; @@ -193,8 +187,7 @@ topair(char *label, int *index) return start; } -static -int +static int tosingle(char *label, int *index) { int i, d, start = 0; @@ -220,8 +213,7 @@ tosingle(char *label, int *index) return start; } -static -void +static void mkto(char *label, int *index, int pairs, int onlyrange) { int hasr, hasp=0, hass=0; @@ -272,8 +264,7 @@ mkto(char *label, int *index, int pairs, int onlyrange) // ----------------------------------------------------------------------- // main point of entry -static -void +static void usage(void) { fprintf(stderr, "usage: mkrunetype <UnicodeData.txt>\n"); @@ -283,9 +274,9 @@ usage(void) int main(int argc, char *argv[]) { - int i, sc, c, ec; - io·Stream *utf8; - char *prop, *field[NumFields], line[1024]; + int i, sc, c, ec, err; + static io·Buffer utf8; + char *prop, field[NumFields][FieldLen]; ARGBEGIN{ }ARGEND; @@ -293,8 +284,8 @@ main(int argc, char *argv[]) if(argc != 1) usage(); - if(!(utf8 = io·open(argv[0], "r"))) - panicf("can't open %s\n", argv[0]); + if((err=io·open(argv[0], sys·ORead, &utf8))) + panicf("can't open %s: %d: %s\n", argv[0], err, strerror(err)); /* by default each character maps to itself */ for(i = 0; i < NumRunes; i++) { @@ -313,9 +304,9 @@ main(int argc, char *argv[]) ec = -1; // NOTE: we don't check for comments here: assume UnicodeData.txt doesn't have any - while(parse(utf8, arrlen(field), field, arrlen(line), line)){ + while(parse(&utf8, arrlen(field), field)){ /* parse unicode range */ - codepointrange(utf8, field, &sc, &ec); + codepointrange(&utf8, field, &sc, &ec); prop = field[Fcategory]; for(c = sc; c <= ec; c++){ @@ -370,7 +361,7 @@ main(int argc, char *argv[]) table.totitle[c] = codepoint(field[Ftitle]); } } - io·close(utf8); + io·close((io·Header *)&utf8); putsearch(); diff --git a/src/base/utf/vendor/mkrunewidth.c b/src/base/utf/vendor/mkrunewidth.c index 14e6973..c911b66 100644 --- a/src/base/utf/vendor/mkrunewidth.c +++ b/src/base/utf/vendor/mkrunewidth.c @@ -30,21 +30,20 @@ static struct Table table; // ----------------------------------------------------------------------- // internal functions -static -void +static void parse_category(char *path) { int sc, c, ec, w; - io·Stream *utf8; - char *prop, *field[NumFields], line[1024]; + static io·Buffer utf8; + char *prop, field[NumFields][FieldLen]; - if(!(utf8 = io·open(path, "r"))) + if(io·open(path, sys·ORead, &utf8)) panicf("can't open %s\n", path); // NOTE: we don't check for comments here ec = -1; - while(parse(utf8, arrlen(field), field, arrlen(line), line)){ - codepointrange(utf8, field, &sc, &ec); + while(parse(&utf8, arrlen(field), field)){ + codepointrange(&utf8, field, &sc, &ec); prop = field[Fcategory]; @@ -86,11 +85,10 @@ parse_category(char *path) table.width[w][c] = 1; } - io·close(utf8); + io·close((io·Header *)&utf8); } -static -void +static void coderange(char *field, int *l, int *r) { char *s; @@ -104,17 +102,18 @@ coderange(char *field, int *l, int *r) } } -static -void +static void parse_eawidths(char *path) { int at, w; int l, c, r; - io·Stream *utf8; - char *field[2], line[1024]; + static io·Buffer utf8; + char field[2][FieldLen]; - utf8 = io·open(path, "r"); - while((at=parse(utf8, arrlen(field), field, arrlen(line), line)) != ParseEOF){ + if(io·open(path, sys·ORead, &utf8)) + panicf("can't open %s\n", path); + + while((at=parse(&utf8, arrlen(field), field)) != ParseEOF){ if(at == ParseSkip) continue; @@ -142,20 +141,21 @@ parse_eawidths(char *path) table.width[(w+2)%3][c] = 0; } } - io·close(utf8); + io·close((io·Header*)&utf8); } -static -void +static void parse_emoji(char *path) { int at, w; int l, c, r; - io·Stream *utf8; - char *s, *field[2], line[1024]; + static io·Buffer utf8; + char *s, field[2][FieldLen]; - utf8 = io·open(path, "r"); - while((at=parse(utf8, arrlen(field), field, arrlen(line), line)) != ParseEOF){ + if(io·open(path, sys·ORead, &utf8)) + panicf("can't open %s\n", path); + + while((at=parse(&utf8, arrlen(field), field)) != ParseEOF){ if(at == ParseSkip) continue; @@ -178,7 +178,7 @@ parse_emoji(char *path) } } - io·close(utf8); + io·close((io·Header*)&utf8); } /* output functions */ @@ -322,4 +322,6 @@ main(int argc, char *argv[]) " return 0;\n" "}" ); + + return 0; } |