/* input_scrub.c - Break up input buffers into whole numbers of lines.
- Copyright (C) 1987-2014 Free Software Foundation, Inc.
+ Copyright (C) 1987-2016 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
source line numbers. Whenever we open a file we must fill in
physical_input_file. So if it is NULL we have not opened any files yet. */
-static char *physical_input_file;
-static char *logical_input_file;
+static const char *physical_input_file;
+static const char *logical_input_file;
/* 1-origin line number in a source file. */
/* A line ends in '\n' or eof. */
int partial_size;
char save_source[AFTER_SIZE];
size_t buffer_length;
- char * physical_input_file;
- char * logical_input_file;
+ const char * physical_input_file;
+ const char * logical_input_file;
unsigned int physical_input_line;
int logical_input_line;
size_t sb_index;
{
struct input_save *saved;
- saved = (struct input_save *) xmalloc (sizeof *saved);
+ saved = XNEW (struct input_save);
saved->saved_position = saved_position;
saved->buffer_start = buffer_start;
input_file_begin (); /* Reinitialize! */
logical_input_line = -1;
- logical_input_file = (char *) NULL;
+ logical_input_file = NULL;
buffer_length = input_file_buffer_size ();
sb_index = -1;
- buffer_start = (char *) xmalloc ((BEFORE_SIZE + buffer_length
- + buffer_length + AFTER_SIZE));
+ buffer_start = XNEWVEC (char, (BEFORE_SIZE + buffer_length
+ + buffer_length + AFTER_SIZE + 1));
memcpy (buffer_start, BEFORE_STRING, (int) BEFORE_SIZE);
return saved;
buffer_length = input_file_buffer_size ();
- buffer_start = (char *) xmalloc ((BEFORE_SIZE + buffer_length
- + buffer_length + AFTER_SIZE));
+ buffer_start = XNEWVEC (char, (BEFORE_SIZE + buffer_length
+ + buffer_length + AFTER_SIZE + 1));
memcpy (buffer_start, BEFORE_STRING, (int) BEFORE_SIZE);
/* Line number things. */
logical_input_line = -1;
- logical_input_file = (char *) NULL;
+ logical_input_file = 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 (flag_m68k_mri);
Return start of caller's part of buffer. */
char *
-input_scrub_new_file (char *filename)
+input_scrub_new_file (const char *filename)
{
input_file_open (filename, !flag_no_comments);
physical_input_file = filename[0] ? filename : _("{standard input}");
input_scrub_new_file. */
char *
-input_scrub_include_file (char *filename, char *position)
+input_scrub_include_file (const char *filename, char *position)
{
next_saved_file = input_scrub_push (position);
return input_scrub_new_file (filename);
}
--macro_nest;
partial_where = NULL;
+ partial_size = 0;
if (next_saved_file != NULL)
*bufp = input_scrub_pop (next_saved_file);
return partial_where;
return partial_where;
}
- *bufp = buffer_start + BEFORE_SIZE;
-
if (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
- + BEFORE_SIZE
- + partial_size);
- if (limit)
+
+ while (1)
{
- char *p; /* Find last newline. */
- /* 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;
-
- while (p <= buffer_start + BEFORE_SIZE)
+ char *p;
+
+ *bufp = buffer_start + BEFORE_SIZE;
+ limit = input_file_give_next_buffer (buffer_start
+ + BEFORE_SIZE
+ + partial_size);
+ if (!limit)
{
- int limoff;
-
- limoff = limit - buffer_start;
- buffer_length += input_file_buffer_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);
-
- 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;
- }
+ if (partial_size == 0)
+ break;
+ as_warn (_("end of file not at end of a line; newline inserted"));
+ p = buffer_start + BEFORE_SIZE + partial_size;
+ *p++ = '\n';
+ limit = p;
+ }
+ else
+ {
/* Terminate the buffer to avoid confusing TC_EOL_IN_INSN. */
*limit = '\0';
+
+ /* Find last newline. */
for (p = limit - 1; *p != '\n' || TC_EOL_IN_INSN (p); --p)
;
++p;
}
- partial_where = p;
- partial_size = limit - p;
- memcpy (save_source, partial_where, (int) AFTER_SIZE);
- memcpy (partial_where, AFTER_STRING, (int) AFTER_SIZE);
- }
- else
- {
- partial_where = 0;
- if (partial_size > 0)
+ if (p != buffer_start + BEFORE_SIZE)
{
- as_warn (_("partial line at end of file ignored"));
+ partial_where = p;
+ partial_size = limit - p;
+ memcpy (save_source, partial_where, (int) AFTER_SIZE);
+ memcpy (partial_where, AFTER_STRING, (int) AFTER_SIZE);
+ return partial_where;
}
- /* 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)
- {
- *bufp = input_scrub_pop (next_saved_file); /* Pop state */
- /* partial_where is now correct to return, since we popped it. */
- }
+ partial_size = limit - (buffer_start + BEFORE_SIZE);
+ buffer_length += input_file_buffer_size ();
+ buffer_start = XRESIZEVEC (char, buffer_start,
+ (BEFORE_SIZE
+ + 2 * buffer_length
+ + AFTER_SIZE + 1));
}
- return (partial_where);
+
+ /* Tell the listing we've finished the file. */
+ LISTING_EOF ();
+
+ /* If we should pop to another file at EOF, do it. */
+ partial_where = NULL;
+ if (next_saved_file)
+ *bufp = input_scrub_pop (next_saved_file);
+
+ return partial_where;
}
\f
/* The remaining part of this file deals with line numbers, error
Returns nonzero if the filename actually changes. */
int
-new_logical_line_flags (char *fname, /* DON'T destroy it! We point to it! */
+new_logical_line_flags (const char *fname, /* DON'T destroy it! We point to it! */
int line_number,
int flags)
{
}
int
-new_logical_line (char *fname, int line_number)
+new_logical_line (const 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
- up declarations like that, and it's easier to avoid it. */
+/* Return the current file name and line number. */
-void
-as_where (char **namep, unsigned int *linep)
+const char *
+as_where (unsigned int *linep)
{
if (logical_input_file != NULL
&& (linep == NULL || logical_input_line >= 0))
{
- *namep = logical_input_file;
if (linep != NULL)
*linep = logical_input_line;
+ return logical_input_file;
}
else if (physical_input_file != NULL)
{
- *namep = physical_input_file;
if (linep != NULL)
*linep = physical_input_line;
+ return physical_input_file;
}
else
{
- *namep = 0;
if (linep != NULL)
*linep = 0;
+ return NULL;
}
}