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