diff options
Diffstat (limited to 'Build/source/utils/gzip/vms/vms.c')
-rw-r--r-- | Build/source/utils/gzip/vms/vms.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/Build/source/utils/gzip/vms/vms.c b/Build/source/utils/gzip/vms/vms.c new file mode 100644 index 00000000000..51b891a22fb --- /dev/null +++ b/Build/source/utils/gzip/vms/vms.c @@ -0,0 +1,102 @@ +/* vms.c -- target dependent functions for VMS + * This is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License, see the file COPYING. + * + * This file was written by Karl-Jose Filler <pla_jfi@pki-nbg.philips.de> + * and updated by Jean-loup Gailly. + */ + +#include <stdio.h> + +static char **vms_argv = NULL; + +static int max_files = 10000; + +struct Str_desc { + int length; + char *addr; +}; + +vms_expand_args(old_argc, argv) + int *old_argc; + char **argv[]; +{ + int i; + int new_argc = 0; + int context, status; + char buf[255], *p; + + vms_argv = (char**)xmalloc((max_files+1)*sizeof(char*)); + + vms_argv[new_argc++] = **argv; + + for (i=1; i < *old_argc; i++) { + if (*argv[0][i] == '-') { /* switches */ + if (new_argc < max_files) { + vms_argv[new_argc++] = argv[0][i]; + } + } else { /* Files */ + context = 0; + if (find_file_c(argv[0][i], buf, sizeof(buf), &context) & 1 != 1) { + /* + * Wrong file ? + * forward it to gzip + */ + if (new_argc < max_files) { + vms_argv[new_argc++] = argv[0][i]; + } + } else { + p = (char*)xmalloc(strlen(buf)+1); + strcpy(p, buf); + if (new_argc < max_files) { + vms_argv[new_argc++] = p; + } + while (find_file_c(argv[0][i], buf, + sizeof(buf), &context) & 1 == 1) { + p = (char*)xmalloc(strlen(buf)+1); + strcpy(p, buf); + if (new_argc < max_files) { + vms_argv[new_argc++] = p; + } + } + } + } + } + if (new_argc <= max_files) { + *old_argc = new_argc; + vms_argv[new_argc] = NULL; + *argv = vms_argv; + } else { + free(vms_argv); /* the expanded file names should also be freed ... */ + vms_argv = NULL; + max_files = new_argc + 1; + vms_expand_args(old_argc, argv); + } +} + +int find_file_c(in,out,out_len,context) + char *in; + char *out; + int out_len; + int *context; +{ + struct Str_desc in_desc,out_desc; + int status; + char *p; + + in_desc.addr = in; + in_desc.length = strlen(in); + + out_desc.addr = out; + out_desc.length = out_len; + + status = lib$find_file(&in_desc,&out_desc,context); + + p = out_desc.addr; + while(*p != ' ') { + p++; + } + *p = 0; + + return status; +} |