ref: 0987d105600fc76ee3e0ebe92f13aa0128c2006e
dir: /util.c/
#include <u.h>
#include <libc.h>
#include <draw.h>
#include "dat.h"
#include "fns.h"
int debug;
enum{
Nvecinc = 32,
};
int
max(int a, int b)
{
return a > b ? a : b;
}
int
min(int a, int b)
{
return a < b ? a : b;
}
int
mobjfmt(Fmt *fmt)
{
Mobj *mo;
mo = va_arg(fmt->args, Mobj*);
if(mo == nil)
return fmtstrcpy(fmt, "[]");
return fmtprint(fmt, "[%s:%#p:%P]", mo->o->name, mo, mo->Point);
}
void
dprint(char *fmt, ...)
{
char s[256];
va_list arg;
if(!debug)
return;
va_start(arg, fmt);
vseprint(s, s+sizeof s, fmt, arg);
va_end(arg);
fprint(2, "%s", s);
}
void
clearvec(Vector *v)
{
if(v->p == nil)
return;
memset(v->p, 0, v->totsz);
v->firstempty = 0;
v->n = 0;
}
static void *
growvec(Vector *v, int n)
{
if(n < v->bufsz)
return (uchar *)v->p + n * v->elsz;
v->p = erealloc(v->p, v->totsz + Nvecinc * v->elsz, v->totsz);
v->bufsz += Nvecinc;
v->totsz += Nvecinc * v->elsz;
return (uchar *)v->p + n * v->elsz;
}
void
popsparsevec(Vector *v, int n)
{
assert(v != nil && v->elsz > 0 && n >= 0 && n < v->n);
memset((uchar *)v->p + n * v->elsz, 0, v->elsz);
if(n < v->firstempty)
v->firstempty = n;
}
/* assumes that zeroed element means empty; could fill with
* magic values instead */
void *
pushsparsevec(Vector *v, void *e)
{
int n;
uchar *p, *q;
assert(v != nil && v->elsz > 0);
n = v->firstempty;
p = growvec(v, n);
for(n++, q=p+v->elsz; n<v->n; n++, q+=v->elsz)
if(memcmp(p, q, v->elsz) == 0)
break;
v->firstempty = n;
memcpy(p, e, v->elsz);
v->n++;
return p;
}
void *
pushvec(Vector *v, void *e)
{
uchar *p;
assert(v != nil && v->elsz > 0);
p = growvec(v, v->n);
memcpy(p, e, v->elsz);
v->n++;
v->firstempty = v->n;
return p;
}
void *
newvec(Vector *v, int nel, int elsz)
{
assert(v != nil && elsz > 0);
v->elsz = elsz;
nel = nel + Nvecinc-1 & ~(Nvecinc-1);
v->bufsz = nel;
v->totsz = nel * elsz;
v->p = emalloc(v->totsz);
return v->p;
}
char *
estrdup(char *s)
{
if((s = strdup(s)) == nil)
sysfatal("estrdup: %r");
setmalloctag(s, getcallerpc(&s));
return s;
}
void *
erealloc(void *p, ulong n, ulong oldn)
{
if((p = realloc(p, n)) == nil)
sysfatal("realloc: %r");
setrealloctag(p, getcallerpc(&p));
if(n > oldn)
memset((uchar *)p + oldn, 0, n - oldn);
return p;
}
void *
emalloc(ulong n)
{
void *p;
if((p = mallocz(n, 1)) == nil)
sysfatal("emalloc: %r");
setmalloctag(p, getcallerpc(&n));
return p;
}
vlong
flen(int fd)
{
vlong l;
Dir *d;
if((d = dirfstat(fd)) == nil)
sysfatal("flen: %r");
l = d->length;
free(d);
return l;
}