hartman@uiucdcsm.cs.uiuc.edu (03/02/88)
/* Written 1:08 pm Feb 29, 1988 by woo@pioneer.arpa in uiucdcsm:comp.os.vms */
/* ---------- "Wild card expansion under VAX11-C:" ---------- */
How does one expand wildcards in command line arguments in
VAX11-C under VMS? It is possible to write a *.CLD and use
DCL but there should be similar services callable from C.
If you have a code fragment which which does this, please
either post it or mail me a copy.
Thanks.
Alex
/* End of text from uiucdcsm:comp.os.vms */
The folowing code fragment should do what you want. I just pieced it together
from a program I wrote a couple of years back, so please forgive any omissions
or typographical errors I may have just introduced. It should handle both
"*" and "%" wildcard characters.
Pay special attention to the comment in the code about the filename strings.
The DESCRIPTOR functions do not bother to terminate returned strings with '\0'
as C expects, so you will have to do this manually. You will also have
to pad the strings you pass to the functions with spaces, since they will
not recognize C's '\0' terminators.
--
Mark Hartman hartman@a.cs.uiuc.edu
ihnp4!uiucdcs!hartman
-------------------CUT HERE--------------------
#include <stdio.h>
#include <ctype.h>
#include <descrip.h>
#include <ssdef.h>
main()
{
static $DESCRIPTOR (generic, "");
static $DESCRIPTOR (result_spec, "");
char filename[40], wildcardfile[40];
long int context = 0;
/*
* Set filename[] to the wildcard file specification here.
* Filenames must be padded to the proper length with spaces
* when using the descriptor functions, but terminated with
* '\0' when using normal C functions.
*/
strcpy(filename, "*.c ");
generic.dsc$w_length = 40;
generic.dsc$a_pointer = filename;
strcpy(wildcardfile, " ");
result_spec.dsc$w_length = 40;
result_spec.dsc$a_pointer = wildcardfile;
if (strcspn(filename, "*") == (strcspn(filename, "%")) {
/* No wildcard, process single file, name in "filename[]" */
printf("%s\n", filename);
}
else {
lib$find_file(&generic, &result_spec, &context);
do {
/* Process file, name in "wildcardname[]" */
printf("%s\n", wildcardname);
lib$find_file (&generic, &result_spec, &context);
} while (strcspn(wildcardfile, "*") == strlen(wildcardfile));
lib$find_file_end(&context);
}
}dhesi@bsu-cs.UUCP (Rahul Dhesi) (03/03/88)
In article <28200002@uiucdcsm> hartman@uiucdcsm.cs.uiuc.edu writes: >/* ---------- "Wild card expansion under VAX11-C:" ---------- */ But there is one problem with wildcard expansion under VAX/VMS, and if anybody has a solution I would like to know. Under UNIX, if I type "echo *", I see an expanded list of filenames without any directory prefixes. But if I type "echo /usr/bin/*" I see an expanded list of full pathnames. A directory prefix is added only if I specified one. I like this. But under VAX/VMS, if I expand "*.*", I always get a complete specification of the form DEVICE:[DIRECTORY]FILENAME.EXT;v. It would be nice to be able to expand "*.*" to just filenames, without directory names etc. -- Rahul Dhesi UUCP: <backbones>!{iuvax,pur-ee,uunet}!bsu-cs!dhesi