Blame


1 ed7c8e8d 2003-09-30 devnull #include "sam.h"
2 ed7c8e8d 2003-09-30 devnull
3 ed7c8e8d 2003-09-30 devnull #define MINSIZE 16 /* minimum number of chars allocated */
4 ed7c8e8d 2003-09-30 devnull #define MAXSIZE 256 /* maximum number of chars for an empty string */
5 ed7c8e8d 2003-09-30 devnull
6 ed7c8e8d 2003-09-30 devnull
7 ed7c8e8d 2003-09-30 devnull void
8 ed7c8e8d 2003-09-30 devnull Strinit(String *p)
9 ed7c8e8d 2003-09-30 devnull {
10 ed7c8e8d 2003-09-30 devnull p->s = emalloc(MINSIZE*RUNESIZE);
11 ed7c8e8d 2003-09-30 devnull p->n = 0;
12 ed7c8e8d 2003-09-30 devnull p->size = MINSIZE;
13 ed7c8e8d 2003-09-30 devnull }
14 ed7c8e8d 2003-09-30 devnull
15 ed7c8e8d 2003-09-30 devnull void
16 ed7c8e8d 2003-09-30 devnull Strinit0(String *p)
17 ed7c8e8d 2003-09-30 devnull {
18 ed7c8e8d 2003-09-30 devnull p->s = emalloc(MINSIZE*RUNESIZE);
19 ed7c8e8d 2003-09-30 devnull p->s[0] = 0;
20 ed7c8e8d 2003-09-30 devnull p->n = 1;
21 ed7c8e8d 2003-09-30 devnull p->size = MINSIZE;
22 ed7c8e8d 2003-09-30 devnull }
23 ed7c8e8d 2003-09-30 devnull
24 ed7c8e8d 2003-09-30 devnull void
25 ed7c8e8d 2003-09-30 devnull Strclose(String *p)
26 ed7c8e8d 2003-09-30 devnull {
27 ed7c8e8d 2003-09-30 devnull free(p->s);
28 ed7c8e8d 2003-09-30 devnull }
29 ed7c8e8d 2003-09-30 devnull
30 ed7c8e8d 2003-09-30 devnull void
31 ed7c8e8d 2003-09-30 devnull Strzero(String *p)
32 ed7c8e8d 2003-09-30 devnull {
33 ed7c8e8d 2003-09-30 devnull if(p->size > MAXSIZE){
34 ed7c8e8d 2003-09-30 devnull p->s = erealloc(p->s, RUNESIZE*MAXSIZE); /* throw away the garbage */
35 ed7c8e8d 2003-09-30 devnull p->size = MAXSIZE;
36 ed7c8e8d 2003-09-30 devnull }
37 ed7c8e8d 2003-09-30 devnull p->n = 0;
38 ed7c8e8d 2003-09-30 devnull }
39 ed7c8e8d 2003-09-30 devnull
40 ed7c8e8d 2003-09-30 devnull int
41 ed7c8e8d 2003-09-30 devnull Strlen(Rune *r)
42 ed7c8e8d 2003-09-30 devnull {
43 ed7c8e8d 2003-09-30 devnull Rune *s;
44 ed7c8e8d 2003-09-30 devnull
45 ed7c8e8d 2003-09-30 devnull for(s=r; *s; s++)
46 ed7c8e8d 2003-09-30 devnull ;
47 ed7c8e8d 2003-09-30 devnull return s-r;
48 ed7c8e8d 2003-09-30 devnull }
49 ed7c8e8d 2003-09-30 devnull
50 ed7c8e8d 2003-09-30 devnull void
51 ed7c8e8d 2003-09-30 devnull Strdupl(String *p, Rune *s) /* copies the null */
52 ed7c8e8d 2003-09-30 devnull {
53 ed7c8e8d 2003-09-30 devnull p->n = Strlen(s)+1;
54 ed7c8e8d 2003-09-30 devnull Strinsure(p, p->n);
55 ed7c8e8d 2003-09-30 devnull memmove(p->s, s, p->n*RUNESIZE);
56 ed7c8e8d 2003-09-30 devnull }
57 ed7c8e8d 2003-09-30 devnull
58 ed7c8e8d 2003-09-30 devnull void
59 ed7c8e8d 2003-09-30 devnull Strduplstr(String *p, String *q) /* will copy the null if there's one there */
60 ed7c8e8d 2003-09-30 devnull {
61 ed7c8e8d 2003-09-30 devnull Strinsure(p, q->n);
62 ed7c8e8d 2003-09-30 devnull p->n = q->n;
63 ed7c8e8d 2003-09-30 devnull memmove(p->s, q->s, q->n*RUNESIZE);
64 ed7c8e8d 2003-09-30 devnull }
65 ed7c8e8d 2003-09-30 devnull
66 ed7c8e8d 2003-09-30 devnull void
67 ed7c8e8d 2003-09-30 devnull Straddc(String *p, int c)
68 ed7c8e8d 2003-09-30 devnull {
69 ed7c8e8d 2003-09-30 devnull Strinsure(p, p->n+1);
70 ed7c8e8d 2003-09-30 devnull p->s[p->n++] = c;
71 ed7c8e8d 2003-09-30 devnull }
72 ed7c8e8d 2003-09-30 devnull
73 ed7c8e8d 2003-09-30 devnull void
74 ed7c8e8d 2003-09-30 devnull Strinsure(String *p, ulong n)
75 ed7c8e8d 2003-09-30 devnull {
76 ed7c8e8d 2003-09-30 devnull if(n > STRSIZE)
77 ed7c8e8d 2003-09-30 devnull error(Etoolong);
78 ed7c8e8d 2003-09-30 devnull if(p->size < n){ /* p needs to grow */
79 ed7c8e8d 2003-09-30 devnull n += 100;
80 ed7c8e8d 2003-09-30 devnull p->s = erealloc(p->s, n*RUNESIZE);
81 ed7c8e8d 2003-09-30 devnull p->size = n;
82 ed7c8e8d 2003-09-30 devnull }
83 ed7c8e8d 2003-09-30 devnull }
84 ed7c8e8d 2003-09-30 devnull
85 ed7c8e8d 2003-09-30 devnull void
86 ed7c8e8d 2003-09-30 devnull Strinsert(String *p, String *q, Posn p0)
87 ed7c8e8d 2003-09-30 devnull {
88 ed7c8e8d 2003-09-30 devnull Strinsure(p, p->n+q->n);
89 ed7c8e8d 2003-09-30 devnull memmove(p->s+p0+q->n, p->s+p0, (p->n-p0)*RUNESIZE);
90 ed7c8e8d 2003-09-30 devnull memmove(p->s+p0, q->s, q->n*RUNESIZE);
91 ed7c8e8d 2003-09-30 devnull p->n += q->n;
92 ed7c8e8d 2003-09-30 devnull }
93 ed7c8e8d 2003-09-30 devnull
94 ed7c8e8d 2003-09-30 devnull void
95 ed7c8e8d 2003-09-30 devnull Strdelete(String *p, Posn p1, Posn p2)
96 ed7c8e8d 2003-09-30 devnull {
97 ed7c8e8d 2003-09-30 devnull memmove(p->s+p1, p->s+p2, (p->n-p2)*RUNESIZE);
98 ed7c8e8d 2003-09-30 devnull p->n -= p2-p1;
99 ed7c8e8d 2003-09-30 devnull }
100 ed7c8e8d 2003-09-30 devnull
101 ed7c8e8d 2003-09-30 devnull int
102 ed7c8e8d 2003-09-30 devnull Strcmp(String *a, String *b)
103 ed7c8e8d 2003-09-30 devnull {
104 ed7c8e8d 2003-09-30 devnull int i, c;
105 ed7c8e8d 2003-09-30 devnull
106 ed7c8e8d 2003-09-30 devnull for(i=0; i<a->n && i<b->n; i++)
107 ed7c8e8d 2003-09-30 devnull if(c = (a->s[i] - b->s[i])) /* assign = */
108 ed7c8e8d 2003-09-30 devnull return c;
109 ed7c8e8d 2003-09-30 devnull /* damn NULs confuse everything */
110 ed7c8e8d 2003-09-30 devnull i = a->n - b->n;
111 ed7c8e8d 2003-09-30 devnull if(i == 1){
112 ed7c8e8d 2003-09-30 devnull if(a->s[a->n-1] == 0)
113 ed7c8e8d 2003-09-30 devnull return 0;
114 ed7c8e8d 2003-09-30 devnull }else if(i == -1){
115 ed7c8e8d 2003-09-30 devnull if(b->s[b->n-1] == 0)
116 ed7c8e8d 2003-09-30 devnull return 0;
117 ed7c8e8d 2003-09-30 devnull }
118 ed7c8e8d 2003-09-30 devnull return i;
119 ed7c8e8d 2003-09-30 devnull }
120 ed7c8e8d 2003-09-30 devnull
121 ed7c8e8d 2003-09-30 devnull int
122 ed7c8e8d 2003-09-30 devnull Strispre(String *a, String *b)
123 ed7c8e8d 2003-09-30 devnull {
124 ed7c8e8d 2003-09-30 devnull int i;
125 ed7c8e8d 2003-09-30 devnull
126 ed7c8e8d 2003-09-30 devnull for(i=0; i<a->n && i<b->n; i++){
127 ed7c8e8d 2003-09-30 devnull if(a->s[i] - b->s[i]){ /* assign = */
128 ed7c8e8d 2003-09-30 devnull if(a->s[i] == 0)
129 ed7c8e8d 2003-09-30 devnull return 1;
130 ed7c8e8d 2003-09-30 devnull return 0;
131 ed7c8e8d 2003-09-30 devnull }
132 ed7c8e8d 2003-09-30 devnull }
133 ed7c8e8d 2003-09-30 devnull return i == a->n;
134 ed7c8e8d 2003-09-30 devnull }
135 ed7c8e8d 2003-09-30 devnull
136 ed7c8e8d 2003-09-30 devnull char*
137 ed7c8e8d 2003-09-30 devnull Strtoc(String *s)
138 ed7c8e8d 2003-09-30 devnull {
139 ed7c8e8d 2003-09-30 devnull int i;
140 ed7c8e8d 2003-09-30 devnull char *c, *d;
141 ed7c8e8d 2003-09-30 devnull Rune *r;
142 ed7c8e8d 2003-09-30 devnull c = emalloc(s->n*UTFmax + 1); /* worst case UTFmax bytes per rune, plus NUL */
143 ed7c8e8d 2003-09-30 devnull d = c;
144 ed7c8e8d 2003-09-30 devnull r = s->s;
145 ed7c8e8d 2003-09-30 devnull for(i=0; i<s->n; i++)
146 ed7c8e8d 2003-09-30 devnull d += runetochar(d, r++);
147 ed7c8e8d 2003-09-30 devnull if(d==c || d[-1]!=0)
148 ed7c8e8d 2003-09-30 devnull *d = 0;
149 ed7c8e8d 2003-09-30 devnull return c;
150 ed7c8e8d 2003-09-30 devnull
151 ed7c8e8d 2003-09-30 devnull }
152 ed7c8e8d 2003-09-30 devnull
153 ed7c8e8d 2003-09-30 devnull /*
154 ed7c8e8d 2003-09-30 devnull * Build very temporary String from Rune*
155 ed7c8e8d 2003-09-30 devnull */
156 ed7c8e8d 2003-09-30 devnull String*
157 ed7c8e8d 2003-09-30 devnull tmprstr(Rune *r, int n)
158 ed7c8e8d 2003-09-30 devnull {
159 ed7c8e8d 2003-09-30 devnull static String p;
160 ed7c8e8d 2003-09-30 devnull
161 ed7c8e8d 2003-09-30 devnull p.s = r;
162 ed7c8e8d 2003-09-30 devnull p.n = n;
163 ed7c8e8d 2003-09-30 devnull p.size = n;
164 ed7c8e8d 2003-09-30 devnull return &p;
165 ed7c8e8d 2003-09-30 devnull }
166 ed7c8e8d 2003-09-30 devnull
167 ed7c8e8d 2003-09-30 devnull /*
168 ed7c8e8d 2003-09-30 devnull * Convert null-terminated char* into String
169 ed7c8e8d 2003-09-30 devnull */
170 ed7c8e8d 2003-09-30 devnull String*
171 ed7c8e8d 2003-09-30 devnull tmpcstr(char *s)
172 ed7c8e8d 2003-09-30 devnull {
173 ed7c8e8d 2003-09-30 devnull String *p;
174 ed7c8e8d 2003-09-30 devnull Rune *r;
175 ed7c8e8d 2003-09-30 devnull int i, n;
176 ed7c8e8d 2003-09-30 devnull
177 ed7c8e8d 2003-09-30 devnull n = utflen(s); /* don't include NUL */
178 ed7c8e8d 2003-09-30 devnull p = emalloc(sizeof(String));
179 ed7c8e8d 2003-09-30 devnull r = emalloc(n*RUNESIZE);
180 ed7c8e8d 2003-09-30 devnull p->s = r;
181 ed7c8e8d 2003-09-30 devnull for(i=0; i<n; i++,r++)
182 ed7c8e8d 2003-09-30 devnull s += chartorune(r, s);
183 ed7c8e8d 2003-09-30 devnull p->n = n;
184 ed7c8e8d 2003-09-30 devnull p->size = n;
185 ed7c8e8d 2003-09-30 devnull return p;
186 ed7c8e8d 2003-09-30 devnull }
187 ed7c8e8d 2003-09-30 devnull
188 ed7c8e8d 2003-09-30 devnull void
189 ed7c8e8d 2003-09-30 devnull freetmpstr(String *s)
190 ed7c8e8d 2003-09-30 devnull {
191 ed7c8e8d 2003-09-30 devnull free(s->s);
192 ed7c8e8d 2003-09-30 devnull free(s);
193 ed7c8e8d 2003-09-30 devnull }