OSDN Git Service

2007-04-06 Colin Walters <walters@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / java / jcf-io.c
index 2119770..10de9d2 100644 (file)
@@ -1,20 +1,23 @@
 /* Utility routines for finding and reading Java(TM) .class files.
-   Copyright (C) 1996, 1997, 1998, 1999, 2000  Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005,
+   2006, 2007 Free Software Foundation, Inc.
 
-This program is free software; you can redistribute it and/or modify
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
-This program is distributed in the hope that it will be useful,
+GCC is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING.  If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  
+along with GCC; see the file COPYING.  If not, write to
+the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  
 
 Java and all Java-based marks are trademarks or registered trademarks
 of Sun Microsystems, Inc. in the United States and other countries.
@@ -24,11 +27,18 @@ The Free Software Foundation is independent of Sun Microsystems, Inc.  */
 
 #include "config.h"
 #include "system.h"
+#include "coretypes.h"
+#include "tm.h"
 
 #include "jcf.h"
 #include "tree.h"
 #include "toplev.h"
 #include "java-tree.h"
+#include "hashtab.h"
+#if JCF_USE_SCANDIR
+#include <dirent.h>
+#include <fnmatch.h>
+#endif
 
 #include "zlib.h"
 
@@ -38,8 +48,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc.  */
 #endif
 
 int
