Blame libio/genops.c

Packit Service 82fcde
/* Copyright (C) 1993-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.
Packit Service 82fcde
Packit Service 82fcde
   As a special exception, if you link the code in this file with
Packit Service 82fcde
   files compiled with a GNU compiler to produce an executable,
Packit Service 82fcde
   that does not cause the resulting executable to be covered by
Packit Service 82fcde
   the GNU Lesser General Public License.  This exception does not
Packit Service 82fcde
   however invalidate any other reasons why the executable file
Packit Service 82fcde
   might be covered by the GNU Lesser General Public License.
Packit Service 82fcde
   This exception applies to code released by its copyright holders
Packit Service 82fcde
   in files containing the exception.  */
Packit Service 82fcde
Packit Service 82fcde
/* Generic or default I/O operations. */
Packit Service 82fcde
Packit Service 82fcde
#include "libioP.h"
Packit Service 82fcde
#include <stdlib.h>
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
#include <stdbool.h>
Packit Service 82fcde
#include <sched.h>
Packit Service 82fcde
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
static _IO_lock_t list_all_lock = _IO_lock_initializer;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
static FILE *run_fp;
Packit Service 82fcde
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
static void
Packit Service 82fcde
flush_cleanup (void *not_used)
Packit Service 82fcde
{
Packit Service 82fcde
  if (run_fp != NULL)
Packit Service 82fcde
    _IO_funlockfile (run_fp);
Packit Service 82fcde
  _IO_lock_unlock (list_all_lock);
Packit Service 82fcde
}
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_un_link (struct _IO_FILE_plus *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  if (fp->file._flags & _IO_LINKED)
Packit Service 82fcde
    {
Packit Service 82fcde
      FILE **f;
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
      _IO_cleanup_region_start_noarg (flush_cleanup);
Packit Service 82fcde
      _IO_lock_lock (list_all_lock);
Packit Service 82fcde
      run_fp = (FILE *) fp;
Packit Service 82fcde
      _IO_flockfile ((FILE *) fp);
Packit Service 82fcde
#endif
Packit Service 82fcde
      if (_IO_list_all == NULL)
Packit Service 82fcde
	;
Packit Service 82fcde
      else if (fp == _IO_list_all)
Packit Service 82fcde
	_IO_list_all = (struct _IO_FILE_plus *) _IO_list_all->file._chain;
Packit Service 82fcde
      else
Packit Service 82fcde
	for (f = &_IO_list_all->file._chain; *f; f = &(*f)->_chain)
Packit Service 82fcde
	  if (*f == (FILE *) fp)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      *f = fp->file._chain;
Packit Service 82fcde
	      break;
Packit Service 82fcde
	    }
Packit Service 82fcde
      fp->file._flags &= ~_IO_LINKED;
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
      _IO_funlockfile ((FILE *) fp);
Packit Service 82fcde
      run_fp = NULL;
Packit Service 82fcde
      _IO_lock_unlock (list_all_lock);
Packit Service 82fcde
      _IO_cleanup_region_end (0);
Packit Service 82fcde
#endif
Packit Service 82fcde
    }
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_un_link)
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_link_in (struct _IO_FILE_plus *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  if ((fp->file._flags & _IO_LINKED) == 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      fp->file._flags |= _IO_LINKED;
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
      _IO_cleanup_region_start_noarg (flush_cleanup);
Packit Service 82fcde
      _IO_lock_lock (list_all_lock);
Packit Service 82fcde
      run_fp = (FILE *) fp;
Packit Service 82fcde
      _IO_flockfile ((FILE *) fp);
Packit Service 82fcde
#endif
Packit Service 82fcde
      fp->file._chain = (FILE *) _IO_list_all;
Packit Service 82fcde
      _IO_list_all = fp;
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
      _IO_funlockfile ((FILE *) fp);
Packit Service 82fcde
      run_fp = NULL;
Packit Service 82fcde
      _IO_lock_unlock (list_all_lock);
Packit Service 82fcde
      _IO_cleanup_region_end (0);
Packit Service 82fcde
#endif
Packit Service 82fcde
    }
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_link_in)
Packit Service 82fcde
Packit Service 82fcde
/* Return minimum _pos markers
Packit Service 82fcde
   Assumes the current get area is the main get area. */
