DyLP trunk
|
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 Eclipse Public License (EPL). 00015 */ 00016 00017 /* 00018 @(#)dylib_std.h 1.5 09/25/04 00019 svn/cvs: $Id$ 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". 00061 */ 00062 00063 #ifndef __cplusplus 00064 #define FALSE 0 00065 #define TRUE 1 00066 # ifdef BOOL 00067 typedef BOOL bool ; 00068 # else 00069 /* 00070 You're in trouble. Normally a definition for BOOL is determined by the 00071 configure script; apparently you're outside of whatever framework should 00072 do this. If you're not worried about C++ compatibility, int is a good a 00073 choice as anything. If you're concerned about C++ compatibility, write a 00074 small C++ program that prints out sizeof(bool) and add the definition here. 00075 */ 00076 # warning The compile-time symbol BOOL is not defined (dylib_std.h) 00077 typedef int bool ; 00078 # endif 00079 #endif 00080 00081 #ifdef __cplusplus 00082 #ifndef FALSE 00083 # define FALSE false 00084 #endif 00085 #ifndef TRUE 00086 # define TRUE true 00087 #endif 00088 #endif 00089 00090 /* 00091 flags is used to indicate a data type composed of one-bit flags. Manipulated 00092 with the set of flag manipulation macros defined below. 00093 */ 00094 00095 typedef unsigned int flags ; 00096 00097 #define setflg(zz_flgs,zz_flg) ((zz_flgs) |= (zz_flg)) 00098 #define clrflg(zz_flgs,zz_flg) ((zz_flgs) &= ~(zz_flg)) 00099 #define comflg(zz_flgs,zz_flg) ((zz_flgs) ^= (zz_flg)) 00100 #define getflg(zz_flgs,zz_flg) ((zz_flgs)&(zz_flg)) 00101 #define flgon(zz_flgs,zz_flg) ((zz_flgs)&(zz_flg)?TRUE:FALSE) 00102 #define flgoff(zz_flgs,zz_flg) ((zz_flgs)&(zz_flg)?FALSE:TRUE) 00103 #define flgall(zz_flgs,zz_flg) ((((zz_flgs)&(zz_flg)) == (zz_flg))?TRUE:FALSE) 00104 00105 00106 /* 00107 lnk_struct is a general-purpose linked list structure. 00108 00109 Field Description 00110 ----- ----------- 00111 llnxt pointer to the next list element 00112 llval pointer to the associated value 00113 */ 00114 00115 typedef struct lnk_struct_tag 00116 { struct lnk_struct_tag *llnxt ; 00117 void *llval ; } lnk_struct ; 00118 00119 #define lnk_in(qqlnk,qqval) ((qqlnk)->llval = (void *) (qqval)) 00120 #define lnk_out(qqlnk,qqtype) ((qqtype) (qqlnk)->llval) 00121 00122 00123 /* Max and min macros */ 00124 00125 #define minn(qa,qb) (((qa) > (qb))?(qb):(qa)) 00126 #define maxx(qa,qb) (((qa) > (qb))?(qa):(qb)) 00127 00128 00129 /* 00130 Some macros to hide the memory allocation functions. 00131 00132 The serious debugging versions of these macros (MALLOC_DEBUG = 2) use 00133 outfmt from the io library and assume the existence of a string, rtnnme 00134 (typically the name of the current subroutine) that's used to identify the 00135 origin of the message. There's enough information in the messages to track 00136 the allocation and deallocation of blocks, should you not have access to an 00137 interactive debugger with this capability. 00138 00139 The casual debugging versions (MALLOC_DEBUG = 1) only check for a return 00140 value of 0 and print a message to stderr with the file and line number. 00141 This at least tells you when your code has core dumped because it ran out 00142 of space (as opposed to a bug you can actually fix). 00143 */ 00144 00145 #if (MALLOC_DEBUG == 2) 00146 00147 #include "dylib_io.h" 00148 00149 void *zz_ptr_zz ; 00150 ioid zz_chn_zz ; 00151 00152 #define MALLOC_DBG_INIT(chn) ( zz_chn_zz = chn ) 00153 00154 #define MALLOC(zz_sze_zz) \ 00155 ( zz_ptr_zz = (void *) malloc(zz_sze_zz), \ 00156 dyio_outfmt(zz_chn_zz,FALSE,":malloc: %d bytes at %#08x in %s.\n", \ 00157 zz_sze_zz,zz_ptr_zz,rtnnme), \ 00158 zz_ptr_zz ) 00159 00160 #define CALLOC(zz_cnt_zz,zz_sze_zz) \ 00161 ( zz_ptr_zz = (void *) calloc(zz_cnt_zz,zz_sze_zz), \ 00162 dyio_outfmt(zz_chn_zz,FALSE,":calloc: %d (%d*%d) bytes at %#08x in %s.\n", \ 00163 zz_cnt_zz*zz_sze_zz,zz_cnt_zz,zz_sze_zz,zz_ptr_zz,rtnnme), \ 00164 zz_ptr_zz ) 00165 00166 #define REALLOC(zz_rptr_zz,zz_sze_zz) \ 00167 ( zz_ptr_zz = (void *) realloc(zz_rptr_zz,zz_sze_zz), \ 00168 dyio_outfmt(zz_chn_zz,FALSE, \ 00169 ":realloc: %#08x changed to %d bytes at %#08x in %s.\n", \ 00170 zz_rptr_zz,zz_sze_zz,zz_ptr_zz,rtnnme), \ 00171 zz_ptr_zz ) 00172 00173 #define FREE(zz_fptr_zz) \ 00174 ( dyio_outfmt(zz_chn_zz,FALSE,":free: %#08x in %s.\n",zz_fptr_zz,rtnnme), \ 00175 free((void *) zz_fptr_zz) ) 00176 00177 #elif (MALLOC_DEBUG == 1) 00178 00179 #include <stdio.h> 00180 void *zz_ptr_zz ; 00181 00182 #define MALLOC(zz_sze_zz) \ 00183 ( zz_ptr_zz = (void *) malloc(zz_sze_zz), \ 00184 (zz_ptr_zz != 0)?0:\ 00185 fprintf(stderr,":malloc: failed to get %d bytes at %s:%d.\n", \ 00186 zz_sze_zz,__FILE__,__LINE__), \ 00187 zz_ptr_zz ) 00188 00189 #define CALLOC(zz_cnt_zz,zz_sze_zz) \ 00190 ( zz_ptr_zz = (void *) calloc(zz_cnt_zz,zz_sze_zz), \ 00191 (zz_ptr_zz != 0)?0:\ 00192 fprintf(stderr,":calloc: failed to get %d bytes at %s:%d.\n", \ 00193 zz_sze_zz*zz_cnt_zz,__FILE__,__LINE__), \ 00194 zz_ptr_zz ) 00195 00196 #define REALLOC(zz_rptr_zz,zz_sze_zz) \ 00197 ( zz_ptr_zz = (void *) realloc(zz_rptr_zz,zz_sze_zz), \ 00198 (zz_ptr_zz != 0)?0:\ 00199 fprintf(stderr,":realloc: failed to get %d bytes at %s:%d.\n", \ 00200 zz_sze_zz,__FILE__,__LINE__), \ 00201 zz_ptr_zz ) 00202 00203 #define FREE(zz_fptr_zz) free((void *) zz_fptr_zz) 00204 00205 #else 00206 00207 #define MALLOC_DBG_INIT(chn) 00208 00209 #define MALLOC(zz_sze_zz) malloc(zz_sze_zz) 00210 00211 #define CALLOC(zz_cnt_zz,zz_sze_zz) calloc(zz_cnt_zz,zz_sze_zz) 00212 00213 #define REALLOC(zz_rptr_zz,zz_sze_zz) realloc(zz_rptr_zz,zz_sze_zz) 00214 00215 #define FREE(zz_fptr_zz) free((void *) zz_fptr_zz) 00216 00217 #endif 00218 00219 00220 #endif /* _DYLIB_STD_H */