xref: /plan9/sys/src/cmd/wikifs/util.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include <u.h>
2*9a747e4fSDavid du Colombier #include <libc.h>
3*9a747e4fSDavid du Colombier #include <bio.h>
4*9a747e4fSDavid du Colombier #include <String.h>
5*9a747e4fSDavid du Colombier #include <ctype.h>
6*9a747e4fSDavid du Colombier #include <thread.h>
7*9a747e4fSDavid du Colombier #include "wiki.h"
8*9a747e4fSDavid du Colombier 
9*9a747e4fSDavid du Colombier void*
erealloc(void * v,ulong n)10*9a747e4fSDavid du Colombier erealloc(void *v, ulong n)
11*9a747e4fSDavid du Colombier {
12*9a747e4fSDavid du Colombier 	v = realloc(v, n);
13*9a747e4fSDavid du Colombier 	if(v == nil)
14*9a747e4fSDavid du Colombier 		sysfatal("out of memory reallocating %lud", n);
15*9a747e4fSDavid du Colombier 	setmalloctag(v, getcallerpc(&v));
16*9a747e4fSDavid du Colombier 	return v;
17*9a747e4fSDavid du Colombier }
18*9a747e4fSDavid du Colombier 
19*9a747e4fSDavid du Colombier void*
emalloc(ulong n)20*9a747e4fSDavid du Colombier emalloc(ulong n)
21*9a747e4fSDavid du Colombier {
22*9a747e4fSDavid du Colombier 	void *v;
23*9a747e4fSDavid du Colombier 
24*9a747e4fSDavid du Colombier 	v = malloc(n);
25*9a747e4fSDavid du Colombier 	if(v == nil)
26*9a747e4fSDavid du Colombier 		sysfatal("out of memory allocating %lud", n);
27*9a747e4fSDavid du Colombier 	memset(v, 0, n);
28*9a747e4fSDavid du Colombier 	setmalloctag(v, getcallerpc(&n));
29*9a747e4fSDavid du Colombier 	return v;
30*9a747e4fSDavid du Colombier }
31*9a747e4fSDavid du Colombier 
32*9a747e4fSDavid du Colombier char*
estrdup(char * s)33*9a747e4fSDavid du Colombier estrdup(char *s)
34*9a747e4fSDavid du Colombier {
35*9a747e4fSDavid du Colombier 	int l;
36*9a747e4fSDavid du Colombier 	char *t;
37*9a747e4fSDavid du Colombier 
38*9a747e4fSDavid du Colombier 	if (s == nil)
39*9a747e4fSDavid du Colombier 		return nil;
40*9a747e4fSDavid du Colombier 	l = strlen(s)+1;
41*9a747e4fSDavid du Colombier 	t = emalloc(l);
42*9a747e4fSDavid du Colombier 	memmove(t, s, l);
43*9a747e4fSDavid du Colombier 	setmalloctag(t, getcallerpc(&s));
44*9a747e4fSDavid du Colombier 	return t;
45*9a747e4fSDavid du Colombier }
46*9a747e4fSDavid du Colombier 
47*9a747e4fSDavid du Colombier char*
estrdupn(char * s,int n)48*9a747e4fSDavid du Colombier estrdupn(char *s, int n)
49*9a747e4fSDavid du Colombier {
50*9a747e4fSDavid du Colombier 	int l;
51*9a747e4fSDavid du Colombier 	char *t;
52*9a747e4fSDavid du Colombier 
53*9a747e4fSDavid du Colombier 	l = strlen(s);
54*9a747e4fSDavid du Colombier 	if(l > n)
55*9a747e4fSDavid du Colombier 		l = n;
56*9a747e4fSDavid du Colombier 	t = emalloc(l+1);
57*9a747e4fSDavid du Colombier 	memmove(t, s, l);
58*9a747e4fSDavid du Colombier 	t[l] = '\0';
59*9a747e4fSDavid du Colombier 	setmalloctag(t, getcallerpc(&s));
60*9a747e4fSDavid du Colombier 	return t;
61*9a747e4fSDavid du Colombier }
62*9a747e4fSDavid du Colombier 
63*9a747e4fSDavid du Colombier char*
strlower(char * s)64*9a747e4fSDavid du Colombier strlower(char *s)
65*9a747e4fSDavid du Colombier {
66*9a747e4fSDavid du Colombier 	char *p;
67*9a747e4fSDavid du Colombier 
68*9a747e4fSDavid du Colombier 	for(p=s; *p; p++)
69*9a747e4fSDavid du Colombier 		if('A' <= *p && *p <= 'Z')
70*9a747e4fSDavid du Colombier 			*p += 'a'-'A';
71*9a747e4fSDavid du Colombier 	return s;
72*9a747e4fSDavid du Colombier }
73*9a747e4fSDavid du Colombier 
74*9a747e4fSDavid du Colombier String*
s_appendsub(String * s,char * p,int n,Sub * sub,int nsub)75*9a747e4fSDavid du Colombier s_appendsub(String *s, char *p, int n, Sub *sub, int nsub)
76*9a747e4fSDavid du Colombier {
77*9a747e4fSDavid du Colombier 	int i, m;
78*9a747e4fSDavid du Colombier 	char *q, *r, *ep;
79*9a747e4fSDavid du Colombier 
80*9a747e4fSDavid du Colombier 	ep = p+n;
81*9a747e4fSDavid du Colombier 	while(p<ep){
82*9a747e4fSDavid du Colombier 		q = ep;
83*9a747e4fSDavid du Colombier 		m = -1;
84*9a747e4fSDavid du Colombier 		for(i=0; i<nsub; i++){
85*9a747e4fSDavid du Colombier 			if(sub[i].sub && (r = strstr(p, sub[i].match)) && r < q){
86*9a747e4fSDavid du Colombier 				q = r;
87*9a747e4fSDavid du Colombier 				m = i;
88*9a747e4fSDavid du Colombier 			}
89*9a747e4fSDavid du Colombier 		}
90*9a747e4fSDavid du Colombier 		s = s_nappend(s, p, q-p);
91*9a747e4fSDavid du Colombier 		p = q;
92*9a747e4fSDavid du Colombier 		if(m >= 0){
93*9a747e4fSDavid du Colombier 			s = s_append(s, sub[m].sub);
94*9a747e4fSDavid du Colombier 			p += strlen(sub[m].match);
95*9a747e4fSDavid du Colombier 		}
96*9a747e4fSDavid du Colombier 	}
97*9a747e4fSDavid du Colombier 	return s;
98*9a747e4fSDavid du Colombier }
99*9a747e4fSDavid du Colombier 
100*9a747e4fSDavid du Colombier String*
s_appendlist(String * s,...)101*9a747e4fSDavid du Colombier s_appendlist(String *s, ...)
102*9a747e4fSDavid du Colombier {
103*9a747e4fSDavid du Colombier 	char *x;
104*9a747e4fSDavid du Colombier 	va_list arg;
105*9a747e4fSDavid du Colombier 
106*9a747e4fSDavid du Colombier 	va_start(arg, s);
107*9a747e4fSDavid du Colombier 	while(x = va_arg(arg, char*))
108*9a747e4fSDavid du Colombier 		s = s_append(s, x);
109*9a747e4fSDavid du Colombier 	va_end(arg);
110*9a747e4fSDavid du Colombier 	return s;
111*9a747e4fSDavid du Colombier }
112*9a747e4fSDavid du Colombier 
113*9a747e4fSDavid du Colombier int
opentemp(char * template)114*9a747e4fSDavid du Colombier opentemp(char *template)
115*9a747e4fSDavid du Colombier {
116*9a747e4fSDavid du Colombier 	int fd, i;
117*9a747e4fSDavid du Colombier 	char *p;
118*9a747e4fSDavid du Colombier 
119*9a747e4fSDavid du Colombier 	p = estrdup(template);
120*9a747e4fSDavid du Colombier 	fd = -1;
121*9a747e4fSDavid du Colombier 	for(i=0; i<10; i++){
122*9a747e4fSDavid du Colombier 		mktemp(p);
123*9a747e4fSDavid du Colombier 		if(access(p, 0) < 0 && (fd=create(p, ORDWR|ORCLOSE, 0444)) >= 0)
124*9a747e4fSDavid du Colombier 			break;
125*9a747e4fSDavid du Colombier 		strcpy(p, template);
126*9a747e4fSDavid du Colombier 	}
127*9a747e4fSDavid du Colombier 	if(fd >= 0)
128*9a747e4fSDavid du Colombier 		strcpy(template, p);
129*9a747e4fSDavid du Colombier 	free(p);
130*9a747e4fSDavid du Colombier 
131*9a747e4fSDavid du Colombier 	return fd;
132*9a747e4fSDavid du Colombier }
133*9a747e4fSDavid du Colombier 
134