Update of /cvsroot/agd/server/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv635
Modified Files:
array.c
Log Message:
Removed unused code; working intersect_arrays; add_arrays
Index: array.c
===================================================================
RCS file: /cvsroot/agd/server/src/array.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- array.c 23 Jul 2004 17:19:58 -0000 1.17
+++ array.c 24 Jul 2004 18:03:02 -0000 1.18
@@ -15,6 +15,7 @@
#include "sys.h"
#include "lpc.h"
#include "array.h"
+#include "vars.h"
void init_array(array_t *a)
{
@@ -23,117 +24,45 @@
a->data = NULL;
}
-void free_array(array_t *a, void (*freefun)(variable_t))
+void free_array(array_t *a, void (*freefun)(variable_t*))
{
int i;
if(!freefun)
- freefun = (void(*)(variable_t))free; /* free_var? */
+ freefun = free_var;
for(i=0;i<a->length;i++)
- freefun(a->data[i]);
+ freefun(&a->data[i]);
if(a->length)
free(a->data);
- init_array(a);
+ init_array(a);
}
-#if 0
-void array_push(array_t *a, variable_t *data)
-{
- if(!a)
- return;
- a->length++;
- a->data = xrealloc(a->data, sizeof(void *) * a->length);
- a->data[a->length-1] = data;
-}
-#endif
-#if 0
-void array_insert(array_t *a, void *data, int index)
+void unref_array(array_t *a)
{
- int i;
-
-#ifdef DEBUG
- if(index > a->length) {
- printf("array_insert(): illegal index %d!\n", index);
- return;
- }
-#endif
-
- a->length++;
- a->data = realloc(a->data, sizeof(void *) * a->length);
- for(i=a->length-1;i>index;i--) {
- a->data[i] = a->data[i-1];
+ a->ref--;
+ if(a->ref < 0)
+ printf("Warning: array[%p] ref < 0\n", a);
+ if(a->ref <= 0) {
+ free_array(a, NULL);
}
- a->data[index] = data;
}
-void array_remove(array_t *a, int index)
+array_t *add_arrays(array_t *a1, array_t *a2)
{
int i;
- if(index == a->length - 1) {
- a->length--;
- a->data = realloc(a->data, sizeof(void *) * a->length);
- return;
- }
+ array_t *ret;
+ ret = xmalloc(sizeof(array_t));
+ ret->ref = 0;
+ ret->length = a1->length + a2->length;
+ ret->data = xmalloc(sizeof(variable_t) * ret->length);
- for(i=index;i<a->length;i++) {
- a->data[i] = a->data[i+1];
- }
- a->length--;
- a->data = realloc(a->data, sizeof(void *) * a->length);
-/* a->data[++i] = NULL;*/
-}
-
-void array_remove_by_data(array_t *a, void *data)
-{
- int i;
- for(i=0;i<a->length;i++) {
- if(a->data[i] == data) {
- array_remove(a, i);
- return;
- }
- }
-}
-
-array_t *copy_array(array_t *a, void *(*copyfun)(void *))
-{
- array_t *p;
- int i;
-
- p = type_xmalloc(array_t);
- p->length = a->length;
- p->data = malloc(sizeof(void *) * p->length);
-
- for(i = 0; i < p->length; i++)
- if(copyfun)
- p->data[i] = copyfun(a->data[i]);
+ for(i=0;i<ret->length;i++) {
+ /* use do_assign? */
+ if(i < a1->length)
+ ret->data[i] = a1->data[i];
else
- p->data[i] = a->data[i];
-
- return p;
-}
-
-array_t *array_concat(array_t *a1, array_t *a2)
-{
- int oldlen, i;
-
- oldlen = a1->length;
- a1->length += a2->length;
- a1->data = realloc(a1->data, sizeof(void *) * a1->length);
-
- for(i = oldlen; i < a1->length; i++)
- a1->data[i] = a2->data[i - oldlen];
-
- return a1;
-}
-#endif
-
-void unref_array(array_t *a)
-{
- a->ref--;
- if(a->ref < 0)
- printf("Warning: array[%p] ref < 0\n", a);
- if(a->ref <= 0) {
- free_array(a, NULL);
+ ret->data[i] = a2->data[i - a1->length];
}
+ return ret;
}
array_t *sub_arrays(array_t *a1, array_t *a2) {
@@ -142,9 +71,7 @@
int appears_in;
ret = xmalloc(sizeof(array_t));
- ret->ref = 1;
- ret->length = 0;
- ret->data = NULL;
+ init_array(ret);
for(i=0;i<a1->length;i++) {
appears_in = 0;
@@ -167,5 +94,22 @@
}
array_t *intersect_arrays(array_t *a1, array_t *a2) {
- return a1;
+ int i, j;
+ array_t *ret;
+
+ ret = xmalloc(sizeof(array_t));
+ init_array(ret);
+
+ for(i=0;i<a1->length;i++) {
+ for(j=0;j<a2->length;j++) {
+ if(!compare_vars(&a1->data[i], &a2->data[j])) {
+ ret->length++;
+ ret->data = xrealloc(ret->data, sizeof(variable_t) * ret->length);
+ ret->data[ret->length-1] = a1->data[i];
+ break;
+ }
+ }
+ }
+
+ return ret;
}
|