|
|
1.1 ! root 1: /* wildcard.c */ ! 2: ! 3: /* Author: ! 4: * Guntram Blohm ! 5: * Buchenstrasse 19 ! 6: * 7904 Erbach, West Germany ! 7: * Tel. ++49-7305-6997 ! 8: * sorry - no regular network connection ! 9: */ ! 10: ! 11: /* this program implements wildcard expansion for elvis/dos. It works ! 12: * like UNIX echo, but uses the dos wildcard conventions ! 13: * (*.* matches all files, * matches files without extension only, ! 14: * filespecs may contain drive letters, wildcards not allowed in directory ! 15: * names). ! 16: * ! 17: * It is also #included into ctags.c, ref.c, ...; in this case, ! 18: * we don't want a main function here. ! 19: */ ! 20: ! 21: #include <stdio.h> ! 22: #ifdef __STDC__ ! 23: # include <stdlib.h> ! 24: #endif ! 25: #ifndef WILDCARD_NO_MAIN ! 26: # include "config.h" ! 27: #endif ! 28: #include "ctype.h" ! 29: #ifdef __TURBOC__ ! 30: #include <dir.h> ! 31: #endif ! 32: ! 33: #ifdef M_I86 ! 34: #define findfirst(a,b,c) _dos_findfirst(a,c,b) ! 35: #define findnext _dos_findnext ! 36: #define ffblk find_t ! 37: #define ff_name name ! 38: #include <dos.h> ! 39: #endif ! 40: ! 41: /* Atari TOS, MWC */ ! 42: #ifdef M68000 ! 43: #include <stat.h> ! 44: #include <osbind.h> ! 45: #define findfirst(a,b,c) (Fsetdta(b), (Fsfirst(a,c))) ! 46: #define findnext(x) (Fsnext()) ! 47: #define ff_name d_fname ! 48: #endif ! 49: ! 50: /* Atari TOS, GNU-C */ ! 51: #ifdef __m68k__ ! 52: #include <stat.h> ! 53: #include <osbind.h> ! 54: #define findfirst(a,b,c) (Fsetdta(b), (Fsfirst(a,c))) ! 55: #define findnext(x) (Fsnext()) ! 56: #define ff_name dta_name ! 57: #define DMABUFFER struct _dta ! 58: #endif ! 59: ! 60: #define MAXFILES 1000 ! 61: ! 62: int pstrcmp(); ! 63: #ifndef __STDC__ ! 64: extern char *calloc(); ! 65: #endif ! 66: ! 67: char *files[MAXFILES]; ! 68: int nfiles; ! 69: ! 70: #ifndef WILDCARD_NO_MAIN ! 71: ! 72: main(argc, argv) ! 73: char **argv; ! 74: { ! 75: int i; ! 76: ! 77: _ct_init(""); ! 78: for (i=1; i<argc; i++) ! 79: expand(argv[i]); ! 80: if (nfiles) ! 81: printf("%s", files[0]); ! 82: for (i=1; i<nfiles; i++) ! 83: { ! 84: printf(" %s", files[i]); ! 85: } ! 86: putchar('\n'); ! 87: return 0; ! 88: } ! 89: ! 90: #else ! 91: char **wildexpand(argc, argv) ! 92: int *argc; ! 93: char **argv; ! 94: { ! 95: int i; ! 96: ! 97: for (i=0; i<*argc; i++) ! 98: expand(argv[i]); ! 99: *argc=nfiles; ! 100: return files; ! 101: } ! 102: #endif ! 103: ! 104: expand(name) ! 105: char *name; ! 106: { ! 107: char *filespec; ! 108: int wildcard=0; ! 109: #if defined(M68000) || defined(__m68k__) ! 110: DMABUFFER findbuf; ! 111: #else ! 112: struct ffblk findbuf; ! 113: #endif ! 114: int err; ! 115: char buf[80]; ! 116: int lastn; ! 117: ! 118: strcpy(buf, name); ! 119: for (filespec=buf; *filespec; filespec++) ! 120: ; ! 121: ! 122: while (--filespec>=buf) ! 123: { if (*filespec=='?' || *filespec=='*') ! 124: wildcard=1; ! 125: if (*filespec=='/' || *filespec=='\\' || *filespec==':') ! 126: break; ! 127: } ! 128: if (!wildcard) ! 129: addfile(buf); ! 130: else ! 131: { ! 132: lastn=nfiles; ! 133: filespec++; ! 134: if ((err=findfirst(buf, &findbuf, 0))!=0) ! 135: addfile(buf); ! 136: while (!err) ! 137: { ! 138: strcpy(filespec, findbuf.ff_name); ! 139: addfile(buf); ! 140: err=findnext(&findbuf); ! 141: } ! 142: if (lastn!=nfiles) ! 143: qsort(files+lastn, nfiles-lastn, sizeof(char *), pstrcmp); ! 144: } ! 145: } ! 146: ! 147: addfile(buf) ! 148: char *buf; ! 149: { ! 150: char *p; ! 151: ! 152: for (p=buf; *p; p++) ! 153: *p=tolower(*p); ! 154: ! 155: if (nfiles<MAXFILES && (files[nfiles]=calloc(strlen(buf)+1, 1))!=0) ! 156: strcpy(files[nfiles++], buf); ! 157: } ! 158: ! 159: int pstrcmp(a, b) ! 160: char **a, **b; ! 161: { ! 162: return strcmp(*a, *b); ! 163: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.