// Copyright 2012 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

typedef int bool;

// The Time unit is unspecified; we just need to
// be able to compare whether t1 is older than t2 with t1 < t2.
typedef long long Time;

#define nil ((void*)0)
#define nelem(x) (sizeof(x)/sizeof((x)[0]))
#define USED(x) ((void)(x))

// A Buf is a byte buffer, like Go's []byte.
typedef struct Buf Buf;
struct Buf
{
	char *p;
	int len;
	int cap;
};

// A Vec is a string vector, like Go's []string.
typedef struct Vec Vec;
struct Vec
{
	char **p;
	int len;
	int cap;
};

// Modes for run.
enum {
	CheckExit = 1,
};

// buf.c
bool	bequal(Buf *s, Buf *t);
void	bsubst(Buf *b, char *x, char *y);
void	bfree(Buf *b);
void	bgrow(Buf *b, int n);
void	binit(Buf *b);
char*	bpathf(Buf *b, char *fmt, ...);
char*	bprintf(Buf *b, char *fmt, ...);
void	bwritef(Buf *b, char *fmt, ...);
void	breset(Buf *b);
char*	bstr(Buf *b);
char*	btake(Buf *b);
void	bwrite(Buf *b, void *v, int n);
void	bwriteb(Buf *dst, Buf *src);
void	bwritestr(Buf *b, char *p);
void	bswap(Buf *b, Buf *b1);
void	vadd(Vec *v, char *p);
void	vcopy(Vec *dst, char **src, int n);
void	vfree(Vec *v);
void	vgrow(Vec *v, int n);
void	vinit(Vec *v);
void	vreset(Vec *v);
void	vuniq(Vec *v);
void	splitlines(Vec*, char*);
void	splitfields(Vec*, char*);

// build.c
extern char *goarch;
extern char *gobin;
extern char *gochar;
extern char *gohostarch;
extern char *gohostos;
extern char *goos;
extern char *goroot;
extern char *goroot_final;
extern char *goversion;
extern char *workdir;
extern char *tooldir;
extern char *slash;
extern bool rebuildall;

int	find(char*, char**, int);
void	init(void);
void	cmdbanner(int, char**);
void	cmdbootstrap(int, char**);
void	cmdclean(int, char**);
void	cmdenv(int, char**);
void	cmdinstall(int, char**);
void	cmdversion(int, char**);

// buildgc.c
void	gcopnames(char*, char*);
void	mkenam(char*, char*);

// buildruntime.c
void	mkzasm(char*, char*);
void	mkzgoarch(char*, char*);
void	mkzgoos(char*, char*);
void	mkzruntimedefs(char*, char*);
void	mkzversion(char*, char*);

// goc2c.c
void	goc2c(char*, char*);

// main.c
extern int vflag;
void	usage(void);
void	xmain(int argc, char **argv);

// portability layer (plan9.c, unix.c, windows.c)
bool	contains(char *p, char *sep);
void	fatal(char *msg, ...);
bool	hasprefix(char *p, char *prefix);
bool	hassuffix(char *p, char *suffix);
bool	isabs(char*);
bool	isdir(char *p);
bool	isfile(char *p);
char*	lastelem(char*);
Time	mtime(char*);
void	readfile(Buf*, char*);
void	run(Buf *b, char *dir, int mode, char *cmd, ...);
void	runv(Buf *b, char *dir, int mode, Vec *argv);
void	bgrunv(char *dir, int mode, Vec *argv);
void	bgwait(void);
bool	streq(char*, char*);
void	writefile(Buf*, char*, int);
void	xatexit(void (*f)(void));
void	xexit(int);
void	xfree(void*);
void	xgetenv(Buf *b, char *name);
void	xgetwd(Buf *b);
void*	xmalloc(int n);
void*	xmalloc(int);
int	xmemcmp(void*, void*, int);
void	xmemmove(void*, void*, int);
void	xmkdir(char *p);
void	xmkdirall(char*);
Time	xmtime(char *p);
void	xprintf(char*, ...);
void	xqsort(void*, int, int, int(*)(const void*, const void*));
void	xreaddir(Vec *dst, char *dir);
void*	xrealloc(void*, int);
void	xrealwd(Buf *b, char *path);
void	xremove(char *p);
void	xremoveall(char *p);
void	xsetenv(char*, char*);
int	xstrcmp(char*, char*);
char*	xstrdup(char *p);
int	xstrlen(char*);
char*	xstrrchr(char*, int);
char*	xstrstr(char*, char*);
char*	xworkdir(void);
