mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-08 17:42:12 +03:00
2.5-18.1
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 1991-2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1991-2006, 2007 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
|
||||
@@ -21,7 +21,7 @@
|
||||
#
|
||||
subdir := stdio-common
|
||||
|
||||
headers := printf.h stdio_ext.h
|
||||
headers := stdio_ext.h printf.h bits/printf-ldbl.h
|
||||
|
||||
routines := \
|
||||
ctermid cuserid \
|
||||
@@ -33,14 +33,14 @@ routines := \
|
||||
perror psignal \
|
||||
tmpfile tmpfile64 tmpnam tmpnam_r tempnam tempname \
|
||||
getline getw putw \
|
||||
remove rename \
|
||||
remove rename renameat \
|
||||
flockfile ftrylockfile funlockfile
|
||||
|
||||
install-others = $(inst_includedir)/bits/stdio_lim.h
|
||||
|
||||
include ../Makeconfig
|
||||
|
||||
aux := errlist siglist printf-parsemb printf-parsewc
|
||||
aux := errlist siglist printf-parsemb printf-parsewc fxprintf
|
||||
distribute := _itoa.h _itowa.h _i18n_number.h \
|
||||
printf-parse.h stdio_lim.h.in tst-unbputc.sh tst-printf.sh
|
||||
|
||||
@@ -53,7 +53,8 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \
|
||||
scanf11 scanf12 tst-tmpnam tst-cookie tst-obprintf tst-sscanf \
|
||||
tst-swprintf tst-fseek tst-fmemopen test-vfprintf tst-gets \
|
||||
tst-perror tst-sprintf tst-rndseek tst-fdopen tst-fphex bug14 bug15 \
|
||||
tst-popen tst-unlockedio
|
||||
tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \
|
||||
tst-fwrite bug16 bug17 tst-sprintf2
|
||||
|
||||
test-srcs = tst-unbputc tst-printf
|
||||
|
||||
|
@@ -37,7 +37,7 @@ libc {
|
||||
tempnam; tmpfile; tmpnam; tmpnam_r;
|
||||
|
||||
# v*
|
||||
vfprintf; vfscanf; vprintf;
|
||||
vfprintf; vfscanf; vprintf;
|
||||
}
|
||||
GLIBC_2.1 {
|
||||
# p*
|
||||
@@ -46,6 +46,9 @@ libc {
|
||||
# t*
|
||||
tmpfile; tmpfile64;
|
||||
}
|
||||
GLIBC_2.4 {
|
||||
renameat;
|
||||
}
|
||||
GLIBC_PRIVATE {
|
||||
# global variables
|
||||
_itoa_lower_digits;
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/* Internal function for converting integers to ASCII.
|
||||
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2002, 2003, 2004
|
||||
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2002, 2003, 2004, 2007
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Torbjorn Granlund <tege@matematik.su.se>
|
||||
@@ -269,6 +269,7 @@ _itoa (value, buflim, base, upper_case)
|
||||
|
||||
default:
|
||||
{
|
||||
char *bufend = buflim;
|
||||
#if BITS_PER_MP_LIMB == 64
|
||||
mp_limb_t base_multiplier = brec->base_multiplier;
|
||||
if (brec->flag)
|
||||
@@ -454,6 +455,8 @@ _itoa (value, buflim, base, upper_case)
|
||||
}
|
||||
while (n != 0);
|
||||
#endif
|
||||
if (buflim == bufend)
|
||||
*--buflim = '0';
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 1995, 1997, 1998, 2002, 2004
|
||||
/* Copyright (C) 1991, 1995, 1997, 1998, 2002, 2004, 2006
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <libio/libioP.h>
|
||||
#include <libioP.h>
|
||||
#define vasprintf(s, f, a) _IO_vasprintf (s, f, a)
|
||||
#undef __asprintf
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
allocated with malloc and stored in *STRING_PTR. */
|
||||
/* VARARGS2 */
|
||||
int
|
||||
__asprintf (char **string_ptr, const char *format, ...)
|
||||
___asprintf (char **string_ptr, const char *format, ...)
|
||||
{
|
||||
va_list arg;
|
||||
int done;
|
||||
@@ -39,5 +39,7 @@ __asprintf (char **string_ptr, const char *format, ...)
|
||||
|
||||
return done;
|
||||
}
|
||||
INTDEF(__asprintf)
|
||||
weak_alias (__asprintf, asprintf)
|
||||
INTDEF2(___asprintf, __asprintf)
|
||||
|
||||
ldbl_strong_alias (___asprintf, __asprintf)
|
||||
ldbl_weak_alias (___asprintf, asprintf)
|
||||
|
24
stdio-common/bits/printf-ldbl.h
Normal file
24
stdio-common/bits/printf-ldbl.h
Normal file
@@ -0,0 +1,24 @@
|
||||
/* -mlong-double-64 compatibility mode for <printf.h> functions.
|
||||
Copyright (C) 2006 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. */
|
||||
|
||||
#ifndef _PRINTF_H
|
||||
# error "Never include <bits/printf-ldbl.h> directly; use <printf.h> instead."
|
||||
#endif
|
||||
|
||||
__LDBL_REDIR_DECL (printf_size)
|
43
stdio-common/bug16.c
Normal file
43
stdio-common/bug16.c
Normal file
@@ -0,0 +1,43 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
struct
|
||||
{
|
||||
long double val;
|
||||
const char str[4][7];
|
||||
} tests[] =
|
||||
{
|
||||
{ 0x0.FFFFp+0L, { "0X1P+0", "0X2P-1", "0X4P-2", "0X8P-3" } },
|
||||
{ 0x0.FFFFp+1L, { "0X1P+1", "0X2P+0", "0X4P-1", "0X8P-2" } },
|
||||
{ 0x0.FFFFp+2L, { "0X1P+2", "0X2P+1", "0X4P+0", "0X8P-1" } },
|
||||
{ 0x0.FFFFp+3L, { "0X1P+3", "0X2P+2", "0X4P+1", "0X8P+0" } }
|
||||
};
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
char buf[100];
|
||||
int ret = 0;
|
||||
|
||||
for (size_t i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i)
|
||||
{
|
||||
snprintf (buf, sizeof (buf), "%.0LA", tests[i].val);
|
||||
|
||||
size_t j;
|
||||
for (j = 0; j < 4; ++j)
|
||||
if (strcmp (buf, tests[i].str[j]) == 0)
|
||||
break;
|
||||
|
||||
if (j == 4)
|
||||
{
|
||||
printf ("%zd: got \"%s\", expected \"%s\" or equivalent\n",
|
||||
i, buf, tests[i].str[0]);
|
||||
ret = 1;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
#include "../test-skeleton.c"
|
31
stdio-common/bug17.c
Normal file
31
stdio-common/bug17.c
Normal file
@@ -0,0 +1,31 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
static const char expect[] = "0, 0, 0";
|
||||
char buf[100];
|
||||
int status = 0;
|
||||
|
||||
static const char fmt1[] = "%0d, %0ld, %0lld";
|
||||
snprintf (buf, sizeof (buf), fmt1, 0, 0L, 0LL);
|
||||
if (strcmp (buf, expect) != 0)
|
||||
{
|
||||
printf ("\"%s\": got \"%s\", expected \"%s\"\n", fmt1, buf, expect);
|
||||
status = 1;
|
||||
}
|
||||
|
||||
static const char fmt2[] = "%0u, %0lu, %0llu";
|
||||
snprintf (buf, sizeof (buf), fmt2, 0u, 0uL, 0uLL);
|
||||
if (strcmp (buf, expect) != 0)
|
||||
{
|
||||
printf ("\"%s\": got \"%s\", expected \"%s\"\n", fmt2, buf, expect);
|
||||
status = 1;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
#include "../test-skeleton.c"
|
36
stdio-common/ctermid.c
Normal file
36
stdio-common/ctermid.c
Normal file
@@ -0,0 +1,36 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997 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. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
/* Return the name of the controlling terminal.
|
||||
If S is not NULL, the name is copied into it (it should be at
|
||||
least L_ctermid bytes long), otherwise a static buffer is used. */
|
||||
char *
|
||||
ctermid (s)
|
||||
char *s;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
stub_warning (ctermid)
|
||||
#include <stub-tag.h>
|
35
stdio-common/cuserid.c
Normal file
35
stdio-common/cuserid.c
Normal file
@@ -0,0 +1,35 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997 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. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* Return the username of the caller.
|
||||
If S is not NULL, it points to a buffer of at least L_cuserid bytes
|
||||
into which the name is copied; otherwise, a static buffer is used. */
|
||||
char *
|
||||
cuserid (s)
|
||||
char *s;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
stub_warning (cuserid)
|
||||
#include <stub-tag.h>
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991,95,97,98,2002,2004 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991,95,97,98,2002,2004,2006 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
|
||||
@@ -19,13 +19,13 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <libio/libioP.h>
|
||||
#include <libioP.h>
|
||||
#define vdprintf(d, f, a) _IO_vdprintf (d, f, a)
|
||||
|
||||
/* Write formatted output to D, according to the format string FORMAT. */
|
||||
/* VARARGS2 */
|
||||
int
|
||||
dprintf (int d, const char *format, ...)
|
||||
__dprintf (int d, const char *format, ...)
|
||||
{
|
||||
va_list arg;
|
||||
int done;
|
||||
@@ -36,4 +36,5 @@ dprintf (int d, const char *format, ...)
|
||||
|
||||
return done;
|
||||
}
|
||||
libc_hidden_def (dprintf)
|
||||
ldbl_hidden_def (__dprintf, dprintf)
|
||||
ldbl_strong_alias (__dprintf, dprintf)
|
||||
|
37
stdio-common/errlist.c
Normal file
37
stdio-common/errlist.c
Normal file
@@ -0,0 +1,37 @@
|
||||
/* Copyright (C) 1991, 1994, 1997, 2005 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. */
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
const char *const _sys_errlist[] =
|
||||
{
|
||||
"Error 0", /* 0 */
|
||||
"Argument out of function's domain", /* 1 = EDOM */
|
||||
"Result out of range", /* 2 = ERANGE */
|
||||
"Operation not implemented", /* 3 = ENOSYS */
|
||||
"Invalid argument", /* 4 = EINVAL */
|
||||
"Illegal seek", /* 5 = ESPIPE */
|
||||
"Bad file descriptor", /* 6 = EBADF */
|
||||
"Cannot allocate memory", /* 7 = ENOMEM */
|
||||
"Permission denied", /* 8 = EACCES */
|
||||
"Too many open files in system", /* 9 = ENFILE */
|
||||
"Too many open files", /* 10 = EMFILE */
|
||||
};
|
||||
|
||||
const int _sys_nerr = sizeof (_sys_errlist) / sizeof (_sys_errlist[0]);
|
30
stdio-common/flockfile.c
Normal file
30
stdio-common/flockfile.c
Normal file
@@ -0,0 +1,30 @@
|
||||
/* Lock I/O stream. Singlethreaded version.
|
||||
Copyright (C) 1996, 1997, 2000, 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. */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#undef _IO_flockfile
|
||||
|
||||
void
|
||||
__flockfile (FILE *stream)
|
||||
{
|
||||
/* Do nothing. Using this version does not do any locking. */
|
||||
}
|
||||
weak_alias (__flockfile, flockfile);
|
||||
weak_alias (__flockfile, _IO_flockfile)
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991,97,2002,2004 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991, 1997, 2002, 2004, 2006 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
|
||||
@@ -18,12 +18,13 @@
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <libioP.h>
|
||||
|
||||
|
||||
/* Write formatted output to STREAM from the format string FORMAT. */
|
||||
/* VARARGS2 */
|
||||
int
|
||||
fprintf (FILE *stream, const char *format, ...)
|
||||
__fprintf (FILE *stream, const char *format, ...)
|
||||
{
|
||||
va_list arg;
|
||||
int done;
|
||||
@@ -34,9 +35,10 @@ fprintf (FILE *stream, const char *format, ...)
|
||||
|
||||
return done;
|
||||
}
|
||||
libc_hidden_def (fprintf)
|
||||
ldbl_hidden_def (__fprintf, fprintf)
|
||||
ldbl_strong_alias (__fprintf, fprintf)
|
||||
|
||||
/* We define the function with the real name here. But deep down in
|
||||
libio the original function _IO_fprintf is also needed. So make
|
||||
an alias. */
|
||||
weak_alias (fprintf, _IO_fprintf)
|
||||
ldbl_weak_alias (__fprintf, _IO_fprintf)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 1997 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991, 1997, 2006 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
|
||||
@@ -16,13 +16,14 @@
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <libioP.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* Read formatted input from STREAM according to the format string FORMAT. */
|
||||
/* VARARGS2 */
|
||||
int
|
||||
fscanf (FILE *stream, const char *format, ...)
|
||||
__fscanf (FILE *stream, const char *format, ...)
|
||||
{
|
||||
va_list arg;
|
||||
int done;
|
||||
@@ -33,3 +34,4 @@ fscanf (FILE *stream, const char *format, ...)
|
||||
|
||||
return done;
|
||||
}
|
||||
ldbl_strong_alias (__fscanf, fscanf)
|
||||
|
31
stdio-common/ftrylockfile.c
Normal file
31
stdio-common/ftrylockfile.c
Normal file
@@ -0,0 +1,31 @@
|
||||
/* Try locking I/O stream. Singlethreaded version.
|
||||
Copyright (C) 1996, 1997, 2000, 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. */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#undef _IO_ftrylockfile
|
||||
|
||||
int
|
||||
__ftrylockfile (FILE *stream)
|
||||
{
|
||||
/* Do nothing. Using this version does not do any locking. */
|
||||
return 1;
|
||||
}
|
||||
weak_alias (__ftrylockfile, ftrylockfile);
|
||||
weak_alias (__ftrylockfile, _IO_ftrylockfile)
|
30
stdio-common/funlockfile.c
Normal file
30
stdio-common/funlockfile.c
Normal file
@@ -0,0 +1,30 @@
|
||||
/* Unlock I/O stream. Singlethreaded version.
|
||||
Copyright (C) 1996, 1997, 2000, 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. */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#undef _IO_funlockfile
|
||||
|
||||
void
|
||||
__funlockfile (FILE *stream)
|
||||
{
|
||||
/* Do nothing. Using this version does not do any locking. */
|
||||
}
|
||||
weak_alias (__funlockfile, _IO_funlockfile)
|
||||
weak_alias (__funlockfile, funlockfile);
|
56
stdio-common/fxprintf.c
Normal file
56
stdio-common/fxprintf.c
Normal file
@@ -0,0 +1,56 @@
|
||||
/* Copyright (C) 2005 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@gnu.org>.
|
||||
|
||||
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. */
|
||||
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <wchar.h>
|
||||
#include <string.h>
|
||||
#include <libioP.h>
|
||||
|
||||
|
||||
int
|
||||
__fxprintf (FILE *fp, const char *fmt, ...)
|
||||
{
|
||||
if (fp == NULL)
|
||||
fp = stderr;
|
||||
|
||||
va_list ap;
|
||||
va_start (ap, fmt);
|
||||
|
||||
int res;
|
||||
if (_IO_fwide (fp, 0) > 0)
|
||||
{
|
||||
size_t len = strlen (fmt) + 1;
|
||||
wchar_t wfmt[len];
|
||||
for (size_t i = 0; i < len; ++i)
|
||||
{
|
||||
assert (isascii (fmt[i]));
|
||||
wfmt[i] = fmt[i];
|
||||
}
|
||||
res = __vfwprintf (fp, wfmt, ap);
|
||||
}
|
||||
else
|
||||
res = INTUSE(_IO_vfprintf) (fp, fmt, ap);
|
||||
|
||||
va_end (ap);
|
||||
|
||||
return res;
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991-1993,1997,1998,2000-2004 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991-1993,1997,1998,2000-2005 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
|
||||
@@ -37,10 +37,7 @@ perror_internal (FILE *fp, const char *s, int errnum)
|
||||
|
||||
errstring = __strerror_r (errnum, buf, sizeof buf);
|
||||
|
||||
if (_IO_fwide (fp, 0) > 0)
|
||||
(void) __fwprintf (fp, L"%s%s%s\n", s, colon, errstring);
|
||||
else
|
||||
(void) fprintf (fp, "%s%s%s\n", s, colon, errstring);
|
||||
(void) __fxprintf (fp, "%s%s%s\n", s, colon, errstring);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/* Helper functions for parsing printf format strings.
|
||||
Copyright (C) 1995-2000, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995-2000,2002,2003,2004,2006 Free Software Foundation, Inc.
|
||||
This file is part of th GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@@ -64,7 +64,8 @@ __find_specmb (const UCHAR_T *format, mbstate_t *ps)
|
||||
|
||||
/* Remove any hints of a wrong encoding. */
|
||||
ps->__count = 0;
|
||||
if (! isascii (*format) && (len = __mbrlen (format, MB_CUR_MAX, ps)) > 0)
|
||||
if (! isascii (*format)
|
||||
&& (len = __mbrlen ((const CHAR_T *) format, MB_CUR_MAX, ps)) > 0)
|
||||
format += len;
|
||||
else
|
||||
++format;
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 1992, 1995, 1996, 1999, 2000, 2002, 2003, 2004
|
||||
/* Copyright (C) 1991, 1992, 1995, 1996, 1999, 2000, 2002, 2003, 2004, 2005
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
@@ -67,15 +67,16 @@ parse_printf_format (fmt, n, argtypes)
|
||||
size_t max_ref_arg; /* Highest index used in a positional arg. */
|
||||
struct printf_spec spec;
|
||||
mbstate_t mbstate;
|
||||
const unsigned char *f = (const unsigned char *) fmt;
|
||||
|
||||
nargs = 0;
|
||||
max_ref_arg = 0;
|
||||
|
||||
/* Search for format specifications. */
|
||||
for (fmt = __find_specmb (fmt, &mbstate); *fmt != '\0'; fmt = spec.next_fmt)
|
||||
for (f = __find_specmb (f, &mbstate); *f != '\0'; f = spec.next_fmt)
|
||||
{
|
||||
/* Parse this spec. */
|
||||
nargs += __parse_one_specmb (fmt, nargs, &spec, &max_ref_arg, &mbstate);
|
||||
nargs += __parse_one_specmb (f, nargs, &spec, &max_ref_arg, &mbstate);
|
||||
|
||||
/* If the width is determined by an argument this is an int. */
|
||||
if (spec.width_arg != -1 && (size_t) spec.width_arg < n)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997, 2001, 2004
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997, 2001, 2004, 2006
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <libioP.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
@@ -25,7 +26,7 @@
|
||||
/* Write formatted output to stdout from the format string FORMAT. */
|
||||
/* VARARGS1 */
|
||||
int
|
||||
printf (const char *format, ...)
|
||||
__printf (const char *format, ...)
|
||||
{
|
||||
va_list arg;
|
||||
int done;
|
||||
@@ -38,5 +39,6 @@ printf (const char *format, ...)
|
||||
}
|
||||
|
||||
#undef _IO_printf
|
||||
ldbl_strong_alias (__printf, printf);
|
||||
/* This is for libg++. */
|
||||
strong_alias (printf, _IO_printf);
|
||||
ldbl_strong_alias (__printf, _IO_printf);
|
||||
|
@@ -1,4 +1,5 @@
|
||||
/* Copyright (C) 1991-1993,1995-1999,2000,2001 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991-1993,1995-1999,2000,2001,2006
|
||||
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
|
||||
@@ -139,6 +140,9 @@ extern int printf_size_info (__const struct printf_info *__restrict
|
||||
__info, size_t __n, int *__restrict __argtypes)
|
||||
__THROW;
|
||||
|
||||
#ifdef __LDBL_COMPAT
|
||||
# include <bits/printf-ldbl.h>
|
||||
#endif
|
||||
|
||||
__END_DECLS
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/* Floating point output for `printf'.
|
||||
Copyright (C) 1995-1999,2000,2001,2002,2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995-2003, 2006, 2007 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||
|
||||
@@ -71,7 +71,11 @@
|
||||
{ \
|
||||
register const int outc = (ch); \
|
||||
if (putc (outc, fp) == EOF) \
|
||||
return -1; \
|
||||
{ \
|
||||
if (buffer_malloced) \
|
||||
free (wbuffer); \
|
||||
return -1; \
|
||||
} \
|
||||
++done; \
|
||||
} while (0)
|
||||
|
||||
@@ -82,7 +86,11 @@
|
||||
if (len > 20) \
|
||||
{ \
|
||||
if (PUT (fp, wide ? (const char *) wptr : ptr, outlen) != outlen) \
|
||||
return -1; \
|
||||
{ \
|
||||
if (buffer_malloced) \
|
||||
free (wbuffer); \
|
||||
return -1; \
|
||||
} \
|
||||
ptr += outlen; \
|
||||
done += outlen; \
|
||||
} \
|
||||
@@ -101,7 +109,11 @@
|
||||
do \
|
||||
{ \
|
||||
if (PAD (fp, ch, len) != len) \
|
||||
return -1; \
|
||||
{ \
|
||||
if (buffer_malloced) \
|
||||
free (wbuffer); \
|
||||
return -1; \
|
||||
} \
|
||||
done += len; \
|
||||
} \
|
||||
while (0)
|
||||
@@ -138,9 +150,9 @@ static wchar_t *group_number (wchar_t *buf, wchar_t *bufend,
|
||||
|
||||
|
||||
int
|
||||
__printf_fp (FILE *fp,
|
||||
const struct printf_info *info,
|
||||
const void *const *args)
|
||||
___printf_fp (FILE *fp,
|
||||
const struct printf_info *info,
|
||||
const void *const *args)
|
||||
{
|
||||
/* The floating-point value to output. */
|
||||
union
|
||||
@@ -199,6 +211,11 @@ __printf_fp (FILE *fp,
|
||||
/* Nonzero if this is output on a wide character stream. */
|
||||
int wide = info->wide;
|
||||
|
||||
/* Buffer in which we produce the output. */
|
||||
wchar_t *wbuffer = NULL;
|
||||
/* Flag whether wbuffer is malloc'ed or not. */
|
||||
int buffer_malloced = 0;
|
||||
|
||||
auto wchar_t hack_digit (void);
|
||||
|
||||
wchar_t hack_digit (void)
|
||||
@@ -775,7 +792,7 @@ __printf_fp (FILE *fp,
|
||||
else
|
||||
{
|
||||
/* This is a special case. We don't need a factor because the
|
||||
numbers are in the range of 0.0 <= fp < 8.0. We simply
|
||||
numbers are in the range of 1.0 <= |fp| < 8.0. We simply
|
||||
shift it to the right place and divide it by 1.0 to get the
|
||||
leading digit. (Of course this division is not really made.) */
|
||||
assert (0 <= exponent && exponent < 3 &&
|
||||
@@ -789,17 +806,18 @@ __printf_fp (FILE *fp,
|
||||
|
||||
{
|
||||
int width = info->width;
|
||||
wchar_t *wbuffer, *wstartp, *wcp;
|
||||
int buffer_malloced;
|
||||
wchar_t *wstartp, *wcp;
|
||||
int chars_needed;
|
||||
int expscale;
|
||||
int intdig_max, intdig_no = 0;
|
||||
int fracdig_min, fracdig_max, fracdig_no = 0;
|
||||
int fracdig_min;
|
||||
int fracdig_max;
|
||||
int dig_max;
|
||||
int significant;
|
||||
int ngroups = 0;
|
||||
char spec = _tolower (info->spec);
|
||||
|
||||
if (_tolower (info->spec) == 'e')
|
||||
if (spec == 'e')
|
||||
{
|
||||
type = info->spec;
|
||||
intdig_max = 1;
|
||||
@@ -809,7 +827,7 @@ __printf_fp (FILE *fp,
|
||||
dig_max = INT_MAX; /* Unlimited. */
|
||||
significant = 1; /* Does not matter here. */
|
||||
}
|
||||
else if (_tolower (info->spec) == 'f')
|
||||
else if (spec == 'f')
|
||||
{
|
||||
type = 'f';
|
||||
fracdig_min = fracdig_max = info->prec < 0 ? 6 : info->prec;
|
||||
@@ -906,7 +924,9 @@ __printf_fp (FILE *fp,
|
||||
}
|
||||
|
||||
/* Generate the needed number of fractional digits. */
|
||||
while (fracdig_no < fracdig_min
|
||||
int fracdig_no = 0;
|
||||
int added_zeros = 0;
|
||||
while (fracdig_no < fracdig_min + added_zeros
|
||||
|| (fracdig_no < fracdig_max && (fracsize > 1 || frac[0] != 0)))
|
||||
{
|
||||
++fracdig_no;
|
||||
@@ -917,7 +937,7 @@ __printf_fp (FILE *fp,
|
||||
{
|
||||
++fracdig_max;
|
||||
if (fracdig_min > 0)
|
||||
++fracdig_min;
|
||||
++added_zeros;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -954,11 +974,23 @@ __printf_fp (FILE *fp,
|
||||
{
|
||||
/* Process fractional digits. Terminate if not rounded or
|
||||
radix character is reached. */
|
||||
int removed = 0;
|
||||
while (*--wtp != decimalwc && *wtp == L'9')
|
||||
*wtp = '0';
|
||||
{
|
||||
*wtp = L'0';
|
||||
++removed;
|
||||
}
|
||||
if (removed == fracdig_min && added_zeros > 0)
|
||||
--added_zeros;
|
||||
if (*wtp != decimalwc)
|
||||
/* Round up. */
|
||||
(*wtp)++;
|
||||
else if (__builtin_expect (spec == 'g' && type == 'f' && info->alt,
|
||||
0))
|
||||
/* This is a special case: the rounded number is 1.0,
|
||||
the format is 'g' or 'G', and the alternative format
|
||||
is selected. This means the result must be "1.". */
|
||||
--added_zeros;
|
||||
}
|
||||
|
||||
if (fracdig_no == 0 || *wtp == decimalwc)
|
||||
@@ -980,6 +1012,12 @@ __printf_fp (FILE *fp,
|
||||
{
|
||||
*wstartp = '1';
|
||||
exponent += expsign == 0 ? 1 : -1;
|
||||
|
||||
/* The above exponent adjustment could lead to 1.0e-00,
|
||||
e.g. for 0.999999999. Make sure exponent 0 always
|
||||
uses + sign. */
|
||||
if (exponent == 0)
|
||||
expsign = 0;
|
||||
}
|
||||
else if (intdig_no == dig_max)
|
||||
{
|
||||
@@ -1025,7 +1063,7 @@ __printf_fp (FILE *fp,
|
||||
|
||||
do_expo:
|
||||
/* Now remove unnecessary '0' at the end of the string. */
|
||||
while (fracdig_no > fracdig_min && *(wcp - 1) == L'0')
|
||||
while (fracdig_no > fracdig_min + added_zeros && *(wcp - 1) == L'0')
|
||||
{
|
||||
--wcp;
|
||||
--fracdig_no;
|
||||
@@ -1043,26 +1081,46 @@ __printf_fp (FILE *fp,
|
||||
/* Write the exponent if it is needed. */
|
||||
if (type != 'f')
|
||||
{
|
||||
*wcp++ = (wchar_t) type;
|
||||
*wcp++ = expsign ? L'-' : L'+';
|
||||
|
||||
/* Find the magnitude of the exponent. */
|
||||
expscale = 10;
|
||||
while (expscale <= exponent)
|
||||
expscale *= 10;
|
||||
|
||||
if (exponent < 10)
|
||||
/* Exponent always has at least two digits. */
|
||||
*wcp++ = L'0';
|
||||
if (__builtin_expect (expsign != 0 && exponent == 4 && spec == 'g', 0))
|
||||
{
|
||||
/* This is another special case. The exponent of the number is
|
||||
really smaller than -4, which requires the 'e'/'E' format.
|
||||
But after rounding the number has an exponent of -4. */
|
||||
assert (wcp >= wstartp + 1);
|
||||
assert (wstartp[0] == L'1');
|
||||
__wmemcpy (wstartp, L"0.0001", 6);
|
||||
wstartp[1] = decimalwc;
|
||||
if (wcp >= wstartp + 2)
|
||||
{
|
||||
wmemset (wstartp + 6, L'0', wcp - (wstartp + 2));
|
||||
wcp += 4;
|
||||
}
|
||||
else
|
||||
wcp += 5;
|
||||
}
|
||||
else
|
||||
do
|
||||
{
|
||||
expscale /= 10;
|
||||
*wcp++ = L'0' + (exponent / expscale);
|
||||
exponent %= expscale;
|
||||
}
|
||||
while (expscale > 10);
|
||||
*wcp++ = L'0' + exponent;
|
||||
{
|
||||
*wcp++ = (wchar_t) type;
|
||||
*wcp++ = expsign ? L'-' : L'+';
|
||||
|
||||
/* Find the magnitude of the exponent. */
|
||||
expscale = 10;
|
||||
while (expscale <= exponent)
|
||||
expscale *= 10;
|
||||
|
||||
if (exponent < 10)
|
||||
/* Exponent always has at least two digits. */
|
||||
*wcp++ = L'0';
|
||||
else
|
||||
do
|
||||
{
|
||||
expscale /= 10;
|
||||
*wcp++ = L'0' + (exponent / expscale);
|
||||
exponent %= expscale;
|
||||
}
|
||||
while (expscale > 10);
|
||||
*wcp++ = L'0' + exponent;
|
||||
}
|
||||
}
|
||||
|
||||
/* Compute number of characters which must be filled with the padding
|
||||
@@ -1108,8 +1166,12 @@ __printf_fp (FILE *fp,
|
||||
buffer = (char *) malloc (2 + chars_needed + decimal_len
|
||||
+ ngroups * thousands_sep_len);
|
||||
if (buffer == NULL)
|
||||
/* Signal an error to the caller. */
|
||||
return -1;
|
||||
{
|
||||
/* Signal an error to the caller. */
|
||||
if (buffer_malloced)
|
||||
free (wbuffer);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
buffer = (char *) alloca (2 + chars_needed + decimal_len
|
||||
@@ -1153,7 +1215,8 @@ __printf_fp (FILE *fp,
|
||||
}
|
||||
return done;
|
||||
}
|
||||
libc_hidden_def (__printf_fp)
|
||||
ldbl_hidden_def (___printf_fp, __printf_fp)
|
||||
ldbl_strong_alias (___printf_fp, __printf_fp)
|
||||
|
||||
/* Return the number of extra grouping characters that will be inserted
|
||||
into a number with INTDIG_MAX integer digits. */
|
||||
|
493
stdio-common/printf_fphex.c
Normal file
493
stdio-common/printf_fphex.c
Normal file
@@ -0,0 +1,493 @@
|
||||
/* Print floating point number in hexadecimal notation according to ISO C99.
|
||||
Copyright (C) 1997-2002,2004,2006 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
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. */
|
||||
|
||||
#include <ctype.h>
|
||||
#include <ieee754.h>
|
||||
#include <math.h>
|
||||
#include <printf.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <wchar.h>
|
||||
#include "_itoa.h"
|
||||
#include "_itowa.h"
|
||||
#include <locale/localeinfo.h>
|
||||
|
||||
/* #define NDEBUG 1*/ /* Undefine this for debugging assertions. */
|
||||
#include <assert.h>
|
||||
|
||||
/* This defines make it possible to use the same code for GNU C library and
|
||||
the GNU I/O library. */
|
||||
#ifdef USE_IN_LIBIO
|
||||
# include <libioP.h>
|
||||
# define PUT(f, s, n) _IO_sputn (f, s, n)
|
||||
# define PAD(f, c, n) (wide ? _IO_wpadn (f, c, n) : INTUSE(_IO_padn) (f, c, n))
|
||||
/* We use this file GNU C library and GNU I/O library. So make
|
||||
names equal. */
|
||||
# undef putc
|
||||
# define putc(c, f) (wide \
|
||||
? (int)_IO_putwc_unlocked (c, f) : _IO_putc_unlocked (c, f))
|
||||
# define size_t _IO_size_t
|
||||
# define FILE _IO_FILE
|
||||
#else /* ! USE_IN_LIBIO */
|
||||
# define PUT(f, s, n) fwrite (s, 1, n, f)
|
||||
# define PAD(f, c, n) __printf_pad (f, c, n)
|
||||
ssize_t __printf_pad (FILE *, char pad, int n) __THROW; /* In vfprintf.c. */
|
||||
#endif /* USE_IN_LIBIO */
|
||||
|
||||
/* Macros for doing the actual output. */
|
||||
|
||||
#define outchar(ch) \
|
||||
do \
|
||||
{ \
|
||||
register const int outc = (ch); \
|
||||
if (putc (outc, fp) == EOF) \
|
||||
return -1; \
|
||||
++done; \
|
||||
} while (0)
|
||||
|
||||
#define PRINT(ptr, wptr, len) \
|
||||
do \
|
||||
{ \
|
||||
register size_t outlen = (len); \
|
||||
if (wide) \
|
||||
while (outlen-- > 0) \
|
||||
outchar (*wptr++); \
|
||||
else \
|
||||
while (outlen-- > 0) \
|
||||
outchar (*ptr++); \
|
||||
} while (0)
|
||||
|
||||
#define PADN(ch, len) \
|
||||
do \
|
||||
{ \
|
||||
if (PAD (fp, ch, len) != len) \
|
||||
return -1; \
|
||||
done += len; \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
#ifndef MIN
|
||||
# define MIN(a,b) ((a)<(b)?(a):(b))
|
||||
#endif
|
||||
|
||||
|
||||
int
|
||||
__printf_fphex (FILE *fp,
|
||||
const struct printf_info *info,
|
||||
const void *const *args)
|
||||
{
|
||||
/* The floating-point value to output. */
|
||||
union
|
||||
{
|
||||
union ieee754_double dbl;
|
||||
union ieee854_long_double ldbl;
|
||||
}
|
||||
fpnum;
|
||||
|
||||
/* Locale-dependent representation of decimal point. */
|
||||
const char *decimal;
|
||||
wchar_t decimalwc;
|
||||
|
||||
/* "NaN" or "Inf" for the special cases. */
|
||||
const char *special = NULL;
|
||||
const wchar_t *wspecial = NULL;
|
||||
|
||||
/* Buffer for the generated number string for the mantissa. The
|
||||
maximal size for the mantissa is 128 bits. */
|
||||
char numbuf[32];
|
||||
char *numstr;
|
||||
char *numend;
|
||||
wchar_t wnumbuf[32];
|
||||
wchar_t *wnumstr;
|
||||
wchar_t *wnumend;
|
||||
int negative;
|
||||
|
||||
/* The maximal exponent of two in decimal notation has 5 digits. */
|
||||
char expbuf[5];
|
||||
char *expstr;
|
||||
wchar_t wexpbuf[5];
|
||||
wchar_t *wexpstr;
|
||||
int expnegative;
|
||||
int exponent;
|
||||
|
||||
/* Non-zero is mantissa is zero. */
|
||||
int zero_mantissa;
|
||||
|
||||
/* The leading digit before the decimal point. */
|
||||
char leading;
|
||||
|
||||
/* Precision. */
|
||||
int precision = info->prec;
|
||||
|
||||
/* Width. */
|
||||
int width = info->width;
|
||||
|
||||
/* Number of characters written. */
|
||||
int done = 0;
|
||||
|
||||
/* Nonzero if this is output on a wide character stream. */
|
||||
int wide = info->wide;
|
||||
|
||||
|
||||
/* Figure out the decimal point character. */
|
||||
if (info->extra == 0)
|
||||
{
|
||||
decimal = _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT);
|
||||
decimalwc = _NL_CURRENT_WORD (LC_NUMERIC, _NL_NUMERIC_DECIMAL_POINT_WC);
|
||||
}
|
||||
else
|
||||
{
|
||||
decimal = _NL_CURRENT (LC_MONETARY, MON_DECIMAL_POINT);
|
||||
decimalwc = _NL_CURRENT_WORD (LC_MONETARY,
|
||||
_NL_MONETARY_DECIMAL_POINT_WC);
|
||||
}
|
||||
/* The decimal point character must never be zero. */
|
||||
assert (*decimal != '\0' && decimalwc != L'\0');
|
||||
|
||||
|
||||
/* Fetch the argument value. */
|
||||
#ifndef __NO_LONG_DOUBLE_MATH
|
||||
if (info->is_long_double && sizeof (long double) > sizeof (double))
|
||||
{
|
||||
fpnum.ldbl.d = *(const long double *) args[0];
|
||||
|
||||
/* Check for special values: not a number or infinity. */
|
||||
if (__isnanl (fpnum.ldbl.d))
|
||||
{
|
||||
if (isupper (info->spec))
|
||||
{
|
||||
special = "NAN";
|
||||
wspecial = L"NAN";
|
||||
}
|
||||
else
|
||||
{
|
||||
special = "nan";
|
||||
wspecial = L"nan";
|
||||
}
|
||||
negative = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (__isinfl (fpnum.ldbl.d))
|
||||
{
|
||||
if (isupper (info->spec))
|
||||
{
|
||||
special = "INF";
|
||||
wspecial = L"INF";
|
||||
}
|
||||
else
|
||||
{
|
||||
special = "inf";
|
||||
wspecial = L"inf";
|
||||
}
|
||||
}
|
||||
|
||||
negative = signbit (fpnum.ldbl.d);
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif /* no long double */
|
||||
{
|
||||
fpnum.dbl.d = *(const double *) args[0];
|
||||
|
||||
/* Check for special values: not a number or infinity. */
|
||||
if (__isnan (fpnum.dbl.d))
|
||||
{
|
||||
if (isupper (info->spec))
|
||||
{
|
||||
special = "NAN";
|
||||
wspecial = L"NAN";
|
||||
}
|
||||
else
|
||||
{
|
||||
special = "nan";
|
||||
wspecial = L"nan";
|
||||
}
|
||||
negative = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (__isinf (fpnum.dbl.d))
|
||||
{
|
||||
if (isupper (info->spec))
|
||||
{
|
||||
special = "INF";
|
||||
wspecial = L"INF";
|
||||
}
|
||||
else
|
||||
{
|
||||
special = "inf";
|
||||
wspecial = L"inf";
|
||||
}
|
||||
}
|
||||
|
||||
negative = signbit (fpnum.dbl.d);
|
||||
}
|
||||
}
|
||||
|
||||
if (special)
|
||||
{
|
||||
int width = info->width;
|
||||
|
||||
if (negative || info->showsign || info->space)
|
||||
--width;
|
||||
width -= 3;
|
||||
|
||||
if (!info->left && width > 0)
|
||||
PADN (' ', width);
|
||||
|
||||
if (negative)
|
||||
outchar ('-');
|
||||
else if (info->showsign)
|
||||
outchar ('+');
|
||||
else if (info->space)
|
||||
outchar (' ');
|
||||
|
||||
PRINT (special, wspecial, 3);
|
||||
|
||||
if (info->left && width > 0)
|
||||
PADN (' ', width);
|
||||
|
||||
return done;
|
||||
}
|
||||
|
||||
if (info->is_long_double == 0 || sizeof (double) == sizeof (long double))
|
||||
{
|
||||
/* We have 52 bits of mantissa plus one implicit digit. Since
|
||||
52 bits are representable without rest using hexadecimal
|
||||
digits we use only the implicit digits for the number before
|
||||
the decimal point. */
|
||||
unsigned long long int num;
|
||||
|
||||
num = (((unsigned long long int) fpnum.dbl.ieee.mantissa0) << 32
|
||||
| fpnum.dbl.ieee.mantissa1);
|
||||
|
||||
zero_mantissa = num == 0;
|
||||
|
||||
if (sizeof (unsigned long int) > 6)
|
||||
{
|
||||
wnumstr = _itowa_word (num, wnumbuf + (sizeof wnumbuf) / sizeof (wchar_t), 16,
|
||||
info->spec == 'A');
|
||||
numstr = _itoa_word (num, numbuf + sizeof numbuf, 16,
|
||||
info->spec == 'A');
|
||||
}
|
||||
else
|
||||
{
|
||||
wnumstr = _itowa (num, wnumbuf + sizeof wnumbuf / sizeof (wchar_t), 16,
|
||||
info->spec == 'A');
|
||||
numstr = _itoa (num, numbuf + sizeof numbuf, 16,
|
||||
info->spec == 'A');
|
||||
}
|
||||
|
||||
/* Fill with zeroes. */
|
||||
while (wnumstr > wnumbuf + (sizeof wnumbuf - 52) / sizeof (wchar_t))
|
||||
{
|
||||
*--wnumstr = L'0';
|
||||
*--numstr = '0';
|
||||
}
|
||||
|
||||
leading = fpnum.dbl.ieee.exponent == 0 ? '0' : '1';
|
||||
|
||||
exponent = fpnum.dbl.ieee.exponent;
|
||||
|
||||
if (exponent == 0)
|
||||
{
|
||||
if (zero_mantissa)
|
||||
expnegative = 0;
|
||||
else
|
||||
{
|
||||
/* This is a denormalized number. */
|
||||
expnegative = 1;
|
||||
exponent = IEEE754_DOUBLE_BIAS - 1;
|
||||
}
|
||||
}
|
||||
else if (exponent >= IEEE754_DOUBLE_BIAS)
|
||||
{
|
||||
expnegative = 0;
|
||||
exponent -= IEEE754_DOUBLE_BIAS;
|
||||
}
|
||||
else
|
||||
{
|
||||
expnegative = 1;
|
||||
exponent = -(exponent - IEEE754_DOUBLE_BIAS);
|
||||
}
|
||||
}
|
||||
#ifdef PRINT_FPHEX_LONG_DOUBLE
|
||||
else
|
||||
PRINT_FPHEX_LONG_DOUBLE;
|
||||
#endif
|
||||
|
||||
/* Look for trailing zeroes. */
|
||||
if (! zero_mantissa)
|
||||
{
|
||||
wnumend = &wnumbuf[sizeof wnumbuf / sizeof wnumbuf[0]];
|
||||
numend = &numbuf[sizeof numbuf / sizeof numbuf[0]];
|
||||
while (wnumend[-1] == L'0')
|
||||
{
|
||||
--wnumend;
|
||||
--numend;
|
||||
}
|
||||
|
||||
if (precision == -1)
|
||||
precision = numend - numstr;
|
||||
else if (precision < numend - numstr
|
||||
&& (numstr[precision] > '8'
|
||||
|| (('A' < '0' || 'a' < '0')
|
||||
&& numstr[precision] < '0')
|
||||
|| (numstr[precision] == '8'
|
||||
&& (precision + 1 < numend - numstr
|
||||
/* Round to even. */
|
||||
|| (precision > 0
|
||||
&& ((numstr[precision - 1] & 1)
|
||||
^ (isdigit (numstr[precision - 1]) == 0)))
|
||||
|| (precision == 0
|
||||
&& ((leading & 1)
|
||||
^ (isdigit (leading) == 0)))))))
|
||||
{
|
||||
/* Round up. */
|
||||
int cnt = precision;
|
||||
while (--cnt >= 0)
|
||||
{
|
||||
char ch = numstr[cnt];
|
||||
/* We assume that the digits and the letters are ordered
|
||||
like in ASCII. This is true for the rest of GNU, too. */
|
||||
if (ch == '9')
|
||||
{
|
||||
wnumstr[cnt] = (wchar_t) info->spec;
|
||||
numstr[cnt] = info->spec; /* This is tricky,
|
||||
think about it! */
|
||||
break;
|
||||
}
|
||||
else if (tolower (ch) < 'f')
|
||||
{
|
||||
++numstr[cnt];
|
||||
++wnumstr[cnt];
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
numstr[cnt] = '0';
|
||||
wnumstr[cnt] = L'0';
|
||||
}
|
||||
}
|
||||
if (cnt < 0)
|
||||
{
|
||||
/* The mantissa so far was fff...f Now increment the
|
||||
leading digit. Here it is again possible that we
|
||||
get an overflow. */
|
||||
if (leading == '9')
|
||||
leading = info->spec;
|
||||
else if (tolower (leading) < 'f')
|
||||
++leading;
|
||||
else
|
||||
{
|
||||
leading = '1';
|
||||
if (expnegative)
|
||||
{
|
||||
exponent -= 4;
|
||||
if (exponent <= 0)
|
||||
{
|
||||
exponent = -exponent;
|
||||
expnegative = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
exponent += 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (precision == -1)
|
||||
precision = 0;
|
||||
numend = numstr;
|
||||
wnumend = wnumstr;
|
||||
}
|
||||
|
||||
/* Now we can compute the exponent string. */
|
||||
expstr = _itoa_word (exponent, expbuf + sizeof expbuf, 10, 0);
|
||||
wexpstr = _itowa_word (exponent,
|
||||
wexpbuf + sizeof wexpbuf / sizeof (wchar_t), 10, 0);
|
||||
|
||||
/* Now we have all information to compute the size. */
|
||||
width -= ((negative || info->showsign || info->space)
|
||||
/* Sign. */
|
||||
+ 2 + 1 + 0 + precision + 1 + 1
|
||||
/* 0x h . hhh P ExpoSign. */
|
||||
+ ((expbuf + sizeof expbuf) - expstr));
|
||||
/* Exponent. */
|
||||
|
||||
/* Count the decimal point.
|
||||
A special case when the mantissa or the precision is zero and the `#'
|
||||
is not given. In this case we must not print the decimal point. */
|
||||
if (precision > 0 || info->alt)
|
||||
width -= wide ? 1 : strlen (decimal);
|
||||
|
||||
if (!info->left && info->pad != '0' && width > 0)
|
||||
PADN (' ', width);
|
||||
|
||||
if (negative)
|
||||
outchar ('-');
|
||||
else if (info->showsign)
|
||||
outchar ('+');
|
||||
else if (info->space)
|
||||
outchar (' ');
|
||||
|
||||
outchar ('0');
|
||||
if ('X' - 'A' == 'x' - 'a')
|
||||
outchar (info->spec + ('x' - 'a'));
|
||||
else
|
||||
outchar (info->spec == 'A' ? 'X' : 'x');
|
||||
|
||||
if (!info->left && info->pad == '0' && width > 0)
|
||||
PADN ('0', width);
|
||||
|
||||
outchar (leading);
|
||||
|
||||
if (precision > 0 || info->alt)
|
||||
{
|
||||
const wchar_t *wtmp = &decimalwc;
|
||||
PRINT (decimal, wtmp, wide ? 1 : strlen (decimal));
|
||||
}
|
||||
|
||||
if (precision > 0)
|
||||
{
|
||||
ssize_t tofill = precision - (numend - numstr);
|
||||
PRINT (numstr, wnumstr, MIN (numend - numstr, precision));
|
||||
if (tofill > 0)
|
||||
PADN ('0', tofill);
|
||||
}
|
||||
|
||||
if ('P' - 'A' == 'p' - 'a')
|
||||
outchar (info->spec + ('p' - 'a'));
|
||||
else
|
||||
outchar (info->spec == 'A' ? 'P' : 'p');
|
||||
|
||||
outchar (expnegative ? '-' : '+');
|
||||
|
||||
PRINT (expstr, wexpstr, (expbuf + sizeof expbuf) - expstr);
|
||||
|
||||
if (info->left && info->pad != '0' && width > 0)
|
||||
PADN (info->pad, width);
|
||||
|
||||
return done;
|
||||
}
|
@@ -1,5 +1,5 @@
|
||||
/* Print size value using units for orders of magnitude.
|
||||
Copyright (C) 1997-2002, 2004 Free Software Foundation, Inc.
|
||||
Copyright (C) 1997-2002, 2004, 2006 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
Based on a proposal by Larry McVoy <lm@sgi.com>.
|
||||
@@ -86,7 +86,8 @@ extern int __printf_fp (FILE *fp, const struct printf_info *info,
|
||||
|
||||
|
||||
int
|
||||
printf_size (FILE *fp, const struct printf_info *info, const void *const *args)
|
||||
__printf_size (FILE *fp, const struct printf_info *info,
|
||||
const void *const *args)
|
||||
{
|
||||
/* Units for the both formats. */
|
||||
#define BINARY_UNITS " kmgtpezy"
|
||||
@@ -233,6 +234,7 @@ printf_size (FILE *fp, const struct printf_info *info, const void *const *args)
|
||||
|
||||
return done;
|
||||
}
|
||||
ldbl_strong_alias (__printf_size, printf_size);
|
||||
|
||||
/* This is the function used by `vfprintf' to determine number and
|
||||
type of the arguments. */
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 1992, 1995, 1996, 1997, 2001, 2002, 2004
|
||||
/* Copyright (C) 1991, 1992, 1995, 1996, 1997, 2001, 2002, 2004, 2005
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
@@ -24,10 +24,6 @@
|
||||
#include <wchar.h>
|
||||
|
||||
|
||||
#ifndef HAVE_GNU_LD
|
||||
#define _sys_siglist sys_siglist
|
||||
#endif
|
||||
|
||||
/* Defined in sys_siglist.c. */
|
||||
extern const char *const _sys_siglist[];
|
||||
extern const char *const _sys_siglist_internal[] attribute_hidden;
|
||||
@@ -47,29 +43,16 @@ psignal (int sig, const char *s)
|
||||
colon = ": ";
|
||||
|
||||
if (sig >= 0 && sig < NSIG && (desc = INTUSE(_sys_siglist)[sig]) != NULL)
|
||||
{
|
||||
if (_IO_fwide (stderr, 0) > 0)
|
||||
(void) __fwprintf (stderr, L"%s%s%s\n", s, colon, _(desc));
|
||||
else
|
||||
(void) fprintf (stderr, "%s%s%s\n", s, colon, _(desc));
|
||||
}
|
||||
(void) __fxprintf (NULL, "%s%s%s\n", s, colon, _(desc));
|
||||
else
|
||||
{
|
||||
char *buf;
|
||||
|
||||
if (__asprintf (&buf, _("%s%sUnknown signal %d\n"), s, colon, sig) < 0)
|
||||
{
|
||||
if (_IO_fwide (stderr, 0) > 0)
|
||||
(void) __fwprintf (stderr, L"%s%s%s\n", s, colon, _("Unknown signal"));
|
||||
else
|
||||
(void) fprintf (stderr, "%s%s%s\n", s, colon, _("Unknown signal"));
|
||||
}
|
||||
(void) __fxprintf (NULL, "%s%s%s\n", s, colon, _("Unknown signal"));
|
||||
else
|
||||
{
|
||||
if (_IO_fwide (stderr, 0) > 0)
|
||||
(void) __fwprintf (stderr, L"%s", buf);
|
||||
else
|
||||
(void) fputs (buf, stderr);
|
||||
(void) __fxprintf (NULL, "%s", buf);
|
||||
|
||||
free (buf);
|
||||
}
|
||||
|
33
stdio-common/remove.c
Normal file
33
stdio-common/remove.c
Normal file
@@ -0,0 +1,33 @@
|
||||
/* ANSI C `remove' function to delete a file or directory. Stub version.
|
||||
Copyright (C) 1995,96,97,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. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int
|
||||
remove (file)
|
||||
const char *file;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
libc_hidden_def (remove)
|
||||
|
||||
stub_warning (remove)
|
||||
#include <stub-tag.h>
|
41
stdio-common/rename.c
Normal file
41
stdio-common/rename.c
Normal file
@@ -0,0 +1,41 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997 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. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
/* Rename the file OLD to NEW. */
|
||||
int
|
||||
rename (old, new)
|
||||
const char *old;
|
||||
const char *new;
|
||||
{
|
||||
if (old == NULL || new == NULL)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
stub_warning (rename)
|
||||
#include <stub-tag.h>
|
50
stdio-common/renameat.c
Normal file
50
stdio-common/renameat.c
Normal file
@@ -0,0 +1,50 @@
|
||||
/* Copyright (C) 2005, 2006 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. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
/* Rename the file OLD relative to OLDFD to NEW relative to NEWFD. */
|
||||
int
|
||||
renameat (oldfd, old, newfd, new)
|
||||
int oldfd;
|
||||
const char *old;
|
||||
int newfd;
|
||||
const char *new;
|
||||
{
|
||||
if ((oldfd < 0 && oldfd != AT_FDCWD) || (newfd < 0 && newfd != AT_FDCWD))
|
||||
{
|
||||
__set_errno (EBADF);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (old == NULL || new == NULL)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
stub_warning (renameat)
|
||||
#include <stub-tag.h>
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997, 2002, 2004
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997, 2002, 2004, 2006
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
/* Read formatted input from stdin according to the format string FORMAT. */
|
||||
/* VARARGS1 */
|
||||
int
|
||||
scanf (const char *format, ...)
|
||||
__scanf (const char *format, ...)
|
||||
{
|
||||
va_list arg;
|
||||
int done;
|
||||
@@ -37,3 +37,4 @@ scanf (const char *format, ...)
|
||||
|
||||
return done;
|
||||
}
|
||||
ldbl_strong_alias (__scanf, scanf)
|
||||
|
38
stdio-common/siglist.c
Normal file
38
stdio-common/siglist.c
Normal file
@@ -0,0 +1,38 @@
|
||||
/* Define list of all signal numbers and their names.
|
||||
Copyright (C) 1997, 1998, 1999, 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. */
|
||||
|
||||
#include <stddef.h>
|
||||
#include <signal.h>
|
||||
#include <libintl.h>
|
||||
|
||||
const char *const _sys_siglist[NSIG] =
|
||||
{
|
||||
#define init_sig(sig, abbrev, desc) [sig] = desc,
|
||||
#include <siglist.h>
|
||||
#undef init_sig
|
||||
};
|
||||
strong_alias (_sys_siglist, _sys_siglist_internal)
|
||||
|
||||
|
||||
const char *const _sys_sigabbrev[NSIG] =
|
||||
{
|
||||
#define init_sig(sig, abbrev, desc) [sig] = abbrev,
|
||||
#include <siglist.h>
|
||||
#undef init_sig
|
||||
};
|
@@ -1,4 +1,5 @@
|
||||
/* Copyright (C) 1991, 1995, 1997, 1998, 2004 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991, 1995, 1997, 1998, 2004, 2006
|
||||
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
|
||||
@@ -18,8 +19,7 @@
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <libio/libioP.h>
|
||||
#include <libioP.h>
|
||||
#define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f, a)
|
||||
|
||||
/* Write formatted output into S, according to the format
|
||||
@@ -37,4 +37,4 @@ __snprintf (char *s, size_t maxlen, const char *format, ...)
|
||||
|
||||
return done;
|
||||
}
|
||||
weak_alias (__snprintf, snprintf)
|
||||
ldbl_weak_alias (__snprintf, snprintf)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 1995, 1997, 1998, 2002, 2004
|
||||
/* Copyright (C) 1991, 1995, 1997, 1998, 2002, 2004, 2006
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <libio/iolibio.h>
|
||||
#include <libioP.h>
|
||||
#define vsprintf(s, f, a) INTUSE(_IO_vsprintf) (s, f, a)
|
||||
|
||||
/* Write formatted output into S, according to the format string FORMAT. */
|
||||
/* VARARGS2 */
|
||||
int
|
||||
sprintf (char *s, const char *format, ...)
|
||||
__sprintf (char *s, const char *format, ...)
|
||||
{
|
||||
va_list arg;
|
||||
int done;
|
||||
@@ -36,6 +36,6 @@ sprintf (char *s, const char *format, ...)
|
||||
|
||||
return done;
|
||||
}
|
||||
libc_hidden_def (sprintf)
|
||||
|
||||
strong_alias(sprintf, _IO_sprintf)
|
||||
ldbl_hidden_def (__sprintf, sprintf)
|
||||
ldbl_strong_alias (__sprintf, sprintf)
|
||||
ldbl_strong_alias (__sprintf, _IO_sprintf)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1998, 2002, 2003, 2004
|
||||
/* Copyright (C) 1991, 1995, 1996, 1998, 2002, 2003, 2004, 2006
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <libio/iolibio.h>
|
||||
#include <libioP.h>
|
||||
#define __vsscanf(s, f, a) _IO_vsscanf (s, f, a)
|
||||
|
||||
/* Read formatted input from S, according to the format string FORMAT. */
|
||||
/* VARARGS2 */
|
||||
int
|
||||
sscanf (const char *s, const char *format, ...)
|
||||
__sscanf (const char *s, const char *format, ...)
|
||||
{
|
||||
va_list arg;
|
||||
int done;
|
||||
@@ -36,8 +36,8 @@ sscanf (const char *s, const char *format, ...)
|
||||
|
||||
return done;
|
||||
}
|
||||
libc_hidden_def (sscanf)
|
||||
|
||||
ldbl_hidden_def (__sscanf, sscanf)
|
||||
ldbl_strong_alias (__sscanf, sscanf)
|
||||
#undef _IO_sscanf
|
||||
/* This is for libg++. */
|
||||
strong_alias (sscanf, _IO_sscanf)
|
||||
ldbl_strong_alias (__sscanf, _IO_sscanf)
|
||||
|
59
stdio-common/tempname.c
Normal file
59
stdio-common/tempname.c
Normal file
@@ -0,0 +1,59 @@
|
||||
/* Copyright (C) 1991, 92, 93, 95-98, 99 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. */
|
||||
|
||||
#define __need_size_t
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* Perform the "SVID path search malarkey" on DIR and PFX. Write a
|
||||
template suitable for use in __gen_tempname into TMPL, bounded
|
||||
by TMPL_LEN. */
|
||||
int
|
||||
__path_search (tmpl, tmpl_len, dir, pfx, try_tmpdir)
|
||||
char *tmpl;
|
||||
size_t tmpl_len;
|
||||
const char *dir;
|
||||
const char *pfx;
|
||||
int try_tmpdir;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
stub_warning (__path_search)
|
||||
|
||||
/* Generate a (hopefully) unique temporary filename
|
||||
in DIR (if applicable), using template TMPL.
|
||||
KIND determines what to do with that name. It may be one of:
|
||||
__GT_FILE: create a file and return a read-write fd.
|
||||
__GT_BIGFILE: same, but use open64() (or equivalent).
|
||||
__GT_DIR: create a directory.
|
||||
__GT_NOCREATE: just find a name not currently in use.
|
||||
*/
|
||||
|
||||
int
|
||||
__gen_tempname (tmpl, kind)
|
||||
char *tmpl;
|
||||
int kind;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
stub_warning (__gen_tempname)
|
||||
#include <stub-tag.h>
|
@@ -1,5 +1,5 @@
|
||||
/* Tests of *printf for very large strings.
|
||||
Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 2000, 2002, 2003, 2007 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2000.
|
||||
|
||||
@@ -94,6 +94,7 @@ main (void)
|
||||
fprintf (fp, "%.*s", 30000, large);
|
||||
large[20000] = '\0';
|
||||
fprintf (fp, large);
|
||||
fprintf (fp, "%-1.300000000s", "hello");
|
||||
|
||||
if (fflush (fp) != 0 || ferror (fp) != 0 || fclose (fp) != 0)
|
||||
{
|
||||
@@ -108,11 +109,12 @@ main (void)
|
||||
setlocale (LC_ALL, NULL));
|
||||
exit (1);
|
||||
}
|
||||
else if (st.st_size != 99999)
|
||||
else if (st.st_size != 50000 + 30000 + 19999 + 5)
|
||||
{
|
||||
printf ("file size incorrect for locale %s: %jd instead of %jd\n",
|
||||
setlocale (LC_ALL, NULL),
|
||||
(intmax_t) st.st_size, (intmax_t) 99999);
|
||||
(intmax_t) st.st_size,
|
||||
(intmax_t) 50000 + 30000 + 19999 + 5);
|
||||
res = 1;
|
||||
}
|
||||
else
|
||||
|
@@ -4012,6 +4012,17 @@ sprint_double_type sprint_doubles[] =
|
||||
{__LINE__, 16, "0x1.0p+4", "%.1a"},
|
||||
{__LINE__, 16, "0x1.00000000000000000000p+4", "%.20a"},
|
||||
{__LINE__, 4444.88888888, "4445", "%2.F"},
|
||||
{__LINE__, 0.956, "1", "%.0g"},
|
||||
{__LINE__, 1.0956, "1.", "%#.0g"},
|
||||
{__LINE__, 0.956, "1.", "%#.0g"},
|
||||
{__LINE__, 0.0956, "0.1", "%#.0g"},
|
||||
{__LINE__, 0.00956, "0.01", "%#.0g"},
|
||||
{__LINE__, 0.000956, "0.001", "%#.0g"},
|
||||
{__LINE__, 0.000098, "0.0001", "%#.0g"},
|
||||
{__LINE__, 0.0000996, "0.00010", "%#.2g"},
|
||||
{__LINE__, 9.999999999999999e-05, "0.0001", "%g"},
|
||||
{__LINE__, 1.0, "1.000000e+00", "%e"},
|
||||
{__LINE__, .9999999999999999, "1.000000e+00", "%e"},
|
||||
|
||||
{0 }
|
||||
|
||||
@@ -4023,13 +4034,8 @@ sprint_double_type sprint_doubles[] =
|
||||
|
||||
int required_precision = 13;
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
static int
|
||||
matches (register char *result, register const char *desired)
|
||||
#else
|
||||
int matches(result, desired)
|
||||
register char *result; register const char *desired;
|
||||
#endif
|
||||
{
|
||||
int digits_seen = 0;
|
||||
for (;; result++, desired++) {
|
||||
@@ -4080,7 +4086,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
/* And one special test. */
|
||||
{
|
||||
const char ref[] = "1.7763568394002504646778106689453125e-15";
|
||||
static const char ref[] = "1.7763568394002504646778106689453125e-15";
|
||||
int i;
|
||||
d = 1.0;
|
||||
for (i = 1; i < 50; ++i)
|
||||
|
66
stdio-common/tmpfile.c
Normal file
66
stdio-common/tmpfile.c
Normal file
@@ -0,0 +1,66 @@
|
||||
/* Open a stdio stream on an anonymous temporary file. Generic/POSIX version.
|
||||
Copyright (C) 1991,93,1996-2000,2002,2003 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. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef USE_IN_LIBIO
|
||||
# include <iolibio.h>
|
||||
# define __fdopen INTUSE(_IO_fdopen)
|
||||
# ifndef tmpfile
|
||||
# define tmpfile __new_tmpfile
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef GEN_THIS
|
||||
# define GEN_THIS __GT_FILE
|
||||
#endif
|
||||
|
||||
/* This returns a new stream opened on a temporary file (generated
|
||||
by tmpnam). The file is opened with mode "w+b" (binary read/write).
|
||||
If we couldn't generate a unique filename or the file couldn't
|
||||
be opened, NULL is returned. */
|
||||
FILE *
|
||||
tmpfile (void)
|
||||
{
|
||||
char buf[FILENAME_MAX];
|
||||
int fd;
|
||||
FILE *f;
|
||||
|
||||
if (__path_search (buf, FILENAME_MAX, NULL, "tmpf", 0))
|
||||
return NULL;
|
||||
fd = __gen_tempname (buf, GEN_THIS);
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
/* Note that this relies on the Unix semantics that
|
||||
a file is not really removed until it is closed. */
|
||||
(void) __unlink (buf);
|
||||
|
||||
if ((f = __fdopen (fd, "w+b")) == NULL)
|
||||
__close (fd);
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
#if defined USE_IN_LIBIO && GEN_THIS == __GT_FILE /* Not for tmpfile64. */
|
||||
# undef tmpfile
|
||||
# include <shlib-compat.h>
|
||||
versioned_symbol (libc, __new_tmpfile, tmpfile, GLIBC_2_1);
|
||||
#endif
|
3
stdio-common/tmpfile64.c
Normal file
3
stdio-common/tmpfile64.c
Normal file
@@ -0,0 +1,3 @@
|
||||
#define GEN_THIS __GT_BIGFILE
|
||||
#define tmpfile tmpfile64
|
||||
#include <tmpfile.c>
|
20
stdio-common/tst-fgets.c
Normal file
20
stdio-common/tst-fgets.c
Normal file
@@ -0,0 +1,20 @@
|
||||
/* Derived from the test case in
|
||||
http://sourceware.org/bugzilla/show_bug.cgi?id=713. */
|
||||
#include <stdio.h>
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
FILE *fp = fmemopen ((char *) "hello", 5, "r");
|
||||
char buf[2];
|
||||
char *bp = fgets (buf, sizeof (buf), fp);
|
||||
printf ("fgets: %s\n", bp == buf ? "OK" : "ERROR");
|
||||
int res = bp != buf;
|
||||
bp = fgets_unlocked (buf, sizeof (buf), fp);
|
||||
printf ("fgets_unlocked: %s\n", bp == buf ? "OK" : "ERROR");
|
||||
res |= bp != buf;
|
||||
return res;
|
||||
}
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
#include "../test-skeleton.c"
|
68
stdio-common/tst-fmemopen2.c
Normal file
68
stdio-common/tst-fmemopen2.c
Normal file
@@ -0,0 +1,68 @@
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
int result = 0;
|
||||
char buf[100];
|
||||
FILE *fp = fmemopen (buf, sizeof (buf), "w");
|
||||
if (fp == NULL)
|
||||
{
|
||||
puts ("fmemopen failed");
|
||||
return 0;
|
||||
}
|
||||
static const char str[] = "hello world";
|
||||
#define nstr (sizeof (str) - 1)
|
||||
fputs (str, fp);
|
||||
off_t o = ftello (fp);
|
||||
if (o != nstr)
|
||||
{
|
||||
printf ("first ftello returned %ld, expected %zu\n", o, nstr);
|
||||
result = 1;
|
||||
}
|
||||
rewind (fp);
|
||||
o = ftello (fp);
|
||||
if (o != 0)
|
||||
{
|
||||
printf ("second ftello returned %ld, expected %zu\n", o, (off_t) 0);
|
||||
result = 1;
|
||||
}
|
||||
if (fseeko (fp, 0, SEEK_END) != 0)
|
||||
{
|
||||
puts ("fseeko failed");
|
||||
return 1;
|
||||
}
|
||||
o = ftello (fp);
|
||||
if (o != nstr)
|
||||
{
|
||||
printf ("third ftello returned %ld, expected %zu\n", o, nstr);
|
||||
result = 1;
|
||||
}
|
||||
rewind (fp);
|
||||
static const char str2[] = "just hello";
|
||||
#define nstr2 (sizeof (str2) - 1)
|
||||
assert (nstr2 < nstr);
|
||||
fputs (str2, fp);
|
||||
o = ftello (fp);
|
||||
if (o != nstr2)
|
||||
{
|
||||
printf ("fourth ftello returned %ld, expected %zu\n", o, nstr2);
|
||||
result = 1;
|
||||
}
|
||||
fclose (fp);
|
||||
static const char str3[] = "just hellod";
|
||||
if (strcmp (buf, str3) != 0)
|
||||
{
|
||||
printf ("final string is \"%s\", expected \"%s\"\n",
|
||||
buf, str3);
|
||||
result = 1;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
#include "../test-skeleton.c"
|
70
stdio-common/tst-fwrite.c
Normal file
70
stdio-common/tst-fwrite.c
Normal file
@@ -0,0 +1,70 @@
|
||||
/* Derived from the test case in
|
||||
http://sourceware.org/bugzilla/show_bug.cgi?id=1078. */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define OUT_SIZE 10000
|
||||
|
||||
|
||||
static int fd;
|
||||
|
||||
static void prepare (void);
|
||||
#define PREPARE(argc, argv) prepare ()
|
||||
|
||||
static int do_test (void);
|
||||
#define TEST_FUNCTION do_test ()
|
||||
|
||||
#include "../test-skeleton.c"
|
||||
|
||||
|
||||
static void
|
||||
prepare (void)
|
||||
{
|
||||
fd = create_temp_file ("tst-fwrite.", NULL);
|
||||
if (fd == -1)
|
||||
{
|
||||
puts ("cannot create temporary file");
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
FILE* f = fdopen (fd, "w+");
|
||||
if (f == NULL) {
|
||||
puts ("cannot create stream");
|
||||
return 1;
|
||||
}
|
||||
puts ("Opened temp file");
|
||||
|
||||
if (fwrite ("a", 1, 1, f) != 1)
|
||||
{
|
||||
puts ("1st fwrite failed");
|
||||
return 1;
|
||||
}
|
||||
puts ("Wrote a byte");
|
||||
fflush (f);
|
||||
|
||||
char buffer[10000];
|
||||
size_t i = fread (buffer, 1, sizeof (buffer), f);
|
||||
printf ("Read %zu bytes\n", i);
|
||||
|
||||
for (i = 0; i < OUT_SIZE; i++)
|
||||
{
|
||||
if (fwrite ("n", 1, 1, f) != 1)
|
||||
{
|
||||
printf ("fwrite in loop round %zu failed\n", i);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ((i + 1) % 1000 == 0)
|
||||
printf ("wrote %zu bytes ...\n", i + 1);
|
||||
}
|
||||
|
||||
printf ("Wrote %i bytes [done]\n", OUT_SIZE);
|
||||
|
||||
return 0;
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991,92,93,95,96,97,98,99, 2000, 2002
|
||||
/* Copyright (C) 1991,92,93,95,96,97,98,99, 2000, 2002, 2006
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
@@ -273,6 +273,15 @@ I am ready for my first lesson today.";
|
||||
|
||||
printf ("printf (\"%%hhu\", %u) = %hhu\n", UCHAR_MAX + 2, UCHAR_MAX + 2);
|
||||
printf ("printf (\"%%hu\", %u) = %hu\n", USHRT_MAX + 2, USHRT_MAX + 2);
|
||||
printf ("printf (\"%%hhi\", %i) = %hhi\n", UCHAR_MAX + 2, UCHAR_MAX + 2);
|
||||
printf ("printf (\"%%hi\", %i) = %hi\n", USHRT_MAX + 2, USHRT_MAX + 2);
|
||||
|
||||
printf ("printf (\"%%1$hhu\", %2$u) = %1$hhu\n",
|
||||
UCHAR_MAX + 2, UCHAR_MAX + 2);
|
||||
printf ("printf (\"%%1$hu\", %2$u) = %1$hu\n", USHRT_MAX + 2, USHRT_MAX + 2);
|
||||
printf ("printf (\"%%1$hhi\", %2$i) = %1$hhi\n",
|
||||
UCHAR_MAX + 2, UCHAR_MAX + 2);
|
||||
printf ("printf (\"%%1$hi\", %2$i) = %1$hi\n", USHRT_MAX + 2, USHRT_MAX + 2);
|
||||
|
||||
puts ("--- Should be no further output. ---");
|
||||
rfg1 ();
|
||||
|
@@ -1,6 +1,6 @@
|
||||
#! /bin/sh
|
||||
# Testing of printf.
|
||||
# Copyright (C) 2000, 2002 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2000, 2002, 2006 Free Software Foundation, Inc.
|
||||
# This file is part of the GNU C Library.
|
||||
#
|
||||
|
||||
@@ -136,6 +136,12 @@ Test ok.
|
||||
sprintf (buf, "%07Lo", 040000000000ll) = 40000000000
|
||||
printf ("%hhu", 257) = 1
|
||||
printf ("%hu", 65537) = 1
|
||||
printf ("%hhi", 257) = 1
|
||||
printf ("%hi", 65537) = 1
|
||||
printf ("%1$hhu", 257) = 1
|
||||
printf ("%1$hu", 65537) = 1
|
||||
printf ("%1$hhi", 257) = 1
|
||||
printf ("%1$hi", 65537) = 1
|
||||
--- Should be no further output. ---
|
||||
EOF
|
||||
cmp - ${common_objpfx}stdio-common/tst-printf.out > /dev/null 2>&1 ||
|
||||
@@ -246,6 +252,12 @@ Test ok.
|
||||
sprintf (buf, "%07Lo", 040000000000ll) = 40000000000
|
||||
printf ("%hhu", 257) = 1
|
||||
printf ("%hu", 65537) = 1
|
||||
printf ("%hhi", 257) = 1
|
||||
printf ("%hi", 65537) = 1
|
||||
printf ("%1$hhu", 257) = 1
|
||||
printf ("%1$hu", 65537) = 1
|
||||
printf ("%1$hhi", 257) = 1
|
||||
printf ("%1$hi", 65537) = 1
|
||||
--- Should be no further output. ---
|
||||
EOF
|
||||
cmp - ${common_objpfx}stdio-common/tst-printf.out > /dev/null 2>&1 ||
|
||||
|
33
stdio-common/tst-put-error.c
Normal file
33
stdio-common/tst-put-error.c
Normal file
@@ -0,0 +1,33 @@
|
||||
#include <errno.h>
|
||||
#include <error.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
char tmpl[] = "/tmp/tst-put-error.XXXXXX";
|
||||
int fd = mkstemp (tmpl);
|
||||
if (fd == -1)
|
||||
error (EXIT_FAILURE, errno, "cannot create temporary file");
|
||||
FILE *fp = fdopen (fd, "w");
|
||||
if (fp == NULL)
|
||||
error (EXIT_FAILURE, errno, "fdopen");
|
||||
setlinebuf (fp);
|
||||
close (fd);
|
||||
unlink (tmpl);
|
||||
int n = fprintf (fp, "hello world\n");
|
||||
printf ("fprintf = %d\n", n);
|
||||
if (n >= 0)
|
||||
error (EXIT_FAILURE, 0, "first fprintf succeeded");
|
||||
n = fprintf (fp, "hello world\n");
|
||||
printf ("fprintf = %d\n", n);
|
||||
if (n >= 0)
|
||||
error (EXIT_FAILURE, 0, "second fprintf succeeded");
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
#include "../test-skeleton.c"
|
@@ -37,5 +37,26 @@ main (void)
|
||||
free (dst);
|
||||
}
|
||||
|
||||
if (sprintf (buf, "%1$d%3$.*2$s%4$d", 7, 67108863, "x", 8) != 3
|
||||
|| strcmp (buf, "7x8") != 0)
|
||||
{
|
||||
printf ("sprintf (buf, \"%%1$d%%3$.*2$s%%4$d\", 7, 67108863, \"x\", 8) produced `%s' output", buf);
|
||||
result = 1;
|
||||
}
|
||||
|
||||
if (sprintf (buf, "%67108863.16\"%d", 7) != 14
|
||||
|| strcmp (buf, "%67108863.16\"7") != 0)
|
||||
{
|
||||
printf ("sprintf (buf, \"%%67108863.16\\\"%%d\", 7) produced `%s' output", buf);
|
||||
result = 1;
|
||||
}
|
||||
|
||||
if (sprintf (buf, "%*\"%d", 0x3ffffff, 7) != 11
|
||||
|| strcmp (buf, "%67108863\"7") != 0)
|
||||
{
|
||||
printf ("sprintf (buf, \"%%*\\\"%%d\", 0x3ffffff, 7) produced `%s' output", buf);
|
||||
result = 1;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
82
stdio-common/tst-sprintf2.c
Normal file
82
stdio-common/tst-sprintf2.c
Normal file
@@ -0,0 +1,82 @@
|
||||
#include <float.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
volatile union { long double l; long long x[2]; } u, v;
|
||||
char buf[64];
|
||||
int result = 0;
|
||||
|
||||
#if LDBL_MANT_DIG == 106 || LDBL_MANT_DIG == 113
|
||||
# define COMPARE_LDBL(u, v) \
|
||||
((u).l == (v).l && (u).x[0] == (v).x[0] && (u).x[1] == (v).x[1])
|
||||
#else
|
||||
# define COMPARE_LDBL(u, v) ((u).l == (v).l)
|
||||
#endif
|
||||
|
||||
#define TEST(val) \
|
||||
do \
|
||||
{ \
|
||||
u.l = (val); \
|
||||
snprintf (buf, sizeof buf, "%LaL", u.l); \
|
||||
if (strcmp (buf, #val) != 0) \
|
||||
{ \
|
||||
printf ("Error on line %d: %s != %s\n", __LINE__, buf, #val); \
|
||||
result = 1; \
|
||||
} \
|
||||
if (sscanf (#val, "%La", &v.l) != 1 || !COMPARE_LDBL (u, v)) \
|
||||
{ \
|
||||
printf ("Error sscanf on line %d: %La != %La\n", __LINE__, \
|
||||
u.l, v.l); \
|
||||
result = 1; \
|
||||
} \
|
||||
/* printf ("%s %La %016Lx %016Lx\n", #val, u.l, u.x[0], u.x[1]); */ \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
#if LDBL_MANT_DIG >= 106
|
||||
# if LDBL_MANT_DIG == 106
|
||||
TEST (0x0.ffffffffffffp-1022L);
|
||||
TEST (0x0.ffffffffffff1p-1022L);
|
||||
TEST (0x0.fffffffffffffp-1022L);
|
||||
# endif
|
||||
TEST (0x1p-1022L);
|
||||
TEST (0x1.0000000000001p-1022L);
|
||||
TEST (0x1.00000000001e7p-1022L);
|
||||
TEST (0x1.fffffffffffffp-1022L);
|
||||
TEST (0x1p-1021L);
|
||||
TEST (0x1.00000000000008p-1021L);
|
||||
TEST (0x1.0000000000001p-1021L);
|
||||
TEST (0x1.00000000000018p-1021L);
|
||||
TEST (0x1.0000000000000f8p-1017L);
|
||||
TEST (0x1.0000000000001p-1017L);
|
||||
TEST (0x1.000000000000108p-1017L);
|
||||
TEST (0x1.000000000000dcf8p-1013L);
|
||||
TEST (0x1.000000000000ddp-1013L);
|
||||
TEST (0x1.000000000000dd08p-1013L);
|
||||
TEST (0x1.ffffffffffffffffffffffffffp-1L);
|
||||
TEST (0x1.ffffffffffffffffffffffffff8p-1L);
|
||||
TEST (0x1p+0L);
|
||||
TEST (0x1.000000000000000000000000008p+0L);
|
||||
TEST (0x1.00000000000000000000000001p+0L);
|
||||
TEST (0x1.000000000000000000000000018p+0L);
|
||||
TEST (0x1.23456789abcdef123456789abc8p+0L);
|
||||
TEST (0x1.23456789abcde7123456789abc8p+0L);
|
||||
TEST (0x1.23456789abcdef123456789abc8p+64L);
|
||||
TEST (0x1.23456789abcde7123456789abc8p+64L);
|
||||
TEST (0x1.123456789abcdef123456789p-969L);
|
||||
# if LDBL_MANT_DIG == 106
|
||||
TEST (-0x1.2d71957cc1263bbbeb1d365f1e8p-969L);
|
||||
TEST (0x1.23456789abcdef0123456789abp-970L);
|
||||
TEST (0x1.579bde02468acp-1001L);
|
||||
TEST (0x0.abcdef0123456p-1022L);
|
||||
TEST (0x1.abcdef0123456p-1022L);
|
||||
TEST (0x1.abcdef012345678p-1014L);
|
||||
TEST (0x1.abcdef0123456f8p-1014L);
|
||||
# endif
|
||||
#endif
|
||||
return result;
|
||||
}
|
@@ -46,6 +46,9 @@ t2 (void)
|
||||
return result;
|
||||
}
|
||||
|
||||
volatile double nanval;
|
||||
|
||||
|
||||
static int
|
||||
F (void)
|
||||
{
|
||||
@@ -53,8 +56,9 @@ F (void)
|
||||
wchar_t wbuf[10];
|
||||
int result;
|
||||
|
||||
snprintf (buf, sizeof buf, "%f %F", DBL_MAX * DBL_MAX - DBL_MAX * DBL_MAX,
|
||||
DBL_MAX * DBL_MAX - DBL_MAX * DBL_MAX);
|
||||
nanval = NAN;
|
||||
|
||||
snprintf (buf, sizeof buf, "%f %F", nanval, nanval);
|
||||
result = strcmp (buf, "nan NAN") != 0;
|
||||
printf ("expected \"nan NAN\", got \"%s\"\n", buf);
|
||||
|
||||
@@ -62,9 +66,7 @@ F (void)
|
||||
result |= strcmp (buf, "inf INF") != 0;
|
||||
printf ("expected \"inf INF\", got \"%s\"\n", buf);
|
||||
|
||||
swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%f %F",
|
||||
DBL_MAX * DBL_MAX - DBL_MAX * DBL_MAX,
|
||||
DBL_MAX * DBL_MAX - DBL_MAX * DBL_MAX);
|
||||
swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%f %F", nanval, nanval);
|
||||
result |= wcscmp (wbuf, L"nan NAN") != 0;
|
||||
printf ("expected L\"nan NAN\", got L\"%S\"\n", wbuf);
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991,92,96,97,98,99,2000,2001 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991,92,1996-2001,2007 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
|
||||
@@ -272,7 +272,7 @@ main (int argc, char **argv)
|
||||
res = sscanf ("0x1234", "%lf", &d);
|
||||
printf ("res = %d, d = %f\n", res, d);
|
||||
|
||||
if (res != 0 || d != 123456.789)
|
||||
if (res != 1 || d != 4660)
|
||||
{
|
||||
fputs ("test failed!\n", stdout);
|
||||
result = 1;
|
||||
|
@@ -1,4 +1,5 @@
|
||||
/* Copyright (C) 1991-2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991-2002, 2003, 2004, 2005, 2006, 2007
|
||||
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
|
||||
@@ -64,7 +65,7 @@
|
||||
#define UNBUFFERED_P(S) ((S)->_IO_file_flags & _IO_UNBUFFERED)
|
||||
|
||||
#ifndef COMPILE_WPRINTF
|
||||
# define vfprintf _IO_vfprintf
|
||||
# define vfprintf _IO_vfprintf_internal
|
||||
# define CHAR_T char
|
||||
# define UCHAR_T unsigned char
|
||||
# define INT_T int
|
||||
@@ -257,7 +258,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||
|
||||
#define NOT_IN_JUMP_RANGE(Ch) ((Ch) < L_(' ') || (Ch) > L_('z'))
|
||||
#define CHAR_CLASS(Ch) (jump_table[(INT_T) (Ch) - L_(' ')])
|
||||
#if defined HAVE_SUBTRACT_LOCAL_LABELS && defined SHARED
|
||||
#ifdef SHARED
|
||||
/* 'int' is enough and it saves some space on 64 bit systems. */
|
||||
# define JUMP_TABLE_TYPE const int
|
||||
# define JUMP(ChExpr, table) \
|
||||
@@ -529,14 +530,24 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||
{ \
|
||||
if (is_long_num) \
|
||||
signed_number = va_arg (ap, long int); \
|
||||
else /* `char' and `short int' will be promoted to `int'. */ \
|
||||
else if (is_char) \
|
||||
signed_number = (signed char) va_arg (ap, unsigned int); \
|
||||
else if (!is_short) \
|
||||
signed_number = va_arg (ap, int); \
|
||||
else \
|
||||
signed_number = (short int) va_arg (ap, unsigned int); \
|
||||
} \
|
||||
else \
|
||||
if (is_long_num) \
|
||||
signed_number = args_value[fspec->data_arg].pa_long_int; \
|
||||
else /* `char' and `short int' will be promoted to `int'. */ \
|
||||
else if (is_char) \
|
||||
signed_number = (signed char) \
|
||||
args_value[fspec->data_arg].pa_u_int; \
|
||||
else if (!is_short) \
|
||||
signed_number = args_value[fspec->data_arg].pa_int; \
|
||||
else \
|
||||
signed_number = (short int) \
|
||||
args_value[fspec->data_arg].pa_u_int; \
|
||||
\
|
||||
is_negative = signed_number < 0; \
|
||||
number.word = is_negative ? (- signed_number) : signed_number; \
|
||||
@@ -758,6 +769,9 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||
\
|
||||
if (fspec == NULL) \
|
||||
{ \
|
||||
if (__ldbl_is_dbl) \
|
||||
is_long_double = 0; \
|
||||
\
|
||||
struct printf_info info = { .prec = prec, \
|
||||
.width = width, \
|
||||
.spec = spec, \
|
||||
@@ -785,6 +799,11 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||
else \
|
||||
{ \
|
||||
ptr = (const void *) &args_value[fspec->data_arg]; \
|
||||
if (__ldbl_is_dbl) \
|
||||
{ \
|
||||
fspec->data_arg_type = PA_DOUBLE; \
|
||||
fspec->info.is_long_double = 0; \
|
||||
} \
|
||||
\
|
||||
function_done = __printf_fp (s, &fspec->info, &ptr); \
|
||||
} \
|
||||
@@ -808,6 +827,9 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||
\
|
||||
if (fspec == NULL) \
|
||||
{ \
|
||||
if (__ldbl_is_dbl) \
|
||||
is_long_double = 0; \
|
||||
\
|
||||
struct printf_info info = { .prec = prec, \
|
||||
.width = width, \
|
||||
.spec = spec, \
|
||||
@@ -834,6 +856,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||
else \
|
||||
{ \
|
||||
ptr = (const void *) &args_value[fspec->data_arg]; \
|
||||
if (__ldbl_is_dbl) \
|
||||
fspec->info.is_long_double = 0; \
|
||||
\
|
||||
function_done = __printf_fphex (s, &fspec->info, &ptr); \
|
||||
} \
|
||||
@@ -1001,10 +1025,11 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||
const char *mbs = (const char *) string; \
|
||||
mbstate_t mbstate; \
|
||||
\
|
||||
len = prec != -1 ? (size_t) prec : strlen (mbs); \
|
||||
len = prec != -1 ? __strnlen (mbs, (size_t) prec) : strlen (mbs); \
|
||||
\
|
||||
/* Allocate dynamically an array which definitely is long \
|
||||
enough for the wide character version. */ \
|
||||
enough for the wide character version. Each byte in the \
|
||||
multi-byte string can produce at most one wide character. */ \
|
||||
if (__libc_use_alloca (len * sizeof (wchar_t))) \
|
||||
string = (CHAR_T *) alloca (len * sizeof (wchar_t)); \
|
||||
else if ((string = (CHAR_T *) malloc (len * sizeof (wchar_t))) \
|
||||
@@ -1135,19 +1160,26 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||
else \
|
||||
{ \
|
||||
/* In case we have a multibyte character set the \
|
||||
situation is more compilcated. We must not copy \
|
||||
situation is more complicated. We must not copy \
|
||||
bytes at the end which form an incomplete character. */\
|
||||
wchar_t ignore[prec]; \
|
||||
size_t ignore_size = (unsigned) prec > 1024 ? 1024 : prec;\
|
||||
wchar_t ignore[ignore_size]; \
|
||||
const char *str2 = string; \
|
||||
mbstate_t ps; \
|
||||
const char *strend = string + prec; \
|
||||
if (strend < string) \
|
||||
strend = (const char *) UINTPTR_MAX; \
|
||||
\
|
||||
mbstate_t ps; \
|
||||
memset (&ps, '\0', sizeof (ps)); \
|
||||
if (__mbsnrtowcs (ignore, &str2, prec, prec, &ps) \
|
||||
== (size_t) -1) \
|
||||
{ \
|
||||
done = -1; \
|
||||
goto all_done; \
|
||||
} \
|
||||
\
|
||||
while (str2 != NULL && str2 < strend) \
|
||||
if (__mbsnrtowcs (ignore, &str2, strend - str2, \
|
||||
ignore_size, &ps) == (size_t) -1) \
|
||||
{ \
|
||||
done = -1; \
|
||||
goto all_done; \
|
||||
} \
|
||||
\
|
||||
if (str2 == NULL) \
|
||||
len = strlen (string); \
|
||||
else \
|
||||
@@ -1283,7 +1315,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||
/* Process whole format string. */
|
||||
do
|
||||
{
|
||||
#if defined HAVE_SUBTRACT_LOCAL_LABELS && defined SHARED
|
||||
#ifdef SHARED
|
||||
# define REF(Name) &&do_##Name - &&do_form_unknown
|
||||
#else
|
||||
# define REF(Name) &&do_##Name
|
||||
@@ -1594,6 +1626,8 @@ do_positional:
|
||||
/* Just a counter. */
|
||||
size_t cnt;
|
||||
|
||||
free (workstart);
|
||||
workstart = NULL;
|
||||
|
||||
if (grouping == (const char *) -1)
|
||||
{
|
||||
@@ -1704,7 +1738,15 @@ do_positional:
|
||||
T (PA_INT|PA_FLAG_LONG_LONG, pa_long_long_int, long long int);
|
||||
T (PA_FLOAT, pa_double, double); /* Promoted. */
|
||||
T (PA_DOUBLE, pa_double, double);
|
||||
T (PA_DOUBLE|PA_FLAG_LONG_DOUBLE, pa_long_double, long double);
|
||||
case PA_DOUBLE|PA_FLAG_LONG_DOUBLE:
|
||||
if (__ldbl_is_dbl)
|
||||
{
|
||||
args_value[cnt].pa_double = va_arg (ap_save, double);
|
||||
args_type[cnt] &= ~PA_FLAG_LONG_DOUBLE;
|
||||
}
|
||||
else
|
||||
args_value[cnt].pa_long_double = va_arg (ap_save, long double);
|
||||
break;
|
||||
T (PA_STRING, pa_string, const char *);
|
||||
T (PA_WSTRING, pa_wstring, const wchar_t *);
|
||||
T (PA_POINTER, pa_pointer, void *);
|
||||
@@ -1726,7 +1768,7 @@ do_positional:
|
||||
for (; (size_t) nspecs_done < nspecs; ++nspecs_done)
|
||||
{
|
||||
#undef REF
|
||||
#if defined HAVE_SUBTRACT_LOCAL_LABELS && defined SHARED
|
||||
#ifdef SHARED
|
||||
# define REF(Name) &&do2_##Name - &&do_form_unknown
|
||||
#else
|
||||
# define REF(Name) &&do2_##Name
|
||||
@@ -1760,7 +1802,9 @@ do_positional:
|
||||
int use_outdigits = specs[nspecs_done].info.i18n;
|
||||
char pad = specs[nspecs_done].info.pad;
|
||||
CHAR_T spec = specs[nspecs_done].info.spec;
|
||||
CHAR_T *workstart = NULL;
|
||||
|
||||
workstart = NULL;
|
||||
workend = &work_buffer[sizeof (work_buffer) / sizeof (CHAR_T)];
|
||||
|
||||
/* Fill in last information. */
|
||||
if (specs[nspecs_done].width_arg != -1)
|
||||
@@ -1856,8 +1900,7 @@ do_positional:
|
||||
break;
|
||||
}
|
||||
|
||||
if (__builtin_expect (workstart != NULL, 0))
|
||||
free (workstart);
|
||||
free (workstart);
|
||||
workstart = NULL;
|
||||
|
||||
/* Write the following constant string. */
|
||||
@@ -1885,7 +1928,7 @@ printf_unknown (FILE *s, const struct printf_info *info,
|
||||
|
||||
{
|
||||
int done = 0;
|
||||
CHAR_T work_buffer[MAX (info->width, info->spec) + 32];
|
||||
CHAR_T work_buffer[MAX (sizeof (info->width), sizeof (info->prec)) * 3];
|
||||
CHAR_T *const workend
|
||||
= &work_buffer[sizeof (work_buffer) / sizeof (CHAR_T)];
|
||||
register CHAR_T *w;
|
||||
@@ -2154,25 +2197,11 @@ buffered_vfprintf (register _IO_FILE *s, const CHAR_T *format,
|
||||
}
|
||||
|
||||
#undef vfprintf
|
||||
#ifdef strong_alias
|
||||
/* This is for glibc. */
|
||||
# ifdef COMPILE_WPRINTF
|
||||
#ifdef COMPILE_WPRINTF
|
||||
strong_alias (_IO_vfwprintf, __vfwprintf);
|
||||
weak_alias (_IO_vfwprintf, vfwprintf);
|
||||
# else
|
||||
strong_alias (_IO_vfprintf, vfprintf);
|
||||
libc_hidden_def (vfprintf)
|
||||
INTDEF(_IO_vfprintf)
|
||||
# endif
|
||||
ldbl_weak_alias (_IO_vfwprintf, vfwprintf);
|
||||
#else
|
||||
# if defined __ELF__ || defined __GNU_LIBRARY__
|
||||
# include <gnu-stabs.h>
|
||||
# ifdef weak_alias
|
||||
# ifdef COMPILE_WPRINTF
|
||||
weak_alias (_IO_vfwprintf, vfwprintf);
|
||||
# else
|
||||
weak_alias (_IO_vfprintf, vfprintf);
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
ldbl_strong_alias (_IO_vfprintf_internal, vfprintf);
|
||||
ldbl_hidden_def (_IO_vfprintf_internal, vfprintf)
|
||||
ldbl_strong_alias (_IO_vfprintf_internal, _IO_vfprintf);
|
||||
#endif
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991-2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991-2006, 2007 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
|
||||
@@ -144,11 +144,6 @@
|
||||
if (done == 0) done = EOF; \
|
||||
goto errout; \
|
||||
} while (0)
|
||||
#define memory_error() do { \
|
||||
__set_errno (ENOMEM); \
|
||||
done = EOF; \
|
||||
goto errout; \
|
||||
} while (0)
|
||||
#define ARGCHECK(s, format) \
|
||||
do \
|
||||
{ \
|
||||
@@ -178,18 +173,12 @@
|
||||
Return the number of assignments made, or -1 for an input error. */
|
||||
#ifdef COMPILE_WSCANF
|
||||
int
|
||||
_IO_vfwscanf (s, format, argptr, errp)
|
||||
_IO_FILE *s;
|
||||
const wchar_t *format;
|
||||
_IO_va_list argptr;
|
||||
int *errp;
|
||||
_IO_vfwscanf (_IO_FILE *s, const wchar_t *format, _IO_va_list argptr,
|
||||
int *errp)
|
||||
#else
|
||||
int
|
||||
_IO_vfscanf (s, format, argptr, errp)
|
||||
_IO_FILE *s;
|
||||
const char *format;
|
||||
_IO_va_list argptr;
|
||||
int *errp;
|
||||
_IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr,
|
||||
int *errp)
|
||||
#endif
|
||||
{
|
||||
va_list arg;
|
||||
@@ -360,7 +349,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
do
|
||||
{
|
||||
c = inchar ();
|
||||
if (c == EOF)
|
||||
if (__builtin_expect (c == EOF, 0))
|
||||
input_error ();
|
||||
else if (c != (unsigned char) *f++)
|
||||
{
|
||||
@@ -388,7 +377,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
c = inchar ();
|
||||
|
||||
/* Characters other than format specs must just match. */
|
||||
if (c == EOF)
|
||||
if (__builtin_expect (c == EOF, 0))
|
||||
input_error ();
|
||||
|
||||
/* We saw white space char as the last character in the format
|
||||
@@ -396,12 +385,12 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
if (skip_space)
|
||||
{
|
||||
while (ISSPACE (c))
|
||||
if (inchar () == EOF)
|
||||
if (__builtin_expect (inchar () == EOF, 0))
|
||||
input_error ();
|
||||
skip_space = 0;
|
||||
}
|
||||
|
||||
if (c != fc)
|
||||
if (__builtin_expect (c != fc, 0))
|
||||
{
|
||||
ungetc (c, s);
|
||||
conv_error ();
|
||||
@@ -537,7 +526,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
}
|
||||
|
||||
/* End of the format string? */
|
||||
if (*f == L_('\0'))
|
||||
if (__builtin_expect (*f == L_('\0'), 0))
|
||||
conv_error ();
|
||||
|
||||
/* Find the conversion specifier. */
|
||||
@@ -549,7 +538,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
int save_errno = errno;
|
||||
errno = 0;
|
||||
do
|
||||
if (inchar () == EOF && errno == EINTR)
|
||||
if (__builtin_expect (inchar () == EOF && errno == EINTR, 0))
|
||||
input_error ();
|
||||
while (ISSPACE (c));
|
||||
errno = save_errno;
|
||||
@@ -561,9 +550,9 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
{
|
||||
case L_('%'): /* Must match a literal '%'. */
|
||||
c = inchar ();
|
||||
if (c == EOF)
|
||||
if (__builtin_expect (c == EOF, 0))
|
||||
input_error ();
|
||||
if (c != fc)
|
||||
if (__builtin_expect (c != fc, 0))
|
||||
{
|
||||
ungetc_not_eof (c, s);
|
||||
conv_error ();
|
||||
@@ -629,7 +618,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
}
|
||||
|
||||
c = inchar ();
|
||||
if (c == EOF)
|
||||
if (__builtin_expect (c == EOF, 0))
|
||||
input_error ();
|
||||
|
||||
if (width == -1)
|
||||
@@ -645,7 +634,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
size_t n;
|
||||
|
||||
n = __wcrtomb (!(flags & SUPPRESS) ? str : NULL, c, &state);
|
||||
if (n == (size_t) -1)
|
||||
if (__builtin_expect (n == (size_t) -1, 0))
|
||||
/* No valid wide character. */
|
||||
input_error ();
|
||||
|
||||
@@ -680,7 +669,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
}
|
||||
|
||||
c = inchar ();
|
||||
if (c == EOF)
|
||||
if (__builtin_expect (c == EOF, 0))
|
||||
input_error ();
|
||||
|
||||
#ifdef COMPILE_WSCANF
|
||||
@@ -718,14 +707,14 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
{
|
||||
/* Possibly correct character, just not enough
|
||||
input. */
|
||||
if (inchar () == EOF)
|
||||
if (__builtin_expect (inchar () == EOF, 0))
|
||||
encode_error ();
|
||||
|
||||
buf[0] = c;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (n != 1)
|
||||
if (__builtin_expect (n != 1, 0))
|
||||
encode_error ();
|
||||
|
||||
/* We have a match. */
|
||||
@@ -769,7 +758,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
STRING_ARG (str, char);
|
||||
|
||||
c = inchar ();
|
||||
if (c == EOF)
|
||||
if (__builtin_expect (c == EOF, 0))
|
||||
input_error ();
|
||||
|
||||
#ifdef COMPILE_WSCANF
|
||||
@@ -832,7 +821,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
|
||||
n = __wcrtomb (!(flags & SUPPRESS) ? str : NULL, c,
|
||||
&state);
|
||||
if (n == (size_t) -1)
|
||||
if (__builtin_expect (n == (size_t) -1, 0))
|
||||
encode_error ();
|
||||
|
||||
assert (n <= MB_CUR_MAX);
|
||||
@@ -940,7 +929,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
STRING_ARG (wstr, wchar_t);
|
||||
|
||||
c = inchar ();
|
||||
if (c == EOF)
|
||||
if (__builtin_expect (c == EOF, 0))
|
||||
input_error ();
|
||||
|
||||
#ifndef COMPILE_WSCANF
|
||||
@@ -1015,14 +1004,14 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
{
|
||||
/* Possibly correct character, just not enough
|
||||
input. */
|
||||
if (inchar () == EOF)
|
||||
if (__builtin_expect (inchar () == EOF, 0))
|
||||
encode_error ();
|
||||
|
||||
buf[0] = c;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (n != 1)
|
||||
if (__builtin_expect (n != 1, 0))
|
||||
encode_error ();
|
||||
|
||||
/* We have a match. */
|
||||
@@ -1117,7 +1106,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
|
||||
number:
|
||||
c = inchar ();
|
||||
if (c == EOF)
|
||||
if (__builtin_expect (c == EOF, 0))
|
||||
input_error ();
|
||||
|
||||
/* Check for a sign. */
|
||||
@@ -1156,7 +1145,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
if (base == 0)
|
||||
base = 10;
|
||||
|
||||
if (base == 10 && (flags & I18N) != 0)
|
||||
if (base == 10 && __builtin_expect ((flags & I18N) != 0, 0))
|
||||
{
|
||||
int from_level;
|
||||
int to_level;
|
||||
@@ -1516,12 +1505,14 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
{
|
||||
/* There was no number. If we are supposed to read a pointer
|
||||
we must recognize "(nil)" as well. */
|
||||
if (wpsize == 0 && read_pointer && (width < 0 || width >= 0)
|
||||
&& c == '('
|
||||
&& TOLOWER (inchar ()) == L_('n')
|
||||
&& TOLOWER (inchar ()) == L_('i')
|
||||
&& TOLOWER (inchar ()) == L_('l')
|
||||
&& inchar () == L_(')'))
|
||||
if (__builtin_expect (wpsize == 0
|
||||
&& read_pointer
|
||||
&& (width < 0 || width >= 0)
|
||||
&& c == '('
|
||||
&& TOLOWER (inchar ()) == L_('n')
|
||||
&& TOLOWER (inchar ()) == L_('i')
|
||||
&& TOLOWER (inchar ()) == L_('l')
|
||||
&& inchar () == L_(')'), 1))
|
||||
/* We must produce the value of a NULL pointer. A single
|
||||
'0' digit is enough. */
|
||||
ADDW (L_('0'));
|
||||
@@ -1554,7 +1545,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
else
|
||||
num.ul = __strtoul_internal (wp, &tw, base, flags & GROUP);
|
||||
}
|
||||
if (wp == tw)
|
||||
if (__builtin_expect (wp == tw, 0))
|
||||
conv_error ();
|
||||
|
||||
if (!(flags & SUPPRESS))
|
||||
@@ -1599,21 +1590,23 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
case L_('a'):
|
||||
case L_('A'):
|
||||
c = inchar ();
|
||||
if (c == EOF)
|
||||
if (__builtin_expect (c == EOF, 0))
|
||||
input_error ();
|
||||
|
||||
got_dot = got_e = 0;
|
||||
|
||||
/* Check for a sign. */
|
||||
if (c == L_('-') || c == L_('+'))
|
||||
{
|
||||
negative = c == L_('-');
|
||||
if (width == 0 || inchar () == EOF)
|
||||
if (__builtin_expect (width == 0 || inchar () == EOF, 0))
|
||||
/* EOF is only an input error before we read any chars. */
|
||||
conv_error ();
|
||||
if (! ISDIGIT (c) && TOLOWER (c) != L_('i')
|
||||
&& TOLOWER (c) != L_('n'))
|
||||
{
|
||||
#ifdef COMPILE_WSCANF
|
||||
if (c != decimal)
|
||||
if (__builtin_expect (c != decimal, 0))
|
||||
{
|
||||
/* This is no valid number. */
|
||||
ungetc (c, s);
|
||||
@@ -1629,17 +1622,16 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
const char *cmpp = decimal;
|
||||
int avail = width > 0 ? width : INT_MAX;
|
||||
|
||||
while ((unsigned char) *cmpp == c && avail > 0)
|
||||
while ((unsigned char) *cmpp == c && avail-- > 0)
|
||||
if (*++cmpp == '\0')
|
||||
break;
|
||||
else
|
||||
{
|
||||
if (inchar () == EOF)
|
||||
break;
|
||||
--avail;
|
||||
}
|
||||
|
||||
if (*cmpp != '\0')
|
||||
if (__builtin_expect (*cmpp != '\0', 0))
|
||||
{
|
||||
/* This is no valid number. */
|
||||
while (1)
|
||||
@@ -1652,6 +1644,17 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
|
||||
conv_error ();
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Add all the characters. */
|
||||
for (cmpp = decimal; *cmpp != '\0'; ++cmpp)
|
||||
ADDW ((unsigned char) *cmpp);
|
||||
if (width > 0)
|
||||
width = avail;
|
||||
got_dot = 1;
|
||||
|
||||
c = inchar ();
|
||||
}
|
||||
if (width > 0)
|
||||
width = avail;
|
||||
#endif
|
||||
@@ -1667,12 +1670,16 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
{
|
||||
/* Maybe "nan". */
|
||||
ADDW (c);
|
||||
if (width == 0 || inchar () == EOF || TOLOWER (c) != L_('a'))
|
||||
if (__builtin_expect (width == 0
|
||||
|| inchar () == EOF
|
||||
|| TOLOWER (c) != L_('a'), 0))
|
||||
conv_error ();
|
||||
if (width > 0)
|
||||
--width;
|
||||
ADDW (c);
|
||||
if (width == 0 || inchar () == EOF || TOLOWER (c) != L_('n'))
|
||||
if (__builtin_expect (width == 0
|
||||
|| inchar () == EOF
|
||||
|| TOLOWER (c) != L_('n'), 0))
|
||||
conv_error ();
|
||||
if (width > 0)
|
||||
--width;
|
||||
@@ -1684,12 +1691,16 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
{
|
||||
/* Maybe "inf" or "infinity". */
|
||||
ADDW (c);
|
||||
if (width == 0 || inchar () == EOF || TOLOWER (c) != L_('n'))
|
||||
if (__builtin_expect (width == 0
|
||||
|| inchar () == EOF
|
||||
|| TOLOWER (c) != L_('n'), 0))
|
||||
conv_error ();
|
||||
if (width > 0)
|
||||
--width;
|
||||
ADDW (c);
|
||||
if (width == 0 || inchar () == EOF || TOLOWER (c) != L_('f'))
|
||||
if (__builtin_expect (width == 0
|
||||
|| inchar () == EOF
|
||||
|| TOLOWER (c) != L_('f'), 0))
|
||||
conv_error ();
|
||||
if (width > 0)
|
||||
--width;
|
||||
@@ -1703,26 +1714,30 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
--width;
|
||||
/* Now we have to read the rest as well. */
|
||||
ADDW (c);
|
||||
if (width == 0 || inchar () == EOF
|
||||
|| TOLOWER (c) != L_('n'))
|
||||
if (__builtin_expect (width == 0
|
||||
|| inchar () == EOF
|
||||
|| TOLOWER (c) != L_('n'), 0))
|
||||
conv_error ();
|
||||
if (width > 0)
|
||||
--width;
|
||||
ADDW (c);
|
||||
if (width == 0 || inchar () == EOF
|
||||
|| TOLOWER (c) != L_('i'))
|
||||
if (__builtin_expect (width == 0
|
||||
|| inchar () == EOF
|
||||
|| TOLOWER (c) != L_('i'), 0))
|
||||
conv_error ();
|
||||
if (width > 0)
|
||||
--width;
|
||||
ADDW (c);
|
||||
if (width == 0 || inchar () == EOF
|
||||
|| TOLOWER (c) != L_('t'))
|
||||
if (__builtin_expect (width == 0
|
||||
|| inchar () == EOF
|
||||
|| TOLOWER (c) != L_('t'), 0))
|
||||
conv_error ();
|
||||
if (width > 0)
|
||||
--width;
|
||||
ADDW (c);
|
||||
if (width == 0 || inchar () == EOF
|
||||
|| TOLOWER (c) != L_('y'))
|
||||
if (__builtin_expect (width == 0
|
||||
|| inchar () == EOF
|
||||
|| TOLOWER (c) != L_('y'), 0))
|
||||
conv_error ();
|
||||
if (width > 0)
|
||||
--width;
|
||||
@@ -1759,7 +1774,6 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
}
|
||||
}
|
||||
|
||||
got_dot = got_e = 0;
|
||||
do
|
||||
{
|
||||
if (ISDIGIT (c))
|
||||
@@ -1873,20 +1887,20 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
|
||||
/* Have we read any character? If we try to read a number
|
||||
in hexadecimal notation and we have read only the `0x'
|
||||
prefix or no exponent this is an error. */
|
||||
if (wpsize == 0 || (is_hexa && (wpsize == 2 || ! got_e)))
|
||||
prefix this is an error. */
|
||||
if (__builtin_expect (wpsize == 0 || (is_hexa && wpsize == 2), 0))
|
||||
conv_error ();
|
||||
|
||||
scan_float:
|
||||
/* Convert the number. */
|
||||
ADDW (L_('\0'));
|
||||
if (flags & LONGDBL)
|
||||
if ((flags & LONGDBL) && !__ldbl_is_dbl)
|
||||
{
|
||||
long double d = __strtold_internal (wp, &tw, flags & GROUP);
|
||||
if (!(flags & SUPPRESS) && tw != wp)
|
||||
*ARG (long double *) = negative ? -d : d;
|
||||
}
|
||||
else if (flags & LONG)
|
||||
else if (flags & (LONG | LONGDBL))
|
||||
{
|
||||
double d = __strtod_internal (wp, &tw, flags & GROUP);
|
||||
if (!(flags & SUPPRESS) && tw != wp)
|
||||
@@ -1899,7 +1913,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
*ARG (float *) = negative ? -d : d;
|
||||
}
|
||||
|
||||
if (tw == wp)
|
||||
if (__builtin_expect (tw == wp, 0))
|
||||
conv_error ();
|
||||
|
||||
if (!(flags & SUPPRESS))
|
||||
@@ -1939,7 +1953,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
|
||||
while ((fc = *f++) != L'\0' && fc != L']');
|
||||
|
||||
if (fc == L'\0')
|
||||
if (__builtin_expect (fc == L'\0', 0))
|
||||
conv_error ();
|
||||
wp = (wchar_t *) f - 1;
|
||||
#else
|
||||
@@ -1975,7 +1989,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
/* Add the character to the flag map. */
|
||||
wp[fc] = 1;
|
||||
|
||||
if (fc == '\0')
|
||||
if (__builtin_expect (fc == '\0', 0))
|
||||
conv_error();
|
||||
#endif
|
||||
|
||||
@@ -1983,7 +1997,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
{
|
||||
size_t now = read_in;
|
||||
#ifdef COMPILE_WSCANF
|
||||
if (inchar () == WEOF)
|
||||
if (__builtin_expect (inchar () == WEOF, 0))
|
||||
input_error ();
|
||||
|
||||
do
|
||||
@@ -2088,7 +2102,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
size_t cnt = 0;
|
||||
mbstate_t cstate;
|
||||
|
||||
if (inchar () == EOF)
|
||||
if (__builtin_expect (inchar () == EOF, 0))
|
||||
input_error ();
|
||||
|
||||
memset (&cstate, '\0', sizeof (cstate));
|
||||
@@ -2165,13 +2179,13 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
}
|
||||
while (inchar () != EOF);
|
||||
|
||||
if (cnt != 0)
|
||||
if (__builtin_expect (cnt != 0, 0))
|
||||
/* We stopped in the middle of recognizing another
|
||||
character. That's a problem. */
|
||||
encode_error ();
|
||||
#endif
|
||||
|
||||
if (now == read_in)
|
||||
if (__builtin_expect (now == read_in, 0))
|
||||
/* We haven't succesfully read any character. */
|
||||
conv_error ();
|
||||
|
||||
@@ -2196,7 +2210,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
{
|
||||
size_t now = read_in;
|
||||
|
||||
if (inchar () == EOF)
|
||||
if (__builtin_expect (inchar () == EOF, 0))
|
||||
input_error ();
|
||||
|
||||
#ifdef COMPILE_WSCANF
|
||||
@@ -2298,7 +2312,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
}
|
||||
|
||||
n = __wcrtomb (!(flags & SUPPRESS) ? str : NULL, c, &state);
|
||||
if (n == (size_t) -1)
|
||||
if (__builtin_expect (n == (size_t) -1, 0))
|
||||
encode_error ();
|
||||
|
||||
assert (n <= MB_CUR_MAX);
|
||||
@@ -2355,7 +2369,7 @@ _IO_vfscanf (s, format, argptr, errp)
|
||||
while (--width > 0 && inchar () != EOF);
|
||||
#endif
|
||||
|
||||
if (now == read_in)
|
||||
if (__builtin_expect (now == read_in, 0))
|
||||
/* We haven't succesfully read any character. */
|
||||
conv_error ();
|
||||
|
||||
@@ -2449,18 +2463,15 @@ __vfwscanf (FILE *s, const wchar_t *format, va_list argptr)
|
||||
{
|
||||
return _IO_vfwscanf (s, format, argptr, NULL);
|
||||
}
|
||||
ldbl_weak_alias (__vfwscanf, vfwscanf)
|
||||
#else
|
||||
int
|
||||
__vfscanf (FILE *s, const char *format, va_list argptr)
|
||||
___vfscanf (FILE *s, const char *format, va_list argptr)
|
||||
{
|
||||
return INTUSE(_IO_vfscanf) (s, format, argptr, NULL);
|
||||
return _IO_vfscanf_internal (s, format, argptr, NULL);
|
||||
}
|
||||
libc_hidden_def (__vfscanf)
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_WSCANF
|
||||
weak_alias (__vfwscanf, vfwscanf)
|
||||
#else
|
||||
weak_alias (__vfscanf, vfscanf)
|
||||
INTDEF(_IO_vfscanf)
|
||||
ldbl_strong_alias (_IO_vfscanf_internal, _IO_vfscanf)
|
||||
ldbl_strong_alias (___vfscanf, __vfscanf)
|
||||
ldbl_hidden_def (___vfscanf, __vfscanf)
|
||||
ldbl_weak_alias (___vfscanf, vfscanf)
|
||||
#endif
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 1993, 1995, 1997 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991, 1993, 1995, 1997, 2006 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
|
||||
@@ -19,15 +19,16 @@
|
||||
#include <stdarg.h>
|
||||
#undef __OPTIMIZE__ /* Avoid inline `vprintf' function. */
|
||||
#include <stdio.h>
|
||||
#include <libioP.h>
|
||||
|
||||
#undef vprintf
|
||||
|
||||
/* Write formatted output to stdout according to the
|
||||
format string FORMAT, using the argument list in ARG. */
|
||||
int
|
||||
vprintf (format, arg)
|
||||
const char *format;
|
||||
__gnuc_va_list arg;
|
||||
__vprintf (const char *format, __gnuc_va_list arg)
|
||||
{
|
||||
return vfprintf (stdout, format, arg);
|
||||
}
|
||||
|
||||
ldbl_strong_alias (__vprintf, vprintf)
|
||||
|
Reference in New Issue
Block a user