mirror of
https://github.com/clementine-player/Clementine
synced 2025-01-21 14:16:03 +01:00
d7966c8285
When using rpmbuild on Fedora 33, the build fails with: error: ‘__builtin_strncpy’ specified bound depends on the length of the source argument [-Werror=stringop-overflow=] This was fixed as part of projectm change d4d74f6d. This change takes the relevant parts of that commit. Note that the projectm commit contains several other warning fixes that might affect Clementine builds in the future.
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 */
|
|
memcpy(init_cond_string_buffer + init_cond_string_buffer_index, string, string_length + 1);
|
|
|
|
/* 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;
|
|
}
|
|
|