mirror of
https://github.com/CTCaer/hekate
synced 2024-12-22 11:21:23 +00:00
bdk: ini: reduce heap fragmentation/pressure
This commit is contained in:
parent
39d411dc68
commit
e071fe44b0
1 changed files with 18 additions and 25 deletions
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2020 CTCaer
|
* Copyright (c) 2018-2022 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -21,25 +21,7 @@
|
||||||
#include <libs/fatfs/ff.h>
|
#include <libs/fatfs/ff.h>
|
||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
#include <utils/dirlist.h>
|
#include <utils/dirlist.h>
|
||||||
|
#include <utils/util.h>
|
||||||
static char *_strdup(char *str)
|
|
||||||
{
|
|
||||||
if (!str)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
// Remove starting space.
|
|
||||||
if (str[0] == ' ' && strlen(str))
|
|
||||||
str++;
|
|
||||||
|
|
||||||
char *res = (char *)malloc(strlen(str) + 1);
|
|
||||||
strcpy(res, str);
|
|
||||||
|
|
||||||
// Remove trailing space.
|
|
||||||
if (strlen(res) && res[strlen(res) - 1] == ' ')
|
|
||||||
res[strlen(res) - 1] = 0;
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 _find_section_name(char *lbuf, u32 lblen, char schar)
|
u32 _find_section_name(char *lbuf, u32 lblen, char schar)
|
||||||
{
|
{
|
||||||
|
@ -57,8 +39,12 @@ ini_sec_t *_ini_create_section(link_t *dst, ini_sec_t *csec, char *name, u8 type
|
||||||
if (csec)
|
if (csec)
|
||||||
list_append(dst, &csec->link);
|
list_append(dst, &csec->link);
|
||||||
|
|
||||||
csec = (ini_sec_t *)calloc(sizeof(ini_sec_t), 1);
|
// Calculate total allocation size.
|
||||||
csec->name = _strdup(name);
|
u32 len = name ? strlen(name) + 1 : 0;
|
||||||
|
char *buf = calloc(sizeof(ini_sec_t) + len, 1);
|
||||||
|
|
||||||
|
csec = (ini_sec_t *)buf;
|
||||||
|
csec->name = strcpy_ns(buf + sizeof(ini_sec_t), name);
|
||||||
csec->type = type;
|
csec->type = type;
|
||||||
|
|
||||||
return csec;
|
return csec;
|
||||||
|
@ -153,9 +139,16 @@ int ini_parse(link_t *dst, char *ini_path, bool is_dir)
|
||||||
{
|
{
|
||||||
u32 i = _find_section_name(lbuf, lblen, '=');
|
u32 i = _find_section_name(lbuf, lblen, '=');
|
||||||
|
|
||||||
ini_kv_t *kv = (ini_kv_t *)calloc(sizeof(ini_kv_t), 1);
|
// Calculate total allocation size.
|
||||||
kv->key = _strdup(&lbuf[0]);
|
u32 klen = strlen(&lbuf[0]) + 1;
|
||||||
kv->val = _strdup(&lbuf[i + 1]);
|
u32 vlen = strlen(&lbuf[i + 1]) + 1;
|
||||||
|
char *buf = calloc(sizeof(ini_kv_t) + klen + vlen, 1);
|
||||||
|
|
||||||
|
ini_kv_t *kv = (ini_kv_t *)buf;
|
||||||
|
buf += sizeof(ini_kv_t);
|
||||||
|
kv->key = strcpy_ns(buf, &lbuf[0]);
|
||||||
|
buf += klen;
|
||||||
|
kv->val = strcpy_ns(buf, &lbuf[i + 1]);
|
||||||
list_append(&csec->kvs, &kv->link);
|
list_append(&csec->kvs, &kv->link);
|
||||||
}
|
}
|
||||||
} while (!f_eof(&fp));
|
} while (!f_eof(&fp));
|
||||||
|
|
Loading…
Reference in a new issue