OSDN Git Service

2004-02-17 Andrew Pinski <pinskia@physics.uc.edu>
[pf3gnuchains/gcc-fork.git] / gcc / mkdeps.c
index f83d82f..23af9d8 100644 (file)
@@ -1,5 +1,5 @@
 /* Dependency generator for Makefile fragments.
-   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
    Contributed by Zack Weinberg, Mar 2000
 
 This program is free software; you can redistribute it and/or modify it
@@ -37,8 +37,7 @@ struct deps
   unsigned int deps_size;
 };
 
-static const char *munge       PARAMS ((const char *));
-static const char *base_name   PARAMS ((const char *));
+static const char *munge (const char *);
 
 /* Given a filename, quote characters in that filename which are
    significant to Make.  Note that it's not possible to quote all such
@@ -46,10 +45,9 @@ static const char *base_name PARAMS ((const char *));
    not properly handled.  It isn't possible to get this right in any
    current version of Make.  (??? Still true?  Old comment referred to
    3.76.1.)  */
-   
+
 static const char *
-munge (filename)
-     const char *filename;
+munge (const char *filename)
 {
   int len;
   const char *p, *q;
@@ -107,82 +105,57 @@ munge (filename)
   return buffer;
 }
 
-/* Given a pathname, calculate the non-directory part.  This always
-   knows how to handle Unix-style pathnames, and understands VMS and
-   DOS paths on those systems.  */
-
-/* Find the base name of a (partial) pathname FNAME.
-   Returns a pointer into the string passed in.
-   Accepts Unix (/-separated) paths on all systems,
-   DOS and VMS paths on those systems.  */
-
-static const char *
-base_name (fname)
-     const char *fname;
-{
-  const char *s = fname;
-  const char *p;
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  if (ISALPHA (s[0]) && s[1] == ':') s += 2;
-  if ((p = strrchr (s, '\\'))) s = p + 1;
-#elif defined VMS
-  if ((p = strrchr (s, ':'))) s = p + 1; /* Skip device.  */
-  if ((p = strrchr (s, ']'))) s = p + 1; /* Skip directory.  */
-  if ((p = strrchr (s, '>'))) s = p + 1; /* Skip alternate (int'n'l) dir.  */
-#endif
-  if ((p = strrchr (s, '/'))) s = p + 1;
-  return s;
-}
-
 /* Public routines.  */
 
 struct deps *
-deps_init ()
+deps_init (void)
 {
-  struct deps *d = (struct deps *) xmalloc (sizeof (struct deps));
+  struct deps *d = xmalloc (sizeof (struct deps));
 
-  /* Allocate space for the vectors now.  */
+  /* Allocate space for the vectors only if we need it.  */
 
-  d->targetv = (const char **) xmalloc (2 * sizeof (const char *));
-  d->depv = (const char **) xmalloc (8 * sizeof (const char *));
+  d->targetv = 0;
+  d->depv = 0;
 
   d->ntargets = 0;
-  d->targets_size = 2;
+  d->targets_size = 0;
   d->ndeps = 0;
-  d->deps_size = 8;
+  d->deps_size = 0;
 
   return d;
 }
 
 void
-deps_free (d)
-     struct deps *d;
+deps_free (struct deps *d)
 {
   unsigned int i;
 
-  for (i = 0; i < d->ntargets; i++)
-    free ((PTR) d->targetv[i]);
+  if (d->targetv)
+    {
+      for (i = 0; i < d->ntargets; i++)
+       free ((void *) d->targetv[i]);
+      free (d->targetv);
+    }
 
-  for (i = 0; i < d->ndeps; i++)
-    free ((PTR) d->depv[i]);
+  if (d->depv)
+    {
+      for (i = 0; i < d->ndeps; i++)
+       free ((void *) d->depv[i]);
+      free (d->depv);
+    }
 
-  free (d->targetv);
-  free (d->depv);
   free (d);
 }
 
 /* Adds a target T.  We make a copy, so it need not be a permanent
    string.  QUOTE is true if the string should be quoted.  */
 void
