Blame


1 c42a1d3d 2006-02-21 devnull #include "a.h"
2 c42a1d3d 2006-02-21 devnull
3 c42a1d3d 2006-02-21 devnull void*
4 c42a1d3d 2006-02-21 devnull emalloc(uint n)
5 c42a1d3d 2006-02-21 devnull {
6 c42a1d3d 2006-02-21 devnull void *v;
7 fa325e9b 2020-01-10 cross
8 c42a1d3d 2006-02-21 devnull v = mallocz(n, 1);
9 c42a1d3d 2006-02-21 devnull if(v == nil)
10 c42a1d3d 2006-02-21 devnull sysfatal("out of memory");
11 c42a1d3d 2006-02-21 devnull return v;
12 c42a1d3d 2006-02-21 devnull }
13 c42a1d3d 2006-02-21 devnull
14 c42a1d3d 2006-02-21 devnull char*
15 c42a1d3d 2006-02-21 devnull estrdup(char *s)
16 c42a1d3d 2006-02-21 devnull {
17 c42a1d3d 2006-02-21 devnull char *t;
18 fa325e9b 2020-01-10 cross
19 c42a1d3d 2006-02-21 devnull t = strdup(s);
20 c42a1d3d 2006-02-21 devnull if(t == nil)
21 c42a1d3d 2006-02-21 devnull sysfatal("out of memory");
22 c42a1d3d 2006-02-21 devnull return t;
23 c42a1d3d 2006-02-21 devnull }
24 c42a1d3d 2006-02-21 devnull
25 c42a1d3d 2006-02-21 devnull Rune*
26 c42a1d3d 2006-02-21 devnull erunestrdup(Rune *s)
27 c42a1d3d 2006-02-21 devnull {
28 c42a1d3d 2006-02-21 devnull Rune *t;
29 c42a1d3d 2006-02-21 devnull
30 c42a1d3d 2006-02-21 devnull t = emalloc(sizeof(Rune)*(runestrlen(s)+1));
31 c42a1d3d 2006-02-21 devnull if(t == nil)
32 c42a1d3d 2006-02-21 devnull sysfatal("out of memory");
33 c42a1d3d 2006-02-21 devnull runestrcpy(t, s);
34 c42a1d3d 2006-02-21 devnull return t;
35 c42a1d3d 2006-02-21 devnull }
36 c42a1d3d 2006-02-21 devnull
37 c42a1d3d 2006-02-21 devnull void*
38 c42a1d3d 2006-02-21 devnull erealloc(void *ov, uint n)
39 c42a1d3d 2006-02-21 devnull {
40 c42a1d3d 2006-02-21 devnull void *v;
41 fa325e9b 2020-01-10 cross
42 c42a1d3d 2006-02-21 devnull v = realloc(ov, n);
43 c42a1d3d 2006-02-21 devnull if(v == nil)
44 c42a1d3d 2006-02-21 devnull sysfatal("out of memory");
45 c42a1d3d 2006-02-21 devnull return v;
46 c42a1d3d 2006-02-21 devnull }
47 c42a1d3d 2006-02-21 devnull
48 c42a1d3d 2006-02-21 devnull Rune*
49 c42a1d3d 2006-02-21 devnull erunesmprint(char *fmt, ...)
50 c42a1d3d 2006-02-21 devnull {
51 c42a1d3d 2006-02-21 devnull Rune *s;
52 c42a1d3d 2006-02-21 devnull va_list arg;
53 fa325e9b 2020-01-10 cross
54 c42a1d3d 2006-02-21 devnull va_start(arg, fmt);
55 c42a1d3d 2006-02-21 devnull s = runevsmprint(fmt, arg);
56 c42a1d3d 2006-02-21 devnull va_end(arg);
57 c42a1d3d 2006-02-21 devnull if(s == nil)
58 c42a1d3d 2006-02-21 devnull sysfatal("out of memory");
59 c42a1d3d 2006-02-21 devnull return s;
60 c42a1d3d 2006-02-21 devnull }
61 c42a1d3d 2006-02-21 devnull
62 c42a1d3d 2006-02-21 devnull char*
63 c42a1d3d 2006-02-21 devnull esmprint(char *fmt, ...)
64 c42a1d3d 2006-02-21 devnull {
65 c42a1d3d 2006-02-21 devnull char *s;
66 c42a1d3d 2006-02-21 devnull va_list arg;
67 fa325e9b 2020-01-10 cross
68 c42a1d3d 2006-02-21 devnull va_start(arg, fmt);
69 c42a1d3d 2006-02-21 devnull s = vsmprint(fmt, arg);
70 c42a1d3d 2006-02-21 devnull va_end(arg);
71 c42a1d3d 2006-02-21 devnull if(s == nil)
72 c42a1d3d 2006-02-21 devnull sysfatal("out of memory");
73 c42a1d3d 2006-02-21 devnull return s;
74 c42a1d3d 2006-02-21 devnull }
75 c42a1d3d 2006-02-21 devnull
76 c42a1d3d 2006-02-21 devnull void
77 c42a1d3d 2006-02-21 devnull warn(char *fmt, ...)
78 c42a1d3d 2006-02-21 devnull {
79 c42a1d3d 2006-02-21 devnull va_list arg;
80 fa325e9b 2020-01-10 cross
81 c42a1d3d 2006-02-21 devnull fprint(2, "htmlroff: %L: ");
82 c42a1d3d 2006-02-21 devnull va_start(arg, fmt);
83 c42a1d3d 2006-02-21 devnull vfprint(2, fmt, arg);
84 c42a1d3d 2006-02-21 devnull va_end(arg);
85 c42a1d3d 2006-02-21 devnull fprint(2, "\n");
86 c42a1d3d 2006-02-21 devnull }
87 c42a1d3d 2006-02-21 devnull
88 c42a1d3d 2006-02-21 devnull /*
89 c42a1d3d 2006-02-21 devnull * For non-Unicode compilers, so we can say
90 c42a1d3d 2006-02-21 devnull * L("asdf") and get a Rune string. Assumes strings
91 c42a1d3d 2006-02-21 devnull * are identified by their pointers, so no mutable strings!
92 c42a1d3d 2006-02-21 devnull */
93 c42a1d3d 2006-02-21 devnull typedef struct Lhash Lhash;
94 c42a1d3d 2006-02-21 devnull struct Lhash
95 c42a1d3d 2006-02-21 devnull {
96 c42a1d3d 2006-02-21 devnull char *s;
97 c42a1d3d 2006-02-21 devnull Lhash *next;
98 c42a1d3d 2006-02-21 devnull Rune r[1];
99 c42a1d3d 2006-02-21 devnull };
100 c42a1d3d 2006-02-21 devnull static Lhash *hash[1127];
101 c42a1d3d 2006-02-21 devnull
102 c42a1d3d 2006-02-21 devnull Rune*
103 c42a1d3d 2006-02-21 devnull L(char *s)
104 c42a1d3d 2006-02-21 devnull {
105 c42a1d3d 2006-02-21 devnull Rune *p;
106 c42a1d3d 2006-02-21 devnull Lhash *l;
107 c42a1d3d 2006-02-21 devnull uint h;
108 c42a1d3d 2006-02-21 devnull
109 c42a1d3d 2006-02-21 devnull h = (uintptr)s%nelem(hash);
110 c42a1d3d 2006-02-21 devnull for(l=hash[h]; l; l=l->next)
111 c42a1d3d 2006-02-21 devnull if(l->s == s)
112 c42a1d3d 2006-02-21 devnull return l->r;
113 c42a1d3d 2006-02-21 devnull l = emalloc(sizeof *l+(utflen(s)+1)*sizeof(Rune));
114 c42a1d3d 2006-02-21 devnull p = l->r;
115 c42a1d3d 2006-02-21 devnull l->s = s;
116 c42a1d3d 2006-02-21 devnull while(*s)
117 c42a1d3d 2006-02-21 devnull s += chartorune(p++, s);
118 c42a1d3d 2006-02-21 devnull *p = 0;
119 c42a1d3d 2006-02-21 devnull l->next = hash[h];
120 c42a1d3d 2006-02-21 devnull hash[h] = l;
121 c42a1d3d 2006-02-21 devnull return l->r;
122 c42a1d3d 2006-02-21 devnull }