summaryrefslogtreecommitdiff
path: root/Build/source/utils/gzip/vms/vms.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/gzip/vms/vms.c')
-rw-r--r--Build/source/utils/gzip/vms/vms.c102
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;
+}