]> git.sesse.net Git - vlc/blob - modules/visualization/galaktos/param.c
Removes trailing spaces. Removes tabs.
[vlc] / modules / visualization / galaktos / param.c
1 /*****************************************************************************
2  * param.c:
3  *****************************************************************************
4  * Copyright (C) 2004 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Cyril Deguet <asmax@videolan.org>
8  *          code from projectM http://xmms-projectm.sourceforge.net
9  *
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.
14  *
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.
19  *
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  *****************************************************************************/
24
25
26
27 /* Basic Parameter Functions */
28
29 #include <stdio.h>
30
31 #include <math.h>
32 #include "fatal.h"
33 #include "common.h"
34
35 #include "splaytree_types.h"
36 #include "splaytree.h"
37 #include "tree_types.h"
38
39 #include "param_types.h"
40 #include "param.h"
41
42 #include "expr_types.h"
43 #include "eval.h"
44
45 #include "engine_vars.h"
46
47 void reset_param(param_t * param);
48
49 int is_valid_param_string(char * string); /* true if string is valid variable or function name */
50
51
52 /* A splay tree of builtin parameters */
53 splaytree_t * builtin_param_tree = NULL;
54
55 int insert_param_alt_name(param_t * param, char * alt_name);
56
57 int insert_builtin_param(param_t * param);
58
59 /* Private function prototypes */
60 int compare_param(char * name, char * name2);
61
62 int load_builtin_param_double(char * name, void * engine_val, void * matrix, short int flags,
63                                 double init_val, double upper_bound, double lower_bound, char * alt_name);
64
65 int load_builtin_param_int(char * name, void * engine_val, short int flags,
66                                 int init_val, int upper_bound, int lower_bound, char * alt_name);
67                                 
68 int load_builtin_param_bool(char * name, void * engine_val, short int flags,
69                                 int init_val, char * alt_name);
70                                 
71                                 
72                                 
73 param_t * create_param (char * name, short int type, short int flags, void * engine_val, void * matrix,
74                             value_t default_init_val, value_t upper_bound, value_t lower_bound) {
75
76   param_t * param = NULL;
77
78   param = (param_t*)malloc(sizeof(param_t));
79  
80   if (param == NULL) {
81     printf("create_param: out of memory!!!\n");
82     return NULL;
83   }
84  
85   /* Clear name space, think the strncpy statement makes this redundant */
86   //memset(param->name, 0, MAX_TOKEN_SIZE);
87
88   /* Copy given name into parameter structure */
89   strncpy(param->name, name, MAX_TOKEN_SIZE-1);
90  
91   /* Assign other entries in a constructor like fashion */
92   param->type = type;
93   param->flags = flags;
94   param->matrix_flag = 0;
95   param->matrix = matrix;
96   param->engine_val = engine_val;
97   param->default_init_val = default_init_val;
98   //*param->init_val = default_init_val;
99   param->upper_bound = upper_bound;
100   param->lower_bound = lower_bound;
101  
102   /* Return instantiated parameter */
103   return param;
104
105 }
106
107 /* Creates a user defined parameter */
108 param_t * create_user_param(char * name) {
109
110   param_t * param;
111   value_t iv;
112   value_t ub;
113   value_t lb;
114   double * engine_val;
115  
116   /* Set initial values to default */
117   iv.double_val = DEFAULT_DOUBLE_IV;
118   ub.double_val = DEFAULT_DOUBLE_UB;
119   lb.double_val = DEFAULT_DOUBLE_LB;
120
121   /* Argument checks */
122   if (name == NULL)
123     return NULL;
124
125   /* Allocate space for the engine variable */
126   if ((engine_val = (double*)malloc(sizeof(double))) == NULL)
127     return NULL;
128
129   (*engine_val) = iv.double_val; /* set some default init value */
130  
131   /* Create the new user parameter */
132   if ((param = create_param(name, P_TYPE_DOUBLE, P_FLAG_USERDEF, engine_val, NULL, iv, ub, lb)) == NULL) {
133     free(engine_val);
134     return NULL;
135   }
136   if (PARAM_DEBUG) printf("create_param: \"%s\" initialized\n", param->name);
137   /* Return the instantiated parameter */
138   return param;
139 }
140
141 /* Initialize the builtin parameter database.
142    Should only be necessary once */
143 int init_builtin_param_db() {
144     
145   /* Create the builtin parameter splay tree (go Sleator...) */
146   if ((builtin_param_tree = create_splaytree(compare_string, copy_string, free_string)) == NULL) {
147       if (PARAM_DEBUG) printf("init_builtin_param_db: failed to initialize database (FATAL)\n");
148       return OUTOFMEM_ERROR;
149   }
150
151   if (PARAM_DEBUG) {
152       printf("init_builtin_param: loading database...");
153       fflush(stdout);
154   }
155  
156   /* Loads all builtin parameters into the database */
157   if (load_all_builtin_param() < 0) {
158     if (PARAM_DEBUG) printf("failed loading builtin parameters (FATAL)\n");
159     return ERROR;
160   }
161  
162   if (PARAM_DEBUG) printf("success!\n");
163     
164   /* Finished, no errors */
165   return SUCCESS;
166 }
167
168 /* Destroy the builtin parameter database.
169    Generally, do this on projectm exit */
170 int destroy_builtin_param_db() {
171  
172   splay_traverse(free_param, builtin_param_tree);
173   destroy_splaytree(builtin_param_tree);
174   builtin_param_tree = NULL;
175   return SUCCESS;    
176
177 }
178
179
180 /* Insert a parameter into the database with an alternate name */
181 int insert_param_alt_name(param_t * param, char * alt_name) {
182  
183   if (param == NULL)
184     return ERROR;
185   if (alt_name == NULL)
186       return ERROR;
187       
188   splay_insert_link(alt_name, param->name, builtin_param_tree);
189
190   return SUCCESS;
191 }
192
193
194 param_t * find_builtin_param(char * name) {
195
196   /* Null argument checks */
197   if (name == NULL)
198       return NULL;
199  
200   return splay_find(name, builtin_param_tree);
201
202 }
203
204 /* Find a parameter given its name, will create one if not found */
205 param_t * find_param(char * name, preset_t * preset, int flags) {
206
207   param_t * param = NULL;
208
209   /* Null argument checks */
210   if (name == NULL)
211       return NULL;
212   if (preset == NULL)
213       return NULL;
214  
215   /* First look in the builtin database */
216   param = (param_t *)splay_find(name, builtin_param_tree);
217
218   /* If the search failed, check the user database */
219   if (param == NULL) {
220     param = (param_t*)splay_find(name, preset->user_param_tree);
221   }
222   /* If it doesn't exist in the user (or builtin) database and
223         create_flag is set, then make it and insert into the database
224   */
225  
226   if ((param == NULL) && (flags & P_CREATE)) {
227     
228     /* Check if string is valid */
229     if (!is_valid_param_string(name)) {
230       if (PARAM_DEBUG) printf("find_param: invalid parameter name:\"%s\"\n", name);
231       return NULL;
232     }
233     /* Now, create the user defined parameter given the passed name */
234     if ((param = create_user_param(name)) == NULL) {
235       if (PARAM_DEBUG) printf("find_param: failed to create a new user parameter!\n");
236       return NULL;
237     }
238     /* Finally, insert the new parameter into this preset's proper splaytree */
239     if (splay_insert(param, param->name, preset->user_param_tree) < 0) {
240       if (PARAM_DEBUG) printf("PARAM \"%s\" already exists in user parameter tree!\n", param->name);
241       free_param(param);
242       return NULL;
243     }    
244  
245   }    
246  
247   /* Return the found (or created) parameter. Note that if P_CREATE is not set, this could be null */
248   return param;
249  
250 }
251
252 /* Compare string name with parameter name */
253 int compare_param(char * name, char * name2) {
254
255   int cmpval;
256   printf("am i used\n");
257   /* Uses string comparison function */
258   cmpval = strncmp(name, name2, MAX_TOKEN_SIZE-1);
259  
260   return cmpval;
261 }
262
263 /* Loads all builtin parameters, limits are also defined here */
264 int load_all_builtin_param() {
265
266   load_builtin_param_double("fRating", (void*)&fRating, NULL, P_FLAG_NONE, 0.0 , 5.0, 0.0, NULL);
267   load_builtin_param_double("fWaveScale", (void*)&fWaveScale, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
268   load_builtin_param_double("gamma", (void*)&fGammaAdj, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fGammaAdj");
269   load_builtin_param_double("echo_zoom", (void*)&fVideoEchoZoom, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fVideoEchoZoom");
270   load_builtin_param_double("echo_alpha", (void*)&fVideoEchoAlpha, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fVideoEchoAlpha");
271   load_builtin_param_double("wave_a", (void*)&fWaveAlpha, NULL, P_FLAG_NONE, 0.0, 1.0, 0, "fWaveAlpha");
272   load_builtin_param_double("fWaveSmoothing", (void*)&fWaveSmoothing, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
273   load_builtin_param_double("fModWaveAlphaStart", (void*)&fModWaveAlphaStart, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
274   load_builtin_param_double("fModWaveAlphaEnd", (void*)&fModWaveAlphaEnd, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
275   load_builtin_param_double("fWarpAnimSpeed",  (void*)&fWarpAnimSpeed, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
276   //  load_builtin_param_double("warp", (void*)&warp, warp_mesh, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
277     
278   load_builtin_param_double("fShader", (void*)&fShader, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
279   load_builtin_param_double("decay", (void*)&decay, NULL, P_FLAG_NONE, 0.0, 1.0, 0, "fDecay");
280
281   load_builtin_param_int("echo_orient", (void*)&nVideoEchoOrientation, P_FLAG_NONE, 0, 3, 0, "nVideoEchoOrientation");
282   load_builtin_param_int("wave_mode", (void*)&nWaveMode, P_FLAG_NONE, 0, 7, 0, "nWaveMode");
283  
284   load_builtin_param_bool("wave_additive", (void*)&bAdditiveWaves, P_FLAG_NONE, FALSE, "bAdditiveWaves");
285   load_builtin_param_bool("bModWaveAlphaByVolume", (void*)&bModWaveAlphaByVolume, P_FLAG_NONE, FALSE, NULL);
286   load_builtin_param_bool("wave_brighten", (void*)&bMaximizeWaveColor, P_FLAG_NONE, FALSE, "bMaximizeWaveColor");
287   load_builtin_param_bool("wrap", (void*)&bTexWrap, P_FLAG_NONE, FALSE, "bTexWrap");
288   load_builtin_param_bool("darken_center", (void*)&bDarkenCenter, P_FLAG_NONE, FALSE, "bDarkenCenter");
289   load_builtin_param_bool("bRedBlueStereo", (void*)&bRedBlueStereo, P_FLAG_NONE, FALSE, NULL);
290   load_builtin_param_bool("brighten", (void*)&bBrighten, P_FLAG_NONE, FALSE, "bBrighten");
291   load_builtin_param_bool("darken", (void*)&bDarken, P_FLAG_NONE, FALSE, "bDarken");
292   load_builtin_param_bool("solarize", (void*)&bSolarize, P_FLAG_NONE, FALSE, "bSolarize");
293   load_builtin_param_bool("invert", (void*)&bInvert, P_FLAG_NONE, FALSE, "bInvert");
294   load_builtin_param_bool("bMotionVectorsOn", (void*)&bMotionVectorsOn, P_FLAG_NONE, FALSE, NULL);
295   load_builtin_param_bool("wave_dots", (void*)&bWaveDots, P_FLAG_NONE, FALSE, "bWaveDots");
296   load_builtin_param_bool("wave_thick", (void*)&bWaveThick, P_FLAG_NONE, FALSE, "bWaveThick");
297  
298  
299  
300   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);
301   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);
302   load_builtin_param_double("zoomexp", (void*)&zoomexp, zoomexp_mesh,  P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fZoomExponent");
303  
304   load_builtin_param_double("cx", (void*)&cx, cx_mesh, P_FLAG_PER_PIXEL | P_FLAG_DONT_FREE_MATRIX, 0.0, 1.0, 0, NULL);
305   load_builtin_param_double("cy", (void*)&cy, cy_mesh, P_FLAG_PER_PIXEL | P_FLAG_DONT_FREE_MATRIX, 0.0, 1.0, 0, NULL);
306   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);
307   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);
308   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);
309   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
311   load_builtin_param_double("wave_r", (void*)&wave_r, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
312   load_builtin_param_double("wave_g", (void*)&wave_g, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
313   load_builtin_param_double("wave_b", (void*)&wave_b, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
314   load_builtin_param_double("wave_x", (void*)&wave_x, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
315   load_builtin_param_double("wave_y", (void*)&wave_y, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
316   load_builtin_param_double("wave_mystery", (void*)&wave_mystery, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, "fWaveParam");
317  
318   load_builtin_param_double("ob_size", (void*)&ob_size, NULL, P_FLAG_NONE, 0.0, 0.5, 0, NULL);
319   load_builtin_param_double("ob_r", (void*)&ob_r, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
320   load_builtin_param_double("ob_g", (void*)&ob_g, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
321   load_builtin_param_double("ob_b", (void*)&ob_b, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
322   load_builtin_param_double("ob_a", (void*)&ob_a, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
323
324   load_builtin_param_double("ib_size", (void*)&ib_size,  NULL,P_FLAG_NONE, 0.0, .5, 0.0, NULL);
325   load_builtin_param_double("ib_r", (void*)&ib_r,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
326   load_builtin_param_double("ib_g", (void*)&ib_g,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
327   load_builtin_param_double("ib_b", (void*)&ib_b,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
328   load_builtin_param_double("ib_a", (void*)&ib_a,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
329
330   load_builtin_param_double("mv_r", (void*)&mv_r,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
331   load_builtin_param_double("mv_g", (void*)&mv_g,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
332   load_builtin_param_double("mv_b", (void*)&mv_b,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
333   load_builtin_param_double("mv_x", (void*)&mv_x,  NULL,P_FLAG_NONE, 0.0, 64.0, 0.0, "nMotionVectorsX");
334   load_builtin_param_double("mv_y", (void*)&mv_y,  NULL,P_FLAG_NONE, 0.0, 48.0, 0.0, "nMotionVectorsY");
335   load_builtin_param_double("mv_l", (void*)&mv_l,  NULL,P_FLAG_NONE, 0.0, 5.0, 0.0, NULL);
336   load_builtin_param_double("mv_dy", (void*)&mv_dy, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
337   load_builtin_param_double("mv_dx", (void*)&mv_dx,  NULL,P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
338   load_builtin_param_double("mv_a", (void*)&mv_a,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
339
340   load_builtin_param_double("time", (void*)&Time,  NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0.0, NULL);
341   load_builtin_param_double("bass", (void*)&bass,  NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0.0, NULL);
342   load_builtin_param_double("mid", (void*)&mid,  NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
343   load_builtin_param_double("bass_att", (void*)&bass_att,  NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
344   load_builtin_param_double("mid_att", (void*)&mid_att,  NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
345   load_builtin_param_double("treb_att", (void*)&treb_att,  NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
346   load_builtin_param_int("frame", (void*)&frame, P_FLAG_READONLY, 0, MAX_INT_SIZE, 0, NULL);
347   load_builtin_param_double("progress", (void*)&progress,  NULL,P_FLAG_READONLY, 0.0, 1, 0, NULL);
348   load_builtin_param_int("fps", (void*)&fps, P_FLAG_NONE, 15, MAX_INT_SIZE, 0, NULL);
349
350
351
352   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,
353                 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
354   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,
355                 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
356   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,
357                 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
358   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,
359                 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
360
361
362   load_builtin_param_double("q1", (void*)&q1,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
363   load_builtin_param_double("q2", (void*)&q2,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
364   load_builtin_param_double("q3", (void*)&q3,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
365   load_builtin_param_double("q4", (void*)&q4,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
366   load_builtin_param_double("q5", (void*)&q5,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
367   load_builtin_param_double("q6", (void*)&q6,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
368   load_builtin_param_double("q7", (void*)&q7,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
369   load_builtin_param_double("q8", (void*)&q8,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
370
371
372
373   /* variables added in 1.04 */
374   load_builtin_param_int("meshx", (void*)&gx, P_FLAG_READONLY, 32, 96, 8, NULL);
375   load_builtin_param_int("meshy", (void*)&gy, P_FLAG_READONLY, 24, 72, 6, NULL);
376
377   return SUCCESS;
378  
379 }
380
381 /* Free's a parameter type */
382 void free_param(param_t * param) {
383   int x;
384   if (param == NULL)
385     return;
386  
387   if (param->flags & P_FLAG_USERDEF) {
388     free(param->engine_val);
389
390   }
391
392   if (!(param->flags & P_FLAG_DONT_FREE_MATRIX)) {
393
394     if (param->flags & P_FLAG_PER_POINT)
395       free(param->matrix);
396
397     else if (param->flags & P_FLAG_PER_PIXEL) {
398        for(x = 0; x < gx; x++)
399        free(((double**)param->matrix)[x]);
400        free(param->matrix);
401       }
402   }
403
404   if (PARAM_DEBUG) printf("free_param: freeing \"%s\".\n", param->name);
405   free(param);
406
407 }
408
409 /* Loads a double parameter into the builtin database */
410 int load_builtin_param_double(char * name, void * engine_val, void * matrix, short int flags,
411                         double init_val, double upper_bound, double lower_bound, char * alt_name) {
412
413   param_t * param = NULL;
414   value_t iv, ub, lb;
415
416   iv.double_val = init_val;
417   ub.double_val = upper_bound;
418   lb.double_val = lower_bound;
419                             
420   /* Create new parameter of type double */
421   if (PARAM_DEBUG == 2) {
422       printf("load_builtin_param_double: (name \"%s\") (alt_name = \"%s\") ", name, alt_name);
423       fflush(stdout);
424   }
425  
426  if ((param = create_param(name, P_TYPE_DOUBLE, flags, engine_val, matrix, iv, ub, lb)) == NULL) {
427     return OUTOFMEM_ERROR;
428   }
429  
430   if (PARAM_DEBUG == 2) {
431     printf("created...");
432     fflush(stdout);
433    }    
434  
435   /* Insert the paremeter into the database */
436
437   if (insert_builtin_param(param) < 0) {
438     free_param(param);
439     return ERROR;
440   }
441
442   if (PARAM_DEBUG == 2) {
443       printf("inserted...");
444       fflush(stdout);
445   }
446  
447   /* If this parameter has an alternate name, insert it into the database as link */
448  
449   if (alt_name != NULL) {
450     insert_param_alt_name(param, alt_name);
451
452   if (PARAM_DEBUG == 2) {
453       printf("alt_name inserted...");
454       fflush(stdout);
455       }
456  
457     
458   }      
459
460   if (PARAM_DEBUG == 2) printf("finished\n");    
461   /* Finished, return success */
462   return SUCCESS;
463 }
464
465
466
467 /* Loads a double parameter into the builtin database */
468 param_t * new_param_double(char * name, short int flags, void * engine_val, void * matrix,
469                         double upper_bound, double lower_bound, double init_val) {
470
471   param_t * param;
472   value_t iv, ub, lb;
473
474   iv.double_val = init_val;
475   ub.double_val = upper_bound;
476   lb.double_val = lower_bound;
477                              
478   if ((param = create_param(name, P_TYPE_DOUBLE, flags, engine_val, matrix,iv, ub, lb)) == NULL)
479     return NULL;
480  
481  
482   /* Finished, return success */
483   return param;
484 }
485
486
487 /* Creates a new parameter of type int */
488 param_t * new_param_int(char * name, short int flags, void * engine_val,
489                         int upper_bound, int lower_bound, int init_val) {
490
491   param_t * param;
492   value_t iv, ub, lb;
493
494   iv.int_val = init_val;
495   ub.int_val = upper_bound;
496   lb.int_val = lower_bound;
497                             
498   if ((param = create_param(name, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb)) == NULL)
499     return NULL;
500  
501  
502   /* Finished, return success */
503   return param;
504 }
505
506 /* Creates a new parameter of type bool */
507 param_t * new_param_bool(char * name, short int flags, void * engine_val,
508                         int upper_bound, int lower_bound, int init_val) {
509
510   param_t * param;
511   value_t iv, ub, lb;
512
513   iv.bool_val = init_val;
514   ub.bool_val = upper_bound;
515   lb.bool_val = lower_bound;
516                             
517   if ((param = create_param(name, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb)) == NULL)
518     return NULL;
519  
520  
521   /* Finished, return success */
522   return param;
523 }
524
525
526 /* Loads a integer parameter into the builtin database */
527 int load_builtin_param_int(char * name, void * engine_val, short int flags,
528                         int init_val, int upper_bound, int lower_bound, char * alt_name) {
529
530   param_t * param;
531   value_t iv, ub, lb;
532
533   iv.int_val = init_val;
534   ub.int_val = upper_bound;
535   lb.int_val = lower_bound;    
536                             
537   param = create_param(name, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb);
538
539   if (param == NULL) {
540     return OUTOFMEM_ERROR;
541   }
542
543   if (insert_builtin_param(param) < 0) {
544     free_param(param);
545     return ERROR;
546   }
547  
548   if (alt_name != NULL) {
549     insert_param_alt_name(param, alt_name);      
550   }
551  
552   return SUCCESS;
553
554 }                            
555                             
556 /* Loads a boolean parameter */
557 int load_builtin_param_bool(char * name, void * engine_val, short int flags,
558                                 int init_val, char * alt_name) {
559
560   param_t * param;
561   value_t iv, ub, lb;
562
563   iv.int_val = init_val;
564   ub.int_val = TRUE;
565   lb.int_val = FALSE;    
566                                                                 
567   param = create_param(name, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb);
568
569   if (param == NULL) {
570     return OUTOFMEM_ERROR;
571   }
572
573   if (insert_builtin_param(param) < 0) {
574     free_param(param);
575     return ERROR;
576   }
577  
578   if (alt_name != NULL) {
579     insert_param_alt_name(param, alt_name);      
580   }
581  
582   return SUCCESS;
583
584 }
585
586
587     
588
589 /* Returns nonzero if the string is valid parameter name */
590 int is_valid_param_string(char * string) {
591  
592   if (string == NULL)
593     return FALSE;
594  
595   /* This ensures the first character is non numeric */
596   if( ((*string) >= 48) && ((*string) <= 57))
597     return FALSE;
598
599   /* These probably should never happen */
600   if (*string == '.')
601     return FALSE;
602  
603   if (*string == '+')
604     return FALSE;
605  
606   if (*string == '-')
607     return FALSE;
608  
609   /* Could also add checks for other symbols. May do later */
610  
611   return TRUE;
612  
613 }
614
615 /* Inserts a parameter into the builtin database */
616 int insert_builtin_param(param_t * param) {
617
618     if (param == NULL)
619         return FAILURE;
620     
621     return splay_insert(param, param->name, builtin_param_tree);    
622 }
623
624 /* Inserts a parameter into the builtin database */
625 int insert_param(param_t * param, splaytree_t * database) {
626
627     if (param == NULL)
628       return FAILURE;
629     if (database == NULL)
630       return FAILURE;
631
632     return splay_insert(param, param->name, database);    
633 }
634
635
636 /* Sets the parameter engine value to value val.
637     clipping occurs if necessary */
638 void set_param(param_t * param, double val) {
639
640     switch (param->type) {
641         
642     case P_TYPE_BOOL:
643         if (val < 0)
644             *((int*)param->engine_val) = 0;
645         else if (val > 0)
646             *((int*)param->engine_val) = 1;
647         else
648             *((int*)param->engine_val) = 0;
649         break;
650     case P_TYPE_INT:
651         /* Make sure value is an integer */
652         val = floor(val);
653         if (val < param->lower_bound.int_val)
654                 *((int*)param->engine_val) = param->lower_bound.int_val;
655         else if (val > param->upper_bound.int_val)
656                 *((int*)param->engine_val) = param->upper_bound.int_val;
657         else
658                 *((int*)param->engine_val) = val;
659         break;
660     case P_TYPE_DOUBLE:
661       /* Make sure value is an integer */    
662
663     
664       if (val < param->lower_bound.double_val)
665         *((double*)param->engine_val) = param->lower_bound.double_val;    
666       else if (val > param->upper_bound.double_val)
667         *((double*)param->engine_val) = param->upper_bound.double_val;
668       else
669         *((double*)param->engine_val) = val;
670       break;
671     default:
672       break;
673
674     }
675     
676     return;
677 }
678
679
680
681
682 /* Search for parameter 'name' in 'database', if create_flag is true, then generate the parameter
683    and insert it into 'database' */
684 param_t * find_param_db(char * name, splaytree_t * database, int create_flag) {
685
686   param_t * param = NULL;
687
688   /* Null argument checks */
689   if (name == NULL)
690     return NULL;
691   if (database == NULL)
692     return NULL;
693  
694   /* First look in the builtin database */
695   param = (param_t *)splay_find(name, database);
696
697  
698   if (((param = (param_t *)splay_find(name, database)) == NULL) && (create_flag == TRUE)) {
699     
700     /* Check if string is valid */
701     if (!is_valid_param_string(name))
702         return NULL;
703     
704     /* Now, create the user defined parameter given the passed name */
705     if ((param = create_user_param(name)) == NULL)
706         return NULL;
707     
708     /* Finally, insert the new parameter into this preset's proper splaytree */
709     if (splay_insert(param, param->name, database) < 0) {
710         free_param(param);
711         return NULL;
712     }    
713     
714   }    
715  
716   /* Return the found (or created) parameter. Note that this could be null */
717   return param;
718
719 }
720