コード例 #1
0
ファイル: input-scrub.c プロジェクト: AhmadTux/DragonFlyBSD
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;
}
コード例 #2
0
ファイル: input-scrub.c プロジェクト: 0mp/freebsd
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);
}
コード例 #3
0
ファイル: input-scrub.c プロジェクト: AhmadTux/DragonFlyBSD
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);
}
コード例 #4
0
ファイル: input-scrub.c プロジェクト: Distrotech/binutils
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;
}