/* 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
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
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);
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
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;
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;
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)
{
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);
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)
{
* 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
/*