From 425ef692da7e74112f88f0b368f3286dba84f846 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Thu, 18 Jun 2020 19:45:40 -0700 Subject: feat: working parser for rc shell language --- include/libn.h | 56 ++++++++++++++++++++++++++++++++++++++++++++------------ include/u.h | 5 +++-- 2 files changed, 47 insertions(+), 14 deletions(-) (limited to 'include') 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; @@ -299,6 +299,37 @@ typedef struct mmap·Reader 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); diff --git a/include/u.h b/include/u.h index 617e41b..3cf3c7b 100644 --- a/include/u.h +++ b/include/u.h @@ -59,5 +59,6 @@ typedef int error; #define arrlen(Array) (sizeof(Array) / sizeof((Array)[0])) #define arrend(Array) ((Array) + arrlen(Array)) -#define MAX(x, y) ((x) >= (y) ? (x) : (y)) -#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#define MAX(x, y) (((x) > (y)) ? (x) : (y)) +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) +#define CLAMP(x, lo, hi) (((x) < (lo)) ? (lo) : (((x) > (hi)) ? (hi) : (x))) -- cgit v1.2.1