X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fstrerror.c;h=623821d2e3d50b6df1754707a12c8ae94dc83c00;hb=8de557e31178699dd6e839850056f0653cdfba89;hp=5dba4d975372c429a270e9a5e9aad9ab5b1d92f9;hpb=d3a50fbfd129be1326e8f163ee51f974407c0dbe;p=gnulib.git diff --git a/lib/strerror.c b/lib/strerror.c index 5dba4d975..623821d2e 100644 --- a/lib/strerror.c +++ b/lib/strerror.c @@ -1,6 +1,7 @@ /* strerror.c --- ANSI C compatible system error routine - Copyright (C) 1986, 1988, 1989, 1991, 2002 Free Software Foundation, Inc. + Copyright (C) 1986, 1988, 1989, 1991, 2002, 2003 Free Software + Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,24 +15,35 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#if 0 -# include +#ifdef HAVE_CONFIG_H +# include #endif +#include + +/* Don't include , since it may or may not declare + sys_errlist and its declarations may collide with ours. Just + declare the stuff that we need directly. Standard hosted C89 + implementations define strerror and they don't need this strerror + function, so take some liberties with the standard to cater to + ancient or limited freestanding implementations. */ +int sprintf (char *, char const *, ...); extern int sys_nerr; extern char *sys_errlist[]; char * -strerror(n) -int n; +strerror (int n) { - static char mesg[30]; - - if (n < 0 || n >= sys_nerr) { - sprintf(mesg, "Unknown error (%d)", n); - return mesg; - } else - return sys_errlist[n]; + static char const fmt[] = "Unknown error (%d)"; + static char mesg[sizeof fmt + sizeof n * CHAR_BIT / 3]; + + if (n < 0 || n >= sys_nerr) + { + sprintf (mesg, fmt, n); + return mesg; + } + else + return sys_errlist[n]; }