148 lines
3.8 KiB
C++
148 lines
3.8 KiB
C++
|
/**
|
||
|
* 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;
|
||
|
}
|
||
|
|