#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); | |
} |