#ifndef _LIBC_H_
#define _LIBC_H_ 1
#if defined(__cplusplus)
extern "C" {
#endif
#include <utf.h>
#include <fmt.h>
#ifndef nil
#define nil ((void*)0)
#endif
#define nelem(x) (sizeof(x)/sizeof((x)[0]))
#ifndef offsetof
#define offsetof(s, m) (ulong)(&(((s*)0)->m))
#endif
extern char* strecpy(char*, char*, char*);
extern int tokenize(char*, char**, int);
extern double p9cputime(void);
#ifndef NOPLAN9DEFINES
#define cputime p9cputime
#endif
enum
{
PNPROC = 1,
PNGROUP = 2
};
int isInf(double, int);
extern int p9atoi(char*);
extern long p9atol(char*);
extern vlong p9atoll(char*);
extern double fmtcharstod(int(*)(void*), void*);
extern char* cleanname(char*);
extern int exitcode(char*);
extern void exits(char*);
extern double frexp(double, int*);
extern char* p9getenv(char*);
extern int p9putenv(char*, char*);
extern int getfields(char*, char**, int, int, char*);
extern int gettokens(char *, char **, int, char *);
extern char* p9getwd(char*, int);
extern void p9longjmp(p9jmp_buf, int);
extern void p9notejmp(void*, p9jmp_buf, int);
extern void perror(const char*);
extern int postnote(int, int, char *);
extern double p9pow10(int);
extern char* p9ctime(long);
#define p9setjmp(b) sigsetjmp((void*)(b), 1)
extern void sysfatal(char*, ...);
#ifndef NOPLAN9DEFINES
#define atoi p9atoi
#define atol p9atol
#define atoll p9atoll
#define getenv p9getenv
#define getwd p9getwd
#define longjmp p9longjmp
#undef setjmp
#define setjmp p9setjmp
#define putenv p9putenv
#define notejmp p9notejmp
#define jmp_buf p9jmp_buf
#define pow10 p9pow10
#undef strtod
#define strtod fmtstrtod
#define charstod fmtcharstod
#define ctime p9ctime
#endif
#define STATMAX 65535U
#define DIRMAX (sizeof(Dir)+STATMAX)
#define ERRMAX 128
#define MORDER 0x0003
#define MREPL 0x0000
#define MBEFORE 0x0001
#define MAFTER 0x0002
#define MCREATE 0x0004
#define MCACHE 0x0010
#define MMASK 0x0017
#define OREAD 0
#define OWRITE 1
#define ORDWR 2
#define OEXEC 3
#define OTRUNC 16
#define ORCLOSE 64
#define ODIRECT 128
#define OEXCL 0x1000
#define OAPPEND 0x4000
#define AEXIST 0
#define AEXEC 1
#define AWRITE 2
#define AREAD 4
#define SG_RONLY 0040
#define SG_CEXEC 0100
#define NCONT 0
#define NDFLT 1
#define NSAVE 2
#define NRSTR 3
#define QTDIR 0x80
#define QTAPPEND 0x40
#define QTEXCL 0x20
#define QTMOUNT 0x10
#define QTAUTH 0x08
#define QTTMP 0x04
#define QTSYMLINK 0x02
#define QTFILE 0x00
#define DMDIR 0x80000000
#define DMAPPEND 0x40000000
#define DMEXCL 0x20000000
#define DMMOUNT 0x10000000
#define DMAUTH 0x08000000
#define DMTMP 0x04000000
#define DMSYMLINK 0x02000000
#define DMDEVICE 0x00800000
#define DMNAMEDPIPE 0x00200000
#define DMSOCKET 0x00100000
#define DMSETUID 0x00080000
#define DMSETGID 0x00040000
#define DMREAD 0x4
#define DMWRITE 0x2
#define DMEXEC 0x1
#ifdef RFMEM
#undef RFFDG
#undef RFNOTEG
#undef RFPROC
#undef RFMEM
#undef RFNOWAIT
#undef RFCFDG
#undef RFNAMEG
#undef RFENVG
#undef RFCENVG
#undef RFCFDG
#undef RFCNAMEG
#endif
enum
{
RFNAMEG = (1<<0),
RFENVG = (1<<1),
RFFDG = (1<<2),
RFNOTEG = (1<<3),
RFPROC = (1<<4),
RFMEM = (1<<5),
RFNOWAIT = (1<<6),
RFCNAMEG = (1<<10),
RFCENVG = (1<<11),
RFCFDG = (1<<12)
};
typedef
struct Qid
{
uvlong path;
ulong vers;
uchar type;
} Qid;
typedef
struct Dir {
ushort type;
uint dev;
Qid qid;
ulong mode;
ulong atime;
ulong mtime;
vlong length;
char *name;
char *uid;
char *gid;
char *muid;
uint uidnum;
uint gidnum;
uint muidnum;
char *ext;
} Dir;
typedef
struct Waitmsg
{
int pid;
ulong time[3];
char *msg;
} Waitmsg;
extern void _exits(char*);
extern void abort(void);
extern long p9alarm(ulong);
extern int await(char*, int);
extern int awaitfor(int, char*, int);
extern int awaitnohang(char*, int);
extern int p9chdir(char*);
extern int close(int);
extern int p9create(char*, int, ulong);
extern int p9dup(int, int);
extern int errstr(char*, uint);
extern int p9exec(char*, char*[]);
extern int p9execl(char*, ...);
extern int p9rfork(int);
extern int noted(int);
extern int notify(void(*)(void*, char*));
extern int noteenable(char*);
extern int notedisable(char*);
extern int notifyon(char*);
extern int notifyoff(char*);
extern int p9open(char*, int);
extern int fd2path(int, char*, int);
extern long readn(int, void*, long);
extern int remove(const char*);
extern vlong p9seek(int, vlong, int);
extern int p9sleep(long);
extern Waitmsg* p9wait(void);
extern Waitmsg* p9waitfor(int);
extern Waitmsg* waitnohang(void);
extern int p9waitpid(void);
extern ulong rendezvous(ulong, ulong);
extern char* getgoos(void);
extern char* getgoarch(void);
extern char* getgoroot(void);
extern char* getgoversion(void);
extern char* getgoarm(void);
extern char* getgo386(void);
extern char* getgoextlinkenabled(void);
extern char* mktempdir(void);
extern void removeall(char*);
extern int runcmd(char**);
extern void flagcount(char*, char*, int*);
extern void flagint32(char*, char*, int32*);
extern void flagint64(char*, char*, int64*);
extern void flagstr(char*, char*, char**);
extern void flagparse(int*, char***, void (*usage)(void));
extern void flagfn0(char*, char*, void(*fn)(void));
extern void flagfn1(char*, char*, void(*fn)(char*));
extern void flagfn2(char*, char*, void(*fn)(char*, char*));
extern void flagprint(int);
#ifdef _WIN32
#if !defined(_WIN64) && !defined(__MINGW64_VERSION_MAJOR)
struct timespec {
int tv_sec;
long tv_nsec;
};
#define execv(prog, argv) execv(prog, (const char* const*)(argv))
#define execvp(prog, argv) execvp(prog, (const char**)(argv))
#endif
extern int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
extern int fork(void);
extern int pread(int fd, void *buf, int n, int off);
extern int pwrite(int fd, void *buf, int n, int off);
#undef getwd
#define getwd(s, ns) getcwd(s, ns)
#undef lseek
#define lseek(fd, n, base) _lseeki64(fd, n, base)
#define mkdir(path, perm) mkdir(path)
#define pipe(fd) _pipe(fd, 512, O_BINARY)
#else
#define O_BINARY 0
#endif
#ifndef NOPLAN9DEFINES
#define alarm p9alarm
#define dup p9dup
#define exec p9exec
#define execl p9execl
#define seek p9seek
#define sleep p9sleep
#define wait p9wait
#define waitpid p9waitpid
#define rfork p9rfork
#define create p9create
#undef open
#define open p9open
#define waitfor p9waitfor
#endif
extern Dir* dirstat(char*);
extern Dir* dirfstat(int);
extern int dirwstat(char*, Dir*);
extern int dirfwstat(int, Dir*);
extern void nulldir(Dir*);
extern long dirreadall(int, Dir**);
extern void rerrstr(char*, uint);
extern char* sysname(void);
extern void werrstr(char*, ...);
extern char* getns(void);
extern char* get9root(void);
extern char* unsharp(char*);
#ifndef NOPLAN9DEFINES
#define main p9main
#endif
#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;
extern void __fixargv0(void);
#define ARGBEGIN for((void)(argv0?0:(argv0=(__fixargv0(),*argv))),argv++,argc--;\
argv[0] && argv[0][0]=='-' && argv[0][1];\
argc--, argv++) {\
char *_args, *_argt;\
Rune _argc;\
_args = &argv[0][1];\
if(_args[0]=='-' && _args[1]==0){\
argc--; argv++; break;\
}\
_argc = 0;\
while(*_args && (_args += chartorune(&_argc, _args)))\
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
#if defined(__cplusplus)
}
#endif
#endif