Mercurial > repos > rhope
comparison string.c @ 0:76568becd6d6
Rhope Alpha 2a source import
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 28 Apr 2009 23:06:07 +0000 |
parents | |
children | 94c885692eb5 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:76568becd6d6 |
---|---|
1 #include "datum.h" | |
2 #include "structs.h" | |
3 #include "interp.h" | |
4 #include <string.h> | |
5 #include <stdlib.h> | |
6 | |
7 | |
8 int vis_inttostring(datum ** inputlist, queue_entry * worker_entry) | |
9 { | |
10 int i,j,val; | |
11 char temp_buf[12]; | |
12 datum * output; | |
13 char * out_buf; | |
14 //sprintf(temp_buf, "%d", inputlist[0]->c.integers.num_a); | |
15 val = (inputlist[0]->c.integers.num_a >= 0 ? inputlist[0]->c.integers.num_a : 0-inputlist[0]->c.integers.num_a); | |
16 i = 0; | |
17 if(!val) | |
18 temp_buf[i++] = '0'; | |
19 | |
20 while(val > 0) | |
21 { | |
22 temp_buf[i] = (val % 10) + '0'; | |
23 val /= 10; | |
24 ++i; | |
25 } | |
26 if(inputlist[0]->c.integers.num_a < 0) | |
27 { | |
28 temp_buf[i] = '-'; | |
29 ++i; | |
30 } | |
31 release_ref(inputlist[0]); | |
32 inputlist[0] = new_datum(BUILTIN_TYPE_STRING, 1, i+1, worker_entry->instance->def->program); | |
33 out_buf = inputlist[0]->c.generic.data; | |
34 out_buf[i] = '\0'; | |
35 j = 0; | |
36 --i; | |
37 while(i >= 0) | |
38 { | |
39 out_buf[j] = temp_buf[i]; | |
40 ++j; | |
41 --i; | |
42 } | |
43 //strcpy(inputlist[0]->c.generic.data, temp_buf); | |
44 return 0; | |
45 | |
46 } | |
47 | |
48 #ifndef SEGA | |
49 int vis_realtostring(datum ** inputlist, queue_entry * worker_entry) | |
50 { | |
51 char temp_buf[30];//Is this enough? | |
52 datum * output; | |
53 sprintf(temp_buf, "%f", inputlist[0]->c.real); | |
54 release_ref(inputlist[0]); | |
55 inputlist[0] = new_datum(BUILTIN_TYPE_STRING, 1, strlen(temp_buf)+1, worker_entry->instance->def->program); | |
56 strcpy(inputlist[0]->c.generic.data, temp_buf); | |
57 return 0; | |
58 | |
59 } | |
60 #endif | |
61 | |
62 int vis_stringequal(datum ** inputlist, queue_entry * worker_entry) | |
63 { | |
64 int result = strcmp(inputlist[0]->c.generic.data, inputlist[1]->c.generic.data); | |
65 release_ref(inputlist[0]); | |
66 release_ref(inputlist[1]); | |
67 inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program); | |
68 datum_set_yesno(inputlist[0], (result == 0 ? 1 : 0)); | |
69 return 0; | |
70 } | |
71 | |
72 int vis_append(datum ** inputlist, queue_entry * worker_entry) | |
73 { | |
74 datum * output; | |
75 int temp_size = inputlist[0]->c.generic.len; | |
76 DEBUGPUTS("Begin vis_append\n"); | |
77 | |
78 DEBUGPRINTF("Left: %s(%d)\n", inputlist[0]->c.generic.data, inputlist[0]->c.generic.len); | |
79 DEBUGPRINTF("Right: %s(%d)\n", inputlist[1]->c.generic.data, inputlist[1]->c.generic.len); | |
80 output = new_datum(BUILTIN_TYPE_STRING, 1, temp_size+inputlist[1]->c.generic.len-1, worker_entry->instance->def->program); | |
81 memcpy(output->c.generic.data, inputlist[0]->c.generic.data, temp_size-1); | |
82 memcpy(((char *)output->c.generic.data)+temp_size-1, inputlist[1]->c.generic.data, inputlist[1]->c.generic.len-1); | |
83 ((char *)output->c.generic.data)[temp_size + inputlist[1]->c.generic.len-2]='\0'; | |
84 DEBUGPRINTF("Appended string: %s(%d)\n", output->c.generic.data, output->c.generic.len); | |
85 release_ref(inputlist[0]); | |
86 release_ref(inputlist[1]); | |
87 inputlist[0] = output; | |
88 DEBUGPUTS("End vis_append\n"); | |
89 | |
90 return 0; | |
91 } | |
92 | |
93 int vis_yesnotostring(datum ** inputlist, queue_entry * worker_entry) | |
94 { | |
95 int result = inputlist[0]->c.integers.num_a; | |
96 release_ref(inputlist[0]); | |
97 if(result) | |
98 { | |
99 inputlist[0] = new_datum(BUILTIN_TYPE_STRING, 1, 4, worker_entry->instance->def->program); | |
100 strcpy(inputlist[0]->c.generic.data, "Yes"); | |
101 } | |
102 else | |
103 { | |
104 inputlist[0] = new_datum(BUILTIN_TYPE_STRING, 1, 3, worker_entry->instance->def->program); | |
105 strcpy(inputlist[0]->c.generic.data, "No"); | |
106 } | |
107 return 0; | |
108 } | |
109 | |
110 int vis_greaterstring(datum ** inputlist, queue_entry * worker_entry) | |
111 { | |
112 int result; | |
113 if(strcmp(inputlist[0]->c.generic.data, inputlist[1]->c.generic.data) > 0) | |
114 result = 1; | |
115 else | |
116 result = 0; | |
117 release_ref(inputlist[0]); | |
118 release_ref(inputlist[1]); | |
119 inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program); | |
120 datum_set_yesno(inputlist[0], result); | |
121 return 0; | |
122 } | |
123 | |
124 int vis_lesserstring(datum ** inputlist, queue_entry * worker_entry) | |
125 { | |
126 int result; | |
127 if(strcmp(inputlist[0]->c.generic.data, inputlist[1]->c.generic.data) < 0) | |
128 result = 1; | |
129 else | |
130 result = 0; | |
131 release_ref(inputlist[0]); | |
132 release_ref(inputlist[1]); | |
133 inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program); | |
134 datum_set_yesno(inputlist[0], result); | |
135 return 0; | |
136 } | |
137 | |
138 datum * make_string(const char * string, int len, program * prog) | |
139 { | |
140 datum * output; | |
141 if(len < 0) | |
142 len = strlen(string); | |
143 output = new_datum(BUILTIN_TYPE_STRING, 1, len+1, prog); | |
144 memcpy(output->c.generic.data, string, len); | |
145 ((char *)output->c.generic.data)[len] = '\0'; | |
146 return output; | |
147 } | |
148 | |
149 int vis_string_split(datum ** inputlist, queue_entry * worker_entry) | |
150 { | |
151 int i, start=0, len = inputlist[0]->c.generic.len-1; | |
152 char * string = inputlist[0]->c.generic.data; | |
153 char * delim = inputlist[1]->c.generic.data; | |
154 int delimlen = inputlist[1]->c.generic.len-1; | |
155 int search_offset = 0; | |
156 datum * params[2]; | |
157 params[0] = create_list(worker_entry->instance->def->program); | |
158 DEBUGPRINTF("Split@String: delim(%s) string(%s)\n", delim, string); | |
159 for(i = 0; i < len; ++i) | |
160 { | |
161 if(string[i] == delim[search_offset]) | |
162 { | |
163 if(search_offset == (delimlen-1)) | |
164 { | |
165 params[1] = make_string(string + start, i-start-(delimlen-1), worker_entry->instance->def->program); | |
166 DEBUGPRINTF("Appending %s(%d) to list\n", params[1]->c.generic.data, params[1]->c.generic.len); | |
167 vis_list_append(params, worker_entry); | |
168 start = i+1; | |
169 search_offset = 0; | |
170 } | |
171 else | |
172 ++search_offset; | |
173 } | |
174 else if(search_offset > 0) | |
175 { | |
176 i = (i-search_offset+1); | |
177 search_offset = 0; | |
178 } | |
179 } | |
180 if(len) | |
181 { | |
182 params[1] = make_string(string + start, i-start, worker_entry->instance->def->program); | |
183 vis_list_append(params, worker_entry); | |
184 } | |
185 DEBUGPUTS("End Split@String\n"); | |
186 | |
187 release_ref(inputlist[0]); | |
188 release_ref(inputlist[1]); | |
189 inputlist[0] = params[0]; | |
190 return 0; | |
191 } | |
192 | |
193 int vis_string_put_raw(datum ** inputlist, queue_entry * worker_entry) | |
194 { | |
195 int old_len = inputlist[0]->c.generic.len; | |
196 char * data; | |
197 inputlist[0] = copy_datum(inputlist[0], old_len + inputlist[1]->c.generic.len); | |
198 data = inputlist[0]->c.generic.data; | |
199 memcpy(data + old_len - 1, inputlist[1]->c.generic.data, inputlist[1]->c.generic.len); | |
200 release_ref(inputlist[1]); | |
201 data[inputlist[0]->c.generic.len-1] = '\0'; | |
202 return 0; | |
203 } | |
204 | |
205 int vis_string_get_raw(datum ** inputlist, queue_entry * worker_entry) | |
206 { | |
207 char * data = inputlist[0]->c.generic.data; | |
208 datum * output; | |
209 inputlist[1] = copy_datum(inputlist[1], 0); | |
210 memcpy(inputlist[1]->c.generic.data, data, inputlist[1]->c.generic.len); | |
211 output = make_string(data + inputlist[1]->c.generic.len, inputlist[0]->c.generic.len - inputlist[1]->c.generic.len - 1, worker_entry->instance->def->program); | |
212 release_ref(inputlist[0]); | |
213 inputlist[0] = output; | |
214 return 0; | |
215 } | |
216 | |
217 int vis_string_slice(datum ** inputlist, queue_entry * worker_entry) | |
218 { | |
219 char * string; | |
220 int index = inputlist[1]->c.integers.num_a; | |
221 release_ref(inputlist[1]); | |
222 if(index < (inputlist[0]->c.generic.len-1)) | |
223 { | |
224 inputlist[1] = new_datum_comp(inputlist[0]->company, 1, inputlist[0]->c.generic.len-index); | |
225 memcpy(inputlist[1]->c.generic.data, (char *)(inputlist[0]->c.generic.data) + index, inputlist[0]->c.generic.len-index); | |
226 inputlist[0] = copy_datum(inputlist[0], index+1); | |
227 string = inputlist[0]->c.generic.data; | |
228 string[index] = '\0'; | |
229 } | |
230 else | |
231 { | |
232 inputlist[1] = new_datum_comp(inputlist[0]->company, 1, 1); | |
233 string = inputlist[1]->c.generic.data; | |
234 string[0] = '\0'; | |
235 } | |
236 return 0; | |
237 } | |
238 | |
239 int vis_string_reverse(datum ** inputlist, queue_entry * worker_entry) | |
240 { | |
241 int ref_count, i,j; | |
242 datum * output; | |
243 char *source, *dest, tmp; | |
244 VIS_EnterCriticalSection(inputlist[0]->lock); | |
245 ref_count = inputlist[0]->ref_count; | |
246 VIS_LeaveCriticalSection(inputlist[0]->lock); | |
247 | |
248 if(ref_count > 1) | |
249 output = new_datum_comp(inputlist[0]->company, 1, inputlist[0]->c.generic.len); | |
250 else | |
251 output = inputlist[0]; | |
252 source = inputlist[0]->c.generic.data; | |
253 | |
254 if(ref_count > 1) | |
255 { | |
256 dest = output->c.generic.data; | |
257 i = 0; | |
258 for(j = output->c.generic.len-2; j >= 0; --j) | |
259 dest[j] = source[i++]; | |
260 release_ref(inputlist[0]); | |
261 inputlist[0] = output; | |
262 } | |
263 else | |
264 { | |
265 i = 0; | |
266 for(j = output->c.generic.len-2; j > i; --j) | |
267 { | |
268 tmp = source[i]; | |
269 source[i++] = source[j]; | |
270 source[j] = tmp; | |
271 } | |
272 } | |
273 return 0; | |
274 } | |
275 | |
276 int vis_string_length(datum ** inputlist, queue_entry * worker_entry) | |
277 { | |
278 int len = inputlist[0]->c.generic.len-1; | |
279 release_ref(inputlist[0]); | |
280 inputlist[0] = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, worker_entry->instance->def->program); | |
281 inputlist[0]->c.integers.num_a = len; | |
282 return 0; | |
283 } | |
284 | |
285 int vis_string_put_byte(datum ** inputlist, queue_entry * worker_entry) | |
286 { | |
287 inputlist[0] = copy_datum(inputlist[0], inputlist[0]->c.generic.len + 1); | |
288 ((unsigned char *)(inputlist[0]->c.generic.data))[inputlist[0]->c.generic.len - 2] = (unsigned char)inputlist[1]->c.integers.num_a; | |
289 ((unsigned char *)(inputlist[0]->c.generic.data))[inputlist[0]->c.generic.len - 1] = '\0'; | |
290 release_ref(inputlist[1]); | |
291 return 0; | |
292 } | |
293 | |
294 int vis_string_get_dstring(datum ** inputlist, queue_entry * worker_entry) | |
295 { | |
296 datum ** delimlist; | |
297 int num_delims; | |
298 int i,len,delimlen; | |
299 char *current; | |
300 BOOL match=FALSE; | |
301 datum * temp; | |
302 if(inputlist[1]->company->type_id == BUILTIN_TYPE_LIST) | |
303 { | |
304 delimlist = ((list_data *)inputlist[1]->c.generic.data)->entries; | |
305 num_delims = ((list_data *)inputlist[1]->c.generic.data)->num_entries; | |
306 //TODO: check to make sure that all of the list entries are strings | |
307 } | |
308 else if(inputlist[1]->company->type_id == BUILTIN_TYPE_STRING) | |
309 { | |
310 delimlist = inputlist+1; | |
311 num_delims = 1; | |
312 } | |
313 else | |
314 { | |
315 ERRORPUTS("Second argument to Get DString@String must be either a String or a List"); | |
316 release_ref(inputlist[0]); | |
317 release_ref(inputlist[1]); | |
318 return -1; | |
319 } | |
320 current = inputlist[0]->c.generic.data; | |
321 len = inputlist[0]->c.generic.len - 1; | |
322 while(len && !match) | |
323 { | |
324 for(i = 0; i < num_delims; ++i) | |
325 { | |
326 delimlen = delimlist[i]->c.generic.len-1; | |
327 if(len >= delimlen && !memcmp(current, delimlist[i]->c.generic.data, delimlen)) | |
328 { | |
329 match = TRUE; | |
330 //deal with the fact that we're going to adjust current and len even though we're done | |
331 --current; | |
332 ++len; | |
333 break; | |
334 } | |
335 } | |
336 ++current; | |
337 --len; | |
338 } | |
339 if(match) | |
340 { | |
341 inputlist[2] = add_ref(delimlist[i]); | |
342 release_ref(inputlist[1]); | |
343 inputlist[1] = make_string(inputlist[0]->c.generic.data, current - ((char *)inputlist[0]->c.generic.data), worker_entry->instance->def->program); | |
344 delimlen = inputlist[2]->c.generic.len-1; | |
345 temp = make_string(current+delimlen, len-delimlen, worker_entry->instance->def->program); | |
346 release_ref(inputlist[0]); | |
347 inputlist[0] = temp; | |
348 inputlist[3] = NULL; | |
349 } | |
350 else | |
351 { | |
352 release_ref(inputlist[1]); | |
353 inputlist[1] = inputlist[0]; | |
354 inputlist[0] = NULL; | |
355 inputlist[2] = NULL; | |
356 inputlist[3] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program); | |
357 inputlist[3]->c.integers.num_a = 0; | |
358 } | |
359 return 0; | |
360 } |