|
|
1.1 ! root 1: /* gen_defs.h */ ! 2: ! 3: /* General(ly useful) constant, macro, and type definitions */ ! 4: ! 5: /* $Id: gen_defs.h,v 1.36 2006/05/28 22:01:57 deuce Exp $ */ ! 6: ! 7: /**************************************************************************** ! 8: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 10: * * ! 11: * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html * ! 12: * * ! 13: * This library is free software; you can redistribute it and/or * ! 14: * modify it under the terms of the GNU Lesser General Public License * ! 15: * as published by the Free Software Foundation; either version 2 * ! 16: * of the License, or (at your option) any later version. * ! 17: * See the GNU Lesser General Public License for more details: lgpl.txt or * ! 18: * http://www.fsf.org/copyleft/lesser.html * ! 19: * * ! 20: * Anonymous FTP access to the most recent released source is available at * ! 21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 22: * * ! 23: * Anonymous CVS access to the development source and modification history * ! 24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 26: * (just hit return, no password is necessary) * ! 27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 28: * * ! 29: * For Synchronet coding style and modification guidelines, see * ! 30: * http://www.synchro.net/source.html * ! 31: * * ! 32: * You are encouraged to submit any modifications (preferably in Unix diff * ! 33: * format) via e-mail to [email protected] * ! 34: * * ! 35: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 36: ****************************************************************************/ ! 37: ! 38: #ifndef _GEN_DEFS_H ! 39: #define _GEN_DEFS_H ! 40: ! 41: #include <errno.h> ! 42: ! 43: /* Resolve multi-named errno constants */ ! 44: #if defined(EDEADLK) && !defined(EDEADLOCK) ! 45: #define EDEADLOCK EDEADLK ! 46: #endif ! 47: ! 48: #if defined(_WIN32) ! 49: #define WIN32_LEAN_AND_MEAN /* Don't bring in excess baggage */ ! 50: #include <windows.h> ! 51: #elif defined(__OS2__) ! 52: #define INCL_BASE /* need this for DosSleep prototype */ ! 53: #include <os2.h> ! 54: #else ! 55: #if (defined(__APPLE__) && defined(__MACH__) && defined(__POWERPC__)) || defined (__NetBSD__) ! 56: #ifndef __unix__ ! 57: #define __unix__ ! 58: #endif ! 59: #endif ! 60: #endif ! 61: ! 62: ! 63: #include <sys/types.h> ! 64: ! 65: /* Control characters */ ! 66: #ifndef STX ! 67: #define STX 0x02 /* Start of text ^B */ ! 68: #endif ! 69: #ifndef ETX ! 70: #define ETX 0x03 /* End of text ^C */ ! 71: #endif ! 72: #ifndef BEL ! 73: #define BEL 0x07 /* Bell/beep ^G */ ! 74: #endif ! 75: #ifndef FF ! 76: #define FF 0x0c /* Form feed ^L */ ! 77: #endif ! 78: #ifndef ESC ! 79: #define ESC 0x1b /* Escape ^[ */ ! 80: #endif ! 81: #ifndef DEL ! 82: #define DEL 0x7f /* Delete ^BS */ ! 83: #endif ! 84: #ifndef BS ! 85: #define BS '\b' /* Back space ^H */ ! 86: #endif ! 87: #ifndef TAB ! 88: #define TAB '\t' /* Horizontal tabulation ^I */ ! 89: #endif ! 90: #ifndef LF ! 91: #define LF '\n' /* Line feed ^J */ ! 92: #endif ! 93: #ifndef CR ! 94: #define CR '\r' /* Carriage return ^M */ ! 95: #endif ! 96: ! 97: ! 98: enum { ! 99: CTRL_A=1 ! 100: ,CTRL_B ! 101: ,CTRL_C ! 102: ,CTRL_D ! 103: ,CTRL_E ! 104: ,CTRL_F ! 105: ,CTRL_G ! 106: ,CTRL_H ! 107: ,CTRL_I ! 108: ,CTRL_J ! 109: ,CTRL_K ! 110: ,CTRL_L ! 111: ,CTRL_M ! 112: ,CTRL_N ! 113: ,CTRL_O ! 114: ,CTRL_P ! 115: ,CTRL_Q ! 116: ,CTRL_R ! 117: ,CTRL_S ! 118: ,CTRL_T ! 119: ,CTRL_U ! 120: ,CTRL_V ! 121: ,CTRL_W ! 122: ,CTRL_X ! 123: ,CTRL_Y ! 124: ,CTRL_Z ! 125: }; ! 126: ! 127: /* Unsigned type short-hands */ ! 128: #ifndef uchar ! 129: #define uchar unsigned char ! 130: #endif ! 131: #ifndef __GLIBC__ ! 132: #ifndef ushort ! 133: #define ushort unsigned short ! 134: #define uint unsigned int ! 135: #define ulong unsigned long ! 136: #endif ! 137: #endif ! 138: ! 139: /* Windows Types */ ! 140: #ifndef BYTE ! 141: #define BYTE uchar ! 142: #endif ! 143: #ifndef WORD ! 144: #define WORD ushort ! 145: #endif ! 146: #ifndef DWORD ! 147: #define DWORD ulong ! 148: #endif ! 149: #ifndef BOOL ! 150: #define BOOL int ! 151: #endif ! 152: #ifndef TRUE ! 153: #define TRUE 1 ! 154: #define FALSE 0 ! 155: #endif ! 156: #ifndef INT_TO_BOOL ! 157: #define INT_TO_BOOL(x) ((x)?TRUE:FALSE) ! 158: #endif ! 159: #ifndef HANDLE ! 160: #define HANDLE void* ! 161: #endif ! 162: ! 163: /* Custom Types */ ! 164: typedef struct { ! 165: char* name; ! 166: char* value; ! 167: } named_string_t; ! 168: ! 169: typedef struct { ! 170: char* name; ! 171: int value; ! 172: } named_int_t; ! 173: ! 174: typedef struct { ! 175: char* name; ! 176: uint value; ! 177: } named_uint_t; ! 178: ! 179: typedef struct { ! 180: char* name; ! 181: long value; ! 182: } named_long_t; ! 183: ! 184: typedef struct { ! 185: char* name; ! 186: ulong value; ! 187: } named_ulong_t; ! 188: ! 189: typedef struct { ! 190: char* name; ! 191: short value; ! 192: } named_short_t; ! 193: ! 194: typedef struct { ! 195: char* name; ! 196: ushort value; ! 197: } named_ushort_t; ! 198: ! 199: typedef struct { ! 200: char* name; ! 201: float value; ! 202: } named_float_t; ! 203: ! 204: typedef struct { ! 205: char* name; ! 206: double value; ! 207: } named_double_t; ! 208: ! 209: typedef struct { ! 210: char* name; ! 211: BOOL value; ! 212: } named_bool_t; ! 213: ! 214: typedef struct { ! 215: int key; ! 216: char* value; ! 217: } keyed_string_t; ! 218: ! 219: typedef struct { ! 220: int key; ! 221: int value; ! 222: } keyed_int_t; ! 223: ! 224: ! 225: /************************/ ! 226: /* Handy Integer Macros */ ! 227: /************************/ ! 228: ! 229: /* Data Block Length Alignment Macro (returns required padding length for proper alignment) */ ! 230: #define PAD_LENGTH_FOR_ALIGNMENT(len,blk) (((len)%(blk))==0 ? 0 : (blk)-((len)%(blk))) ! 231: ! 232: /***********************/ ! 233: /* Handy String Macros */ ! 234: /***********************/ ! 235: ! 236: /* Null-Terminate an ASCIIZ char array */ ! 237: #define TERMINATE(str) str[sizeof(str)-1]=0 ! 238: ! 239: /* This is a bound-safe version of strcpy basically - only works with fixed-length arrays */ ! 240: #ifdef SAFECOPY_USES_SPRINTF ! 241: #define SAFECOPY(dst,src) sprintf(dst,"%.*s",(int)sizeof(dst)-1,src) ! 242: #else /* strncpy is faster */ ! 243: #define SAFECOPY(dst,src) (strncpy(dst,src,sizeof(dst)), TERMINATE(dst)) ! 244: #endif ! 245: ! 246: /* Bound-safe version of sprintf() - only works with fixed-length arrays */ ! 247: #if (defined __FreeBSD__) || (defined __NetBSD__) || (defined __OpenBSD__) || (defined(__APPLE__) && defined(__MACH__) && defined(__POWERPC__)) ! 248: /* *BSD *nprintf() is already safe */ ! 249: #define SAFEPRINTF(dst,fmt,arg) snprintf(dst,sizeof(dst),fmt,arg) ! 250: #define SAFEPRINTF2(dst,fmt,a1,a2) snprintf(dst,sizeof(dst),fmt,a1,a2) ! 251: #define SAFEPRINTF3(dst,fmt,a1,a2,a3) snprintf(dst,sizeof(dst),fmt,a1,a2,a3) ! 252: #define SAFEPRINTF4(dst,fmt,a1,a2,a3,a4) snprintf(dst,sizeof(dst),fmt,a1,a2,a3,a4) ! 253: #else ! 254: #define SAFEPRINTF(dst,fmt,arg) snprintf(dst,sizeof(dst),fmt,arg), TERMINATE(dst) ! 255: #define SAFEPRINTF2(dst,fmt,a1,a2) snprintf(dst,sizeof(dst),fmt,a1,a2), TERMINATE(dst) ! 256: #define SAFEPRINTF3(dst,fmt,a1,a2,a3) snprintf(dst,sizeof(dst),fmt,a1,a2,a3), TERMINATE(dst) ! 257: #define SAFEPRINTF4(dst,fmt,a1,a2,a3,a4) snprintf(dst,sizeof(dst),fmt,a1,a2,a3,a4), TERMINATE(dst) ! 258: #endif ! 259: ! 260: /* Replace every occurance of c1 in str with c2, using p as a temporary char pointer */ ! 261: #define REPLACE_CHARS(str,c1,c2,p) for((p)=(str);*(p);(p)++) if(*(p)==(c1)) *(p)=(c2); ! 262: ! 263: /* ASCIIZ char* parsing helper macros */ ! 264: #define SKIP_WHITESPACE(p) while(*(p) && isspace(*(p))) (p)++; ! 265: #define FIND_WHITESPACE(p) while(*(p) && !isspace(*(p))) (p)++; ! 266: #define SKIP_CHAR(p,c) while(*(p)==c) (p)++; ! 267: #define FIND_CHAR(p,c) while(*(p) && *(p)!=c) (p)++; ! 268: #define SKIP_CHARSET(p,s) while(*(p) && strchr(s,*(p))!=NULL) (p)++; ! 269: #define FIND_CHARSET(p,s) while(*(p) && strchr(s,*(p))==NULL) (p)++; ! 270: #define SKIP_ALPHA(p) while(*(p) && isalpha(*(p))) (p)++; ! 271: #define FIND_ALPHA(p) while(*(p) && !isalpha(*(p))) (p)++; ! 272: #define SKIP_ALPHANUMERIC(p) while(*(p) && isalnum(*(p))) (p)++; ! 273: #define FIND_ALPHANUMERIC(p) while(*(p) && !isalnum(*(p))) (p)++; ! 274: #define SKIP_DIGIT(p) while(*(p) && isdigit(*(p))) (p)++; ! 275: #define FIND_DIGIT(p) while(*(p) && !isdigit(*(p))) (p)++; ! 276: #define SKIP_HEXDIGIT(p) while(*(p) && isxdigit(*(p))) (p)++; ! 277: #define FIND_HEXDIGIT(p) while(*(p) && !isxdigit(*(p))) (p)++; ! 278: ! 279: /* Variable/buffer initialization (with zeros) */ ! 280: #define ZERO_VAR(var) memset(&(var),0,sizeof(var)) ! 281: #define ZERO_ARRAY(array) memset(array,0,sizeof(array)) ! 282: ! 283: /****************************************************************************/ ! 284: /* MALLOC/FREE Macros for various compilers and environments */ ! 285: /* MALLOC is used for allocations of 64k or less */ ! 286: /* FREE is used to free buffers allocated with MALLOC */ ! 287: /* LMALLOC is used for allocations of possibly larger than 64k */ ! 288: /* LFREE is used to free buffers allocated with LMALLOC */ ! 289: /* REALLOC is used to re-size a previously MALLOCed or LMALLOCed buffer */ ! 290: /* FAR16 is used to create a far (32-bit) pointer in 16-bit compilers */ ! 291: /* HUGE16 is used to create a huge (32-bit) pointer in 16-bit compilers */ ! 292: /****************************************************************************/ ! 293: #if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) ! 294: #define HUGE16 huge ! 295: #define FAR16 far ! 296: #if defined(__TURBOC__) ! 297: #define REALLOC(x,y) farrealloc(x,y) ! 298: #define LMALLOC(x) farmalloc(x) ! 299: #define MALLOC(x) farmalloc(x) ! 300: #define LFREE(x) farfree(x) ! 301: #define FREE(x) farfree(x) ! 302: #elif defined(__WATCOMC__) ! 303: #define REALLOC realloc ! 304: #define LMALLOC(x) halloc(x,1) /* far heap, but slow */ ! 305: #define MALLOC malloc /* far heap, but 64k max */ ! 306: #define LFREE hfree ! 307: #define FREE free ! 308: #else /* Other 16-bit Compiler */ ! 309: #define REALLOC realloc ! 310: #define LMALLOC malloc ! 311: #define MALLOC malloc ! 312: #define LFREE free ! 313: #define FREE free ! 314: #endif ! 315: #else /* 32-bit Compiler or Small Memory Model */ ! 316: #define HUGE16 ! 317: #define FAR16 ! 318: #define REALLOC realloc ! 319: #define LMALLOC malloc ! 320: #define MALLOC malloc ! 321: #define LFREE free ! 322: #define FREE free ! 323: #endif ! 324: ! 325: /********************************/ ! 326: /* Handy Pointer-freeing Macros */ ! 327: /********************************/ ! 328: #define FREE_AND_NULL(x) if(x!=NULL) { FREE(x); x=NULL; } ! 329: #define FREE_LIST_ITEMS(list,i) if(list!=NULL) { \ ! 330: for(i=0;list[i]!=NULL;i++) \ ! 331: FREE_AND_NULL(list[i]); \ ! 332: } ! 333: #define FREE_LIST(list,i) FREE_LIST_ITEMS(list,i) FREE_AND_NULL(list) ! 334: ! 335: /********************************/ ! 336: /* Other Pointer-List Macros */ ! 337: /********************************/ ! 338: #define COUNT_LIST_ITEMS(list,i) { i=0; if(list!=NULL) while(list[i]!=NULL) i++; } ! 339: ! 340: #if defined(__unix__) ! 341: #include <syslog.h> ! 342: #else ! 343: /* ! 344: * log priorities (copied from BSD syslog.h) ! 345: */ ! 346: #define LOG_EMERG 0 /* system is unusable */ ! 347: #define LOG_ALERT 1 /* action must be taken immediately */ ! 348: #define LOG_CRIT 2 /* critical conditions */ ! 349: #define LOG_ERR 3 /* error conditions */ ! 350: #define LOG_WARNING 4 /* warning conditions */ ! 351: #define LOG_NOTICE 5 /* normal but significant condition */ ! 352: #define LOG_INFO 6 /* informational */ ! 353: #define LOG_DEBUG 7 /* debug-level messages */ ! 354: #endif ! 355: ! 356: /* Special hackery for SDL */ ! 357: #ifdef WITH_SDL ! 358: #include <SDL.h> ! 359: ! 360: #ifdef main ! 361: #undef main ! 362: #endif ! 363: #define main XPDEV_main ! 364: #endif ! 365: ! 366: #endif /* Don't add anything after this #endif statement */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.