1 #define IOSEQ_C
2 #include "IoSeq.h"
3 #undef IOSEQ_C
4 #include "IoSeq_mutable.h"
5 #include "IoSeq_immutable.h"
6 #include "IoState.h"
7 #include "IoCFunction.h"
8 #include "IoObject.h"
9 #include "IoNumber.h"
10 #include "IoMessage.h"
11 #include "IoList.h"
12 #include "IoSeq.h"
13 #include <ctype.h>
14
15 #define DATA(self) ((UArray *)(IoObject_dataPointer(self)))
16 //#define HASHIVAR(self) ((self)->extraData)
17 static const char *protoId = "Sequence";
18
ISMUTABLESEQ(IoObject * self)19 int ISMUTABLESEQ(IoObject *self)
20 {
21 return ISSEQ(self) && !(IoObject_isSymbol(self));
22 }
23
ioSymbolFindFunc(void * s,void * ioSymbol)24 int ioSymbolFindFunc(void *s, void *ioSymbol)
25 {
26 return strcmp((char *)s, (char *)UArray_bytes(DATA((IoObject *)ioSymbol)));
27 }
28
IoObject_isStringOrBuffer(IoSeq * self)29 int IoObject_isStringOrBuffer(IoSeq *self)
30 {
31 return ISSEQ(self);
32 }
33
IoObject_isNotStringOrBuffer(IoSeq * self)34 int IoObject_isNotStringOrBuffer(IoSeq *self)
35 {
36 return !(ISSEQ(self));
37 }
38
IoSeq_rawPrint(IoSeq * self)39 void IoSeq_rawPrint(IoSeq *self)
40 {
41 IoState_justPrintba_(IOSTATE, DATA(self));
42 }
43
44 /*
45 void IoSymbol_writeToStream_(IoSymbol *self, BStream *stream)
46 {
47 BStream_writeTaggedUArray_(stream, DATA(self));
48 }
49
50 IoSymbol *IoSymbol_allocFromStore_stream_(IoSymbol *self, BStream *stream)
51 {
52 UArray *ba = BStream_readTaggedUArray(stream);
53
54 if (!ba)
55 {
56 printf("String read error: missing byte array");
57 IoState_exit(IOSTATE, -1);
58 }
59
60 return IoState_symbolWithUArray_copy_(IOSTATE, ba, 1);
61 }
62
63 void IoSeq_writeToStream_(IoSeq *self, BStream *stream)
64 {
65 BStream_writeTaggedUArray_(stream, DATA(self));
66 }
67
68 void IoSeq_readFromStream_(IoSeq *self, BStream *stream)
69 {
70 BStream_readTaggedUArray_(stream, DATA(self));
71 }
72 */
73
74
IoSeq_newTag(void * state)75 IoTag *IoSeq_newTag(void *state)
76 {
77 IoTag *tag = IoTag_newWithName_(protoId);
78 IoTag_state_(tag, state);
79 IoTag_cloneFunc_(tag, (IoTagCloneFunc *)IoSeq_rawClone);
80 IoTag_freeFunc_(tag, (IoTagFreeFunc *)IoSeq_free);
81 IoTag_compareFunc_(tag, (IoTagCompareFunc *)IoSeq_compare);
82 //IoTag_writeToStreamFunc_(tag, (IoTagWriteToStreamFunc *)IoSeq_writeToStream_);
83 //IoTag_readFromStreamFunc_(tag, (IoTagReadFromStreamFunc *)IoSeq_readFromStream_);
84 return tag;
85 }
86
IoSeq_proto(void * state)87 IoSeq *IoSeq_proto(void *state)
88 {
89 IoObject *self = IoObject_new(state);
90
91 IoObject_tag_(self, IoSeq_newTag(state));
92 IoObject_setDataPointer_(self, UArray_new());
93
94 IoState_registerProtoWithId_((IoState *)state, self, protoId);
95 return self;
96 }
97
IoSeq_protoFinish(IoSeq * self)98 IoSeq *IoSeq_protoFinish(IoSeq *self)
99 {
100 IoSeq_addImmutableMethods(self);
101 IoSeq_addMutableMethods(self);
102 return self;
103 }
104
IoSeq_rawClone(IoSeq * proto)105 IoSeq *IoSeq_rawClone(IoSeq *proto)
106 {
107 if (ISSYMBOL(proto))
108 {
109 return proto;
110 }
111 else
112 {
113 IoSeq *self = IoObject_rawClonePrimitive(proto);
114 IoObject_setDataPointer_(self, UArray_clone(DATA(proto)));
115 return self;
116 }
117 }
118
119 // -----------------------------------------------------------
120
IoSeq_new(void * state)121 IoSeq *IoSeq_new(void *state)
122 {
123 IoSeq *proto = IoState_protoWithId_((IoState *)state, protoId);
124 return IOCLONE(proto);
125 }
126
IoSeq_newWithData_length_(void * state,const unsigned char * s,size_t length)127 IoSeq *IoSeq_newWithData_length_(void *state, const unsigned char *s, size_t length)
128 {
129 IoSeq *self = IoSeq_new(state);
130 UArray_setData_type_size_copy_(DATA(self), (uint8_t *)s, CTYPE_uint8_t, length, 1);
131 //UArray_convertToFixedSizeType(DATA(self));
132 return self;
133 }
134
IoSeq_newWithData_length_copy_(void * state,const unsigned char * s,size_t length,int copy)135 IoSeq *IoSeq_newWithData_length_copy_(void *state, const unsigned char *s, size_t length, int copy)
136 {
137 IoSeq *self = IoSeq_new(state);
138 UArray_setData_type_size_copy_(DATA(self), (uint8_t *)s, CTYPE_uint8_t, length, copy);
139 //UArray_convertToFixedSizeType(DATA(self));
140 return self;
141 }
142
IoSeq_newWithCString_(void * state,const char * s)143 IoSeq *IoSeq_newWithCString_(void *state, const char *s)
144 {
145 return IoSeq_newWithData_length_(state, (unsigned char *)s, strlen(s));
146 }
147
IoSeq_newWithCString_length_(void * state,const char * s,size_t length)148 IoSeq *IoSeq_newWithCString_length_(void *state, const char *s, size_t length)
149 {
150 return IoSeq_newWithData_length_(state, (unsigned char *)s, length);
151 }
152
IoSeq_newWithUArray_copy_(void * state,UArray * ba,int copy)153 IoSeq *IoSeq_newWithUArray_copy_(void *state, UArray *ba, int copy)
154 {
155 IoSeq *self = IoSeq_new(state);
156
157 if (copy)
158 {
159 UArray_copy_(DATA(self), ba);
160 }
161 else
162 {
163 UArray_free(DATA(self));
164 IoObject_setDataPointer_(self, ba);
165 }
166
167 return self;
168 }
169
IoSeq_asUTF8Seq(void * state,IoSeq * self)170 IoSeq *IoSeq_asUTF8Seq(void *state, IoSeq *self)
171 {
172 return IoSeq_newWithUArray_copy_(state, UArray_asUTF8(DATA(self)), 0);
173 }
174
IoSeq_newFromFilePath_(void * state,const char * path)175 IoSeq *IoSeq_newFromFilePath_(void *state, const char *path)
176 {
177 IoSeq *self = IoSeq_new(state);
178 UArray p = UArray_stackAllocedWithCString_((char *)path);
179 UArray_readFromFilePath_(DATA(self), &p);
180 return self;
181 }
182
IoSeq_rawMutableCopy(IoSeq * self)183 IoSeq *IoSeq_rawMutableCopy(IoSeq *self)
184 {
185 return IoSeq_newWithUArray_copy_(IOSTATE, DATA(self), 1);
186 }
187
188 // these Symbol creation methods should only be called by IoState ------
189
IoSeq_newSymbolWithData_length_(void * state,const char * s,size_t length)190 IoSymbol *IoSeq_newSymbolWithData_length_(void *state, const char *s, size_t length)
191 {
192 IoObject *self = IoSeq_new(state);
193 UArray_setData_type_size_copy_(DATA(self), (unsigned char *)s, CTYPE_uint8_t, length, 1);
194 return self;
195 }
196
IoSeq_newSymbolWithCString_(void * state,const char * s)197 IoSymbol *IoSeq_newSymbolWithCString_(void *state, const char *s)
198 {
199 return IoSeq_newSymbolWithData_length_(state, s, strlen(s));
200 }
201
IoSeq_newSymbolWithUArray_copy_(void * state,UArray * ba,int copy)202 IoSymbol *IoSeq_newSymbolWithUArray_copy_(void *state, UArray *ba, int copy)
203 {
204 IoObject *self = IoSeq_new(state);
205
206 if (copy)
207 {
208 UArray_copy_(DATA(self), ba);
209 }
210 else
211 {
212 UArray_free(DATA(self));
213 IoObject_setDataPointer_(self, ba);
214 }
215
216 return self;
217 }
218
219 // these Symbol creation methods can be called by anyone
220
IoSeq_newSymbolWithFormat_(void * state,const char * format,...)221 IoSymbol *IoSeq_newSymbolWithFormat_(void *state, const char *format, ...)
222 {
223 UArray *ba;
224 va_list ap;
225 va_start(ap, format);
226 ba = UArray_newWithVargs_(format, ap);
227 va_end(ap);
228 return IoState_symbolWithUArray_copy_(state, ba, 0);
229 }
230
231 // -----------------------------------------------------
232
IoSeq_free(IoSeq * self)233 void IoSeq_free(IoSeq *self)
234 {
235 if (IoObject_isSymbol(self))
236 {
237 //if(strcmp(CSTRING(self), "_x_") == 0) { printf("Symbol free '%s'\n", CSTRING(self)); }
238 //if(strlen(CSTRING(self)) < 100 && strncmp("0.", CSTRING(self), 2) != 0 ) { printf("Symbol free '%s'\n", CSTRING(self)); }
239 IoState_removeSymbol_(IOSTATE, self);
240 }
241
242 if (DATA(self) != NULL)
243 {
244 UArray_free(DATA(self));
245 }
246 }
247
IoSeq_compare(IoSeq * self,IoSeq * v)248 int IoSeq_compare(IoSeq *self, IoSeq *v)
249 {
250 if (ISSEQ(v))
251 {
252 if (self == v) return 0;
253 return UArray_compare_(DATA(self), DATA(v));
254 }
255
256 return IoObject_defaultCompare(self, v);
257 }
258
259 /*
260 UArray *IoSeq_rawUArray(IoSeq *self)
261 {
262 return DATA(self);
263 }
264 */
265
IoSeq_asCString(IoSeq * self)266 char *IoSeq_asCString(IoSeq *self)
267 {
268 return (char *)UArray_bytes(DATA(self));
269 }
270
IoSeq_rawBytes(IoSeq * self)271 unsigned char *IoSeq_rawBytes(IoSeq *self)
272 {
273 return (unsigned char *)UArray_bytes(DATA(self));
274 }
275
IoSeq_rawSize(IoSeq * self)276 size_t IoSeq_rawSize(IoSeq *self)
277 {
278 return (size_t)(UArray_size(DATA(self)));
279 }
280
IoSeq_rawSizeInBytes(IoSeq * self)281 size_t IoSeq_rawSizeInBytes(IoSeq *self)
282 {
283 return (size_t)(UArray_sizeInBytes(DATA(self)) );
284 }
285
IoSeq_asDouble(IoSeq * self)286 double IoSeq_asDouble(IoSeq *self)
287 {
288 return strtod((char *)UArray_bytes(DATA(self)), NULL);
289 }
290
291 // -----------------------------------------------------------
292
IoSeq_rawSetSize_(IoSeq * self,size_t size)293 void IoSeq_rawSetSize_(IoSeq *self, size_t size)
294 {
295 UArray_setSize_(DATA(self), size);
296 }
297
IoSeq_memorySize(IoSeq * self)298 size_t IoSeq_memorySize(IoSeq *self)
299 {
300 //return sizeof(IoSeq) + UArray_memorySize(DATA(self));
301 return 0;
302 }
303
IoSeq_compact(IoSeq * self)304 void IoSeq_compact(IoSeq *self)
305 {
306 //UArray_compact(DATA(self));
307 }
308
309 // -----------------------------------------------------------
310
IoSeq_rawAsUntriquotedSymbol(IoSeq * self)311 IoSymbol *IoSeq_rawAsUntriquotedSymbol(IoSeq *self)
312 {
313 UArray *a = UArray_clone(DATA(self));
314 UArray_unquote(a);
315 UArray_unquote(a);
316 UArray_unquote(a);
317 return IoState_symbolWithUArray_copy_(IOSTATE, a, 0);
318 }
319
IoSeq_rawAsUnquotedSymbol(IoSeq * self)320 IoSymbol *IoSeq_rawAsUnquotedSymbol(IoSeq *self)
321 {
322 UArray *a = UArray_clone(DATA(self));
323 /*
324 UArray *sa = DATA(self);
325 UArray *a = UArray_new();
326 UArray_setItemType_(a, UArray_itemType(sa));
327 UArray_setEncoding_(a, UArray_encoding(sa));
328 UArray_setSize_(a, UArray_size(sa));
329 UArray_copy_(a, sa);
330 */
331 UArray_unquote(a);
332 return IoState_symbolWithUArray_copy_(IOSTATE, a, 0);
333 }
334
IoSeq_rawAsUnescapedSymbol(IoSeq * self)335 IoSymbol *IoSeq_rawAsUnescapedSymbol(IoSeq *self)
336 {
337 UArray *a = UArray_clone(DATA(self));
338 UArray_unescape(a);
339 return IoState_symbolWithUArray_copy_(IOSTATE, a, 0);
340 }
341
IoSeq_rawAsDoubleFromHex(IoSeq * self)342 double IoSeq_rawAsDoubleFromHex(IoSeq *self)
343 {
344 char *s = IoSeq_asCString(self);
345 unsigned int i;
346
347 sscanf(s, "%x", &i);
348 return (double)i;
349 }
350
IoSeq_rawAsDoubleFromOctal(IoSeq * self)351 double IoSeq_rawAsDoubleFromOctal(IoSeq *self)
352 {
353 char *s = IoSeq_asCString(self);
354 unsigned int i;
355
356 sscanf(s, "%o", &i);
357 return (double)i;
358 }
359
IoSeq_rawEqualsCString_(IoSeq * self,const char * s)360 int IoSeq_rawEqualsCString_(IoSeq *self, const char *s)
361 {
362 return (strcmp((char *)UArray_bytes(DATA(self)), s) == 0);
363 }
364
IoSeq_rawIsNotAlphaNumeric(IoSeq * self)365 int IoSeq_rawIsNotAlphaNumeric(IoSeq *self)
366 {
367 char *s = (char *)UArray_bytes(DATA(self));
368
369 while (!isalnum((int)*s) && *s != 0)
370 {
371 s ++;
372 }
373
374 return (*s == 0);
375 }
376
377 /*
378 int IoSeq_rawIsNotAlphaNumeric(IoSeq *self)
379 {
380 char *s = (char *)UArray_bytes(DATA(self));
381
382 while (!isalnum((int)*s) && *s != 0)
383 {
384 s ++;
385 }
386
387 return (*s == 0);
388 }
389
390 unsigned int IoSeq_rawHashCode(IoSeq *self)
391 {
392 uintptr_t h = (uintptr_t)HASHIVAR(self);
393 return (unsigned int)h;
394 }
395
396 void IoSeq_rawSetHashCode_(IoSeq *self, unsigned int h)
397 {
398 HASHIVAR(self) = (void *)(uintptr_t)h;
399 }
400 */
401
402