init_cond.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:5k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * init_cond.:
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 VideoLAN
  5.  * $Id: init_cond.c 8205 2004-07-17 13:55:48Z asmax $
  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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. /* Library functions to manipulate initial condition values */
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include "common.h"
  29. #include "fatal.h"
  30. #include "param_types.h"
  31. #include "expr_types.h"
  32. #include "init_cond_types.h"
  33. #include "init_cond.h"
  34. #include "splaytree_types.h"
  35. #include "splaytree.h"
  36. char init_cond_string_buffer[STRING_BUFFER_SIZE];
  37. int init_cond_string_buffer_index = 0;
  38. void init_cond_to_string(init_cond_t * init_cond);
  39. /* Frees initial condition structure */
  40. void free_init_cond(init_cond_t * init_cond) {
  41.   free(init_cond);
  42. }
  43. /* Evaluate an initial conditon */
  44. void eval_init_cond(init_cond_t * init_cond) {
  45.   if (init_cond == NULL)
  46.     return;
  47.  
  48.   /* Parameter is of boolean type, either a 1 or 0 value integer */
  49.   /* Set matrix flag to zero. This ensures
  50.      its constant value will be used rather than a matrix value 
  51.   */
  52.   init_cond->param->matrix_flag = 0;
  53.   if (init_cond->param->type == P_TYPE_BOOL) {
  54.  if (INIT_COND_DEBUG) printf("init_cond: %s = %d (TYPE BOOL)n", init_cond->param->name, init_cond->init_val.bool_val); 
  55.  *((int*)init_cond->param->engine_val) = init_cond->init_val.bool_val;
  56.      return;
  57.   }
  58.   
  59.   /* Parameter is an integer type, just like C */
  60.   
  61.   if (init_cond->param->type == P_TYPE_INT) {
  62.  if (INIT_COND_DEBUG) printf("init_cond: %s = %d (TYPE INT)n", init_cond->param->name, init_cond->init_val.int_val);
  63.  *((int*)init_cond->param->engine_val) = init_cond->init_val.int_val;
  64.      return;
  65.   }
  66.   /* Parameter is of a double type, just like C */
  67.   if (init_cond->param->type == P_TYPE_DOUBLE) {
  68. if (INIT_COND_DEBUG) printf("init_cond: %s = %f (TYPE DOUBLE)n", init_cond->param->name, init_cond->init_val.double_val);
  69. *((double*)init_cond->param->engine_val) = init_cond->init_val.double_val;
  70.     return;
  71.   }
  72.   /* Unknown type of parameter */
  73.   return;
  74. }
  75. /* Creates a new initial condition */
  76. init_cond_t * new_init_cond(param_t * param, value_t init_val) {
  77.   init_cond_t * init_cond;
  78.   init_cond = (init_cond_t*)malloc(sizeof(init_cond_t));
  79.    
  80.   if (init_cond == NULL)
  81.     return NULL;
  82.  
  83.   init_cond->param = param;
  84.   init_cond->init_val = init_val;
  85.   return init_cond;
  86. }
  87. /* WIP */
  88. void init_cond_to_string(init_cond_t * init_cond) {
  89. int string_length;
  90. char string[MAX_TOKEN_SIZE];
  91. if (init_cond == NULL)
  92. return;
  93. /* Create a string "param_name=val" */
  94. switch (init_cond->param->type) {
  95. case P_TYPE_BOOL:
  96. sprintf(string, "%s=%dn", init_cond->param->name, init_cond->init_val.bool_val);
  97. break; 
  98. case P_TYPE_INT:
  99. sprintf(string, "%s=%dn", init_cond->param->name, init_cond->init_val.int_val);
  100. break;
  101. case P_TYPE_DOUBLE:
  102. sprintf(string, "%s=%fn", init_cond->param->name, init_cond->init_val.double_val);
  103. break;
  104. default:
  105. return;
  106. }
  107. /* Compute the length of the string */
  108. string_length = strlen(string);
  109. /* Buffer overflow check */
  110. if ((init_cond_string_buffer_index + string_length + 1)  > (STRING_BUFFER_SIZE - 1))
  111. return;
  112. /* Copy the string into the initial condition string buffer */
  113. strncpy(init_cond_string_buffer + init_cond_string_buffer_index, string, string_length);
  114. /* Increment the string buffer, offset by one for the null terminator, which will be
  115.    overwritten by the next call to this function */
  116. init_cond_string_buffer_index+= string_length + 1;
  117. }
  118. char * create_init_cond_string_buffer(splaytree_t * init_cond_tree) {
  119. if (init_cond_tree == NULL)
  120. return NULL;
  121. init_cond_string_buffer_index = 0;
  122. splay_traverse(init_cond_to_string, init_cond_tree);
  123. return init_cond_string_buffer;
  124. }