xref: /plan9/sys/src/cmd/venti/srv/utils.c (revision 368c31ab13393dea083228fdd1c3445076f83a4b)
1*368c31abSDavid du Colombier #include "stdinc.h"
2*368c31abSDavid du Colombier #include "dat.h"
3*368c31abSDavid du Colombier #include "fns.h"
4*368c31abSDavid du Colombier 
5*368c31abSDavid du Colombier int
6*368c31abSDavid du Colombier namecmp(char *s, char *t)
7*368c31abSDavid du Colombier {
8*368c31abSDavid du Colombier 	return strncmp(s, t, ANameSize);
9*368c31abSDavid du Colombier }
10*368c31abSDavid du Colombier 
11*368c31abSDavid du Colombier void
12*368c31abSDavid du Colombier namecp(char *dst, char *src)
13*368c31abSDavid du Colombier {
14*368c31abSDavid du Colombier 	strncpy(dst, src, ANameSize - 1);
15*368c31abSDavid du Colombier 	dst[ANameSize - 1] = '\0';
16*368c31abSDavid du Colombier }
17*368c31abSDavid du Colombier 
18*368c31abSDavid du Colombier int
19*368c31abSDavid du Colombier nameok(char *name)
20*368c31abSDavid du Colombier {
21*368c31abSDavid du Colombier 	char *t;
22*368c31abSDavid du Colombier 	int c;
23*368c31abSDavid du Colombier 
24*368c31abSDavid du Colombier 	if(name == nil)
25*368c31abSDavid du Colombier 		return -1;
26*368c31abSDavid du Colombier 	for(t = name; c = *t; t++)
27*368c31abSDavid du Colombier 		if(t - name >= ANameSize
28*368c31abSDavid du Colombier 		|| c < ' ' || c >= 0x7f)
29*368c31abSDavid du Colombier 			return -1;
30*368c31abSDavid du Colombier 	return 0;
31*368c31abSDavid du Colombier }
32*368c31abSDavid du Colombier 
33*368c31abSDavid du Colombier int
34*368c31abSDavid du Colombier stru32int(char *s, u32int *r)
35*368c31abSDavid du Colombier {
36*368c31abSDavid du Colombier 	char *t;
37*368c31abSDavid du Colombier 	u32int n, nn, m;
38*368c31abSDavid du Colombier 	int c;
39*368c31abSDavid du Colombier 
40*368c31abSDavid du Colombier 	m = TWID32 / 10;
41*368c31abSDavid du Colombier 	n = 0;
42*368c31abSDavid du Colombier 	for(t = s; ; t++){
43*368c31abSDavid du Colombier 		c = *t;
44*368c31abSDavid du Colombier 		if(c < '0' || c > '9')
45*368c31abSDavid du Colombier 			break;
46*368c31abSDavid du Colombier 		if(n > m)
47*368c31abSDavid du Colombier 			return -1;
48*368c31abSDavid du Colombier 		nn = n * 10 + c - '0';
49*368c31abSDavid du Colombier 		if(nn < n)
50*368c31abSDavid du Colombier 			return -1;
51*368c31abSDavid du Colombier 		n = nn;
52*368c31abSDavid du Colombier 	}
53*368c31abSDavid du Colombier 	*r = n;
54*368c31abSDavid du Colombier 	return s != t && *t == '\0';
55*368c31abSDavid du Colombier }
56*368c31abSDavid du Colombier 
57*368c31abSDavid du Colombier int
58*368c31abSDavid du Colombier stru64int(char *s, u64int *r)
59*368c31abSDavid du Colombier {
60*368c31abSDavid du Colombier 	char *t;
61*368c31abSDavid du Colombier 	u64int n, nn, m;
62*368c31abSDavid du Colombier 	int c;
63*368c31abSDavid du Colombier 
64*368c31abSDavid du Colombier 	m = TWID64 / 10;
65*368c31abSDavid du Colombier 	n = 0;
66*368c31abSDavid du Colombier 	for(t = s; ; t++){
67*368c31abSDavid du Colombier 		c = *t;
68*368c31abSDavid du Colombier 		if(c < '0' || c > '9')
69*368c31abSDavid du Colombier 			break;
70*368c31abSDavid du Colombier 		if(n > m)
71*368c31abSDavid du Colombier 			return -1;
72*368c31abSDavid du Colombier 		nn = n * 10 + c - '0';
73*368c31abSDavid du Colombier 		if(nn < n)
74*368c31abSDavid du Colombier 			return -1;
75*368c31abSDavid du Colombier 		n = nn;
76*368c31abSDavid du Colombier 	}
77*368c31abSDavid du Colombier 	*r = n;
78*368c31abSDavid du Colombier 	return s != t && *t == '\0';
79*368c31abSDavid du Colombier }
80*368c31abSDavid du Colombier 
81*368c31abSDavid du Colombier int
82*368c31abSDavid du Colombier vttypevalid(int type)
83*368c31abSDavid du Colombier {
84*368c31abSDavid du Colombier 	return type < VtMaxType;
85*368c31abSDavid du Colombier }
86*368c31abSDavid du Colombier 
87*368c31abSDavid du Colombier static char*
88*368c31abSDavid du Colombier logit(int severity, char *fmt, va_list args)
89*368c31abSDavid du Colombier {
90*368c31abSDavid du Colombier 	char *s;
91*368c31abSDavid du Colombier 
92*368c31abSDavid du Colombier 	s = vsmprint(fmt, args);
93*368c31abSDavid du Colombier 	if(s == nil)
94*368c31abSDavid du Colombier 		return nil;
95*368c31abSDavid du Colombier 	if(severity != EOk){
96*368c31abSDavid du Colombier 		if(argv0 == nil)
97*368c31abSDavid du Colombier 			fprint(2, "%T %s: err %d: %s\n", argv0, severity, s);
98*368c31abSDavid du Colombier 		else
99*368c31abSDavid du Colombier 			fprint(2, "%T err %d: %s\n", severity, s);
100*368c31abSDavid du Colombier 	}
101*368c31abSDavid du Colombier 	return s;
102*368c31abSDavid du Colombier }
103*368c31abSDavid du Colombier 
104*368c31abSDavid du Colombier void
105*368c31abSDavid du Colombier seterr(int severity, char *fmt, ...)
106*368c31abSDavid du Colombier {
107*368c31abSDavid du Colombier 	char *s;
108*368c31abSDavid du Colombier 	va_list args;
109*368c31abSDavid du Colombier 
110*368c31abSDavid du Colombier 	va_start(args, fmt);
111*368c31abSDavid du Colombier 	s = logit(severity, fmt, args);
112*368c31abSDavid du Colombier 	va_end(args);
113*368c31abSDavid du Colombier 	if(s == nil)
114*368c31abSDavid du Colombier 		werrstr("error setting error");
115*368c31abSDavid du Colombier 	else{
116*368c31abSDavid du Colombier 		werrstr("%s", s);
117*368c31abSDavid du Colombier 		free(s);
118*368c31abSDavid du Colombier 	}
119*368c31abSDavid du Colombier }
120*368c31abSDavid du Colombier 
121*368c31abSDavid du Colombier void
122*368c31abSDavid du Colombier logerr(int severity, char *fmt, ...)
123*368c31abSDavid du Colombier {
124*368c31abSDavid du Colombier 	char *s;
125*368c31abSDavid du Colombier 	va_list args;
126*368c31abSDavid du Colombier 
127*368c31abSDavid du Colombier 	va_start(args, fmt);
128*368c31abSDavid du Colombier 	s = logit(severity, fmt, args);
129*368c31abSDavid du Colombier 	va_end(args);
130*368c31abSDavid du Colombier 	free(s);
131*368c31abSDavid du Colombier }
132*368c31abSDavid du Colombier 
133*368c31abSDavid du Colombier u32int
134*368c31abSDavid du Colombier now(void)
135*368c31abSDavid du Colombier {
136*368c31abSDavid du Colombier 	return time(nil);
137*368c31abSDavid du Colombier }
138*368c31abSDavid du Colombier 
139*368c31abSDavid du Colombier int abortonmem = 1;
140*368c31abSDavid du Colombier 
141*368c31abSDavid du Colombier void *
142*368c31abSDavid du Colombier emalloc(ulong n)
143*368c31abSDavid du Colombier {
144*368c31abSDavid du Colombier 	void *p;
145*368c31abSDavid du Colombier 
146*368c31abSDavid du Colombier 	p = malloc(n);
147*368c31abSDavid du Colombier 	if(p == nil){
148*368c31abSDavid du Colombier 		if(abortonmem)
149*368c31abSDavid du Colombier 			abort();
150*368c31abSDavid du Colombier 		sysfatal("out of memory allocating %lud", n);
151*368c31abSDavid du Colombier 	}
152*368c31abSDavid du Colombier 	memset(p, 0xa5, n);
153*368c31abSDavid du Colombier 	setmalloctag(p, getcallerpc(&n));
154*368c31abSDavid du Colombier if(0)print("emalloc %p-%p by %lux\n", p, (char*)p+n, getcallerpc(&n));
155*368c31abSDavid du Colombier 	return p;
156*368c31abSDavid du Colombier }
157*368c31abSDavid du Colombier 
158*368c31abSDavid du Colombier void *
159*368c31abSDavid du Colombier ezmalloc(ulong n)
160*368c31abSDavid du Colombier {
161*368c31abSDavid du Colombier 	void *p;
162*368c31abSDavid du Colombier 
163*368c31abSDavid du Colombier 	p = malloc(n);
164*368c31abSDavid du Colombier 	if(p == nil){
165*368c31abSDavid du Colombier 		if(abortonmem)
166*368c31abSDavid du Colombier 			abort();
167*368c31abSDavid du Colombier 		sysfatal("out of memory allocating %lud", n);
168*368c31abSDavid du Colombier 	}
169*368c31abSDavid du Colombier 	memset(p, 0, n);
170*368c31abSDavid du Colombier 	setmalloctag(p, getcallerpc(&n));
171*368c31abSDavid du Colombier if(0)print("ezmalloc %p-%p by %lux\n", p, (char*)p+n, getcallerpc(&n));
172*368c31abSDavid du Colombier 	return p;
173*368c31abSDavid du Colombier }
174*368c31abSDavid du Colombier 
175*368c31abSDavid du Colombier void *
176*368c31abSDavid du Colombier erealloc(void *p, ulong n)
177*368c31abSDavid du Colombier {
178*368c31abSDavid du Colombier 	p = realloc(p, n);
179*368c31abSDavid du Colombier 	if(p == nil){
180*368c31abSDavid du Colombier 		if(abortonmem)
181*368c31abSDavid du Colombier 			abort();
182*368c31abSDavid du Colombier 		sysfatal("out of memory allocating %lud", n);
183*368c31abSDavid du Colombier 	}
184*368c31abSDavid du Colombier 	setrealloctag(p, getcallerpc(&p));
185*368c31abSDavid du Colombier if(0)print("erealloc %p-%p by %lux\n", p, (char*)p+n, getcallerpc(&p));
186*368c31abSDavid du Colombier 	return p;
187*368c31abSDavid du Colombier }
188*368c31abSDavid du Colombier 
189*368c31abSDavid du Colombier char *
190*368c31abSDavid du Colombier estrdup(char *s)
191*368c31abSDavid du Colombier {
192*368c31abSDavid du Colombier 	char *t;
193*368c31abSDavid du Colombier 	int n;
194*368c31abSDavid du Colombier 
195*368c31abSDavid du Colombier 	n = strlen(s) + 1;
196*368c31abSDavid du Colombier 	t = emalloc(n);
197*368c31abSDavid du Colombier 	memmove(t, s, n);
198*368c31abSDavid du Colombier 	setmalloctag(t, getcallerpc(&s));
199*368c31abSDavid du Colombier if(0)print("estrdup %p-%p by %lux\n", t, (char*)t+n, getcallerpc(&s));
200*368c31abSDavid du Colombier 	return t;
201*368c31abSDavid du Colombier }
202*368c31abSDavid du Colombier 
203*368c31abSDavid du Colombier /*
204*368c31abSDavid du Colombier  * return floor(log2(v))
205*368c31abSDavid du Colombier  */
206*368c31abSDavid du Colombier int
207*368c31abSDavid du Colombier u64log2(u64int v)
208*368c31abSDavid du Colombier {
209*368c31abSDavid du Colombier 	int i;
210*368c31abSDavid du Colombier 
211*368c31abSDavid du Colombier 	for(i = 0; i < 64; i++)
212*368c31abSDavid du Colombier 		if((v >> i) <= 1)
213*368c31abSDavid du Colombier 			break;
214*368c31abSDavid du Colombier 	return i;
215*368c31abSDavid du Colombier }
216*368c31abSDavid du Colombier 
217*368c31abSDavid du Colombier int
218*368c31abSDavid du Colombier vtproc(void (*fn)(void*), void *arg)
219*368c31abSDavid du Colombier {
220*368c31abSDavid du Colombier 	proccreate(fn, arg, 256*1024);
221*368c31abSDavid du Colombier 	return 0;
222*368c31abSDavid du Colombier }
223*368c31abSDavid du Colombier 
224*368c31abSDavid du Colombier int
225*368c31abSDavid du Colombier ientryfmt(Fmt *fmt)
226*368c31abSDavid du Colombier {
227*368c31abSDavid du Colombier 	IEntry *ie;
228*368c31abSDavid du Colombier 
229*368c31abSDavid du Colombier 	ie = va_arg(fmt->args, IEntry*);
230*368c31abSDavid du Colombier 	return fmtprint(fmt, "%V %22lld %3d %5d %3d",
231*368c31abSDavid du Colombier 		ie->score, ie->ia.addr, ie->ia.type, ie->ia.size, ie->ia.blocks);
232*368c31abSDavid du Colombier }
233*368c31abSDavid du Colombier 
234*368c31abSDavid du Colombier void
235*368c31abSDavid du Colombier ventifmtinstall(void)
236*368c31abSDavid du Colombier {
237*368c31abSDavid du Colombier 	fmtinstall('F', vtfcallfmt);
238*368c31abSDavid du Colombier 	fmtinstall('H', encodefmt);
239*368c31abSDavid du Colombier 	fmtinstall('I', ientryfmt);
240*368c31abSDavid du Colombier 	fmtinstall('T', vttimefmt);
241*368c31abSDavid du Colombier 	fmtinstall('V', vtscorefmt);
242*368c31abSDavid du Colombier }
243*368c31abSDavid du Colombier 
244*368c31abSDavid du Colombier uint
245*368c31abSDavid du Colombier msec(void)
246*368c31abSDavid du Colombier {
247*368c31abSDavid du Colombier 	return nsec()/1000000;
248*368c31abSDavid du Colombier }
249*368c31abSDavid du Colombier 
250*368c31abSDavid du Colombier uint
251*368c31abSDavid du Colombier countbits(uint n)
252*368c31abSDavid du Colombier {
253*368c31abSDavid du Colombier 	n = (n&0x55555555)+((n>>1)&0x55555555);
254*368c31abSDavid du Colombier 	n = (n&0x33333333)+((n>>2)&0x33333333);
255*368c31abSDavid du Colombier 	n = (n&0x0F0F0F0F)+((n>>4)&0x0F0F0F0F);
256*368c31abSDavid du Colombier 	n = (n&0x00FF00FF)+((n>>8)&0x00FF00FF);
257*368c31abSDavid du Colombier 	n = (n&0x0000FFFF)+((n>>16)&0x0000FFFF);
258*368c31abSDavid du Colombier 	return n;
259*368c31abSDavid du Colombier }
260