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