e576bb | 2002-10-11 | Martin Nilsson | |
|
aedfb1 | 2002-10-09 | Martin Nilsson | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "global.h"
#include "svalue.h"
#include "array.h"
#include "object.h"
#include "las.h"
#include "stralloc.h"
#include "interpret.h"
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | #include "opcodes.h"
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | #include "pike_error.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "pike_types.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "fsort.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "builtin_functions.h"
|
9aa6fa | 1997-05-19 | Fredrik Hübinette (Hubbe) | | #include "pike_memory.h"
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | #include "gc.h"
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | #include "main.h"
|
37775c | 2004-04-06 | Martin Nilsson | | #include "pike_security.h"
|
f9abcf | 1999-09-16 | Fredrik Hübinette (Hubbe) | | #include "stuff.h"
|
1b0ac8 | 1999-10-29 | Martin Stjernholm | | #include "bignum.h"
|
744580 | 2002-05-28 | Henrik Grubbström (Grubba) | | #include "cyclic.h"
|
99423b | 2003-04-26 | Martin Stjernholm | | #include "multiset.h"
|
aa0557 | 2004-08-20 | Martin Nilsson | | #include "mapping.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
a4159c | 2004-10-17 | Martin Nilsson | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array empty_array=
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
938632 | 2011-07-21 | Henrik Grubbström (Grubba) | | PIKE_CONSTANT_MEMOBJ_INIT(1, PIKE_T_ARRAY),
|
be08a8 | 2001-06-06 | Martin Stjernholm | | &weak_empty_array,
|
cd451f | 2004-03-15 | Martin Stjernholm | | 0,
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | 0,
0,
0,
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | 0,
|
611b06 | 2001-06-11 | Martin Stjernholm | | empty_array.real_item,
|
813337 | 2008-05-30 | Martin Stjernholm | | {SVALUE_INIT_FREE},
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | };
|
a4159c | 2004-10-17 | Martin Nilsson | |
|
be08a8 | 2001-06-06 | Martin Stjernholm | | PMOD_EXPORT struct array weak_empty_array=
{
|
938632 | 2011-07-21 | Henrik Grubbström (Grubba) | | PIKE_CONSTANT_MEMOBJ_INIT(1, PIKE_T_ARRAY),
|
5272b2 | 2004-09-22 | Martin Stjernholm | | 0, &empty_array, 0, 0, 0, ARRAY_WEAK_FLAG,
|
611b06 | 2001-06-11 | Martin Stjernholm | | weak_empty_array.real_item,
|
813337 | 2008-05-30 | Martin Stjernholm | | {SVALUE_INIT_FREE},
|
be08a8 | 2001-06-06 | Martin Stjernholm | | };
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
cd451f | 2004-03-15 | Martin Stjernholm | | struct array *first_array = &empty_array;
struct array *gc_internal_array = 0;
|
3b324d | 2005-12-04 | Martin Nilsson | | static struct array *gc_mark_array_pos;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
2523ce | 2003-04-28 | Martin Stjernholm | | #ifdef TRACE_UNFINISHED_TYPE_FIELDS
PMOD_EXPORT int accept_unfinished_type_fields = 0;
PMOD_EXPORT void dont_accept_unfinished_type_fields (void *orig)
{
accept_unfinished_type_fields = (int) orig;
}
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
a4159c | 2004-10-17 | Martin Nilsson | | |
c3f383 | 2004-10-17 | H. William Welliver III | | * @return A pointer to the allocated array struct.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
cde815 | 2004-09-30 | Martin Stjernholm | | PMOD_EXPORT struct array *real_allocate_array(ptrdiff_t size,
ptrdiff_t extra_space)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct array *v;
|
744580 | 2002-05-28 | Henrik Grubbström (Grubba) | | if(size+extra_space == 0)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
aa366d | 1998-04-16 | Fredrik Hübinette (Hubbe) | | add_ref(&empty_array);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return &empty_array;
}
|
35d571 | 2004-09-17 | Martin Nilsson | |
|
766bc8 | 2004-10-16 | Marcus Agehall | | if( (size_t)(size+extra_space-1) >
|
bebc47 | 2004-09-18 | Henrik Grubbström (Grubba) | | (LONG_MAX-sizeof(struct array))/sizeof(struct svalue) )
Pike_error("Too large array (size %ld exceeds %ld).\n",
(long)(size+extra_space-1),
(long)((LONG_MAX-sizeof(struct array))/sizeof(struct svalue)) );
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | v=(struct array *)malloc(sizeof(struct array)+
(size+extra_space-1)*sizeof(struct svalue));
if(!v)
|
40d6ed | 2006-05-10 | Martin Stjernholm | | Pike_error(msg_out_of_mem_2, sizeof(struct array)+
(size+extra_space-1)*sizeof(struct svalue));
|
7bf623 | 2000-04-23 | Martin Stjernholm | |
GC_ALLOC(v);
|
88cf4f | 2003-01-11 | Martin Stjernholm | |
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
|
98182c | 2005-04-06 | Henrik Grubbström (Grubba) | | if (size+extra_space)
|
2523ce | 2003-04-28 | Martin Stjernholm | |
v->type_field = BIT_MIXED | BIT_UNFINISHED;
else
v->type_field = 0;
|
cd8352 | 1998-02-02 | Fredrik Hübinette (Hubbe) | | v->flags=0;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
|
84f895 | 2000-08-16 | Henrik Grubbström (Grubba) | | v->malloced_size = DO_NOT_WARN((INT32)(size + extra_space));
|
b99ff8 | 2001-06-07 | Fredrik Hübinette (Hubbe) | | v->item=v->real_item;
|
84f895 | 2000-08-16 | Henrik Grubbström (Grubba) | | v->size = DO_NOT_WARN((INT32)size);
|
938632 | 2011-07-21 | Henrik Grubbström (Grubba) | | INIT_PIKE_MEMOBJ(v, T_ARRAY);
|
cd451f | 2004-03-15 | Martin Stjernholm | | DOUBLELINK (first_array, v);
|
65d99c | 2010-07-11 | Jonas Wallden | |
{
struct svalue *item = ITEM(v);
struct svalue *item_end = item + v->size;
while (item < item_end)
*item++ = svalue_int_zero;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
2a129b | 1996-03-24 | Fredrik Hübinette (Hubbe) | |
return v;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
a4159c | 2004-10-17 | Martin Nilsson | | |
c3f383 | 2004-10-17 | H. William Welliver III | | * Any values inside of the array will be kept.
* @param v The array to be freed.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
static void array_free_no_free(struct array *v)
{
|
cd451f | 2004-03-15 | Martin Stjernholm | | DOUBLEUNLINK (first_array, v);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
free((char *)v);
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | |
|
553d23 | 2000-09-14 | Martin Stjernholm | | GC_FREE(v);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
a4159c | 2004-10-17 | Martin Nilsson | | |
c3f383 | 2004-10-17 | H. William Welliver III | | * @param v The array to free.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void really_free_array(struct array *v)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5272b2 | 2004-09-22 | Martin Stjernholm | | if(v == & empty_array || v == &weak_empty_array)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Tried to free some *_empty_array.\n");
|
d631b8 | 2002-12-01 | Martin Stjernholm | | if (v->refs) {
#ifdef DEBUG_MALLOC
describe_something(v, T_ARRAY, 0,2,0, NULL);
#endif
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Freeing array with %d refs.\n", v->refs);
|
d631b8 | 2002-12-01 | Martin Stjernholm | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
ed36ce | 1996-08-12 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) array_check_type_field(v);
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
aa366d | 1998-04-16 | Fredrik Hübinette (Hubbe) | | add_ref(v);
|
45637c | 2001-04-07 | Fredrik Hübinette (Hubbe) | | EXIT_PIKE_MEMOBJ(v);
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | free_svalues(ITEM(v), v->size, v->type_field);
|
50ea68 | 2003-03-14 | Henrik Grubbström (Grubba) | | sub_ref(v);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | array_free_no_free(v);
}
|
c3f383 | 2004-10-17 | H. William Welliver III | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void do_free_array(struct array *a)
|
2a3269 | 1998-01-31 | Fredrik Hübinette (Hubbe) | | {
|
65b673 | 2000-07-07 | Martin Stjernholm | | if (a)
free_array(a);
|
2a3269 | 1998-01-31 | Fredrik Hübinette (Hubbe) | | }
|
c3f383 | 2004-10-17 | H. William Welliver III | | |
444289 | 2005-02-14 | Martin Stjernholm | | * Set the flags on an array. If the array is empty then only the
* weak flag is significant.
|
c3f383 | 2004-10-17 | H. William Welliver III | | */
|
be08a8 | 2001-06-06 | Martin Stjernholm | | PMOD_EXPORT struct array *array_set_flags(struct array *a, int flags)
{
if (a->size)
a->flags = flags;
else {
free_array(a);
|
444289 | 2005-02-14 | Martin Stjernholm | | if (flags & ARRAY_WEAK_FLAG)
add_ref(a = &weak_empty_array);
else
add_ref(a = &empty_array);
|
be08a8 | 2001-06-06 | Martin Stjernholm | | }
return a;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
a4159c | 2004-10-17 | Martin Nilsson | | |
c3f383 | 2004-10-17 | H. William Welliver III | | * Extract an svalue from an array. This function frees the contents of
* of the svalue 's' and replaces it with a copy of the
* contents from index 'index' in the array 'v'.
*
* @param index The index of the array to be extracted.
* @param s The recipient of the extracted array element.
* @param v The array to extract the element from.
*
* This function is similar to
* assign_svalue(s, v->item + n);
* except that it adds debug and safety measures. Usually, this function
* is not needed.
*
* @note If n is out of bounds, Pike will dump core. If Pike was compiled
* with DEBUG, a message will be written first stating what the problem was.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void array_index(struct svalue *s,struct array *v,INT32 index)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(index<0 || index>=v->size)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Illegal index in low level index routine.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
aa366d | 1998-04-16 | Fredrik Hübinette (Hubbe) | | add_ref(v);
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | assign_svalue(s, ITEM(v) + index);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | free_array(v);
}
|
67a0a3 | 2005-09-12 | H. William Welliver III | |
|
bcd801 | 2003-04-28 | Martin Stjernholm | | PMOD_EXPORT struct array *array_column (struct array *data, struct svalue *index,
int destructive)
|
fb567a | 2003-04-27 | Martin Stjernholm | | {
int e;
struct array *a;
TYPE_FIELD types = 0;
DECLARE_CYCLIC();
|
bcd801 | 2003-04-28 | Martin Stjernholm | | if(data->refs == 1 && destructive)
|
fb567a | 2003-04-27 | Martin Stjernholm | | {
struct svalue sval;
data->type_field = BIT_MIXED | BIT_UNFINISHED;
for(e=0;e<data->size;e++)
{
index_no_free(&sval, ITEM(data)+e, index);
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | types |= 1 << TYPEOF(sval);
|
fb567a | 2003-04-27 | Martin Stjernholm | | free_svalue(ITEM(data)+e);
move_svalue (ITEM(data) + e, &sval);
}
data->type_field = types;
|
00662f | 2003-04-27 | Martin Stjernholm | | add_ref (data);
|
fb567a | 2003-04-27 | Martin Stjernholm | | return data;
}
if((a=(struct array *)BEGIN_CYCLIC(data,0)))
{
add_ref(a);
}else{
push_array(a=allocate_array(data->size));
SET_CYCLIC_RET(a);
for(e=0;e<a->size;e++) {
index_no_free(ITEM(a)+e, ITEM(data)+e, index);
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | types |= 1 << TYPEOF(ITEM(a)[e]);
|
fb567a | 2003-04-27 | Martin Stjernholm | | }
a->type_field = types;
dmalloc_touch_svalue(Pike_sp-1);
Pike_sp--;
}
END_CYCLIC();
return a;
}
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void simple_array_index_no_free(struct svalue *s,
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | struct array *a,struct svalue *ind)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | switch(TYPEOF(*ind))
|
de2a58 | 1997-09-28 | Fredrik Hübinette (Hubbe) | | {
|
b99d88 | 2003-05-15 | Martin Stjernholm | | case T_INT: {
INT_TYPE p = ind->u.integer;
INT_TYPE i = p < 0 ? p + a->size : p;
|
bc68dc | 1998-04-29 | Henrik Grubbström (Grubba) | | if(i<0 || i>=a->size) {
|
8aefbc | 1999-03-19 | Fredrik Hübinette (Hubbe) | | struct svalue tmp;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(tmp, T_ARRAY, 0, array, a);
|
bc68dc | 1998-04-29 | Henrik Grubbström (Grubba) | | if (a->size) {
|
b99d88 | 2003-05-15 | Martin Stjernholm | | index_error(0,0,0,&tmp,ind,
"Index %"PRINTPIKEINT"d is out of array range "
|
2d76f2 | 2005-05-20 | Martin Stjernholm | | "%d..%d.\n", p, -a->size, a->size-1);
|
bc68dc | 1998-04-29 | Henrik Grubbström (Grubba) | | } else {
|
b99d88 | 2003-05-15 | Martin Stjernholm | | index_error(0,0,0,&tmp,ind,
"Attempt to index the empty array with %"PRINTPIKEINT"d.\n", p);
|
bc68dc | 1998-04-29 | Henrik Grubbström (Grubba) | | }
}
|
de2a58 | 1997-09-28 | Fredrik Hübinette (Hubbe) | | array_index_no_free(s,a,i);
break;
|
b99d88 | 2003-05-15 | Martin Stjernholm | | }
|
de2a58 | 1997-09-28 | Fredrik Hübinette (Hubbe) | |
case T_STRING:
|
ae5502 | 1999-08-17 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(*s, T_ARRAY, 0, array, array_column(a, ind, 0));
|
ae5502 | 1999-08-17 | Fredrik Hübinette (Hubbe) | | break;
}
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | |
|
de2a58 | 1997-09-28 | Fredrik Hübinette (Hubbe) | | default:
|
8aefbc | 1999-03-19 | Fredrik Hübinette (Hubbe) | | {
struct svalue tmp;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(tmp, T_ARRAY, 0, array, a);
|
ae5502 | 1999-08-17 | Fredrik Hübinette (Hubbe) | | index_error(0,0,0,&tmp,ind,"Array index is neither int nor string.\n");
|
8aefbc | 1999-03-19 | Fredrik Hübinette (Hubbe) | | }
|
de2a58 | 1997-09-28 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
a4159c | 2004-10-17 | Martin Nilsson | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void array_free_index(struct array *v,INT32 index)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(index<0 || index>=v->size)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Illegal index in low level free index routine.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | free_svalue(ITEM(v) + index);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
67a0a3 | 2005-09-12 | H. William Welliver III | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void simple_set_index(struct array *a,struct svalue *ind,struct svalue *s)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | switch (TYPEOF(*ind)) {
|
b99d88 | 2003-05-15 | Martin Stjernholm | | case T_INT: {
INT_TYPE p = ind->u.integer;
INT_TYPE i = p < 0 ? p + a->size : p;
|
ac9053 | 1999-08-17 | Martin Stjernholm | | if(i<0 || i>=a->size) {
if (a->size) {
|
b99d88 | 2003-05-15 | Martin Stjernholm | | Pike_error("Index %"PRINTPIKEINT"d is out of array range "
|
2d76f2 | 2005-05-20 | Martin Stjernholm | | "%d..%d.\n", p, -a->size, a->size-1);
|
ac9053 | 1999-08-17 | Martin Stjernholm | | } else {
|
b99d88 | 2003-05-15 | Martin Stjernholm | | Pike_error("Attempt to index the empty array with %"PRINTPIKEINT"d.\n", p);
|
ac9053 | 1999-08-17 | Martin Stjernholm | | }
}
array_set_index(a,i,s);
break;
|
b99d88 | 2003-05-15 | Martin Stjernholm | | }
|
ac9053 | 1999-08-17 | Martin Stjernholm | |
case T_STRING:
|
ae5502 | 1999-08-17 | Fredrik Hübinette (Hubbe) | | {
INT32 i, n;
check_stack(2);
|
e0e71a | 2008-03-29 | Martin Stjernholm | | mark_free_svalue (Pike_sp++);
|
ae5502 | 1999-08-17 | Fredrik Hübinette (Hubbe) | | push_svalue(ind);
for (i = 0, n = a->size; i < n; i++) {
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | assign_svalue(Pike_sp-2, &a->item[i]);
assign_lvalue(Pike_sp-2, s);
|
ac9053 | 1999-08-17 | Martin Stjernholm | | }
|
ae5502 | 1999-08-17 | Fredrik Hübinette (Hubbe) | | pop_n_elems(2);
break;
}
|
ac9053 | 1999-08-17 | Martin Stjernholm | |
default:
|
ae5502 | 1999-08-17 | Fredrik Hübinette (Hubbe) | | {
struct svalue tmp;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(tmp, T_ARRAY, 0, array, a);
|
ae5502 | 1999-08-17 | Fredrik Hübinette (Hubbe) | | index_error(0,0,0,&tmp,ind,"Array index is neither int nor string.\n");
}
|
bc68dc | 1998-04-29 | Henrik Grubbström (Grubba) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
a4159c | 2004-10-17 | Martin Nilsson | | |
0b9ca0 | 2008-05-12 | Henrik Grubbström (Grubba) | | * Insert an svalue into an array and grow the array if necessary.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *array_insert(struct array *v,struct svalue *s,INT32 index)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(index<0 || index>v->size)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Illegal index in low level insert routine.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | if(v->refs<=1 && (v->malloced_size > v->size))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | if ((v->item != v->real_item) &&
(((index<<1) < v->size) ||
((v->item + v->size) == (v->real_item + v->malloced_size)))) {
MEMMOVE((char *)(ITEM(v)-1),
(char *)(ITEM(v)),
index * sizeof(struct svalue));
v->item--;
} else {
MEMMOVE((char *)(ITEM(v)+index+1),
(char *)(ITEM(v)+index),
(v->size-index) * sizeof(struct svalue));
}
|
1ab4ac | 2008-01-26 | Martin Stjernholm | | assert_free_svalue (ITEM(v) + index);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | v->size++;
}else{
struct array *ret;
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | ret = array_set_flags(allocate_array_no_init(v->size+1, v->size + 1),
|
4821f1 | 2004-09-16 | Henrik Grubbström (Grubba) | | v->flags);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | ret->type_field = v->type_field;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | MEMCPY(ITEM(ret), ITEM(v), sizeof(struct svalue) * index);
|
0b9ca0 | 2008-05-12 | Henrik Grubbström (Grubba) | | MEMCPY(ITEM(ret)+index+1, ITEM(v)+index,
sizeof(struct svalue) * (v->size-index));
|
1ab4ac | 2008-01-26 | Martin Stjernholm | | assert_free_svalue (ITEM(ret) + index);
|
0b9ca0 | 2008-05-12 | Henrik Grubbström (Grubba) | | if (v->refs == 1) {
v->size = 0;
} else if (v->type_field & BIT_REF_TYPES) {
int e = v->size;
struct svalue *s = ITEM(ret);
while (e--) {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (TYPEOF(*s) <= MAX_REF_TYPE) add_ref(s->u.dummy);
|
0b9ca0 | 2008-05-12 | Henrik Grubbström (Grubba) | | s++;
}
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | free_array(v);
v=ret;
}
|
1ab4ac | 2008-01-26 | Martin Stjernholm | | array_set_index_no_free (v,index,s);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
return v;
}
|
677caa | 2007-12-17 | Henrik Grubbström (Grubba) | |
void o_append_array(INT32 args)
{
struct svalue *lval = Pike_sp - args;
struct svalue *val = lval + 2;
#ifdef PIKE_DEBUG
if (args < 3) {
Pike_fatal("Too few arguments to o_append_array(): %d\n", args);
}
#endif
args -= 3;
lvalue_to_svalue_no_free(val, lval);
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (TYPEOF(*val) == T_ARRAY) {
|
677caa | 2007-12-17 | Henrik Grubbström (Grubba) | | struct svalue tmp;
struct array *v = val->u.array;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(tmp, PIKE_T_INT, NUMBER_NUMBER, integer, 0);
|
677caa | 2007-12-17 | Henrik Grubbström (Grubba) | | assign_lvalue(lval, &tmp);
if (args == 1) {
val->u.array = array_insert(v, Pike_sp - 1, v->size);
pop_stack();
} else if (!args) {
if ((v->refs > 1) && (v->size)) {
val->u.array = copy_array(v);
free_array(v);
}
} else {
int i;
for (i = 0; i < args; i++) {
v = array_insert(v, val + 1 + i, v->size);
}
val->u.array = v;
pop_n_elems(args);
}
assign_lvalue(lval, val);
} else {
int i;
struct object *o;
struct program *p;
f_aggregate(args);
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if ((TYPEOF(*val) == T_OBJECT) &&
|
677caa | 2007-12-17 | Henrik Grubbström (Grubba) | |
((o = val->u.object)->refs <= 2) &&
(p = o->prog) &&
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | (i = FIND_LFUN(p->inherits[SUBTYPEOF(Pike_sp[-2])].prog,
|
677caa | 2007-12-17 | Henrik Grubbström (Grubba) | | LFUN_ADD_EQ)) != -1) {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | apply_low(o, i + p->inherits[SUBTYPEOF(Pike_sp[-2])].identifier_level, 1);
|
677caa | 2007-12-17 | Henrik Grubbström (Grubba) | |
pop_stack();
} else {
f_add(2);
assign_lvalue(lval, val);
}
}
stack_pop_2_elems_keep_top();
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
cafd51 | 2004-09-16 | Henrik Grubbström (Grubba) | | * Shrink an array destructively
*/
PMOD_EXPORT struct array *array_shrink(struct array *v, ptrdiff_t size)
{
struct array *a;
#ifdef PIKE_DEBUG
if(v->refs>2)
Pike_fatal("Array shrink on array with many references.\n");
if(size > v->size)
Pike_fatal("Illegal argument to array_shrink.\n");
#endif
|
cfd70d | 2008-07-01 | Martin Stjernholm | |
|
93d4a1 | 2006-02-19 | Martin Nilsson | | if( !size )
{
|
cfd70d | 2008-07-01 | Martin Stjernholm | | struct array *e = (v->flags & ARRAY_WEAK_FLAG ?
&weak_empty_array : &empty_array);
if (e != v) {
free_array (v);
add_ref (e);
}
return e;
|
93d4a1 | 2006-02-19 | Martin Nilsson | | }
|
cfd70d | 2008-07-01 | Martin Stjernholm | | if (size == v->size) return v;
|
93d4a1 | 2006-02-19 | Martin Nilsson | |
free_svalues(ITEM(v) + size, v->size - size, v->type_field);
|
203a2f | 2006-02-20 | Henrik Grubbström (Grubba) | | v->size=size;
|
93d4a1 | 2006-02-19 | Martin Nilsson | |
if(size*4 < v->malloced_size + 4)
|
cafd51 | 2004-09-16 | Henrik Grubbström (Grubba) | | {
a = array_set_flags(allocate_array_no_init(size, 0), v->flags);
if (a->size) {
a->type_field = v->type_field;
}
MEMCPY(ITEM(a), ITEM(v), size*sizeof(struct svalue));
v->size=0;
free_array(v);
return a;
}else{
return v;
}
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
476b38 | 2008-07-04 | Martin Stjernholm | | * Resize an array destructively, with the exception that a may be one
* of the static empty arrays.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *resize_array(struct array *a, INT32 size)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) array_check_type_field(a);
#endif
|
cfd70d | 2008-07-01 | Martin Stjernholm | |
|
476b38 | 2008-07-04 | Martin Stjernholm | | if (!size && a->malloced_size) return array_shrink (a, size);
|
cfd70d | 2008-07-01 | Martin Stjernholm | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(a->size == size) return a;
if(size > a->size)
{
|
4ac838 | 1997-04-16 | Fredrik Hübinette (Hubbe) | |
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | if((a->malloced_size >= size) &&
((a->item + size) <= (a->real_item + a->malloced_size)))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | for(;a->size < size; a->size++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(ITEM(a)[a->size], T_INT, NUMBER_NUMBER, integer, 0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | a->type_field |= BIT_INT;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return a;
|
cafd51 | 2004-09-16 | Henrik Grubbström (Grubba) | | } else {
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | struct array *ret;
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | ret = array_set_flags(low_allocate_array(size, size + 1), a->flags);
|
cafd51 | 2004-09-16 | Henrik Grubbström (Grubba) | | MEMCPY(ITEM(ret), ITEM(a), sizeof(struct svalue)*a->size);
|
a5cd6a | 2001-09-24 | Henrik Grubbström (Grubba) | | ret->type_field = DO_NOT_WARN((TYPE_FIELD)(a->type_field | BIT_INT));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | a->size=0;
free_array(a);
return ret;
}
|
cafd51 | 2004-09-16 | Henrik Grubbström (Grubba) | | } else {
return array_shrink(a, size);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
c3f383 | 2004-10-17 | H. William Welliver III | | * Remove an index from an array and shrink the array destructively.
* Because this function is destructive, and might free the region for 'v',
* do not use this function on arrays that might have been sent to a
* Pike function.
*
* @param v The array to operate on.
* @param index The index of the element to remove
* @return a new array with the contents of the input minus the removed index.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *array_remove(struct array *v,INT32 index)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct array *a;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(index<0 || index >= v->size)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Illegal argument to array_remove.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
array_free_index(v, index);
|
cafd51 | 2004-09-16 | Henrik Grubbström (Grubba) | | if (v->size == 1) {
v->size = 0;
return array_set_flags(v, v->flags);
} else if(v->size*4 + 4 < v->malloced_size )
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
cafd51 | 2004-09-16 | Henrik Grubbström (Grubba) | | a = array_set_flags(allocate_array_no_init(v->size-1, 0), v->flags);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | a->type_field = v->type_field;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | if(index>0)
MEMCPY(ITEM(a), ITEM(v), index*sizeof(struct svalue));
if(v->size-index>1)
MEMCPY(ITEM(a)+index,
ITEM(v)+index+1,
(v->size-index-1)*sizeof(struct svalue));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | v->size=0;
free_array(v);
return a;
|
cafd51 | 2004-09-16 | Henrik Grubbström (Grubba) | | } else {
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(v->size-index>1)
{
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | MEMMOVE((char *)(ITEM(v)+index),
(char *)(ITEM(v)+index+1),
(v->size-index-1)*sizeof(struct svalue));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
v->size--;
return v;
}
}
|
45df90 | 2013-05-17 | Per Hedbor | | static ptrdiff_t fast_array_search( struct array *v, struct svalue *s, ptrdiff_t start )
{
ptrdiff_t e;
|
e3d39a | 2013-05-17 | Per Hedbor | | struct svalue *ip = ITEM(v);
for(e=start;e<v->size;e++)
if(is_eq(ip+e,s))
return e;
|
45df90 | 2013-05-17 | Per Hedbor | | return -1;
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | * Search for in svalue in an array.
|
67a0a3 | 2005-09-12 | H. William Welliver III | | * @param v the array to search
* @param s the value to search for
* @param start the index to start search at
|
a4159c | 2004-10-17 | Martin Nilsson | | * @return the index if found, -1 otherwise
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
63540d | 2000-08-15 | Henrik Grubbström (Grubba) | | PMOD_EXPORT ptrdiff_t array_search(struct array *v, struct svalue *s,
ptrdiff_t start)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(start<0)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Start of find_index is less than zero.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
c9fba6 | 1997-06-06 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) array_check_type_field(v);
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | #endif
|
45df90 | 2013-05-17 | Per Hedbor | | check_destructed(s);
|
e3d39a | 2013-05-17 | Per Hedbor | |
if((v->type_field & (1 << TYPEOF(*s))) ||
(UNSAFE_IS_ZERO(s) && (v->type_field & (BIT_FUNCTION|BIT_OBJECT))) ||
( (v->type_field | (1<<TYPEOF(*s))) & BIT_OBJECT ))
return fast_array_search( v, s, start );
return -1;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
a4159c | 2004-10-17 | Martin Nilsson | | |
1230ab | 2008-07-18 | Henrik Grubbström (Grubba) | | * Slice a piece of an array (conditionally destructively)
|
67a0a3 | 2005-09-12 | H. William Welliver III | | * @param v the array to slice
* @param start the beginning element to be included
* @param end the element beyond the end of the slice
|
a4159c | 2004-10-17 | Martin Nilsson | | * @return an array consisting of v[start..end-1]
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
6aa68b | 2000-08-15 | Henrik Grubbström (Grubba) | | PMOD_EXPORT struct array *slice_array(struct array *v, ptrdiff_t start,
ptrdiff_t end)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct array *a;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(start > end || end>v->size || start<0)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Illegal arguments to slice_array()\n");
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | |
if(d_flag > 1) array_check_type_field(v);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
b99ff8 | 2001-06-07 | Fredrik Hübinette (Hubbe) | | if(v->refs==1)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
2cf7de | 2008-07-18 | Henrik Grubbström (Grubba) | | if((end-start)*4 > v->malloced_size)
|
b99ff8 | 2001-06-07 | Fredrik Hübinette (Hubbe) | | {
add_ref(v);
free_svalues(ITEM(v) + end, v->size - end, v->type_field);
free_svalues(ITEM(v), start, v->type_field);
v->item+=start;
v->size=end-start;
|
50a878 | 2001-06-07 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
if(d_flag>1)
check_array(v);
#endif
|
b99ff8 | 2001-06-07 | Fredrik Hübinette (Hubbe) | | return v;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | a=allocate_array_no_init(end-start,0);
|
cafd51 | 2004-09-16 | Henrik Grubbström (Grubba) | | if (end-start) {
a->type_field = v->type_field;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
cafd51 | 2004-09-16 | Henrik Grubbström (Grubba) | | assign_svalues_no_free(ITEM(a), ITEM(v)+start, end-start, v->type_field);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
return a;
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
0e124e | 1998-02-19 | Fredrik Hübinette (Hubbe) | | */
|
6aa68b | 2000-08-15 | Henrik Grubbström (Grubba) | | PMOD_EXPORT struct array *friendly_slice_array(struct array *v,
ptrdiff_t start,
ptrdiff_t end)
|
0e124e | 1998-02-19 | Fredrik Hübinette (Hubbe) | | {
struct array *a;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
0e124e | 1998-02-19 | Fredrik Hübinette (Hubbe) | | if(start > end || end>v->size || start<0)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Illegal arguments to slice_array()\n");
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | |
if(d_flag > 1) array_check_type_field(v);
|
0e124e | 1998-02-19 | Fredrik Hübinette (Hubbe) | | #endif
a=allocate_array_no_init(end-start,0);
a->type_field = v->type_field;
assign_svalues_no_free(ITEM(a), ITEM(v)+start, end-start, v->type_field);
return a;
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
67a0a3 | 2005-09-12 | H. William Welliver III | | * @param v the array to be copied.
* @returns the copy of the input array.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *copy_array(struct array *v)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct array *a;
|
5b2930 | 2001-06-26 | Henrik Grubbström (Grubba) | | if (!v->size) {
add_ref(&empty_array);
return &empty_array;
}
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | a=allocate_array_no_init(v->size, 0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | a->type_field = v->type_field;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | assign_svalues_no_free(ITEM(a), ITEM(v), v->size, v->type_field);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
return a;
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void check_array_for_destruct(struct array *v)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
int e;
INT16 types;
types = 0;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) array_check_type_field(v);
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(v->type_field & (BIT_OBJECT | BIT_FUNCTION))
{
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | for(e=0; e<v->size; e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if((TYPEOF(ITEM(v)[e]) == T_OBJECT ||
(TYPEOF(ITEM(v)[e]) == T_FUNCTION &&
SUBTYPEOF(ITEM(v)[e]) != FUNCTION_BUILTIN)) &&
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | (!ITEM(v)[e].u.object->prog))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | free_svalue(ITEM(v)+e);
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(ITEM(v)[e], T_INT, NUMBER_DESTRUCTED, integer, 0);
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
types |= BIT_INT;
}else{
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | types |= 1<<TYPEOF(ITEM(v)[e]);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
v->type_field = types;
}
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT INT32 array_find_destructed_object(struct array *v)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
INT32 e;
TYPE_FIELD types;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) array_check_type_field(v);
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(v->type_field & (BIT_OBJECT | BIT_FUNCTION))
{
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | types=0;
for(e=0; e<v->size; e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if((TYPEOF(ITEM(v)[e]) == T_OBJECT ||
(TYPEOF(ITEM(v)[e]) == T_FUNCTION &&
SUBTYPEOF(ITEM(v)[e]) != FUNCTION_BUILTIN)) &&
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | (!ITEM(v)[e].u.object->prog))
return e;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | types |= 1<<TYPEOF(ITEM(v)[e]);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
v->type_field = types;
}
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) array_check_type_field(v);
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return -1;
}
|
928ad6 | 1998-04-27 | Fredrik Hübinette (Hubbe) | | static int internal_cmpfun(INT32 *a,
INT32 *b,
cmpfun current_cmpfun,
struct svalue *current_array_p)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
99423b | 2003-04-26 | Martin Stjernholm | | int res = current_cmpfun(current_array_p + *a, current_array_p + *b);
return res ? res : *a - *b;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
928ad6 | 1998-04-27 | Fredrik Hübinette (Hubbe) | | #define CMP(X,Y) internal_cmpfun((X),(Y),current_cmpfun, current_array_p)
#define TYPE INT32
#define ID get_order_fsort
#define EXTRA_ARGS ,cmpfun current_cmpfun, struct svalue *current_array_p
#define XARGS ,current_cmpfun, current_array_p
#include "fsort_template.h"
#undef CMP
#undef TYPE
#undef ID
#undef EXTRA_ARGS
#undef XARGS
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | INT32 *get_order(struct array *v, cmpfun fun)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
INT32 e, *current_order;
|
928ad6 | 1998-04-27 | Fredrik Hübinette (Hubbe) | | ONERROR tmp;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
if(!v->size) return 0;
|
35d571 | 2004-09-17 | Martin Nilsson | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | current_order=(INT32 *)xalloc(v->size * sizeof(INT32));
|
928ad6 | 1998-04-27 | Fredrik Hübinette (Hubbe) | | SET_ONERROR(tmp, free, current_order);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | for(e=0; e<v->size; e++) current_order[e]=e;
|
928ad6 | 1998-04-27 | Fredrik Hübinette (Hubbe) | | get_order_fsort(current_order,
current_order+v->size-1,
fun,
ITEM(v));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
928ad6 | 1998-04-27 | Fredrik Hübinette (Hubbe) | | UNSET_ONERROR(tmp);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return current_order;
}
|
680737 | 2010-10-17 | Martin Stjernholm | |
|
314037 | 2010-10-09 | Martin Stjernholm | | static int lfun_cmp (const struct svalue *a, const struct svalue *b)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
f54c78 | 2004-12-22 | Henrik Grubbström (Grubba) | | struct program *p;
|
680737 | 2010-10-17 | Martin Stjernholm | | int default_res = -CMPFUN_UNORDERED, fun;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (TYPEOF(*a) == T_OBJECT && (p = a->u.object->prog)) {
if ((fun = FIND_LFUN(p->inherits[SUBTYPEOF(*a)].prog, LFUN_LT)) != -1) {
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | push_svalue(b);
|
f54c78 | 2004-12-22 | Henrik Grubbström (Grubba) | | apply_low(a->u.object,
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | fun + p->inherits[SUBTYPEOF(*a)].identifier_level, 1);
|
9b150a | 2002-05-11 | Martin Nilsson | | if(!UNSAFE_IS_ZERO(Pike_sp-1))
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | {
pop_stack();
return -1;
}
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | pop_stack();
|
680737 | 2010-10-17 | Martin Stjernholm | | default_res = CMPFUN_UNORDERED;
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | }
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if ((fun = FIND_LFUN(p->inherits[SUBTYPEOF(*a)].prog, LFUN_GT)) != -1) {
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | push_svalue(b);
|
f54c78 | 2004-12-22 | Henrik Grubbström (Grubba) | | apply_low(a->u.object,
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | fun + p->inherits[SUBTYPEOF(*a)].identifier_level, 1);
|
9b150a | 2002-05-11 | Martin Nilsson | | if(!UNSAFE_IS_ZERO(Pike_sp-1))
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | {
pop_stack();
return 1;
}
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | pop_stack();
|
680737 | 2010-10-17 | Martin Stjernholm | | default_res = CMPFUN_UNORDERED;
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | }
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
186ab2 | 2012-04-07 | Henrik Grubbström (Grubba) | |
if ((default_res == CMPFUN_UNORDERED) &&
(fun = FIND_LFUN(p->inherits[SUBTYPEOF(*a)].prog, LFUN_EQ)) != -1) {
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | push_svalue(b);
|
f54c78 | 2004-12-22 | Henrik Grubbström (Grubba) | | apply_low(a->u.object,
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | fun + p->inherits[SUBTYPEOF(*a)].identifier_level, 1);
|
9b150a | 2002-05-11 | Martin Nilsson | | if (!UNSAFE_IS_ZERO(Pike_sp-1)) {
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | pop_stack();
return 0;
}
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | pop_stack();
}
}
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if(TYPEOF(*b) == T_OBJECT && (p = b->u.object->prog)) {
if ((fun = FIND_LFUN(p->inherits[SUBTYPEOF(*b)].prog, LFUN_LT)) != -1) {
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | push_svalue(a);
|
f54c78 | 2004-12-22 | Henrik Grubbström (Grubba) | | apply_low(b->u.object,
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | fun + p->inherits[SUBTYPEOF(*b)].identifier_level, 1);
|
9b150a | 2002-05-11 | Martin Nilsson | | if(!UNSAFE_IS_ZERO(Pike_sp-1))
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | {
pop_stack();
return 1;
}
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | pop_stack();
|
680737 | 2010-10-17 | Martin Stjernholm | | default_res = CMPFUN_UNORDERED;
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | }
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if ((fun = FIND_LFUN(p->inherits[SUBTYPEOF(*b)].prog, LFUN_GT)) != -1) {
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | push_svalue(a);
|
f54c78 | 2004-12-22 | Henrik Grubbström (Grubba) | | apply_low(b->u.object,
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | fun + p->inherits[SUBTYPEOF(*b)].identifier_level, 1);
|
9b150a | 2002-05-11 | Martin Nilsson | | if(!UNSAFE_IS_ZERO(Pike_sp-1))
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | {
pop_stack();
return -1;
}
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | pop_stack();
|
680737 | 2010-10-17 | Martin Stjernholm | | default_res = CMPFUN_UNORDERED;
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | }
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
186ab2 | 2012-04-07 | Henrik Grubbström (Grubba) | |
if ((default_res == CMPFUN_UNORDERED) &&
(fun = FIND_LFUN(p->inherits[SUBTYPEOF(*b)].prog, LFUN_EQ)) != -1) {
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | push_svalue(a);
|
f54c78 | 2004-12-22 | Henrik Grubbström (Grubba) | | apply_low(b->u.object,
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | fun + p->inherits[SUBTYPEOF(*b)].identifier_level, 1);
|
9b150a | 2002-05-11 | Martin Nilsson | | if (!UNSAFE_IS_ZERO(Pike_sp-1)) {
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | pop_stack();
return 0;
}
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | pop_stack();
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | |
|
314037 | 2010-10-09 | Martin Stjernholm | | return default_res;
|
99423b | 2003-04-26 | Martin Stjernholm | | }
|
314037 | 2010-10-09 | Martin Stjernholm | | static int obj_or_func_cmp (const struct svalue *a, const struct svalue *b)
|
99423b | 2003-04-26 | Martin Stjernholm | | {
|
314037 | 2010-10-09 | Martin Stjernholm | | int a_subtype, b_subtype, res;
struct svalue tmp_a, tmp_b;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | assert ((TYPEOF(*a) == T_OBJECT && TYPEOF(*b) == T_OBJECT) ||
(TYPEOF(*a) == T_FUNCTION && TYPEOF(*b) == T_FUNCTION));
|
314037 | 2010-10-09 | Martin Stjernholm | |
if (a->u.object == b->u.object)
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | return SUBTYPEOF(*a) - SUBTYPEOF(*b);
|
314037 | 2010-10-09 | Martin Stjernholm | |
|
ec25f9 | 2011-03-06 | Martin Stjernholm | | * greater than others. That makes them sort close to real zeroes,
* which are sorted after objects without compare functions. */
|
314037 | 2010-10-09 | Martin Stjernholm | | if (!a->u.object->prog)
return !b->u.object->prog ? 0 : 1;
else if (!b->u.object->prog)
return -1;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (TYPEOF(*a) == T_FUNCTION) {
|
6f3c9b | 2011-03-31 | Martin Stjernholm | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (SUBTYPEOF(*a) == FUNCTION_BUILTIN) {
if (SUBTYPEOF(*b) == FUNCTION_BUILTIN)
|
6f3c9b | 2011-03-31 | Martin Stjernholm | | return a->u.efun < b->u.efun ? -1 : (a->u.efun == b->u.efun ? 0 : 1);
else
return 1;
}
else
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (SUBTYPEOF(*b) == FUNCTION_BUILTIN)
|
6f3c9b | 2011-03-31 | Martin Stjernholm | | return -1;
|
314037 | 2010-10-09 | Martin Stjernholm | | if (a->u.object->prog != b->u.object->prog)
return a->u.object->prog < b->u.object->prog ? -1 : 1;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (SUBTYPEOF(*a) != SUBTYPEOF(*b))
return SUBTYPEOF(*a) - SUBTYPEOF(*b);
|
314037 | 2010-10-09 | Martin Stjernholm | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | a_subtype = b_subtype = SUBTYPEOF(*a);
SET_SVAL(tmp_a, T_OBJECT, 0, object, a->u.object);
|
314037 | 2010-10-09 | Martin Stjernholm | | a = &tmp_a;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(tmp_b, T_OBJECT, 0, object, b->u.object);
|
314037 | 2010-10-09 | Martin Stjernholm | | b = &tmp_b;
}
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
314037 | 2010-10-09 | Martin Stjernholm | | else {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | a_subtype = SUBTYPEOF(*a);
b_subtype = SUBTYPEOF(*b);
|
314037 | 2010-10-09 | Martin Stjernholm | | }
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
314037 | 2010-10-09 | Martin Stjernholm | | res = lfun_cmp (a, b);
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
680737 | 2010-10-17 | Martin Stjernholm | | if (res == -CMPFUN_UNORDERED) {
|
314037 | 2010-10-09 | Martin Stjernholm | |
if (a->u.object->prog == b->u.object->prog)
return a->u.object < b->u.object ? -1 : 1;
else
return a->u.object->prog < b->u.object->prog ? -1 : 1;
|
99423b | 2003-04-26 | Martin Stjernholm | | }
|
dd8a32 | 2011-03-31 | Martin Stjernholm | | else if (!res)
return a_subtype - b_subtype;
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
680737 | 2010-10-17 | Martin Stjernholm | | return res;
|
314037 | 2010-10-09 | Martin Stjernholm | | }
int set_svalue_cmpfun(const struct svalue *a, const struct svalue *b)
{
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | int typediff = TYPEOF(*a) - TYPEOF(*b);
|
314037 | 2010-10-09 | Martin Stjernholm | | if (typediff) {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (TYPEOF(*a) == T_OBJECT || TYPEOF(*b) == T_OBJECT) {
|
314037 | 2010-10-09 | Martin Stjernholm | | int res = lfun_cmp (a, b);
|
680737 | 2010-10-17 | Martin Stjernholm | | if (res != -CMPFUN_UNORDERED) return res;
|
314037 | 2010-10-09 | Martin Stjernholm | | }
return typediff;
}
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | switch(TYPEOF(*a))
|
314037 | 2010-10-09 | Martin Stjernholm | | {
case T_FLOAT:
if(a->u.float_number < b->u.float_number) return -1;
if(a->u.float_number > b->u.float_number) return 1;
return 0;
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
314037 | 2010-10-09 | Martin Stjernholm | | case T_INT:
if(a->u.integer < b->u.integer) return -1;
if(a->u.integer > b->u.integer) return 1;
return 0;
|
f54c78 | 2004-12-22 | Henrik Grubbström (Grubba) | |
|
314037 | 2010-10-09 | Martin Stjernholm | | case T_OBJECT:
case T_FUNCTION:
return obj_or_func_cmp (a, b);
|
f54c78 | 2004-12-22 | Henrik Grubbström (Grubba) | |
|
314037 | 2010-10-09 | Martin Stjernholm | | default:
if(a->u.refs < b->u.refs) return -1;
if(a->u.refs > b->u.refs) return 1;
|
99423b | 2003-04-26 | Martin Stjernholm | | return 0;
}
|
314037 | 2010-10-09 | Martin Stjernholm | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
e4acf8 | 2001-04-30 | Martin Stjernholm | | static int switch_svalue_cmpfun(const struct svalue *a, const struct svalue *b)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | int typediff = TYPEOF(*a) - TYPEOF(*b);
|
314037 | 2010-10-09 | Martin Stjernholm | | if (typediff)
return typediff;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | switch(TYPEOF(*a))
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | {
|
314037 | 2010-10-09 | Martin Stjernholm | | case T_INT:
if(a->u.integer < b->u.integer) return -1;
if(a->u.integer > b->u.integer) return 1;
return 0;
case T_FLOAT:
if(a->u.float_number < b->u.float_number) return -1;
if(a->u.float_number > b->u.float_number) return 1;
return 0;
case T_STRING:
return DO_NOT_WARN((int)my_quick_strcmp(a->u.string, b->u.string));
case T_OBJECT:
case T_FUNCTION:
return obj_or_func_cmp (a, b);
default:
if(a->u.refs < b->u.refs) return -1;
if(a->u.refs > b->u.refs) return 1;
return 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
314037 | 2010-10-09 | Martin Stjernholm | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
e2e08f | 2009-11-28 | Martin Stjernholm | | int alpha_svalue_cmpfun(const struct svalue *a, const struct svalue *b)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | int typediff = TYPEOF(*a) - TYPEOF(*b);
|
314037 | 2010-10-09 | Martin Stjernholm | | if (typediff) {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (TYPEOF(*a) == T_OBJECT || TYPEOF(*b) == T_OBJECT) {
|
314037 | 2010-10-09 | Martin Stjernholm | | int res = lfun_cmp (a, b);
|
680737 | 2010-10-17 | Martin Stjernholm | | if (res != -CMPFUN_UNORDERED) return res;
|
314037 | 2010-10-09 | Martin Stjernholm | | }
return typediff;
}
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | switch(TYPEOF(*a))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
314037 | 2010-10-09 | Martin Stjernholm | | case T_INT:
if(a->u.integer < b->u.integer) return -1;
if(a->u.integer > b->u.integer) return 1;
return 0;
case T_FLOAT:
if(a->u.float_number < b->u.float_number) return -1;
if(a->u.float_number > b->u.float_number) return 1;
return 0;
case T_STRING:
return DO_NOT_WARN((int)my_quick_strcmp(a->u.string, b->u.string));
case T_ARRAY:
if(a==b) return 0;
if (!a->u.array->size)
if (!b->u.array->size)
return 0;
else
return -1;
else
if (!b->u.array->size)
return 1;
return alpha_svalue_cmpfun(ITEM(a->u.array), ITEM(b->u.array));
case T_MULTISET:
if (a == b) return 0;
{
ptrdiff_t a_pos = multiset_first (a->u.multiset);
ptrdiff_t b_pos = multiset_first (b->u.multiset);
int res;
struct svalue ind_a, ind_b;
if (a_pos < 0)
if (b_pos < 0)
|
99423b | 2003-04-26 | Martin Stjernholm | | return 0;
else
return -1;
else
|
314037 | 2010-10-09 | Martin Stjernholm | | if (b_pos < 0)
|
99423b | 2003-04-26 | Martin Stjernholm | | return 1;
|
314037 | 2010-10-09 | Martin Stjernholm | | res = alpha_svalue_cmpfun (
use_multiset_index (a->u.multiset, a_pos, ind_a),
use_multiset_index (b->u.multiset, b_pos, ind_b));
sub_msnode_ref (a->u.multiset);
sub_msnode_ref (b->u.multiset);
return res;
}
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
314037 | 2010-10-09 | Martin Stjernholm | | case T_OBJECT:
case T_FUNCTION:
return obj_or_func_cmp (a, b);
|
99423b | 2003-04-26 | Martin Stjernholm | |
|
314037 | 2010-10-09 | Martin Stjernholm | | default:
if(a->u.ptr < b->u.ptr) return -1;
if(a->u.ptr > b->u.ptr) return 1;
return 0;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
928ad6 | 1998-04-27 | Fredrik Hübinette (Hubbe) | | #define CMP(X,Y) alpha_svalue_cmpfun(X,Y)
#define TYPE struct svalue
#define ID low_sort_svalues
#include "fsort_template.h"
#undef CMP
#undef TYPE
#undef ID
|
3325cd | 2007-12-24 | Henrik Grubbström (Grubba) | |
static int alpha_int_svalue_cmpfun(const struct svalue *a, const struct svalue *b)
{
#ifdef PIKE_DEBUG
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if ((TYPEOF(*a) != T_INT) || (TYPEOF(*b) != T_INT)) {
|
3325cd | 2007-12-24 | Henrik Grubbström (Grubba) | | Pike_fatal("Invalid elements in supposedly integer array.\n");
}
#endif /* PIKE_DEBUG */
if(a->u.integer < b->u.integer) return -1;
if(a->u.integer > b->u.integer) return 1;
return 0;
}
#define CMP(X,Y) alpha_int_svalue_cmpfun(X,Y)
#define TYPE struct svalue
#define ID low_sort_int_svalues
#include "fsort_template.h"
#undef CMP
#undef TYPE
#undef ID
|
a4159c | 2004-10-17 | Martin Nilsson | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void sort_array_destructively(struct array *v)
|
f5f7b1 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
if(!v->size) return;
|
3325cd | 2007-12-24 | Henrik Grubbström (Grubba) | | if (v->type_field == BIT_INT) {
low_sort_int_svalues(ITEM(v), ITEM(v)+v->size-1);
} else {
low_sort_svalues(ITEM(v), ITEM(v)+v->size-1);
}
|
f5f7b1 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
|
99423b | 2003-04-26 | Martin Stjernholm | | #define SORT_BY_INDEX
#define EXTRA_LOCALS int cmpfun_res;
|
680737 | 2010-10-17 | Martin Stjernholm | | #define CMP(X,Y) ((cmpfun_res = \
(alpha_svalue_cmpfun(svals + X, svals + Y) & \
~CMPFUN_UNORDERED)) ? \
|
99423b | 2003-04-26 | Martin Stjernholm | | cmpfun_res : pos[X] - pos[Y])
#define SWAP(X,Y) { \
{struct svalue tmp = svals[X]; svals[X] = svals[Y]; svals[Y] = tmp;} \
{int tmp = pos[X]; pos[X] = pos[Y]; pos[Y] = tmp;} \
}
#define TYPE struct svalue
#define ID low_stable_sort_svalues
#define EXTRA_ARGS , struct svalue *svals, INT32 *pos, int size
#define XARGS , svals, pos, size
#include "fsort_template.h"
#undef SORT_BY_INDEX
#undef EXTRA_LOCALS
#undef CMP
#undef SWAP
#undef TYPE
#undef ID
#undef EXTRA_ARGS
#undef XARGS
|
a4159c | 2004-10-17 | Martin Nilsson | | |
99423b | 2003-04-26 | Martin Stjernholm | | * get_alpha_order. */
PMOD_EXPORT INT32 *stable_sort_array_destructively(struct array *v)
{
INT32 *current_order;
ONERROR tmp;
int e;
if(!v->size) return NULL;
|
e1b044 | 2008-02-12 | Henrik Grubbström (Grubba) | |
|
99423b | 2003-04-26 | Martin Stjernholm | | current_order=(INT32 *)xalloc(v->size * sizeof(INT32));
SET_ONERROR(tmp, free, current_order);
for(e=0; e<v->size; e++) current_order[e]=e;
low_stable_sort_svalues (0, v->size - 1, ITEM (v), current_order, v->size);
UNSET_ONERROR (tmp);
return current_order;
}
|
f5f7b1 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
|
a4159c | 2004-10-17 | Martin Nilsson | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT INT32 *get_set_order(struct array *a)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | return get_order(a, set_svalue_cmpfun);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
a4159c | 2004-10-17 | Martin Nilsson | | |
40e919 | 2000-03-26 | Martin Stjernholm | | *
* Note: This is used by encode_value_canonic(). It must keep the
* sorting rules for all the types that function allows in multiset
* and mapping indices.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT INT32 *get_switch_order(struct array *a)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | return get_order(a, switch_svalue_cmpfun);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
a4159c | 2004-10-17 | Martin Nilsson | | |
71b72b | 1996-06-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT INT32 *get_alpha_order(struct array *a)
|
71b72b | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
return get_order(a, alpha_svalue_cmpfun);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
static INT32 low_lookup(struct array *v,
struct svalue *s,
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | cmpfun fun)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
INT32 a,b,c;
int q;
|
f9771c | 1995-11-15 | Fredrik Hübinette (Hubbe) | |
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | a=0;
b=v->size;
while(b > a)
{
c=(a+b)/2;
q=fun(ITEM(v)+c,s);
if(q < 0)
a=c+1;
else if(q > 0)
b=c;
else
return c;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | if(a<v->size && fun(ITEM(v)+a,s)<0) a++;
return ~a;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
INT32 set_lookup(struct array *a, struct svalue *s)
{
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) array_check_type_field(a);
#endif
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if(TYPEOF(*s) != T_OBJECT && !(a->type_field & BIT_OBJECT))
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if( (((2 << TYPEOF(*s)) -1) & a->type_field) == 0)
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | return -1;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if( ((BIT_MIXED << TYPEOF(*s)) & BIT_MIXED & a->type_field) == 0)
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | return ~a->size;
}
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
return low_lookup(a,s,set_svalue_cmpfun);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
INT32 switch_lookup(struct array *a, struct svalue *s)
{
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) array_check_type_field(a);
#endif
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if(TYPEOF(*s) != T_OBJECT && !(a->type_field & BIT_OBJECT))
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if( (((2 << TYPEOF(*s)) -1) & a->type_field) == 0)
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | return -1;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if( ((BIT_MIXED << TYPEOF(*s)) & BIT_MIXED & a->type_field) == 0)
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | return ~a->size;
}
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
return low_lookup(a,s,switch_svalue_cmpfun);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
a4159c | 2004-10-17 | Martin Nilsson | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *order_array(struct array *v, INT32 *order)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | reorder((char *)ITEM(v),v->size,sizeof(struct svalue),order);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return v;
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *reorder_and_copy_array(struct array *v, INT32 *order)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
INT32 e;
struct array *ret;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | ret=allocate_array_no_init(v->size, 0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | ret->type_field = v->type_field;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | for(e=0;e<v->size;e++)
assign_svalue_no_free(ITEM(ret)+e, ITEM(v)+order[e]);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
return ret;
}
|
f600d2 | 2004-05-14 | Martin Nilsson | | PMOD_EXPORT TYPE_FIELD array_fix_type_field(struct array *v)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
int e;
TYPE_FIELD t;
|
cd8352 | 1998-02-02 | Fredrik Hübinette (Hubbe) | | if(v->flags & ARRAY_LVALUE)
{
|
2523ce | 2003-04-28 | Martin Stjernholm | | v->type_field=BIT_MIXED|BIT_UNFINISHED;
|
f600d2 | 2004-05-14 | Martin Nilsson | | return BIT_MIXED|BIT_UNFINISHED;
|
cd8352 | 1998-02-02 | Fredrik Hübinette (Hubbe) | | }
|
132760 | 2004-09-27 | Martin Nilsson | | t=0;
|
2523ce | 2003-04-28 | Martin Stjernholm | | for(e=0; e<v->size; e++) {
check_svalue (ITEM(v) + e);
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | t |= 1 << TYPEOF(ITEM(v)[e]);
|
2523ce | 2003-04-28 | Martin Stjernholm | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
afa365 | 1996-02-10 | Fredrik Hübinette (Hubbe) | | if(t & ~(v->type_field))
|
6fdf36 | 1998-05-12 | Fredrik Hübinette (Hubbe) | | {
describe(v);
|
cd5bb8 | 2003-10-15 | Henrik Grubbström (Grubba) | | Pike_fatal("Type field out of order (old:0x%04x new:0x%04x)!\n",
v->type_field, t);
|
6fdf36 | 1998-05-12 | Fredrik Hübinette (Hubbe) | | }
|
afa365 | 1996-02-10 | Fredrik Hübinette (Hubbe) | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | v->type_field = t;
|
f600d2 | 2004-05-14 | Martin Nilsson | | return t;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | |
|
ec0eea | 2006-07-05 | Martin Stjernholm | | PMOD_EXPORT void array_check_type_field(struct array *v)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | int e;
TYPE_FIELD t;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | t=0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
cd8352 | 1998-02-02 | Fredrik Hübinette (Hubbe) | | if(v->flags & ARRAY_LVALUE)
return;
|
2523ce | 2003-04-28 | Martin Stjernholm | | #ifdef TRACE_UNFINISHED_TYPE_FIELDS
if (v->type_field & BIT_UNFINISHED && !accept_unfinished_type_fields) {
fputs ("Array got an unfinished type field.\n", stderr);
describe_something (v, T_ARRAY, 2, 2, 0, NULL);
}
#endif
|
cd8352 | 1998-02-02 | Fredrik Hübinette (Hubbe) | | for(e=0; e<v->size; e++)
{
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if(TYPEOF(ITEM(v)[e]) > MAX_TYPE)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Type is out of range.\n");
|
cd8352 | 1998-02-02 | Fredrik Hübinette (Hubbe) | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | t |= 1 << TYPEOF(ITEM(v)[e]);
|
cd8352 | 1998-02-02 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | if(t & ~(v->type_field))
|
6fdf36 | 1998-05-12 | Fredrik Hübinette (Hubbe) | | {
describe(v);
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Type field out of order!\n");
|
6fdf36 | 1998-05-12 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
d8946e | 2004-03-09 | Martin Nilsson | | #endif /* PIKE_DEBUG */
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
a4159c | 2004-10-17 | Martin Nilsson | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | * type. The 'union anything' may be changed, but not the type.
*/
|
fa8c69 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT union anything *low_array_get_item_ptr(struct array *a,
|
cafd51 | 2004-09-16 | Henrik Grubbström (Grubba) | | INT32 ind,
TYPE_T t)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if(TYPEOF(ITEM(a)[ind]) == t) return & (ITEM(a)[ind].u);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return 0;
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | * type. The 'union anything' may be changed, but not the type.
* The differance between this routine and the one above is that this takes
* the index as an svalue.
*/
|
fa8c69 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT union anything *array_get_item_ptr(struct array *a,
|
cafd51 | 2004-09-16 | Henrik Grubbström (Grubba) | | struct svalue *ind,
TYPE_T t)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
b99d88 | 2003-05-15 | Martin Stjernholm | | INT_TYPE i, p;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if(TYPEOF(*ind) != T_INT)
|
e3f1e8 | 2003-04-28 | Martin Stjernholm | | Pike_error("Expected integer as array index, got %s.\n",
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | get_name_of_type (TYPEOF(*ind)));
|
b99d88 | 2003-05-15 | Martin Stjernholm | | p = ind->u.integer;
i = p < 0 ? p + a->size : p;
|
bc68dc | 1998-04-29 | Henrik Grubbström (Grubba) | | if(i<0 || i>=a->size) {
if (a->size) {
|
b99d88 | 2003-05-15 | Martin Stjernholm | | Pike_error("Index %"PRINTPIKEINT"d is out of array range "
|
2d76f2 | 2005-05-20 | Martin Stjernholm | | "%d..%d.\n", p, -a->size, a->size-1);
|
bc68dc | 1998-04-29 | Henrik Grubbström (Grubba) | | } else {
|
b99d88 | 2003-05-15 | Martin Stjernholm | | Pike_error("Attempt to index the empty array with %"PRINTPIKEINT"d.\n", p);
|
bc68dc | 1998-04-29 | Henrik Grubbström (Grubba) | | }
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return low_array_get_item_ptr(a,i,t);
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | * to maintain the order.
|
a4159c | 2004-10-17 | Martin Nilsson | | * The first item in this array is the size of the result
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | * the rest is n >= 0 for a[ n ]
|
a4159c | 2004-10-17 | Martin Nilsson | | * or n < 0 for b[ ~n ].
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
INT32 * merge(struct array *a,struct array *b,INT32 opcode)
{
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | ONERROR r;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | INT32 ap,bp,i,*ret,*ptr;
ap=bp=0;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1)
{
array_check_type_field(a);
array_check_type_field(b);
}
#endif
|
52b76f | 2003-11-09 | Martin Stjernholm | | if(!(a->type_field & b->type_field) &&
!((a->type_field | b->type_field) & BIT_OBJECT))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
switch(opcode)
{
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | case PIKE_ARRAY_OP_AND:
|
35d571 | 2004-09-17 | Martin Nilsson | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | ret=(INT32 *)xalloc(sizeof(INT32));
*ret=0;
return ret;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | case PIKE_ARRAY_OP_SUB:
|
35d571 | 2004-09-17 | Martin Nilsson | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | ptr=ret=(INT32 *)xalloc(sizeof(INT32)*(a->size+1));
*(ptr++)=a->size;
for(i=0;i<a->size;i++) *(ptr++)=i;
return ret;
}
}
|
a420a4 | 2004-09-16 | Henrik Grubbström (Grubba) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | ptr=ret=(INT32 *)xalloc(sizeof(INT32)*(a->size + b->size + 1));
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | SET_ONERROR(r, free,ret);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | ptr++;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | while(ap < a->size && bp < b->size)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | i=set_svalue_cmpfun(ITEM(a)+ap,ITEM(b)+bp);
if(i < 0)
i=opcode >> 8;
else if(i > 0)
i=opcode;
else
i=opcode >> 4;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | if(i & PIKE_ARRAY_OP_A) *(ptr++)=ap;
if(i & PIKE_ARRAY_OP_B) *(ptr++)=~bp;
if(i & PIKE_ARRAY_OP_SKIP_A) ap++;
if(i & PIKE_ARRAY_OP_SKIP_B) bp++;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | if((opcode >> 8) & PIKE_ARRAY_OP_A) while(ap<a->size) *(ptr++)=ap++;
if(opcode & PIKE_ARRAY_OP_B) while(bp<b->size) *(ptr++)=~(bp++);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
e0755c | 2000-08-15 | Henrik Grubbström (Grubba) | | *ret = DO_NOT_WARN((INT32)(ptr-ret-1));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | UNSET_ONERROR(r);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return ret;
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | * This routine merges two arrays in the order specified by 'zipper'
|
a4159c | 2004-10-17 | Martin Nilsson | | * zipper normally produced by merge() above.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *array_zip(struct array *a, struct array *b,INT32 *zipper)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
INT32 size,e;
struct array *ret;
size=zipper[0];
zipper++;
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | ret=allocate_array_no_init(size,0);
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | for(e=0; e<size; e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | if(*zipper >= 0)
assign_svalue_no_free(ITEM(ret)+e, ITEM(a)+*zipper);
else
assign_svalue_no_free(ITEM(ret)+e, ITEM(b)+~*zipper);
zipper++;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
ret->type_field = a->type_field | b->type_field;
return ret;
}
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | |
67a0a3 | 2005-09-12 | H. William Welliver III | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *add_arrays(struct svalue *argp, INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
INT32 e, size;
struct array *v;
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | struct array *v2 = NULL;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | for(size=e=0;e<args;e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | size+=argp[e].u.array->size;
|
3d934f | 2001-06-08 | Fredrik Hübinette (Hubbe) | | #if 1
{
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | INT32 tmp=0;
INT32 tmp2 = 0;
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | INT32 e2 = -1;
|
3d934f | 2001-06-08 | Fredrik Hübinette (Hubbe) | | for(e=0;e<args;e++)
{
v=argp[e].u.array;
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | if(v->refs == 1 && v->malloced_size >= size)
|
3d934f | 2001-06-08 | Fredrik Hübinette (Hubbe) | | {
|
463c38 | 2008-07-24 | Henrik Grubbström (Grubba) | | if (((v->item - v->real_item) >= tmp) &&
|
0cd43d | 2008-07-24 | Henrik Grubbström (Grubba) | | ((v->item + size - tmp) <= (v->real_item + v->malloced_size))) {
|
463c38 | 2008-07-24 | Henrik Grubbström (Grubba) | |
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | debug_malloc_touch(v);
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | mark_free_svalue(argp + e);
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | for(tmp=e-1;tmp>=0;tmp--)
{
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | v2 = argp[tmp].u.array;
debug_malloc_touch(v2);
v->type_field |= v2->type_field;
assign_svalues_no_free(ITEM(v) - v2->size, ITEM(v2),
v2->size, v2->type_field);
v->item -= v2->size;
v->size += v2->size;
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | }
for(tmp=e+1;tmp<args;tmp++)
{
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | v2 = argp[tmp].u.array;
debug_malloc_touch(v2);
v->type_field |= v2->type_field;
assign_svalues_no_free(ITEM(v) + v->size, ITEM(v2),
v2->size, v2->type_field);
v->size += v2->size;
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | }
|
3d934f | 2001-06-08 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | if(d_flag>1)
check_array(v);
|
3d934f | 2001-06-08 | Fredrik Hübinette (Hubbe) | | #endif
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | return v;
}
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | if (!v2 || (v->size > v2->size)) {
tmp2 = tmp;
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | v2 = v;
e2 = e;
}
|
3d934f | 2001-06-08 | Fredrik Hübinette (Hubbe) | | }
tmp+=v->size;
}
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | if (v2) {
debug_malloc_touch(v2);
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | mark_free_svalue(argp + e2);
MEMMOVE((char *)(v2->real_item + tmp2), (char *)ITEM(v2),
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | v2->size * sizeof(struct svalue));
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | v2->item = v2->real_item + tmp2;
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | for(tmp=e2-1;tmp>=0;tmp--)
{
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | v = argp[tmp].u.array;
debug_malloc_touch(v);
v2->type_field |= v->type_field;
assign_svalues_no_free(ITEM(v2) - v->size, ITEM(v),
v->size, v->type_field);
v2->item -= v->size;
v2->size += v->size;
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | }
for(tmp=e2+1;tmp<args;tmp++)
{
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | v = argp[tmp].u.array;
debug_malloc_touch(v);
v2->type_field |= v->type_field;
assign_svalues_no_free(ITEM(v2) + v2->size, ITEM(v),
v->size, v->type_field);
v2->size += v->size;
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | }
#ifdef PIKE_DEBUG
if(d_flag>1)
check_array(v2);
#endif
return v2;
}
|
3d934f | 2001-06-08 | Fredrik Hübinette (Hubbe) | | }
#endif
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | if(args && (v2 = argp[0].u.array)->refs==1)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | e = v2->size;
v = resize_array(v2, size);
mark_free_svalue(argp);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | size=e;
e=1;
}else{
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | v=allocate_array_no_init(size, 0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | v->type_field=0;
e=size=0;
}
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
for(; e<args; e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
da50f4 | 2008-07-21 | Henrik Grubbström (Grubba) | | v2 = argp[e].u.array;
v->type_field |= v2->type_field;
assign_svalues_no_free(ITEM(v)+size, ITEM(v2), v2->size, v2->type_field);
size += v2->size;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
return v;
}
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT int array_equal_p(struct array *a, struct array *b, struct processing *p)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct processing curr;
INT32 e;
if(a == b) return 1;
if(a->size != b->size) return 0;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | if(!a->size) return 1;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1)
{
array_check_type_field(a);
array_check_type_field(b);
}
#endif
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
|
1b89ad | 1997-10-10 | Fredrik Hübinette (Hubbe) | | if(!(a->type_field & b->type_field) &&
!( (a->type_field | b->type_field) & BIT_OBJECT ))
return 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
curr.pointer_a = a;
curr.pointer_b = b;
curr.next = p;
for( ;p ;p=p->next)
if(p->pointer_a == (void *)a && p->pointer_b == (void *)b)
return 1;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | for(e=0; e<a->size; e++)
if(!low_is_equal(ITEM(a)+e, ITEM(b)+e, &curr))
return 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
return 1;
}
|
fcc423 | 2000-11-17 | Per Hedbor | | typedef int(*mycmpfun)(INT32*,INT32*,INT32*,INT32*);
#define ID fsort_with_order
#define CMP(X,Y) ((*cmpfun)((X),(Y),oa,ob))
#define EXTRA_ARGS ,mycmpfun cmpfun,INT32 *oa,INT32 *ob
#define XARGS ,cmpfun,oa,ob
#define TYPE INT32
#include "fsort_template.h"
#undef ID
#undef TYPE
#undef XARGS
#undef EXTRA_ARGS
#undef CMP
|
a4159c | 2004-10-17 | Martin Nilsson | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
fcc423 | 2000-11-17 | Per Hedbor | | static int array_merge_fun(INT32 *a, INT32 *b,
INT32 *ordera, INT32 *orderb)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(*a<0)
{
if(*b<0)
{
return orderb[~*a] - orderb[~*b];
}else{
|
f4dbbb | 1999-10-03 | Fredrik Hübinette (Hubbe) | | return 1;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}else{
if(*b<0)
{
|
f4dbbb | 1999-10-03 | Fredrik Hübinette (Hubbe) | | return -1;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }else{
return ordera[*a] - ordera[*b];
}
}
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | * into ordered sets, merging them as sets and then rearranging the zipper
|
a4159c | 2004-10-17 | Martin Nilsson | | * before zipping the sets together.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
feae5d | 2001-01-03 | Henrik Grubbström (Grubba) | | PMOD_EXPORT struct array *merge_array_with_order(struct array *a,
struct array *b, INT32 op)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
fcc423 | 2000-11-17 | Per Hedbor | | ONERROR r1,r2,r3,r4,r5;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | INT32 *zipper;
struct array *tmpa,*tmpb,*ret;
|
fcc423 | 2000-11-17 | Per Hedbor | | INT32 *ordera, *orderb;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
ordera=get_set_order(a);
|
829b67 | 2000-11-29 | Fredrik Hübinette (Hubbe) | | SET_ONERROR(r4,free,ordera);
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | |
|
829b67 | 2000-11-29 | Fredrik Hübinette (Hubbe) | | orderb=get_set_order(b);
|
fcc423 | 2000-11-17 | Per Hedbor | | SET_ONERROR(r5,free,orderb);
|
829b67 | 2000-11-29 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | tmpa=reorder_and_copy_array(a,ordera);
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | SET_ONERROR(r1,do_free_array,tmpa);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
tmpb=reorder_and_copy_array(b,orderb);
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | SET_ONERROR(r2,do_free_array,tmpb);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
zipper=merge(tmpa,tmpb,op);
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | SET_ONERROR(r3,free,zipper);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
a29a87 | 2004-09-27 | Martin Stjernholm | | #if 0
{
int i;
simple_describe_array (a);
simple_describe_array (b);
fprintf (stderr, "order a: ");
for (i = 0; i < a->size; i++)
fprintf (stderr, "%d ", ordera[i]);
fprintf (stderr, "\n");
fprintf (stderr, "order b: ");
for (i = 0; i < b->size; i++)
fprintf (stderr, "%d ", orderb[i]);
fprintf (stderr, "\n");
simple_describe_array (tmpa);
simple_describe_array (tmpb);
fprintf (stderr, "zipper: ");
for (i = 1; i < *zipper + 1; i++)
fprintf (stderr, "%d ", zipper[i]);
fprintf (stderr, "\n");
}
#endif
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | |
|
fcc423 | 2000-11-17 | Per Hedbor | | fsort_with_order( (zipper+1), zipper+*zipper, array_merge_fun,
ordera, orderb );
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | ret=array_zip(tmpa,tmpb,zipper);
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | UNSET_ONERROR(r3); free((char *)zipper);
UNSET_ONERROR(r2); free_array(tmpb);
UNSET_ONERROR(r1); free_array(tmpa);
|
fcc423 | 2000-11-17 | Per Hedbor | | UNSET_ONERROR(r5); free((char *)orderb);
|
829b67 | 2000-11-29 | Fredrik Hübinette (Hubbe) | | UNSET_ONERROR(r4); free((char *)ordera);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return ret;
}
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | | #define CMP(X,Y) set_svalue_cmpfun(X,Y)
#define TYPE struct svalue
#define ID set_sort_svalues
#include "fsort_template.h"
#undef CMP
#undef TYPE
#undef ID
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *merge_array_without_order2(struct array *a, struct array *b,INT32 op)
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | | {
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | ONERROR r1,r2,r3,r4,r5;
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | | INT32 ap,bp,i;
struct svalue *arra,*arrb;
struct array *ret;
#ifdef PIKE_DEBUG
if(d_flag > 1)
{
array_check_type_field(a);
array_check_type_field(b);
}
#endif
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | SET_ONERROR(r1,do_free_array,a);
SET_ONERROR(r2,do_free_array,b);
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | | if(a->refs==1 || !a->size)
{
arra=ITEM(a);
}else{
|
35d571 | 2004-09-17 | Martin Nilsson | |
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | | arra=(struct svalue *)xalloc(a->size*sizeof(struct svalue));
MEMCPY(arra,ITEM(a),a->size*sizeof(struct svalue));
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | SET_ONERROR(r3,free,arra);
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | | }
if(b->refs==1 || !b->size)
{
arrb=ITEM(b);
}else{
|
35d571 | 2004-09-17 | Martin Nilsson | |
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | | arrb=(struct svalue *)xalloc(b->size*sizeof(struct svalue));
MEMCPY(arrb,ITEM(b),b->size*sizeof(struct svalue));
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | SET_ONERROR(r4,free,arrb);
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | | }
set_sort_svalues(arra,arra+a->size-1);
set_sort_svalues(arrb,arrb+b->size-1);
ret=low_allocate_array(0,32);
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | SET_ONERROR(r5,do_free_array,ret);
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | | ap=bp=0;
while(ap < a->size && bp < b->size)
{
i=set_svalue_cmpfun(arra+ap,arrb+bp);
if(i < 0)
i=op >> 8;
else if(i > 0)
i=op;
else
i=op >> 4;
if(i & PIKE_ARRAY_OP_A) ret=append_array(ret,arra+ap);
if(i & PIKE_ARRAY_OP_B) ret=append_array(ret,arrb+bp);
if(i & PIKE_ARRAY_OP_SKIP_A) ap++;
if(i & PIKE_ARRAY_OP_SKIP_B) bp++;
}
if((op >> 8) & PIKE_ARRAY_OP_A)
while(ap<a->size)
ret=append_array(ret,arra + ap++);
if(op & PIKE_ARRAY_OP_B)
while(bp<b->size)
ret=append_array(ret,arrb + bp++);
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | UNSET_ONERROR(r5);
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | |
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | if(arrb != ITEM(b))
{
UNSET_ONERROR(r4);
free((char *)arrb);
}
if(arra != ITEM(a))
{
UNSET_ONERROR(r3);
free((char *)arra);
}
UNSET_ONERROR(r2);
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | | free_array(b);
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | | UNSET_ONERROR(r1);
free_array(a);
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | | return ret;
}
|
67a0a3 | 2005-09-12 | H. William Welliver III | | |
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | * the elements has presently
*/
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *merge_array_without_order(struct array *a,
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | struct array *b,
INT32 op)
{
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | | #if 0
|
49398c | 2000-11-08 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | INT32 *zipper;
struct array *tmpa,*tmpb,*ret;
if(ordera) { free((char *)ordera); ordera=0; }
if(orderb) { free((char *)orderb); orderb=0; }
ordera=get_set_order(a);
tmpa=reorder_and_copy_array(a,ordera);
free((char *)ordera);
ordera=0;
orderb=get_set_order(b);
tmpb=reorder_and_copy_array(b,orderb);
free((char *)orderb);
orderb=0;
zipper=merge(tmpa,tmpb,op);
ret=array_zip(tmpa,tmpb,zipper);
free_array(tmpa);
free_array(tmpb);
free((char *)zipper);
return ret;
|
e051cf | 1999-03-04 | Fredrik Hübinette (Hubbe) | |
#else
add_ref(a);
add_ref(b);
return merge_array_without_order2(a,b,op);
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
e3d39a | 2013-05-17 | Per Hedbor | |
static struct array *subtract_array_svalue(struct array *a, struct svalue *b)
{
size_t size = a->size;
size_t from=0, to=0;
TYPE_FIELD to_type = 1<<TYPEOF(*b);
TYPE_FIELD type_field = 0;
ONERROR ouch;
struct svalue *ip=ITEM(a), *dp=ip;
int destructive = 1;
if( size == 0 )
return copy_array(a);
if( a->refs > 1 )
{
ssize_t off = fast_array_search( a, b, 0 );
if( off == -1 )
return copy_array(a);
destructive = 0;
from = (size_t)off;
a = allocate_array_no_init(size-1,0);
SET_ONERROR( ouch, do_free_array, a );
dp = ITEM(a);
for( to=0; to<from; to++, ip++, dp++)
{
assign_svalue_no_free(dp, ip);
type_field |= 1<<TYPEOF(*dp);
}
a->size = from;
}
#define MATCH_COPY(X) do { \
if( X ) \
{ /* include entry */ \
type_field|=1<<TYPEOF(*ip); \
if(!destructive) \
assign_svalue_no_free(dp,ip); \
else if(ip!=dp) \
*dp=*ip; \
dp++; \
if( !destructive ) a->size++; \
} \
else if( destructive ) \
free_svalue( ip ); \
} while(0)
if( UNSAFE_IS_ZERO( b ) )
{
for( ;from<size; from++, ip++ )
MATCH_COPY( !UNSAFE_IS_ZERO(ip) );
}
else if((a->type_field & to_type) || ((a->type_field | to_type) & BIT_OBJECT))
{
for( ; from<size; from++, ip++ )
MATCH_COPY( !is_eq(ip,b) );
}
else
{
a->refs++;
return a;
}
#undef MATCH_COPY
if( dp != ip )
{
a->type_field = type_field;
a->size = dp-ITEM(a);
}
if( !destructive )
UNSET_ONERROR( ouch );
else
a->refs++;
return a;
}
|
21d202 | 2006-03-04 | Martin Nilsson | | |
67a0a3 | 2005-09-12 | H. William Welliver III | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *subtract_arrays(struct array *a, struct array *b)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1)
{
array_check_type_field(b);
}
#endif
|
e3d39a | 2013-05-17 | Per Hedbor | | if( b->size == 1 )
return subtract_array_svalue( a, ITEM(b) );
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | |
|
e3d39a | 2013-05-17 | Per Hedbor | | if(b->size &&
((a->type_field & b->type_field) ||
((a->type_field | b->type_field) & BIT_OBJECT)))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | return merge_array_with_order(a, b, PIKE_ARRAY_OP_SUB);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }else{
if(a->refs == 1)
{
|
aa366d | 1998-04-16 | Fredrik Hübinette (Hubbe) | | add_ref(a);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return a;
}
|
e3d39a | 2013-05-17 | Per Hedbor | | return copy_array(a);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
e3d39a | 2013-05-17 | Per Hedbor | |
|
21d202 | 2006-03-04 | Martin Nilsson | | |
67a0a3 | 2005-09-12 | H. William Welliver III | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *and_arrays(struct array *a, struct array *b)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1)
array_check_type_field(b);
#endif
|
c68c5a | 1996-12-01 | Fredrik Hübinette (Hubbe) | | check_array_for_destruct(a);
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | |
|
52b76f | 2003-11-09 | Martin Stjernholm | | if((a->type_field & b->type_field) ||
((a->type_field | b->type_field) & BIT_OBJECT))
|
f4dbbb | 1999-10-03 | Fredrik Hübinette (Hubbe) | | return merge_array_with_order(a, b, PIKE_ARRAY_OP_AND_LEFT);
|
21d202 | 2006-03-04 | Martin Nilsson | | else
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | return allocate_array_no_init(0,0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
84387d | 2001-09-24 | Fredrik Hübinette (Hubbe) | | int array_is_constant(struct array *a,
struct processing *p)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
84387d | 2001-09-24 | Fredrik Hübinette (Hubbe) | | return svalues_are_constant(ITEM(a),
a->size,
|
f600d2 | 2004-05-14 | Martin Nilsson | | array_fix_type_field(a),
|
84387d | 2001-09-24 | Fredrik Hübinette (Hubbe) | | p);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
c65391 | 2011-05-02 | Per Hedbor | |
static inline int is_more_than_one_bit(unsigned INT32 x)
{
return !!(x & (x-1));
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | node *make_node_from_array(struct array *a)
{
struct svalue s;
INT32 e;
|
f9abcf | 1999-09-16 | Fredrik Hübinette (Hubbe) | | if(!a->size)
|
677caa | 2007-12-17 | Henrik Grubbström (Grubba) | | return mkefuncallnode("aggregate",0);
if (a->size == 1)
return mkefuncallnode("aggregate", mksvaluenode(ITEM(a)));
|
f9abcf | 1999-09-16 | Fredrik Hübinette (Hubbe) | |
|
f600d2 | 2004-05-14 | Martin Nilsson | | if(array_fix_type_field(a) == BIT_INT)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
4ce044 | 2001-09-10 | Fredrik Hübinette (Hubbe) | | debug_malloc_touch(a);
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | for(e=0; e<a->size; e++)
if(ITEM(a)[e].u.integer != 0)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | if(e == a->size)
{
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | return mkefuncallnode("allocate",mkintnode(a->size));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
4ce044 | 2001-09-10 | Fredrik Hübinette (Hubbe) | | debug_malloc_touch(a);
|
f9abcf | 1999-09-16 | Fredrik Hübinette (Hubbe) | | if(!is_more_than_one_bit(a->type_field))
{
e=0;
|
4ce044 | 2001-09-10 | Fredrik Hübinette (Hubbe) | | debug_malloc_touch(a);
|
f9abcf | 1999-09-16 | Fredrik Hübinette (Hubbe) | | switch(a->type_field)
{
case BIT_INT:
for(e=1; e<a->size; e++)
if(ITEM(a)[e].u.integer != ITEM(a)[0].u.integer)
break;
if(e==a->size && ITEM(a)[0].u.integer==0)
return mkefuncallnode("allocate",mkintnode(a->size));
break;
case BIT_STRING:
case BIT_PROGRAM:
for(e=1; e<a->size; e++)
if(ITEM(a)[e].u.refs != ITEM(a)[0].u.refs)
break;
break;
|
f54c78 | 2004-12-22 | Henrik Grubbström (Grubba) | | case BIT_OBJECT:
|
f9abcf | 1999-09-16 | Fredrik Hübinette (Hubbe) | | case BIT_FUNCTION:
for(e=1; e<a->size; e++)
if(ITEM(a)[e].u.object != ITEM(a)[0].u.object ||
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SUBTYPEOF(ITEM(a)[e]) != SUBTYPEOF(ITEM(a)[0]))
|
f9abcf | 1999-09-16 | Fredrik Hübinette (Hubbe) | | break;
break;
}
|
4ce044 | 2001-09-10 | Fredrik Hübinette (Hubbe) | | debug_malloc_touch(a);
|
f9abcf | 1999-09-16 | Fredrik Hübinette (Hubbe) | | if(e == a->size)
return mkefuncallnode("allocate",mknode(F_ARG_LIST,
mkintnode(a->size),
mksvaluenode(ITEM(a))));
}
|
84387d | 2001-09-24 | Fredrik Hübinette (Hubbe) | | if(array_is_constant(a,0))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
4ce044 | 2001-09-10 | Fredrik Hübinette (Hubbe) | | debug_malloc_touch(a);
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(s, T_ARRAY, 0, array, a);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return mkconstantsvaluenode(&s);
}else{
node *ret=0;
|
4ce044 | 2001-09-10 | Fredrik Hübinette (Hubbe) | | debug_malloc_touch(a);
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | for(e = a->size; e--;) {
if (ret) {
ret = mknode(F_ARG_LIST, mksvaluenode(ITEM(a)+e), ret);
} else {
ret = mksvaluenode(ITEM(a)+e);
}
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return mkefuncallnode("aggregate",ret);
}
}
|
21d202 | 2006-03-04 | Martin Nilsson | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void push_array_items(struct array *a)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
f5f7b1 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | check_stack(a->size);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | check_array_for_destruct(a);
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | if(a->refs == 1)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | MEMCPY(Pike_sp,ITEM(a),sizeof(struct svalue)*a->size);
Pike_sp += a->size;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | a->size=0;
free_array(a);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }else{
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | assign_svalues_no_free(Pike_sp, ITEM(a), a->size, a->type_field);
Pike_sp += a->size;
|
f5f7b1 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | free_array(a);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
void describe_array_low(struct array *a, struct processing *p, int indent)
{
INT32 e,d;
indent += 2;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
for(e=0; e<a->size; e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | if(e) my_strcat(",\n");
for(d=0; d<indent; d++) my_putchar(' ');
describe_svalue(ITEM(a)+e,indent,p);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
d8946e | 2004-03-09 | Martin Nilsson | |
#ifdef PIKE_DEBUG
void simple_describe_array(struct array *a)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
9fa0ee | 2003-11-09 | Martin Stjernholm | | dynamic_buffer save_buf;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | char *s;
|
86f186 | 2004-03-16 | Martin Stjernholm | | if (a->size) {
init_buf(&save_buf);
describe_array_low(a,0,0);
s=simple_free_buf(&save_buf);
fprintf(stderr,"({\n%s\n})\n",s);
free(s);
}
else
fputs ("({ })\n", stderr);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void describe_index(struct array *a,
int e,
struct processing *p,
int indent)
{
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | describe_svalue(ITEM(a)+e, indent, p);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
d8946e | 2004-03-09 | Martin Nilsson | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
void describe_array(struct array *a,struct processing *p,int indent)
{
struct processing doing;
INT32 e;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | char buf[60];
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(! a->size)
{
my_strcat("({ })");
return;
}
doing.next=p;
doing.pointer_a=(void *)a;
for(e=0;p;e++,p=p->next)
{
if(p->pointer_a == (void *)a)
{
|
f90e54 | 1995-08-17 | Fredrik Hübinette (Hubbe) | | sprintf(buf,"@%ld",(long)e);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | my_strcat(buf);
return;
}
}
|
337753 | 2000-10-19 | Henrik Grubbström (Grubba) | |
if (a->size == 1) {
sprintf(buf, "({ /* 1 element */\n");
} else {
sprintf(buf, "({ /* %ld elements */\n", (long)a->size);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | my_strcat(buf);
describe_array_low(a,&doing,indent);
my_putchar('\n');
for(e=2; e<indent; e++) my_putchar(' ');
my_strcat("})");
}
|
a4159c | 2004-10-17 | Martin Nilsson | | |
c3f383 | 2004-10-17 | H. William Welliver III | | * The 'top' of the stack will be the last element in the array.
|
7ba5d8 | 2004-10-21 | Martin Nilsson | | * @param args The number of arguments to aggregate.
|
a4159c | 2004-10-17 | Martin Nilsson | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *aggregate_array(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct array *a;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | a=allocate_array_no_init(args,0);
|
fb567a | 2003-04-27 | Martin Stjernholm | | if (args) {
MEMCPY((char *)ITEM(a),(char *)(Pike_sp-args),args*sizeof(struct svalue));
array_fix_type_field (a);
Pike_sp-=args;
DO_IF_DMALLOC(while(args--) dmalloc_touch_svalue(Pike_sp + args));
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return a;
}
|
21d202 | 2006-03-04 | Martin Nilsson | | |
67a0a3 | 2005-09-12 | H. William Welliver III | | *
* @param a the array to be appended
* @param s the value to be added to the new element in the array
*/
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *append_array(struct array *a, struct svalue *s)
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | {
|
5e3032 | 2013-02-25 | Arne Goedeke | | INT32 size = a->size;
a=resize_array(a, size+1);
array_set_index(a, size, s);
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | return a;
}
|
0d1460 | 2000-10-09 | Fredrik Hübinette (Hubbe) | | typedef char *(* explode_searchfunc)(void *,void *,size_t);
|
21d202 | 2006-03-04 | Martin Nilsson | | |
67a0a3 | 2005-09-12 | H. William Welliver III | | *
* @param str the string to be split
* @param del the string to split str by
* @returns an array containing the elements of the split string
*/
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *explode(struct pike_string *str,
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *del)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
f5f7b1 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | INT32 e;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | struct array *ret;
char *s, *end, *tmp;
|
6fdf36 | 1998-05-12 | Fredrik Hübinette (Hubbe) | | #if 0
|
5fb4a5 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | if(!str->len)
{
return allocate_array_no_init(0,0);
}
|
6fdf36 | 1998-05-12 | Fredrik Hübinette (Hubbe) | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!del->len)
{
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | ret=allocate_array_no_init(str->len,0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | for(e=0;e<str->len;e++)
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(ITEM(ret)[e], T_STRING, 0, string, string_slice(str,e,1));
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }else{
|
0d1460 | 2000-10-09 | Fredrik Hübinette (Hubbe) | | SearchMojt mojt;
|
8c1183 | 2008-06-23 | Martin Stjernholm | | ONERROR uwp;
|
41b0b2 | 2000-10-20 | Henrik Grubbström (Grubba) | | explode_searchfunc f = (explode_searchfunc)0;
|
f5f7b1 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | s=str->str;
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | end=s+(str->len << str->size_shift);
|
018292 | 1997-10-06 | Fredrik Hübinette (Hubbe) | |
|
3402a6 | 2013-05-20 | Per Hedbor | | ret=allocate_array(2);
|
018292 | 1997-10-06 | Fredrik Hübinette (Hubbe) | | ret->size=0;
|
0d1460 | 2000-10-09 | Fredrik Hübinette (Hubbe) | |
mojt=compile_memsearcher(MKPCHARP_STR(del),
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | del->len,
str->len,
|
0d1460 | 2000-10-09 | Fredrik Hübinette (Hubbe) | | del);
|
8c1183 | 2008-06-23 | Martin Stjernholm | | SET_ONERROR (uwp, do_free_object, mojt.container);
|
0d1460 | 2000-10-09 | Fredrik Hübinette (Hubbe) | |
switch(str->size_shift)
{
case 0: f=(explode_searchfunc)mojt.vtab->func0; break;
case 1: f=(explode_searchfunc)mojt.vtab->func1; break;
case 2: f=(explode_searchfunc)mojt.vtab->func2; break;
#ifdef PIKE_DEBUG
|
5aad93 | 2002-08-15 | Marcus Comstedt | | default: Pike_fatal("Illegal shift.\n");
|
0d1460 | 2000-10-09 | Fredrik Hübinette (Hubbe) | | #endif
}
while((tmp = f(mojt.data, s, (end-s)>> str->size_shift)))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
018292 | 1997-10-06 | Fredrik Hübinette (Hubbe) | | if(ret->size == ret->malloced_size)
{
e=ret->size;
|
2523ce | 2003-04-28 | Martin Stjernholm | | ACCEPT_UNFINISHED_TYPE_FIELDS {
ret=resize_array(ret, e * 2);
} END_ACCEPT_UNFINISHED_TYPE_FIELDS;
|
e1741a | 1997-10-06 | Fredrik Hübinette (Hubbe) | | ret->size=e;
|
018292 | 1997-10-06 | Fredrik Hübinette (Hubbe) | | }
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(ITEM(ret)[ret->size], T_STRING, 0, string,
string_slice(str,
(s-str->str)>>str->size_shift,
(tmp-s)>>str->size_shift));
|
018292 | 1997-10-06 | Fredrik Hübinette (Hubbe) | | ret->size++;
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | s=tmp+(del->len << str->size_shift);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
018292 | 1997-10-06 | Fredrik Hübinette (Hubbe) | |
if(ret->size == ret->malloced_size)
|
e1741a | 1997-10-06 | Fredrik Hübinette (Hubbe) | | {
e=ret->size;
|
2523ce | 2003-04-28 | Martin Stjernholm | | ACCEPT_UNFINISHED_TYPE_FIELDS {
ret=resize_array(ret, e * 2);
} END_ACCEPT_UNFINISHED_TYPE_FIELDS;
|
e1741a | 1997-10-06 | Fredrik Hübinette (Hubbe) | | ret->size=e;
}
|
018292 | 1997-10-06 | Fredrik Hübinette (Hubbe) | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(ITEM(ret)[ret->size], T_STRING, 0, string,
string_slice(str,
(s-str->str)>>str->size_shift,
(end-s)>>str->size_shift));
|
018292 | 1997-10-06 | Fredrik Hübinette (Hubbe) | | ret->size++;
|
8c1183 | 2008-06-23 | Martin Stjernholm | |
CALL_AND_UNSET_ONERROR (uwp);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
f5f7b1 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | ret->type_field=BIT_STRING;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return ret;
}
|
21d202 | 2006-03-04 | Martin Nilsson | | |
67a0a3 | 2005-09-12 | H. William Welliver III | | *
|
21d202 | 2006-03-04 | Martin Nilsson | | * @param a The array containing elements to be imploded
* @param del The delimiter used to separate the array's elements in the resulting string
* @return The imploded string
|
67a0a3 | 2005-09-12 | H. William Welliver III | | *
*/
|
21d202 | 2006-03-04 | Martin Nilsson | | PMOD_EXPORT struct pike_string *implode(struct array *a,
struct pike_string *del)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
9e7605 | 2013-04-11 | Arne Goedeke | | INT32 len, e, delims;
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | PCHARP r;
|
2f27eb | 2009-02-09 | Stephen R. van den Berg | | struct pike_string *ret;
struct svalue *ae;
|
21d202 | 2006-03-04 | Martin Nilsson | | int max_shift = del->size_shift;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
len=0;
|
9e7605 | 2013-04-11 | Arne Goedeke | | delims = 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
3402a6 | 2013-05-20 | Per Hedbor | |
|
2f27eb | 2009-02-09 | Stephen R. van den Berg | | for(e=a->size, ae=a->item; e--; ae++)
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | switch(TYPEOF(*ae))
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | {
|
2f27eb | 2009-02-09 | Stephen R. van den Berg | | case T_INT:
if(!ae->u.integer)
continue;
default:
|
c0c055 | 2010-11-05 | Martin Stjernholm | | Pike_error("Array element %d is not a string\n", ae-a->item);
|
2f27eb | 2009-02-09 | Stephen R. van den Berg | | case T_STRING:
|
9e7605 | 2013-04-11 | Arne Goedeke | | delims++;
|
2f27eb | 2009-02-09 | Stephen R. van den Berg | | len+=ae->u.string->len + del->len;
if(ae->u.string->size_shift > max_shift)
max_shift=ae->u.string->size_shift;
break;
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | }
|
9e7605 | 2013-04-11 | Arne Goedeke | |
if(delims)
{
len-=del->len;
delims--;
}
|
3402a6 | 2013-05-20 | Per Hedbor | |
if( a->size == 1 && TYPEOF(*ITEM(a)) == PIKE_T_STRING )
{
struct pike_string * res = ITEM(a)->u.string;
res->refs++;
return res;
}
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | ret=begin_wide_shared_string(len,max_shift);
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | r=MKPCHARP_STR(ret);
|
2f27eb | 2009-02-09 | Stephen R. van den Berg | | len = del->len;
|
c5bb0f | 2009-11-28 | Martin Stjernholm | | if((e = a->size))
|
9e7605 | 2013-04-11 | Arne Goedeke | | for(ae=a->item;e--;ae++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
9e7605 | 2013-04-11 | Arne Goedeke | | if (TYPEOF(*ae) == T_STRING)
|
2f27eb | 2009-02-09 | Stephen R. van den Berg | | {
|
9e7605 | 2013-04-11 | Arne Goedeke | | struct pike_string *tmp = ae->u.string;
pike_string_cpy(r,tmp);
INC_PCHARP(r,tmp->len);
if(len && delims)
{
delims--;
pike_string_cpy(r,del);
INC_PCHARP(r,len);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
9e7605 | 2013-04-11 | Arne Goedeke | |
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | return low_end_shared_string(ret);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
21d202 | 2006-03-04 | Martin Nilsson | | |
67a0a3 | 2005-09-12 | H. William Welliver III | | */
|
9cc28d | 2004-05-28 | Henrik Grubbström (Grubba) | | PMOD_EXPORT struct array *copy_array_recursively(struct array *a,
struct mapping *m)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct array *ret;
|
9cc28d | 2004-05-28 | Henrik Grubbström (Grubba) | | struct svalue aa, bb;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) array_check_type_field(a);
#endif
|
a420a4 | 2004-09-16 | Henrik Grubbström (Grubba) | | if (!a->size) {
|
65d99c | 2010-07-11 | Jonas Wallden | | ret = (a->flags & ARRAY_WEAK_FLAG) ? &weak_empty_array : &empty_array;
add_ref(ret);
return ret;
|
a420a4 | 2004-09-16 | Henrik Grubbström (Grubba) | | }
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | ret=allocate_array_no_init(a->size,0);
|
0f5a82 | 2010-07-11 | Jonas Wallden | |
if (m) {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(aa, T_ARRAY, 0, array, a);
SET_SVAL(bb, T_ARRAY, 0, array, ret);
|
0f5a82 | 2010-07-11 | Jonas Wallden | | low_mapping_insert(m, &aa, &bb, 1);
}
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
|
4ca43e | 2000-09-17 | Henrik Grubbström (Grubba) | | ret->flags = a->flags & ~ARRAY_LVALUE;
|
9cc28d | 2004-05-28 | Henrik Grubbström (Grubba) | | copy_svalues_recursively_no_free(ITEM(ret),ITEM(a),a->size,m);
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | |
ret->type_field=a->type_field;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return ret;
}
|
21d202 | 2006-03-04 | Martin Nilsson | | |
4ea105 | 2008-07-12 | Henrik Grubbström (Grubba) | | *
* Note that the array a may be modified destructively if it has
* only a single reference.
|
67a0a3 | 2005-09-12 | H. William Welliver III | | */
|
574015 | 2008-07-13 | Henrik Grubbström (Grubba) | | PMOD_EXPORT void apply_array(struct array *a, INT32 args, int flags)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
da2a5a | 2006-03-01 | Martin Nilsson | | INT32 e, hash = 0;
|
b0b19a | 2001-02-03 | Martin Stjernholm | | struct svalue *argp = Pike_sp-args;
|
744580 | 2002-05-28 | Henrik Grubbström (Grubba) | | struct array *cycl;
DECLARE_CYCLIC();
|
f5f7b1 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
|
da2a5a | 2006-03-01 | Martin Nilsson | | check_stack(args);
|
1a3e1b | 1999-04-13 | Fredrik Hübinette (Hubbe) | | check_array_for_destruct(a);
|
da2a5a | 2006-03-01 | Martin Nilsson | | for (e=0; e<args; e++)
|
49bc54 | 2008-05-01 | Martin Stjernholm | | hash = hash * 33 + DO_NOT_WARN ((INT32) PTR_TO_INT (Pike_sp[-e-1].u.ptr));
|
b0b19a | 2001-02-03 | Martin Stjernholm | |
|
da2a5a | 2006-03-01 | Martin Nilsson | | if (!(cycl = (struct array *)BEGIN_CYCLIC(a, (ptrdiff_t)hash))) {
|
4ea105 | 2008-07-12 | Henrik Grubbström (Grubba) | | TYPE_FIELD new_types = 0;
|
574015 | 2008-07-13 | Henrik Grubbström (Grubba) | | if ((flags & 1) && (a->refs == 1)) {
|
4ea105 | 2008-07-12 | Henrik Grubbström (Grubba) | |
ref_push_array(a);
a->type_field |= BIT_UNFINISHED;
for (e=0; e < a->size; e++)
{
assign_svalues_no_free(Pike_sp, argp, args, BIT_MIXED);
Pike_sp+=args;
apply_svalue(ITEM(a)+e,args);
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | new_types |= 1 << TYPEOF(Pike_sp[-1]);
|
4ea105 | 2008-07-12 | Henrik Grubbström (Grubba) | | assign_svalue(ITEM(a)+e, &Pike_sp[-1]);
pop_stack();
}
a->type_field = new_types;
|
b0b19a | 2001-02-03 | Martin Stjernholm | | #ifdef PIKE_DEBUG
|
4ea105 | 2008-07-12 | Henrik Grubbström (Grubba) | | array_check_type_field(a);
|
b0b19a | 2001-02-03 | Martin Stjernholm | | #endif
|
4ea105 | 2008-07-12 | Henrik Grubbström (Grubba) | | } else {
struct array *aa;
push_array(aa = allocate_array_no_init(0, a->size));
for (e=0; (e<a->size) && (e < aa->malloced_size); e++)
{
assign_svalues_no_free(Pike_sp, argp, args, BIT_MIXED);
Pike_sp+=args;
apply_svalue(ITEM(a)+e,args);
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | new_types |= 1 << TYPEOF(Pike_sp[-1]);
|
4ea105 | 2008-07-12 | Henrik Grubbström (Grubba) | | assign_svalue_no_free(ITEM(aa)+e, &Pike_sp[-1]);
aa->size = e+1;
pop_stack();
}
aa->type_field = new_types;
#ifdef PIKE_DEBUG
array_check_type_field(aa);
#endif
}
|
fc6274 | 2006-04-02 | Henrik Grubbström (Grubba) | | stack_pop_n_elems_keep_top(args);
|
da2a5a | 2006-03-01 | Martin Nilsson | | }
else {
pop_n_elems(args);
|
744580 | 2002-05-28 | Henrik Grubbström (Grubba) | | ref_push_array(cycl);
}
|
da2a5a | 2006-03-01 | Martin Nilsson | |
|
744580 | 2002-05-28 | Henrik Grubbström (Grubba) | | END_CYCLIC();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
e41dec | 2005-11-14 | Martin Nilsson | | |
67a0a3 | 2005-09-12 | H. William Welliver III | | */
|
2b888e | 2008-01-29 | Henrik Grubbström (Grubba) | | PMOD_EXPORT struct array *reverse_array(struct array *a, int start, int end)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
INT32 e;
struct array *ret;
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
|
2b888e | 2008-01-29 | Henrik Grubbström (Grubba) | | if ((end <= start) || (start >= a->size)) {
add_ref(a);
return a;
}
if (end >= a->size) {
end = a->size;
} else {
end++;
}
|
cc51e9 | 2000-12-08 | Fredrik Noring | | if(a->refs == 1)
{
struct svalue *tmp0, *tmp1, swap;
|
2b888e | 2008-01-29 | Henrik Grubbström (Grubba) | | tmp0 = ITEM(a) + start;
tmp1 = ITEM(a) + end;
while (tmp0 < tmp1) {
|
cc51e9 | 2000-12-08 | Fredrik Noring | | swap = *tmp0;
*(tmp0++) = *(--tmp1);
*tmp1 = swap;
}
|
a420a4 | 2004-09-16 | Henrik Grubbström (Grubba) | |
|
cc51e9 | 2000-12-08 | Fredrik Noring | |
add_ref(a);
return a;
}
|
2b888e | 2008-01-29 | Henrik Grubbström (Grubba) | |
|
b59b33 | 2008-07-08 | Henrik Grubbström (Grubba) | |
|
cc51e9 | 2000-12-08 | Fredrik Noring | |
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | ret=allocate_array_no_init(a->size,0);
|
2b888e | 2008-01-29 | Henrik Grubbström (Grubba) | | for(e=0;e<start;e++)
assign_svalue_no_free(ITEM(ret)+e,ITEM(a)+e);
for(;e<end;e++)
assign_svalue_no_free(ITEM(ret)+e,ITEM(a)+end+~e-start);
for(;e<a->size;e++)
assign_svalue_no_free(ITEM(ret)+e,ITEM(a)+e);
|
2523ce | 2003-04-28 | Martin Stjernholm | | ret->type_field = a->type_field;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return ret;
}
|
21d202 | 2006-03-04 | Martin Nilsson | |
|
d3a4e2 | 2001-06-30 | Fredrik Hübinette (Hubbe) | | void array_replace(struct array *a,
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | struct svalue *from,
struct svalue *to)
{
|
84f895 | 2000-08-16 | Henrik Grubbström (Grubba) | | ptrdiff_t i = -1;
|
45df90 | 2013-05-17 | Per Hedbor | | check_array_for_destruct(a);
while((i=fast_array_search(a,from,i+1)) >= 0) array_set_index(a,i,to);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void check_array(struct array *a)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
INT32 e;
|
cd451f | 2004-03-15 | Martin Stjernholm | | if(a->next && a->next->prev != a)
Pike_fatal("array->next->prev != array.\n");
if(a->prev)
{
if(a->prev->next != a)
Pike_fatal("array->prev->next != array.\n");
}else{
if(first_array != a)
Pike_fatal("array->prev == 0 but first_array != array.\n");
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
if(a->size > a->malloced_size)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Array is larger than malloced block!\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
3d934f | 2001-06-08 | Fredrik Hübinette (Hubbe) | | if(a->size < 0)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Array size is negative!\n");
|
3d934f | 2001-06-08 | Fredrik Hübinette (Hubbe) | |
if(a->malloced_size < 0)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Array malloced size is negative!\n");
|
3d934f | 2001-06-08 | Fredrik Hübinette (Hubbe) | |
|
c31592 | 2007-12-15 | Henrik Grubbström (Grubba) | | if((a->item + a->size) > (a->real_item + a->malloced_size))
Pike_fatal("Array uses memory outside of the malloced block!\n");
|
3d934f | 2001-06-08 | Fredrik Hübinette (Hubbe) | | if(a->item < a->real_item)
{
#ifdef DEBUG_MALLOC
describe(a);
#endif
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Array item pointer is too small!\n");
|
3d934f | 2001-06-08 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(a->refs <=0 )
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Array has zero refs.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
3d934f | 2001-06-08 | Fredrik Hübinette (Hubbe) | |
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | for(e=0;e<a->size;e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if(! ( (1 << TYPEOF(ITEM(a)[e])) & (a->type_field) ) &&
TYPEOF(ITEM(a)[e])<16)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Type field lies.\n");
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | check_svalue(ITEM(a)+e);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void check_all_arrays(void)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct array *a;
|
cd451f | 2004-03-15 | Martin Stjernholm | | for (a = first_array; a; a = a->next)
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | check_array(a);
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | | }
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #endif /* PIKE_DEBUG */
|
fc7695 | 1996-02-17 | Fredrik Hübinette (Hubbe) | |
|
1eb985 | 2008-05-11 | Martin Stjernholm | | PMOD_EXPORT void visit_array (struct array *a, int action)
|
5e8344 | 2008-05-11 | Martin Stjernholm | | {
switch (action) {
#ifdef PIKE_DEBUG
default:
Pike_fatal ("Unknown visit action %d.\n", action);
case VISIT_NORMAL:
case VISIT_COMPLEX_ONLY:
break;
#endif
case VISIT_COUNT_BYTES:
mc_counted_bytes += sizeof (struct array) +
(a->malloced_size - 1) * sizeof (struct svalue);
break;
}
if (a->type_field &
(action & VISIT_COMPLEX_ONLY ? BIT_COMPLEX : BIT_REF_TYPES)) {
size_t e, s = a->size;
int ref_type = a->flags & ARRAY_WEAK_FLAG ? REF_TYPE_WEAK : REF_TYPE_NORMAL;
for (e = 0; e < s; e++)
visit_svalue (ITEM (a) + e, ref_type);
}
}
|
20513c | 2000-04-12 | Fredrik Hübinette (Hubbe) | | static void gc_check_array(struct array *a)
{
|
e1a35e | 2003-09-08 | Martin Stjernholm | | GC_ENTER (a, T_ARRAY) {
if(a->type_field & BIT_COMPLEX)
{
if (a->flags & ARRAY_WEAK_FLAG) {
gc_check_weak_svalues(ITEM(a), a->size);
gc_checked_as_weak(a);
}
else
gc_check_svalues(ITEM(a), a->size);
|
595dac | 2000-09-30 | Martin Stjernholm | | }
|
e1a35e | 2003-09-08 | Martin Stjernholm | | } GC_LEAVE;
|
20513c | 2000-04-12 | Fredrik Hübinette (Hubbe) | | }
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | void gc_mark_array_as_referenced(struct array *a)
|
7bf623 | 2000-04-23 | Martin Stjernholm | | {
|
613c34 | 2009-11-28 | Martin Stjernholm | | if(gc_mark(a, T_ARRAY))
|
e1a35e | 2003-09-08 | Martin Stjernholm | | GC_ENTER (a, T_ARRAY) {
if (a == gc_mark_array_pos)
gc_mark_array_pos = a->next;
if (a == gc_internal_array)
gc_internal_array = a->next;
else {
|
cd451f | 2004-03-15 | Martin Stjernholm | | DOUBLEUNLINK (first_array, a);
DOUBLELINK (first_array, a);
|
e1a35e | 2003-09-08 | Martin Stjernholm | | }
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | |
|
e1a35e | 2003-09-08 | Martin Stjernholm | | if (a->type_field & BIT_COMPLEX)
{
if (a->flags & ARRAY_WEAK_FLAG) {
TYPE_FIELD t;
|
5272b2 | 2004-09-22 | Martin Stjernholm | | if (!(t = gc_mark_weak_svalues(a->item, a->size)))
t = a->type_field;
|
595dac | 2000-09-30 | Martin Stjernholm | |
|
e1a35e | 2003-09-08 | Martin Stjernholm | |
|
c4ccb8 | 2000-07-04 | Martin Stjernholm | | if(!(a->type_field & BIT_UNFINISHED) || a->refs!=1)
a->type_field = t;
else
|
e1a35e | 2003-09-08 | Martin Stjernholm | | a->type_field |= t;
gc_assert_checked_as_weak(a);
}
else {
TYPE_FIELD t;
if ((t = gc_mark_svalues(ITEM(a), a->size))) {
if(!(a->type_field & BIT_UNFINISHED) || a->refs!=1)
a->type_field = t;
else
a->type_field |= t;
}
gc_assert_checked_as_nonweak(a);
|
c4ccb8 | 2000-07-04 | Martin Stjernholm | | }
}
|
e1a35e | 2003-09-08 | Martin Stjernholm | | } GC_LEAVE;
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | }
|
45d87e | 2000-07-18 | Martin Stjernholm | | void real_gc_cycle_check_array(struct array *a, int weak)
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | {
|
e1a35e | 2003-09-08 | Martin Stjernholm | | GC_CYCLE_ENTER(a, T_ARRAY, weak) {
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | #ifdef PIKE_DEBUG
|
57cfbd | 2004-03-15 | Martin Stjernholm | | if (!gc_destruct_everything &&
|
5272b2 | 2004-09-22 | Martin Stjernholm | | (a == &empty_array || a == &weak_empty_array))
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Trying to gc cycle check some *_empty_array.\n");
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | #endif
|
45d87e | 2000-07-18 | Martin Stjernholm | | if (a->type_field & BIT_COMPLEX)
{
|
e601a4 | 2001-10-15 | Martin Stjernholm | | TYPE_FIELD t = a->flags & ARRAY_WEAK_FLAG ?
gc_cycle_check_weak_svalues(ITEM(a), a->size) :
gc_cycle_check_svalues(ITEM(a), a->size);
if (t) {
if(!(a->type_field & BIT_UNFINISHED) || a->refs!=1)
a->type_field = t;
else
a->type_field |= t;
}
|
595dac | 2000-09-30 | Martin Stjernholm | | #ifdef PIKE_DEBUG
|
e601a4 | 2001-10-15 | Martin Stjernholm | | if (a->flags & ARRAY_WEAK_FLAG)
|
595dac | 2000-09-30 | Martin Stjernholm | | gc_assert_checked_as_weak(a);
|
e601a4 | 2001-10-15 | Martin Stjernholm | | else
|
595dac | 2000-09-30 | Martin Stjernholm | | gc_assert_checked_as_nonweak(a);
|
e601a4 | 2001-10-15 | Martin Stjernholm | | #endif
|
c4ccb8 | 2000-07-04 | Martin Stjernholm | | }
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | } GC_CYCLE_LEAVE;
}
unsigned gc_touch_all_arrays(void)
{
unsigned n = 0;
|
cd451f | 2004-03-15 | Martin Stjernholm | | struct array *a;
if (!first_array || first_array->prev)
Pike_fatal ("error in array link list.\n");
for (a = first_array; a; a = a->next) {
|
7bf623 | 2000-04-23 | Martin Stjernholm | | debug_gc_touch(a);
n++;
|
cd451f | 2004-03-15 | Martin Stjernholm | | if (a->next && a->next->prev != a)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Error in array link list.\n");
|
cd451f | 2004-03-15 | Martin Stjernholm | | }
|
7bf623 | 2000-04-23 | Martin Stjernholm | | return n;
}
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void gc_check_all_arrays(void)
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | {
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | struct array *a;
|
cd451f | 2004-03-15 | Martin Stjernholm | | for (a = first_array; a; a = a->next) {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
e3c6e1 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | if(d_flag > 1) array_check_type_field(a);
#endif
|
20513c | 2000-04-12 | Fredrik Hübinette (Hubbe) | | gc_check_array(a);
|
cd451f | 2004-03-15 | Martin Stjernholm | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | |
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void gc_mark_all_arrays(void)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | gc_mark_array_pos = gc_internal_array;
|
cd451f | 2004-03-15 | Martin Stjernholm | | while (gc_mark_array_pos) {
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | struct array *a = gc_mark_array_pos;
gc_mark_array_pos = a->next;
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | if(gc_is_referenced(a))
gc_mark_array_as_referenced(a);
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | }
}
void gc_cycle_check_all_arrays(void)
{
struct array *a;
|
cd451f | 2004-03-15 | Martin Stjernholm | | for (a = gc_internal_array; a; a = a->next) {
|
45d87e | 2000-07-18 | Martin Stjernholm | | real_gc_cycle_check_array(a, 0);
gc_cycle_run_queue();
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
45d87e | 2000-07-18 | Martin Stjernholm | | void gc_zap_ext_weak_refs_in_arrays(void)
{
|
cd451f | 2004-03-15 | Martin Stjernholm | | gc_mark_array_pos = first_array;
|
45d87e | 2000-07-18 | Martin Stjernholm | | while (gc_mark_array_pos != gc_internal_array && gc_ext_weak_refs) {
struct array *a = gc_mark_array_pos;
gc_mark_array_pos = a->next;
gc_mark_array_as_referenced(a);
}
|
e1a35e | 2003-09-08 | Martin Stjernholm | | gc_mark_discard_queue();
|
45d87e | 2000-07-18 | Martin Stjernholm | | }
|
88cf4f | 2003-01-11 | Martin Stjernholm | | size_t gc_free_all_unreferenced_arrays(void)
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | {
struct array *a,*next;
|
a1b387 | 2003-01-11 | Martin Stjernholm | | size_t unreferenced = 0;
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | |
|
cd451f | 2004-03-15 | Martin Stjernholm | | for (a = gc_internal_array; a; a = next)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | #ifdef PIKE_DEBUG
if (!a)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Null pointer in array list.\n");
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | #endif
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | if(gc_do_free(a))
{
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | |
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | free_svalues(ITEM(a), a->size, a->type_field);
a->size=0;
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | gc_free_extra_ref(a);
|
128555 | 2000-04-17 | Henrik Grubbström (Grubba) | | SET_NEXT_AND_FREE(a, free_array);
|
5f0624 | 1999-04-11 | Fredrik Hübinette (Hubbe) | | }
else
{
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | next=a->next;
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | }
|
a1b387 | 2003-01-11 | Martin Stjernholm | | unreferenced++;
|
e2d9e6 | 2000-06-10 | Martin Stjernholm | | }
|
88cf4f | 2003-01-11 | Martin Stjernholm | |
|
a1b387 | 2003-01-11 | Martin Stjernholm | | return unreferenced;
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | }
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | |
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
ed36ce | 1996-08-12 | Fredrik Hübinette (Hubbe) | |
void debug_dump_type_field(TYPE_FIELD t)
{
int e;
|
c330a9 | 1997-10-14 | Fredrik Hübinette (Hubbe) | | for(e=0;e<=MAX_TYPE;e++)
|
ed36ce | 1996-08-12 | Fredrik Hübinette (Hubbe) | | if(t & (1<<e))
fprintf(stderr," %s",get_name_of_type(e));
for(;e<16;e++)
if(t & (1<<e))
fprintf(stderr," <%d>",e);
}
void debug_dump_array(struct array *a)
{
|
595dac | 2000-09-30 | Martin Stjernholm | | fprintf(stderr,"Location=%p Refs=%d, next=%p, prev=%p, "
"flags=0x%x, size=%d, malloced_size=%d%s\n",
|
864d3c | 1998-01-29 | Fredrik Hübinette (Hubbe) | | a,
|
ed36ce | 1996-08-12 | Fredrik Hübinette (Hubbe) | | a->refs,
a->next,
a->prev,
|
595dac | 2000-09-30 | Martin Stjernholm | | a->flags,
|
ed36ce | 1996-08-12 | Fredrik Hübinette (Hubbe) | | a->size,
|
595dac | 2000-09-30 | Martin Stjernholm | | a->malloced_size,
|
be08a8 | 2001-06-06 | Martin Stjernholm | | a == &empty_array ? " (the empty_array)" :
a == &weak_empty_array ? " (the weak_empty_array)" :
"");
|
86f186 | 2004-03-16 | Martin Stjernholm | | fprintf(stderr,"Type field =");
|
ed36ce | 1996-08-12 | Fredrik Hübinette (Hubbe) | | debug_dump_type_field(a->type_field);
fprintf(stderr,"\n");
simple_describe_array(a);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
#endif
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
|
21d202 | 2006-03-04 | Martin Nilsson | |
|
f757d0 | 2008-05-01 | Martin Stjernholm | | void count_memory_in_arrays(size_t *num_, size_t *size_)
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | {
|
f757d0 | 2008-05-01 | Martin Stjernholm | | size_t num=0, size=0;
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | struct array *m;
|
cd451f | 2004-03-15 | Martin Stjernholm | | for(m=first_array;m;m=m->next)
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | {
num++;
size+=sizeof(struct array)+
sizeof(struct svalue) * (m->malloced_size - 1);
}
*num_=num;
*size_=size;
}
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | |
|
21d202 | 2006-03-04 | Martin Nilsson | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *explode_array(struct array *a, struct array *b)
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | {
|
b0b19a | 2001-02-03 | Martin Stjernholm | | INT32 e,d,start;
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | struct array *tmp;
|
b0b19a | 2001-02-03 | Martin Stjernholm | | start=0;
|
6fdf36 | 1998-05-12 | Fredrik Hübinette (Hubbe) | | #if 0
|
5fb4a5 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | if(!a->size)
{
return allocate_array_no_init(0,0);
}
|
6fdf36 | 1998-05-12 | Fredrik Hübinette (Hubbe) | | #endif
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | if(b->size)
{
|
b0b19a | 2001-02-03 | Martin Stjernholm | | BEGIN_AGGREGATE_ARRAY(1) {
for(e=0;e<=a->size - b->size;e++)
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | {
|
b0b19a | 2001-02-03 | Martin Stjernholm | | for(d=0;d<b->size;d++)
{
if(!is_eq(ITEM(a)+(e+d),ITEM(b)+d))
break;
}
if(d==b->size)
{
check_stack(1);
push_array(friendly_slice_array(a, start, e));
DO_AGGREGATE_ARRAY(120);
e+=b->size-1;
start=e+1;
}
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | }
|
b0b19a | 2001-02-03 | Martin Stjernholm | | check_stack(1);
push_array(friendly_slice_array(a, start, a->size));
} END_AGGREGATE_ARRAY;
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | }else{
|
b0b19a | 2001-02-03 | Martin Stjernholm | | check_stack(120);
BEGIN_AGGREGATE_ARRAY(a->size) {
for(e=0;e<a->size;e++) {
push_array(friendly_slice_array(a, e, e+1));
DO_AGGREGATE_ARRAY(120);
}
} END_AGGREGATE_ARRAY;
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | }
|
b0b19a | 2001-02-03 | Martin Stjernholm | | tmp=(--Pike_sp)->u.array;
|
50ea68 | 2003-03-14 | Henrik Grubbström (Grubba) | | debug_malloc_touch(tmp);
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | if(tmp->size) tmp->type_field=BIT_ARRAY;
return tmp;
}
|
21d202 | 2006-03-04 | Martin Nilsson | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct array *implode_array(struct array *a, struct array *b)
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | {
|
01edae | 2002-03-06 | Henrik Grubbström (Grubba) | | INT32 e, size;
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | struct array *ret;
|
01edae | 2002-03-06 | Henrik Grubbström (Grubba) | |
if (!a->size) {
add_ref(a);
return a;
}
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | size=0;
for(e=0;e<a->size;e++)
{
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if(TYPEOF(ITEM(a)[e]) != T_ARRAY)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("Implode array contains non-arrays.\n");
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | size+=ITEM(a)[e].u.array->size;
}
ret=allocate_array((a->size -1) * b->size + size);
size=0;
ret->type_field=0;
for(e=0;e<a->size;e++)
{
if(e)
{
ret->type_field|=b->type_field;
assign_svalues_no_free(ITEM(ret)+size,
ITEM(b),
b->size,
b->type_field);
size+=b->size;
}
ret->type_field|=ITEM(a)[e].u.array->type_field;
assign_svalues_no_free(ITEM(ret)+size,
ITEM(ITEM(a)[e].u.array),
ITEM(a)[e].u.array->size,
ITEM(a)[e].u.array->type_field);
size+=ITEM(a)[e].u.array->size;
}
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | if(size != ret->size)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Implode_array failed miserably (%d != %d)\n", size, ret->size);
|
f5466b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | #endif
return ret;
}
|