#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); /* basic os helpers */ int os·exists(byte *path, int flag); byte *os·dirname(byte *path); byte *os·basename(byte *path); int os·sep(void); /* io interfaces */ /* buffered i/o */ typedef struct io·Buffer io·Buffer; enum { bufio·size = 2*4096, bufio·ungets = 8, bufio·eof = -1, bufio·err = -2, bufio·nil = 1 << 0, bufio·rdr = 1 << 1, bufio·wtr = 1 << 2, bufio·end = 1 << 3, }; struct io·Buffer { int state; int runesize; void *h; union { io·Reader rdr; io·Writer wtr; }; vlong size; byte *beg, *pos, *end; byte buf[bufio·size + bufio·ungets]; }; int bufio·initreader(io·Buffer *buf, io·Reader rdr, void *h); void bufio·finireader(io·Buffer *buf); int bufio·getbyte(io·Buffer *buf); int bufio·ungetbyte(io·Buffer *buf, byte c); int bufio·read(io·Buffer *buf, int sz, int n, void *out);