#include <u.h>
#include <libc.h>
#include <bio.h>
#include <mach.h>
#include "dat.h"

static int nwarn;

void
warn(char *fmt, ...)
{
	va_list arg;

	if(++nwarn < 5){
		va_start(arg, fmt);
		fprint(2, "warning: ");
		vfprint(2, fmt, arg);
		fprint(2, "\n");
		va_end(arg);
	}else if(nwarn == 5)
		fprint(2, "[additional warnings elided...]\n");
}

void*
erealloc(void *v, uint n)
{
	v = realloc(v, n);
	if(v == nil)
		sysfatal("realloc: %r");
	return v;
}

void*
emalloc(uint n)
{
	void *v;

	v = mallocz(n, 1);
	if(v == nil)
		sysfatal("malloc: %r");
	return v;
}

char*
estrdup(char *s)
{
	s = strdup(s);
	if(s == nil)
		sysfatal("strdup: %r");
	return s;
}

TypeList*
mktl(Type *hd, TypeList *tail)
{
	TypeList *tl;

	tl = emalloc(sizeof(*tl));
	tl->hd = hd;
	tl->tl = tail;
	return tl;
}

static int isBfrog[256];

int
Bfmt(Fmt *fmt)
{
	int i;
	char *s, *t;
	
	if(!isBfrog['.']){
		for(i=0; i<256; i++)
			if(i != '_' && i != '$' && i < Runeself && !isalnum(i))
				isBfrog[i] = 1;
	}

	s = va_arg(fmt->args, char*);
	for(t=s; *t; t++){
		if(isBfrog[(uchar)*t]){
			if(*t == ':' && *(t+1) == ':'){
				t++;
				continue;
			}
			goto encode;
		}
	}
	return fmtstrcpy(fmt, s);

encode:
	return fmtprint(fmt, "`%s`", s);
}
