d7cf8390c7
include/ 2005-05-24 Gabriel Dos Reis <gdr@integrable-solutions.net> * libiberty.h (ACONCAT): Properly cast value of alloca(). * ansidecl.h (ATTRIBUTE_UNUSED_LABEL): Don't define if __cplusplus. libiberty/ 2005-05-24 Gabriel Dos Reis <gdr@integrable-solutions.net> * configure.ac: Check declarations for calloc(), getenv(), malloc(), realloc() and sbrk(). * config.in: Regenerate. * configure: Likewise. * alloca.c (C_alloca): Change "new" to "new_storage". Use XNEWVEC instead of xmalloc. * choose-temp.c (choose_temp_base): Use XNEWVEC instea od xmalloc. * concat.c (liiberty_concat_ptr): Surround definition with an extern "C" block, if __cplusplus. (concat): Use XNEWVEC instead of xmalloc. (reconcat): Likewise. * cp-demangle.c (struct d_print_template): Rename member "template" to "template_decl". Adjust use throughout the file. (d_print_resize): Properly cast return value of realloc(). (cplus_demangle_print): Same for malloc(). (d_demangle): Likewise. * cp-demint.c (cplus_demangle_fill_builtin_type): Rename parameter "typename" to "type_name". * cplus-dem.c (grow_vect): Use XRESIZEVEC instead of xrealloc(). (work_stuff_copy_to_from): Use XNEWVEC insteand of xmalloc(). (demangle_template_value_parm): Likewise. (demangle_template): Likewise. (recursively_demangle): Likewise. (do_hpacc_template_literal): Likewise. (do_arg): Likewise. (remember_type): Likewise. (remember_Ktype): Likewise. (register_Btype): Likewise. (string_need): Use XRESIZEVEC instead of xrealloc(). * dyn-string.c (dyn_string_init): Use XNEWVEC. (dyn_string_new): Use XNEW. (dyn_string_resize): Use XRESIZEVEC. * fnmatch.c (fnmatch): Rename local variable "not" to "negate". * getopt.c (getenv): Declare only if !__cplusplus and !getenv. Otherwise include <stdlib.h>. (exchange): Cast return value of malloc(). * hashtab.c (htab_size): Define as both macro and non-inline function. (htab_elements): Likewise. * getpwd.c (getpwd): Use XNEWVEC. (htab_create_alloc_ex): Use C90 prototype-style. * lrealpath.c (lrealpath): Appropriately cast return value of malloc(). * make-relative-prefix.c (save_string): Likewise. * make-temp-file.c (try_dir): Rename from "try". Adjust use in the file. (choose_tmpdir): Use XNEWVEC. * mkstemps.c (mkstemps): Rename parameter "template" to "pattern". * pex-common.c (pex_init_common): Use XNEW. (pex_add_remove): Use XRESIZEVEC. (pex_run): Likewise. (pex_get_status_and_time): Likewise. * pex-djgpp.c (pex_djgpp_exec_child): Likewise. * pex-msdos.c (pex_init): Use XNEW. (pex_msdos_exec_child): Likewise. (pex_msdos_exec_child): Use XRESIZEVEC. * pex-unix.c (pex_wait): Use XNEW. * pex-win32.c (fix_argv): Use XNEWVEC. * pexecute.c (pwait): Likewise. * setenv.c (setenv): Properly cast return value of malloc(). * sigsetmask.c (sigsetmask): Rename local variables "old" and "new" to "old_sig" and "new_sig". * sort.c (main): Use XNEWVEC. * spaces.c (spaces): Cast return value of malloc(). * strndup.c (strndup): Likewise. * ternary.c (ternary_insert): Use XNEW. * xmalloc.c (malloc, realloc, calloc, sbrk): Surround declaration with an extern "C" block if __cplusplus. * xstrdup.c (xstrdup): Cast return value of memcpy(). * xstrerror.c (strerror): Enclose declaration in an extern "C" block if __cplusplus. * xstrndup.c (xstrndup): Use XNEW. Cast return value of memcpy(). From-SVN: r100115
80 lines
2.0 KiB
C
80 lines
2.0 KiB
C
/* 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;
|
|
}
|