* libaout.h (struct aoutdata): Add line_buf field.
authorIan Lance Taylor <ian@airs.com>
Mon, 25 Sep 1995 20:55:50 +0000 (20:55 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 25 Sep 1995 20:55:50 +0000 (20:55 +0000)
* aoutx.h (NAME(aout,find_nearest_line)): Remove statics buffer
and filename_buffer.  Instead, use a malloc buffer stored in the
new line_buf field.  Remove length restrictions.

bfd/ChangeLog
bfd/aoutx.h

index abfd39c..e46e568 100644 (file)
@@ -5,6 +5,11 @@ Mon Sep 25 16:04:09 1995  Michael Meissner  <meissner@tiktok.cygnus.com>
 
 Mon Sep 25 11:48:02 1995  Ian Lance Taylor  <ian@cygnus.com>
 
+       * libaout.h (struct aoutdata): Add line_buf field.
+       * aoutx.h (NAME(aout,find_nearest_line)): Remove statics buffer
+       and filename_buffer.  Instead, use a malloc buffer stored in the
+       new line_buf field.  Remove length restrictions.
+
        * coffgen.c (string_size): Remove static variable.
        (debug_string_size, debug_string_section): Likewise.
        (coff_fix_symbol_name): Add string_size_p, debug_string_section_p,
index e41f724..39b6841 100644 (file)
@@ -2637,8 +2637,6 @@ NAME(aout,find_nearest_line)
 {
   /* Run down the file looking for the filename, function and linenumber */
   asymbol **p;
-  static  char buffer[100];
-  static  char filename_buffer[200];
   CONST char *directory_name = NULL;
   CONST char *main_file_name = NULL;
   CONST char *current_file_name = NULL;
@@ -2646,6 +2644,9 @@ NAME(aout,find_nearest_line)
   bfd_vma low_line_vma = 0;
   bfd_vma low_func_vma = 0;
   asymbol *func = 0;
+  size_t filelen, funclen;
+  char *buf;
+
   *filename_ptr = abfd->filename;
   *functionname_ptr = 0;
   *line_ptr = 0;
@@ -2705,39 +2706,68 @@ NAME(aout,find_nearest_line)
   }
 
  done:
-  if (*line_ptr)
+  if (*line_ptr != 0)
     main_file_name = line_file_name;
-  if (main_file_name) {
+
+  if (main_file_name == NULL
+      || main_file_name[0] == '/'
+      || directory_name == NULL)
+    filelen = 0;
+  else
+    filelen = strlen (directory_name) + strlen (main_file_name);
+  if (func == NULL)
+    funclen = 0;
+  else
+    funclen = strlen (bfd_asymbol_name (func));
+
+  if (adata (abfd).line_buf != NULL)
+    free (adata (abfd).line_buf);
+  if (filelen + funclen == 0)
+    adata (abfd).line_buf = buf = NULL;
+  else
+    {
+      adata (abfd).line_buf = buf = (char *) malloc (filelen + funclen + 2);
+      if (adata (abfd).line_buf == NULL)
+       {
+         bfd_set_error (bfd_error_no_memory);
+         return false;
+       }
+    }
+
+  if (main_file_name != NULL)
+    {
       if (main_file_name[0] == '/' || directory_name == NULL)
-         *filename_ptr = main_file_name;
-      else {
-         sprintf(filename_buffer, "%.140s%.50s",
-                 directory_name, main_file_name);
-         *filename_ptr = filename_buffer;
-      }
-  }
+       *filename_ptr = main_file_name;
+      else
+       {
+         sprintf (buf, "%s%s", directory_name, main_file_name);
+         *filename_ptr = buf;
+         buf += filelen + 1;
+       }
+    }
+
   if (func)
     {
-      CONST char *function = func->name;
+      const char *function = func->name;
       char *p;
 
       /* The caller expects a symbol name.  We actually have a
         function name, without the leading underscore.  Put the
         underscore back in, so that the caller gets a symbol name.  */
       if (bfd_get_symbol_leading_char (abfd) == '\0')
-       strncpy (buffer, function, sizeof (buffer) - 1);
+       strcpy (buf, function);
       else
        {
-         buffer[0] = bfd_get_symbol_leading_char (abfd);
-         strncpy (buffer + 1, function, sizeof (buffer) - 2);
+         buf[0] = bfd_get_symbol_leading_char (abfd);
+         strcpy (buf + 1, function);
        }
-      buffer[sizeof(buffer)-1] = 0;
       /* Have to remove : stuff */
-      p = strchr(buffer,':');
+      p = strchr (buf, ':');
       if (p != NULL)
        *p = '\0';
-      *functionname_ptr = buffer;
+      *functionname_ptr = buf;
     }
+
   return true;
 }