aboutsummaryrefslogtreecommitdiff
path: root/src/base
diff options
context:
space:
mode:
Diffstat (limited to 'src/base')
-rw-r--r--src/base/bufio/flush.c36
-rw-r--r--src/base/bufio/internal.h4
-rw-r--r--src/base/bufio/open.c27
-rw-r--r--src/base/bufio/read.c54
-rw-r--r--src/base/bufio/rules.mk18
-rw-r--r--src/base/bufio/seek.c57
-rw-r--r--src/base/bufio/write.c40
-rw-r--r--src/base/fs/walk.c11
-rw-r--r--src/base/io/close.c7
-rw-r--r--src/base/io/fd.c7
-rw-r--r--src/base/io/flush.c33
-rw-r--r--src/base/io/get.c7
-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.c70
-rw-r--r--src/base/io/internal.h4
-rw-r--r--src/base/io/offset.c (renamed from src/base/bufio/offset.c)2
-rw-r--r--src/base/io/open.c27
-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.c7
-rw-r--r--src/base/io/putc.c (renamed from src/base/bufio/putc.c)4
-rw-r--r--src/base/io/putstring.c7
-rw-r--r--src/base/io/read.c53
-rw-r--r--src/base/io/readline.c (renamed from src/base/bufio/readline.c)4
-rw-r--r--src/base/io/readln.c12
-rw-r--r--src/base/io/readuntil.c (renamed from src/base/bufio/readuntil.c)2
-rw-r--r--src/base/io/rules.mk21
-rw-r--r--src/base/io/seek.c54
-rw-r--r--src/base/io/stat.c7
-rw-r--r--src/base/io/tell.c7
-rw-r--r--src/base/io/unget.c7
-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.c39
-rw-r--r--src/base/mmap/internal.h1
-rw-r--r--src/base/mmap/mmap.c35
-rw-r--r--src/base/rules.mk3
-rw-r--r--src/base/string/itoa.c23
-rw-r--r--src/base/string/rules.mk1
-rw-r--r--src/base/utf/rules.mk9
-rw-r--r--src/base/utf/vendor/common.c45
-rw-r--r--src/base/utf/vendor/common.h5
-rw-r--r--src/base/utf/vendor/mkgraphemedata.c1
-rw-r--r--src/base/utf/vendor/mkrunetype.c43
-rw-r--r--src/base/utf/vendor/mkrunewidth.c50
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;
}