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

midi

开发平台:

Unix_Linux

  1. /* Function management */
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "common.h"
  6. #include "fatal.h"
  7. #include "func_types.h"
  8. #include "func.h"
  9. #include "splaytree_types.h"
  10. #include "splaytree.h"
  11. #include "tree_types.h"
  12. #include "builtin_funcs.h"
  13. /* A splay tree of builtin functions */
  14. splaytree_t * builtin_func_tree;
  15. /* Private function prototypes */
  16. int compare_func(char * name, char * name2);
  17. int insert_func(func_t * name);
  18. void * copy_func_key(char * string);
  19. void * copy_func_key(char * string) {
  20. char * clone_string;
  21. if ((clone_string = malloc(MAX_TOKEN_SIZE)) == NULL)
  22. return NULL;
  23. strncpy(clone_string, string, MAX_TOKEN_SIZE-1);
  24. return (void*)clone_string;
  25. }
  26. func_t * create_func (const char * name, double (*func_ptr)(), int num_args) {
  27.   func_t * func;
  28.   func = (func_t*)malloc(sizeof(func_t));
  29.  
  30.   if (func == NULL)
  31.     return NULL;
  32.   
  33.   /* Clear name space */
  34.   memset(func->name, 0, MAX_TOKEN_SIZE);
  35.   /* Copy given name into function structure */
  36.   strncpy(func->name, name, MAX_TOKEN_SIZE); 
  37.   /* Assign value pointer */
  38.   func->func_ptr = func_ptr;
  39.   func->num_args = num_args;
  40.   /* Return instantiated function */
  41.   return func;
  42. }
  43. /* Initialize the builtin function database.
  44.    Should only be necessary once */
  45. int init_builtin_func_db() {
  46.   int retval;
  47.   builtin_func_tree = create_splaytree(compare_string, copy_string, free_string);
  48.   if (builtin_func_tree == NULL)
  49.     return OUTOFMEM_ERROR;
  50.   retval = load_all_builtin_func();
  51.   return SUCCESS;
  52. }
  53. /* Destroy the builtin function database.
  54.    Generally, do this on projectm exit */
  55. int destroy_builtin_func_db() {
  56.   splay_traverse(free_func, builtin_func_tree);
  57.   destroy_splaytree(builtin_func_tree);
  58.   return SUCCESS;
  59. }
  60. /* Insert a function into the database */
  61. int insert_func(func_t * func) {
  62.   if (func == NULL)
  63.     return ERROR;
  64.   splay_insert(func, func->name, builtin_func_tree);
  65.   return SUCCESS;
  66. }
  67. /* Frees a function type, real complicated... */
  68. void free_func(func_t * func) {
  69.   free(func);
  70. }
  71. /* Remove a function from the database */
  72. int remove_func(func_t * func) {
  73.   if (func == NULL)
  74.     return ERROR;
  75.     splay_delete(func->name, builtin_func_tree);
  76.   return SUCCESS;
  77. }
  78. /* Find a function given its name */
  79. func_t * find_func(char * name) {
  80.   func_t * func = NULL;
  81.   /* First look in the builtin database */
  82.   func = (func_t *)splay_find(name, builtin_func_tree);
  83.   return func;
  84. }
  85. /* Compare string name with function name */
  86. int compare_func(char * name, char * name2) {
  87.   int cmpval;
  88.   /* Uses string comparison function */
  89.   cmpval = strncmp(name, name2, MAX_TOKEN_SIZE-1);
  90.   
  91.   return cmpval;
  92. }
  93. /* Loads a builtin function */
  94. int load_builtin_func(const char * name,  double (*func_ptr)(), int num_args) {
  95.   func_t * func; 
  96.   int retval; 
  97.   /* Create new function */
  98.   func = create_func(name, func_ptr, num_args);
  99.   if (func == NULL)
  100.     return OUTOFMEM_ERROR;
  101.   retval = insert_func(func);
  102.   return retval;
  103. }
  104. /* Loads all builtin functions */
  105. int load_all_builtin_func() {
  106.   
  107.   if (load_builtin_func("int", int_wrapper, 1) < 0)
  108.     return ERROR;
  109.   if (load_builtin_func("abs", abs_wrapper, 1) < 0)
  110.     return ERROR;
  111.   if (load_builtin_func("sin", sin_wrapper, 1) < 0)
  112.     return ERROR;
  113.   if (load_builtin_func("cos", cos_wrapper, 1) < 0)
  114.     return ERROR;
  115.   if (load_builtin_func("tan", tan_wrapper, 1) < 0)
  116.     return ERROR;
  117.   if (load_builtin_func("asin", asin_wrapper, 1) < 0)
  118.     return ERROR;
  119.   if (load_builtin_func("acos", acos_wrapper, 1) < 0)
  120.     return ERROR;
  121.   if (load_builtin_func("atan", atan_wrapper, 1) < 0)
  122.     return ERROR;
  123.   if (load_builtin_func("sqr", sqr_wrapper, 1) < 0)
  124.     return ERROR;
  125.   if (load_builtin_func("sqrt", sqrt_wrapper, 1) < 0)
  126.     return ERROR;
  127.   if (load_builtin_func("pow", pow_wrapper, 2) < 0)
  128.     return ERROR;
  129.   if (load_builtin_func("exp", exp_wrapper, 1) < 0)
  130.     return ERROR;
  131.   if (load_builtin_func("log", log_wrapper, 1) < 0)
  132.     return ERROR;
  133.   if (load_builtin_func("log10", log10_wrapper, 1) < 0)
  134.     return ERROR;
  135.   if (load_builtin_func("sign", sign_wrapper, 1) < 0)
  136.     return ERROR;
  137.   if (load_builtin_func("min", min_wrapper, 2) < 0)
  138.     return ERROR;
  139.   if (load_builtin_func("max", max_wrapper, 2) < 0)
  140.     return ERROR;
  141.   if (load_builtin_func("sigmoid", sigmoid_wrapper, 2) < 0)
  142.     return ERROR;
  143.   if (load_builtin_func("atan2", atan2_wrapper, 2) < 0)
  144.     return ERROR;
  145.   if (load_builtin_func("rand", rand_wrapper, 1) < 0)
  146.     return ERROR;
  147.   if (load_builtin_func("band", band_wrapper, 2) < 0)
  148.     return ERROR;
  149.   if (load_builtin_func("bor", bor_wrapper, 2) < 0)
  150.     return ERROR;
  151.   if (load_builtin_func("bnot", bnot_wrapper, 1) < 0)
  152.     return ERROR;
  153.   if (load_builtin_func("if", if_wrapper, 3) < 0)
  154.     return ERROR;
  155.   if (load_builtin_func("equal", equal_wrapper, 2) < 0)
  156.     return ERROR;
  157.   if (load_builtin_func("above", above_wrapper, 2) < 0)
  158.     return ERROR;
  159.   if (load_builtin_func("below", below_wrapper, 2) < 0)
  160.     return ERROR;
  161.   if (load_builtin_func("nchoosek", nchoosek_wrapper, 2) < 0)
  162.     return ERROR;
  163.   if (load_builtin_func("fact", fact_wrapper, 1) < 0)
  164.     return ERROR;
  165.   return SUCCESS;
  166. }