/*
** Splint - annotation-assisted static program checker
** Copyright (C) 1994-2002 University of Virginia,
**         Massachusetts Institute of Technology
**
** This program is free software; you can redistribute it and/or modify it
** under the terms of the GNU General Public License as published by the
** Free Software Foundation; either version 2 of the License, or (at your
** option) any later version.
** 
** This program is distributed in the hope that it will be useful, but
** WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
** General Public License for more details.
** 
** The GNU General Public License is available from http://www.gnu.org/ or
** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
** MA 02111-1307, USA.
**
** For information on splint: info@splint.org
** To report a bug: splint-bug@splint.org
** For more information: http://www.splint.org
*/

/*
** constraintExprData.c
*/

# include "splintMacros.nf"
# include "basic.h"
# include "cgrammar.h"
# include "cgrammar_tokens.h"

# include "exprChecks.h"
# include "exprNodeSList.h"

static /*@out@*/ constraintExprData constraintExprData_alloc (void)
{
  constraintExprData ret;

  ret = dmalloc (sizeof (*ret) );

  return ret;
}

static /*@out@*/ constraintExprData constraintExprData_allocBinaryOp (void)
{
  constraintExprData ret;

  ret = constraintExprData_alloc();

  ret->binaryOp.expr1 = constraintExpr_undefined;
  ret->binaryOp.expr2 = constraintExpr_undefined;

  return ret;
}

static /*@out@*/ constraintExprData constraintExprData_allocUnaryOp (void)
{
  constraintExprData ret;

  ret = constraintExprData_alloc();

  ret->unaryOp.expr = constraintExpr_undefined;

  return ret;
}

static /*@out@*/ constraintExprData constraintExprData_allocTerm (void)
{
  constraintExprData ret;

  ret = constraintExprData_alloc();

  ret->term = NULL;
  return ret;
}


void constraintExprData_freeBinaryExpr (/*@only@*/constraintExprData data)
{
  constraintExpr_free (data->binaryOp.expr1);
  constraintExpr_free (data->binaryOp.expr2);
  free(data);  
}

constraintExprData constraintExprData_copyBinaryExpr(/*@observer@*/ constraintExprData data)
{
  constraintExprData ret;
  llassert(constraintExprData_isDefined(data));

  ret = constraintExprData_allocBinaryOp();
  
  ret->binaryOp.binaryOp = data->binaryOp.binaryOp;
  ret->binaryOp.expr1 = constraintExpr_copy (data->binaryOp.expr1);
  ret->binaryOp.expr2 = constraintExpr_copy (data->binaryOp.expr2);
  return ret;
}

void constraintExprData_freeUnaryExpr (/*@only@*/constraintExprData data)
{
  constraintExpr_free (data->unaryOp.expr);
  free(data);  
}

constraintExprData constraintExprData_copyUnaryExpr(/*@observer@*/ constraintExprData data)
{
 constraintExprData ret;
  llassert(constraintExprData_isDefined(data));

  ret = constraintExprData_allocUnaryOp();
  
  ret->unaryOp.unaryOp = data->unaryOp.unaryOp;
  ret->unaryOp.expr = constraintExpr_copy (data->unaryOp.expr);
  
  return ret;
}

void constraintExprData_freeTerm (/*@only@*/constraintExprData data)
{
  constraintTerm_free (data->term);
  free(data);  
}


constraintExprData constraintExprData_copyTerm (/*@observer@*/ constraintExprData data)
{
 constraintExprData ret;
  llassert(constraintExprData_isDefined(data));

  ret = constraintExprData_allocTerm();

  ret->term = constraintTerm_copy (data->term);
  return ret;
}

constraintExprData constraintExprData_termSetTerm (/*@returned@*/  constraintExprData data,  /*@only@*/constraintTerm term)
{
  llassert (constraintExprData_isDefined(data));

  if (constraintTerm_isDefined(data->term) )
    constraintTerm_free(data->term);

  data->term = term;
  return data;
}



/*@observer@*/ constraintTerm constraintExprData_termGetTerm (/*@observer@*/ constraintExprData data)
{
  llassert (constraintExprData_isDefined(data));
  /*@i22*/return data->term;
}


constraintExprUnaryOpKind constraintExprData_unaryExprGetOp (/*@observer@*/ constraintExprData data)
{
  llassert (constraintExprData_isDefined(data));
  return (data->unaryOp.unaryOp);
}


constraintExpr  constraintExprData_unaryExprGetExpr (/*@observer@*/ constraintExprData data)
{
  llassert (constraintExprData_isDefined (data));
  return (data->unaryOp.expr);
}



constraintExprData constraintExprData_unaryExprSetOp ( /*@returned@*/ constraintExprData data, constraintExprUnaryOpKind op)
{
  llassert (constraintExprData_isDefined (data));
  
  data->unaryOp.unaryOp = op;
  return data;
}

constraintExprData  constraintExprData_unaryExprSetExpr (constraintExprData data, /*@only@*/ constraintExpr expr)
{
  llassert (constraintExprData_isDefined(data));

  if (constraintExpr_isDefined(data->unaryOp.expr) )
    constraintExpr_free(data->unaryOp.expr);
  
  data->unaryOp.expr = expr;
  return data;
}

/*
** binaryExpr stuff
*/

constraintExprBinaryOpKind  constraintExprData_binaryExprGetOp (constraintExprData data)
{
  llassert (constraintExprData_isDefined(data));
  
  return (data->binaryOp.binaryOp);
}


constraintExpr  constraintExprData_binaryExprGetExpr1 (constraintExprData data)
{
  llassert (constraintExprData_isDefined(data));


  return (data->binaryOp.expr1);
}


constraintExpr  constraintExprData_binaryExprGetExpr2 (constraintExprData data)
{
  llassert (constraintExprData_isDefined(data));
  /*@i22*/ return (data->binaryOp.expr2);
}


constraintExprData  constraintExprData_binaryExprSetExpr1 (  /*@returned@*/ constraintExprData data, /*@only@*/ constraintExpr expr)
{
  llassert (constraintExprData_isDefined(data));

  if (constraintExpr_isDefined(data->binaryOp.expr1) )
    constraintExpr_free(data->binaryOp.expr1);
  
  data->binaryOp.expr1 = expr;
  return data;
}

constraintExprData  constraintExprData_binaryExprSetExpr2 (constraintExprData data, constraintExpr expr) 
{
  llassert (constraintExprData_isDefined(data));
  if (constraintExpr_isDefined(data->binaryOp.expr2) )
    constraintExpr_free(data->binaryOp.expr2);

  data->binaryOp.expr2 = expr;
  return data;
}


constraintExprData  constraintExprData_binaryExprSetOp (constraintExprData data, constraintExprBinaryOpKind op)
{
  llassert (constraintExprData_isDefined(data));
  data->binaryOp.binaryOp = op;
  return data;
}

