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@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@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@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@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: 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: }