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