diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2016-10-25 23:08:42 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2016-10-25 23:08:42 +0300 |
commit | 04e37f2ec691b6ba1f4e4d57e4baaccbcdd305cc (patch) | |
tree | cab9a8e7ee0d2a452bcdc532d448bc79fb2dd52e /io.c | |
parent | bfd7df7f6dffcf905c4694d6482c50a3506bd9bd (diff) | |
download | egawk-04e37f2ec691b6ba1f4e4d57e4baaccbcdd305cc.tar.gz egawk-04e37f2ec691b6ba1f4e4d57e4baaccbcdd305cc.tar.bz2 egawk-04e37f2ec691b6ba1f4e4d57e4baaccbcdd305cc.zip |
Restore null elements in paths being same as dot.
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 75 |
1 files changed, 44 insertions, 31 deletions
@@ -2598,49 +2598,62 @@ init_awkpath(path_info *pi) int len, i; int max_path; /* (# of allocated paths)-1 */ -#define INC_PATH 5 - pi->max_pathlen = 0; if ((path = getenv(pi->envname)) == NULL || *path == '\0') path = pi->dfltp[0]; - max_path = INC_PATH; + /* count number of separators */ + for (max_path = 0, p = path; *p; p++) + if (*p == envsep) + max_path++; + emalloc(pi->awkpath, char **, (max_path + 1) * sizeof(char *), "init_awkpath"); memset(pi->awkpath, 0, (max_path + 1) * sizeof(char *)); - end = start = path; + start = path; i = 0; + + if (*path == envsep) /* null entry at front of path */ + pi->awkpath[i++] = "."; + while (*start) { - while (*end && *end != envsep) - end++; - len = end - start; - if (len > 0) { - emalloc(p, char *, len + 2, "init_awkpath"); - memcpy(p, start, len); - - /* add directory punctuation if necessary */ - if (! isdirpunct(end[-1])) - p[len++] = '/'; - p[len] = '\0'; - - if (i == max_path) { - max_path += INC_PATH; - erealloc(pi->awkpath, char **, (max_path + 1) * sizeof(char *), "init_awkpath"); - memset(pi->awkpath + i, 0, (INC_PATH + 1) * sizeof(char *)); - } - pi->awkpath[i++] = p; - if (len > pi->max_pathlen) - pi->max_pathlen = len; + if (*start == envsep) { + if (start[1] == envsep) { + pi->awkpath[i++] = "."; + if (pi->max_pathlen == 0) + pi->max_pathlen = 1; + start++; + } else if (start[1] == '\0') { + pi->awkpath[i++] = "."; + if (pi->max_pathlen == 0) + pi->max_pathlen = 1; + break; + } else + start++; + } else { + for (end = start; *end && *end != envsep; end++) + continue; + + len = end - start; + if (len > 0) { + emalloc(p, char *, len + 2, "init_awkpath"); + memcpy(p, start, len); + + /* add directory punctuation if necessary */ + if (! isdirpunct(end[-1])) + p[len++] = '/'; + p[len] = '\0'; + pi->awkpath[i++] = p; + if (len > pi->max_pathlen) + pi->max_pathlen = len; + + start = end; + } else + start++; } - - /* skip one or more envsep char */ - while (*end && *end == envsep) - end++; - start = end; } - pi->awkpath[i] = NULL; -#undef INC_PATH + pi->awkpath[i] = NULL; } /* do_find_source --- search $AWKPATH for file, return NULL if not found */ |