/**
 * projectM -- Milkdrop-esque visualisation SDK
 * Copyright (C)2003-2004 projectM Team
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * See 'LICENSE.txt' included within this release
 *
 */
/* Library functions to manipulate initial condition values */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "Common.hpp"
#include "fatal.h"

#include "Expr.hpp"
#include "InitCond.hpp"
#include "Param.hpp"
#include <map>

#include "wipemalloc.h"
#include <cassert>
#include <iostream>


char InitCond::init_cond_string_buffer[STRING_BUFFER_SIZE];
int InitCond::init_cond_string_buffer_index = 0;


/* Creates a new initial condition */
InitCond::InitCond( Param * _param, CValue _init_val ):param(_param), init_val(_init_val)
{
  //  std::cerr <<  "InitCond::InitCond: " << this->param->name << std::endl;

  assert(param);
  assert(param->engine_val);
}

/* Frees initial condition structure */
InitCond::~InitCond() {}

void
InitCond::evaluate()
{
  evaluate(false);
}

/* Evaluate an initial conditon */
void
InitCond::evaluate(bool evalUser)
{
  assert(this);
  assert(param);

  if (param->flags & P_FLAG_USERDEF && !evalUser)
    return;

  /* Set matrix flag to zero. This ensures
     its constant value will be used rather than a matrix value
  */
  param->matrix_flag = false;

  /* Parameter is of boolean type, either true/false */

  if (param->type == P_TYPE_BOOL) {

    //        printf( "init_cond: %s = %d (TYPE BOOL)\n", param->name.c_str(), init_val.bool_val);
    //std::cerr << "[InitCond] param is a boolean of with name "
    //  << param->name << std::endl;

    assert(param->engine_val);

    *((bool*)param->engine_val) = init_val.bool_val;

    return;
  }

  /* Parameter is an integer type, just like C */

  if ( param->type == P_TYPE_INT) {
    assert(param->engine_val);
    *((int*)param->engine_val) = init_val.int_val;
    return;
  }

  /* Parameter is of a float type, just like C */

  if (param->type == P_TYPE_DOUBLE) {
    assert(param->engine_val);
    *((float*)param->engine_val) = init_val.float_val;
    return;
  }

  /* Unknown type of parameter */
  return;
}

/* WIP */
void
InitCond::init_cond_to_string()
{
  int   string_length;
  char  string[MAX_TOKEN_SIZE];

  /* Create a string "param_name=val" */
  switch (param->type) {

  case P_TYPE_BOOL:
    sprintf(string, "%s=%d\n", param->name.c_str(), init_val.bool_val);
    break;
  case P_TYPE_INT:
    sprintf(string, "%s=%d\n", param->name.c_str(), init_val.int_val);
    break;
  case P_TYPE_DOUBLE:
    sprintf(string, "%s=%f\n", param->name.c_str(), init_val.float_val);
    break;
  default:
    return;
  }

  /* Compute the length of the string */
  string_length = strlen(string);

  /* Buffer overflow check */
  if ((init_cond_string_buffer_index + string_length + 1)  > (STRING_BUFFER_SIZE - 1))
    return;

  /* Copy the string into the initial condition string buffer */
  strncpy(init_cond_string_buffer + init_cond_string_buffer_index, string, string_length);

  /* Increment the string buffer, offset by one for the null terminator, which will be
     overwritten by the next call to this function */
  init_cond_string_buffer_index+= string_length + 1;
}
