[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Bug-gnulib] lib/strerror.c
From: |
Paul Eggert |
Subject: |
Re: [Bug-gnulib] lib/strerror.c |
Date: |
22 Jul 2003 10:33:04 -0700 |
User-agent: |
Gnus/5.09 (Gnus v5.9.0) Emacs/21.3 |
Derek Robert Price <address@hidden> writes:
> What's with the:
>
>
> #if 0
> # include <stdio.h>
> #endif
>
>
> construct in lib/sterror.c. Can it be removed?
Yes and no. How about this patch, to explain things, and fix a few
other things while we're at it.
2003-07-22 Paul Eggert <address@hidden>
* lib/strerror.c: Include config.h, limits.h. Declare sprintf.
(strerror): Don't assume that a printable int fits in 14 bytes.
--- strerror.c.~1.1.~ Tue Sep 3 08:36:39 2002
+++ strerror.c Tue Jul 22 10:32:42 2003
@@ -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
@@ -16,22 +17,33 @@
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-#if 0
-# include <stdio.h>
+#if HAVE_CONFIG_H
+# include <config.h>
#endif
+#include <limits.h>
+
+/* Don't include <stdio.h>, 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];
+ 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, "Unknown error (%d)", n);
- return mesg;
- } else
- return sys_errlist[n];
+ if (n < 0 || n >= sys_nerr)
+ {
+ sprintf (mesg, fmt, n);
+ return mesg;
+ }
+ else
+ return sys_errlist[n];
}