]> git.gag.com Git - debian/gzip/commitdiff
gzip 1.3.5
authorJean-loup Gailly <jloup@chorus.fr>
Wed, 24 Feb 1993 18:33:02 +0000 (18:33 +0000)
committerJean-loup Gailly <jloup@chorus.fr>
Wed, 24 Feb 1993 18:33:02 +0000 (18:33 +0000)
amiga/tailor.c [new file with mode: 0644]
amiga/utime.h [new file with mode: 0644]

diff --git a/amiga/tailor.c b/amiga/tailor.c
new file mode 100644 (file)
index 0000000..9f14cc4
--- /dev/null
@@ -0,0 +1,183 @@
+/* tailor.c -- target dependent functions
+ * Copyright (C) 1993 Carsten Steger (carsten.steger@informatik.tu-muenchen.de)
+ * 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 contains Amiga specific functions for gzip.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <error.h>
+#include <time.h>
+#include <utime.h>
+#include <exec/types.h>
+#include <dos/dos.h>
+#include <dos/dosextens.h>
+#include <dos/dosasl.h>
+#include <proto/dos.h>
+
+#define MAXPATH 1024
+#define MAXARGS 512
+
+extern struct DosLibrary *DOSBase;
+
+extern void *xmalloc(unsigned int size);
+
+static char *expand_next_file (char *pattern);
+static int in_prev_args (char *arg, char **argv, int argc);
+extern void _expand_args (int *oargc, char ***oargv);
+
+
+static char *expand_next_file (pattern)
+     char *pattern;
+{
+  long err;
+  char *pathname;
+  static struct AnchorPath *an = NULL;
+
+  pathname = NULL;
+  if (pattern == NULL)
+    err = -1;
+  else
+    do
+      {
+        if (an == NULL)
+          {
+            an = xmalloc (sizeof (struct AnchorPath) + MAXPATH);
+            memset (an, 0, sizeof (struct AnchorPath) + MAXPATH);
+            an->ap_BreakBits = SIGBREAKF_CTRL_C;
+            an->ap_Strlen = MAXPATH;
+            an->ap_Flags = APF_DOWILD;
+            err = MatchFirst (pattern, an);
+          }
+        else
+          err = MatchNext (an);
+
+        pathname = an->ap_Buf;
+      } while (err == 0 && pathname == NULL);
+
+  if (err)
+    {
+      MatchEnd (an);
+      free (an);
+      an = NULL;
+      return NULL;
+    }
+  else
+    return pathname;
+}
+
+
+static int in_prev_args (arg, argv, argc)
+     char *arg, **argv;
+     int argc;
+{
+  int i, is_in_args;
+
+  is_in_args = 0;
+  for (i = 1; i < argc - 1; i++)
+    if (stricmp (arg, argv[i]) == 0)
+      is_in_args = 1;
+  return is_in_args;
+}
+
+
+void _expand_args (oargc, oargv)
+     int *oargc;
+     char ***oargv;
+{
+  int i;
+  char *str, **argv;
+  static char buf[MAXPATH];
+  int argc, no_match_at_all, num_matches, contains_wildcards;
+
+  /* With Kickstart 1.3 wildcards can't be expanded. */
+  if (DOSBase->dl_lib.lib_Version < 37) return;
+
+  no_match_at_all = 1;
+  contains_wildcards = 0;
+  argc = 0;
+  argv = xmalloc (MAXARGS * sizeof (char *));
+
+  argv[argc++] = (*oargv)[0];
+  for (i = 1; i < *oargc; i++)
+    {
+      if (ParsePattern ((*oargv)[i], buf, MAXPATH))
+        {
+          contains_wildcards = 1;
+          num_matches = 0;
+          while (str = expand_next_file ((*oargv)[i]))
+            if (argc >= MAXARGS)
+              {
+                expand_next_file (NULL);
+                fprintf (stderr,"Too many files.\n");
+                exit (20);
+              }
+            else
+              {
+                /* Avoid duplicate entries */
+                if (!in_prev_args (str, argv, argc))
+                  {
+                    argv[argc++] = strdup (str);
+                    num_matches++;
+                  }
+              }
+          if (num_matches != 0)
+            no_match_at_all = 0;
+        }
+      else
+        if (argc >= MAXARGS)
+          {
+            fprintf (stderr,"Too many files.\n");
+            exit (20);
+          }
+        else
+          {
+            if (!in_prev_args ((*oargv)[i], argv, argc))
+              argv[argc++] = (*oargv)[i];
+          }
+    }
+  *oargc = argc;
+  *oargv = argv;
+  if (no_match_at_all && contains_wildcards) {
+    fprintf (stderr,"No match.\n");
+    exit (20);
+  }
+}
+
+
+int utime (path, times)
+     char *path;
+     struct utimbuf *times;
+{
+  struct DateStamp date;
+  LONG error;
+  time_t modtime;
+
+  /* With Kickstart 1.3 setting the filedate could be done, I guess.
+   * Maybe someone else will implement and test the code for this
+   * case (I don't have Kickstart 1.3). */
+  if (DOSBase->dl_lib.lib_Version < 37) return 0;
+
+  /* Amiga dates are counted from 1. Jan 1978 as opposed to 1. Jan 1970
+   * on Unix. Therefore we have to subtract 2922 days (8*365+2). We also
+   * have to subtract the value of __timezone since SAS/C uses "CST+06"
+   * as the default value. */
+  modtime = times->modtime - __timezone;
+  date.ds_Days = (modtime / 86400) - 2922;
+  modtime %= 86400;
+  date.ds_Minute = modtime / 60;
+  modtime %= 60;
+  date.ds_Tick = modtime * TICKS_PER_SECOND;
+  error = SetFileDate (path, &date);
+  if (error == DOSFALSE)
+    {
+      errno = EOSERR;
+      return -1;
+    }
+  return 0;
+}
diff --git a/amiga/utime.h b/amiga/utime.h
new file mode 100644 (file)
index 0000000..8c35a1a
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef _UTIME_H
+#define _UTIME_H 1
+
+#ifndef _TIME_H
+#include <time.h>
+#endif
+
+struct utimbuf {
+  time_t actime;
+  time_t modtime;
+};
+
+extern int utime (char *path, struct utimbuf *times);
+
+#endif