📄 func.c
字号:
/* Function management */#include <stdio.h>#include <string.h>#include <stdlib.h>#include "common.h"#include "fatal.h"#include "func_types.h"#include "func.h"#include "splaytree_types.h"#include "splaytree.h"#include "tree_types.h"#include "builtin_funcs.h"/* A splay tree of builtin functions */splaytree_t * builtin_func_tree;/* Private function prototypes */int compare_func(char * name, char * name2);int insert_func(func_t * name);void * copy_func_key(char * string);void * copy_func_key(char * string) { char * clone_string; if ((clone_string = malloc(MAX_TOKEN_SIZE)) == NULL) return NULL; strncpy(clone_string, string, MAX_TOKEN_SIZE-1); return (void*)clone_string;} func_t * create_func (char * name, double (*func_ptr)(), int num_args) { func_t * func; func = (func_t*)malloc(sizeof(func_t)); if (func == NULL) return NULL; /* Clear name space */ memset(func->name, 0, MAX_TOKEN_SIZE); /* Copy given name into function structure */ strncpy(func->name, name, MAX_TOKEN_SIZE); /* Assign value pointer */ func->func_ptr = func_ptr; func->num_args = num_args; /* Return instantiated function */ return func;}/* Initialize the builtin function database. Should only be necessary once */int init_builtin_func_db() { int retval; builtin_func_tree = create_splaytree(compare_string, copy_string, free_string); if (builtin_func_tree == NULL) return OUTOFMEM_ERROR; retval = load_all_builtin_func(); return SUCCESS;}/* Destroy the builtin function database. Generally, do this on projectm exit */int destroy_builtin_func_db() { splay_traverse(free_func, builtin_func_tree); destroy_splaytree(builtin_func_tree); return SUCCESS;}/* Insert a function into the database */int insert_func(func_t * func) { if (func == NULL) return ERROR; splay_insert(func, func->name, builtin_func_tree); return SUCCESS;}/* Frees a function type, real complicated... */void free_func(func_t * func) { free(func);}/* Remove a function from the database */int remove_func(func_t * func) { if (func == NULL) return ERROR; splay_delete(func->name, builtin_func_tree); return SUCCESS;}/* Find a function given its name */func_t * find_func(char * name) { func_t * func = NULL; /* First look in the builtin database */ func = (func_t *)splay_find(name, builtin_func_tree); return func;}/* Compare string name with function name */int compare_func(char * name, char * name2) { int cmpval; /* Uses string comparison function */ cmpval = strncmp(name, name2, MAX_TOKEN_SIZE-1); return cmpval;}/* Loads a builtin function */int load_builtin_func(char * name, double (*func_ptr)(), int num_args) { func_t * func; int retval; /* Create new function */ func = create_func(name, func_ptr, num_args); if (func == NULL) return OUTOFMEM_ERROR; retval = insert_func(func); return retval;}/* Loads all builtin functions */int load_all_builtin_func() { if (load_builtin_func("int", int_wrapper, 1) < 0) return ERROR; if (load_builtin_func("abs", abs_wrapper, 1) < 0) return ERROR; if (load_builtin_func("sin", sin_wrapper, 1) < 0) return ERROR; if (load_builtin_func("cos", cos_wrapper, 1) < 0) return ERROR; if (load_builtin_func("tan", tan_wrapper, 1) < 0) return ERROR; if (load_builtin_func("asin", asin_wrapper, 1) < 0) return ERROR; if (load_builtin_func("acos", acos_wrapper, 1) < 0) return ERROR; if (load_builtin_func("atan", atan_wrapper, 1) < 0) return ERROR; if (load_builtin_func("sqr", sqr_wrapper, 1) < 0) return ERROR; if (load_builtin_func("sqrt", sqrt_wrapper, 1) < 0) return ERROR; if (load_builtin_func("pow", pow_wrapper, 2) < 0) return ERROR; if (load_builtin_func("exp", exp_wrapper, 1) < 0) return ERROR; if (load_builtin_func("log", log_wrapper, 1) < 0) return ERROR; if (load_builtin_func("log10", log10_wrapper, 1) < 0) return ERROR; if (load_builtin_func("sign", sign_wrapper, 1) < 0) return ERROR; if (load_builtin_func("min", min_wrapper, 2) < 0) return ERROR; if (load_builtin_func("max", max_wrapper, 2) < 0) return ERROR; if (load_builtin_func("sigmoid", sigmoid_wrapper, 2) < 0) return ERROR; if (load_builtin_func("atan2", atan2_wrapper, 2) < 0) return ERROR; if (load_builtin_func("rand", rand_wrapper, 1) < 0) return ERROR; if (load_builtin_func("band", band_wrapper, 2) < 0) return ERROR; if (load_builtin_func("bor", bor_wrapper, 2) < 0) return ERROR; if (load_builtin_func("bnot", bnot_wrapper, 1) < 0) return ERROR; if (load_builtin_func("if", if_wrapper, 3) < 0) return ERROR; if (load_builtin_func("equal", equal_wrapper, 2) < 0) return ERROR; if (load_builtin_func("above", above_wrapper, 2) < 0) return ERROR; if (load_builtin_func("below", below_wrapper, 2) < 0) return ERROR; if (load_builtin_func("nchoosek", nchoosek_wrapper, 2) < 0) return ERROR; if (load_builtin_func("fact", fact_wrapper, 1) < 0) return ERROR; return SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -