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