1368c31abSDavid du Colombier #include "stdinc.h"
2368c31abSDavid du Colombier #include "dat.h"
3368c31abSDavid du Colombier #include "fns.h"
4368c31abSDavid du Colombier
5368c31abSDavid du Colombier int
namecmp(char * s,char * t)6368c31abSDavid du Colombier namecmp(char *s, char *t)
7368c31abSDavid du Colombier {
8368c31abSDavid du Colombier return strncmp(s, t, ANameSize);
9368c31abSDavid du Colombier }
10368c31abSDavid du Colombier
11368c31abSDavid du Colombier void
namecp(char * dst,char * src)12368c31abSDavid du Colombier namecp(char *dst, char *src)
13368c31abSDavid du Colombier {
14368c31abSDavid du Colombier strncpy(dst, src, ANameSize - 1);
15368c31abSDavid du Colombier dst[ANameSize - 1] = '\0';
16368c31abSDavid du Colombier }
17368c31abSDavid du Colombier
18368c31abSDavid du Colombier int
nameok(char * name)19368c31abSDavid du Colombier nameok(char *name)
20368c31abSDavid du Colombier {
21368c31abSDavid du Colombier char *t;
22368c31abSDavid du Colombier int c;
23368c31abSDavid du Colombier
24368c31abSDavid du Colombier if(name == nil)
25368c31abSDavid du Colombier return -1;
26368c31abSDavid du Colombier for(t = name; c = *t; t++)
27368c31abSDavid du Colombier if(t - name >= ANameSize
28368c31abSDavid du Colombier || c < ' ' || c >= 0x7f)
29368c31abSDavid du Colombier return -1;
30368c31abSDavid du Colombier return 0;
31368c31abSDavid du Colombier }
32368c31abSDavid du Colombier
33368c31abSDavid du Colombier int
stru32int(char * s,u32int * r)34368c31abSDavid du Colombier stru32int(char *s, u32int *r)
35368c31abSDavid du Colombier {
36368c31abSDavid du Colombier char *t;
37368c31abSDavid du Colombier u32int n, nn, m;
38368c31abSDavid du Colombier int c;
39368c31abSDavid du Colombier
40368c31abSDavid du Colombier m = TWID32 / 10;
41368c31abSDavid du Colombier n = 0;
42368c31abSDavid du Colombier for(t = s; ; t++){
43368c31abSDavid du Colombier c = *t;
44368c31abSDavid du Colombier if(c < '0' || c > '9')
45368c31abSDavid du Colombier break;
46368c31abSDavid du Colombier if(n > m)
47368c31abSDavid du Colombier return -1;
48368c31abSDavid du Colombier nn = n * 10 + c - '0';
49368c31abSDavid du Colombier if(nn < n)
50368c31abSDavid du Colombier return -1;
51368c31abSDavid du Colombier n = nn;
52368c31abSDavid du Colombier }
53368c31abSDavid du Colombier *r = n;
54368c31abSDavid du Colombier return s != t && *t == '\0';
55368c31abSDavid du Colombier }
56368c31abSDavid du Colombier
57368c31abSDavid du Colombier int
stru64int(char * s,u64int * r)58368c31abSDavid du Colombier stru64int(char *s, u64int *r)
59368c31abSDavid du Colombier {
60368c31abSDavid du Colombier char *t;
61368c31abSDavid du Colombier u64int n, nn, m;
62368c31abSDavid du Colombier int c;
63368c31abSDavid du Colombier
64368c31abSDavid du Colombier m = TWID64 / 10;
65368c31abSDavid du Colombier n = 0;
66368c31abSDavid du Colombier for(t = s; ; t++){
67368c31abSDavid du Colombier c = *t;
68368c31abSDavid du Colombier if(c < '0' || c > '9')
69368c31abSDavid du Colombier break;
70368c31abSDavid du Colombier if(n > m)
71368c31abSDavid du Colombier return -1;
72368c31abSDavid du Colombier nn = n * 10 + c - '0';
73368c31abSDavid du Colombier if(nn < n)
74368c31abSDavid du Colombier return -1;
75368c31abSDavid du Colombier n = nn;
76368c31abSDavid du Colombier }
77368c31abSDavid du Colombier *r = n;
78368c31abSDavid du Colombier return s != t && *t == '\0';
79368c31abSDavid du Colombier }
80368c31abSDavid du Colombier
81368c31abSDavid du Colombier int
vttypevalid(int type)82368c31abSDavid du Colombier vttypevalid(int type)
83368c31abSDavid du Colombier {
84368c31abSDavid du Colombier return type < VtMaxType;
85368c31abSDavid du Colombier }
86368c31abSDavid du Colombier
87368c31abSDavid du Colombier static char*
logit(int severity,char * fmt,va_list args)88368c31abSDavid du Colombier logit(int severity, char *fmt, va_list args)
89368c31abSDavid du Colombier {
90368c31abSDavid du Colombier char *s;
91368c31abSDavid du Colombier
92368c31abSDavid du Colombier s = vsmprint(fmt, args);
93368c31abSDavid du Colombier if(s == nil)
94368c31abSDavid du Colombier return nil;
95368c31abSDavid du Colombier if(severity != EOk){
96368c31abSDavid du Colombier if(argv0 == nil)
97368c31abSDavid du Colombier fprint(2, "%T %s: err %d: %s\n", argv0, severity, s);
98368c31abSDavid du Colombier else
99368c31abSDavid du Colombier fprint(2, "%T err %d: %s\n", severity, s);
100368c31abSDavid du Colombier }
101368c31abSDavid du Colombier return s;
102368c31abSDavid du Colombier }
103368c31abSDavid du Colombier
104368c31abSDavid du Colombier void
seterr(int severity,char * fmt,...)105368c31abSDavid du Colombier seterr(int severity, char *fmt, ...)
106368c31abSDavid du Colombier {
107368c31abSDavid du Colombier char *s;
108368c31abSDavid du Colombier va_list args;
109368c31abSDavid du Colombier
110368c31abSDavid du Colombier va_start(args, fmt);
111368c31abSDavid du Colombier s = logit(severity, fmt, args);
112368c31abSDavid du Colombier va_end(args);
113368c31abSDavid du Colombier if(s == nil)
114368c31abSDavid du Colombier werrstr("error setting error");
115368c31abSDavid du Colombier else{
116368c31abSDavid du Colombier werrstr("%s", s);
117368c31abSDavid du Colombier free(s);
118368c31abSDavid du Colombier }
119368c31abSDavid du Colombier }
120368c31abSDavid du Colombier
121368c31abSDavid du Colombier void
logerr(int severity,char * fmt,...)122368c31abSDavid du Colombier logerr(int severity, char *fmt, ...)
123368c31abSDavid du Colombier {
124368c31abSDavid du Colombier char *s;
125368c31abSDavid du Colombier va_list args;
126368c31abSDavid du Colombier
127368c31abSDavid du Colombier va_start(args, fmt);
128368c31abSDavid du Colombier s = logit(severity, fmt, args);
129368c31abSDavid du Colombier va_end(args);
130368c31abSDavid du Colombier free(s);
131368c31abSDavid du Colombier }
132368c31abSDavid du Colombier
133368c31abSDavid du Colombier u32int
now(void)134368c31abSDavid du Colombier now(void)
135368c31abSDavid du Colombier {
136368c31abSDavid du Colombier return time(nil);
137368c31abSDavid du Colombier }
138368c31abSDavid du Colombier
139368c31abSDavid du Colombier int abortonmem = 1;
140368c31abSDavid du Colombier
141368c31abSDavid du Colombier void *
emalloc(ulong n)142368c31abSDavid du Colombier emalloc(ulong n)
143368c31abSDavid du Colombier {
144368c31abSDavid du Colombier void *p;
145368c31abSDavid du Colombier
146368c31abSDavid du Colombier p = malloc(n);
147368c31abSDavid du Colombier if(p == nil){
148368c31abSDavid du Colombier if(abortonmem)
149368c31abSDavid du Colombier abort();
150368c31abSDavid du Colombier sysfatal("out of memory allocating %lud", n);
151368c31abSDavid du Colombier }
152368c31abSDavid du Colombier memset(p, 0xa5, n);
153368c31abSDavid du Colombier setmalloctag(p, getcallerpc(&n));
154*1f9fb570SDavid du Colombier if(0)print("emalloc %p-%p by %#p\n", p, (char*)p+n, getcallerpc(&n));
155368c31abSDavid du Colombier return p;
156368c31abSDavid du Colombier }
157368c31abSDavid du Colombier
158368c31abSDavid du Colombier void *
ezmalloc(ulong n)159368c31abSDavid du Colombier ezmalloc(ulong n)
160368c31abSDavid du Colombier {
161368c31abSDavid du Colombier void *p;
162368c31abSDavid du Colombier
163368c31abSDavid du Colombier p = malloc(n);
164368c31abSDavid du Colombier if(p == nil){
165368c31abSDavid du Colombier if(abortonmem)
166368c31abSDavid du Colombier abort();
167368c31abSDavid du Colombier sysfatal("out of memory allocating %lud", n);
168368c31abSDavid du Colombier }
169368c31abSDavid du Colombier memset(p, 0, n);
170368c31abSDavid du Colombier setmalloctag(p, getcallerpc(&n));
171*1f9fb570SDavid du Colombier if(0)print("ezmalloc %p-%p by %#p\n", p, (char*)p+n, getcallerpc(&n));
172368c31abSDavid du Colombier return p;
173368c31abSDavid du Colombier }
174368c31abSDavid du Colombier
175368c31abSDavid du Colombier void *
erealloc(void * p,ulong n)176368c31abSDavid du Colombier erealloc(void *p, ulong n)
177368c31abSDavid du Colombier {
178368c31abSDavid du Colombier p = realloc(p, n);
179368c31abSDavid du Colombier if(p == nil){
180368c31abSDavid du Colombier if(abortonmem)
181368c31abSDavid du Colombier abort();
182368c31abSDavid du Colombier sysfatal("out of memory allocating %lud", n);
183368c31abSDavid du Colombier }
184368c31abSDavid du Colombier setrealloctag(p, getcallerpc(&p));
185*1f9fb570SDavid du Colombier if(0)print("erealloc %p-%p by %#p\n", p, (char*)p+n, getcallerpc(&p));
186368c31abSDavid du Colombier return p;
187368c31abSDavid du Colombier }
188368c31abSDavid du Colombier
189368c31abSDavid du Colombier char *
estrdup(char * s)190368c31abSDavid du Colombier estrdup(char *s)
191368c31abSDavid du Colombier {
192368c31abSDavid du Colombier char *t;
193368c31abSDavid du Colombier int n;
194368c31abSDavid du Colombier
195368c31abSDavid du Colombier n = strlen(s) + 1;
196368c31abSDavid du Colombier t = emalloc(n);
197368c31abSDavid du Colombier memmove(t, s, n);
198368c31abSDavid du Colombier setmalloctag(t, getcallerpc(&s));
199*1f9fb570SDavid du Colombier if(0)print("estrdup %p-%p by %#p\n", t, (char*)t+n, getcallerpc(&s));
200368c31abSDavid du Colombier return t;
201368c31abSDavid du Colombier }
202368c31abSDavid du Colombier
203368c31abSDavid du Colombier /*
204368c31abSDavid du Colombier * return floor(log2(v))
205368c31abSDavid du Colombier */
206368c31abSDavid du Colombier int
u64log2(u64int v)207368c31abSDavid du Colombier u64log2(u64int v)
208368c31abSDavid du Colombier {
209368c31abSDavid du Colombier int i;
210368c31abSDavid du Colombier
211368c31abSDavid du Colombier for(i = 0; i < 64; i++)
212368c31abSDavid du Colombier if((v >> i) <= 1)
213368c31abSDavid du Colombier break;
214368c31abSDavid du Colombier return i;
215368c31abSDavid du Colombier }
216368c31abSDavid du Colombier
217368c31abSDavid du Colombier int
vtproc(void (* fn)(void *),void * arg)218368c31abSDavid du Colombier vtproc(void (*fn)(void*), void *arg)
219368c31abSDavid du Colombier {
220368c31abSDavid du Colombier proccreate(fn, arg, 256*1024);
221368c31abSDavid du Colombier return 0;
222368c31abSDavid du Colombier }
223368c31abSDavid du Colombier
224368c31abSDavid du Colombier int
ientryfmt(Fmt * fmt)225368c31abSDavid du Colombier ientryfmt(Fmt *fmt)
226368c31abSDavid du Colombier {
227368c31abSDavid du Colombier IEntry *ie;
228368c31abSDavid du Colombier
229368c31abSDavid du Colombier ie = va_arg(fmt->args, IEntry*);
230368c31abSDavid du Colombier return fmtprint(fmt, "%V %22lld %3d %5d %3d",
231368c31abSDavid du Colombier ie->score, ie->ia.addr, ie->ia.type, ie->ia.size, ie->ia.blocks);
232368c31abSDavid du Colombier }
233368c31abSDavid du Colombier
234368c31abSDavid du Colombier void
ventifmtinstall(void)235368c31abSDavid du Colombier ventifmtinstall(void)
236368c31abSDavid du Colombier {
237368c31abSDavid du Colombier fmtinstall('F', vtfcallfmt);
238368c31abSDavid du Colombier fmtinstall('H', encodefmt);
239368c31abSDavid du Colombier fmtinstall('I', ientryfmt);
240368c31abSDavid du Colombier fmtinstall('T', vttimefmt);
241368c31abSDavid du Colombier fmtinstall('V', vtscorefmt);
242368c31abSDavid du Colombier }
243368c31abSDavid du Colombier
244368c31abSDavid du Colombier uint
msec(void)245368c31abSDavid du Colombier msec(void)
246368c31abSDavid du Colombier {
247368c31abSDavid du Colombier return nsec()/1000000;
248368c31abSDavid du Colombier }
249368c31abSDavid du Colombier
250368c31abSDavid du Colombier uint
countbits(uint n)251368c31abSDavid du Colombier countbits(uint n)
252368c31abSDavid du Colombier {
253368c31abSDavid du Colombier n = (n&0x55555555)+((n>>1)&0x55555555);
254368c31abSDavid du Colombier n = (n&0x33333333)+((n>>2)&0x33333333);
255368c31abSDavid du Colombier n = (n&0x0F0F0F0F)+((n>>4)&0x0F0F0F0F);
256368c31abSDavid du Colombier n = (n&0x00FF00FF)+((n>>8)&0x00FF00FF);
257368c31abSDavid du Colombier n = (n&0x0000FFFF)+((n>>16)&0x0000FFFF);
258368c31abSDavid du Colombier return n;
259368c31abSDavid du Colombier }
260