Update of /cvsroot/agd/server/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30796
Modified Files:
vars.c vars.h
Log Message:
slice_var(); adding of arrays moved to array.c
Index: vars.c
===================================================================
RCS file: /cvsroot/agd/server/src/vars.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- vars.c 23 Jul 2004 17:04:36 -0000 1.17
+++ vars.c 24 Jul 2004 17:49:04 -0000 1.18
@@ -53,13 +53,18 @@
int test_var(variable_t *v)
{
- switch(v->type) {
+ if(v->type & T_ARRAY) {
+ return v->u.a?1:0;
+ } else switch(v->type) {
case T_INT:
return v->u.i?1:0;
case T_STRING:
return v->u.s && strlen(v->u.s);
case T_OBJECT:
return v->u.ob?1:0;
+ case T_VOID:
+ printf("test_var() on T_VOID\n");
+ return 0;
default:
printf("test_var(): unknown datatype %d, returning false\n", v->type);
return 0;
@@ -141,20 +146,8 @@
#endif
if(v1->type & T_ARRAY && v2->type & T_ARRAY) {
- int i;
ret->type = v1->type;
- ret->u.a = xmalloc(sizeof(array_t));
- ret->u.a->ref = 1;
- ret->u.a->length = v1->u.a->length + v2->u.a->length;
- ret->u.a->data = xmalloc(sizeof(variable_t) * ret->u.a->length);
-
- for(i=0;i<ret->u.a->length;i++) {
- /* use do_assign? */
- if(i < v1->u.a->length)
- ret->u.a->data[i] = v1->u.a->data[i];
- else
- ret->u.a->data[i] = v2->u.a->data[i - v1->u.a->length];
- }
+ ret->u.a = add_arrays(v1->u.a, v2->u.a);
return ret;
}
@@ -271,6 +264,36 @@
return ret;
}
+variable_t *slice_var(variable_t *var, int i1, int i2)
+{
+ int i;
+ variable_t *ret;
+
+ ret = xmalloc(sizeof(variable_t));
+
+ if(var->type & T_ARRAY) {
+ array_t *arr;
+ ret->type = var->type;
+ ret->u.a = xmalloc(sizeof(array_t));
+ arr = ret->u.a;
+ arr->length = i2 - i1 + 1;
+ arr->data = xmalloc(arr->length * sizeof(variable_t));
+ for(i=i1;i<=i2;i++) {
+ do_assign(&arr->data[i-i1], &var->u.a->data[i]);
+ }
+ } else {
+ char *s;
+
+ ret->type = T_STRING;
+ s = xmalloc(i2 - i1 + 2);
+ for(i=i1;i<=i2;i++)
+ s[i-i1] = var->u.s[i];
+ s[i2 - i1 + 1] = '\0';
+ ret->u.s = s;
+ }
+ return ret;
+}
+
char *type2str(int t)
{
if(t & T_ARRAY) {
@@ -285,6 +308,8 @@
return "array of object";
case T_LVALUE:
return "array of lvalue";
+ case 0:
+ return "array";
default:
return "array of unknown";
}
Index: vars.h
===================================================================
RCS file: /cvsroot/agd/server/src/vars.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- vars.h 23 Jul 2004 17:03:56 -0000 1.10
+++ vars.h 24 Jul 2004 17:49:04 -0000 1.11
@@ -9,6 +9,7 @@
variable_t *add_vars(variable_t *v1, variable_t *v2);
variable_t *sub_vars(variable_t *v1, variable_t *v2);
variable_t *band_vars(variable_t *v1, variable_t *v2);
+variable_t *slice_var(variable_t *v1, int i1, int i2);
char *type2str(int t);
#endif
|