507 lines
14 KiB
C
507 lines
14 KiB
C
/* @(#)89 1.31.3.26 src/bos/usr/include/stdlib.h, incstd, bos411, 9435B411a 8/31/94 12:22:26 */
|
|
|
|
/*
|
|
* COMPONENT_NAME: (INCSTD) Standard Include Files
|
|
*
|
|
* FUNCTIONS:
|
|
*
|
|
* ORIGINS: 27,71
|
|
*
|
|
* (C) COPYRIGHT International Business Machines Corp. 1985, 1994
|
|
* All Rights Reserved
|
|
* Licensed Materials - Property of IBM
|
|
*
|
|
* US Government Users Restricted Rights - Use, duplication or
|
|
* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
|
|
*/
|
|
|
|
/*
|
|
* (c) Copyright 1990, 1991, 1992 OPEN SOFTWARE FOUNDATION, INC.
|
|
* ALL RIGHTS RESERVED
|
|
*/
|
|
|
|
#ifndef _H_STDLIB
|
|
#define _H_STDLIB
|
|
|
|
#ifndef _H_STANDARDS
|
|
#include <standards.h>
|
|
#endif
|
|
|
|
/*
|
|
* The ANSI standard requires that certain values be in stdlib.h.
|
|
* It also requires if _ANSI_C_SOURCE is defined then ONLY these
|
|
* values are present. This header includes all the ANSI required entries.
|
|
* In addition other entries for the XIX system are included.
|
|
*/
|
|
|
|
#ifdef _ANSI_C_SOURCE
|
|
|
|
/*
|
|
* The following 3 definitions are included in <sys/types.h>. They are
|
|
* also included here to comply with ANSI standards.
|
|
*/
|
|
|
|
#ifndef NULL
|
|
#define NULL 0
|
|
#endif
|
|
|
|
#ifndef _SIZE_T
|
|
#define _SIZE_T
|
|
typedef unsigned long size_t;
|
|
#endif
|
|
|
|
#ifndef _WCHAR_T
|
|
#define _WCHAR_T
|
|
typedef unsigned short wchar_t;
|
|
#endif
|
|
|
|
typedef struct div_t { /* struct returned from div */
|
|
int quot; /* quotient */
|
|
int rem; /* remainder */
|
|
} div_t;
|
|
|
|
typedef struct ldiv_t { /* struct returned from ldiv */
|
|
long int quot; /* quotient */
|
|
long int rem; /* remainder */
|
|
} ldiv_t;
|
|
|
|
#define EXIT_FAILURE (1) /* exit function failure */
|
|
#define EXIT_SUCCESS 0 /* exit function success */
|
|
|
|
#define RAND_MAX 32767 /* max value returned by rand */
|
|
|
|
extern int __getmbcurmax (void);
|
|
extern int __getmaxdispwidth (void);
|
|
|
|
#define MB_CUR_MAX (__getmbcurmax())
|
|
#define __max_disp_width (__getmaxdispwidth())
|
|
|
|
/*
|
|
* Functions that are methods
|
|
*/
|
|
#ifdef _NO_PROTO
|
|
extern int mblen();
|
|
extern size_t mbstowcs();
|
|
extern int mbtowc();
|
|
extern size_t wcstombs();
|
|
extern int wctomb();
|
|
#else /* _NO_PROTO */
|
|
extern int mblen(const char *, size_t);
|
|
extern size_t mbstowcs(wchar_t *, const char *, size_t);
|
|
extern int mbtowc(wchar_t *, const char *, size_t);
|
|
extern size_t wcstombs(char *, const wchar_t *, size_t);
|
|
extern int wctomb(char *, const wchar_t);
|
|
#endif /* _NO_PROTO */
|
|
|
|
/*
|
|
* Regular Functions no prototyping
|
|
*/
|
|
#ifdef _NO_PROTO
|
|
extern double atof();
|
|
extern int atoi();
|
|
extern long int atol();
|
|
extern double strtod();
|
|
extern long int strtol();
|
|
extern unsigned long int strtoul();
|
|
extern int rand();
|
|
extern void srand();
|
|
extern void *calloc();
|
|
extern void free();
|
|
extern void *malloc();
|
|
extern void *realloc();
|
|
extern void abort();
|
|
extern int atexit();
|
|
extern void exit();
|
|
extern char *getenv();
|
|
extern int system();
|
|
extern void *bsearch();
|
|
extern void qsort();
|
|
|
|
/*
|
|
* Undefine conflicting definition in macros.h
|
|
*/
|
|
#ifdef _ALL_SOURCE
|
|
#ifdef abs
|
|
#undef abs
|
|
#endif
|
|
#endif /* _ALL_SOURCE */
|
|
extern int abs();
|
|
extern struct div_t div();
|
|
extern long int labs();
|
|
extern struct ldiv_t ldiv();
|
|
|
|
#ifdef __LONGDOUBLE128
|
|
long double strtold();
|
|
#endif /* #ifdef __LONGDOUBLE128 */
|
|
|
|
/*
|
|
* Regular Functions with prototyping
|
|
*/
|
|
#else /* _NO_PROTO */
|
|
/*
|
|
* Any changes to the atof() prototype must also be made to the atof()
|
|
* prototype in math.h.
|
|
*/
|
|
extern double atof(const char *);
|
|
extern int atoi(const char *);
|
|
extern long int atol(const char *);
|
|
extern double strtod(const char *, char * *);
|
|
extern long int strtol(const char *, char * *, int);
|
|
extern unsigned long int strtoul(const char *, char * *, int);
|
|
extern int rand(void);
|
|
extern void srand(unsigned int);
|
|
extern void *calloc(size_t, size_t);
|
|
extern void free(void *);
|
|
extern void *malloc(size_t);
|
|
extern void *realloc(void *, size_t);
|
|
extern void abort(void);
|
|
extern int atexit(void (*)(void));
|
|
extern void exit(int);
|
|
extern char *getenv(const char *);
|
|
extern int system(const char *);
|
|
extern void *bsearch(const void *, const void *, size_t, size_t, int(*)(const void *,const void *));
|
|
extern void qsort(void *, size_t, size_t, int(*)(const void *,const void *));
|
|
|
|
/**********
|
|
* Undefine conflicting definition in macros.h
|
|
*/
|
|
#ifdef _ALL_SOURCE
|
|
#ifdef abs
|
|
#undef abs
|
|
#endif
|
|
#endif /* _ALL_SOURCE */
|
|
|
|
extern int abs(int);
|
|
extern struct div_t div(int, int);
|
|
extern long int labs(long int);
|
|
extern struct ldiv_t ldiv(long int, long int);
|
|
|
|
#ifdef __LONGDOUBLE128
|
|
/*
|
|
* strtold() is available only for the non-default 128-bit
|
|
* long double mode. For converting to default (64-bit)
|
|
* long double type, use strtod().
|
|
*/
|
|
long double strtold(const char *, char **);
|
|
#endif /* #ifdef __LONGDOUBLE128 */
|
|
|
|
# endif /* _NO_PROTO */
|
|
#endif /* _ANSI_C_SOURCE */
|
|
|
|
|
|
/*
|
|
* functions required by XOPEN
|
|
*/
|
|
#ifdef _XOPEN_SOURCE
|
|
|
|
#ifndef _H_WAIT
|
|
#include <sys/wait.h> /* WNOHANG, WUNTRACED, WEXITSTATUS(), etc. */
|
|
#endif
|
|
|
|
#ifdef _THREAD_SAFE
|
|
/*
|
|
* The following structure is used by the different thread_safe
|
|
* *rand48_r() functions and must be passed in as an argument.
|
|
*/
|
|
typedef struct drand48_data {
|
|
unsigned x[3]; /* 48 bit integer value */
|
|
unsigned a[3]; /* mutiplier value */
|
|
unsigned c; /* addend value */
|
|
unsigned short lastx[3]; /* previous value of Xi */
|
|
int init; /* initialize ? */
|
|
} DRAND48D;
|
|
#endif /* _THREAD_SAFE */
|
|
|
|
#ifdef _NO_PROTO
|
|
extern double drand48();
|
|
extern double erand48();
|
|
extern long jrand48();
|
|
extern void lcong48();
|
|
extern long lrand48();
|
|
extern long mrand48();
|
|
extern long nrand48();
|
|
extern unsigned short *seed48();
|
|
extern void setkey();
|
|
extern void srand48();
|
|
extern int putenv();
|
|
#ifdef _THREAD_SAFE
|
|
extern int getopt_r();
|
|
extern int drand48_r();
|
|
extern int erand48_r();
|
|
extern int lrand48_r();
|
|
extern int mrand48_r();
|
|
extern int srand48_r();
|
|
extern int seed48_r();
|
|
extern int lcong48_r();
|
|
extern int nrand48_r();
|
|
extern int jrand48_r();
|
|
extern int rand_r();
|
|
extern int ecvt_r();
|
|
extern int fcvt_r();
|
|
#endif /* _THREAD_SAFE */
|
|
#else
|
|
extern double drand48(void);
|
|
extern double erand48(unsigned short[]);
|
|
extern long jrand48(unsigned short[]);
|
|
extern void lcong48(unsigned short int *);
|
|
extern long lrand48(void);
|
|
extern long mrand48(void);
|
|
extern long nrand48(unsigned short[]);
|
|
extern unsigned short *seed48(unsigned short[]);
|
|
extern void setkey(const char *);
|
|
extern void srand48(long);
|
|
extern int putenv(const char *);
|
|
#ifdef _THREAD_SAFE
|
|
extern int getopt_r( int, char* const*, const char*, int *,
|
|
char **, int *, int , int *,
|
|
int *);
|
|
extern int drand48_r(DRAND48D *, double *);
|
|
extern int erand48_r(unsigned short [], DRAND48D *,
|
|
double *);
|
|
extern int lrand48_r(DRAND48D *, long *);
|
|
extern int mrand48_r(DRAND48D *, long *);
|
|
extern int srand48_r(long, DRAND48D *);
|
|
extern int seed48_r(unsigned short [], DRAND48D *);
|
|
extern int lcong48_r(unsigned short [], DRAND48D *);
|
|
extern int nrand48_r(unsigned short [], DRAND48D *,
|
|
long *);
|
|
extern int jrand48_r(unsigned short [], DRAND48D *,
|
|
long *);
|
|
|
|
/*
|
|
* AIX 3.2 used the POSIX 1003.4a Draft 4 interfaces while post 3.2
|
|
* release use the new Draft 7 interfaces. There is a DCE compatibility
|
|
* library that contains the interfaces that changed, and these are the
|
|
* prototypes for those routines for backward compatibility.
|
|
*/
|
|
|
|
#if _AIX32_THREADS
|
|
extern int rand_r(unsigned int *, int *);
|
|
#else /* POSIX 1003.4a Draft 7 prototype */
|
|
extern int rand_r(unsigned int *);
|
|
#endif /* _AIX32_THREADS */
|
|
|
|
extern int ecvt_r(double, int, int *, int *, char *, int);
|
|
extern int fcvt_r(double, int, int *, int *, char *, int);
|
|
#endif /* _THREAD_SAFE */
|
|
#endif /* _NO_PROTO */
|
|
|
|
#endif /* _XOPEN_SOURCE */
|
|
|
|
/*
|
|
* The following macro definitions cause the XLC compiler to inline
|
|
* these functions whenever possible.
|
|
*/
|
|
|
|
/*
|
|
* Undefine conflicting definition in macros.h
|
|
*/
|
|
|
|
#ifdef _ALL_SOURCE
|
|
#ifdef abs
|
|
#undef abs
|
|
#endif
|
|
#endif /* _ALL_SOURCE */
|
|
|
|
#if (defined (__MATH__) && defined (_ANSI_C_SOURCE) )
|
|
#define abs(__j) __abs(__j)
|
|
#define labs(__j) __labs(__j)
|
|
#endif /* __MATH__ and _ANSI_C_SOURCE */
|
|
|
|
/*
|
|
* Definition of functions and structures used by the thread-safe
|
|
* random_r() functions.
|
|
*/
|
|
#if defined(_ALL_SOURCE) && defined(_THREAD_SAFE)
|
|
typedef struct random_data {
|
|
long *fptr;
|
|
long *rptr;
|
|
long *state;
|
|
int rand_type;
|
|
int rand_deg;
|
|
int rand_sep;
|
|
long *end_ptr;
|
|
} RANDOMD;
|
|
|
|
/* functions */
|
|
|
|
#ifdef _NO_PROTO
|
|
extern int srandom_r();
|
|
extern int initstate_r();
|
|
extern int setstate_r();
|
|
extern long random_r();
|
|
extern int l64a_r();
|
|
#else
|
|
extern int srandom_r(unsigned, RANDOMD *);
|
|
extern int initstate_r(unsigned, char *, int, char **,RANDOMD *);
|
|
extern int setstate_r(char *, char **, RANDOMD *);
|
|
extern int random_r(long *, RANDOMD *);
|
|
extern int l64a_r(long, char*, int);
|
|
#endif /* _NO_PROTO */
|
|
|
|
#endif /* _ALL_SOURCE && _THREAD_SAFE */
|
|
|
|
/*
|
|
* The following function prototypes are not defined for programs
|
|
* that are adhering to strict ANSI conformance, but are included
|
|
* for floating point support.
|
|
*/
|
|
|
|
#ifdef _ALL_SOURCE
|
|
|
|
#ifndef _H_TYPES
|
|
#include <sys/types.h>
|
|
#endif
|
|
|
|
#ifndef __H_LOCALEDEF
|
|
#include <sys/localedef.h>
|
|
#endif
|
|
|
|
/*
|
|
* Redefine MB_CUR_MAX and __max_disp_width to not call the functions
|
|
*/
|
|
#undef MB_CUR_MAX
|
|
#undef __max_disp_width
|
|
|
|
#define MB_CUR_MAX (__OBJ_DATA(__lc_charmap)->cm_mb_cur_max)
|
|
#define __max_disp_width (__OBJ_DATA(__lc_charmap)->cm_max_disp_width)
|
|
|
|
|
|
extern char *optarg;
|
|
extern int optind;
|
|
extern int opterr;
|
|
|
|
/* The following functions are required by the COSE (UU) API. */
|
|
|
|
#define ATEXIT_MAX 2048 /* Max Number of functions that can be
|
|
registered in the atexit() functions.
|
|
ATEXIT_MAX IS ALSO DEFINED IN sys/limits.h */
|
|
|
|
#ifdef _NO_PROTO
|
|
extern long a64l();
|
|
extern char *l64a();
|
|
extern char *ecvt();
|
|
extern char *fcvt();
|
|
extern char *gcvt();
|
|
extern int getsubopt();
|
|
extern int grantpt();
|
|
extern char *initstate();
|
|
extern char *mktemp();
|
|
extern int mkstemp();
|
|
extern char *ptsname();
|
|
extern long random();
|
|
extern char *realpath();
|
|
extern char *setstate();
|
|
extern void srandom();
|
|
extern int ttyslot();
|
|
extern int unlockpt();
|
|
extern void *valloc();
|
|
extern float atoff();
|
|
extern float strtof();
|
|
extern void imul_dbl();
|
|
extern void umul_dbl();
|
|
#else /* use prototypes */
|
|
extern long a64l(const char *);
|
|
extern char *l64a(long);
|
|
extern char *ecvt(double, int, int *, int *);
|
|
extern char *fcvt(double, int, int *, int *);
|
|
extern char *gcvt(double, int, char *);
|
|
extern int getsubopt(char **, char *const *, char **);
|
|
extern int grantpt(int);
|
|
extern char *initstate(unsigned, char *, int);
|
|
extern char *mktemp(char *);
|
|
extern int mkstemp(char *);
|
|
extern char *ptsname(int);
|
|
extern long random(void);
|
|
extern char *realpath(const char *, char *);
|
|
extern char *setstate(char *);
|
|
extern void srandom(unsigned);
|
|
extern int ttyslot(void);
|
|
extern int unlockpt(int);
|
|
extern void *valloc(size_t);
|
|
extern float atoff(char *);
|
|
extern float strtof(char *, char **);
|
|
extern void imul_dbl(long, long, long *);
|
|
extern void umul_dbl(unsigned long, unsigned long, unsigned long *);
|
|
#endif /* ifdef _NO_PROTO */
|
|
|
|
#if (defined (__MATH__) && defined (__XLC121__) && defined (_ALL_SOURCE) )
|
|
#define imul_dbl(__a, __b, __c) __imul_dbl(__a, __b, __c)
|
|
#define umul_dbl(__a, __b, __c) __umul_dbl(__a, __b, __c)
|
|
#endif
|
|
|
|
#ifdef _NO_PROTO
|
|
/*
|
|
* functions that are methods
|
|
*/
|
|
extern double wcstod();
|
|
extern long int wcstol();
|
|
extern unsigned long int wcstoul();
|
|
|
|
extern int rpmatch();
|
|
extern int clearenv();
|
|
extern int getopt();
|
|
extern char *getpass();
|
|
#else
|
|
extern double wcstod(const wchar_t *, wchar_t **);
|
|
extern long int wcstol(const wchar_t *, wchar_t **, int);
|
|
extern unsigned long int wcstoul(const wchar_t *, wchar_t **, int);
|
|
|
|
extern int rpmatch(const char *);
|
|
extern int clearenv(void);
|
|
extern int getopt(int, char* const*, const char*);
|
|
extern char *getpass(const char *);
|
|
#endif /* _NO_PROTO */
|
|
|
|
#endif /* _ALL_SOURCE */
|
|
|
|
/*
|
|
* __XLC121__ is automatically defined by the XLC 1.2.1 compiler so that
|
|
* the compiler can inline the following functions when possible.
|
|
*/
|
|
|
|
#if (defined (__MATH__) && defined (__XLC121__) && defined (_ANSI_C_SOURCE) )
|
|
#define div(__numer,__denom) __div(__numer,__denom)
|
|
#define ldiv(__numer,__denom) __ldiv(__numer,__denom)
|
|
#endif
|
|
|
|
/*
|
|
* Support for 64-bit integers, called long long int and unsigned long long int
|
|
*/
|
|
#if (defined(_LONG_LONG) && defined(_ALL_SOURCE))
|
|
|
|
typedef struct lldiv_t {
|
|
long long int quot; /* quotient */
|
|
long long int rem ; /* remainder */
|
|
} lldiv_t;
|
|
|
|
#ifdef _NO_PROTO
|
|
|
|
extern long long int llabs( );
|
|
extern lldiv_t lldiv( );
|
|
extern long long int strtoll( );
|
|
extern unsigned long long int strtoull( );
|
|
|
|
#else /* ifdef _NO_PROTO */
|
|
|
|
extern long long int llabs( long long int );
|
|
extern lldiv_t lldiv( long long int, long long int ); /* First arg / second arg */
|
|
extern long long int strtoll(
|
|
const char *, /* String to convert */
|
|
char **, /* Pointer to update */
|
|
int ); /* Base to use */
|
|
extern unsigned long long int strtoull(
|
|
const char *, /* String to convert */
|
|
char **, /* Pointer to update */
|
|
int ); /* Base to use */
|
|
|
|
#endif /* ifdef _NO_PROTO */
|
|
|
|
#if (defined (__MATH__) && defined (__XLC13__))
|
|
# define llabs(__j) __llabs(__j)
|
|
#endif /* ifdef __MATH__ */
|
|
|
|
#endif /* if defined(_LONG_LONG) && defined(_ALL_SOURCE) */
|
|
|
|
#endif /* _H_STDLIB */
|