/
Genesis-1.0p36-DEV/
Genesis-1.0p36-DEV/bin/
Genesis-1.0p36-DEV/doc/
Genesis-1.0p36-DEV/etc/
Genesis-1.0p36-DEV/src/data/
/*
// Full copyright information is available in the file ../doc/CREDITS
*/

#ifndef cdc_defs_h
#define cdc_defs_h

#define DISABLED 0
#define ENABLED  1

/*
// ---------------------------------------------------------------------
// This will reduce how much your database bloats, however it will
// be slower as it searches the whole database for free blocks.
// For now this is an option to reduce the amount of bloat occuring,
// until an alternate allocator is created.  If you are having a problem
// with your database quickly bloating in size, it is suggested to
// enable this option, unless you have a slow disk or slow disk device.
*/
#if DISABLED
#  define LOWBLOAT_DB
#endif

/*
// ---------------------------------------------------------------------
// Use larger storage for floats and integers.  This gives greater
// precision, but is not necessarily recommended unless you know your
// system can handle 64bit + words.  You do not need to specify both
// (You can specify just USE_BIG_FLOATS, and not numbers).
*/
#if DISABLED
#  define USE_BIG_FLOATS
#endif

#if DISABLED
#  define USE_BIG_NUMBERS
#endif

/*
// ---------------------------------------------------------------------
// This enables execution debuging in the ColdC language--using the
// functions debug_callers() and call_trace().
*/

#if ENABLED
#  define DRIVER_DEBUG
#endif


/*
// ---------------------------------------------------------------------
// Turn this on to get a profile of what methods are called and how often,
// do NOT use this in a regular run-time environment as its laggy
*/
#if DISABLED
#  define PROFILE_EXECUTE
#endif

/*
// ---------------------------------------------------------------------
// This is the number of methods it can record before having to flush
// the table and start over, if you are getting a lot tack a zero or two
// onto this number.  Keep in mind it will take up MEMORY
*/
#define PROFILE_MAX 10000

/*
// ---------------------------------------------------------------------
// Clean objects out of the cache?  This gives you a smaller memory
// imprint, but it usually causes more work for the server as it will
// be constantly removing and pulling objects in an dout of the cache.
*/
#if DISABLED
#  define CLEAN_CACHE
#endif

/*
// ---------------------------------------------------------------------
// How persistant is an object, to stay in the cache?  This is
// logarithmic, just changing it from 10 to 20 will not double the
// persistance, it will just increase it a notch
*/
#define OBJECT_PERSISTANCE 10

/*
// ---------------------------------------------------------------------
// Number of ticks a method gets before dying with an E_TICKS.
*/
#define METHOD_TICKS               20000

/*
// ---------------------------------------------------------------------
// Number of ticks a paused method gets before dying with an E_TICKS
*/
#define PAUSED_METHOD_TICKS        5000

/*
// ---------------------------------------------------------------------
// How much of a threshold refresh() should decide to pause on
*/
#define REFRESH_METHOD_THRESHOLD   500

/*
// ---------------------------------------------------------------------
// Default Width and depth of object cache. (10 and 30 are defaults),
// use the command line to change these at run-time.
*/
#define CACHE_WIDTH    10
#define CACHE_DEPTH    30

/*
// ---------------------------------------------------------------------
// Maximum depth of method calls.
*/
#define MAX_CALL_DEPTH             128

/*
// ---------------------------------------------------------------------
// size of name cache, this number is total magic--although primes make
// for better magic, lower for less memory usage but more lookups to
// disk; raise for vise-versa, other primes:
//
//     71, 173, 281, 409, 541, 659, 809
*/
#define NAME_CACHE_SIZE 173

/*
// ---------------------------------------------------------------------
// Default indent for decompiled code.
*/
#define DEFAULT_INDENT    4

/*
// ---------------------------------------------------------------------
// Maximum number of characters of a data value to display using strfmt().
*/
#define MAX_DATA_DISPLAY 15

/*
// --------------------------------------------------------------------
// global behaviour defines
// --------------------------------------------------------------------
*/

/* core behaviour defines, set by configure */
#include "config.h"

