diff options
Diffstat (limited to 'include/libn.h')
-rw-r--r-- | include/libn.h | 56 |
1 files changed, 44 insertions, 12 deletions
diff --git a/include/libn.h b/include/libn.h index f30a761..81ddc9f 100644 --- a/include/libn.h +++ b/include/libn.h @@ -100,7 +100,7 @@ uintptr coro·yield(Coro *c, uintptr arg); error coro·free(Coro *c); // ----------------------------------------------------------------------------- -// Strings +// strings typedef byte* string; @@ -161,7 +161,7 @@ int utf8·isspace(rune r); int utf8·istitle(rune r); // ----------------------------------------------------------------------------- -// I/O +// i/o typedef FILE Stream; typedef struct stat io·Stat; @@ -300,6 +300,37 @@ mmap·Reader mmap·open(byte *name); error mmap·close(mmap·Reader rdr); // ----------------------------------------------------------------------------- +// filesystem + +#define iota(x) 1 << (x) +enum +{ + fs·preorder = iota(0), + fs·nolinks = iota(1), + fs·verbose = iota(2), +}; +#undef iota + +typedef struct fs·Walker fs·Walker; +typedef struct fs·History fs·History; + +struct fs·Walker +{ + int fd, lev, max, err; + uchar flags : 4; + fs·History *hist; + struct { + void *data; + void (*func)(void *data, char *relp, char *absp, io·Stat* info); + }; + char *base, *end, path[4096]; +}; + +int fs·init(fs·Walker *, char *path); +void fs·fini(fs·Walker *); +void fs·walk(fs·Walker *); + +// ----------------------------------------------------------------------------- // libflate // NOTE: Experimental! @@ -339,6 +370,7 @@ vlong gz·seek(gz·Stream *s, long off, enum SeekPos whence); // ----------------------------------------------------------------------------- // error handling functions +void exits(char *s); void errorf(byte* fmt, ...); void verrorf(byte* fmt, va_list args); void panicf(byte *fmt, ...); @@ -389,16 +421,16 @@ uint64 rng·randi(int max); #endif extern char *argv0; -#define ARGBEGIN for((argv0?0:(argv0=*argv)),argv++,argc--;\ - argv[0] && argv[0][0]=='-' && argv[0][1];\ - argc--, argv++) {\ - byte *_args, *_argt;\ - rune _argc;\ - _args = &argv[0][1];\ - if(_args[0]=='-' && _args[1]==0){\ - argc--; argv++; break;\ - }\ - _argc = 0;\ +#define ARGBEGIN for((argv0?0:(argv0=*argv)),argv++,argc--; \ + argv[0] && argv[0][0]=='-' && argv[0][1]; \ + argc--, argv++) { \ + byte *_args, *_argt; \ + rune _argc; \ + _args = &argv[0][1]; \ + if(_args[0]=='-' && _args[1]==0){ \ + argc--; argv++; break; \ + } \ + _argc = 0; \ while(*_args && (_args += utf8·bytetorune(&_argc, _args)))\ switch(_argc) #define ARGEND SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc); |