home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1994 #1
/
monster.zip
/
monster
/
OS2
/
EMXFIX04.ZIP
/
WILDCARD.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-01-17
|
2KB
|
78 lines
/* wildcard.c (emx+gcc) -- Copyright (c) 1990-1994 by Eberhard Mattes */
#include <sys/emx.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define WPUT(x) do { \
if (new_argc >= new_alloc) \
{ \
new_alloc += 20; \
new_argv = (char **)realloc (new_argv, new_alloc * sizeof (char *)); \
if (new_argv == NULL) \
goto out_of_memory; \
} \
new_argv[new_argc++] = x; \
} while (0)
void _wildcard (int *argcp, char ***argvp)
{
int i, old_argc, new_argc, new_alloc;
char **old_argv, **new_argv;
char line[256], *p, *q;
struct _find find;
old_argc = *argcp; old_argv = *argvp;
_rfnlwr ();
for (i = 1; i < old_argc; ++i)
if (old_argv[i] != NULL &&
!(old_argv[i][-1] & (_ARG_DQUOTE|_ARG_RESPONSE)) &&
strpbrk (old_argv[i], "?*") != NULL)
break;
if (i >= old_argc)
return; /* do nothing */
new_argv = NULL; new_alloc = 0; new_argc = 0;
for (i = 0; i < old_argc; ++i)
{
if (i == 0 || old_argv[i] == NULL
|| (old_argv[i][-1] & (_ARG_DQUOTE|_ARG_RESPONSE))
|| strpbrk (old_argv[i], "?*") == NULL
|| __findfirst (old_argv[i], 0x10, &find) != 0)
WPUT (old_argv[i]);
else
{
line[0] = _ARG_NONZERO|_ARG_WILDCARD;
strcpy (line+1, old_argv[i]);
p = q = line + 1;
while (*q != 0)
{
if (*q == ':' || *q == '\\' || *q == '/')
p = q + 1;
++q;
}
do
{
if (strcmp (find.name, ".") != 0 &&
strcmp (find.name, "..") != 0)
{
strcpy (p, find.name);
_fnlwr2 (p, line+1);
q = strdup (line);
WPUT (q+1);
}
} while (__findnext (&find) == 0);
}
}
WPUT (NULL); --new_argc;
*argcp = new_argc; *argvp = new_argv;
_rfnlwr ();
return;
out_of_memory:
fputs ("Out of memory while expanding wildcards\n", stderr);
exit (255);
}