-deps_add_target (d, t, quote)
-     struct deps *d;
-     const char *t;
-     int quote;
+deps_add_target (struct deps *d, const char *t, int quote)
 {
   if (d->ntargets == d->targets_size)
     {
-      d->targets_size *= 2;
-      d->targetv = (const char **) xrealloc (d->targetv,
+      d->targets_size = d->targets_size * 2 + 4;
+      d->targetv = xrealloc (d->targetv,
                             d->targets_size * sizeof (const char *));
     }
 
@@ -198,12 +171,8 @@ deps_add_target (d, t, quote)
    string as the default target in interpreted as stdin.  The string
    is quoted for MAKE.  */
 void
-deps_add_default_target (d, tgt)
-     struct deps *d;
-     const char *tgt;
+deps_add_default_target (struct deps *d, const char *tgt)
 {
-  char *o, *suffix;
-
   /* Only if we have no targets.  */
   if (d->ntargets)
     return;
@@ -212,45 +181,39 @@ deps_add_default_target (d, tgt)
     deps_add_target (d, "-", 1);
   else
     {
-      tgt = base_name (tgt);
-      o = (char *) alloca (strlen (tgt) + 8);
+#ifndef TARGET_OBJECT_SUFFIX
+# define TARGET_OBJECT_SUFFIX ".o"
+#endif
+      const char *start = lbasename (tgt);
+      char *o = alloca (strlen (start) + strlen (TARGET_OBJECT_SUFFIX) + 1);
+      char *suffix;
 
-      strcpy (o, tgt);
-      suffix = strrchr (o, '.');
+      strcpy (o, start);
 
-#ifndef OBJECT_SUFFIX
-# define OBJECT_SUFFIX ".o"
-#endif
+      suffix = strrchr (o, '.');
+      if (!suffix)
+        suffix = o + strlen (o);
+      strcpy (suffix, TARGET_OBJECT_SUFFIX);
 
-      if (suffix)
-       strcpy (suffix, OBJECT_SUFFIX);
-      else
-       strcat (o, OBJECT_SUFFIX);
       deps_add_target (d, o, 1);
     }
 }
 
 void
-deps_add_dep (d, t)
-     struct deps *d;
-     const char *t;
+deps_add_dep (struct deps *d, const char *t)
 {
   t = munge (t);  /* Also makes permanent copy.  */
 
   if (d->ndeps == d->deps_size)
     {
-      d->deps_size *= 2;
-      d->depv = (const char **)
-       xrealloc (d->depv, d->deps_size * sizeof (const char *));
+      d->deps_size = d->deps_size * 2 + 8;
+      d->depv = xrealloc (d->depv, d->deps_size * sizeof (const char *));
     }
   d->depv[d->ndeps++] = t;
 }
 
 void
-deps_write (d, fp, colmax)
-     const struct deps *d;
-     FILE *fp;
-     unsigned int colmax;
+deps_write (const struct deps *d, FILE *fp, unsigned int colmax)
 {
   unsigned int size, i, column;
 
@@ -297,11 +260,9 @@ deps_write (d, fp, colmax)
     }
   putc ('\n', fp);
 }
-  
+
 void
-deps_phony_targets (d, fp)
-     const struct deps *d;
-     FILE *fp;
+deps_phony_targets (const struct deps *d, FILE *fp)
 {
   unsigned int i;
 
@@ -313,3 +274,72 @@ deps_phony_targets (d, fp)
       putc ('\n', fp);
     }
 }
+
+/* Write out a deps buffer to a file, in a form that can be read back
+   with deps_restore.  Returns nonzero on error, in which case the
+   error number will be in errno.  */
+
+int
+deps_save (struct deps *deps, FILE *f)
+{
+  unsigned int i;
+
+  /* The cppreader structure contains makefile dependences.  Write out this
+     structure.  */
+
+  /* The number of dependences.  */
+  if (fwrite (&deps->ndeps, sizeof (deps->ndeps), 1, f) != 1)
+      return -1;
+  /* The length of each dependence followed by the string.  */
+  for (i = 0; i < deps->ndeps; i++)
+    {
+      size_t num_to_write = strlen (deps->depv[i]);
+      if (fwrite (&num_to_write, sizeof (size_t), 1, f) != 1)
+          return -1;
+      if (fwrite (deps->depv[i], num_to_write, 1, f) != 1)
+          return -1;
+    }
+
+  return 0;
+}
+
+/* Read back dependency information written with deps_save into
+   the deps buffer.  The third argument may be NULL, in which case
+   the dependency information is just skipped, or it may be a filename,
+   in which case that filename is skipped.  */
+
+int
+deps_restore (struct deps *deps, FILE *fd, const char *self)
+{
+  unsigned int i, count;
+  size_t num_to_read;
+  size_t buf_size = 512;
+  char *buf = xmalloc (buf_size);
+
+  /* Number of dependences.  */
+  if (fread (&count, 1, sizeof (count), fd) != sizeof (count))
+    return -1;
+
+  /* The length of each dependence string, followed by the string.  */
+  for (i = 0; i < count; i++)
+    {
+      /* Read in # bytes in string.  */
+      if (fread (&num_to_read, 1, sizeof (size_t), fd) != sizeof (size_t))
+       return -1;
+      if (buf_size < num_to_read + 1)
+       {
+         buf_size = num_to_read + 1 + 127;
+         buf = xrealloc (buf, buf_size);
+       }
+      if (fread (buf, 1, num_to_read, fd) != num_to_read)
+       return -1;
+      buf[num_to_read] = '\0';
+
+      /* Generate makefile dependencies from .pch if -nopch-deps.  */
+      if (self != NULL && strcmp (buf, self) != 0)
+        deps_add_dep (deps, buf);
+    }
+
+  free (buf);
+  return 0;
+}