/* Load config from registry */ static int load_from_registry(const char * confname) { option68_t * opt; int err = 0; char paths[2][64]; snprintf(paths[0], sizeof(paths[0]), cuk_fmt, confname); strncpy(paths[1], lmk_str, sizeof(paths[1])); for (opt = option68_enum(0); opt; opt = opt->next) { char path[128], str[512]; int k, val; if (!opt->save) continue; for (k=0; k<2; ++k) { strncpy(path, paths[k], sizeof(path)); strncat(path, opt->name, sizeof(path)); TRACE68(config68_cat, "conf68: trying -- '%s'\n", path); switch (opt->type) { case opt68_BOL: case opt68_INT: err = registry68_geti(0, path, &val); if (!err) err = option68_iset(opt, val, opt68_PRIO, opt68_CFG); if (!err) TRACE68(config68_cat, "conf68: load '%s' <- %d\n", path, val); break; case opt68_ENU: case opt68_STR: err = registry68_gets(0, path, str, sizeof(str)); if (!err) err = option68_set(opt, str, opt68_PRIO, opt68_CFG); TRACE68(config68_cat, "conf68: load '%s' <- '%s'\n", path, str); break; default: assert(!"invalid option type"); err = -1; break; } } } return 0; }
static int getopt(const char * key, int op, sc68_dialval_t * val) { option68_t * opt = option68_get(key, opt68_ALWAYS); const int org = opt68_CFG; if (opt) { const int isset = opt->org != opt68_UDF; TRACE68(dial_cat, P "Got an option \"%s\" %sset opcode:%d\n", key, isset?"":"not ", op); switch (op) { case SC68_DIAL_GETI: if (isset && (opt->type == opt68_BOL || opt->type == opt68_INT || opt->type == opt68_ENU)) { val->i = opt->val.num; return 0; } break; case SC68_DIAL_GETS: if (isset && opt->type == opt68_STR) { val->s = opt->val.str; return 0; } break; case SC68_DIAL_ENUM: if (isset && opt->type == opt68_ENU && val->i >= 0 && val->i < (int)opt->sets) { val->s = val->i[(const char **)opt->set]; return 0; } break; case SC68_DIAL_SETI: return option68_iset(opt, val->i, opt68_ALWAYS, org); case SC68_DIAL_SETS: return option68_set(opt, val->s, opt68_ALWAYS, org); case SC68_DIAL_MIN: val->i = opt->min; return 0; case SC68_DIAL_MAX: val->i = opt->max; return 0; case SC68_DIAL_CNT: val->i = opt->sets; return 0; case SC68_DIAL_CAT: val->s = opt->cat; return 0; case SC68_DIAL_DESC: val->s = opt->desc; return 0; } } return -1; }