static struct input_save * input_scrub_push (char *saved_position) { register struct input_save *saved; saved = (struct input_save *) xmalloc (sizeof *saved); saved->saved_position = saved_position; saved->buffer_start = buffer_start; saved->partial_where = partial_where; saved->partial_size = partial_size; saved->buffer_length = buffer_length; saved->physical_input_file = physical_input_file; saved->logical_input_file = logical_input_file; saved->physical_input_line = physical_input_line; saved->logical_input_line = logical_input_line; saved->sb_index = sb_index; saved->from_sb = from_sb; saved->from_sb_is_expansion = from_sb_is_expansion; memcpy (saved->save_source, save_source, sizeof (save_source)); saved->next_saved_file = next_saved_file; saved->input_file_save = input_file_push (); input_file_begin (); /* Reinitialize! */ logical_input_line = -1; logical_input_file = (char *) NULL; buffer_length = input_file_buffer_size (); sb_index = -1; buffer_start = (char *) xmalloc ((BEFORE_SIZE + buffer_length + buffer_length + AFTER_SIZE)); memcpy (buffer_start, BEFORE_STRING, (int) BEFORE_SIZE); return saved; }
void input_scrub_begin (void) { know (strlen (BEFORE_STRING) == BEFORE_SIZE); know (strlen (AFTER_STRING) == AFTER_SIZE || (AFTER_STRING[0] == '\0' && AFTER_SIZE == 1)); input_file_begin (); buffer_length = input_file_buffer_size (); buffer_start = xmalloc ((BEFORE_SIZE + buffer_length + buffer_length + AFTER_SIZE)); memcpy (buffer_start, BEFORE_STRING, (int) BEFORE_SIZE); /* Line number things. */ logical_input_line = -1; 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 (flag_m68k_mri); }
char * input_scrub_next_buffer (char **bufp) { register char *limit; /*->just after last char of buffer. */ if (sb_index >= 0) { if (sb_index >= from_sb.len) { sb_kill (&from_sb); if (from_sb_is_expansion ) { cond_finish_check (macro_nest); #ifdef md_macro_end /* Allow the target to clean up per-macro expansion data. */ md_macro_end (); #endif } --macro_nest; partial_where = NULL; if (next_saved_file != NULL) *bufp = input_scrub_pop (next_saved_file); return partial_where; } partial_where = from_sb.ptr + from_sb.len; partial_size = 0; *bufp = from_sb.ptr + sb_index; sb_index = from_sb.len; 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) { register 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) { 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; } /* 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; } 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) { 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) { *bufp = input_scrub_pop (next_saved_file); /* Pop state */ /* partial_where is now correct to return, since we popped it. */ } } return (partial_where); }
char * input_scrub_next_buffer (char **bufp) { char *limit; /*->just after last char of buffer. */ if (sb_index != (size_t) -1) { if (sb_index >= from_sb.len) { sb_kill (&from_sb); if (from_sb_is_expansion) { cond_finish_check (macro_nest); #ifdef md_macro_end /* Allow the target to clean up per-macro expansion data. */ md_macro_end (); #endif } --macro_nest; partial_where = NULL; partial_size = 0; if (next_saved_file != NULL) *bufp = input_scrub_pop (next_saved_file); return partial_where; } partial_where = from_sb.ptr + from_sb.len; partial_size = 0; *bufp = from_sb.ptr + sb_index; sb_index = from_sb.len; return partial_where; } if (partial_size) { memmove (buffer_start + BEFORE_SIZE, partial_where, (unsigned int) partial_size); memcpy (buffer_start + BEFORE_SIZE, save_source, AFTER_SIZE); } while (1) { char *p; *bufp = buffer_start + BEFORE_SIZE; limit = input_file_give_next_buffer (buffer_start + BEFORE_SIZE + partial_size); if (!limit) { 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; } if (p != buffer_start + BEFORE_SIZE) { 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; } partial_size = limit - (buffer_start + BEFORE_SIZE); buffer_length += input_file_buffer_size (); buffer_start = (char *) xrealloc (buffer_start, (BEFORE_SIZE + 2 * buffer_length + AFTER_SIZE + 1)); } /* 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; }