X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fexpr-evl.c;h=3a6abca6eba41af508b1080a37c39bb05991c135;hb=0280721550011ce14d0632f547746ea03e966bf7;hp=b8991547a359ae9a43f68331d9e9c536e4288e42;hpb=3a7fba81ceae5b049d0f7d671e9e3c3c43bbf703;p=pspp diff --git a/src/expr-evl.c b/src/expr-evl.c index b8991547a3..3a6abca6eb 100644 --- a/src/expr-evl.c +++ b/src/expr-evl.c @@ -17,23 +17,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* AIX requires this to be the first thing in the file. */ #include -#if __GNUC__ -#define alloca __builtin_alloca -#else -#if HAVE_ALLOCA_H -#include -#else -#ifdef _AIX -#pragma alloca -#else -#ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -#endif -#endif -#endif -#endif #if TIME_WITH_SYS_TIME #include @@ -58,6 +42,7 @@ char *alloca (); #include "error.h" #include "julcal/julcal.h" #include "magic.h" +#include "pool.h" #include "random.h" #include "stats.h" #include "str.h" @@ -65,62 +50,20 @@ char *alloca (); #include "vfm.h" #include "vfmP.h" -/* FIXME: This could be even more efficient if we caught SYSMIS when - it first reared its ugly head, then threw it into an entirely new - switch that handled SYSMIS aggressively like all the code does now. - But I've spent a couple of weeks on the expression code, and that's - enough to make anyone sick. For that matter, it could be more - efficient if I hand-coded it in assembly for a dozen processors, - but I'm not going to do that either. */ - -/* These macros are defined differently depending on the way that - the stack is managed. (i.e., I have to adapt the code to inferior - environments.) - - void CHECK_STRING_SPACE(int x): Assure that at least X+1 bytes of - space are available in the string evaluation stack. - - unsigned char *ALLOC_STRING_SPACE(int x): Return a pointer to X+1 - bytes of space. CHECK_STRING_SPACE must have previously been - called with an argument of at least X. */ - -#if PAGED_STACK -#define CHECK_STRING_SPACE(X) /* nothing to do! */ -#define ALLOC_STRING_SPACE(X) \ - alloca((X) + 1) -#else /* !PAGED_STACK */ -#define CHECK_STRING_SPACE(X) \ - do \ - { \ - if (str_stk + X >= str_end) \ - { \ - e->str_size += 1024; \ - e->str_stk = xrealloc (e->str_stk, e->str_size); \ - str_end = e->str_stk + e->str_size - 1; \ - } \ - } \ - while (0) - -#define ALLOC_STRING_SPACE(X) \ - (str_stk += X + 1, str_stk - X - 1) -#endif /* !PAGED_STACK */ - double expr_evaluate (struct expression *e, struct ccase *c, union value *v) { unsigned char *op = e->op; double *dbl = e->num; unsigned char *str = e->str; -#if !PAGED_STACK - unsigned char *str_stk = e->str_stk; - unsigned char *str_end = e->str_stk + e->str_size - 1; -#endif struct variable **vars = e->var; int i, j; /* Stack pointer. */ union value *sp = e->stack; + pool_clear (e->pool); + for (;;) { switch (*op++) @@ -829,8 +772,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) int n_args = *op++; unsigned char *dest; - CHECK_STRING_SPACE (255); - dest = ALLOC_STRING_SPACE (255); + dest = pool_alloc (e->pool, 256); dest[0] = 0; sp -= n_args - 1; @@ -952,8 +894,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) { unsigned char *dest; - CHECK_STRING_SPACE (len); - dest = ALLOC_STRING_SPACE (len); + dest = pool_alloc (e->pool, len + 1); dest[0] = len; memset (&dest[1], ' ', len - sp->c[0]); memcpy (&dest[len - sp->c[0] + 1], &sp->c[1], sp->c[0]); @@ -972,8 +913,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) { unsigned char *dest; - CHECK_STRING_SPACE (len); - dest = ALLOC_STRING_SPACE (len); + dest = pool_alloc (e->pool, len + 1); dest[0] = len; memset (&dest[1], sp[2].c[1], len - sp->c[0]); memcpy (&dest[len - sp->c[0] + 1], &sp->c[1], sp->c[0]); @@ -992,8 +932,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) { unsigned char *dest; - CHECK_STRING_SPACE (len); - dest = ALLOC_STRING_SPACE (len); + dest = pool_alloc (e->pool, len + 1); dest[0] = len; memcpy (&dest[1], &sp->c[1], sp->c[0]); memset (&dest[sp->c[0] + 1], ' ', len - sp->c[0]); @@ -1012,8 +951,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) { unsigned char *dest; - CHECK_STRING_SPACE (len); - dest = ALLOC_STRING_SPACE (len); + dest = pool_alloc (e->pool, len + 1); dest[0] = len; memcpy (&dest[1], &sp->c[1], sp->c[0]); memset (&dest[sp->c[0] + 1], sp[2].c[1], len - sp->c[0]); @@ -1112,10 +1050,10 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) f.w = *op++; f.d = *op++; - CHECK_STRING_SPACE (f.w); - dest = ALLOC_STRING_SPACE (f.w); + dest = pool_alloc (e->pool, f.w + 1); dest[0] = f.w; + assert ((formats[f.type].cat & FCAT_STRING) == 0); data_out (&dest[1], &f, sp); sp->c = dest; } @@ -1251,15 +1189,13 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) msg (SE, _("%g is not a valid index value for vector %s. " "The result will be set to the empty string."), sp[0].f, vect->name); - CHECK_STRING_SPACE (0); - sp->c = ALLOC_STRING_SPACE (0); + sp->c = pool_alloc (e->pool, 1); sp->c[0] = 0; break; } v = vect->var[rindx - 1]; - CHECK_STRING_SPACE (v->width); - sp->c = ALLOC_STRING_SPACE (v->width); + sp->c = pool_alloc (e->pool, v->width + 1); sp->c[0] = v->width; memcpy (&sp->c[1], c->data[v->fv].s, v->width); } @@ -1272,8 +1208,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) break; case OP_STR_CON: sp++; - CHECK_STRING_SPACE (*str); - sp->c = ALLOC_STRING_SPACE (*str); + sp->c = pool_alloc (e->pool, *str + 1); memcpy (sp->c, str, *str + 1); str += *str + 1; break; @@ -1289,8 +1224,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) int width = (*vars)->width; sp++; - CHECK_STRING_SPACE (width); - sp->c = ALLOC_STRING_SPACE (width); + sp->c = pool_alloc (e->pool, width + 1); sp->c[0] = width; memcpy (&sp->c[1], &c->data[(*vars)->fv], width); vars++; @@ -1318,8 +1252,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) int width = (*vars)->width; sp++; - CHECK_STRING_SPACE (width); - sp->c = ALLOC_STRING_SPACE (width); + sp->c = pool_alloc (e->pool, width + 1); sp->c[0] = width; if (c == NULL) @@ -1352,12 +1285,6 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) goto finished; default: -#if GLOBAL_DEBUGGING - printf (_("evaluate_expression(): not implemented: %s\n"), - ops[op[-1]].name); -#else - printf (_("evaluate_expression(): not implemented: %d\n"), op[-1]); -#endif assert (0); } @@ -1377,12 +1304,7 @@ finished: { assert (v); -#if PAGED_STACK - memcpy (e->str_stack, sp->c, sp->c[0] + 1); - v->c = e->str_stack; -#else v->c = sp->c; -#endif return 0.0; }