/*
 * Revision Control Information
 *
 * $Source: /vol/opua/opua2/sis/sis-1.2/common/src/sis/util/RCS/util.h,v $
 * $Author: sis $
 * $Revision: 1.9 $
 * $Date: 1993/06/07 21:04:07 $
 *
 */
#ifndef ABC__misc__espresso__util_old_h
#define ABC__misc__espresso__util_old_h

#if defined(_IBMR2)
#ifndef _POSIX_SOURCE
#define _POSIX_SOURCE           /* Argh!  IBM strikes again */
#endif
#ifndef _ALL_SOURCE
#define _ALL_SOURCE             /* Argh!  IBM strikes again */
#endif
#ifndef _ANSI_C_SOURCE
#define _ANSI_C_SOURCE          /* Argh!  IBM strikes again */
#endif
#endif

#if defined(__STDC__) || defined(sprite) || defined(_IBMR2) || defined(__osf__)
#include <unistd.h>
#endif

#if defined(_IBMR2) && !defined(__STDC__)
#define _BSD
#endif

#include "ansi.h"    /* since some files don't include sis.h */

/* This was taken out and defined at compile time in the SIS Makefile
   that uses the OctTools.  When the OctTools are used, USE_MM is defined,
   because the OctTools contain libmm.a.  Otherwise, USE_MM is not defined,
   since the mm package is not distributed with SIS, only with Oct. */

/* #define USE_MM */        /* choose libmm.a as the memory allocator */

#define NIL(type)        ((type *) 0)

#ifdef USE_MM
/*
 *  assumes the memory manager is libmm.a
 *    - allows malloc(0) or realloc(obj, 0)
 *    - catches out of memory (and calls MMout_of_memory())
 *    - catch free(0) and realloc(0, size) in the macros
 */
#define ALLOC(type, num)    \
    ((type *) malloc(sizeof(type) * (num)))
#define REALLOC(type, obj, num)    \
    (obj) ? ((type *) realloc((char *) obj, sizeof(type) * (num))) : \
        ((type *) malloc(sizeof(type) * (num)))
#define FREE(obj)        \
    ((obj) ? (free((char *) (obj)), (obj) = 0) : 0)
#else
/*
 *  enforce strict semantics on the memory allocator
 *    - when in doubt, delete the '#define USE_MM' above
 */
#define ALLOC(type, num)    \
    ((type *) MMalloc((long) sizeof(type) * (long) (num)))
#define REALLOC(type, obj, num)    \
    ((type *) MMrealloc((char *) (obj), (long) sizeof(type) * (long) (num)))
#define FREE(obj)        \
    ((obj) ? (free((void *) (obj)), (obj) = 0) : 0)
#endif


/* Ultrix (and SABER) have 'fixed' certain functions which used to be int */
#if defined(ultrix) || defined(SABER) || defined(aiws) || defined(__hpux) || defined(__STDC__) || defined(apollo)
#define VOID_HACK void
#else
#define VOID_HACK int
#endif


/* No machines seem to have much of a problem with these */
#include <stdio.h>
#include <ctype.h>


/* Some machines fail to define some functions in stdio.h */
#if !defined(__STDC__) && !defined(sprite) && !defined(_IBMR2) && !defined(__osf__)
extern FILE *popen(), *tmpfile();
extern int pclose();
#ifndef clearerr        /* is a macro on many machines, but not all */
extern VOID_HACK clearerr();
#endif
#ifndef rewind
extern VOID_HACK rewind();
#endif
#endif

#ifndef PORT_H
#include <sys/types.h>
#include <signal.h>
#if defined(ultrix)
#if defined(_SIZE_T_)
#define ultrix4
#else
#if defined(SIGLOST)
#define ultrix3
#else
#define ultrix2
#endif
#endif
#endif
#endif

/* most machines don't give us a header file for these */
#if defined(__STDC__) || defined(sprite) || defined(_IBMR2) || defined(__osf__) || defined(sunos4) || defined(__hpux)
#include <stdlib.h>
#if defined(__hpux)
#include <errno.h>    /* For perror() defininition */
#endif /* __hpux */
#else
extern VOID_HACK abort(), free(), exit(), perror();
extern char *getenv();
#ifdef ultrix4
extern void *malloc(), *realloc(), *calloc();
#else
extern char *malloc(), *realloc(), *calloc();
#endif
#if defined(aiws) 
extern int sprintf();
#else
#ifndef _IBMR2
extern char *sprintf();
#endif
#endif
extern int system();
extern double atof();
#endif

#ifndef PORT_H
#if defined(ultrix3) || defined(sunos4) || defined(_IBMR2) || defined(__STDC__)
#define SIGNAL_FN       void
#else
/* sequent, ultrix2, 4.3BSD (vax, hp), sunos3 */
#define SIGNAL_FN       int
#endif
#endif

/* some call it strings.h, some call it string.h; others, also have memory.h */
#if defined(__STDC__) || defined(sprite)
#include <string.h>
#else
#if defined(ultrix4) || defined(__hpux)
#include <strings.h>
#else
#if defined(_IBMR2) || defined(__osf__)
#include<string.h>
#include<strings.h>
#else
/* ANSI C string.h -- 1/11/88 Draft Standard */
/* ugly, awful hack */
#ifndef PORT_H
extern char *strcpy(), *strncpy(), *strcat(), *strncat(), *strerror();
extern char *strpbrk(), *strtok(), *strchr(), *strrchr(), *strstr();
extern int strcoll(), strxfrm(), strncmp(), strlen(), strspn(), strcspn();
extern char *memmove(), *memccpy(), *memchr(), *memcpy(), *memset();
extern int memcmp(), strcmp();
#endif
#endif
#endif
#endif

/* a few extras */
#if defined(__hpux)
#define random() lrand48()
#define srandom(a) srand48(a)
#define bzero(a,b) memset(a, 0, b)
#else
#if !defined(__osf__) && !defined(linux)
/* these are defined as macros in stdlib.h */
extern VOID_HACK srandom();
extern long random();
#endif
#endif

/* code from sis-1.3 commented out below
#if defined(__STDC__) || defined(sprite)
#include <assert.h>
#else
#ifndef NDEBUG
#define assert(ex) {\
    if (! (ex)) {\
    (void) fprintf(stderr,\
        "Assertion failed: file %s, line %d\n\"%s\"\n",\
        __FILE__, __LINE__, "ex");\
    (void) fflush(stdout);\
    abort();\
    }\
}
#else
#define assert(ex) {ex;}
#endif
#endif
*/

   /* Sunil 5/3/97:
   sis-1.4: dont let the assert call go to the OS, since
   much of the code in SIS has actual computation done in
   the assert function. %$#$@@#! The OS version of assert
   will do nothing if NDEBUG is set. We cant let that happen...
   */
#  ifdef NDEBUG
#    define assert(ex) {ex;}
#  else
#    define assert(ex) {\
    if (! (ex)) {\
    (void) fprintf(stderr,\
        "Assertion failed: file %s, line %d\n\"%s\"\n",\
        __FILE__, __LINE__, "ex");\
    (void) fflush(stdout);\
    abort();\
    }\
}
#  endif


#define fail(why) {\
    (void) fprintf(stderr, "Fatal error: file %s, line %d\n%s\n",\
    __FILE__, __LINE__, why);\
    (void) fflush(stdout);\
    abort();\
}


#ifdef lint
#undef putc            /* correct lint '_flsbuf' bug */
#undef ALLOC            /* allow for lint -h flag */
#undef REALLOC
#define ALLOC(type, num)    (((type *) 0) + (num))
#define REALLOC(type, obj, num)    ((obj) + (num))
#endif

/*
#if !defined(__osf__)
#define MAXPATHLEN
 1024
#endif
*/

/* These arguably do NOT belong in util.h */
#ifndef ABS
#define ABS(a)            ((a) < 0 ? -(a) : (a))
#endif
#ifndef MAX
#define MAX(a,b)        ((a) > (b) ? (a) : (b))
#endif
#ifndef MIN
#define MIN(a,b)        ((a) < (b) ? (a) : (b))
#endif


#ifndef USE_MM
EXTERN void MMout_of_memory ARGS((long));
EXTERN char *MMalloc ARGS((long));
EXTERN char *MMrealloc ARGS((char *, long));
EXTERN void MMfree ARGS((char *));
#endif

EXTERN void util_print_cpu_stats ARGS((FILE *));
EXTERN long util_cpu_time ARGS((void));
EXTERN void util_getopt_reset ARGS((void));
EXTERN int util_getopt ARGS((int, char **, char *));
EXTERN char *util_path_search ARGS((char *));
EXTERN char *util_file_search ARGS((char *, char *, char *));
EXTERN int util_pipefork ARGS((char **, FILE **, FILE **, int *));
EXTERN char *util_print_time ARGS((long));
EXTERN int util_save_image ARGS((char *, char *));
EXTERN char *util_strsav ARGS((char *));
EXTERN int util_do_nothing ARGS((void));
EXTERN char *util_tilde_expand ARGS((char *));
EXTERN char *util_tempnam ARGS((char *, char *));
EXTERN FILE *util_tmpfile ARGS((void));
EXTERN long getSoftDataLimit();

#define ptime()         util_cpu_time()
#define print_time(t)   util_print_time(t)

/* util_getopt() global variables (ack !) */
extern int util_optind;
extern char *util_optarg;

#include <math.h>
#ifndef HUGE_VAL
#ifndef HUGE
#define HUGE  8.9884656743115790e+307
#endif
#define HUGE_VAL HUGE
#endif
#ifndef MAXINT
#define MAXINT (1 << 30)
#endif

#include <varargs.h>

ABC_NAMESPACE_HEADER_START



ABC_NAMESPACE_HEADER_END

#endif
