nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include "opt.h" nuclear@0: #include "rbtree.h" nuclear@0: nuclear@0: static void opt_del_func(struct rbnode *opt, void *cls) nuclear@0: { nuclear@0: free(opt); nuclear@0: } nuclear@0: nuclear@0: void *create_options(void) nuclear@0: { nuclear@0: struct rbtree *db = rb_create(RB_KEY_STRING); nuclear@0: rb_set_delete_func(db, opt_del_func, 0); nuclear@0: return db; nuclear@0: } nuclear@0: nuclear@0: void destroy_options(void *optdb) nuclear@0: { nuclear@0: rb_destroy(optdb); nuclear@0: } nuclear@0: nuclear@0: void set_option_int(void *optdb, const char *key, int val) nuclear@0: { nuclear@19: int i; nuclear@0: struct option *opt = malloc(sizeof *opt); nuclear@0: if(!opt) { nuclear@0: fprintf(stderr, "failed to set option: %s: %s\n", key, strerror(errno)); nuclear@0: return; nuclear@0: } nuclear@0: opt->type = OTYPE_INT; nuclear@0: opt->ival = val; nuclear@0: opt->fval = (float)val; nuclear@19: for(i=0; i<4; i++) { nuclear@19: opt->vval[i] = opt->fval; nuclear@19: } nuclear@0: nuclear@0: if(rb_insert(optdb, (void*)key, opt) == -1) { nuclear@0: fprintf(stderr, "failed to set option: %s\n", key); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: void set_option_float(void *optdb, const char *key, float val) nuclear@0: { nuclear@19: int i; nuclear@0: struct option *opt = malloc(sizeof *opt); nuclear@0: if(!opt) { nuclear@0: fprintf(stderr, "failed to set option: %s: %s\n", key, strerror(errno)); nuclear@0: return; nuclear@0: } nuclear@0: opt->type = OTYPE_FLOAT; nuclear@0: opt->fval = val; nuclear@0: opt->ival = (int)val; nuclear@19: for(i=0; i<4; i++) { nuclear@19: opt->vval[i] = val; nuclear@19: } nuclear@0: nuclear@0: if(rb_insert(optdb, (void*)key, opt) == -1) { nuclear@0: fprintf(stderr, "failed to set option: %s\n", key); nuclear@0: } nuclear@0: } nuclear@0: nuclear@19: void set_option_vec(void *optdb, const char *key, float *val) nuclear@19: { nuclear@19: int i; nuclear@19: struct option *opt = malloc(sizeof *opt); nuclear@19: if(!opt) { nuclear@19: fprintf(stderr, "failed to set option: %s: %s\n", key, strerror(errno)); nuclear@19: return; nuclear@19: } nuclear@19: opt->type = OTYPE_VEC; nuclear@19: for(i=0; i<4; i++) { nuclear@19: opt->vval[i] = val[i]; nuclear@19: } nuclear@19: opt->fval = val[0]; nuclear@19: opt->ival = (int)val[0]; nuclear@19: nuclear@19: if(rb_insert(optdb, (void*)key, opt) == -1) { nuclear@19: fprintf(stderr, "failed to set option: %s\n", key); nuclear@19: } nuclear@19: } nuclear@19: nuclear@19: void set_option_vec3f(void *optdb, const char *key, float x, float y, float z) nuclear@19: { nuclear@19: float vec[4]; nuclear@19: vec[0] = x; nuclear@19: vec[1] = y; nuclear@19: vec[2] = z; nuclear@19: vec[3] = 1.0f; nuclear@19: set_option_vec(optdb, key, vec); nuclear@19: } nuclear@19: nuclear@19: void set_option_vec4f(void *optdb, const char *key, float x, float y, float z, float w) nuclear@19: { nuclear@19: float vec[4]; nuclear@19: vec[0] = x; nuclear@19: vec[1] = y; nuclear@19: vec[2] = z; nuclear@19: vec[3] = w; nuclear@19: set_option_vec(optdb, key, vec); nuclear@19: } nuclear@19: nuclear@0: int get_option_int(void *optdb, const char *key, int *val) nuclear@0: { nuclear@0: struct option *opt = rb_find(optdb, (void*)key); nuclear@0: if(!opt) { nuclear@0: *val = 0; nuclear@0: return -1; nuclear@0: } nuclear@0: *val = opt->ival; nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: int get_option_float(void *optdb, const char *key, float *val) nuclear@0: { nuclear@0: struct option *opt = rb_find(optdb, (void*)key); nuclear@0: if(!opt) { nuclear@0: *val = 0.0f; nuclear@0: return -1; nuclear@0: } nuclear@0: *val = opt->fval; nuclear@0: return 0; nuclear@0: } nuclear@19: nuclear@19: int get_option_vec(void *optdb, const char *key, float *val) nuclear@19: { nuclear@19: int i; nuclear@19: struct option *opt = rb_find(optdb, (void*)key); nuclear@19: if(!opt) { nuclear@19: val[0] = val[1] = val[2] = val[3] = 0.0f; nuclear@19: return -1; nuclear@19: } nuclear@19: nuclear@19: for(i=0; i<4; i++) { nuclear@19: val[i] = opt->vval[i]; nuclear@19: } nuclear@19: return 0; nuclear@22: }