Packit Service 82fcde
ssize_t _IO_least_marker (FILE *fp, char *end_p);
Packit Service 82fcde
Packit Service 82fcde
ssize_t
Packit Service 82fcde
_IO_least_marker (FILE *fp, char *end_p)
Packit Service 82fcde
{
Packit Service 82fcde
  ssize_t least_so_far = end_p - fp->_IO_read_base;
Packit Service 82fcde
  struct _IO_marker *mark;
Packit Service 82fcde
  for (mark = fp->_markers; mark != NULL; mark = mark->_next)
Packit Service 82fcde
    if (mark->_pos < least_so_far)
Packit Service 82fcde
      least_so_far = mark->_pos;
Packit Service 82fcde
  return least_so_far;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* Switch current get area from backup buffer to (start of) main get area. */
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_switch_to_main_get_area (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  char *tmp;
Packit Service 82fcde
  fp->_flags &= ~_IO_IN_BACKUP;
Packit Service 82fcde
  /* Swap _IO_read_end and _IO_save_end. */
Packit Service 82fcde
  tmp = fp->_IO_read_end;
Packit Service 82fcde
  fp->_IO_read_end = fp->_IO_save_end;
Packit Service 82fcde
  fp->_IO_save_end= tmp;
Packit Service 82fcde
  /* Swap _IO_read_base and _IO_save_base. */
Packit Service 82fcde
  tmp = fp->_IO_read_base;
Packit Service 82fcde
  fp->_IO_read_base = fp->_IO_save_base;
Packit Service 82fcde
  fp->_IO_save_base = tmp;
Packit Service 82fcde
  /* Set _IO_read_ptr. */
Packit Service 82fcde
  fp->_IO_read_ptr = fp->_IO_read_base;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* Switch current get area from main get area to (end of) backup area. */
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_switch_to_backup_area (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  char *tmp;
Packit Service 82fcde
  fp->_flags |= _IO_IN_BACKUP;
Packit Service 82fcde
  /* Swap _IO_read_end and _IO_save_end. */
Packit Service 82fcde
  tmp = fp->_IO_read_end;
Packit Service 82fcde
  fp->_IO_read_end = fp->_IO_save_end;
Packit Service 82fcde
  fp->_IO_save_end = tmp;
Packit Service 82fcde
  /* Swap _IO_read_base and _IO_save_base. */
Packit Service 82fcde
  tmp = fp->_IO_read_base;
Packit Service 82fcde
  fp->_IO_read_base = fp->_IO_save_base;
Packit Service 82fcde
  fp->_IO_save_base = tmp;
Packit Service 82fcde
  /* Set _IO_read_ptr.  */
Packit Service 82fcde
  fp->_IO_read_ptr = fp->_IO_read_end;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_switch_to_get_mode (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  if (fp->_IO_write_ptr > fp->_IO_write_base)
Packit Service 82fcde
    if (_IO_OVERFLOW (fp, EOF) == EOF)
Packit Service 82fcde
      return EOF;
Packit Service 82fcde
  if (_IO_in_backup (fp))
Packit Service 82fcde
    fp->_IO_read_base = fp->_IO_backup_base;
Packit Service 82fcde
  else
Packit Service 82fcde
    {
Packit Service 82fcde
      fp->_IO_read_base = fp->_IO_buf_base;
Packit Service 82fcde
      if (fp->_IO_write_ptr > fp->_IO_read_end)
Packit Service 82fcde
	fp->_IO_read_end = fp->_IO_write_ptr;
Packit Service 82fcde
    }
Packit Service 82fcde
  fp->_IO_read_ptr = fp->_IO_write_ptr;
Packit Service 82fcde
Packit Service 82fcde
  fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end = fp->_IO_read_ptr;
Packit Service 82fcde
Packit Service 82fcde
  fp->_flags &= ~_IO_CURRENTLY_PUTTING;
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_switch_to_get_mode)
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_free_backup_area (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  if (_IO_in_backup (fp))
Packit Service 82fcde
    _IO_switch_to_main_get_area (fp);  /* Just in case. */
Packit Service 82fcde
  free (fp->_IO_save_base);
Packit Service 82fcde
  fp->_IO_save_base = NULL;
Packit Service 82fcde
  fp->_IO_save_end = NULL;
Packit Service 82fcde
  fp->_IO_backup_base = NULL;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_free_backup_area)
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
__overflow (FILE *f, int ch)
Packit Service 82fcde
{
Packit Service 82fcde
  /* This is a single-byte stream.  */
Packit Service 82fcde
  if (f->_mode == 0)
Packit Service 82fcde
    _IO_fwide (f, -1);
Packit Service 82fcde
  return _IO_OVERFLOW (f, ch);
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (__overflow)
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
save_for_backup (FILE *fp, char *end_p)
Packit Service 82fcde
{
Packit Service 82fcde
  /* Append [_IO_read_base..end_p] to backup area. */
Packit Service 82fcde
  ssize_t least_mark = _IO_least_marker (fp, end_p);
Packit Service 82fcde
  /* needed_size is how much space we need in the backup area. */
Packit Service 82fcde
  size_t needed_size = (end_p - fp->_IO_read_base) - least_mark;
Packit Service 82fcde
  /* FIXME: Dubious arithmetic if pointers are NULL */
Packit Service 82fcde
  size_t current_Bsize = fp->_IO_save_end - fp->_IO_save_base;
Packit Service 82fcde
  size_t avail; /* Extra space available for future expansion. */
Packit Service 82fcde
  ssize_t delta;
Packit Service 82fcde
  struct _IO_marker *mark;
Packit Service 82fcde
  if (needed_size > current_Bsize)
Packit Service 82fcde
    {
Packit Service 82fcde
      char *new_buffer;
Packit Service 82fcde
      avail = 100;
Packit Service 82fcde
      new_buffer = (char *) malloc (avail + needed_size);
Packit Service 82fcde
      if (new_buffer == NULL)
Packit Service 82fcde
	return EOF;		/* FIXME */
Packit Service 82fcde
      if (least_mark < 0)
Packit Service 82fcde
	{
Packit Service 82fcde
	  __mempcpy (__mempcpy (new_buffer + avail,
Packit Service 82fcde
				fp->_IO_save_end + least_mark,
Packit Service 82fcde
				-least_mark),
Packit Service 82fcde
		     fp->_IO_read_base,
Packit Service 82fcde
		     end_p - fp->_IO_read_base);
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	memcpy (new_buffer + avail,
Packit Service 82fcde
		fp->_IO_read_base + least_mark,
Packit Service 82fcde
		needed_size);
Packit Service 82fcde
      free (fp->_IO_save_base);
Packit Service 82fcde
      fp->_IO_save_base = new_buffer;
Packit Service 82fcde
      fp->_IO_save_end = new_buffer + avail + needed_size;
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    {
Packit Service 82fcde
      avail = current_Bsize - needed_size;
Packit Service 82fcde
      if (least_mark < 0)
Packit Service 82fcde
	{
Packit Service 82fcde
	  memmove (fp->_IO_save_base + avail,
Packit Service 82fcde
		   fp->_IO_save_end + least_mark,
Packit Service 82fcde
		   -least_mark);
Packit Service 82fcde
	  memcpy (fp->_IO_save_base + avail - least_mark,
Packit Service 82fcde
		  fp->_IO_read_base,
Packit Service 82fcde
		  end_p - fp->_IO_read_base);
Packit Service 82fcde
	}
Packit Service 82fcde
      else if (needed_size > 0)
Packit Service 82fcde
	memcpy (fp->_IO_save_base + avail,
Packit Service 82fcde
		fp->_IO_read_base + least_mark,
Packit Service 82fcde
		needed_size);
Packit Service 82fcde
    }
Packit Service 82fcde
  fp->_IO_backup_base = fp->_IO_save_base + avail;
Packit Service 82fcde
  /* Adjust all the streammarkers. */
Packit Service 82fcde
  delta = end_p - fp->_IO_read_base;
Packit Service 82fcde
  for (mark = fp->_markers; mark != NULL; mark = mark->_next)
Packit Service 82fcde
    mark->_pos -= delta;
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
__underflow (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  if (_IO_vtable_offset (fp) == 0 && _IO_fwide (fp, -1) != -1)
Packit Service 82fcde
    return EOF;
Packit Service 82fcde
Packit Service 82fcde
  if (fp->_mode == 0)
Packit Service 82fcde
    _IO_fwide (fp, -1);
Packit Service 82fcde
  if (_IO_in_put_mode (fp))
Packit Service 82fcde
    if (_IO_switch_to_get_mode (fp) == EOF)
Packit Service 82fcde
      return EOF;
Packit Service 82fcde
  if (fp->_IO_read_ptr < fp->_IO_read_end)
Packit Service 82fcde
    return *(unsigned char *) fp->_IO_read_ptr;
Packit Service 82fcde
  if (_IO_in_backup (fp))
Packit Service 82fcde
    {
Packit Service 82fcde
      _IO_switch_to_main_get_area (fp);
Packit Service 82fcde
      if (fp->_IO_read_ptr < fp->_IO_read_end)
Packit Service 82fcde
	return *(unsigned char *) fp->_IO_read_ptr;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (_IO_have_markers (fp))
Packit Service 82fcde
    {
Packit Service 82fcde
      if (save_for_backup (fp, fp->_IO_read_end))
Packit Service 82fcde
	return EOF;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (_IO_have_backup (fp))
Packit Service 82fcde
    _IO_free_backup_area (fp);
Packit Service 82fcde
  return _IO_UNDERFLOW (fp);
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (__underflow)
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
__uflow (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  if (_IO_vtable_offset (fp) == 0 && _IO_fwide (fp, -1) != -1)
Packit Service 82fcde
    return EOF;
Packit Service 82fcde
Packit Service 82fcde
  if (fp->_mode == 0)
Packit Service 82fcde
    _IO_fwide (fp, -1);
Packit Service 82fcde
  if (_IO_in_put_mode (fp))
Packit Service 82fcde
    if (_IO_switch_to_get_mode (fp) == EOF)
Packit Service 82fcde
      return EOF;
Packit Service 82fcde
  if (fp->_IO_read_ptr < fp->_IO_read_end)
Packit Service 82fcde
    return *(unsigned char *) fp->_IO_read_ptr++;
Packit Service 82fcde
  if (_IO_in_backup (fp))
Packit Service 82fcde
    {
Packit Service 82fcde
      _IO_switch_to_main_get_area (fp);
Packit Service 82fcde
      if (fp->_IO_read_ptr < fp->_IO_read_end)
Packit Service 82fcde
	return *(unsigned char *) fp->_IO_read_ptr++;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (_IO_have_markers (fp))
Packit Service 82fcde
    {
Packit Service 82fcde
      if (save_for_backup (fp, fp->_IO_read_end))
Packit Service 82fcde
	return EOF;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (_IO_have_backup (fp))
Packit Service 82fcde
    _IO_free_backup_area (fp);
Packit Service 82fcde
  return _IO_UFLOW (fp);
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (__uflow)
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_setb (FILE *f, char *b, char *eb, int a)
Packit Service 82fcde
{
Packit Service 82fcde
  if (f->_IO_buf_base && !(f->_flags & _IO_USER_BUF))
Packit Service 82fcde
    free (f->_IO_buf_base);
Packit Service 82fcde
  f->_IO_buf_base = b;
Packit Service 82fcde
  f->_IO_buf_end = eb;
Packit Service 82fcde
  if (a)
Packit Service 82fcde
    f->_flags &= ~_IO_USER_BUF;
Packit Service 82fcde
  else
Packit Service 82fcde
    f->_flags |= _IO_USER_BUF;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_setb)
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_doallocbuf (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  if (fp->_IO_buf_base)
Packit Service 82fcde
    return;
Packit Service 82fcde
  if (!(fp->_flags & _IO_UNBUFFERED) || fp->_mode > 0)
Packit Service 82fcde
    if (_IO_DOALLOCATE (fp) != EOF)
Packit Service 82fcde
      return;
Packit Service 82fcde
  _IO_setb (fp, fp->_shortbuf, fp->_shortbuf+1, 0);
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_doallocbuf)
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_default_underflow (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  return EOF;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_default_uflow (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  int ch = _IO_UNDERFLOW (fp);
Packit Service 82fcde
  if (ch == EOF)
Packit Service 82fcde
    return EOF;
Packit Service 82fcde
  return *(unsigned char *) fp->_IO_read_ptr++;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_default_uflow)
Packit Service 82fcde
Packit Service 82fcde
size_t
Packit Service 82fcde
_IO_default_xsputn (FILE *f, const void *data, size_t n)
Packit Service 82fcde
{
Packit Service 82fcde
  const char *s = (char *) data;
Packit Service 82fcde
  size_t more = n;
Packit Service 82fcde
  if (more <= 0)
Packit Service 82fcde
    return 0;
Packit Service 82fcde
  for (;;)
Packit Service 82fcde
    {
Packit Service 82fcde
      /* Space available. */
Packit Service 82fcde
      if (f->_IO_write_ptr < f->_IO_write_end)
Packit Service 82fcde
	{
Packit Service 82fcde
	  size_t count = f->_IO_write_end - f->_IO_write_ptr;
Packit Service 82fcde
	  if (count > more)
Packit Service 82fcde
	    count = more;
Packit Service 82fcde
	  if (count > 20)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      f->_IO_write_ptr = __mempcpy (f->_IO_write_ptr, s, count);
Packit Service 82fcde
	      s += count;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  else if (count)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      char *p = f->_IO_write_ptr;
Packit Service 82fcde
	      ssize_t i;
Packit Service 82fcde
	      for (i = count; --i >= 0; )
Packit Service 82fcde
		*p++ = *s++;
Packit Service 82fcde
	      f->_IO_write_ptr = p;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  more -= count;
Packit Service 82fcde
	}
Packit Service 82fcde
      if (more == 0 || _IO_OVERFLOW (f, (unsigned char) *s++) == EOF)
Packit Service 82fcde
	break;
Packit Service 82fcde
      more--;
Packit Service 82fcde
    }
Packit Service 82fcde
  return n - more;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_default_xsputn)
Packit Service 82fcde
Packit Service 82fcde
size_t
Packit Service 82fcde
_IO_sgetn (FILE *fp, void *data, size_t n)
Packit Service 82fcde
{
Packit Service 82fcde
  /* FIXME handle putback buffer here! */
Packit Service 82fcde
  return _IO_XSGETN (fp, data, n);
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_sgetn)
Packit Service 82fcde
Packit Service 82fcde
size_t
Packit Service 82fcde
_IO_default_xsgetn (FILE *fp, void *data, size_t n)
Packit Service 82fcde
{
Packit Service 82fcde
  size_t more = n;
Packit Service 82fcde
  char *s = (char*) data;
Packit Service 82fcde
  for (;;)
Packit Service 82fcde
    {
Packit Service 82fcde
      /* Data available. */
Packit Service 82fcde
      if (fp->_IO_read_ptr < fp->_IO_read_end)
Packit Service 82fcde
	{
Packit Service 82fcde
	  size_t count = fp->_IO_read_end - fp->_IO_read_ptr;
Packit Service 82fcde
	  if (count > more)
Packit Service 82fcde
	    count = more;
Packit Service 82fcde
	  if (count > 20)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      s = __mempcpy (s, fp->_IO_read_ptr, count);
Packit Service 82fcde
	      fp->_IO_read_ptr += count;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  else if (count)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      char *p = fp->_IO_read_ptr;
Packit Service 82fcde
	      int i = (int) count;
Packit Service 82fcde
	      while (--i >= 0)
Packit Service 82fcde
		*s++ = *p++;
Packit Service 82fcde
	      fp->_IO_read_ptr = p;
Packit Service 82fcde
	    }
Packit Service 82fcde
	    more -= count;
Packit Service 82fcde
	}
Packit Service 82fcde
      if (more == 0 || __underflow (fp) == EOF)
Packit Service 82fcde
	break;
Packit Service 82fcde
    }
Packit Service 82fcde
  return n - more;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_default_xsgetn)
Packit Service 82fcde
Packit Service 82fcde
FILE *
Packit Service 82fcde
_IO_default_setbuf (FILE *fp, char *p, ssize_t len)
Packit Service 82fcde
{
Packit Service 82fcde
    if (_IO_SYNC (fp) == EOF)
Packit Service 82fcde
	return NULL;
Packit Service 82fcde
    if (p == NULL || len == 0)
Packit Service 82fcde
      {
Packit Service 82fcde
	fp->_flags |= _IO_UNBUFFERED;
Packit Service 82fcde
	_IO_setb (fp, fp->_shortbuf, fp->_shortbuf+1, 0);
Packit Service 82fcde
      }
Packit Service 82fcde
    else
Packit Service 82fcde
      {
Packit Service 82fcde
	fp->_flags &= ~_IO_UNBUFFERED;
Packit Service 82fcde
	_IO_setb (fp, p, p+len, 0);
Packit Service 82fcde
      }
Packit Service 82fcde
    fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end = 0;
Packit Service 82fcde
    fp->_IO_read_base = fp->_IO_read_ptr = fp->_IO_read_end = 0;
Packit Service 82fcde
    return fp;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
off64_t
Packit Service 82fcde
_IO_default_seekpos (FILE *fp, off64_t pos, int mode)
Packit Service 82fcde
{
Packit Service 82fcde
  return _IO_SEEKOFF (fp, pos, 0, mode);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_default_doallocate (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  char *buf;
Packit Service 82fcde
Packit Service 82fcde
  buf = malloc(BUFSIZ);
Packit Service 82fcde
  if (__glibc_unlikely (buf == NULL))
Packit Service 82fcde
    return EOF;
Packit Service 82fcde
Packit Service 82fcde
  _IO_setb (fp, buf, buf+BUFSIZ, 1);
Packit Service 82fcde
  return 1;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_default_doallocate)
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_init_internal (FILE *fp, int flags)
Packit Service 82fcde
{
Packit Service 82fcde
  _IO_no_init (fp, flags, -1, NULL, NULL);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_init (FILE *fp, int flags)
Packit Service 82fcde
{
Packit Service 82fcde
  IO_set_accept_foreign_vtables (&_IO_vtable_check);
Packit Service 82fcde
  _IO_init_internal (fp, flags);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
static int stdio_needs_locking;
Packit Service 82fcde
Packit Service 82fcde
/* In a single-threaded process most stdio locks can be omitted.  After
Packit Service 82fcde
   _IO_enable_locks is called, locks are not optimized away any more.
Packit Service 82fcde
   It must be first called while the process is still single-threaded.
Packit Service 82fcde
Packit Service 82fcde
   This lock optimization can be disabled on a per-file basis by setting
Packit Service 82fcde
   _IO_FLAGS2_NEED_LOCK, because a file can have user-defined callbacks
Packit Service 82fcde
   or can be locked with flockfile and then a thread may be created
Packit Service 82fcde
   between a lock and unlock, so omitting the lock is not valid.
Packit Service 82fcde
Packit Service 82fcde
   Here we have to make sure that the flag is set on all existing files
Packit Service 82fcde
   and files created later.  */
Packit Service 82fcde
void
Packit Service 82fcde
_IO_enable_locks (void)
Packit Service 82fcde
{
Packit Service 82fcde
  _IO_ITER i;
Packit Service 82fcde
Packit Service 82fcde
  if (stdio_needs_locking)
Packit Service 82fcde
    return;
Packit Service 82fcde
  stdio_needs_locking = 1;
Packit Service 82fcde
  for (i = _IO_iter_begin (); i != _IO_iter_end (); i = _IO_iter_next (i))
Packit Service 82fcde
    _IO_iter_file (i)->_flags2 |= _IO_FLAGS2_NEED_LOCK;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_enable_locks)
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_old_init (FILE *fp, int flags)
Packit Service 82fcde
{
Packit Service 82fcde
  fp->_flags = _IO_MAGIC|flags;
Packit Service 82fcde
  fp->_flags2 = 0;
Packit Service 82fcde
  if (stdio_needs_locking)
Packit Service 82fcde
    fp->_flags2 |= _IO_FLAGS2_NEED_LOCK;
Packit Service 82fcde
  fp->_IO_buf_base = NULL;
Packit Service 82fcde
  fp->_IO_buf_end = NULL;
Packit Service 82fcde
  fp->_IO_read_base = NULL;
Packit Service 82fcde
  fp->_IO_read_ptr = NULL;
Packit Service 82fcde
  fp->_IO_read_end = NULL;
Packit Service 82fcde
  fp->_IO_write_base = NULL;
Packit Service 82fcde
  fp->_IO_write_ptr = NULL;
Packit Service 82fcde
  fp->_IO_write_end = NULL;
Packit Service 82fcde
  fp->_chain = NULL; /* Not necessary. */
Packit Service 82fcde
Packit Service 82fcde
  fp->_IO_save_base = NULL;
Packit Service 82fcde
  fp->_IO_backup_base = NULL;
Packit Service 82fcde
  fp->_IO_save_end = NULL;
Packit Service 82fcde
  fp->_markers = NULL;
Packit Service 82fcde
  fp->_cur_column = 0;
Packit Service 82fcde
#if _IO_JUMPS_OFFSET
Packit Service 82fcde
  fp->_vtable_offset = 0;
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
  if (fp->_lock != NULL)
Packit Service 82fcde
    _IO_lock_init (*fp->_lock);
Packit Service 82fcde
#endif
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_no_init (FILE *fp, int flags, int orientation,
Packit Service 82fcde
	     struct _IO_wide_data *wd, const struct _IO_jump_t *jmp)
Packit Service 82fcde
{
Packit Service 82fcde
  _IO_old_init (fp, flags);
Packit Service 82fcde
  fp->_mode = orientation;
Packit Service 82fcde
  if (orientation >= 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      fp->_wide_data = wd;
Packit Service 82fcde
      fp->_wide_data->_IO_buf_base = NULL;
Packit Service 82fcde
      fp->_wide_data->_IO_buf_end = NULL;
Packit Service 82fcde
      fp->_wide_data->_IO_read_base = NULL;
Packit Service 82fcde
      fp->_wide_data->_IO_read_ptr = NULL;
Packit Service 82fcde
      fp->_wide_data->_IO_read_end = NULL;
Packit Service 82fcde
      fp->_wide_data->_IO_write_base = NULL;
Packit Service 82fcde
      fp->_wide_data->_IO_write_ptr = NULL;
Packit Service 82fcde
      fp->_wide_data->_IO_write_end = NULL;
Packit Service 82fcde
      fp->_wide_data->_IO_save_base = NULL;
Packit Service 82fcde
      fp->_wide_data->_IO_backup_base = NULL;
Packit Service 82fcde
      fp->_wide_data->_IO_save_end = NULL;
Packit Service 82fcde
Packit Service 82fcde
      fp->_wide_data->_wide_vtable = jmp;
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    /* Cause predictable crash when a wide function is called on a byte
Packit Service 82fcde
       stream.  */
Packit Service 82fcde
    fp->_wide_data = (struct _IO_wide_data *) -1L;
Packit Service 82fcde
  fp->_freeres_list = NULL;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_default_sync (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* The way the C++ classes are mapped into the C functions in the
Packit Service 82fcde
   current implementation, this function can get called twice! */
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_default_finish (FILE *fp, int dummy)
Packit Service 82fcde
{
Packit Service 82fcde
  struct _IO_marker *mark;
Packit Service 82fcde
  if (fp->_IO_buf_base && !(fp->_flags & _IO_USER_BUF))
Packit Service 82fcde
    {
Packit Service 82fcde
      free (fp->_IO_buf_base);
Packit Service 82fcde
      fp->_IO_buf_base = fp->_IO_buf_end = NULL;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  for (mark = fp->_markers; mark != NULL; mark = mark->_next)
Packit Service 82fcde
    mark->_sbuf = NULL;
Packit Service 82fcde
Packit Service 82fcde
  if (fp->_IO_save_base)
Packit Service 82fcde
    {
Packit Service 82fcde
      free (fp->_IO_save_base);
Packit Service 82fcde
      fp->_IO_save_base = NULL;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  _IO_un_link ((struct _IO_FILE_plus *) fp);
Packit Service 82fcde
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
  if (fp->_lock != NULL)
Packit Service 82fcde
    _IO_lock_fini (*fp->_lock);
Packit Service 82fcde
#endif
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_default_finish)
Packit Service 82fcde
Packit Service 82fcde
off64_t
Packit Service 82fcde
_IO_default_seekoff (FILE *fp, off64_t offset, int dir, int mode)
Packit Service 82fcde
{
Packit Service 82fcde
  return _IO_pos_BAD;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_sputbackc (FILE *fp, int c)
Packit Service 82fcde
{
Packit Service 82fcde
  int result;
Packit Service 82fcde
Packit Service 82fcde
  if (fp->_IO_read_ptr > fp->_IO_read_base
Packit Service 82fcde
      && (unsigned char)fp->_IO_read_ptr[-1] == (unsigned char)c)
Packit Service 82fcde
    {
Packit Service 82fcde
      fp->_IO_read_ptr--;
Packit Service 82fcde
      result = (unsigned char) c;
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    result = _IO_PBACKFAIL (fp, c);
Packit Service 82fcde
Packit Service 82fcde
  if (result != EOF)
Packit Service 82fcde
    fp->_flags &= ~_IO_EOF_SEEN;
Packit Service 82fcde
Packit Service 82fcde
  return result;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_sputbackc)
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_sungetc (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  int result;
Packit Service 82fcde
Packit Service 82fcde
  if (fp->_IO_read_ptr > fp->_IO_read_base)
Packit Service 82fcde
    {
Packit Service 82fcde
      fp->_IO_read_ptr--;
Packit Service 82fcde
      result = (unsigned char) *fp->_IO_read_ptr;
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    result = _IO_PBACKFAIL (fp, EOF);
Packit Service 82fcde
Packit Service 82fcde
  if (result != EOF)
Packit Service 82fcde
    fp->_flags &= ~_IO_EOF_SEEN;
Packit Service 82fcde
Packit Service 82fcde
  return result;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
unsigned
Packit Service 82fcde
_IO_adjust_column (unsigned start, const char *line, int count)
Packit Service 82fcde
{
Packit Service 82fcde
  const char *ptr = line + count;
Packit Service 82fcde
  while (ptr > line)
Packit Service 82fcde
    if (*--ptr == '\n')
Packit Service 82fcde
      return line + count - ptr - 1;
Packit Service 82fcde
  return start + count;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_adjust_column)
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_flush_all_lockp (int do_lock)
Packit Service 82fcde
{
Packit Service 82fcde
  int result = 0;
Packit Service 82fcde
  FILE *fp;
Packit Service 82fcde
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
  _IO_cleanup_region_start_noarg (flush_cleanup);
Packit Service 82fcde
  _IO_lock_lock (list_all_lock);
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
  for (fp = (FILE *) _IO_list_all; fp != NULL; fp = fp->_chain)
Packit Service 82fcde
    {
Packit Service 82fcde
      run_fp = fp;
Packit Service 82fcde
      if (do_lock)
Packit Service 82fcde
	_IO_flockfile (fp);
Packit Service 82fcde
Packit Service 82fcde
      if (((fp->_mode <= 0 && fp->_IO_write_ptr > fp->_IO_write_base)
Packit Service 82fcde
	   || (_IO_vtable_offset (fp) == 0
Packit Service 82fcde
	       && fp->_mode > 0 && (fp->_wide_data->_IO_write_ptr
Packit Service 82fcde
				    > fp->_wide_data->_IO_write_base))
Packit Service 82fcde
	   )
Packit Service 82fcde
	  && _IO_OVERFLOW (fp, EOF) == EOF)
Packit Service 82fcde
	result = EOF;
Packit Service 82fcde
Packit Service 82fcde
      if (do_lock)
Packit Service 82fcde
	_IO_funlockfile (fp);
Packit Service 82fcde
      run_fp = NULL;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
  _IO_lock_unlock (list_all_lock);
Packit Service 82fcde
  _IO_cleanup_region_end (0);
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
  return result;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_flush_all (void)
Packit Service 82fcde
{
Packit Service 82fcde
  /* We want locking.  */
Packit Service 82fcde
  return _IO_flush_all_lockp (1);
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_flush_all)
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_flush_all_linebuffered (void)
Packit Service 82fcde
{
Packit Service 82fcde
  FILE *fp;
Packit Service 82fcde
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
  _IO_cleanup_region_start_noarg (flush_cleanup);
Packit Service 82fcde
  _IO_lock_lock (list_all_lock);
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
  for (fp = (FILE *) _IO_list_all; fp != NULL; fp = fp->_chain)
Packit Service 82fcde
    {
Packit Service 82fcde
      run_fp = fp;
Packit Service 82fcde
      _IO_flockfile (fp);
Packit Service 82fcde
Packit Service 82fcde
      if ((fp->_flags & _IO_NO_WRITES) == 0 && fp->_flags & _IO_LINE_BUF)
Packit Service 82fcde
	_IO_OVERFLOW (fp, EOF);
Packit Service 82fcde
Packit Service 82fcde
      _IO_funlockfile (fp);
Packit Service 82fcde
      run_fp = NULL;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
  _IO_lock_unlock (list_all_lock);
Packit Service 82fcde
  _IO_cleanup_region_end (0);
Packit Service 82fcde
#endif
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_flush_all_linebuffered)
Packit Service 82fcde
weak_alias (_IO_flush_all_linebuffered, _flushlbf)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* The following is a bit tricky.  In general, we want to unbuffer the
Packit Service 82fcde
   streams so that all output which follows is seen.  If we are not
Packit Service 82fcde
   looking for memory leaks it does not make much sense to free the
Packit Service 82fcde
   actual buffer because this will happen anyway once the program
Packit Service 82fcde
   terminated.  If we do want to look for memory leaks we have to free
Packit Service 82fcde
   the buffers.  Whether something is freed is determined by the
Packit Service 82fcde
   function sin the libc_freeres section.  Those are called as part of
Packit Service 82fcde
   the atexit routine, just like _IO_cleanup.  The problem is we do
Packit Service 82fcde
   not know whether the freeres code is called first or _IO_cleanup.
Packit Service 82fcde
   if the former is the case, we set the DEALLOC_BUFFER variable to
Packit Service 82fcde
   true and _IO_unbuffer_all will take care of the rest.  If
Packit Service 82fcde
   _IO_unbuffer_all is called first we add the streams to a list
Packit Service 82fcde
   which the freeres function later can walk through.  */
Packit Service 82fcde
static void _IO_unbuffer_all (void);
Packit Service 82fcde
Packit Service 82fcde
static bool dealloc_buffers;
Packit Service 82fcde
static FILE *freeres_list;
Packit Service 82fcde
Packit Service 82fcde
static void
Packit Service 82fcde
_IO_unbuffer_all (void)
Packit Service 82fcde
{
Packit Service 82fcde
  FILE *fp;
Packit Service 82fcde
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
  _IO_cleanup_region_start_noarg (flush_cleanup);
Packit Service 82fcde
  _IO_lock_lock (list_all_lock);
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
  for (fp = (FILE *) _IO_list_all; fp; fp = fp->_chain)
Packit Service 82fcde
    {
Packit Service 82fcde
      if (! (fp->_flags & _IO_UNBUFFERED)
Packit Service 82fcde
	  /* Iff stream is un-orientated, it wasn't used. */
Packit Service 1c5418
	  && fp->_mode != 0)
Packit Service 82fcde
	{
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
	  int cnt;
Packit Service 82fcde
#define MAXTRIES 2
Packit Service 82fcde
	  for (cnt = 0; cnt < MAXTRIES; ++cnt)
Packit Service 82fcde
	    if (fp->_lock == NULL || _IO_lock_trylock (*fp->_lock) == 0)
Packit Service 82fcde
	      break;
Packit Service 82fcde
	    else
Packit Service 82fcde
	      /* Give the other thread time to finish up its use of the
Packit Service 82fcde
		 stream.  */
Packit Service 82fcde
	      __sched_yield ();
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 1c5418
	  if (! dealloc_buffers && !(fp->_flags & _IO_USER_BUF))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      fp->_flags |= _IO_USER_BUF;
Packit Service 82fcde
Packit Service 82fcde
	      fp->_freeres_list = freeres_list;
Packit Service 82fcde
	      freeres_list = fp;
Packit Service 82fcde
	      fp->_freeres_buf = fp->_IO_buf_base;
Packit Service 82fcde
	    }
Packit Service 82fcde
Packit Service 82fcde
	  _IO_SETBUF (fp, NULL, 0);
Packit Service 82fcde
Packit Service 1c5418
	  if (fp->_mode > 0)
Packit Service 82fcde
	    _IO_wsetb (fp, NULL, NULL, 0);
Packit Service 82fcde
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
	  if (cnt < MAXTRIES && fp->_lock != NULL)
Packit Service 82fcde
	    _IO_lock_unlock (*fp->_lock);
Packit Service 82fcde
#endif
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* Make sure that never again the wide char functions can be
Packit Service 82fcde
	 used.  */
Packit Service 1c5418
      fp->_mode = -1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
  _IO_lock_unlock (list_all_lock);
Packit Service 82fcde
  _IO_cleanup_region_end (0);
Packit Service 82fcde
#endif
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
libc_freeres_fn (buffer_free)
Packit Service 82fcde
{
Packit Service 82fcde
  dealloc_buffers = true;
Packit Service 82fcde
Packit Service 82fcde
  while (freeres_list != NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      free (freeres_list->_freeres_buf);
Packit Service 82fcde
Packit Service 82fcde
      freeres_list = freeres_list->_freeres_list;
Packit Service 82fcde
    }
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_cleanup (void)
Packit Service 82fcde
{
Packit Service 82fcde
  /* We do *not* want locking.  Some threads might use streams but
Packit Service 82fcde
     that is their problem, we flush them underneath them.  */
Packit Service 82fcde
  int result = _IO_flush_all_lockp (0);
Packit Service 82fcde
Packit Service 82fcde
  /* We currently don't have a reliable mechanism for making sure that
Packit Service 82fcde
     C++ static destructors are executed in the correct order.
Packit Service 82fcde
     So it is possible that other static destructors might want to
Packit Service 82fcde
     write to cout - and they're supposed to be able to do so.
Packit Service 82fcde
Packit Service 82fcde
     The following will make the standard streambufs be unbuffered,
Packit Service 82fcde
     which forces any output from late destructors to be written out. */
Packit Service 82fcde
  _IO_unbuffer_all ();
Packit Service 82fcde
Packit Service 82fcde
  return result;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_init_marker (struct _IO_marker *marker, FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  marker->_sbuf = fp;
Packit Service 82fcde
  if (_IO_in_put_mode (fp))
Packit Service 82fcde
    _IO_switch_to_get_mode (fp);
Packit Service 82fcde
  if (_IO_in_backup (fp))
Packit Service 82fcde
    marker->_pos = fp->_IO_read_ptr - fp->_IO_read_end;
Packit Service 82fcde
  else
Packit Service 82fcde
    marker->_pos = fp->_IO_read_ptr - fp->_IO_read_base;
Packit Service 82fcde
Packit Service 82fcde
  /* Should perhaps sort the chain? */
Packit Service 82fcde
  marker->_next = fp->_markers;
Packit Service 82fcde
  fp->_markers = marker;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_remove_marker (struct _IO_marker *marker)
Packit Service 82fcde
{
Packit Service 82fcde
  /* Unlink from sb's chain. */
Packit Service 82fcde
  struct _IO_marker **ptr = &marker->_sbuf->_markers;
Packit Service 82fcde
  for (; ; ptr = &(*ptr)->_next)
Packit Service 82fcde
    {
Packit Service 82fcde
      if (*ptr == NULL)
Packit Service 82fcde
	break;
Packit Service 82fcde
      else if (*ptr == marker)
Packit Service 82fcde
	{
Packit Service 82fcde
	  *ptr = marker->_next;
Packit Service 82fcde
	  return;
Packit Service 82fcde
	}
Packit Service 82fcde
    }
Packit Service 82fcde
  /* FIXME: if _sbuf has a backup area that is no longer needed,
Packit Service 82fcde
     should we delete it now, or wait until the next underflow? */
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#define BAD_DELTA EOF
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_marker_difference (struct _IO_marker *mark1, struct _IO_marker *mark2)
Packit Service 82fcde
{
Packit Service 82fcde
  return mark1->_pos - mark2->_pos;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* Return difference between MARK and current position of MARK's stream. */
Packit Service 82fcde
int
Packit Service 82fcde
_IO_marker_delta (struct _IO_marker *mark)
Packit Service 82fcde
{
Packit Service 82fcde
  int cur_pos;
Packit Service 82fcde
  if (mark->_sbuf == NULL)
Packit Service 82fcde
    return BAD_DELTA;
Packit Service 82fcde
  if (_IO_in_backup (mark->_sbuf))
Packit Service 82fcde
    cur_pos = mark->_sbuf->_IO_read_ptr - mark->_sbuf->_IO_read_end;
Packit Service 82fcde
  else
Packit Service 82fcde
    cur_pos = mark->_sbuf->_IO_read_ptr - mark->_sbuf->_IO_read_base;
Packit Service 82fcde
  return mark->_pos - cur_pos;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_seekmark (FILE *fp, struct _IO_marker *mark, int delta)
Packit Service 82fcde
{
Packit Service 82fcde
  if (mark->_sbuf != fp)
Packit Service 82fcde
    return EOF;
Packit Service 82fcde
 if (mark->_pos >= 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      if (_IO_in_backup (fp))
Packit Service 82fcde
	_IO_switch_to_main_get_area (fp);
Packit Service 82fcde
      fp->_IO_read_ptr = fp->_IO_read_base + mark->_pos;
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    {
Packit Service 82fcde
      if (!_IO_in_backup (fp))
Packit Service 82fcde
	_IO_switch_to_backup_area (fp);
Packit Service 82fcde
      fp->_IO_read_ptr = fp->_IO_read_end + mark->_pos;
Packit Service 82fcde
    }
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_unsave_markers (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  struct _IO_marker *mark = fp->_markers;
Packit Service 82fcde
  if (mark)
Packit Service 82fcde
    {
Packit Service 82fcde
      fp->_markers = 0;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (_IO_have_backup (fp))
Packit Service 82fcde
    _IO_free_backup_area (fp);
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_unsave_markers)
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_default_pbackfail (FILE *fp, int c)
Packit Service 82fcde
{
Packit Service 82fcde
  if (fp->_IO_read_ptr > fp->_IO_read_base && !_IO_in_backup (fp)
Packit Service 82fcde
      && (unsigned char) fp->_IO_read_ptr[-1] == c)
Packit Service 82fcde
    --fp->_IO_read_ptr;
Packit Service 82fcde
  else
Packit Service 82fcde
    {
Packit Service 82fcde
      /* Need to handle a filebuf in write mode (switch to read mode). FIXME!*/
Packit Service 82fcde
      if (!_IO_in_backup (fp))
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* We need to keep the invariant that the main get area
Packit Service 82fcde
	     logically follows the backup area.  */
Packit Service 82fcde
	  if (fp->_IO_read_ptr > fp->_IO_read_base && _IO_have_backup (fp))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      if (save_for_backup (fp, fp->_IO_read_ptr))
Packit Service 82fcde
		return EOF;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  else if (!_IO_have_backup (fp))
Packit Service 82fcde
	    {
Packit Service 82fcde
	      /* No backup buffer: allocate one. */
Packit Service 82fcde
	      /* Use nshort buffer, if unused? (probably not)  FIXME */
Packit Service 82fcde
	      int backup_size = 128;
Packit Service 82fcde
	      char *bbuf = (char *) malloc (backup_size);
Packit Service 82fcde
	      if (bbuf == NULL)
Packit Service 82fcde
		return EOF;
Packit Service 82fcde
	      fp->_IO_save_base = bbuf;
Packit Service 82fcde
	      fp->_IO_save_end = fp->_IO_save_base + backup_size;
Packit Service 82fcde
	      fp->_IO_backup_base = fp->_IO_save_end;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  fp->_IO_read_base = fp->_IO_read_ptr;
Packit Service 82fcde
	  _IO_switch_to_backup_area (fp);
Packit Service 82fcde
	}
Packit Service 82fcde
      else if (fp->_IO_read_ptr <= fp->_IO_read_base)
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* Increase size of existing backup buffer. */
Packit Service 82fcde
	  size_t new_size;
Packit Service 82fcde
	  size_t old_size = fp->_IO_read_end - fp->_IO_read_base;
Packit Service 82fcde
	  char *new_buf;
Packit Service 82fcde
	  new_size = 2 * old_size;
Packit Service 82fcde
	  new_buf = (char *) malloc (new_size);
Packit Service 82fcde
	  if (new_buf == NULL)
Packit Service 82fcde
	    return EOF;
Packit Service 82fcde
	  memcpy (new_buf + (new_size - old_size), fp->_IO_read_base,
Packit Service 82fcde
		  old_size);
Packit Service 82fcde
	  free (fp->_IO_read_base);
Packit Service 82fcde
	  _IO_setg (fp, new_buf, new_buf + (new_size - old_size),
Packit Service 82fcde
		    new_buf + new_size);
Packit Service 82fcde
	  fp->_IO_backup_base = fp->_IO_read_ptr;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      *--fp->_IO_read_ptr = c;
Packit Service 82fcde
    }
Packit Service 82fcde
  return (unsigned char) c;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_default_pbackfail)
Packit Service 82fcde
Packit Service 82fcde
off64_t
Packit Service 82fcde
_IO_default_seek (FILE *fp, off64_t offset, int dir)
Packit Service 82fcde
{
Packit Service 82fcde
  return _IO_pos_BAD;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_default_stat (FILE *fp, void *st)
Packit Service 82fcde
{
Packit Service 82fcde
  return EOF;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
ssize_t
Packit Service 82fcde
_IO_default_read (FILE *fp, void *data, ssize_t n)
Packit Service 82fcde
{
Packit Service 82fcde
  return -1;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
ssize_t
Packit Service 82fcde
_IO_default_write (FILE *fp, const void *data, ssize_t n)
Packit Service 82fcde
{
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_IO_default_showmanyc (FILE *fp)
Packit Service 82fcde
{
Packit Service 82fcde
  return -1;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_default_imbue (FILE *fp, void *locale)
Packit Service 82fcde
{
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
_IO_ITER
Packit Service 82fcde
_IO_iter_begin (void)
Packit Service 82fcde
{
Packit Service 82fcde
  return (_IO_ITER) _IO_list_all;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_iter_begin)
Packit Service 82fcde
Packit Service 82fcde
_IO_ITER
Packit Service 82fcde
_IO_iter_end (void)
Packit Service 82fcde
{
Packit Service 82fcde
  return NULL;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_iter_end)
Packit Service 82fcde
Packit Service 82fcde
_IO_ITER
Packit Service 82fcde
_IO_iter_next (_IO_ITER iter)
Packit Service 82fcde
{
Packit Service 82fcde
  return iter->_chain;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_iter_next)
Packit Service 82fcde
Packit Service 82fcde
FILE *
Packit Service 82fcde
_IO_iter_file (_IO_ITER iter)
Packit Service 82fcde
{
Packit Service 82fcde
  return iter;
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_iter_file)
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_list_lock (void)
Packit Service 82fcde
{
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
  _IO_lock_lock (list_all_lock);
Packit Service 82fcde
#endif
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_list_lock)
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_list_unlock (void)
Packit Service 82fcde
{
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
  _IO_lock_unlock (list_all_lock);
Packit Service 82fcde
#endif
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_list_unlock)
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
_IO_list_resetlock (void)
Packit Service 82fcde
{
Packit Service 82fcde
#ifdef _IO_MTSAFE_IO
Packit Service 82fcde
  _IO_lock_init (list_all_lock);
Packit Service 82fcde
#endif
Packit Service 82fcde
}
Packit Service 82fcde
libc_hidden_def (_IO_list_resetlock)
Packit Service 82fcde
Packit Service 82fcde
text_set_element(__libc_atexit, _IO_cleanup);