-DEFUN(jcf_unexpected_eof, (jcf, count),
-      JCF *jcf AND int count ATTRIBUTE_UNUSED)
+jcf_unexpected_eof (JCF *jcf, int count ATTRIBUTE_UNUSED)
 {
   if (jcf->filename)
     fprintf (stderr, "Premature end of .class file %s.\n", jcf->filename);
@@ -49,8 +58,7 @@ DEFUN(jcf_unexpected_eof, (jcf, count),
 }
 
 void
-DEFUN(jcf_trim_old_input, (jcf),
-      JCF *jcf)
+jcf_trim_old_input (JCF *jcf)
 {
   int count = jcf->read_ptr - jcf->buffer;
   if (count > 0)
@@ -62,8 +70,7 @@ DEFUN(jcf_trim_old_input, (jcf),
 }
 
 int
-DEFUN(jcf_filbuf_from_stdio, (jcf, count),
-      JCF *jcf AND int count)
+jcf_filbuf_from_stdio (JCF *jcf, int count)
 {
   FILE *file = (FILE*) (jcf->read_state);
   if (count > jcf->buffer_end - jcf->read_ptr)
@@ -98,8 +105,7 @@ struct ZipFile *SeenZipFiles = NULL;
 */
 
 ZipFile *
-DEFUN(opendir_in_zip, (zipfile, is_system),
-      const char *zipfile AND int is_system)
+opendir_in_zip (const char *zipfile, int is_system)
 {
   struct ZipFile* zipf;
   char magic [4];
@@ -114,7 +120,6 @@ DEFUN(opendir_in_zip, (zipfile, is_system),
   zipf->next = SeenZipFiles;
   zipf->name = (char*)(zipf+1);
   strcpy (zipf->name, zipfile);
-  SeenZipFiles = zipf;
   fd = open (zipfile, O_RDONLY | O_BINARY);
   zipf->fd = fd;
   if (fd < 0)
@@ -129,11 +134,21 @@ DEFUN(opendir_in_zip, (zipfile, is_system),
     {
       jcf_dependency_add_file (zipfile, is_system);
       if (read (fd, magic, 4) != 4 || GET_u4 (magic) != (JCF_u4)ZIPMAGIC)
-       return NULL;
+       {
+         free (zipf);
+         close (fd);
+         return NULL;
+       }
       lseek (fd, 0L, SEEK_SET);
       if (read_zip_archive (zipf) != 0)
-       return NULL;
+       {
+         free (zipf);
+         close (fd);
+         return NULL;
+       }
     }
+
+  SeenZipFiles = zipf;  
   return zipf;
 }
 
@@ -144,9 +159,8 @@ DEFUN(opendir_in_zip, (zipfile, is_system),
 */
 
 int
-DEFUN(open_in_zip, (jcf, zipfile, zipmember, is_system),
-      JCF *jcf AND const char *zipfile AND const char *zipmember
-      AND int is_system)
+open_in_zip (JCF *jcf, const char *zipfile, const char *zipmember,
+            int is_system)
 {
   ZipDirectory *zipd;
   int i, len;
@@ -179,80 +193,54 @@ DEFUN(open_in_zip, (jcf, zipfile, zipmember, is_system),
 /* Read data from zip archive member. */
 
 int
-DEFUN(read_zip_member, (jcf, zipd, zipf),
-      JCF *jcf AND  ZipDirectory *zipd AND ZipFile *zipf)
+read_zip_member (JCF *jcf,  ZipDirectory *zipd, ZipFile *zipf)
 {
-         jcf->filbuf = jcf_unexpected_eof;
-         jcf->zipd = (void *)zipd;
-
-         if (zipd->compression_method == Z_NO_COMPRESSION)
-           {
-             jcf->buffer = ALLOC (zipd->size);
-             jcf->buffer_end = jcf->buffer + zipd->size;
-             jcf->read_ptr = jcf->buffer;
-             jcf->read_end = jcf->buffer_end;
-             if (lseek (zipf->fd, zipd->filestart, 0) < 0
-                 || read (zipf->fd, jcf->buffer, zipd->size) != (long) zipd->size)
-               return -2;
-           }
-         else
-           {
-             char *buffer;
-             z_stream d_stream; /* decompression stream */
-             d_stream.zalloc = (alloc_func) 0;
-             d_stream.zfree = (free_func) 0;
-             d_stream.opaque = (voidpf) 0;
-
-             jcf->buffer = ALLOC (zipd->uncompressed_size);
-             d_stream.next_out = jcf->buffer;
-             d_stream.avail_out = zipd->uncompressed_size;
-             jcf->buffer_end = jcf->buffer + zipd->uncompressed_size;
-             jcf->read_ptr = jcf->buffer;
-             jcf->read_end = jcf->buffer_end;
-             buffer = ALLOC (zipd->size);
-             d_stream.next_in = buffer;
-             d_stream.avail_in = zipd->size;
-             if (lseek (zipf->fd, zipd->filestart, 0) < 0
-                 || read (zipf->fd, buffer, zipd->size) != (long) zipd->size)
-               return -2;
-             /* Handle NO_HEADER using undocumented zlib feature.
-                 This is a very common hack.  */
-             inflateInit2 (&d_stream, -MAX_WBITS);
-             inflate (&d_stream, Z_NO_FLUSH);
-             inflateEnd (&d_stream);
-             FREE (buffer);
-           }
+  jcf->filbuf = jcf_unexpected_eof;
+  jcf->zipd = zipd;
 
-         return 0;
-}
-
-#if JCF_USE_STDIO
-const char *
-DEFUN(open_class, (filename, jcf, stream, dep_name),
-      const char *filename AND JCF *jcf AND FILE* stream
-      AND const char *dep_name)
-{
-  if (jcf)
+  if (zipd->compression_method == Z_NO_COMPRESSION)
     {
-      if (dep_name != NULL)
-       jcf_dependency_add_file (dep_name, 0);
-      JCF_ZERO (jcf);
-      jcf->buffer = NULL;
-      jcf->buffer_end = NULL;
-      jcf->read_ptr = NULL;
-      jcf->read_end = NULL;
-      jcf->read_state = stream;
-      jcf->filename = filename;
-      jcf->filbuf = jcf_filbuf_from_stdio;
+      jcf->buffer = XNEWVEC (unsigned char, zipd->size);
+      jcf->buffer_end = jcf->buffer + zipd->size;
+      jcf->read_ptr = jcf->buffer;
+      jcf->read_end = jcf->buffer_end;
+      if (lseek (zipf->fd, zipd->filestart, 0) < 0
+         || read (zipf->fd, jcf->buffer, zipd->size) != (long) zipd->size)
+       return -2;
     }
   else
-    fclose (stream);
-  return filename;
+    {
+      char *buffer;
+      z_stream d_stream; /* decompression stream */
+      d_stream.zalloc = (alloc_func) 0;
+      d_stream.zfree = (free_func) 0;
+      d_stream.opaque = (voidpf) 0;
+
+      jcf->buffer = XNEWVEC (unsigned char, zipd->uncompressed_size);
+      d_stream.next_out = jcf->buffer;
+      d_stream.avail_out = zipd->uncompressed_size;
+      jcf->buffer_end = jcf->buffer + zipd->uncompressed_size;
+      jcf->read_ptr = jcf->buffer;
+      jcf->read_end = jcf->buffer_end;
+      buffer = XNEWVEC (char, zipd->size);
+      d_stream.next_in = (unsigned char *) buffer;
+      d_stream.avail_in = zipd->size;
+      if (lseek (zipf->fd, zipd->filestart, 0) < 0
+         || read (zipf->fd, buffer, zipd->size) != (long) zipd->size)
+       return -2;
+      /* Handle NO_HEADER using undocumented zlib feature.
+        This is a very common hack.  */
+      inflateInit2 (&d_stream, -MAX_WBITS);
+      inflate (&d_stream, Z_NO_FLUSH);
+      inflateEnd (&d_stream);
+      free (buffer);
+    }
+
+  return 0;
 }
-#else
+
 const char *
-DEFUN(open_class, (filename, jcf, fd, dep_name),
-      const char *filename AND JCF *jcf AND int fd AND const char *dep_name)
+open_class (const char *filename, JCF *jcf, int fd, const char *dep_name)
 {
   if (jcf)
     {
@@ -266,12 +254,12 @@ DEFUN(open_class, (filename, jcf, fd, dep_name),
       if (dep_name != NULL)
        jcf_dependency_add_file (dep_name, 0);
       JCF_ZERO (jcf);
-      jcf->buffer = ALLOC (stat_buf.st_size);
+      jcf->buffer = XNEWVEC (unsigned char, stat_buf.st_size);
       jcf->buffer_end = jcf->buffer + stat_buf.st_size;
       jcf->read_ptr = jcf->buffer;
       jcf->read_end = jcf->buffer_end;
       jcf->read_state = NULL;
-      jcf->filename = filename;
+      jcf->filename = xstrdup (filename);
       if (read (fd, jcf->buffer, stat_buf.st_size) != stat_buf.st_size)
        {
          perror ("Failed to read .class file");
@@ -284,57 +272,209 @@ DEFUN(open_class, (filename, jcf, fd, dep_name),
     close (fd);
   return filename;
 }
-#endif
 
 
 const char *
-DEFUN(find_classfile, (filename, jcf, dep_name),
-      char *filename AND JCF *jcf AND const char *dep_name)
+find_classfile (char *filename, JCF *jcf, const char *dep_name)
 {
-#if JCF_USE_STDIO
-  FILE *stream = fopen (filename, "rb");
-  if (stream == NULL)
-    return NULL;
-  return open_class (arg, jcf, stream, dep_name);
-#else
   int fd = open (filename, O_RDONLY | O_BINARY);
   if (fd < 0)
     return NULL;
   return open_class (filename, jcf, fd, dep_name);
+}
+
+#if JCF_USE_SCANDIR
+
+/* A comparison function (as for qsort) that compares KEY (a char *
+   giving the basename of a file) with the name stored in ENTRY (a
+   dirent **).  */
+
+static int
+compare_path (const void *key, const void *entry)
+{
+  return strcmp ((const char *) key, 
+                (*((const struct dirent **) entry))->d_name);
+}
+
+/* Returns nonzero if ENTRY names a .java or .class file.  */
+
+static int
+java_or_class_file (const struct dirent *entry)
+{
+  const char *base = lbasename (entry->d_name);
+  return (fnmatch ("*.java", base, 0) == 0 || 
+         fnmatch ("*.class", base, 0) == 0);
+}
+
+/* Information about the files present in a particular directory.  */
+typedef struct memoized_dirlist_entry 
+{
+  /* The name of the directory.  */
+  const char *dir;
+  /* The number of .java and .class files present, or -1 if we could
+     not, for some reason, obtain the list.  */
+  int num_files;
+  /* The .java and .class files in the directory, in alphabetical
+     order.  */
+  struct dirent **files;
+} memoized_dirlist_entry;
+
+/* A hash function for a memoized_dirlist_entry.  */
+static hashval_t
+memoized_dirlist_hash (const void *entry)
+{
+  const memoized_dirlist_entry *mde = (const memoized_dirlist_entry *) entry;
+  return htab_hash_string (mde->dir);
+}
+
+/* Returns true if ENTRY (a memoized_dirlist_entry *) corresponds to
+   the directory given by KEY (a char *) giving the directory 
+   name.  */
+
+static int
+memoized_dirlist_lookup_eq (const void *entry, const void *key)
+{
+  return strcmp ((const char *) key,
+                ((const memoized_dirlist_entry *) entry)->dir) == 0;
+}
+
+/* A hash table mapping directory names to the lists of .java and
+   .class files in that directory.  */
+
+static htab_t memoized_dirlists;
+
 #endif
+
+/* Like stat, but avoids actually making the stat system call if we
+   know that it cannot succeed.  FILENAME and BUF are as for stat.  */
+
+static int
+caching_stat (char *filename, struct stat *buf)
+{
+#if JCF_USE_SCANDIR
+  char *sep;
+  char origsep = 0;
+  char *base;
+  memoized_dirlist_entry *dent;
+  void **slot;
+  struct memoized_dirlist_entry temp;
+  
+  /* If the hashtable has not already been created, create it now.  */
+  if (!memoized_dirlists)
+    memoized_dirlists = htab_create (37,
+                                    memoized_dirlist_hash,
+                                    memoized_dirlist_lookup_eq,
+                                    NULL);
+
+  /* Get the name of the directory.  */
+  sep = strrchr (filename, DIR_SEPARATOR);
+#ifdef DIR_SEPARATOR_2
+  if (! sep)
+    sep = strrchr (filename, DIR_SEPARATOR_2);
+#endif
+  if (sep)
+    {
+      origsep = *sep;
+      *sep = '\0';
+      base = sep + 1;
+    }
+  else
+    base = filename;
+
+  /* Obtain the entry for this directory from the hash table.  This
+     approach is ok since we know that the hash function only looks at
+     the directory name.  */
+  temp.dir = filename;
+  temp.num_files = 0;
+  temp.files = NULL;
+  slot = htab_find_slot (memoized_dirlists, &temp, INSERT);
+  if (!*slot)
+    {
+      /* We have not already scanned this directory; scan it now.  */
+      dent = XNEW (memoized_dirlist_entry);
+      dent->dir = xstrdup (filename);
+      /* Unfortunately, scandir is not fully standardized.  In
+        particular, the type of the function pointer passed as the
+        third argument sometimes takes a "const struct dirent *"
+        parameter, and sometimes just a "struct dirent *".  We cast
+        to (void *) and use __extension__ so that either way it is
+        quietly accepted.  FIXME: scandir is not in POSIX.  */
+      dent->num_files = __extension__ scandir (filename, &dent->files, 
+                                              (void *) java_or_class_file, 
+                                              alphasort);
+      *slot = dent;
+    }
+  else
+    dent = *((memoized_dirlist_entry **) slot);
+
+  /* Put the separator back.  */
+  if (sep)
+    *sep = origsep;
+
+  /* If the file is not in the list, there is no need to stat it; it
+     does not exist.  */
+  if (dent->num_files != -1
+      && !bsearch (base, dent->files, dent->num_files,
+                  sizeof (struct dirent *), compare_path))
+    return -1;
+#endif
+  
+  return stat (filename, buf);
 }
 
+/* Returns 1 if the CLASSNAME (really a char *) matches the name
+   stored in TABLE_ENTRY (also a char *).  */
+
+static int
+memoized_class_lookup_eq (const void *table_entry, const void *classname)
+{
+  return strcmp ((const char *)classname, (const char *)table_entry) == 0;
+}
+
+/* A hash table keeping track of class names that were not found
+   during class lookup.  (There is no need to cache the values
+   associated with names that were found; they are saved in
+   IDENTIFIER_CLASS_VALUE.)  */
+static htab_t memoized_class_lookups;
+
 /* Returns a freshly malloc'd string with the fully qualified pathname
-   of the .class file for the class CLASSNAME.  Returns NULL on
-   failure.  If JCF != NULL, it is suitably initialized.
-   SOURCE_OK is true if we should also look for .java file. */
+   of the .class file for the class CLASSNAME.  CLASSNAME must be
+   allocated in permanent storage; this function may retain a pointer
+   to it.  Returns NULL on failure.  If JCF != NULL, it is suitably
+   initialized.  SOURCE_OK is true if we should also look for .java
+   file. */
 
 const char *
-DEFUN(find_class, (classname, classname_length, jcf, source_ok),
-      const char *classname AND int classname_length AND JCF *jcf AND int source_ok)
-
+find_class (const char *classname, int classname_length, JCF *jcf)
 {
-#if JCF_USE_STDIO
-  FILE *stream;
-#else
   int fd;
-#endif
-  int i, k, java = -1, class = -1;
-  struct stat java_buf, class_buf;
+  int i, k, class = -1;
+  struct stat class_buf;
   char *dep_file;
   void *entry;
-  char *java_buffer;
+  int buflen;
+  char *buffer;
+  hashval_t hash;
+
+  /* Create the hash table, if it does not already exist.  */
+  if (!memoized_class_lookups)
+    memoized_class_lookups = htab_create (37, 
+                                         htab_hash_string, 
+                                         memoized_class_lookup_eq,
+                                         NULL);
+
+  /* Loop for this class in the hashtable.  If it is present, we've
+     already looked for this class and failed to find it.  */
+  hash = htab_hash_string (classname);
+  if (htab_find_with_hash (memoized_class_lookups, classname, hash))
+    return NULL;
 
   /* Allocate and zero out the buffer, since we don't explicitly put a
      null pointer when we're copying it below.  */
-  int buflen = jcf_path_max_len () + classname_length + 10;
-  char *buffer = (char *) ALLOC (buflen);
+  buflen = jcf_path_max_len () + classname_length + 10;
+  buffer = ALLOC (buflen);
   memset (buffer, 0, buflen);
 
-  java_buffer = (char *) alloca (buflen);
-
-  jcf->java_source = 0;
-
   for (entry = jcf_path_start (); entry != NULL; entry = jcf_path_next (entry))
     {
       const char *path_name = jcf_path_name (entry);
@@ -381,114 +521,38 @@ DEFUN(find_class, (classname, classname_length, jcf, source_ok),
              else
                continue;
            }
-         class = stat (buffer, &class_buf);
-       }
-
-      if (source_ok)
-       {
-         /* Compute name of .java file.  */
-         int l, m;
-         strcpy (java_buffer, path_name);
-         l = strlen (java_buffer);
-         for (m = 0; m < classname_length; ++m)
-           java_buffer[m + l] = (classname[m] == '.' ? '/' : classname[m]);
-         strcpy (java_buffer + m + l, ".java");
-         java = stat (java_buffer, &java_buf);
-         if (java == 0)
-           break;
+         class = caching_stat(buffer, &class_buf);
        }
     }
 
-  /* We preferably pick a class file if we have a chance. If the source
-     file is newer than the class file, we issue a warning and parse the
-     source file instead.
-     There should be a flag to allow people have the class file picked
-     up no matter what. FIXME. */
-  if (! java && ! class && java_buf.st_mtime > class_buf.st_mtime)
-    {
-      if (flag_newer)
-       warning ("source file for class `%s' is newer than its matching class file.  Source file `%s' used instead", classname, java_buffer);
-      class = -1;
-    }
-
-  if (! java)
-    dep_file = java_buffer;
-  else
-    dep_file = buffer;
-#if JCF_USE_STDIO
-  if (!class)
-    {
-      SOURCE_FRONTEND_DEBUG (("Trying %s", buffer));
-      stream = fopen (buffer, "rb");
-      if (stream)
-       goto found;
-    }
-  /* Give .java a try, if necessary */
-  if (!java)
-    {
-      strcpy (buffer, java_buffer);
-      SOURCE_FRONTEND_DEBUG (("Trying %s", buffer));
-      stream = fopen (buffer, "r");
-      if (stream)
-       {
-         jcf->java_source = 1;
-         goto found;
-       }
-    }
-#else
+  dep_file = buffer;
   if (!class)
     {
       SOURCE_FRONTEND_DEBUG ((stderr, "[Class selected: %s]\n",
                              classname+classname_length-
                              (classname_length <= 30 ? 
                               classname_length : 30)));
-      fd = open (buffer, O_RDONLY | O_BINARY);
+      fd = JCF_OPEN_EXACT_CASE (buffer, O_RDONLY | O_BINARY);
       if (fd >= 0)
        goto found;
     }
-  /* Give .java a try, if necessary */
-  if (!java)
-    {
-      strcpy (buffer, java_buffer);
-      SOURCE_FRONTEND_DEBUG ((stderr, "[Source selected: %s]\n",
-                             classname+classname_length-
-                             (classname_length <= 30 ? 
-                              classname_length : 30)));
-      fd = open (buffer, O_RDONLY);
-      if (fd >= 0)
-       {
-         jcf->java_source = 1;
-         goto found;
-       }
-    }
-#endif
 
   free (buffer);
+
+  /* Remember that this class could not be found so that we do not
+     have to look again.  */
+  *htab_find_slot_with_hash (memoized_class_lookups, classname, hash, INSERT) 
+    = (void *) classname;
+
   return NULL;
  found:
-#if JCF_USE_STDIO
-  if (jcf->java_source)
-    return NULL;               /* FIXME */
-  else
-    return open_class (buffer, jcf, stream, dep_file);
-#else
-  if (jcf->java_source)
-    {
-      JCF_ZERO (jcf);          /* JCF_FINISH relies on this */
-      jcf->java_source = 1;
-      jcf->filename = xstrdup (buffer);
-      close (fd);              /* We use STDIO for source file */
-    }
-  else
-    buffer = (char *) open_class (buffer, jcf, fd, dep_file);
+  buffer = (char *) open_class (buffer, jcf, fd, dep_file);
   jcf->classname = xstrdup (classname);
   return buffer;
-#endif
 }
 
 void
-DEFUN(jcf_print_char, (stream, ch),
-      FILE *stream AND int ch)
+jcf_print_char (FILE *stream, int ch)
 {
   switch (ch)
     {
@@ -519,8 +583,7 @@ DEFUN(jcf_print_char, (stream, ch),
 /* Print UTF8 string at STR of length LENGTH bytes to STREAM. */
 
 void
-DEFUN(jcf_print_utf8, (stream, str, length),
-      FILE *stream AND register const unsigned char *str AND int length)
+jcf_print_utf8 (FILE *stream, const unsigned char *str, int length)
 {
   const unsigned char * limit = str + length;
   while (str < limit)
@@ -538,9 +601,8 @@ DEFUN(jcf_print_utf8, (stream, str, length),
 /* Same as jcf_print_utf8, but print IN_CHAR as OUT_CHAR. */
 
 void
-DEFUN(jcf_print_utf8_replace, (stream, str, length, in_char, out_char),
-      FILE *stream AND const unsigned char *str AND int length
-      AND int in_char AND int out_char)
+jcf_print_utf8_replace (FILE *stream, const unsigned char *str, int length,
+                       int in_char, int out_char)
 {
   const unsigned char *limit = str + length;
   while (str < limit)
@@ -562,8 +624,7 @@ DEFUN(jcf_print_utf8_replace, (stream, str, length, in_char, out_char),
    any classes, fields, or methods are valid.*/
 
 int
-DEFUN(verify_constant_pool, (jcf),
-      JCF *jcf)
+verify_constant_pool (JCF *jcf)
 {
   int i, n;
   for (i = 1; i < JPOOL_SIZE (jcf); i++)
@@ -612,12 +673,11 @@ DEFUN(verify_constant_pool, (jcf),
 }
 
 void
-DEFUN(format_uint, (buffer, value, base),
-      char *buffer AND uint64 value AND int base)
+format_uint (char *buffer, uint64 value, int base)
 {
 #define WRITE_BUF_SIZE (4 + sizeof(uint64) * 8)
   char buf[WRITE_BUF_SIZE];
-  register char *buf_ptr = buf+WRITE_BUF_SIZE; /* End of buf. */
+  char *buf_ptr = buf+WRITE_BUF_SIZE; /* End of buf. */
   int chars_written;
   int i;
 
@@ -637,8 +697,7 @@ DEFUN(format_uint, (buffer, value, base),
 }
 
 void
-DEFUN(format_int, (buffer, value, base),
-      char *buffer AND jlong value AND int base)
+format_int (char *buffer, jlong value, int base)
 {
   uint64 abs_value;
   if (value < 0)