static YogVal start(YogEnv* env, YogVal self, YogVal pkg, YogVal args, YogVal kw, YogVal block) { SAVE_ARGS5(env, self, pkg, args, kw, block); YogVal group = YNIL; YogVal retval = YUNDEF; PUSH_LOCALS2(env, group, retval); YogCArg params[] = { { "|", NULL }, { "group", &group }, { NULL, NULL } }; YogGetArgs_parse_args(env, "start", params, args, kw); CHECK_SELF_MATCH(env, self); if (IS_FIXNUM(group)) { retval = start_num(env, self, VAL2INT(group)); } else if (IS_NIL(group)) { retval = start_num(env, self, 0); } else if (IS_PTR(group) && (BASIC_OBJ_TYPE(group) == TYPE_STRING)) { retval = start_str(env, self, group); } else { raise_invalid_group(env, group); } RETURN(env, retval); }
//得到子树节点,const int ZCE_Conf_PropertyTree::path_get_childiter(const std::string &path_str, ZCE_Conf_PropertyTree::const_child_iterator &child_iter) const { //找到 size_t str_pos = path_str.find(SEPARATOR_STRING, 0); std::string start_str(path_str, 0, str_pos); CHILDREN_NOTE_TYPE::const_iterator iter_tmp = child_node_.find(start_str); //如果没有找到 if (child_node_.end() == iter_tmp) { ZCE_LOG(RS_ERROR, "[zcelib][%s]Read config path fail, path[%s] .", __ZCE_FUNC__, path_str.c_str()); return -1; } const ZCE_Conf_PropertyTree *child_tree = &(iter_tmp->second); //还有路径,进行递归查询 if (str_pos != std::string::npos) { std::string remain_str(path_str, str_pos + 1); return child_tree->path_get_childiter(remain_str, child_iter); } else { //这儿无非是提前返回了, child_iter = iter_tmp; return 0; } }
//得到子树节点,const的, int ZCE_Conf_PropertyTree::get_child(const std::string &path_str, const PROPERTY_TREE_NODE *& const_child_data) const { const_child_data = NULL; //就是找自己 if ( 0 == path_str.length() ) { const_child_data = this; return 0; } // size_t str_pos = path_str.find("|", 0); std::string start_str(path_str, 0, str_pos); PROPERTY_TREE_MAP::const_iterator iter_tmp = child_node_map_.find(start_str); if ( child_node_map_.end() == iter_tmp ) { return -1; } const PROPERTY_TREE_NODE *child_tree = &(iter_tmp->second); //还有路径,进行递归查询 if (str_pos != std::string::npos) { std::string remain_str(path_str, str_pos + 1); return child_tree->get_child(remain_str, const_child_data); } else { //这儿无非是提前返回了, const_child_data = child_tree; return 0; } }