/* input_scrub.c - Break up input buffers into whole numbers of lines.
Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 2000, 2001, 2003
+ 2000, 2001, 2003, 2005, 2006, 2007, 2008
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
GAS 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)
+ the Free Software Foundation; either version 3, or (at your option)
any later version.
GAS is distributed in the hope that it will be useful,
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
02110-1301, USA. */
-#include <errno.h> /* Need this to make errno declaration right */
#include "as.h"
#include "input-file.h"
#include "sb.h"
#define BEFORE_SIZE (1)
#define AFTER_SIZE (1)
+#ifndef TC_EOL_IN_INSN
+#define TC_EOL_IN_INSN(P) 0
+#endif
+
static char *buffer_start; /*->1st char of full buffer area. */
static char *partial_where; /*->after last full line in buffer. */
static int partial_size; /* >=0. Number of chars in partial line in buffer. */
buffer_length = input_file_buffer_size ();
sb_index = -1;
- buffer_start = xmalloc ((BEFORE_SIZE + buffer_length + buffer_length + AFTER_SIZE));
+ buffer_start = (char *) xmalloc ((BEFORE_SIZE + buffer_length
+ + buffer_length + AFTER_SIZE));
memcpy (buffer_start, BEFORE_STRING, (int) BEFORE_SIZE);
return saved;
buffer_length = input_file_buffer_size ();
- buffer_start = xmalloc ((BEFORE_SIZE + buffer_length + buffer_length + AFTER_SIZE));
+ buffer_start = (char *) xmalloc ((BEFORE_SIZE + buffer_length
+ + buffer_length + AFTER_SIZE));
memcpy (buffer_start, BEFORE_STRING, (int) BEFORE_SIZE);
/* Line number things. */
sb_add_char (&from_sb, '\n');
}
sb_scrub_and_add_sb (&from_sb, from);
+
+ /* Make sure the parser looks at defined contents when it scans for
+ e.g. end-of-line at the end of a macro. */
+ sb_add_char (&from_sb, 0);
+ from_sb.len--;
+
sb_index = 1;
/* These variables are reset by input_scrub_push. Restore them
if (partial_size)
{
- memcpy (buffer_start + BEFORE_SIZE, partial_where,
- (unsigned int) partial_size);
+ memmove (buffer_start + BEFORE_SIZE, partial_where,
+ (unsigned int) partial_size);
memcpy (buffer_start + BEFORE_SIZE, save_source, AFTER_SIZE);
}
limit = input_file_give_next_buffer (buffer_start
if (limit)
{
register char *p; /* Find last newline. */
-
- for (p = limit - 1; *p != '\n'; --p)
+ /* Terminate the buffer to avoid confusing TC_EOL_IN_INSN. */
+ *limit = '\0';
+ for (p = limit - 1; *p != '\n' || TC_EOL_IN_INSN (p); --p)
;
++p;
limoff = limit - buffer_start;
buffer_length += input_file_buffer_size ();
- buffer_start = xrealloc (buffer_start,
- (BEFORE_SIZE
- + 2 * buffer_length
- + AFTER_SIZE));
+ buffer_start = (char *) xrealloc (buffer_start,
+ (BEFORE_SIZE
+ + 2 * buffer_length
+ + AFTER_SIZE));
*bufp = buffer_start + BEFORE_SIZE;
limit = input_file_give_next_buffer (buffer_start + limoff);
return NULL;
}
- for (p = limit - 1; *p != '\n'; --p)
+ /* Terminate the buffer to avoid confusing TC_EOL_IN_INSN. */
+ *limit = '\0';
+ for (p = limit - 1; *p != '\n' || TC_EOL_IN_INSN (p); --p)
;
++p;
}
Returns nonzero if the filename actually changes. */
int
-new_logical_line (char *fname, /* DON'T destroy it! We point to it! */
- int line_number)
+new_logical_line_flags (char *fname, /* DON'T destroy it! We point to it! */
+ int line_number,
+ int flags)
{
+ switch (flags)
+ {
+ case 0:
+ break;
+ case 1:
+ if (line_number != -1)
+ abort ();
+ break;
+ case 1 << 1:
+ case 1 << 2:
+ /* FIXME: we could check that include nesting is correct. */
+ break;
+ default:
+ abort ();
+ }
+
if (line_number >= 0)
logical_input_line = line_number;
- else if (line_number == -2 && logical_input_line > 0)
- --logical_input_line;
+ else if (line_number == -1 && fname && !*fname && (flags & (1 << 2)))
+ {
+ logical_input_file = physical_input_file;
+ logical_input_line = physical_input_line;
+ fname = NULL;
+ }
if (fname
&& (logical_input_file == NULL
else
return 0;
}
+
+int
+new_logical_line (char *fname, int line_number)
+{
+ return new_logical_line_flags (fname, line_number, 0);
+}
+
\f
/* Return the current file name and line number.
namep should be char * const *, but there are compilers which screw