mirror of
https://github.com/jarun/nnn.git
synced 2024-11-28 05:41:31 +00:00
One-pass key-val pair parsing for bms and plugs
This commit is contained in:
parent
ac8b56ecc2
commit
425c0559a5
52
src/nnn.c
52
src/nnn.c
|
@ -936,7 +936,7 @@ static inline size_t xstrlen(const char *s)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *xstrdup(const char* s)
|
static char *xstrdup(const char *s)
|
||||||
{
|
{
|
||||||
size_t len = xstrlen(s) + 1;
|
size_t len = xstrlen(s) + 1;
|
||||||
char *ptr = malloc(len);
|
char *ptr = malloc(len);
|
||||||
|
@ -2928,45 +2928,35 @@ static int xlink(char *prefix, char *path, char *curfname, char *buf, int *prese
|
||||||
|
|
||||||
static bool parsekvpair(kv **arr, char **envcpy, const uchar id, uchar *items)
|
static bool parsekvpair(kv **arr, char **envcpy, const uchar id, uchar *items)
|
||||||
{
|
{
|
||||||
uint maxitems = 0, i = 0;
|
const uchar INCR = 8;
|
||||||
|
uint i = 0;
|
||||||
char *nextkey;
|
char *nextkey;
|
||||||
|
kv *kvarr = NULL;
|
||||||
char *ptr = getenv(env_cfg[id]);
|
char *ptr = getenv(env_cfg[id]);
|
||||||
kv *kvarr;
|
|
||||||
|
|
||||||
if (!ptr || !*ptr)
|
if (!ptr || !*ptr)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
nextkey = ptr;
|
|
||||||
while (*nextkey)
|
|
||||||
if (*nextkey++ == ':')
|
|
||||||
++maxitems;
|
|
||||||
|
|
||||||
if (!maxitems || maxitems > 100)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
*arr = calloc(maxitems, sizeof(kv));
|
|
||||||
if (!arr) {
|
|
||||||
xerror();
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
kvarr = *arr;
|
|
||||||
|
|
||||||
*envcpy = xstrdup(ptr);
|
*envcpy = xstrdup(ptr);
|
||||||
if (!*envcpy) {
|
if (!*envcpy) {
|
||||||
xerror();
|
xerror();
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear trailing ;s */
|
|
||||||
if (*--nextkey == ';')
|
|
||||||
*(*envcpy + (nextkey - ptr)) = '\0';
|
|
||||||
|
|
||||||
ptr = *envcpy;
|
ptr = *envcpy;
|
||||||
nextkey = ptr;
|
nextkey = ptr;
|
||||||
|
|
||||||
while (*ptr && i < maxitems) {
|
while (*ptr && i < 100) {
|
||||||
if (ptr == nextkey) {
|
if (ptr == nextkey) {
|
||||||
|
if (!(i & (INCR - 1))) {
|
||||||
|
kvarr = xrealloc(kvarr, sizeof(kv) * (i + INCR));
|
||||||
|
*arr = kvarr;
|
||||||
|
if (!kvarr) {
|
||||||
|
xerror();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
memset(kvarr + i, 0, sizeof(kv) * INCR);
|
||||||
|
}
|
||||||
kvarr[i].key = (uchar)*ptr;
|
kvarr[i].key = (uchar)*ptr;
|
||||||
if (*++ptr != ':')
|
if (*++ptr != ':')
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -2986,18 +2976,8 @@ static bool parsekvpair(kv **arr, char **envcpy, const uchar id, uchar *items)
|
||||||
++ptr;
|
++ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
maxitems = i;
|
*items = i;
|
||||||
|
return (i != 0);
|
||||||
if (kvarr[i - 1].val && *kvarr[i - 1].val == '\0')
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
/* Redundant check so far, all paths will get evaluated and fail */
|
|
||||||
//for (i = 0; i < maxitems && kvarr[i].key; ++i)
|
|
||||||
// if (xstrlen(kvarr[i].val) >= PATH_MAX)
|
|
||||||
// return FALSE;
|
|
||||||
|
|
||||||
*items = maxitems;
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue