|
From: Peep P. <so...@us...> - 2004-07-24 17:49:16
|
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 |