/tmp/buildd/coinor-dylp-1.6.0/DyLP/src/DylpStdLib/dylib_std.h
Go to the documentation of this file.
00001 #ifndef _DYLIB_STD_H
00002 #define _DYLIB_STD_H
00003 
00004 /*
00005   This file is part of the support library for the Dylp LP distribution.
00006 
00007         Copyright (C) 2005 -- 2007 Lou Hafer
00008 
00009         School of Computing Science
00010         Simon Fraser University
00011         Burnaby, B.C., V5A 1S6, Canada
00012         lou@cs.sfu.ca
00013 
00014   This code is licensed under the terms of the Common Public License (CPL).
00015 */
00016 
00017 /*
00018   @(#)dylib_std.h       1.5     09/25/04
00019   svn/cvs: $Id: dylib_std.h 148 2007-06-09 03:15:30Z lou $
00020 */
00021 
00022 /*
00023   This file contains common definitions.
00024 
00025   First thing to do is haul in the Ansi C standard definitions. Takes care of
00026   NULL plus a few more obscure definitions. Also haul in the standard library
00027   declarations.
00028 */
00029 
00030 #include <stddef.h>
00031 #include <stdlib.h>
00032 
00033 #include "DylpConfig.h"
00034 
00035 /*
00036   A utility definition which allows for easy suppression of unused variable
00037   warnings from GCC. Useful when a variable is used only for assert()
00038   statements, and for sccsid/cvsid strings.
00039 */
00040 #ifndef UNUSED
00041 # if defined(_GNU_SOURCE) || defined(__GNUC__)
00042 #   define UNUSED __attribute__((unused))
00043 # else
00044 #   define UNUSED
00045 # endif
00046 #endif
00047 
00048 /*
00049   Memory copy functions --- memcpy, memset, and other less common ones.
00050 */
00051   
00052 #include <string.h>
00053 
00054 /*
00055   We need a boolean type. Never could understand why C doesn't have this.
00056 
00057   [Aug 10, 01] For compatibility with C++, TRUE and FALSE are defined to be
00058   the corresponding C++ values. BOOL should be set in the compiler command
00059   line to be the storage type (char/short/int/long) that matches the size of
00060   a C++ "bool".  All these are necessary to link with and be called by C++
00061   code in osi-bonsai.
00062 */
00063 
00064 #ifndef __cplusplus
00065 #define FALSE 0
00066 #define TRUE 1
00067 # ifdef BOOL
00068   typedef BOOL bool ;
00069 # else
00070 /*
00071   You're in trouble. The likely source of the problem is that this file is
00072   being included in the course of a build controlled by a makefile that
00073   doesn't know about the booltype utility in the dylp distribution. See the
00074   Utils subdirectory, and also check the makefile for dylp to see how this is
00075   used.  If you don't want to fiddle with your build control files, just
00076   build booltype, run it, and edit in the appropriate definition. If you're
00077   not worried about C++ compatibility, int is a good as anything.
00078 */
00079 # warning The compile-time symbol BOOL is not defined (dylib_std.h)
00080   typedef int bool ;
00081 # endif
00082 #endif
00083 
00084 #ifdef __cplusplus
00085 #ifndef FALSE
00086 # define FALSE false
00087 #endif
00088 #ifndef TRUE
00089 # define TRUE true
00090 #endif
00091 #endif
00092 
00093 /*
00094   flags is used to indicate a data type composed of one-bit flags. Manipulated
00095   with the set of flag manipulation macros defined below.
00096 */
00097 
00098 typedef unsigned int flags ;
00099 
00100 #define setflg(zz_flgs,zz_flg) ((zz_flgs) |= (zz_flg))
00101 #define clrflg(zz_flgs,zz_flg) ((zz_flgs) &= ~(zz_flg))
00102 #define comflg(zz_flgs,zz_flg) ((zz_flgs) ^= (zz_flg))
00103 #define getflg(zz_flgs,zz_flg) ((zz_flgs)&(zz_flg))
00104 #define flgon(zz_flgs,zz_flg)  ((zz_flgs)&(zz_flg)?TRUE:FALSE)
00105 #define flgoff(zz_flgs,zz_flg) ((zz_flgs)&(zz_flg)?FALSE:TRUE)
00106 #define flgall(zz_flgs,zz_flg) ((((zz_flgs)&(zz_flg)) == (zz_flg))?TRUE:FALSE)
00107 
00108 
00109 /*
00110   lnk_struct is a general-purpose linked list structure.
00111 
00112   Field         Description
00113   -----         -----------
00114   llnxt         pointer to the next list element
00115   llval         pointer to the associated value 
00116 */
00117 
00118 typedef struct lnk_struct_tag
00119 { struct lnk_struct_tag *llnxt ;
00120   void *llval ; } lnk_struct ;
00121 
00122 #define lnk_in(qqlnk,qqval) ((qqlnk)->llval = (void *) (qqval))
00123 #define lnk_out(qqlnk,qqtype) ((qqtype) (qqlnk)->llval)
00124 
00125 
00126 /* Max and min macros */
00127 
00128 #define minn(qa,qb) (((qa) > (qb))?(qb):(qa))
00129 #define maxx(qa,qb) (((qa) > (qb))?(qa):(qb))
00130 
00131 
00132 /*
00133   Some macros to hide the memory allocation functions.
00134 
00135   The serious debugging versions of these macros (MALLOC_DEBUG = 2) use
00136   outfmt from the io library and assume the existence of a string, rtnnme
00137   (typically the name of the current subroutine) that's used to identify the
00138   origin of the message. There's enough information in the messages to track
00139   the allocation and deallocation of blocks, should you not have access to an
00140   interactive debugger with this capability.
00141 
00142   The casual debugging versions (MALLOC_DEBUG = 1) only check for a return
00143   value of 0 and print a message to stderr with the file and line number.
00144   This at least tells you when your code has core dumped because it ran out
00145   of space (as opposed to a bug you can actually fix).
00146 */
00147 
00148 #if (MALLOC_DEBUG == 2)
00149 
00150 #include "dylib_io.h"
00151 
00152 void *zz_ptr_zz ;
00153 ioid  zz_chn_zz ;
00154 
00155 #define MALLOC_DBG_INIT(chn) ( zz_chn_zz = chn )
00156 
00157 #define MALLOC(zz_sze_zz) \
00158   ( zz_ptr_zz = (void *) malloc(zz_sze_zz), \
00159     outfmt(zz_chn_zz,FALSE,":malloc: %d bytes at %#08x in %s.\n", \
00160             zz_sze_zz,zz_ptr_zz,rtnnme), \
00161     zz_ptr_zz )
00162 
00163 #define CALLOC(zz_cnt_zz,zz_sze_zz) \
00164   ( zz_ptr_zz = (void *) calloc(zz_cnt_zz,zz_sze_zz), \
00165     outfmt(zz_chn_zz,FALSE,":calloc: %d (%d*%d) bytes at %#08x in %s.\n", \
00166             zz_cnt_zz*zz_sze_zz,zz_cnt_zz,zz_sze_zz,zz_ptr_zz,rtnnme), \
00167     zz_ptr_zz )
00168 
00169 #define REALLOC(zz_rptr_zz,zz_sze_zz) \
00170   ( zz_ptr_zz = (void *) realloc(zz_rptr_zz,zz_sze_zz), \
00171     outfmt(zz_chn_zz,FALSE, \
00172            ":realloc: %#08x changed to %d bytes at %#08x in %s.\n", \
00173             zz_rptr_zz,zz_sze_zz,zz_ptr_zz,rtnnme), \
00174     zz_ptr_zz )
00175 
00176 #define FREE(zz_fptr_zz) \
00177   ( outfmt(zz_chn_zz,FALSE,":free: %#08x in %s.\n",zz_fptr_zz,rtnnme), \
00178     free((void *) zz_fptr_zz) )
00179 
00180 #elif (MALLOC_DEBUG == 1)
00181 
00182 #include <stdio.h>
00183 void *zz_ptr_zz ;
00184 
00185 #define MALLOC(zz_sze_zz) \
00186   ( zz_ptr_zz = (void *) malloc(zz_sze_zz), \
00187     (zz_ptr_zz != 0)?0:\
00188       fprintf(stderr,":malloc: failed to get %d bytes at %s:%d.\n", \
00189               zz_sze_zz,__FILE__,__LINE__), \
00190     zz_ptr_zz )
00191 
00192 #define CALLOC(zz_cnt_zz,zz_sze_zz) \
00193   ( zz_ptr_zz = (void *) calloc(zz_cnt_zz,zz_sze_zz), \
00194     (zz_ptr_zz != 0)?0:\
00195       fprintf(stderr,":calloc: failed to get %d bytes at %s:%d.\n", \
00196               zz_sze_zz*zz_cnt_zz,__FILE__,__LINE__), \
00197     zz_ptr_zz )
00198 
00199 #define REALLOC(zz_rptr_zz,zz_sze_zz) \
00200   ( zz_ptr_zz = (void *) realloc(zz_rptr_zz,zz_sze_zz), \
00201     (zz_ptr_zz != 0)?0:\
00202       fprintf(stderr,":realloc: failed to get %d bytes at %s:%d.\n", \
00203               zz_sze_zz,__FILE__,__LINE__), \
00204     zz_ptr_zz )
00205 
00206 #define FREE(zz_fptr_zz) free((void *) zz_fptr_zz)
00207 
00208 #else
00209 
00210 #define MALLOC_DBG_INIT(chn)
00211 
00212 #define MALLOC(zz_sze_zz) malloc(zz_sze_zz)
00213 
00214 #define CALLOC(zz_cnt_zz,zz_sze_zz) calloc(zz_cnt_zz,zz_sze_zz)
00215 
00216 #define REALLOC(zz_rptr_zz,zz_sze_zz) realloc(zz_rptr_zz,zz_sze_zz)
00217 
00218 #define FREE(zz_fptr_zz) free((void *) zz_fptr_zz)
00219 
00220 #endif
00221 
00222 
00223 #endif /* _DYLIB_STD_H */