Exemplo n.º 1
0
	void WriteRegistryInstance::startExecution()
	{
	#ifdef Q_OS_WIN
		bool ok = true;

		ActionTools::Registry::Key key = evaluateListElement<ActionTools::Registry::Key>(ok, ReadRegistryInstance::keys, "key");
		QString subKey = evaluateString(ok, "subKey");
		QString value = evaluateString(ok, "value");
        QScriptValue data = evaluateValue(ok, "data");

		if(!ok)
			return;

        switch(ActionTools::Registry::write(data.toVariant(), key, subKey, value))
		{
		case ActionTools::Registry::WriteCannotFindSubKey:
			setCurrentParameter("subKey");
			emit executionException(CannotFindSubKeyException, tr("Cannot find subKey \"%1\"").arg(subKey));
			return;
		case ActionTools::Registry::WriteCannotWriteValue:
			setCurrentParameter("value");
			emit executionException(CannotWriteValueException, tr("Cannot write value \"%1\"").arg(value));
			return;
		default:
			break;
		}
	#endif

		emit executionEnded();
	}
Exemplo n.º 2
0
double valueToDouble(Value* v) {
  double d, n;
  BoolExpr* be;
  Value* u;
  List* node;
  n = 0.0;
  if (v->type == 'n')
    return *(double*)v->data;
  if (v->type == 's')
    return atof(((String*)v->data)->val);
  if (v->type == 'b') {
    be = evaluateBoolExpr((BoolExpr*)v);
    if (be == NULL) return NAN;
    return (double)(be->lasteval);
  }
  if (v->type == 'c') {
    u = (Value*)evaluateFuncVal((FuncVal*)v);
    if (u == NULL) return NAN;
    d = valueToDouble(u);
    freeValue(u);
    return d;
  }
  if (v->type == 'd')
    return valueToDouble(evaluateStatements(v->data));
  if (v->type == 'l') {
    if (!v->data)
      return 0.0;
    for (node = ((List*)v->data)->next;node != NULL;node = node->next) {
      u = evaluateValue(node->data);
      d = valueToDouble(u);
      freeValue(u);
      if (d < 0) return d;
      n += d;
    }
    return n;
  }
  if (v->type == 'v') {
    u = evaluateValue(v);
    if (u == NULL) return NAN;
    n = valueToDouble(u);
  }
  return n;
}
Exemplo n.º 3
0
Arquivo: repl.c Projeto: uiri/fffll
Value* evaluateFuncVal(FuncVal* fv) {
  FuncDef* fd;
  Value* v, *u;
  v = fv->val;
  u = NULL;
  fd = NULL;
  if (v->type != 'a') {
    u = v;
    v = evaluateValue(u);
  }
  if (v == NULL || v->type != 'a') {
    errmsgf("Attempt to use non-function '%s' as a functor", fv->name);
    v = NULL;
  }
  if (v != NULL) {
    fd = v->data;
  }
  if (fd == NULL || (v = (*fd->evaluate)(fd, fv->arglist)) == NULL) {
    errmsgfd("In %s at line %d", fv->name, fv->lineno);
    return NULL;
  }
  return v;
}
Exemplo n.º 4
0
Arquivo: repl.c Projeto: uiri/fffll
char* valueToString(Value* v) {
  char* s, *t;
  int i, j, l, freet;
  double a, b, c;
  BoolExpr* be;
  Value* u;
  List* node;
  freet = 0;
  l = 0;
  t = NULL;
  if (v->type == 'v') {
    u = evaluateValue(v);
    if (u == NULL) return NULL;
    s = valueToString(u);
    if (s == NULL) return NULL;
    return s;
  }
  if (v->type == 'i') {
    u = evaluateValue(v);
    if (u == NULL) return NULL;
    s = valueToString(u);
    return s;
  }
  if (v->type == 'n') {
    l = 32;
    i = l;
    s = malloc(l);
    l = snprintf(s, l, "%g", *(double*)v->data);
    if (i<l) {
      s = realloc(s, l);
      snprintf(s, l, "%g", *(double*)v->data);
    }
    return s;
  }
  if (v->type == '0' || v->type == 'b') {
    if (v->type == 'b') {
      be = evaluateBoolExpr((BoolExpr*)v);
      if (be == NULL) return NULL;
      l = be->lasteval;
    }
    if (l) {
      s = malloc(5);
      s[0] = 't';
      s[1] = 'r';
      s[2] = 'u';
      s[3] = 'e';
      s[4] = '\0';
    } else {
      s = malloc(6);
      s[0] = 'f';
      s[1] = 'a';
      s[2] = 'l';
      s[3] = 's';
      s[4] = 'e';
      s[5] = '\0';
    }
    return s;
  }
  if (v->type == 'r') {
    a = valueToDouble(((Range*)v)->start);
    c = valueToDouble(((Range*)v)->end);
    if (((Range*)v)->increment == falsevalue) {
      b = 1.0;
      if (c<a)
	b = -1.0;
    } else {
      b = valueToDouble(((Range*)v)->increment);
    }
    s = malloc(1);
    if ((c-a)/b < 0) {
      s[0] = '\0';
      return s;
    }
    l = 1;
    if (a<c) {
      for (;a<c;a += b) {
	l += snprintf(s, 0, "%d, ", (int)a);
      }
    } else if (c<a) {
      for (;c<a;a += b) {
	l += snprintf(s, 0, "%d, ", (int)a);
      }
    }
    free(s);
    s = malloc(l);
    a = valueToDouble(((Range*)v)->start);
    i = 0;
    if (a<c) {
      for (;a<c;a += b) {
	  i += snprintf(s+i, l, "%d, ", (int)a);
      }
    } else if (c<a) {
      for (;c<a;a += b) {
	i += snprintf(s+i, l-i, "%d, ", (int)a);
      }
    }
    i--;
    s[--i] = '\0';
    return s;
  }
  if (v->type == 'l') {
    s = malloc(4);
    s[0] = '[';
    i = 0;
    node = NULL;
    if (v->data)
      node = ((List*)v->data)->next;
    for (;node != NULL;node = node->next) {
      if (i) s[i] = ' ';
      i++;
      u = evaluateValue(node->data);
      if (u == NULL) {
	free(s);
	return NULL;
      }
      t = valueToString(u);
      freeValue(u);
      if (t == NULL) {
	free(s);
	return NULL;
      }
      l = strlen(t);
      s = realloc(s, i+l+2);
      for (j=0;j<l;j++) {
	s[i+j] = t[j];
      }
      s[i+++j] = ',';
      s[i+j] = '\0';
      i += l;
      free(t);
    }
    if (!i) i = 2;
    s[--i] = ']';
    s[++i] = '\0';
    return s;
  }
  if (v->type == 'c') {
    u = evaluateFuncVal((FuncVal*)v);
    if (u == NULL) return NULL;
    s = valueToString(u);
    freeValue(u);
    return s;
  }
  if (v->type == 'd') {
    u = evaluateStatements(v->data);
    if (u == NULL) return NULL;
    s = valueToString(u);
    freeValue(u);
    return s;
  }
  if (v->type == 's' || v->type == 'x') {
    t = ((String*)v->data)->val;
  }
  if (t == NULL) return NULL;
  l = strlen(t);
  s = malloc(l+1);
  for (i=0;i<l;i++) {
    s[i] = t[i];
  }
  s[i] = '\0';
  if (freet) free(t);
  return s;
}
Exemplo n.º 5
0
BoolExpr* evaluateBoolExpr(BoolExpr* be) {
  int m, p, erroff, ovec[PCREOVECCOUNT];
  double j, k, **n, *o;
  char* c, *s, *t;
  const char* err;
  List* stack, *prop, *stackiter;
  Value* v, *u, *w;
  pcre *re;
  re = NULL;
  stack = be->stack;
  for (m=0;stack->next && stack->next->next;m++)
    stack = stack->next->next;
  n = malloc((m+2)*sizeof(double*));
  m = -1;
  stack = newList();
  o = NULL;
  stackiter = be->stack;
  while (stackiter) {
    s = NULL;
    t = NULL;
    w = NULL;
    v = NULL;
    u = stackiter->data;
    if (u->type == '|' || u->type == '&') {
      addToListEnd(stack, n[m]);
      addToListEnd(stack, u);
      stackiter = stackiter->next;
      continue;
    }
    n[++m] = calloc(1, sizeof(double));
    if (u->type != 'b') {
      v = evaluateValue(u);
      w = v;
      if (v == NULL) {
	freeList(stack);
	m++;
	for (p=0;p<m;p++) {
	  free(n[p]);
	}
	free(n);
	return NULL;
      }
      if (v->type == 's') {
	s = v->data;
      }
      j = evaluateValueAsBool(v);
      if (u->type != 'v')
	freeValue(v);
    } else {
      j = evaluateValueAsBool(u);
    }
    if (isnan(j)) {
      m++;
      for (p=0;p<m;p++) {
	free(n[p]);
      }
      free(n);
      freeList(stack);
      return NULL;
    }
    stackiter = stackiter->next;
    if (j) *n[m] = 1;
    if (!stackiter) {
      break;
    }
    c = (char*)stackiter->data;
    stackiter = stackiter->next;
    if (c[0] == '|' || c[0] == '&') {
      addToListEnd(stack, n[m]);
      addToListEnd(stack, c);
      continue;
    }
    n[++m] = calloc(1, sizeof(double));
    u = stackiter->data;
    if (u->type != 'b') {
      v = evaluateValue(u);
      if (v == NULL) {
	freeList(stack);
	m++;
	for (p=0;p<m;p++) {
	  free(n[p]);
	}
	free(n);
	return NULL;
      }
      if (v->type == 's') {
	t = v->data;
      }
      if (u->type != 'v')
	freeValue(v);
    }
    k = evaluateValueAsBool(stackiter->data);
    if (isnan(k)) {
      m++;
      for (p=0;p<m;p++) {
	free(n[p]);
      }
      free(n);
      freeList(stack);
      return NULL;
    }
    stackiter = stackiter->next;
    if (c[0] == '~') {
      if (w == NULL) {
	continue;
      }
      s = valueToString(w);
      t = valueToString(v);
      re = pcre_compile(t, 0, &err, &erroff, NULL);
      if (pcre_exec(re, NULL, s, strlen(s), 0, 0, ovec, PCREOVECCOUNT) > -1)
	*n[m] = 1;
      free(s);
      free(t);
      if (re) pcre_free(re);
      continue;
    }
    if (c[0] == '?') {
      if (w == NULL || v == NULL)
	continue;
      if (w->type == v->type) {
	if (v->type != 'l' || ((List*)v->data)->data == NULL) {
	  *n[m] = 1;
	  continue;
	}
	prop = ((List*)((List*)v->data)->data)->next;
	while (prop != NULL) {
	  if (!findInTree(((List*)((List*)w->data)->data)->data, ((Variable*)prop->data)->name))
	    break;
	  prop = prop->next;
	}
	if (prop == NULL)
	  *n[m] = 1;
      }
    }
    if (t != NULL && s != NULL) {
      if (s == t && c[0] == '=') {
	  *n[m] = 1;
	  continue;
      }
      for (p=0;s[p] != '\0' && s[p] == t[p];p++);
      if ((c[0] == '<' && s[p] < t[p]) || (c[0] == '>' && s[p] > t[p]))
	*n[m] = 1;
      continue;
    }
    p = 0;
    if (c[0] == '=') {
      if (fabs(j) < IOTA) {
	if (j < 0)
	  j = -0.0;
	else
	  j = 0.0;
      }
      if (fabs(k) < IOTA) {
	if (k < 0)
	  k = -0.0;
	else
	  k = 0.0;
      }
    }
    if (j>k) {
      if (j<=0.0) {
	if (fabs((j-k)/k)>=EPSILON)
	  p = 1;
      } else {
	if (fabs((j-k)/j)>=EPSILON)
	  p = 1;
      }
    } else {
      if (k<=0.0) {
	if (fabs((k-j)/j)>=EPSILON)
	  p = -1;
      } else {
	if (fabs((k-j)/k)>=EPSILON)
	  p = -1;
      }
    }
    if ((c[0] == '<' && p<0) || (c[0] == '>' && p>0) || (c[0] == '=' && !p)) {
      *n[m] = 1;
    }
  }
  if (m > -1)
    o = n[m];
  if (stack->data && m > -1) {
    addToListEnd(stack, n[m]);
  }
  m++;
  stackiter = NULL;
  if (stack->data)
    stackiter = stack;
  while (stackiter) {
    j = *(double*)stackiter->data;
    if (!(stackiter->next)) {
      o = (double*)stackiter->data;
      if (j) *o = 1; else *o = 0;
      break;
    }
    stackiter = stackiter->next;
    c = stackiter->data;
    stackiter = stackiter->next;
    o = (double*)stackiter->data;
    k = *o;
    if (((j && k) && c[0] == '&') || ((j || k) && c[0] == '|'))
      *o = 1;
    else
      *o = 0;
  }
  if (o == NULL)
    be->lasteval = 1;
  else
    be->lasteval = *o;
  for (p=0;p<m;p++) {
    free(n[p]);
  }
  free(n);
  freeList(stack);
  if (be->neg) be->lasteval = !be->lasteval;
  return be;
}
Exemplo n.º 6
0
static ERR_EXISTS evaluateExpression(QueryExpression *qexp, int col, int row, PixImg *target, PixImg *in, PixImg *out, Number *n, PixErr *err)
{
  Number na, nb;
  if(qexp->a) if(!evaluateExpression(qexp->a,col,row,target,in,out,&na,err)) return ERR;
  if(qexp->b) if(!evaluateExpression(qexp->b,col,row,target,in,out,&nb,err)) return ERR;

  switch(qexp->type)
  {
    case QUERY_EXPRESSION_TYPE_OR:
    {
      if(na.type == NUMBER_TYPE_REAL || nb.type == NUMBER_TYPE_REAL) ERROR("OR of real unsupported (cast to int)");
      n->type = NUMBER_TYPE_INT; n->i = na.i || nb.i;
    }
      break;
    case QUERY_EXPRESSION_TYPE_AND:
    {
      if(na.type == NUMBER_TYPE_REAL || nb.type == NUMBER_TYPE_REAL) ERROR("AND of real unsupported (cast to int)");
      n->type = NUMBER_TYPE_INT; n->i = na.i && nb.i;
    }
      break;
    case QUERY_EXPRESSION_TYPE_NOT:
    {
      switch(na.type)
      {
        case NUMBER_TYPE_INT:  n->type = NUMBER_TYPE_INT; n->i = (na.i == 0);    break;
        case NUMBER_TYPE_REAL: n->type = NUMBER_TYPE_INT; n->i = (na.r == 0.0f); break;
        default: break; //shouldn't happen
      }
    }
      break;
    case QUERY_EXPRESSION_TYPE_EQ:
    {
           if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT; n->i = (na.i == nb.i); }
      else if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = ((double)na.i == nb.r); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT; n->i = (na.r == (double)nb.i); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = (na.r == nb.r); }
    }
      break;
    case QUERY_EXPRESSION_TYPE_NE:
           if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT; n->i = (na.i != nb.i); }
      else if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = ((double)na.i != nb.r); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT; n->i = (na.r != (double)nb.i); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = (na.r != nb.r); }
      break;
    case QUERY_EXPRESSION_TYPE_LT:
           if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT; n->i = (na.i < nb.i); }
      else if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = ((double)na.i < nb.r); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT; n->i = (na.r < (double)nb.i); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = (na.r < nb.r); }
      break;
    case QUERY_EXPRESSION_TYPE_LTE:
           if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT; n->i = (na.i <= nb.i); }
      else if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = ((double)na.i <= nb.r); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT; n->i = (na.r <= (double)nb.i); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = (na.r <= nb.r); }
      break;
    case QUERY_EXPRESSION_TYPE_GTE:
           if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT; n->i = (na.i >= nb.i); }
      else if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = ((double)na.i >= nb.r); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT; n->i = (na.r >= (double)nb.i); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = (na.r >= nb.r); }
      break;
    case QUERY_EXPRESSION_TYPE_GT:
           if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT; n->i = (na.i > nb.i); }
      else if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = ((double)na.i > nb.r); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT; n->i = (na.r > (double)nb.i); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = (na.r > nb.r); }
      break;
    case QUERY_EXPRESSION_TYPE_SUB:
           if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT;  n->i = (na.i - nb.i); }
      else if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = ((double)na.i - nb.r); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_REAL; n->r = (na.r - (double)nb.i); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = (na.r - nb.r); }
      break;
    case QUERY_EXPRESSION_TYPE_ADD:
           if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT;  n->i = (na.i + nb.i); }
      else if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = ((double)na.i + nb.r); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_REAL; n->r = (na.r + (double)nb.i); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = (na.r + nb.r); }
      break;
    case QUERY_EXPRESSION_TYPE_DIV:
      if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_INT)
      {
        if((na.i/nb.i)*nb.i == na.i) //aka "if integer division is lossless"
        {
          n->type = NUMBER_TYPE_INT;
          n->i = (na.i / nb.i);
        }
        else
        {
          n->type = NUMBER_TYPE_REAL;
          n->r = ((float)na.i / (float)nb.i);
        }
      }
      else if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = ((double)na.i / nb.r); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_REAL; n->r = (na.r / (double)nb.i); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = (na.r / nb.r); }
      break;
    case QUERY_EXPRESSION_TYPE_MUL:
           if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT;  n->i = (na.i * nb.i); }
      else if(na.type == NUMBER_TYPE_INT  && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = ((double)na.i * nb.r); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_REAL; n->r = (na.r * (double)nb.i); }
      else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = (na.r * nb.r); }
      break;
    case QUERY_EXPRESSION_TYPE_MOD:
      if(na.type == NUMBER_TYPE_REAL || nb.type == NUMBER_TYPE_REAL) ERROR("Modulus of real unsupported (cast to int)");
      n->type = NUMBER_TYPE_INT; n->i = (na.i % nb.i);
      break;
    case QUERY_EXPRESSION_TYPE_SIN:
      if(na.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_REAL; n->r = sin((double)na.i); }
      if(na.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = sin(na.r); }
      break;
    case QUERY_EXPRESSION_TYPE_COS:
      if(na.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_REAL; n->r = cos((double)na.i); }
      if(na.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = cos(na.r); }
      break;
    case QUERY_EXPRESSION_TYPE_TAN:
      if(na.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_REAL; n->r = tan((double)na.i); }
      if(na.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = tan(na.r); }
      break;
    case QUERY_EXPRESSION_TYPE_ABS:
      if(na.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT;  n->i = abs((int)na.i); }
      if(na.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = fabs(na.r); }
      break;
    case QUERY_EXPRESSION_TYPE_NEG:
      if(na.type == NUMBER_TYPE_INT)  { n->type = NUMBER_TYPE_INT;  n->i = -1 * na.i; }
      if(na.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = -1.0f * na.r; }
      break;
    case QUERY_EXPRESSION_TYPE_VALUE:
      if(!evaluateValue(&qexp->v,col,row,target,in,out,n,err)) return ERR;
      break;
    case QUERY_EXPRESSION_TYPE_INVALID:
    default:
      ERROR("Invalid query expression type");
      break;
  }
  return NO_ERR;
}