?? htreg.cc
字號:
rec_depth = 0; ht_registry_node *n = find_entry_i(NULL, key, follow_symlinks); if (n) { if (n->type == RNT_SUBDIR) return false; *node = n; return true; } return false;}ht_registry_node *ht_registry::find_entry_i(Container **rdir, const char *key, bool follow_symlinks){ ht_registry_node *dir = root; char *s; char t[256]; /* FIXME: possible buffer overflow */ if (key[0]=='/') key++; while (1) { s = strchr(key, '/'); if (s) { ht_strlcpy(t, key, s-key+1); dir = find_entry_get_subdir(((ht_registry_data_stree*)dir->data)->tree, t); if (!dir) break; key = s+1; } else { ht_registry_node *n; if (*key==0) { n = dir; } else { n = find_entry_get_data(((ht_registry_data_stree*)dir->data)->tree, key, follow_symlinks); } if (rdir) *rdir=((ht_registry_data_stree*)dir->data)->tree; return n; } } return NULL;}ht_registry_node *ht_registry::find_entry_get_node(Container *dir, const char *nodename){ if (nodename) { ht_registry_node t(0, nodename, NULL); ht_registry_node *n=(ht_registry_node*)dir->get(dir->find(&t)); return n; } return NULL;}ht_registry_node *ht_registry::find_entry_get_subdir(Container *dir, const char *nodename){ ht_registry_node *n=find_entry_get_node(dir, nodename);start: if (!n) return 0; switch (n->type) { case RNT_SYMLINK: { rec_depth++; if (rec_depth > MAX_SYMLINK_REC_DEPTH) return 0; char *sl=((ht_registry_data_string*)n->data)->value; if (sl[0] == '/') { n = find_entry_i(NULL, sl, true); goto start; } else { return find_entry_get_subdir(dir, sl); } } case RNT_SUBDIR: return n; } return 0;}ht_registry_node *ht_registry::find_entry_get_data(Container *dir, const char *nodename, bool follow_symlinks){ ht_registry_node *n = find_entry_get_node(dir, nodename);start: if (!n) return NULL; if (follow_symlinks && n->type == RNT_SYMLINK) { rec_depth++; if (rec_depth > MAX_SYMLINK_REC_DEPTH) return NULL; char *sl = ((ht_registry_data_string*)n->data)->value; if (sl[0] == '/') { n = find_entry_i(NULL, sl, true); goto start; } else { return find_entry_get_data(dir, sl, follow_symlinks); } } return n;}ht_registry_node_type ht_registry::have_node_type(const char *identifier, create_empty_registry_data_func create_empty_registry_data){ ht_registry_node_type t=lookup_node_type(identifier); if (!t) t=register_node_type(identifier, create_empty_registry_data); return t;}void ht_registry::load(ObjectStream &f){ GET_OBJECT(f, node_types); GET_OBJECT(f, root);}ht_registry_node_type_desc *ht_registry::get_node_type_desc(ht_registry_node_type t, const char **identifier){ ht_registry_node_type_desc *data = NULL; firstThat(ht_registry_node_type_desc, data, *node_types, t == data->type); if (data && identifier) *identifier = data->name; return data;}ht_registry_node_type ht_registry::lookup_node_type(const char *identifier){ ht_registry_node_type_desc s(0, identifier, NULL); ht_registry_node_type_desc *d=(ht_registry_node_type_desc*)node_types->get(node_types->find(&s)); return d ? d->type : 0;}ObjectID ht_registry::getObjectID() const{ return ATOM_HT_REGISTRY;}ht_registry_node_type ht_registry::register_node_type(const char *identifier, create_empty_registry_data_func create_empty_registry_data){// ht_registry_node_type t = RNT_USER; ht_registry_node_type t = 0; ht_registry_node_type_desc *nt = NULL; do { t++; firstThat(ht_registry_node_type_desc, nt, *node_types, t == nt->type); } while (nt != NULL); ht_registry_node_type_desc *v = new ht_registry_node_type_desc(t, identifier, create_empty_registry_data); if (node_types->find(v) != invObjHandle) { delete v; return RNT_INVALID; } else { node_types->insert(v); return t; }}int ht_registry::set_dword(const char *key, uint32 d){ return set_node(key, RNT_DWORD, new ht_registry_data_dword(d));}int ht_registry::set_raw(const char *key, const void *data, uint size){ return set_node(key, RNT_RAW, new ht_registry_data_raw(data, size));}int ht_registry::set_node(const char *key, ht_registry_node_type type, ht_registry_data *data){ ht_registry_node *n = find_entry_i(NULL, key, false); if (!n) return ENOENT; if (n->type == type) { if (n->data) { n->data->done(); delete n->data; } n->data = data; return 0; } return EPERM;}int ht_registry::set_string(const char *key, const char *string){ return set_node(key, RNT_STRING, new ht_registry_data_string(string));}int ht_registry::set_symlink(const char *key, const char *dest){ return set_node(key, RNT_SYMLINK, new ht_registry_data_string(dest));}bool ht_registry::splitfind(const char *key, const char **name, ht_registry_node **node){ char dir[256]; /* FIXME: possible buffer overflow */ const char *n = strrchr(key, '/'); if (n) { ht_strlcpy(dir, key, n-key+1); n++; } else { dir[0]=0; n=key; } ht_registry_node *m = find_entry_i(NULL, dir, true); if (!m) return 0; if (m->type != RNT_SUBDIR) return 0; *node = m; *name = n; return 1;}void ht_registry::store(ObjectStream &f) const{ PUT_OBJECT(f, node_types); PUT_OBJECT(f, root);}unsigned char valid_nodename_chars[256/8]={/* 00, 08, 10, 18 */ 0, 0, 0, 0,/* 20, 28, 30, 38 *//* space '-' 0-9 '&' ':' '.' */ BITMAP(1, 0, 0, 0, 0, 0, 1, 0), BITMAP(0, 0, 0, 0, 0, 1, 1, 0), BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 0, 0, 0, 0, 0),/* 40, 48, 50, 58 *//* A-Z '_' */ BITMAP(0, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 0, 0, 0, 0, 1),/* 60, 68, 70, 78 *//* a-z */ BITMAP(0, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 0, 0, 0, 0, 0),/* 80, 88, 90, 98 */ 0, 0, 0, 0,/* a0, a8, b0, b8 */ 0, 0, 0, 0,/* c0, c8, d0, d8 */ 0, 0, 0, 0,/* e0, e8, f0, f8 */ 0, 0, 0, 0};unsigned char valid_nodename_chars_first[256/8]={/* 00, 08, 10, 18 */ 0, 0, 0, 0,/* 20, 28, 30, 38 *//* '.' '-' 0-9 */ BITMAP(0, 0, 0, 0, 0, 0, 1, 0), BITMAP(0, 0, 0, 0, 0, 1, 1, 0), BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 0, 0, 0, 0, 0, 0),/* 40, 48, 50, 58 *//* A-Z '_' */ BITMAP(0, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 0, 0, 0, 0, 1),/* 60, 68, 70, 78 *//* a-z */ BITMAP(0, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 0, 0, 0, 0, 0),/* 80, 88, 90, 98 */ 0, 0, 0, 0,/* a0, a8, b0, b8 */ 0, 0, 0, 0,/* c0, c8, d0, d8 */ 0, 0, 0, 0,/* e0, e8, f0, f8 */ 0, 0, 0, 0};static bool valid_char(unsigned char *bitmap, char c){ int o=c/8; int p=c%8; return BITBIT(bitmap[o], p);}bool ht_registry::valid_nodename(const char *nodename){ if ((strcmp(nodename, "..")==0) || (strcmp(nodename, ".")==0)) { return false; } if (!valid_char(valid_nodename_chars_first, *nodename)) return false; nodename++; while (*nodename) { if (!valid_char(valid_nodename_chars, *nodename)) return false; nodename++; } return true;}uint32 get_config_dword(const char *ident){ char e[HT_NAME_MAX], *ee = e; strcpy(ee, "/config/"); ee += strlen(ee); ht_strlcpy(ee, ident, sizeof (e) - (ee-e) + 1); ht_registry_node *n; if (registry->find_data_entry(e, &n, true)) { if (n->type == RNT_DWORD) { ht_registry_data_dword *s = (ht_registry_data_dword *)n->data; return s->value; } else { const char *q = "?"; registry->get_node_type_desc(n->type, &q); LOG_EX(LOG_ERROR, "registry key '%s' not of type %s, but: %s", e, "dword", q); } } else LOG_EX(LOG_ERROR, "registry key '%s' not found", e); return 0;}char *get_config_string(const char *ident){ char e[HT_NAME_MAX], *ee = e; strcpy(ee, "/config/"); ee += strlen(ee); ht_strlcpy(ee, ident, sizeof (e) - (ee-e) + 1); ht_registry_node *n; if (registry->find_data_entry(e, &n, true)) { if (n->type == RNT_STRING) { ht_registry_data_string *s = (ht_registry_data_string *)n->data; return ht_strdup(s->value); } else { const char *q = "?"; registry->get_node_type_desc(n->type, &q); LOG_EX(LOG_ERROR, "registry key '%s' not of type %s, but: %s", e, "string", q); } } else LOG_EX(LOG_ERROR, "registry key '%s' not found", e); return NULL;}BUILDER(ATOM_HT_REGISTRY, ht_registry, Object);BUILDER(ATOM_HT_REGISTRY_NODE, ht_registry_node, Object);BUILDER(ATOM_HT_REGISTRY_DATA_STREE, ht_registry_data_stree, ht_registry_data);BUILDER(ATOM_HT_REGISTRY_DATA_DWORD, ht_registry_data_dword, ht_registry_data);BUILDER(ATOM_HT_REGISTRY_DATA_RAW, ht_registry_data_raw, ht_registry_data);BUILDER(ATOM_HT_REGISTRY_DATA_STRING, ht_registry_data_string, ht_registry_data);BUILDER(ATOM_HT_REGISTRY_NODE_TYPE_DESC, ht_registry_node_type_desc, Object); /* * INIT */#include "cstream.h"bool init_registry(){ REGISTER(ATOM_HT_REGISTRY, ht_registry); REGISTER(ATOM_HT_REGISTRY_NODE, ht_registry_node); REGISTER(ATOM_HT_REGISTRY_DATA_STREE, ht_registry_data_stree); REGISTER(ATOM_HT_REGISTRY_DATA_DWORD, ht_registry_data_dword); REGISTER(ATOM_HT_REGISTRY_DATA_RAW, ht_registry_data_raw); REGISTER(ATOM_HT_REGISTRY_DATA_STRING, ht_registry_data_string); REGISTER(ATOM_HT_REGISTRY_NODE_TYPE_DESC, ht_registry_node_type_desc);// registerAtom(ATOM_HT_CREATE_EMPTY_SUBDIR, (void*)); registerAtom(ATOM_HT_CREATE_EMPTY_SYMLINK, (void*)create_empty_symlink); registerAtom(ATOM_HT_CREATE_EMPTY_DWORD, (void*)create_empty_dword); registerAtom(ATOM_HT_CREATE_EMPTY_STRING, (void*)create_empty_string); registerAtom(ATOM_HT_CREATE_EMPTY_RAW, (void*)create_empty_raw); /* * load default registry */ ConstMemMapFile f(default_reg, sizeof default_reg); CompressedStream c(&f, false); ObjectStreamBin o(&c, false); GET_OBJECT(o, registry);// registry = new ht_registry;// registry->init(); return true;}/* * DONE */void done_registry(){ UNREGISTER(ATOM_HT_REGISTRY, ht_registry); UNREGISTER(ATOM_HT_REGISTRY_NODE, ht_registry_node); UNREGISTER(ATOM_HT_REGISTRY_DATA_STREE, ht_registry_data_stree); UNREGISTER(ATOM_HT_REGISTRY_DATA_DWORD, ht_registry_data_dword); UNREGISTER(ATOM_HT_REGISTRY_DATA_RAW, ht_registry_data_raw); UNREGISTER(ATOM_HT_REGISTRY_DATA_STRING, ht_registry_data_string); UNREGISTER(ATOM_HT_REGISTRY_NODE_TYPE_DESC, ht_registry_node_type_desc);// unregisterAtom(ATOM_HT_CREATE_EMPTY_SUBDIR); unregisterAtom(ATOM_HT_CREATE_EMPTY_SYMLINK); unregisterAtom(ATOM_HT_CREATE_EMPTY_DWORD); unregisterAtom(ATOM_HT_CREATE_EMPTY_STRING); unregisterAtom(ATOM_HT_CREATE_EMPTY_RAW); registry->done(); delete registry;}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -