-
Notifications
You must be signed in to change notification settings - Fork 45
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
增加ef_iterator_env函数让外部调用,增加ef_env.h文件把定义单独放进来 #4
Comments
迭代器会在下一个版本放出来的哈 |
等不住下一个版本了,自己写了个迭代器,测试通过,哈哈哈 struct env_iterator_obj
{
struct sector_meta_data sector;
struct env_meta_data env;
};
typedef struct env_iterator_obj *env_iterator_obj_t;
static struct env_iterator_obj obj;
/**
* @brief 从头开始遍历
*
*/
void env_iterator_to_first()
{
obj.sector.addr = FAILED_ADDR;
obj.env.addr.start = FAILED_ADDR;
}
/**
* @brief 返回下一个环境变量
*
* @param env 环境变量存储地址
* @return char 1:遍历完成,0:任然存在数据
*/
char env_iterator_next(char *key, void *value_buf, size_t *value_len)
{
uint32_t sec_addr;
ef_port_env_lock();
if (obj.sector.addr == FAILED_ADDR)
{
_reload:
if ((sec_addr = get_next_sector_addr(&obj.sector)) == FAILED_ADDR)
{
ef_port_env_unlock();
return 1;
}
if (read_sector_meta_data(sec_addr, &obj.sector, false) != EF_NO_ERR)
{
goto _reload;
}
}
if (obj.sector.status.store == SECTOR_STORE_USING || obj.sector.status.store == SECTOR_STORE_FULL)
{
/* search all ENV */
_next:
if ((obj.env.addr.start = get_next_env_addr(&obj.sector, &obj.env)) != FAILED_ADDR)
{
read_env(&obj.env);
/* iterator is interrupted when callback return true */
if (obj.env.status == ENV_WRITE)
{
//key = obj.env.name;
memcpy(key, obj.env.name, obj.env.name_len);
key[obj.env.name_len] = 0;
*value_len = obj.env.value_len;
ef_port_read(obj.env.addr.value, (uint32_t *) value_buf, *value_len);
ef_port_env_unlock();
return 0;
}
else
{
goto _next;
}
}
else
{
goto _reload;
}
}
else
{
goto _reload;
}
} |
不错呀,可以提交 pr 上来哈 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
void ef_iterator_env(void *arg1, void *arg2, bool (*callback)(env_meta_data_t env, void *arg1, void *arg2))
{
struct env_meta_data env;
}
/**
Print ENV.
*/
void ef_print_env(void)
{
size_t using_size = 0;
ef_iterator_env(&using_size, NULL, print_env_cb);
ef_print("\nmode: next generation\n");
ef_print("size: %lu/%lu bytes.\n", using_size + (SECTOR_NUM - EF_GC_EMPTY_SEC_THRESHOLD) * SECTOR_HDR_DATA_SIZE,
ENV_AREA_SIZE - SECTOR_SIZE * EF_GC_EMPTY_SEC_THRESHOLD);
}
The text was updated successfully, but these errors were encountered: