| /* xstrerror.c -- jacket routine for more robust strerror() usage. | 
 |    Fri Jun 16 18:30:00 1995  Pat Rankin  <rankin@eql.caltech.edu> | 
 |    This code is in the public domain.  */ | 
 |  | 
 | /* | 
 |  | 
 | @deftypefn Replacement char* xstrerror (int @var{errnum}) | 
 |  | 
 | Behaves exactly like the standard @code{strerror} function, but | 
 | will never return a @code{NULL} pointer. | 
 |  | 
 | @end deftypefn | 
 |  | 
 | */ | 
 |  | 
 | #include <stdio.h> | 
 |  | 
 | #include "config.h" | 
 | #include "libiberty.h" | 
 |  | 
 | #ifdef VMS | 
 | #  include <errno.h> | 
 | #  if !defined (__STRICT_ANSI__) && !defined (__HIDE_FORBIDDEN_NAMES) | 
 | #    ifdef __cplusplus | 
 | extern "C" { | 
 | #    endif /* __cplusplus */ | 
 | extern char *strerror (int,...); | 
 | #    define DONT_DECLARE_STRERROR | 
 | #    ifdef __cplusplus | 
 | } | 
 | #    endif /* __cplusplus */ | 
 | #  endif | 
 | #endif  /* VMS */ | 
 |  | 
 |  | 
 | #ifndef DONT_DECLARE_STRERROR | 
 | #  ifdef __cplusplus | 
 | extern "C" { | 
 | #  endif /* __cplusplus */ | 
 | extern char *strerror (int); | 
 | #  ifdef __cplusplus | 
 | } | 
 | #  endif /* __cplusplus */ | 
 | #endif | 
 |  | 
 | /* If strerror returns NULL, we'll format the number into a static buffer.  */ | 
 |  | 
 | #define ERRSTR_FMT "undocumented error #%d" | 
 | static char xstrerror_buf[sizeof ERRSTR_FMT + 20]; | 
 |  | 
 | /* Like strerror, but result is never a null pointer.  */ | 
 |  | 
 | char * | 
 | xstrerror (int errnum) | 
 | { | 
 |   char *errstr; | 
 | #ifdef VMS | 
 |   char *(*vmslib_strerror) (int,...); | 
 |  | 
 |   /* Override any possibly-conflicting declaration from system header.  */ | 
 |   vmslib_strerror = (char *(*) (int,...)) strerror; | 
 |   /* Second argument matters iff first is EVMSERR, but it's simpler to | 
 |      pass it unconditionally.  `vaxc$errno' is declared in <errno.h> | 
 |      and maintained by the run-time library in parallel to `errno'. | 
 |      We assume that `errnum' corresponds to the last value assigned to | 
 |      errno by the run-time library, hence vaxc$errno will be relevant.  */ | 
 |   errstr = (*vmslib_strerror) (errnum, vaxc$errno); | 
 | #else | 
 |   errstr = strerror (errnum); | 
 | #endif | 
 |  | 
 |   /* If `errnum' is out of range, result might be NULL.  We'll fix that.  */ | 
 |   if (!errstr) | 
 |     { | 
 |       sprintf (xstrerror_buf, ERRSTR_FMT, errnum); | 
 |       errstr = xstrerror_buf; | 
 |     } | 
 |   return errstr; | 
 | } |