mirror of
git://sourceware.org/git/glibc.git
synced 2024-12-09 04:11:27 +08:00
77fe0b9cd8
2002-02-25 Ulrich Drepper <drepper@redhat.com> * assert/assert-perr.c: Use INTUSE to reference functions and variables inside libc itself. Ise INTDEF and INTDEF2 to define appropriate aliases. Add prototypes for the new aliases. * assert/assert.c: Likewise. * include/libc-symbols.h: Likewise. * include/stdio.h: Likewise. * include/netinet/in.h: Likewise. * include/rpc/auth.h: Likewise. * include/rpc/auth_unix.h: Likewise. * include/rpc/key_prot.h: Likewise. * include/rpc/pmap_prot.h: Likewise. * include/rpc/pmap_rmt.h: Likewise. * include/rpc/rpc_msg.h: Likewise. * include/rpc/xdr.h: Likewise. * inet/gethstbyad_r.c: Likewise. * inet/gethstbynm2_r.c: Likewise. * inet/gethstbynm_r.c: Likewise. * inet/gethstent_r.c: Likewise. * inet/in6_addr.c: Likewise. * libio/__fpurge.c: Likewise. * libio/filedoalloc.c: Likewise. * libio/fileops.c: Likewise. * libio/ftello.c: Likewise. * libio/ftello64.c: Likewise. * libio/genops.c: Likewise. * libio/iofclose.c: Likewise. * libio/iofdopen.c: Likewise. * libio/iofflush.c: Likewise. * libio/iofflush_u.c: Likewise. * libio/iofgetpos.c: Likewise. * libio/iofgetpos64.c: Likewise. * libio/iofgets.c: Likewise. * libio/iofgets_u.c: Likewise. * libio/iofopen.c: Likewise. * libio/iofopncook.c: Likewise. * libio/iofputs.c: Likewise. * libio/iofread.c: Likewise. * libio/iofread_u.c: Likewise. * libio/iofsetpos.c: Likewise. * libio/iofsetpos64.c: Likewise. * libio/ioftell.c: Likewise. * libio/iofwrite.c: Likewise. * libio/iogetline.c: Likewise. * libio/iogets.c: Likewise. * libio/iogetwline.c: Likewise. * libio/iolibio.h: Likewise. * libio/iopadn.c: Likewise. * libio/iopopen.c: Likewise. * libio/ioseekoff.c: Likewise. * libio/ioseekpos.c: Likewise. * libio/iosetbuffer.c: Likewise. * libio/iosetvbuf.c: Likewise. * libio/ioungetc.c: Likewise. * libio/ioungetwc.c: Likewise. * libio/iovdprintf.c: Likewise. * libio/iovsprintf.c: Likewise. * libio/iovsscanf.c: Likewise. * libio/libioP.h: Likewise. * libio/memstream.c: Likewise. * libio/obprintf.c: Likewise. * libio/oldfileops.c: Likewise. * libio/oldiofclose.c: Likewise. * libio/oldiofdopen.c: Likewise. * libio/oldiofgetpos.c: Likewise. * libio/oldiofgetpos64.c: Likewise. * libio/oldiofopen.c: Likewise. * libio/oldiofsetpos.c: Likewise. * libio/oldiofsetpos64.c: Likewise. * libio/oldiopopen.c: Likewise. * libio/oldstdfiles.c: Likewise. * libio/putc.c: Likewise. * libio/setbuf.c: Likewise. * libio/setlinebuf.c: Likewise. * libio/stdfiles.c: Likewise. * libio/stdio.c: Likewise. * libio/strops.c: Likewise. * libio/vasprintf.c: Likewise. * libio/vscanf.c: Likewise. * libio/vsnprintf.c: Likewise. * libio/vswprintf.c: Likewise. * libio/wfiledoalloc.c: Likewise. * libio/wfileops.c: Likewise. * libio/wgenops.c: Likewise. * libio/wstrops.c: Likewise. * malloc/mtrace.c: Likewise. * misc/error.c: Likewise. * misc/syslog.c: Likewise. * nss/getXXbyYY_r.c: Likewise. * nss/getXXent_r.c: Likewise. * nss/hosts-lookup.c: Likewise. * stdio-common/getw.c * stdio-common/printf-prs.c: Likewise. * stdio-common/printf_fp.c: Likewise. * stdio-common/printf_size.c: Likewise. * stdio-common/putw.c: Likewise. * stdio-common/scanf.c: Likewise. * stdio-common/sprintf.c: Likewise. * stdio-common/tmpfile64.c: Likewise. * stdio-common/vfprintf.c: Likewise. * stdio-common/vfscanf.c: Likewise. * stdlib/strfmon.c: Likewise. * sunrpc/auth_des.c: Likewise. * sunrpc/auth_none.c: Likewise. * sunrpc/auth_unix.c: Likewise. * sunrpc/authdes_prot.c: Likewise. * sunrpc/authuxprot.c: Likewise. * sunrpc/clnt_perr.c: Likewise. * sunrpc/clnt_raw.c: Likewise. * sunrpc/clnt_tcp.c: Likewise. * sunrpc/clnt_udp.c: Likewise. * sunrpc/clnt_unix.c: Likewise. * sunrpc/key_call.c: Likewise. * sunrpc/key_prot.c: Likewise. * sunrpc/openchild.c: Likewise. * sunrpc/pm_getmaps.c: Likewise. * sunrpc/pm_getport.c: Likewise. * sunrpc/pmap_clnt.c: Likewise. * sunrpc/pmap_prot.c: Likewise. * sunrpc/pmap_prot2.c: Likewise. * sunrpc/pmap_rmt.c: Likewise. * sunrpc/rpc_cmsg.c: Likewise. * sunrpc/rpc_prot.c: Likewise. * sunrpc/svc_authux.c: Likewise. * sunrpc/svc_raw.c: Likewise. * sunrpc/svc_simple.c: Likewise. * sunrpc/svc_tcp.c: Likewise. * sunrpc/svc_udp.c: Likewise. * sunrpc/svc_unix.c: Likewise. * sunrpc/xdr.c: Likewise. * sunrpc/xdr_array.c: Likewise. * sunrpc/xdr_mem.c: Likewise. * sunrpc/xdr_rec.c: Likewise. * sunrpc/xdr_ref.c: Likewise. * sunrpc/xdr_stdio.c: Likewise. * sysdeps/generic/_strerror.c: Likewise. * sysdeps/generic/printf_fphex.c: Likewise. * sysdeps/generic/tmpfile.c: Likewise. * sysdeps/gnu/errlist.awk: Likewise. * sysdeps/gnu/errlist.c: Likewise. * libio/Makefile (routines): Remove iosprint. * libio/iosprintf.c: Removed
141 lines
4.6 KiB
C
141 lines
4.6 KiB
C
/* Copyright (C) 1994,1997,1999,2000,2001,2002 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, write to the Free
|
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
02111-1307 USA.
|
|
|
|
As a special exception, if you link the code in this file with
|
|
files compiled with a GNU compiler to produce an executable,
|
|
that does not cause the resulting executable to be covered by
|
|
the GNU Lesser General Public License. This exception does not
|
|
however invalidate any other reasons why the executable file
|
|
might be covered by the GNU Lesser General Public License.
|
|
This exception applies to code released by its copyright holders
|
|
in files containing the exception. */
|
|
|
|
#include "libioP.h"
|
|
#include "strfile.h"
|
|
|
|
|
|
typedef struct
|
|
{
|
|
_IO_strfile f;
|
|
/* This is used for the characters which do not fit in the buffer
|
|
provided by the user. */
|
|
char overflow_buf[64];
|
|
} _IO_strnfile;
|
|
|
|
|
|
static int _IO_strn_overflow __P ((_IO_FILE *fp, int c));
|
|
|
|
static int
|
|
_IO_strn_overflow (fp, c)
|
|
_IO_FILE *fp;
|
|
int c;
|
|
{
|
|
/* When we come to here this means the user supplied buffer is
|
|
filled. But since we must return the number of characters which
|
|
would have been written in total we must provide a buffer for
|
|
further use. We can do this by writing on and on in the overflow
|
|
buffer in the _IO_strnfile structure. */
|
|
_IO_strnfile *snf = (_IO_strnfile *) fp;
|
|
|
|
if (fp->_IO_buf_base != snf->overflow_buf)
|
|
{
|
|
/* Terminate the string. We know that there is room for at
|
|
least one more character since we initialized the stream with
|
|
a size to make this possible. */
|
|
*fp->_IO_write_ptr = '\0';
|
|
|
|
INTUSE(_IO_setb) (fp, snf->overflow_buf,
|
|
snf->overflow_buf + sizeof (snf->overflow_buf), 0);
|
|
|
|
fp->_IO_write_base = snf->overflow_buf;
|
|
fp->_IO_read_base = snf->overflow_buf;
|
|
fp->_IO_read_ptr = snf->overflow_buf;
|
|
fp->_IO_read_end = snf->overflow_buf + sizeof (snf->overflow_buf);
|
|
}
|
|
|
|
fp->_IO_write_ptr = snf->overflow_buf;
|
|
fp->_IO_write_end = snf->overflow_buf;
|
|
|
|
/* Since we are not really interested in storing the characters
|
|
which do not fit in the buffer we simply ignore it. */
|
|
return c;
|
|
}
|
|
|
|
|
|
static struct _IO_jump_t _IO_strn_jumps =
|
|
{
|
|
JUMP_INIT_DUMMY,
|
|
JUMP_INIT(finish, _IO_str_finish),
|
|
JUMP_INIT(overflow, _IO_strn_overflow),
|
|
JUMP_INIT(underflow, INTUSE(_IO_str_underflow)),
|
|
JUMP_INIT(uflow, INTUSE(_IO_default_uflow)),
|
|
JUMP_INIT(pbackfail, INTUSE(_IO_str_pbackfail)),
|
|
JUMP_INIT(xsputn, INTUSE(_IO_default_xsputn)),
|
|
JUMP_INIT(xsgetn, INTUSE(_IO_default_xsgetn)),
|
|
JUMP_INIT(seekoff, INTUSE(_IO_str_seekoff)),
|
|
JUMP_INIT(seekpos, _IO_default_seekpos),
|
|
JUMP_INIT(setbuf, _IO_default_setbuf),
|
|
JUMP_INIT(sync, _IO_default_sync),
|
|
JUMP_INIT(doallocate, INTUSE(_IO_default_doallocate)),
|
|
JUMP_INIT(read, _IO_default_read),
|
|
JUMP_INIT(write, _IO_default_write),
|
|
JUMP_INIT(seek, _IO_default_seek),
|
|
JUMP_INIT(close, _IO_default_close),
|
|
JUMP_INIT(stat, _IO_default_stat),
|
|
JUMP_INIT(showmanyc, _IO_default_showmanyc),
|
|
JUMP_INIT(imbue, _IO_default_imbue)
|
|
};
|
|
|
|
|
|
int
|
|
_IO_vsnprintf (string, maxlen, format, args)
|
|
char *string;
|
|
_IO_size_t maxlen;
|
|
const char *format;
|
|
_IO_va_list args;
|
|
{
|
|
_IO_strnfile sf;
|
|
int ret;
|
|
#ifdef _IO_MTSAFE_IO
|
|
sf.f._sbf._f._lock = NULL;
|
|
#endif
|
|
|
|
/* We need to handle the special case where MAXLEN is 0. Use the
|
|
overflow buffer right from the start. */
|
|
if (maxlen == 0)
|
|
{
|
|
string = sf.overflow_buf;
|
|
maxlen = sizeof (sf.overflow_buf);
|
|
}
|
|
|
|
_IO_no_init (&sf.f._sbf._f, _IO_USER_LOCK, -1, NULL, NULL);
|
|
_IO_JUMPS ((struct _IO_FILE_plus *) &sf.f._sbf) = &_IO_strn_jumps;
|
|
string[0] = '\0';
|
|
INTUSE(_IO_str_init_static) (&sf.f, string, maxlen - 1, string);
|
|
ret = INTUSE(_IO_vfprintf) ((_IO_FILE *) &sf.f._sbf, format, args);
|
|
|
|
if (sf.f._sbf._f._IO_buf_base != sf.overflow_buf)
|
|
*sf.f._sbf._f._IO_write_ptr = '\0';
|
|
return ret;
|
|
}
|
|
|
|
#ifdef weak_alias
|
|
weak_alias (_IO_vsnprintf, __vsnprintf)
|
|
weak_alias (_IO_vsnprintf, vsnprintf)
|
|
#endif
|