/*
 * List of function definitions that may *optionally* be included
 * in libiberty.a.  The function names must match the filenames,
 * e.g. bzero() is defined in bzero.c.  (While each file can contain
 * extra functions, do not list them.)
 *
 * In the default libiberty configuration, these object files
 * (e.g bzero.o) are included if and only if cc fails to find
 * the corresponding function in libc.
 */

DEF(asprintf, int, (), NOTHING)
DEF(atexit, int, (f), void (*f)())
DEF(bcmp, int, (s1, s2, length), char *s1 AND char *s2 AND int length )
DEF(bcopy, void, (s1, s2, length), char *s1 AND char *s2 AND int length )
DEF(bzero, void, (s, length), char *s AND int length)
DEF(clock, clock_t, (), NOTHING)
DEF(getopt, int, (argc, argv, optstring),
	int argc AND char **argv AND CONST char *optstring)	
DEF(getpagesize, int , (), NOTHING)
DEF(getcwd, char*, (buf, len), char *buf AND int len)
DEF(index, char*, (s, c), char *s AND int c)
DEF(insque, void, (), NOTHING)
DEF(memchr, PTR, (s, c, length), CONST PTR s AND int c AND size_t length)
DEF(memcmp, int, (s1, s2, length),
	CONST PTR s1 AND CONST PTR s2 AND size_t length)
DEF(memcpy, PTR, (s1, s2, length), PTR s1 AND CONST PTR s2 AND size_t length)
DEF(memmove, PTR, (s1, s2, length), PTR s1 AND CONST PTR s2 AND size_t length)
DEF(memset, PTR, (s, val, length), PTR s AND int val AND size_t length )
DEF(random, long int, (), NOTHING)
DEF(rename, int, (f, t), char *f AND char *t)
DEF(rindex, char*, (s, c), char *s AND int c)
DEF(strcasecmp, int, (s1, s2), char *s1 AND char *s2)
DEF(strncasecmp, int, (s1, s2, n), char *s1 AND char *s2 AND int n)
DEF(strchr, char*, (s, c), CONST char *s AND int c)
DEF(strdup, char*, (s1), char * s1)
DEF(strrchr, char*, (s, c), CONST char *s AND int c)
DEF(strstr, char*, (), NOTHING)
DEF(strtod, double, (), NOTHING)
DEF(strtol, long, (), NOTHING)
DEF(strtoul, unsigned long, (), NOTHING)
DEF(tmpnam, char *, (s), char * s)
DEF(vfork, int, (), NOTHING)
DEF(vfprintf, int, (), NOTHING)
DEF(vprintf, int, (), NOTHING)
DEF(vsprintf, int, (), NOTHING)
DEF(sigsetmask, int, (), NOTHING)
DEF(alloca, PTR, (size), size_t size)
DEF(waitpid, int, (pid, statp, opts), int pid AND int* statp AND int opts )
DEF(vasprintf, int, (), NOTHING)

/* List of global variables that we want to look for in the host
   environment, and to generate an entry NEED_<variable> in config.h
   if they are not found.  The first arg is the variable name, the
   second arg is how to declare the variable, and the third is how to
   use it. */

DEFVAR(sys_nerr, int sys_nerr, sys_nerr = 0)
DEFVAR(sys_errlist, char *sys_errlist[], sys_errlist[0] = 0)
DEFVAR(sys_siglist, char *sys_siglist[], sys_siglist[0] = 0)

/* List of global functions that we want to look for in the host
   environment, and to generate an entry NEED_<funcname> in config.h
   if they are not found. */

DEFFUNC(strerror, char*, (), NOTHING)
DEFFUNC(psignal, void, (signo, message), unsigned signo AND char *message)
DEFFUNC(basename, char *, (name), CONST char *name)
DEFFUNC(on_exit, void, (f, arg), void (*f)() AND char *arg)
DEFFUNC(strsignal, char *, (), NOTHING)
