Переглянути джерело

One-pass key-val pair parsing for bms and plugs

master
Arun Prakash Jana 4 роки тому
джерело
коміт
425c0559a5
Не вдалося знайти GPG ключ що відповідає даному підпису Ідентифікатор GPG ключа: A75979F35C080412
1 змінених файлів з 16 додано та 36 видалено
  1. +16
    -36
      src/nnn.c

+ 16
- 36
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);
}

/*


Завантаження…
Відмінити
Зберегти