]> Git Repo - binutils.git/blobdiff - gas/input-scrub.c
1999-09-11 Donn Terry <[email protected]>
[binutils.git] / gas / input-scrub.c
index 662651f3604bd4fdb274a22f2e2b438b112dbd56..46a3bb3b7f81c0b19f10906bc066dd8c91db01df 100644 (file)
@@ -1,5 +1,6 @@
 /* input_scrub.c - Break up input buffers into whole numbers of lines.
-   Copyright (C) 1987, 1990, 1991, 1992 Free Software Foundation, Inc.
+   Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 1997
+   Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with GAS; see the file COPYING.  If not, write to
-   the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+   along with GAS; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA. */
 
 #include <errno.h>             /* Need this to make errno declaration right */
 #include "as.h"
 #include "input-file.h"
 #include "sb.h"
+#include "listing.h"
 
 /*
  * O/S independent module to supply buffers of sanitised source code
@@ -72,7 +75,7 @@ static int sb_index = -1;
 static sb from_sb;
 
 /* The number of nested sb structures we have included.  */
-static int macro_nest;
+int macro_nest;
 
 /* We can have more than one source file open at once, though the info for all
    but the latest one are saved off in a struct input_save.  These files remain
@@ -152,6 +155,7 @@ input_scrub_push (saved_position)
   logical_input_line = -1;
   logical_input_file = (char *) NULL;
   buffer_length = input_file_buffer_size ();
+  sb_index = -1;
 
   buffer_start = xmalloc ((BEFORE_SIZE + buffer_length + buffer_length + AFTER_SIZE));
   memcpy (buffer_start, BEFORE_STRING, (int) BEFORE_SIZE);
@@ -205,7 +209,7 @@ input_scrub_begin ()
   logical_input_file = (char *) NULL;
   physical_input_file = NULL;  /* No file read yet. */
   next_saved_file = NULL;      /* At EOF, don't pop to any other file */
-  do_scrub_begin ();
+  do_scrub_begin (flag_m68k_mri);
 }
 
 void
@@ -226,7 +230,7 @@ input_scrub_new_file (filename)
      char *filename;
 {
   input_file_open (filename, !flag_no_comments);
-  physical_input_file = filename[0] ? filename : "{standard input}";
+  physical_input_file = filename[0] ? filename : _("{standard input}");
   physical_input_line = 0;
 
   partial_size = 0;
@@ -256,14 +260,17 @@ input_scrub_include_sb (from, position)
      char *position;
 {
   if (macro_nest > max_macro_nest)
-    as_fatal ("macros nested too deeply");
+    as_fatal (_("macros nested too deeply"));
   ++macro_nest;
 
   next_saved_file = input_scrub_push (position);
 
   sb_new (&from_sb);
-  /* Add the sentinel required by read.c.  */
-  sb_add_char (&from_sb, '\n');
+  if (from->len >= 1 && from->ptr[0] != '\n')
+    {
+      /* Add the sentinel required by read.c.  */
+      sb_add_char (&from_sb, '\n');
+    }
   sb_add_sb (&from_sb, from);
   sb_index = 1;
 
@@ -290,6 +297,7 @@ input_scrub_next_buffer (bufp)
       if (sb_index >= from_sb.len)
        {
          sb_kill (&from_sb);
+         cond_finish_check (macro_nest);
          --macro_nest;
          partial_where = NULL;
          if (next_saved_file != NULL)
@@ -319,12 +327,37 @@ input_scrub_next_buffer (bufp)
     {
       register char *p;                /* Find last newline. */
 
-      for (p = limit; *--p != '\n';);;
+      for (p = limit - 1; *p != '\n'; --p)
+       ;
       ++p;
-      if (p <= buffer_start + BEFORE_SIZE)
+
+      while (p <= buffer_start + BEFORE_SIZE)
        {
-         as_fatal ("Source line too long. Please change file %s then rebuild assembler.", __FILE__);
+         int limoff;
+
+         limoff = limit - buffer_start;
+         buffer_length += input_file_buffer_size ();
+         buffer_start = xrealloc (buffer_start,
+                                  (BEFORE_SIZE
+                                   + 2 * buffer_length
+                                   + AFTER_SIZE));
+         *bufp = buffer_start + BEFORE_SIZE;
+         limit = input_file_give_next_buffer (buffer_start + limoff);
+
+         if (limit == NULL)
+           {
+             as_warn (_("partial line at end of file ignored"));
+             partial_where = NULL;
+             if (next_saved_file)
+               *bufp = input_scrub_pop (next_saved_file);
+             return NULL;
+           }
+
+         for (p = limit - 1; *p != '\n'; --p)
+           ;
+         ++p;
        }
+
       partial_where = p;
       partial_size = limit - p;
       memcpy (save_source, partial_where, (int) AFTER_SIZE);
@@ -335,8 +368,12 @@ input_scrub_next_buffer (bufp)
       partial_where = 0;
       if (partial_size > 0)
        {
-         as_warn ("Partial line at end of file ignored");
+         as_warn (_("Partial line at end of file ignored"));
        }
+
+      /* Tell the listing we've finished the file.  */
+      LISTING_EOF ();
+
       /* If we should pop to another file at EOF, do it. */
       if (next_saved_file)
        {
@@ -379,21 +416,27 @@ bump_line_counters ()
  * to support the .appfile pseudo-op inserted into the stream by
  * do_scrub_chars).
  * If the fname is NULL, we don't change the current logical file name.
+ * Returns nonzero if the filename actually changes.
  */
-void 
+int
 new_logical_line (fname, line_number)
      char *fname;              /* DON'T destroy it! We point to it! */
      int line_number;
 {
-  if (fname)
-    {
-      logical_input_file = fname;
-    }                          /* if we have a file name */
-
   if (line_number >= 0)
     logical_input_line = line_number;
   else if (line_number == -2 && logical_input_line > 0)
     --logical_input_line;
+
+  if (fname
+      && (logical_input_file == NULL
+         || strcmp (logical_input_file, fname)))
+    {
+      logical_input_file = fname;
+      return 1;
+    }
+  else
+    return 0;
 }                              /* new_logical_line() */
 \f
 /*
This page took 0.028337 seconds and 4 git commands to generate.