1#ifndef NO_IDENT
2static char *Id = "$Id: wildcard.c,v 1.1 2004/05/03 13:12:10 tom Exp $";
3#endif
4
5/*
6 * wildcard.c - perform wildcard expansion for non-UNIX configurations
7 */
8
9#include "system.h"
10
11#if HAVE_STDLIB_H
12# include <stdlib.h>
13#endif
14
15#if HAVE_STRING_H
16# include <string.h>
17#endif
18
19#if SYS_MSDOS || SYS_OS2
20# if SYS_MSDOS
21#  include <dos.h>
22#  include <dir.h>		/* defines MAXPATH */
23#  define FILENAME_MAX MAXPATH
24# endif
25# define DeclareFind(p)		struct find_t p
26# define DirEntryStr(p)		p.name
27# define DirFindFirst(path,p)	(!_dos_findfirst(path, 0, &p))
28# define DirFindNext(p)		(!_dos_findnext(&p))
29#endif
30
31#if SYS_VMS
32
33#include <starlet.h>		/* DEC-C (e.g., sys$parse) */
34#include <stdio.h>		/* perror */
35
36#include <rms.h>
37#include <descrip.h>
38
39#endif /* SYS_VMS */
40
41int
42has_wildcard(char *path)
43{
44#if SYS_VMS
45    return (strstr(path, "...") != 0
46	    || strchr(path, '*') != 0
47	    || strchr(path, '?') != 0);
48#else /* SYS_MSDOS, SYS_OS2 */
49    return (strchr(path, '*') != 0
50	    || strchr(path, '?') != 0);
51#endif
52}
53
54int
55expand_wildcard(char *path, int initiate)
56{
57#if SYS_MSDOS || SYS_OS2
58    static DeclareFind(p);
59    static char temp[FILENAME_MAX + 1];
60    register char *leaf;
61
62    if ((leaf = strchr(path, '/')) == 0
63	&& (leaf = strchr(path, '\\')) == 0)
64	leaf = path;
65    else
66	leaf++;
67
68    if ((initiate && DirFindFirst(strcpy(temp, path), p))
69	|| DirFindNext(p)) {
70	(void) strcpy(leaf, DirEntryStr(p));
71	return TRUE;
72    }
73#endif /* SYS_MSDOS || SYS_OS2 */
74#if SYS_VMS
75    static struct FAB zfab;
76    static struct NAM znam;
77    static char my_esa[NAM$C_MAXRSS];	/* expanded: SYS$PARSE */
78    static char my_rsa[NAM$C_MAXRSS];	/* expanded: SYS$SEARCH */
79
80    if (initiate) {
81	zfab = cc$rms_fab;
82	zfab.fab$l_fop = FAB$M_NAM;
83	zfab.fab$l_nam = &znam;	/* FAB => NAM block     */
84	zfab.fab$l_dna = "*.*;";	/* Default-selection    */
85	zfab.fab$b_dns = strlen(zfab.fab$l_dna);
86
87	zfab.fab$l_fna = path;
88	zfab.fab$b_fns = strlen(path);
89
90	znam = cc$rms_nam;
91	znam.nam$b_ess = sizeof(my_esa);
92	znam.nam$l_esa = my_esa;
93	znam.nam$b_rss = sizeof(my_rsa);
94	znam.nam$l_rsa = my_rsa;
95
96	if (sys$parse(&zfab) != RMS$_NORMAL) {
97	    perror(path);
98	    exit(EXIT_FAILURE);
99	}
100    }
101    if (sys$search(&zfab) == RMS$_NORMAL) {
102	strncpy(path, my_rsa, znam.nam$b_rsl)[znam.nam$b_rsl] = '\0';
103	return (TRUE);
104    }
105#endif /* SYS_VMS */
106#if SYS_MSDOS
107#endif
108    return FALSE;
109}
110