Beispiel #1
0
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);
}
Beispiel #2
0
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;
}