#include <stdio.h>
#include "expr.h"
#include "map.h"

Expr::Expr ()
{
  op1 = 0;
  op2 = 0;
  Type = E_NONE;
  f = 0;
  i = 0;
}

Expr::~Expr ()
{
  if (op1)
    delete op1;
  if (op2)
    delete op2;
}

String
printExpression (Expr * s)
{
  char buf[200];
  String s1;
  if (!s)
    return "???";
  switch (s->Type)
    {
    case Expr::E_AND:
      return (String) "(" + printExpression (s->op1) + "&&" +
	printExpression (s->op2) + ")";
    case Expr::E_OR:
      return (String) "(" + printExpression (s->op1) + "||" +
	printExpression (s->op2) + ")";
    case Expr::E_NOT:
      return (String) "(!" + printExpression (s->op1) + ")";
    case Expr::E_LE:
      return (String) "(" + printExpression (s->op1) + "<=" +
	printExpression (s->op2) + ")";
    case Expr::E_LT:
      return (String) "(" + printExpression (s->op1) + "<" +
	printExpression (s->op2) + ")";
    case Expr::E_GT:
      return (String) "(" + printExpression (s->op1) + ">" +
	printExpression (s->op2) + ")";
    case Expr::E_GE:
      return (String) "(" + printExpression (s->op1) + ">=" +
	printExpression (s->op2) + ")";
    case Expr::E_EQ:
      return (String) "(" + printExpression (s->op1) + "==" +
	printExpression (s->op2) + ")";
    case Expr::E_NE:
      return (String) "(" + printExpression (s->op1) + "!=" +
	printExpression (s->op2) + ")";
    case Expr::E_NOTNULL:
      return (String) "(" + printExpression (s->op1) + "!=0)";
    case Expr::E_PLUS:
      return (String) "(" + printExpression (s->op1) + "+" +
	printExpression (s->op2) + ")";
    case Expr::E_MINUS:
      return (String) "(" + printExpression (s->op1) + "-" +
	printExpression (s->op2) + ")";
    case Expr::E_NEG:
      return (String) "(-" + printExpression (s->op1) + ")";
    case Expr::E_MUL:
      return (String) "(" + printExpression (s->op1) + "*" +
	printExpression (s->op2) + ")";
    case Expr::E_DIV:
      return (String) "(" + printExpression (s->op1) + "/" +
	printExpression (s->op2) + ")";
    case Expr::E_MOD:
      return (String) "(" + printExpression (s->op1) + "%" +
	printExpression (s->op2) + ")";
    case Expr::E_INT:
      sprintf (buf, "%d", s->i);
      return buf;
    case Expr::E_FLOAT:
      sprintf (buf, "%f", s->f);
      return buf;
    case Expr::E_STRING:
      return (String) "\"" + escapeString (s->s) + "\"";
    case Expr::E_PAR:
      return s->s;
    case Expr::E_IN:
      s1 = s->s + " IN(";
      for (int i = 0; i < s->id (); i++)
	s1 += s->id[i] + ",";
      s1 += ")";
      return s1;
    case Expr::E_NONE:
      return "??";
      ;
    }
}


syntax highlighted by Code2HTML, v. 0.9.1