xref: /plan9/sys/src/cmd/venti/srv/utils.c (revision 1f9fb5709ae2d5a408fa863c719cf9096933ed7f)
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