#pragma once 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, int 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, }; /* buffered i/o */ typedef struct io·Header io·Header; 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·Header { int state, fd, flag; int ilen; /* negative number of bytes at end of buffer */ int olen; /* number of bytes at start of buffer */ int nread; /* number of bytes after last readline */ int runesz; /* number of bytes of last getrune */ int cap; /* size of buffer */ intptr pos; /* position in file */ uchar *b,*g,*e; /* start, good bytes, end of byte pointers */ }; struct io·Buffer { io·Header; uchar bytes[io·BufLen+io·BufUngets]; }; int io·open(char *path, int flag, io·Buffer *io); int io·openfd(int fd, int flag, io·Buffer *io); int io·close(io·Header *io); int io·init(io·Buffer *io, int fd, int mode); int io·initcap(io·Header *io, int fd, int mode, int cap, uchar *buf); int io·flush(io·Header *io); intptr io·read(io·Header *io, intptr len, void *buf); void *io·readuntil(io·Header *io, int delim); void *io·readline(io·Header *io, int null); intptr io·write(io·Header *io, intptr len, void *buf); int io·getc(io·Header *io); rune io·getr(io·Header *io); int io·ungetc(io·Header *io); rune io·ungetr(io·Header *io); int io·seek(io·Header *io, intptr offset, int whence, intptr *pos); intptr io·offset(io·Header *io); int io·print(io·Header *io, char *fmt, ...); int io·vprint(io·Header *io, char *fmt, va_list args); /* 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);