bug-gawk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bug-gawk] null element in AWKPATH


From: arnold
Subject: Re: [bug-gawk] null element in AWKPATH
Date: Tue, 25 Oct 2016 14:06:06 -0600
User-agent: Heirloom mailx 12.4 7/29/08

"Jun T." <address@hidden> wrote:

> The document (2.5.1 in info, for example) says that a null
> element in AWKPATH is equivalent to '.'.
> For example, ":/path/A" should be equivalent to ".:/path/A".
>
> But I get the following (gawk 4.1.4):
>
> $ ls test.awk
> test.awk
> $ export AWKPATH=':/usr/local/share/awk'
> $ gawk -f test.awk data_file
> gawk: fatal: can't open source file `test.awk' for reading (No such file or 
> directory)
>
> Same for AWKLIBPATH.
>
> Is this just that the document is not up-to-date?
>
> Jun

Well, that's a nasty bug. And very embarassing, too. :-(

Below is a patch.  I will push this to Git shortly.

Thanks,

Arnold
---------------------------

diff --git a/io.c b/io.c
index 20d9ee2..931dcfe 100644
--- a/io.c
+++ b/io.c
@@ -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 */ 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]