2003-08-19 15:19:38 -04:00
|
|
|
#include "kernel.h"
|
|
|
|
|
2003-08-19 15:24:23 -04:00
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
extern int Get_Index (Object, Object);
|
|
|
|
|
|
|
|
Object General_Make_Vector (int len, Object fill, int konst) {
|
2003-08-19 15:19:38 -04:00
|
|
|
Object vec;
|
|
|
|
register Object *op;
|
|
|
|
GC_Node;
|
2003-08-19 15:24:23 -04:00
|
|
|
|
2003-08-19 15:19:38 -04:00
|
|
|
GC_Link (fill);
|
|
|
|
vec = Alloc_Object ((len-1) * sizeof (Object) + sizeof (struct S_Vector),
|
|
|
|
T_Vector, konst);
|
|
|
|
VECTOR(vec)->tag = Null;
|
|
|
|
VECTOR(vec)->size = len;
|
|
|
|
for (op = VECTOR(vec)->data; len--; op++)
|
|
|
|
*op = fill;
|
|
|
|
GC_Unlink;
|
|
|
|
return vec;
|
|
|
|
}
|
|
|
|
|
2003-08-19 15:24:23 -04:00
|
|
|
Object Make_Vector (int len, Object fill) {
|
2003-08-19 15:19:38 -04:00
|
|
|
return General_Make_Vector (len, fill, 0);
|
|
|
|
}
|
|
|
|
|
2003-08-19 15:24:23 -04:00
|
|
|
Object Make_Const_Vector (int len, Object fill) {
|
2003-08-19 15:19:38 -04:00
|
|
|
return General_Make_Vector (len, fill, 1);
|
|
|
|
}
|
|
|
|
|
2003-08-19 15:24:23 -04:00
|
|
|
Object P_Make_Vector (int argc, Object *argv) {
|
|
|
|
register int len;
|
2003-08-19 15:19:38 -04:00
|
|
|
|
|
|
|
if ((len = Get_Exact_Integer (argv[0])) < 0)
|
|
|
|
Range_Error (argv[0]);
|
|
|
|
return Make_Vector (len, argc == 1 ? Null : argv[1]);
|
|
|
|
}
|
|
|
|
|
2003-08-19 15:24:23 -04:00
|
|
|
Object P_Vector (int argc, Object *argv) {
|
2003-08-19 15:19:38 -04:00
|
|
|
Object vec;
|
2003-08-19 15:24:23 -04:00
|
|
|
register int i;
|
2003-08-19 15:19:38 -04:00
|
|
|
|
|
|
|
vec = Make_Vector (argc, Null);
|
|
|
|
for (i = 0; i < argc; i++)
|
|
|
|
VECTOR(vec)->data[i] = *argv++;
|
|
|
|
return vec;
|
|
|
|
}
|
|
|
|
|
2003-08-19 15:24:23 -04:00
|
|
|
Object P_Vectorp (Object x) {
|
2003-08-19 15:19:38 -04:00
|
|
|
return TYPE(x) == T_Vector ? True : False;
|
|
|
|
}
|
|
|
|
|
2003-08-19 15:24:23 -04:00
|
|
|
Object P_Vector_Length (Object x) {
|
2003-08-19 15:19:38 -04:00
|
|
|
Check_Type (x, T_Vector);
|
|
|
|
return Make_Integer (VECTOR(x)->size);
|
|
|
|
}
|
|
|
|
|
2003-08-19 15:24:23 -04:00
|
|
|
Object P_Vector_Ref (Object vec, Object n) {
|
2003-08-19 15:19:38 -04:00
|
|
|
Check_Type (vec, T_Vector);
|
|
|
|
return VECTOR(vec)->data[Get_Index (n, vec)];
|
|
|
|
}
|
|
|
|
|
2003-08-19 15:24:23 -04:00
|
|
|
Object P_Vector_Set (Object vec, Object n, Object new) {
|
2003-08-19 15:19:38 -04:00
|
|
|
Object old;
|
2003-08-19 15:24:23 -04:00
|
|
|
register int i;
|
2003-08-19 15:19:38 -04:00
|
|
|
|
|
|
|
Check_Type (vec, T_Vector);
|
|
|
|
Check_Mutable (vec);
|
|
|
|
old = VECTOR(vec)->data[i = Get_Index (n, vec)];
|
|
|
|
VECTOR(vec)->data[i] = new;
|
|
|
|
return old;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* We cannot simply call P_List with vec->size and vec->data here,
|
|
|
|
* because the latter can change during GC.
|
|
|
|
*/
|
2003-08-19 15:24:23 -04:00
|
|
|
Object P_Vector_To_List (Object vec) {
|
|
|
|
register int i;
|
2003-08-19 15:19:38 -04:00
|
|
|
Object list, tail, cell;
|
|
|
|
GC_Node3;
|
|
|
|
|
|
|
|
Check_Type (vec, T_Vector);
|
|
|
|
list = tail = Null;
|
|
|
|
GC_Link3 (vec, list, tail);
|
|
|
|
for (i = 0; i < VECTOR(vec)->size; i++, tail = cell) {
|
|
|
|
cell = Cons (VECTOR(vec)->data[i], Null);
|
|
|
|
if (Nullp (list))
|
|
|
|
list = cell;
|
|
|
|
else
|
|
|
|
(void)P_Set_Cdr (tail, cell);
|
|
|
|
}
|
|
|
|
GC_Unlink;
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
2003-08-19 15:24:23 -04:00
|
|
|
Object List_To_Vector (Object list, int konst) {
|
2003-08-19 15:19:38 -04:00
|
|
|
Object vec, len;
|
2003-08-19 15:24:23 -04:00
|
|
|
register int i;
|
2003-08-19 15:19:38 -04:00
|
|
|
GC_Node;
|
|
|
|
|
|
|
|
GC_Link (list);
|
|
|
|
len = P_Length (list);
|
|
|
|
if (konst)
|
|
|
|
vec = Make_Const_Vector (FIXNUM(len), Null);
|
|
|
|
else
|
|
|
|
vec = Make_Vector (FIXNUM(len), Null);
|
|
|
|
for (i = 0; i < FIXNUM(len); i++, list = Cdr (list))
|
|
|
|
VECTOR(vec)->data[i] = Car (list);
|
|
|
|
GC_Unlink;
|
|
|
|
return vec;
|
|
|
|
}
|
|
|
|
|
2003-08-19 15:24:23 -04:00
|
|
|
Object P_List_To_Vector (Object list) {
|
2003-08-19 15:19:38 -04:00
|
|
|
return List_To_Vector (list, 0);
|
|
|
|
}
|
|
|
|
|
2003-08-19 15:24:23 -04:00
|
|
|
Object P_Vector_Fill (Object vec, Object fill) {
|
|
|
|
register int i;
|
2003-08-19 15:19:38 -04:00
|
|
|
|
|
|
|
Check_Type (vec, T_Vector);
|
|
|
|
Check_Mutable (vec);
|
|
|
|
for (i = 0; i < VECTOR(vec)->size; i++)
|
|
|
|
VECTOR(vec)->data[i] = fill;
|
|
|
|
return vec;
|
|
|
|
}
|
|
|
|
|
2003-08-19 15:24:23 -04:00
|
|
|
Object P_Vector_Copy (Object vec) {
|
2003-08-19 15:19:38 -04:00
|
|
|
Object new;
|
|
|
|
GC_Node;
|
|
|
|
|
|
|
|
Check_Type (vec, T_Vector);
|
|
|
|
GC_Link (vec);
|
|
|
|
new = Make_Vector (VECTOR(vec)->size, Null);
|
2003-08-19 15:24:23 -04:00
|
|
|
memcpy (POINTER(new), POINTER(vec),
|
2003-08-19 15:19:38 -04:00
|
|
|
(VECTOR(vec)->size-1) * sizeof (Object) + sizeof (struct S_Vector));
|
|
|
|
GC_Unlink;
|
|
|
|
return new;
|
|
|
|
}
|