about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>2000-03-02 10:05:55 +0000
committerTanaka Akira <akr@users.sourceforge.net>2000-03-02 10:05:55 +0000
commit097e2d70cdd55b8f8dba9c6724564f78e45529cc (patch)
treef83193a585847595aeb45a319ccca67d1f38fdbb
parentc41f9e8f8bc4ec7d83d72449b7cdf3131ba85c04 (diff)
downloadzsh-097e2d70cdd55b8f8dba9c6724564f78e45529cc.tar.gz
zsh-097e2d70cdd55b8f8dba9c6724564f78e45529cc.tar.xz
zsh-097e2d70cdd55b8f8dba9c6724564f78e45529cc.zip
zsh-workers/9966
-rw-r--r--Doc/Zsh/builtins.yo7
-rw-r--r--Doc/Zsh/func.yo4
-rw-r--r--Src/parse.c27
3 files changed, 24 insertions, 14 deletions
diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo
index 3491c8591..6435078ec 100644
--- a/Doc/Zsh/builtins.yo
+++ b/Doc/Zsh/builtins.yo
@@ -1304,9 +1304,10 @@ noderef(Functions)
 for a description of how autoloaded functions are searched).
 
 If there is at least one var(function) argument, the wordcode for all
-these functions will be put in the created wordcode var(file). Such
-files containing the code for multiple functions are intended to be
-used as elements of the tt(FPATH)/tt(fpath) special array.
+these functions will be put in the created wordcode var(file) (if that 
+name does not end in tt(.zwc), this extension is automatically
+appended). Such files containing the code for multiple functions are
+intended to be used as elements of the tt(FPATH)/tt(fpath) special array.
 
 If the tt(-U) option is given, aliases in the var(function)s will not
 be expanded. If the tt(-r) option is given, the function(s) in the
diff --git a/Doc/Zsh/func.yo b/Doc/Zsh/func.yo
index 43c063f8c..520af7ec6 100644
--- a/Doc/Zsh/func.yo
+++ b/Doc/Zsh/func.yo
@@ -52,7 +52,9 @@ example(fpath=(~/myfuncs $fpath)
 autoload myfunc1 myfunc2 ...)
 
 The elements of the tt(fpath) array may also name wordcode files
-directly. This is mostly useful for wordcode files containing multiple 
+directly. The names of these files must have the tt(.zwc) extension
+but in tt(fpath) the names may be given with or without it. This is
+mostly useful for wordcode files containing multiple 
 functions, in which case the file is treated like a directory
 containing files for functions and will be searched for the definition 
 of the function.
diff --git a/Src/parse.c b/Src/parse.c
index f0aa2d255..680828c64 100644
--- a/Src/parse.c
+++ b/Src/parse.c
@@ -2361,9 +2361,12 @@ build_dump(char *nam, char *dump, char **files, int ali, int map)
     LinkNode node;
     struct fdhead head;
     wordcode pre[FD_PRELEN];
-    char *file, **ofiles = files, **oofiles = files, *name, *tail;
+    char *file, **ofiles = files, **oofiles = files, *tail;
     Eprog prog;
 
+    if (!strsfx(FD_EXT, dump))
+	dump = dyncat(dump, FD_EXT);
+
     if ((dfd = open(dump, O_WRONLY|O_CREAT, 0600)) < 0) {
 	zerrnam(nam, "can't write dump file: %s", dump, 0);
 	return 1;
@@ -2436,9 +2439,10 @@ build_dump(char *nam, char *dump, char **files, int ali, int map)
 	    head.strs = prog->strs - ((char *) prog->prog);
 	    head.hlen = (sizeof(struct fdhead) / sizeof(wordcode)) +
 		(strlen(*ofiles) + sizeof(wordcode)) / sizeof(wordcode);
-	    for (name = tail = *ofiles; *name; name++)
-		if (*name == '/')
-		    tail = name + 1;
+	    if ((tail = strrchr(*ofiles, '/')))
+		tail++;
+	    else
+		tail= *ofiles;
 	    head.tail = tail - *ofiles;
 	    if (other)
 		fdswap((Wordcode) &head, sizeof(head) / sizeof(wordcode));
@@ -2539,20 +2543,23 @@ load_dump_file(char *dump, int other, int len)
 Eprog
 try_dump_file(char *dump, char *name, char *func)
 {
+    char *file;
     int isrec = 0;
     Wordcode d;
     FDHead h;
     FuncDump f;
 
+    file = (strsfx(FD_EXT, dump) ? dump : dyncat(dump, FD_EXT));
+
  rec:
 
     d = NULL;
     for (f = dumps; f; f = f->next)
-	if (!strcmp(dump, f->name)) {
+	if (!strcmp(file, f->name)) {
 	    d = f->map;
 	    break;
 	}
-    if (!f && (isrec || !(d = load_dump_header(dump)))) {
+    if (!f && (isrec || !(d = load_dump_header(file)))) {
 	if (!isrec) {
 	    struct stat stc, stn;
 	    char *p = (char *) zhalloc(strlen(dump) + strlen(name) +
@@ -2561,10 +2568,10 @@ try_dump_file(char *dump, char *name, char *func)
 	    sprintf(p, "%s/%s%s", dump, name, FD_EXT);
 
 	    /* Ignore the dump file if it is older than the normal one. */
-	    if (stat(p, &stc) || stat(func, &stn) || stn.st_mtime > stc.st_mtime)
+	    if (stat(p, &stc) || (!stat(func, &stn) && stn.st_mtime > stc.st_mtime))
 		return NULL;
 
-	    if (!(d = load_dump_header(dump = p)))
+	    if (!(d = load_dump_header(file = p)))
 		return NULL;
 
 	} else
@@ -2594,7 +2601,7 @@ try_dump_file(char *dump, char *name, char *func)
 
 	    return prog;
 	} else if (fdflags(d) & FDF_MAP) {
-	    load_dump_file(dump, (fdflags(d) & FDF_OTHER), fdother(d));
+	    load_dump_file(file, (fdflags(d) & FDF_OTHER), fdother(d));
 	    isrec = 1;
 	    goto rec;
 	} else {
@@ -2602,7 +2609,7 @@ try_dump_file(char *dump, char *name, char *func)
 	    Patprog *pp;
 	    int np, fd, po = h->npats * sizeof(Patprog);
 
-	    if ((fd = open(dump, O_RDONLY)) < 0 ||
+	    if ((fd = open(file, O_RDONLY)) < 0 ||
 		lseek(fd, ((h->start * sizeof(wordcode)) +
 			   ((fdflags(d) & FDF_OTHER) ? fdother(d) : 0)), 0) < 0) {
 		if (fd >= 0)