1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 2004 the VideoLAN team
7 * Authors: Cyril Deguet <asmax@videolan.org>
8 * code from projectM http://xmms-projectm.sourceforge.net
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
27 /* Basic Parameter Functions */
34 #include "splaytree_types.h"
35 #include "splaytree.h"
36 #include "tree_types.h"
38 #include "param_types.h"
41 #include "expr_types.h"
44 #include "engine_vars.h"
46 void reset_param(param_t * param);
48 int is_valid_param_string(char * string); /* true if string is valid variable or function name */
51 /* A splay tree of builtin parameters */
52 splaytree_t * builtin_param_tree = NULL;
54 int insert_param_alt_name(param_t * param, char * alt_name);
56 int insert_builtin_param(param_t * param);
58 /* Private function prototypes */
59 int compare_param(char * name, char * name2);
61 int load_builtin_param_double(char * name, void * engine_val, void * matrix, short int flags,
62 double init_val, double upper_bound, double lower_bound, char * alt_name);
64 int load_builtin_param_int(char * name, void * engine_val, short int flags,
65 int init_val, int upper_bound, int lower_bound, char * alt_name);
67 int load_builtin_param_bool(char * name, void * engine_val, short int flags,
68 int init_val, char * alt_name);
72 param_t * create_param (char * name, short int type, short int flags, void * engine_val, void * matrix,
73 value_t default_init_val, value_t upper_bound, value_t lower_bound) {
75 param_t * param = NULL;
77 param = (param_t*)malloc(sizeof(param_t));
80 printf("create_param: out of memory!!!\n");
84 /* Clear name space, think the strncpy statement makes this redundant */
85 //memset(param->name, 0, MAX_TOKEN_SIZE);
87 /* Copy given name into parameter structure */
88 strncpy(param->name, name, MAX_TOKEN_SIZE-1);
90 /* Assign other entries in a constructor like fashion */
93 param->matrix_flag = 0;
94 param->matrix = matrix;
95 param->engine_val = engine_val;
96 param->default_init_val = default_init_val;
97 //*param->init_val = default_init_val;
98 param->upper_bound = upper_bound;
99 param->lower_bound = lower_bound;
101 /* Return instantiated parameter */
106 /* Creates a user defined parameter */
107 param_t * create_user_param(char * name) {
115 /* Set initial values to default */
116 iv.double_val = DEFAULT_DOUBLE_IV;
117 ub.double_val = DEFAULT_DOUBLE_UB;
118 lb.double_val = DEFAULT_DOUBLE_LB;
120 /* Argument checks */
124 /* Allocate space for the engine variable */
125 if ((engine_val = (double*)malloc(sizeof(double))) == NULL)
128 (*engine_val) = iv.double_val; /* set some default init value */
130 /* Create the new user parameter */
131 if ((param = create_param(name, P_TYPE_DOUBLE, P_FLAG_USERDEF, engine_val, NULL, iv, ub, lb)) == NULL) {
135 if (PARAM_DEBUG) printf("create_param: \"%s\" initialized\n", param->name);
136 /* Return the instantiated parameter */
140 /* Initialize the builtin parameter database.
141 Should only be necessary once */
142 int init_builtin_param_db() {
144 /* Create the builtin parameter splay tree (go Sleator...) */
145 if ((builtin_param_tree = create_splaytree(compare_string, copy_string, free_string)) == NULL) {
146 if (PARAM_DEBUG) printf("init_builtin_param_db: failed to initialize database (FATAL)\n");
147 return OUTOFMEM_ERROR;
151 printf("init_builtin_param: loading database...");
155 /* Loads all builtin parameters into the database */
156 if (load_all_builtin_param() < 0) {
157 if (PARAM_DEBUG) printf("failed loading builtin parameters (FATAL)\n");
161 if (PARAM_DEBUG) printf("success!\n");
163 /* Finished, no errors */
167 /* Destroy the builtin parameter database.
168 Generally, do this on projectm exit */
169 int destroy_builtin_param_db() {
171 splay_traverse(free_param, builtin_param_tree);
172 destroy_splaytree(builtin_param_tree);
173 builtin_param_tree = NULL;
179 /* Insert a parameter into the database with an alternate name */
180 int insert_param_alt_name(param_t * param, char * alt_name) {
184 if (alt_name == NULL)
187 splay_insert_link(alt_name, param->name, builtin_param_tree);
193 param_t * find_builtin_param(char * name) {
195 /* Null argument checks */
199 return splay_find(name, builtin_param_tree);
203 /* Find a parameter given its name, will create one if not found */
204 param_t * find_param(char * name, preset_t * preset, int flags) {
206 param_t * param = NULL;
208 /* Null argument checks */
214 /* First look in the builtin database */
215 param = (param_t *)splay_find(name, builtin_param_tree);
217 /* If the search failed, check the user database */
219 param = (param_t*)splay_find(name, preset->user_param_tree);
221 /* If it doesn't exist in the user (or builtin) database and
222 create_flag is set, then make it and insert into the database
225 if ((param == NULL) && (flags & P_CREATE)) {
227 /* Check if string is valid */
228 if (!is_valid_param_string(name)) {
229 if (PARAM_DEBUG) printf("find_param: invalid parameter name:\"%s\"\n", name);
232 /* Now, create the user defined parameter given the passed name */
233 if ((param = create_user_param(name)) == NULL) {
234 if (PARAM_DEBUG) printf("find_param: failed to create a new user parameter!\n");
237 /* Finally, insert the new parameter into this preset's proper splaytree */
238 if (splay_insert(param, param->name, preset->user_param_tree) < 0) {
239 if (PARAM_DEBUG) printf("PARAM \"%s\" already exists in user parameter tree!\n", param->name);
246 /* Return the found (or created) parameter. Note that if P_CREATE is not set, this could be null */
251 /* Compare string name with parameter name */
252 int compare_param(char * name, char * name2) {
255 printf("am i used\n");
256 /* Uses string comparison function */
257 cmpval = strncmp(name, name2, MAX_TOKEN_SIZE-1);
262 /* Loads all builtin parameters, limits are also defined here */
263 int load_all_builtin_param() {
265 load_builtin_param_double("fRating", (void*)&fRating, NULL, P_FLAG_NONE, 0.0 , 5.0, 0.0, NULL);
266 load_builtin_param_double("fWaveScale", (void*)&fWaveScale, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
267 load_builtin_param_double("gamma", (void*)&fGammaAdj, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fGammaAdj");
268 load_builtin_param_double("echo_zoom", (void*)&fVideoEchoZoom, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fVideoEchoZoom");
269 load_builtin_param_double("echo_alpha", (void*)&fVideoEchoAlpha, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fVideoEchoAlpha");
270 load_builtin_param_double("wave_a", (void*)&fWaveAlpha, NULL, P_FLAG_NONE, 0.0, 1.0, 0, "fWaveAlpha");
271 load_builtin_param_double("fWaveSmoothing", (void*)&fWaveSmoothing, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
272 load_builtin_param_double("fModWaveAlphaStart", (void*)&fModWaveAlphaStart, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
273 load_builtin_param_double("fModWaveAlphaEnd", (void*)&fModWaveAlphaEnd, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
274 load_builtin_param_double("fWarpAnimSpeed", (void*)&fWarpAnimSpeed, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
275 // load_builtin_param_double("warp", (void*)&warp, warp_mesh, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
277 load_builtin_param_double("fShader", (void*)&fShader, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
278 load_builtin_param_double("decay", (void*)&decay, NULL, P_FLAG_NONE, 0.0, 1.0, 0, "fDecay");
280 load_builtin_param_int("echo_orient", (void*)&nVideoEchoOrientation, P_FLAG_NONE, 0, 3, 0, "nVideoEchoOrientation");
281 load_builtin_param_int("wave_mode", (void*)&nWaveMode, P_FLAG_NONE, 0, 7, 0, "nWaveMode");
283 load_builtin_param_bool("wave_additive", (void*)&bAdditiveWaves, P_FLAG_NONE, FALSE, "bAdditiveWaves");
284 load_builtin_param_bool("bModWaveAlphaByVolume", (void*)&bModWaveAlphaByVolume, P_FLAG_NONE, FALSE, NULL);
285 load_builtin_param_bool("wave_brighten", (void*)&bMaximizeWaveColor, P_FLAG_NONE, FALSE, "bMaximizeWaveColor");
286 load_builtin_param_bool("wrap", (void*)&bTexWrap, P_FLAG_NONE, FALSE, "bTexWrap");
287 load_builtin_param_bool("darken_center", (void*)&bDarkenCenter, P_FLAG_NONE, FALSE, "bDarkenCenter");
288 load_builtin_param_bool("bRedBlueStereo", (void*)&bRedBlueStereo, P_FLAG_NONE, FALSE, NULL);
289 load_builtin_param_bool("brighten", (void*)&bBrighten, P_FLAG_NONE, FALSE, "bBrighten");
290 load_builtin_param_bool("darken", (void*)&bDarken, P_FLAG_NONE, FALSE, "bDarken");
291 load_builtin_param_bool("solarize", (void*)&bSolarize, P_FLAG_NONE, FALSE, "bSolarize");
292 load_builtin_param_bool("invert", (void*)&bInvert, P_FLAG_NONE, FALSE, "bInvert");
293 load_builtin_param_bool("bMotionVectorsOn", (void*)&bMotionVectorsOn, P_FLAG_NONE, FALSE, NULL);
294 load_builtin_param_bool("wave_dots", (void*)&bWaveDots, P_FLAG_NONE, FALSE, "bWaveDots");
295 load_builtin_param_bool("wave_thick", (void*)&bWaveThick, P_FLAG_NONE, FALSE, "bWaveThick");
299 load_builtin_param_double("zoom", (void*)&zoom, zoom_mesh, P_FLAG_PER_PIXEL |P_FLAG_DONT_FREE_MATRIX, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
300 load_builtin_param_double("rot", (void*)&rot, rot_mesh, P_FLAG_PER_PIXEL |P_FLAG_DONT_FREE_MATRIX, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, NULL);
301 load_builtin_param_double("zoomexp", (void*)&zoomexp, zoomexp_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fZoomExponent");
303 load_builtin_param_double("cx", (void*)&cx, cx_mesh, P_FLAG_PER_PIXEL | P_FLAG_DONT_FREE_MATRIX, 0.0, 1.0, 0, NULL);
304 load_builtin_param_double("cy", (void*)&cy, cy_mesh, P_FLAG_PER_PIXEL | P_FLAG_DONT_FREE_MATRIX, 0.0, 1.0, 0, NULL);
305 load_builtin_param_double("dx", (void*)&dx, dx_mesh, P_FLAG_PER_PIXEL | P_FLAG_DONT_FREE_MATRIX, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, NULL);
306 load_builtin_param_double("dy", (void*)&dy, dy_mesh, P_FLAG_PER_PIXEL |P_FLAG_DONT_FREE_MATRIX, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, NULL);
307 load_builtin_param_double("sx", (void*)&sx, sx_mesh, P_FLAG_PER_PIXEL |P_FLAG_DONT_FREE_MATRIX, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
308 load_builtin_param_double("sy", (void*)&sy, sy_mesh, P_FLAG_PER_PIXEL |P_FLAG_DONT_FREE_MATRIX, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
310 load_builtin_param_double("wave_r", (void*)&wave_r, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
311 load_builtin_param_double("wave_g", (void*)&wave_g, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
312 load_builtin_param_double("wave_b", (void*)&wave_b, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
313 load_builtin_param_double("wave_x", (void*)&wave_x, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
314 load_builtin_param_double("wave_y", (void*)&wave_y, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
315 load_builtin_param_double("wave_mystery", (void*)&wave_mystery, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, "fWaveParam");
317 load_builtin_param_double("ob_size", (void*)&ob_size, NULL, P_FLAG_NONE, 0.0, 0.5, 0, NULL);
318 load_builtin_param_double("ob_r", (void*)&ob_r, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
319 load_builtin_param_double("ob_g", (void*)&ob_g, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
320 load_builtin_param_double("ob_b", (void*)&ob_b, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
321 load_builtin_param_double("ob_a", (void*)&ob_a, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
323 load_builtin_param_double("ib_size", (void*)&ib_size, NULL,P_FLAG_NONE, 0.0, .5, 0.0, NULL);
324 load_builtin_param_double("ib_r", (void*)&ib_r, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
325 load_builtin_param_double("ib_g", (void*)&ib_g, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
326 load_builtin_param_double("ib_b", (void*)&ib_b, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
327 load_builtin_param_double("ib_a", (void*)&ib_a, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
329 load_builtin_param_double("mv_r", (void*)&mv_r, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
330 load_builtin_param_double("mv_g", (void*)&mv_g, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
331 load_builtin_param_double("mv_b", (void*)&mv_b, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
332 load_builtin_param_double("mv_x", (void*)&mv_x, NULL,P_FLAG_NONE, 0.0, 64.0, 0.0, "nMotionVectorsX");
333 load_builtin_param_double("mv_y", (void*)&mv_y, NULL,P_FLAG_NONE, 0.0, 48.0, 0.0, "nMotionVectorsY");
334 load_builtin_param_double("mv_l", (void*)&mv_l, NULL,P_FLAG_NONE, 0.0, 5.0, 0.0, NULL);
335 load_builtin_param_double("mv_dy", (void*)&mv_dy, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
336 load_builtin_param_double("mv_dx", (void*)&mv_dx, NULL,P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
337 load_builtin_param_double("mv_a", (void*)&mv_a, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
339 load_builtin_param_double("time", (void*)&Time, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0.0, NULL);
340 load_builtin_param_double("bass", (void*)&bass, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0.0, NULL);
341 load_builtin_param_double("mid", (void*)&mid, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
342 load_builtin_param_double("bass_att", (void*)&bass_att, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
343 load_builtin_param_double("mid_att", (void*)&mid_att, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
344 load_builtin_param_double("treb_att", (void*)&treb_att, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
345 load_builtin_param_int("frame", (void*)&frame, P_FLAG_READONLY, 0, MAX_INT_SIZE, 0, NULL);
346 load_builtin_param_double("progress", (void*)&progress, NULL,P_FLAG_READONLY, 0.0, 1, 0, NULL);
347 load_builtin_param_int("fps", (void*)&fps, P_FLAG_NONE, 15, MAX_INT_SIZE, 0, NULL);
351 load_builtin_param_double("x", (void*)&x_per_pixel, x_mesh, P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX,
352 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
353 load_builtin_param_double("y", (void*)&y_per_pixel, y_mesh, P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX |P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX,
354 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
355 load_builtin_param_double("ang", (void*)&ang_per_pixel, theta_mesh, P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX,
356 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
357 load_builtin_param_double("rad", (void*)&rad_per_pixel, rad_mesh, P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX,
358 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
361 load_builtin_param_double("q1", (void*)&q1, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
362 load_builtin_param_double("q2", (void*)&q2, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
363 load_builtin_param_double("q3", (void*)&q3, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
364 load_builtin_param_double("q4", (void*)&q4, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
365 load_builtin_param_double("q5", (void*)&q5, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
366 load_builtin_param_double("q6", (void*)&q6, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
367 load_builtin_param_double("q7", (void*)&q7, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
368 load_builtin_param_double("q8", (void*)&q8, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
372 /* variables added in 1.04 */
373 load_builtin_param_int("meshx", (void*)&gx, P_FLAG_READONLY, 32, 96, 8, NULL);
374 load_builtin_param_int("meshy", (void*)&gy, P_FLAG_READONLY, 24, 72, 6, NULL);
380 /* Free's a parameter type */
381 void free_param(param_t * param) {
386 if (param->flags & P_FLAG_USERDEF) {
387 free(param->engine_val);
391 if (!(param->flags & P_FLAG_DONT_FREE_MATRIX)) {
393 if (param->flags & P_FLAG_PER_POINT)
396 else if (param->flags & P_FLAG_PER_PIXEL) {
397 for(x = 0; x < gx; x++)
398 free(((double**)param->matrix)[x]);
403 if (PARAM_DEBUG) printf("free_param: freeing \"%s\".\n", param->name);
408 /* Loads a double parameter into the builtin database */
409 int load_builtin_param_double(char * name, void * engine_val, void * matrix, short int flags,
410 double init_val, double upper_bound, double lower_bound, char * alt_name) {
412 param_t * param = NULL;
415 iv.double_val = init_val;
416 ub.double_val = upper_bound;
417 lb.double_val = lower_bound;
419 /* Create new parameter of type double */
420 if (PARAM_DEBUG == 2) {
421 printf("load_builtin_param_double: (name \"%s\") (alt_name = \"%s\") ", name, alt_name);
425 if ((param = create_param(name, P_TYPE_DOUBLE, flags, engine_val, matrix, iv, ub, lb)) == NULL) {
426 return OUTOFMEM_ERROR;
429 if (PARAM_DEBUG == 2) {
430 printf("created...");
434 /* Insert the paremeter into the database */
436 if (insert_builtin_param(param) < 0) {
441 if (PARAM_DEBUG == 2) {
442 printf("inserted...");
446 /* If this parameter has an alternate name, insert it into the database as link */
448 if (alt_name != NULL) {
449 insert_param_alt_name(param, alt_name);
451 if (PARAM_DEBUG == 2) {
452 printf("alt_name inserted...");
459 if (PARAM_DEBUG == 2) printf("finished\n");
460 /* Finished, return success */
466 /* Loads a double parameter into the builtin database */
467 param_t * new_param_double(char * name, short int flags, void * engine_val, void * matrix,
468 double upper_bound, double lower_bound, double init_val) {
473 iv.double_val = init_val;
474 ub.double_val = upper_bound;
475 lb.double_val = lower_bound;
477 if ((param = create_param(name, P_TYPE_DOUBLE, flags, engine_val, matrix,iv, ub, lb)) == NULL)
481 /* Finished, return success */
486 /* Creates a new parameter of type int */
487 param_t * new_param_int(char * name, short int flags, void * engine_val,
488 int upper_bound, int lower_bound, int init_val) {
493 iv.int_val = init_val;
494 ub.int_val = upper_bound;
495 lb.int_val = lower_bound;
497 if ((param = create_param(name, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb)) == NULL)
501 /* Finished, return success */
505 /* Creates a new parameter of type bool */
506 param_t * new_param_bool(char * name, short int flags, void * engine_val,
507 int upper_bound, int lower_bound, int init_val) {
512 iv.bool_val = init_val;
513 ub.bool_val = upper_bound;
514 lb.bool_val = lower_bound;
516 if ((param = create_param(name, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb)) == NULL)
520 /* Finished, return success */
525 /* Loads a integer parameter into the builtin database */
526 int load_builtin_param_int(char * name, void * engine_val, short int flags,
527 int init_val, int upper_bound, int lower_bound, char * alt_name) {
532 iv.int_val = init_val;
533 ub.int_val = upper_bound;
534 lb.int_val = lower_bound;
536 param = create_param(name, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb);
539 return OUTOFMEM_ERROR;
542 if (insert_builtin_param(param) < 0) {
547 if (alt_name != NULL) {
548 insert_param_alt_name(param, alt_name);
555 /* Loads a boolean parameter */
556 int load_builtin_param_bool(char * name, void * engine_val, short int flags,
557 int init_val, char * alt_name) {
562 iv.int_val = init_val;
566 param = create_param(name, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb);
569 return OUTOFMEM_ERROR;
572 if (insert_builtin_param(param) < 0) {
577 if (alt_name != NULL) {
578 insert_param_alt_name(param, alt_name);
588 /* Returns nonzero if the string is valid parameter name */
589 int is_valid_param_string(char * string) {
594 /* This ensures the first character is non numeric */
595 if( ((*string) >= 48) && ((*string) <= 57))
598 /* These probably should never happen */
608 /* Could also add checks for other symbols. May do later */
614 /* Inserts a parameter into the builtin database */
615 int insert_builtin_param(param_t * param) {
620 return splay_insert(param, param->name, builtin_param_tree);
623 /* Inserts a parameter into the builtin database */
624 int insert_param(param_t * param, splaytree_t * database) {
628 if (database == NULL)
631 return splay_insert(param, param->name, database);
635 /* Sets the parameter engine value to value val.
636 clipping occurs if necessary */
637 void set_param(param_t * param, double val) {
639 switch (param->type) {
643 *((int*)param->engine_val) = 0;
645 *((int*)param->engine_val) = 1;
647 *((int*)param->engine_val) = 0;
650 /* Make sure value is an integer */
652 if (val < param->lower_bound.int_val)
653 *((int*)param->engine_val) = param->lower_bound.int_val;
654 else if (val > param->upper_bound.int_val)
655 *((int*)param->engine_val) = param->upper_bound.int_val;
657 *((int*)param->engine_val) = val;
660 /* Make sure value is an integer */
663 if (val < param->lower_bound.double_val)
664 *((double*)param->engine_val) = param->lower_bound.double_val;
665 else if (val > param->upper_bound.double_val)
666 *((double*)param->engine_val) = param->upper_bound.double_val;
668 *((double*)param->engine_val) = val;
681 /* Search for parameter 'name' in 'database', if create_flag is true, then generate the parameter
682 and insert it into 'database' */
683 param_t * find_param_db(char * name, splaytree_t * database, int create_flag) {
685 param_t * param = NULL;
687 /* Null argument checks */
690 if (database == NULL)
693 /* First look in the builtin database */
694 param = (param_t *)splay_find(name, database);
697 if (((param = (param_t *)splay_find(name, database)) == NULL) && (create_flag == TRUE)) {
699 /* Check if string is valid */
700 if (!is_valid_param_string(name))
703 /* Now, create the user defined parameter given the passed name */
704 if ((param = create_user_param(name)) == NULL)
707 /* Finally, insert the new parameter into this preset's proper splaytree */
708 if (splay_insert(param, param->name, database) < 0) {
715 /* Return the found (or created) parameter. Note that this could be null */