#pragma once // ------------------------------------------------------------------------ // standard library #include #include // TODO: remove dependency on malloc /* all libc functions we depend upon */ void *malloc(uintptr size); void *calloc(uintptr n, uintptr size); void *realloc(void *ptr, uintptr size); void free(void *ptr); noreturn void abort(void); /* must be included first */ #include #include #include #include /* no dependencies */ #include #include #include #include #include #include #include #include #include #include // ----------------------------------------------------------------------------- // variable arguments noreturn void ·failassert(const char *, const char *, int, const char *); #ifdef NDEBUG # define assert(x) (void)0; #else # define assert(x) ((void)((x) || (·failassert(#x, __FILE__, __LINE__, __func__),0))) #endif /* from plan9 libc */ #define ERRMAX 128 /* max length of error string */ #define SET(x) ((x)=0) #define USED(x) if(x){}else{} #ifdef __GNUC__ # if __GNUC__ >= 3 # undef USED # define USED(x) ((void)(x)) # endif #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; \ uint32 _argc; \ _args = &argv[0][1]; \ if(_args[0]=='-' && _args[1]==0){ \ argc--; argv++; break; \ } \ _argc = 0; \ while(*_args && (_args += utf8·decode(_args, &_argc)))\ switch(_argc) #define ARGEND SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc); #define ARGF() (_argt=_args, _args="",\ (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) #define EARGF(x) (_argt=_args, _args="",\ (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0))) #define ARGC() _argc