diff options
author | Miquel van Smoorenburg <miquels@cistron.nl> | 1997-05-20 05:38:24 -0700 |
---|---|---|
committer | Miquel van Smoorenburg <miquels@cistron.nl> | 1997-05-20 05:38:24 -0700 |
commit | 4b98f8613ac91192c8dfaf42471fbe895959b6a1 (patch) | |
tree | 170d3d1e91cc1ccad6ff19fa486b9f6935bfde35 /wildcard.c |
Import elvis-tiny_1.4.orig.tar.gz
[dgit import orig elvis-tiny_1.4.orig.tar.gz]
Diffstat (limited to 'wildcard.c')
-rw-r--r-- | wildcard.c | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/wildcard.c b/wildcard.c new file mode 100644 index 0000000..2e2ea0d --- /dev/null +++ b/wildcard.c @@ -0,0 +1,140 @@ +/* wildcard.c */ + +/* Author: + * Guntram Blohm + * Buchenstrasse 19 + * 7904 Erbach, West Germany + * Tel. ++49-7305-6997 + * sorry - no regular network connection + */ + +/* this program implements wildcard expansion for elvis/dos. It works + * like UNIX echo, but uses the dos wildcard conventions + * (*.* matches all files, * matches files without extension only, + * filespecs may contain drive letters, wildcards not allowed in directory + * names). + * + * It is also #included into ctags.c, ref.c, ...; in this case, + * we don't want a main function here. + */ + +#include <stdio.h> +#include <ctype.h> +#ifdef __TURBOC__ +#include <dir.h> +#endif +#ifdef M_I86 +#define findfirst(a,b,c) _dos_findfirst(a,c,b) +#define findnext _dos_findnext +#define ffblk find_t +#define ff_name name +#include <dos.h> +#endif +#ifdef M68000 +#include <stat.h> +#include <osbind.h> +#define findfirst(a,b,c) (Fsetdta(b), (Fsfirst(a,c))) +#define findnext(x) (Fsnext()) +#define ff_name d_fname +#endif +#define MAXFILES 1000 + +int pstrcmp(); +extern char *calloc(); + +char *files[MAXFILES]; +int nfiles; + +#ifndef WILDCARD_NO_MAIN + +main(argc, argv) + char **argv; +{ + int i; + + for (i=1; i<argc; i++) + expand(argv[i]); + if (nfiles) + printf("%s", files[0]); + for (i=1; i<nfiles; i++) + { + printf(" %s", files[i]); + } + putchar('\n'); + return 0; +} + +#else +char **wildexpand(argc, argv) + int *argc; + char **argv; +{ + int i; + + for (i=0; i<*argc; i++) + expand(argv[i]); + *argc=nfiles; + return files; +} +#endif + +expand(name) + char *name; +{ + char *filespec; + int wildcard=0; +#ifdef M68000 + DMABUFFER findbuf; +#else + struct ffblk findbuf; +#endif + int err; + char buf[80]; + int lastn; + + strcpy(buf, name); + for (filespec=buf; *filespec; filespec++) + ; + + while (--filespec>=buf) + { if (*filespec=='?' || *filespec=='*') + wildcard=1; + if (*filespec=='/' || *filespec=='\\' || *filespec==':') + break; + } + if (!wildcard) + addfile(buf); + else + { + lastn=nfiles; + filespec++; + if ((err=findfirst(buf, &findbuf, 0))!=0) + addfile(buf); + while (!err) + { + strcpy(filespec, findbuf.ff_name); + addfile(buf); + err=findnext(&findbuf); + } + if (lastn!=nfiles) + qsort(files+lastn, nfiles-lastn, sizeof(char *), pstrcmp); + } +} + +addfile(buf) + char *buf; +{ + char *p; + + for (p=buf; *p; p++) + *p=tolower(*p); + + if (nfiles<MAXFILES && (files[nfiles]=calloc(strlen(buf)+1, 1))!=0) + strcpy(files[nfiles++], buf); +} + +int pstrcmp(a, b) + char **a, **b; +{ + return strcmp(*a, *b); +} |