blob: e171ce54e7e318dcf9a1d1a0e63e7138af1f5628 [file] [log] [blame]
/**
* 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;
}