--- libaitcfg/src/parse.c 2019/11/21 14:30:02 1.18 +++ libaitcfg/src/parse.c 2021/11/26 01:15:03 1.19 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: parse.c,v 1.18 2019/11/21 14:30:02 misho Exp $ +* $Id: parse.c,v 1.19 2021/11/26 01:15:03 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004 - 2018 +Copyright 2004 - 2021 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -269,6 +269,76 @@ skip_sec: return 0; } +/* + * cfgWriteConfigRaw() - Write config from memory by list + * + * @f = File handle + * @cfg = Config root + * @whitespace = Additional whitespace characters to file + * return: -1 error or 0 ok + */ +int +cfgWriteConfigRaw(FILE *f, cfg_root_t * __restrict cfg, int whitespace) +{ + struct tagCfg *av, *nxt; + char line[BUFSIZ] = { 0 }, szSection[STRSIZ] = { [0 ... STRSIZ - 1] = 0 }; + + if (!f || !cfg) { + cfg_SetErr(EINVAL, "Invalid parameter(s)"); + return -1; + } + + CFG_RC_LOCK(cfg); + TAILQ_FOREACH_SAFE(av, cfg, cfg_next, nxt) { + /* empty lines or comment */ + if (AIT_ISEMPTY(&av->cfg_attr)) { + if (AIT_ISEMPTY(&av->cfg_val)) + continue; + strlcpy(line, AIT_GET_STR(&av->cfg_val), sizeof line); + goto skip_sec; + } + + /* section [] */ + if (!AIT_ISEMPTY(&av->cfg_sec) && AIT_ADDR(&av->cfg_sec) && + strcmp(AIT_GET_STRZ(&av->cfg_sec), szSection)) { + strlcpy(szSection, AIT_GET_STR(&av->cfg_sec), sizeof szSection); + if (!cfg_Write(f, "\n[%s]\n", AIT_GET_STR(&av->cfg_sec))) { + LOGERR; + CFG_RC_UNLOCK(cfg); + return -1; + } + } else if (AIT_ISEMPTY(&av->cfg_sec) && *szSection) { + memset(szSection, 0, sizeof szSection); + if (!cfg_Write(f, "\n[]\n")) { + LOGERR; + CFG_RC_UNLOCK(cfg); + return -1; + } + } + + /* build line */ + memset(line, 0, sizeof line); + if (!AIT_ISEMPTY(&av->cfg_attr) && AIT_TYPE(&av->cfg_attr) == string) { + strlcpy(line, AIT_GET_STRZ(&av->cfg_attr), sizeof line); + if (whitespace) + strlcat(line, " = ", sizeof line); + else + strlcat(line, "=", sizeof line); + } + if (!AIT_ISEMPTY(&av->cfg_val) && AIT_TYPE(&av->cfg_val) == string) + strlcat(line, AIT_GET_STRZ(&av->cfg_val), sizeof line); +skip_sec: + /* write */ + if (!cfg_Write(f, "%s\n", line)) { + LOGERR; + CFG_RC_UNLOCK(cfg); + return -1; + } + } + CFG_RC_UNLOCK(cfg); + + return 0; +} /* * cfgConcatConfig() - Concat two configs into one *