mirror of
https://github.com/jarun/nnn.git
synced 2024-11-24 11:51:27 +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
|
||||
}
|
||||
|
||||
static char *xstrdup(const char* s)
|
||||
static char *xstrdup(const char *s)
|
||||
{
|
||||
size_t len = xstrlen(s) + 1;
|
||||
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)
|
||||
{
|
||||
uint maxitems = 0, i = 0;
|
||||
const uchar INCR = 8;
|
||||
uint i = 0;
|
||||
char *nextkey;
|
||||
kv *kvarr = NULL;
|
||||
char *ptr = getenv(env_cfg[id]);
|
||||
kv *kvarr;
|
||||
|
||||
if (!ptr || !*ptr)
|
||||
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);
|
||||
if (!*envcpy) {
|
||||
xerror();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Clear trailing ;s */
|
||||
if (*--nextkey == ';')
|
||||
*(*envcpy + (nextkey - ptr)) = '\0';
|
||||
|
||||
ptr = *envcpy;
|
||||
nextkey = ptr;
|
||||
|
||||
while (*ptr && i < maxitems) {
|
||||
while (*ptr && i < 100) {
|
||||
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;
|
||||
if (*++ptr != ':')
|
||||
return FALSE;
|
||||
|
@ -2986,18 +2976,8 @@ static bool parsekvpair(kv **arr, char **envcpy, const uchar id, uchar *items)
|
|||
++ptr;
|
||||
}
|
||||
|
||||
maxitems = i;
|
||||
|
||||
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;
|
||||
*items = i;
|
||||
return (i != 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue