# 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 Eclipse Public License (EPL).
    00015 */
    00016
    00017 /*
    00018   @(#)dylib_std.h       1.5     09/25/04
    00019   svn/cvs: $Id: dylib_std.h 407 2010-12-31 20:48:48Z 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".
    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 */

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines