#pragma once enum SeekPos { seek·cur = SEEK_CUR, seek·set = SEEK_SET, seek·end = SEEK_END }; typedef struct io·Reader { int (*read)(void*, int sz, int n, void *buf); } io·Reader; extern io·Reader sys·Reader; typedef struct io·Peeker { byte (*get)(void*); int (*unget)(void*, byte); } io·Peeker; extern io·Peeker sys·Peeker; typedef struct io·Seeker { int (*seek)(void *skr, long off, enum SeekPos whence); long (*tell)(void *skr); } io·Seeker; extern io·Seeker sys·Seeker; typedef struct io·SeekReader { io·Seeker; io·Reader; } io·SeekReader; extern io·SeekReader sys·SeekReader; typedef struct io·PeekReader { io·Reader; io·Peeker; } io·PeekReader; extern io·PeekReader sys·PeekReader; typedef struct io·Writer { int (*write)(void*, int sz, int n, void *buf); } io·Writer; extern io·Writer sys·Writer; typedef struct io·Putter { int (*put) (void*, byte); int (*puts)(void*, string); } io·Putter; extern io·Putter sys·Putter; typedef struct io·PutWriter { io·Writer; io·Putter; } io·PutWriter; extern io·PutWriter sys·PutWriter; typedef struct io·ReadWriter { io·Reader; io·Writer; } io·ReadWriter; extern io·ReadWriter sys·ReadWriter; /* XXX: change casing */ enum { ReadOK = R_OK, WriteOK = W_OK, ExecOK = X_OK, }; /* XXX(deprecated): file handling */ typedef FILE io·Stream; typedef struct stat io·Stat; io·Stream *io·open(byte *name, byte *mode); int io·fd(io·Stream *s); int io·stat(io·Stream *s, io·Stat *buf); int io·close(io·Stream *s); byte io·getbyte(io·Stream *s); int io·ungetbyte(io·Stream *s, byte c); int io·read(io·Stream *s, int sz, int n, void *buf); int io·readln(io·Stream *s, int n, byte *buf); int io·putbyte(io·Stream *s, byte c); int io·putstring(io·Stream *s, string str); int io·write(io·Stream *s, int sz, int n, void *buf); int io·flush(io·Stream *s); int io·seek(io·Stream *s, long off, enum SeekPos whence); long io·tell(io·Stream *s); /* buffered i/o */ typedef struct io·Buffer io·Buffer; #define iota(x) (1 << (x)) enum { io·BufEof = -1, io·BufErr = -2, io·BufUngets = 8, io·BufMagic = 0x314159, io·BufLen = 2*4096, /* state */ io·BufNil = iota(0), io·BufRdr = iota(1), io·BufWtr = iota(2), io·BufEnd = iota(3) }; #undef iota struct io·Buffer { int state, id, flag; struct{ int in; /* negative number of bytes at end */ int out; /* number of bytes at start */ int line; /* number of bytes after last readline */ } off; intptr pos, cap; /* position in file, capacity of buffer */ uchar *b,*g,*e; /* start, good bytes, end of byte pointers */ uchar bytes[]; }; int bio·init(io·Buffer *io, int fd, int mode); int bio·initcap(io·Buffer *io, int fd, int mode, int cap); /* basic os helpers */ /* XXX: find a better location for this */ int os·exists(byte *path, int flag); byte *os·dirname(byte *path); byte *os·basename(byte *path); int os·sep(void);