init_cond.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:5k
源码类别:

midi

开发平台:

Unix_Linux

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