1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-13 01:31:18 +02:00

zsh-workers/9966

This commit is contained in:
Tanaka Akira 2000-03-02 10:05:55 +00:00
parent c41f9e8f8b
commit 097e2d70cd
3 changed files with 24 additions and 14 deletions

View file

@ -1304,9 +1304,10 @@ noderef(Functions)
for a description of how autoloaded functions are searched). for a description of how autoloaded functions are searched).
If there is at least one var(function) argument, the wordcode for all 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 these functions will be put in the created wordcode var(file) (if that
files containing the code for multiple functions are intended to be name does not end in tt(.zwc), this extension is automatically
used as elements of the tt(FPATH)/tt(fpath) special array. 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 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 be expanded. If the tt(-r) option is given, the function(s) in the

View file

@ -52,7 +52,9 @@ example(fpath=(~/myfuncs $fpath)
autoload myfunc1 myfunc2 ...) autoload myfunc1 myfunc2 ...)
The elements of the tt(fpath) array may also name wordcode files 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 functions, in which case the file is treated like a directory
containing files for functions and will be searched for the definition containing files for functions and will be searched for the definition
of the function. of the function.

View file

@ -2361,9 +2361,12 @@ build_dump(char *nam, char *dump, char **files, int ali, int map)
LinkNode node; LinkNode node;
struct fdhead head; struct fdhead head;
wordcode pre[FD_PRELEN]; wordcode pre[FD_PRELEN];
char *file, **ofiles = files, **oofiles = files, *name, *tail; char *file, **ofiles = files, **oofiles = files, *tail;
Eprog prog; Eprog prog;
if (!strsfx(FD_EXT, dump))
dump = dyncat(dump, FD_EXT);
if ((dfd = open(dump, O_WRONLY|O_CREAT, 0600)) < 0) { if ((dfd = open(dump, O_WRONLY|O_CREAT, 0600)) < 0) {
zerrnam(nam, "can't write dump file: %s", dump, 0); zerrnam(nam, "can't write dump file: %s", dump, 0);
return 1; 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.strs = prog->strs - ((char *) prog->prog);
head.hlen = (sizeof(struct fdhead) / sizeof(wordcode)) + head.hlen = (sizeof(struct fdhead) / sizeof(wordcode)) +
(strlen(*ofiles) + sizeof(wordcode)) / sizeof(wordcode); (strlen(*ofiles) + sizeof(wordcode)) / sizeof(wordcode);
for (name = tail = *ofiles; *name; name++) if ((tail = strrchr(*ofiles, '/')))
if (*name == '/') tail++;
tail = name + 1; else
tail= *ofiles;
head.tail = tail - *ofiles; head.tail = tail - *ofiles;
if (other) if (other)
fdswap((Wordcode) &head, sizeof(head) / sizeof(wordcode)); fdswap((Wordcode) &head, sizeof(head) / sizeof(wordcode));
@ -2539,20 +2543,23 @@ load_dump_file(char *dump, int other, int len)
Eprog Eprog
try_dump_file(char *dump, char *name, char *func) try_dump_file(char *dump, char *name, char *func)
{ {
char *file;
int isrec = 0; int isrec = 0;
Wordcode d; Wordcode d;
FDHead h; FDHead h;
FuncDump f; FuncDump f;
file = (strsfx(FD_EXT, dump) ? dump : dyncat(dump, FD_EXT));
rec: rec:
d = NULL; d = NULL;
for (f = dumps; f; f = f->next) for (f = dumps; f; f = f->next)
if (!strcmp(dump, f->name)) { if (!strcmp(file, f->name)) {
d = f->map; d = f->map;
break; break;
} }
if (!f && (isrec || !(d = load_dump_header(dump)))) { if (!f && (isrec || !(d = load_dump_header(file)))) {
if (!isrec) { if (!isrec) {
struct stat stc, stn; struct stat stc, stn;
char *p = (char *) zhalloc(strlen(dump) + strlen(name) + 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); sprintf(p, "%s/%s%s", dump, name, FD_EXT);
/* Ignore the dump file if it is older than the normal one. */ /* 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; return NULL;
if (!(d = load_dump_header(dump = p))) if (!(d = load_dump_header(file = p)))
return NULL; return NULL;
} else } else
@ -2594,7 +2601,7 @@ try_dump_file(char *dump, char *name, char *func)
return prog; return prog;
} else if (fdflags(d) & FDF_MAP) { } 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; isrec = 1;
goto rec; goto rec;
} else { } else {
@ -2602,7 +2609,7 @@ try_dump_file(char *dump, char *name, char *func)
Patprog *pp; Patprog *pp;
int np, fd, po = h->npats * sizeof(Patprog); 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)) + lseek(fd, ((h->start * sizeof(wordcode)) +
((fdflags(d) & FDF_OTHER) ? fdother(d) : 0)), 0) < 0) { ((fdflags(d) & FDF_OTHER) ? fdother(d) : 0)), 0) < 0) {
if (fd >= 0) if (fd >= 0)