bug-gnulib
[Top][All Lists]
Advanced

[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];
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]