#ifndef CAT
#  ifdef __WATCOMC__
#    define _CAT(a,b)     a ## b
#    define CAT(a,b)      _CAT(a,b)
#  else
#    define CAT(a,b)      a ## b
#  endif
#endif

#define INV_OBJNUM        -1
#define SYSTEM_OBJNUM     0
#define ROOT_OBJNUM       1

#ifdef USE_VFORK
#define FORK_PROCESS vfork
#else
#define FORK_PROCESS fork
#endif

#ifndef HAVE_STRERROR
extern char *sys_errlist[];
#define strerror(n) (sys_errlist[n])
#endif

/*
// bool defs pulled from the Perl5 Source, Copyright 1991-1994, Larry Wall
*/
#ifdef _G_HAVE_BOOL
#  if _G_HAVE_BOOL
#    ifndef HAS_BOOL
#      define HAS_BOOL 1
#    endif
#  endif
#endif

#ifndef HAS_BOOL
#  ifdef UTS      /* what is UTS, need documentation -- BJG */
#    define bool int
#  else
#    define bool char 
#  endif
#endif

/*
// these are C type defines, the following should be true:
//
//   Bool     =>  true or false value
//   Byte     =>  tiny integer signed value
//   uByte    =>  tiny integer unsigned value
//   Char     =>  character signed value
//   uChar    =>  character unsigned value
//   Short    =>  small integer signed value
//   uShort   =>  small integer unsigned value
//   Int      =>  common integer signed value
//   uInt     =>  common integer unsigned value
//   Long     =>  large integer signed value
//   uLong    =>  large integer unsigned value
//   Float    =>  common float signed value
//
// Defining USE_LARGE_FLOATS and USE_LARGE_NUMBERS will change Long and
// Float to be larger, although this is not recommended unless you know
// your OS and system can handle larger 64 bit + words.
//
// As machines advance we may need to change these #if's to handle larger
// than 64 bits, for now they assume 64bits is the heavenly bit in the sky.
*/

typedef bool              Bool;

#if SIZEOF_CHAR == 1
  typedef char               Byte;
  typedef unsigned char      uByte;
  typedef char               Char;
  typedef unsigned char      uChar;
#elif SIZEOF_SHORT == 1
  typedef short int          Byte;
  typedef unsigned short int uByte;
  typedef char               Char;
  typedef unsigned char      uChar;
#else
# error "Unable to specify size for Byte and Char type (8 bits)"
#endif

#if SIZEOF_SHORT == 2
  typedef short int          Short;
  typedef unsigned short int uShort;
#elif SIZEOF_CHAR == 2   /* unlikely */
  typedef char               Short;
  typedef unsigned char      uShort;
#elif SIZEOF_INT == 2
  typedef int                Short;
  typedef unsigned int       uShort;
#else
# error "Unable to specify size for Short type (16 bits)"
#endif

 /* when monkeys fly */
#if SIZEOF_SHORT == 4
  typedef short int          Int;
  typedef unsigned short int uInt;
#elif SIZEOF_INT == 4
  typedef int               Int;
  typedef unsigned int      uInt;
# define MAX_INT  2147483647
# define MAX_UINT 4294967295U
#elif SIZEOF_LONG == 4
  typedef long              Int;
  typedef unsigned long     uInt; 
# define MAX_INT  2147483647L
# define MAX_UINT 4294967295UL
#else
# error "Unable to specify size for Int type (32 bits)"
#endif

#ifdef USE_BIG_NUMBERS

#  if SIZEOF_LONG == 8
     typedef long              Long;
     typedef unsigned long     uLong;
#    define MAX_LONG  9223372036854775807L
#    define MAX_ULONG 18446744073709551615UL
#  elif SIZEOF_LLONG == 8
     typedef long long         Long;
     typedef unsigned long long uLong;
#    define MAX_LONG  9223372036854775807LL
#    define MAX_ULONG 18446744073709551615ULL
#  else
#    error "Unable to specify size for BIG Long type (64 bits)"
#  endif
#else

  typedef Int               Long;
  typedef uInt              uLong;

# define MAX_LONG  MAX_INT
# define MAX_ULONG MAX_UINT
#endif

