mirror of
https://github.com/CTCaer/hekate.git
synced 2024-11-12 21:36:39 +00:00
[config + ini] Refactor and fix bugs
This commit is contained in:
parent
ec890c7c97
commit
4f5fcf9fbd
2 changed files with 78 additions and 130 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 CTCaer
|
* Copyright (c) 2018-2019 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,
|
||||||
|
@ -17,14 +17,15 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "../utils/btn.h"
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "../libs/fatfs/ff.h"
|
|
||||||
#include "ini.h"
|
#include "ini.h"
|
||||||
#include "../utils/list.h"
|
|
||||||
#include "../gfx/tui.h"
|
|
||||||
#include "../utils/util.h"
|
|
||||||
#include "../gfx/gfx.h"
|
#include "../gfx/gfx.h"
|
||||||
|
#include "../gfx/tui.h"
|
||||||
|
#include "../libs/fatfs/ff.h"
|
||||||
|
#include "../soc/t210.h"
|
||||||
|
#include "../utils/btn.h"
|
||||||
|
#include "../utils/list.h"
|
||||||
|
#include "../utils/util.h"
|
||||||
|
|
||||||
extern gfx_ctxt_t gfx_ctxt;
|
extern gfx_ctxt_t gfx_ctxt;
|
||||||
extern gfx_con_t gfx_con;
|
extern gfx_con_t gfx_con;
|
||||||
|
@ -41,7 +42,6 @@ void set_default_configuration()
|
||||||
h_cfg.autoboot = 0;
|
h_cfg.autoboot = 0;
|
||||||
h_cfg.autoboot_list = 0;
|
h_cfg.autoboot_list = 0;
|
||||||
h_cfg.bootwait = 3;
|
h_cfg.bootwait = 3;
|
||||||
h_cfg.customlogo = 0;
|
|
||||||
h_cfg.verification = 2;
|
h_cfg.verification = 2;
|
||||||
h_cfg.se_keygen_done = 0;
|
h_cfg.se_keygen_done = 0;
|
||||||
h_cfg.sbar_time_keeping = 0;
|
h_cfg.sbar_time_keeping = 0;
|
||||||
|
@ -93,9 +93,6 @@ int create_config_entry()
|
||||||
f_puts("\nbootwait=", &fp);
|
f_puts("\nbootwait=", &fp);
|
||||||
itoa(h_cfg.bootwait, lbuf, 10);
|
itoa(h_cfg.bootwait, lbuf, 10);
|
||||||
f_puts(lbuf, &fp);
|
f_puts(lbuf, &fp);
|
||||||
f_puts("\ncustomlogo=", &fp);
|
|
||||||
itoa(h_cfg.customlogo, lbuf, 10);
|
|
||||||
f_puts(lbuf, &fp);
|
|
||||||
f_puts("\nverification=", &fp);
|
f_puts("\nverification=", &fp);
|
||||||
itoa(h_cfg.verification, lbuf, 10);
|
itoa(h_cfg.verification, lbuf, 10);
|
||||||
f_puts(lbuf, &fp);
|
f_puts(lbuf, &fp);
|
||||||
|
@ -156,6 +153,18 @@ int create_config_entry()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _save_config()
|
||||||
|
{
|
||||||
|
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||||
|
gfx_con_setpos(&gfx_con, 0, 0);
|
||||||
|
|
||||||
|
if (!create_config_entry())
|
||||||
|
gfx_puts(&gfx_con, "\nConfiguration was saved!\n");
|
||||||
|
else
|
||||||
|
EPRINTF("\nConfiguration saving failed!");
|
||||||
|
gfx_puts(&gfx_con, "\nPress any key...");
|
||||||
|
}
|
||||||
|
|
||||||
static void _config_autoboot_list(void *ent)
|
static void _config_autoboot_list(void *ent)
|
||||||
{
|
{
|
||||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||||
|
@ -216,21 +225,13 @@ static void _config_autoboot_list(void *ent)
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&ments[i], 0, sizeof(ment_t));
|
memset(&ments[i], 0, sizeof(ment_t));
|
||||||
menu_t menu = {ments, "Select a list entry to auto boot", 0, 0};
|
menu_t menu = {ments, "Select an entry to auto boot", 0, 0};
|
||||||
temp_autoboot = (u32 *)tui_do_menu(&gfx_con, &menu);
|
temp_autoboot = (u32 *)tui_do_menu(&gfx_con, &menu);
|
||||||
if (temp_autoboot != NULL)
|
if (temp_autoboot != NULL)
|
||||||
{
|
{
|
||||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
|
||||||
gfx_con_setpos(&gfx_con, 0, 0);
|
|
||||||
|
|
||||||
h_cfg.autoboot = *(u32 *)temp_autoboot;
|
h_cfg.autoboot = *(u32 *)temp_autoboot;
|
||||||
h_cfg.autoboot_list = 1;
|
h_cfg.autoboot_list = 1;
|
||||||
// Save choice to ini file.
|
_save_config();
|
||||||
if (!create_config_entry())
|
|
||||||
gfx_puts(&gfx_con, "\nConfiguration was saved!\n");
|
|
||||||
else
|
|
||||||
EPRINTF("\nConfiguration saving failed!");
|
|
||||||
gfx_puts(&gfx_con, "\nPress any key...");
|
|
||||||
|
|
||||||
ment_t *tmp = (ment_t *)ent;
|
ment_t *tmp = (ment_t *)ent;
|
||||||
tmp->data = NULL;
|
tmp->data = NULL;
|
||||||
|
@ -240,7 +241,7 @@ static void _config_autoboot_list(void *ent)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
EPRINTF("Could not open 'bootloader/hekate_ipl.ini'.\nMake sure it exists in SD Card!.");
|
EPRINTF("Could not open 'bootloader/hekate_ipl.ini'.\nMake sure it exists!.");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -344,24 +345,16 @@ void config_autoboot()
|
||||||
temp_autoboot = (u32 *)tui_do_menu(&gfx_con, &menu);
|
temp_autoboot = (u32 *)tui_do_menu(&gfx_con, &menu);
|
||||||
if (temp_autoboot != NULL)
|
if (temp_autoboot != NULL)
|
||||||
{
|
{
|
||||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
|
||||||
gfx_con_setpos(&gfx_con, 0, 0);
|
|
||||||
|
|
||||||
h_cfg.autoboot = *(u32 *)temp_autoboot;
|
h_cfg.autoboot = *(u32 *)temp_autoboot;
|
||||||
h_cfg.autoboot_list = 0;
|
h_cfg.autoboot_list = 0;
|
||||||
// Save choice to ini file.
|
_save_config();
|
||||||
if (!create_config_entry())
|
|
||||||
gfx_puts(&gfx_con, "\nConfiguration was saved!\n");
|
|
||||||
else
|
|
||||||
EPRINTF("\nConfiguration saving failed!");
|
|
||||||
gfx_puts(&gfx_con, "\nPress any key...");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
goto out2;
|
goto out2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
EPRINTF("Could not open 'bootloader/hekate_ipl.ini'.\nMake sure it exists in SD Card!.");
|
EPRINTF("Could not open 'bootloader/hekate_ipl.ini'.\nMake sure it exists!.");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -380,6 +373,9 @@ out2:;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma GCC push_options
|
||||||
|
#pragma GCC optimize ("Os")
|
||||||
|
|
||||||
void config_bootdelay()
|
void config_bootdelay()
|
||||||
{
|
{
|
||||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||||
|
@ -427,16 +423,8 @@ void config_bootdelay()
|
||||||
u32 *temp_bootwait = (u32 *)tui_do_menu(&gfx_con, &menu);
|
u32 *temp_bootwait = (u32 *)tui_do_menu(&gfx_con, &menu);
|
||||||
if (temp_bootwait != NULL)
|
if (temp_bootwait != NULL)
|
||||||
{
|
{
|
||||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
|
||||||
gfx_con_setpos(&gfx_con, 0, 0);
|
|
||||||
|
|
||||||
h_cfg.bootwait = *(u32 *)temp_bootwait;
|
h_cfg.bootwait = *(u32 *)temp_bootwait;
|
||||||
// Save choice to ini file.
|
_save_config();
|
||||||
if (!create_config_entry())
|
|
||||||
gfx_puts(&gfx_con, "\nConfiguration was saved!\n");
|
|
||||||
else
|
|
||||||
EPRINTF("\nConfiguration saving failed!");
|
|
||||||
gfx_puts(&gfx_con, "\nPress any key...");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(ments);
|
free(ments);
|
||||||
|
@ -528,21 +516,16 @@ void config_verification()
|
||||||
ments[1].type = MENT_CHGLINE;
|
ments[1].type = MENT_CHGLINE;
|
||||||
|
|
||||||
memcpy(vr_text, " Disable (Fastest)", 19);
|
memcpy(vr_text, " Disable (Fastest)", 19);
|
||||||
memcpy(vr_text + 64, " Sparse (Fast - Not reliable)", 32);
|
memcpy(vr_text + 64, " Sparse (Fast)", 16);
|
||||||
memcpy(vr_text + 128, " Full (Slow - 100% reliable)", 32);
|
memcpy(vr_text + 128, " Full (Slow)", 16);
|
||||||
|
|
||||||
for (u32 i = 0; i < 3; i++)
|
for (u32 i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
if (h_cfg.verification != i)
|
if (h_cfg.verification != i)
|
||||||
{
|
|
||||||
vr_text[64 * i] = ' ';
|
vr_text[64 * i] = ' ';
|
||||||
ments[2 + i].caption = vr_text + (i * 64);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
vr_text[64 * i] = '*';
|
vr_text[64 * i] = '*';
|
||||||
ments[2 + i].caption = vr_text + (i * 64);
|
ments[2 + i].caption = vr_text + (i * 64);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&ments[5], 0, sizeof(ment_t));
|
memset(&ments[5], 0, sizeof(ment_t));
|
||||||
|
@ -551,16 +534,8 @@ void config_verification()
|
||||||
u32 *temp_verification = (u32 *)tui_do_menu(&gfx_con, &menu);
|
u32 *temp_verification = (u32 *)tui_do_menu(&gfx_con, &menu);
|
||||||
if (temp_verification != NULL)
|
if (temp_verification != NULL)
|
||||||
{
|
{
|
||||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
|
||||||
gfx_con_setpos(&gfx_con, 0, 0);
|
|
||||||
|
|
||||||
h_cfg.verification = *(u32 *)temp_verification;
|
h_cfg.verification = *(u32 *)temp_verification;
|
||||||
// Save choice to ini file.
|
_save_config();
|
||||||
if (!create_config_entry())
|
|
||||||
gfx_puts(&gfx_con, "\nConfiguration was saved!\n");
|
|
||||||
else
|
|
||||||
EPRINTF("\nConfiguration saving failed!");
|
|
||||||
gfx_puts(&gfx_con, "\nPress any key...");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(ments);
|
free(ments);
|
||||||
|
@ -604,7 +579,6 @@ void config_backlight()
|
||||||
bri_text[i * 32 + 1] = i + '0';
|
bri_text[i * 32 + 1] = i + '0';
|
||||||
memcpy(bri_text + i * 32 + 2, "0%", 3);
|
memcpy(bri_text + i * 32 + 2, "0%", 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
memcpy(bri_text + i * 32 + 1, "100%", 5);
|
memcpy(bri_text + i * 32 + 1, "100%", 5);
|
||||||
|
|
||||||
|
@ -619,16 +593,8 @@ void config_backlight()
|
||||||
u32 *temp_backlight = (u32 *)tui_do_menu(&gfx_con, &menu);
|
u32 *temp_backlight = (u32 *)tui_do_menu(&gfx_con, &menu);
|
||||||
if (temp_backlight != NULL)
|
if (temp_backlight != NULL)
|
||||||
{
|
{
|
||||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
|
||||||
gfx_con_setpos(&gfx_con, 0, 0);
|
|
||||||
|
|
||||||
h_cfg.backlight = (*(u32 *)temp_backlight) * 2;
|
h_cfg.backlight = (*(u32 *)temp_backlight) * 2;
|
||||||
//Save choice to ini file.
|
_save_config();
|
||||||
if (!create_config_entry())
|
|
||||||
gfx_puts(&gfx_con, "\nConfiguration was saved!\n");
|
|
||||||
else
|
|
||||||
EPRINTF("\nConfiguration saving failed!");
|
|
||||||
gfx_puts(&gfx_con, "\nPress any key...");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(ments);
|
free(ments);
|
||||||
|
@ -685,16 +651,8 @@ void config_auto_hos_poweroff()
|
||||||
u32 *temp_autohosoff = (u32 *)tui_do_menu(&gfx_con, &menu);
|
u32 *temp_autohosoff = (u32 *)tui_do_menu(&gfx_con, &menu);
|
||||||
if (temp_autohosoff != NULL)
|
if (temp_autohosoff != NULL)
|
||||||
{
|
{
|
||||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
|
||||||
gfx_con_setpos(&gfx_con, 0, 0);
|
|
||||||
|
|
||||||
h_cfg.autohosoff = *(u32 *)temp_autohosoff;
|
h_cfg.autohosoff = *(u32 *)temp_autohosoff;
|
||||||
// Save choice to ini file.
|
_save_config();
|
||||||
if (!create_config_entry())
|
|
||||||
gfx_puts(&gfx_con, "\nConfiguration was saved!\n");
|
|
||||||
else
|
|
||||||
EPRINTF("\nConfiguration saving failed!");
|
|
||||||
gfx_puts(&gfx_con, "\nPress any key...");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(ments);
|
free(ments);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (C) 2018-2019 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,
|
||||||
|
@ -24,11 +24,39 @@
|
||||||
|
|
||||||
static char *_strdup(char *str)
|
static char *_strdup(char *str)
|
||||||
{
|
{
|
||||||
|
if (!str)
|
||||||
|
return NULL;
|
||||||
char *res = (char *)malloc(strlen(str) + 1);
|
char *res = (char *)malloc(strlen(str) + 1);
|
||||||
strcpy(res, str);
|
strcpy(res, str);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 _find_section_name(char *lbuf, u32 lblen, char schar)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
for (i = 0; i < lblen && lbuf[i] != schar && lbuf[i] != '\n' && lbuf[i] != '\r'; i++)
|
||||||
|
;
|
||||||
|
lbuf[i] = 0;
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
ini_sec_t *_ini_create_section(link_t *dst, ini_sec_t *csec, char *name, u8 type)
|
||||||
|
{
|
||||||
|
if (csec)
|
||||||
|
{
|
||||||
|
list_append(dst, &csec->link);
|
||||||
|
csec = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
csec = (ini_sec_t *)malloc(sizeof(ini_sec_t));
|
||||||
|
csec->name = _strdup(name);
|
||||||
|
csec->type = type;
|
||||||
|
|
||||||
|
return csec;
|
||||||
|
}
|
||||||
|
|
||||||
int ini_parse(link_t *dst, char *ini_path, bool is_dir)
|
int ini_parse(link_t *dst, char *ini_path, bool is_dir)
|
||||||
{
|
{
|
||||||
u32 lblen;
|
u32 lblen;
|
||||||
|
@ -43,6 +71,7 @@ int ini_parse(link_t *dst, char *ini_path, bool is_dir)
|
||||||
|
|
||||||
memcpy(filename, ini_path, pathlen + 1);
|
memcpy(filename, ini_path, pathlen + 1);
|
||||||
|
|
||||||
|
// Get all ini filenames.
|
||||||
if (is_dir)
|
if (is_dir)
|
||||||
{
|
{
|
||||||
filelist = dirlist(filename, "*.ini", false);
|
filelist = dirlist(filename, "*.ini", false);
|
||||||
|
@ -57,6 +86,7 @@ int ini_parse(link_t *dst, char *ini_path, bool is_dir)
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
// Copy ini filename in path string.
|
||||||
if (is_dir)
|
if (is_dir)
|
||||||
{
|
{
|
||||||
if (filelist[k * 256])
|
if (filelist[k * 256])
|
||||||
|
@ -68,6 +98,7 @@ int ini_parse(link_t *dst, char *ini_path, bool is_dir)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Open ini.
|
||||||
if (f_open(&fp, filename, FA_READ) != FR_OK)
|
if (f_open(&fp, filename, FA_READ) != FR_OK)
|
||||||
{
|
{
|
||||||
free(filelist);
|
free(filelist);
|
||||||
|
@ -89,75 +120,31 @@ int ini_parse(link_t *dst, char *ini_path, bool is_dir)
|
||||||
|
|
||||||
if (lblen > 2 && lbuf[0] == '[') // Create new section.
|
if (lblen > 2 && lbuf[0] == '[') // Create new section.
|
||||||
{
|
{
|
||||||
if (csec)
|
_find_section_name(lbuf, lblen, ']');
|
||||||
{
|
|
||||||
list_append(dst, &csec->link);
|
|
||||||
csec = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 i;
|
csec = _ini_create_section(dst, csec, &lbuf[1], INI_CHOICE);
|
||||||
for (i = 0; i < lblen && lbuf[i] != ']' && lbuf[i] != '\n' && lbuf[i] != '\r'; i++)
|
|
||||||
;
|
|
||||||
lbuf[i] = 0;
|
|
||||||
|
|
||||||
csec = (ini_sec_t *)malloc(sizeof(ini_sec_t));
|
|
||||||
csec->name = _strdup(&lbuf[1]);
|
|
||||||
csec->type = INI_CHOICE;
|
|
||||||
list_init(&csec->kvs);
|
list_init(&csec->kvs);
|
||||||
}
|
}
|
||||||
else if (lblen > 2 && lbuf[0] == '{') //Create new caption.
|
else if (lblen > 2 && lbuf[0] == '{') //Create new caption.
|
||||||
{
|
{
|
||||||
if (csec)
|
_find_section_name(lbuf, lblen, '}');
|
||||||
{
|
|
||||||
list_append(dst, &csec->link);
|
|
||||||
csec = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 i;
|
csec = _ini_create_section(dst, csec, &lbuf[1], INI_CAPTION);
|
||||||
for (i = 0; i < lblen && lbuf[i] != '}' && lbuf[i] != '\n' && lbuf[i] != '\r'; i++)
|
|
||||||
;
|
|
||||||
lbuf[i] = 0;
|
|
||||||
|
|
||||||
csec = (ini_sec_t *)malloc(sizeof(ini_sec_t));
|
|
||||||
csec->name = _strdup(&lbuf[1]);
|
|
||||||
csec->type = INI_CAPTION;
|
|
||||||
csec->color = 0xFF0AB9E6;
|
csec->color = 0xFF0AB9E6;
|
||||||
}
|
}
|
||||||
else if (lblen > 2 && lbuf[0] == '#') //Create empty lines and comments.
|
else if (lblen > 2 && lbuf[0] == '#') //Create empty lines and comments.
|
||||||
{
|
{
|
||||||
if (csec)
|
_find_section_name(lbuf, lblen, '\0');
|
||||||
{
|
|
||||||
list_append(dst, &csec->link);
|
|
||||||
csec = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 i;
|
csec = _ini_create_section(dst, csec, &lbuf[1], INI_COMMENT);
|
||||||
for (i = 0; i < lblen && lbuf[i] != '\n' && lbuf[i] != '\r'; i++)
|
|
||||||
;
|
|
||||||
lbuf[i] = 0;
|
|
||||||
|
|
||||||
csec = (ini_sec_t *)malloc(sizeof(ini_sec_t));
|
|
||||||
csec->name = _strdup(&lbuf[1]);
|
|
||||||
csec->type = INI_COMMENT;
|
|
||||||
}
|
}
|
||||||
else if (lblen < 2)
|
else if (lblen < 2)
|
||||||
{
|
{
|
||||||
if (csec)
|
csec = _ini_create_section(dst, csec, NULL, INI_NEWLINE);
|
||||||
{
|
|
||||||
list_append(dst, &csec->link);
|
|
||||||
csec = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
csec = (ini_sec_t *)malloc(sizeof(ini_sec_t));
|
|
||||||
csec->name = NULL;
|
|
||||||
csec->type = INI_NEWLINE;
|
|
||||||
}
|
}
|
||||||
else if (csec && csec->type == INI_CHOICE) //Extract key/value.
|
else if (csec && csec->type == INI_CHOICE) //Extract key/value.
|
||||||
{
|
{
|
||||||
u32 i;
|
u32 i = _find_section_name(lbuf, lblen, '=');
|
||||||
for (i = 0; i < lblen && lbuf[i] != '=' && lbuf[i] != '\n' && lbuf[i] != '\r'; i++)
|
|
||||||
;
|
|
||||||
lbuf[i] = 0;
|
|
||||||
|
|
||||||
ini_kv_t *kv = (ini_kv_t *)malloc(sizeof(ini_kv_t));
|
ini_kv_t *kv = (ini_kv_t *)malloc(sizeof(ini_kv_t));
|
||||||
kv->key = _strdup(&lbuf[0]);
|
kv->key = _strdup(&lbuf[0]);
|
||||||
|
@ -169,8 +156,11 @@ int ini_parse(link_t *dst, char *ini_path, bool is_dir)
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
|
|
||||||
if (csec)
|
if (csec)
|
||||||
|
{
|
||||||
list_append(dst, &csec->link);
|
list_append(dst, &csec->link);
|
||||||
|
if (is_dir)
|
||||||
|
csec = NULL;
|
||||||
|
}
|
||||||
} while (is_dir);
|
} while (is_dir);
|
||||||
|
|
||||||
free(filename);
|
free(filename);
|
||||||
|
|
Loading…
Reference in a new issue