#ifdef USE_BIG_FLOATS
#  if SIZEOF_FLOAT == 8     /* hah, not likely */
     typedef float           Float;
#  elif SIZEOF_DOUBLE == 8
     typedef double          Float;
#  elif SIZEOF_LDOUBLE == 8
     typedef double          Float;
#  else
#    error "Unable to specify size for BIG Float type (64 bits)"
#  endif
#else
#  if SIZEOF_FLOAT == 4
     typedef float           Float;
#  elif SIZEOF_DOUBLE == 4   /* will this ever occur !? */
     typedef double          Float;
#  else
#    error "Unable to specify size for Float type (32 bits)"
#  endif
#endif

/* basic sizes */
#define LINE   80
#define BUF    256
#define BLOCK  512
#define BIGBUF 1024
#define IOBUF  8192

/* used by some file operations */
#define DEF_BLOCKSIZE BLOCK

#ifndef __Win32__
#  define SOCKET_ERROR    -1
#endif

#define F_SUCCESS 0  /* function absolute success */
#define F_FAILURE -1 /* function failure */
#define B_SUCCESS 1  /* boolean success */
#define B_FAILURE 0  /* boolean failure */
#ifdef TRUE
#undef TRUE
#endif
#define TRUE 1

#ifdef FALSE
#undef FALSE
#endif
#define FALSE 0

#ifdef NO
#undef NO
#endif
#define NO FALSE

#ifdef YES
#undef YES
#endif
#define YES TRUE

#define ANY_TYPE 0

/* personal preference stuff */
#define forever for (;;)
#define INTERNAL static

#define SERVER_NAME "Genesis (the Cold driver)"

/* incase it doesn't exist */
#ifndef O_BINARY
#define O_BINARY 0
#endif

/*
// --------------------------------------------------------------------
// standard includes
// --------------------------------------------------------------------
*/

#include <stdlib.h>
#include <stdio.h>

#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif

#ifdef sys_linux
#undef NULL
#define NULL 0
#endif

#include <setjmp.h>
#include "cdc_errs.h"
#include "cdc_types.h"
#include "cdc_memory.h"
#include "log.h"

#ifndef _grammar_y_
#include "parse.h"

extern cInstance class_registry[];

typedef enum instance_id {
    FIRST_INSTANCE = LAST_TOKEN + 1,
    HANDLED_FROB_TYPE = FIRST_INSTANCE,
    LAST_INSTANCE
} InstanceID;

void register_instance (InstanceID instance, Ident id);

#endif


/*
// --------------------------------------------------------------------
// globals, aiee
// --------------------------------------------------------------------
*/

#ifdef DEFS_C
jmp_buf main_jmp;

char * c_dir_binary;
char * c_dir_textdump;
char * c_dir_bin;
char * c_dir_root;
char * c_logfile;
char * c_errfile;
char * c_runfile;

FILE * logfile;
FILE * errfile;
cStr * str_tzname;
cStr * str_hostname;
cStr * str_release;

Bool coldcc;
Bool running;
Bool atomic;
Int  heartbeat_freq;

Int cache_width;
Int cache_depth;

void init_defs(void);

/* limits configurable with 'config()' */
Int  limit_datasize;
Int  limit_fork;
Int  limit_calldepth;
Int  limit_recursion;
Int  limit_objswap;

#else
extern jmp_buf main_jmp;

extern char * c_dir_binary;
extern char * c_dir_textdump;
extern char * c_dir_bin;
extern char * c_dir_root;
extern char * c_logfile;
extern char * c_errfile;
extern char * c_runfile;

extern FILE * logfile;
extern FILE * errfile;
extern cStr * str_tzname;
extern cStr * str_hostname;
extern cStr * str_release;

extern Bool coldcc;
extern Bool running;
extern Bool atomic;
extern Int  heartbeat_freq;

extern Int cache_width;
extern Int cache_depth;

extern void init_defs(void); 

/* limits configurable with 'config()' */
extern Int  limit_datasize;
extern Int  limit_fork;
extern Int  limit_calldepth;
extern Int  limit_recursion;
extern Int  limit_objswap;

#endif

#endif