Annotation of sbbs/src/xpdev/genwrap.h, revision 1.1.1.1

1.1       root        1: /* genwrap.h */
                      2: 
                      3: /* General cross-platform development wrappers */
                      4: 
                      5: /* $Id: genwrap.h,v 1.87 2006/08/14 22:51:12 rswindell 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 _GENWRAP_H
                     39: #define _GENWRAP_H
                     40: 
                     41: #include <stdio.h>             /* sprintf */
                     42: #include "gen_defs.h"  /* ulong */
                     43: #include "wrapdll.h"   /* DLLEXPORT and DLLCALL */
                     44: 
                     45: #if defined(__unix__)
                     46:        #include <sched.h>              /* sched_yield */
                     47:        #include <time.h>       /* clock_t */
                     48:        #include <sys/time.h>   /* struct timeval */
                     49:        #include <strings.h>    /* strcasecmp() */
                     50:        #include <unistd.h>             /* usleep */
                     51: 
                     52:        #ifdef XPDEV_THREAD_SAFE
                     53:                #include <pthread.h>/* Check for GNU PTH libs */
                     54:                #ifdef _PTH_PTHREAD_H_
                     55:                        #include <pth.h>
                     56:                #endif
                     57:                #define GetCurrentThreadId()    pthread_self()
                     58:        #endif
                     59: #elif defined(_WIN32)
                     60:        #include <process.h>    /* getpid() */
                     61: #endif
                     62: 
                     63: #if !defined(_WIN32)
                     64:        /* Simple Win32 function equivalents */
                     65:        #define GetCurrentProcessId()           getpid()
                     66: #endif
                     67: 
                     68: /* utime() support */
                     69: #if defined(_MSC_VER) || defined(__WATCOMC__)
                     70:        #include <sys/utime.h>
                     71: #else
                     72:        #include <utime.h>
                     73: #endif
                     74: 
                     75: #if defined(__cplusplus)
                     76: extern "C" {
                     77: #endif
                     78: 
                     79: /*********************/
                     80: /* Compiler-specific */
                     81: /*********************/
                     82: 
                     83: /* Compiler Description */
                     84: #if defined(__BORLANDC__)
                     85: 
                     86:        #define DESCRIBE_COMPILER(str) SAFEPRINTF2(str,"BCC %X.%02X" \
                     87:                ,__BORLANDC__>>8,__BORLANDC__&0xff);    
                     88: 
                     89: #elif defined(_MSC_VER)
                     90: 
                     91:        #define DESCRIBE_COMPILER(str) SAFEPRINTF(str,"MSC %u", _MSC_VER);
                     92: 
                     93: #elif defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__)
                     94: 
                     95:        #define DESCRIBE_COMPILER(str) SAFEPRINTF3(str,"GCC %u.%u.%u" \
                     96:                ,__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__);
                     97: 
                     98: #elif defined(__GNUC__) && defined(__GNUC_MINOR__)
                     99: 
                    100:        #define DESCRIBE_COMPILER(str) SAFEPRINTF2(str,"GCC %u.%u" \
                    101:                ,__GNUC__,__GNUC_MINOR__);
                    102: 
                    103: #elif defined(__WATCOMC__)
                    104: 
                    105:        #define DESCRIBE_COMPILER(str) SAFEPRINTF(str,"WATC %d" \
                    106:                ,__WATCOMC__);
                    107: 
                    108: #elif defined(__DMC__) /* Digital Mars C/C++ */
                    109: 
                    110:        #define DESCRIBE_COMPILER(str) SAFEPRINTF(str,"DMC %X.%02X" \
                    111:                ,__DMC__>>8,__DMC__&0xff);      
                    112: 
                    113: #else /* Unknown compiler */
                    114: 
                    115:        #define DESCRIBE_COMPILER(str) SAFECOPY(str,"UNKNOWN COMPILER");
                    116: 
                    117: #endif
                    118: 
                    119: /**********/
                    120: /* Macros */
                    121: /**********/
                    122: 
                    123: /* Target Platform Description */
                    124: #if defined(_WIN64)
                    125:        #define PLATFORM_DESC   "Win64"
                    126: #elif defined(_WIN32)
                    127:        #define PLATFORM_DESC   "Win32"
                    128: #elif defined(__OS2__)
                    129:        #define PLATFORM_DESC   "OS/2"
                    130: #elif defined(__MSDOS__)
                    131:        #define PLATFORM_DESC   "DOS"
                    132: #elif defined(__linux__)
                    133:        #define PLATFORM_DESC   "Linux"
                    134: #elif defined(__FreeBSD__)
                    135:        #define PLATFORM_DESC   "FreeBSD"
                    136: #elif defined(__OpenBSD__)
                    137:        #define PLATFORM_DESC   "OpenBSD"
                    138: #elif defined(__NetBSD__)
                    139:        #define PLATFORM_DESC   "NetBSD"
                    140: #elif defined(__APPLE__) && defined(__MACH__) && defined(__POWERPC__)
                    141:        #define PLATFORM_DESC   "MacOSX"
                    142: #elif defined(BSD)
                    143:        #define PLATFORM_DESC   "BSD"
                    144: #elif defined(__solaris__)
                    145:        #define PLATFORM_DESC   "Solaris"
                    146: #elif defined(__sun__)
                    147:        #define PLATFORM_DESC   "SunOS"
                    148: #elif defined(__gnu__)
                    149:        #define PLATFORM_DESC   "GNU/Hurd"
                    150: #elif defined(__QNX__)
                    151:        #define PLATFORM_DESC   "QNX"
                    152: #elif defined(__unix__)
                    153:        #define PLATFORM_DESC   "Unix"
                    154: #else
                    155:        #error "Need to describe target platform"
                    156: #endif
                    157: 
                    158: /*********************/
                    159: /* String Functionss */
                    160: /*********************/
                    161: 
                    162: #define snprintf       safe_snprintf
                    163: 
                    164: #if defined(_MSC_VER) || defined(__MINGW32__) || defined(__DMC__)
                    165:        #define vsnprintf               _vsnprintf
                    166: #endif
                    167: 
                    168: #if defined(__WATCOMC__)
                    169:        #define vsnprintf(s,l,f,a)      vsprintf(s,f,a)
                    170: #endif
                    171: 
                    172: #if !defined(_MSC_VER) && !defined(__BORLANDC__) && !defined(__WATCOMC__)
                    173:        DLLEXPORT char* DLLCALL ultoa(ulong, char*, int radix);
                    174: #endif
                    175: 
                    176: #if defined(__unix__)
                    177:        DLLEXPORT char* DLLCALL strupr(char* str);
                    178:        DLLEXPORT char* DLLCALL strlwr(char* str);
                    179:        DLLEXPORT char* DLLCALL strrev(char* str);
                    180:        #if !defined(stricmp)
                    181:                #define stricmp                 strcasecmp
                    182:                #define strnicmp                strncasecmp
                    183:        #endif
                    184: #endif
                    185: 
                    186: /* Truncate white-space chars off end of string */
                    187: DLLEXPORT char*                DLLCALL truncsp(char* str);
                    188: /* Truncate white-space chars off end of every \n-terminated line in string */
                    189: DLLEXPORT char*                DLLCALL truncsp_lines(char* str);
                    190: /* Truncate new-line chars off end of string */
                    191: DLLEXPORT char*                DLLCALL truncnl(char* str);
                    192: 
                    193: #if defined(__unix__)
                    194:        #define STRERROR(x)             strerror(x)
                    195: #else
                    196:        #define STRERROR(x)             truncsp(strerror(x))
                    197: #endif
                    198: 
                    199: /*********************/
                    200: /* Utility Functions */
                    201: /*********************/
                    202: /* Thunking for multi-threaded specific implementations of "errno" */
                    203: DLLEXPORT int DLLCALL  get_errno(void);
                    204: 
                    205: /**********************************/
                    206: /* Common Utility Macro Functions */
                    207: /**********************************/
                    208: 
                    209: #if defined(_WIN32)
                    210: 
                    211:        #define YIELD()                 Sleep(1) /* Must sleep at least 1ms to avoid 100% CPU utilization */
                    212:        #define MAYBE_YIELD()   Sleep(0)
                    213:        #define SLEEP(x)                Sleep(x)
                    214:        #define popen                   _popen
                    215:        #define pclose                  _pclose
                    216:        #if !defined(_MSC_VER)  /* Conflicts with latest (Windows 2003 R2) PlatformSDK include/time.h */
                    217:                #define tzname                  _tzname
                    218:        #endif
                    219: 
                    220: #elif defined(__OS2__)
                    221: 
                    222:        #define YIELD()                 DosSleep(1)     /* Must sleep at least 1ms to avoid 100% CPU utilization */
                    223:        #define MAYBE_YIELD()   DosSleep(0)
                    224:        #define SLEEP(x)                DosSleep(x)
                    225: 
                    226: #elif defined(__unix__) || defined(__APPLE__)
                    227: 
                    228:        #if defined(_PTH_PTHREAD_H_)
                    229:                #define SLEEP(x)                ({ int sleep_msecs=x; struct timeval tv; \
                    230:                                                                tv.tv_sec=(sleep_msecs/1000); tv.tv_usec=((sleep_msecs%1000)*1000); \
                    231:                                                                pth_nap(tv); })
                    232:        #else
                    233:                #define SLEEP(x)                ({      int sleep_msecs=x; struct timeval tv; \
                    234:                                                                tv.tv_sec=(sleep_msecs/1000); tv.tv_usec=((sleep_msecs%1000)*1000); \
                    235:                                                                select(0,NULL,NULL,NULL,&tv); })
                    236:        #endif
                    237: 
                    238:        #define YIELD()                 SLEEP(1)
                    239: 
                    240:        #if defined(XPDEV_THREAD_SAFE)
                    241:                #if defined(__FreeBSD__)
                    242:                        #define MAYBE_YIELD()                   pthread_yield()
                    243:                #elif defined(_PTH_PTHREAD_H_)
                    244:                        #define MAYBE_YIELD()                   pth_yield(NULL)
                    245:                #elif defined(_POSIX_PRIORITY_SCHEDULING)
                    246:                        #define MAYBE_YIELD()                   sched_yield()
                    247:                #else
                    248:                        #define MAYBE_YIELD()                   YIELD()
                    249:                #endif
                    250:        #else
                    251:                #if defined(_POSIX_PRIORITY_SCHEDULING)
                    252:                        #define MAYBE_YIELD()                   sched_yield()
                    253:                #else
                    254:                        #define MAYBE_YIELD()                   YIELD()
                    255:                #endif
                    256:        #endif
                    257: 
                    258:        /*
                    259:         * QNX doesn't support fork() in threaded apps (yet) using vfork() instead
                    260:         * works, but relies on undefined behaviours not being nasty.  On most OSs
                    261:         * vfork() will share the stack between the parent and child...
                    262:         */
                    263:        #if defined(__QNX__)
                    264:                #define FORK()  vfork()
                    265:        #else
                    266:                #define FORK()  fork()
                    267:        #endif
                    268: 
                    269: 
                    270: #else  /* Unsupported OS */
                    271: 
                    272:        #error "Unsupported Target: Need some macros and/or function prototypes here."
                    273: 
                    274: #endif
                    275: 
                    276: /* Command processor/shell environment variable name */
                    277: #ifdef __unix__
                    278:        #define OS_CMD_SHELL_ENV_VAR    "SHELL"
                    279: #else  /* DOS/Windows/OS2 */
                    280:        #define OS_CMD_SHELL_ENV_VAR    "COMSPEC"
                    281: #endif
                    282: 
                    283: /* Win32 implementations of recursive (thread-safe) std C time functions on Unix */
                    284: 
                    285: #if !defined(__unix__) 
                    286: 
                    287:        #include <time.h>               /* time_t, etc. */
                    288: 
                    289:        DLLEXPORT struct tm*    DLLCALL         gmtime_r(const time_t* t, struct tm* tm);
                    290:        DLLEXPORT struct tm*    DLLCALL         localtime_r(const time_t* t, struct tm* tm);
                    291:        DLLEXPORT char*         DLLCALL         ctime_r(const time_t *t, char *buf);
                    292:        DLLEXPORT char*         DLLCALL         asctime_r(const struct tm *tm, char *buf);
                    293:        DLLEXPORT char*                 DLLCALL         strtok_r(char *str, const char *delim, char **last);
                    294: 
                    295: #endif
                    296: 
                    297: #if defined(__solaris__)
                    298:        #define CTIME_R(x,y)    ctime_r(x,y)
                    299:        /* #define CTIME_R(x,y) ctime_r(x,y,sizeof y) */
                    300: #else
                    301:        #define CTIME_R(x,y)    ctime_r(x,y)
                    302: #endif
                    303: 
                    304: /* Mimic the Borland randomize() and random() CRTL functions */
                    305: DLLEXPORT unsigned     DLLCALL xp_randomize(void);
                    306: DLLEXPORT int          DLLCALL xp_random(int);
                    307: 
                    308: DLLEXPORT long double          DLLCALL xp_timer(void);
                    309: DLLEXPORT char*                DLLCALL os_version(char *str);
                    310: DLLEXPORT char*                DLLCALL os_cmdshell(void);
                    311: DLLEXPORT char*                DLLCALL lastchar(const char* str);
                    312: DLLEXPORT int          DLLCALL safe_snprintf(char *dst, size_t size, const char *fmt, ...);
                    313: 
                    314: /* C string/char escape-sequence processing */
                    315: DLLEXPORT char*                DLLCALL c_escape_str(const char* src, char* dst, size_t maxlen, BOOL ctrl_only);
                    316: DLLEXPORT char*                DLLCALL c_escape_char(char ch);
                    317: DLLEXPORT char*                DLLCALL c_unescape_str(char* str);
                    318: DLLEXPORT char         DLLCALL c_unescape_char_ptr(const char* str, char** endptr);
                    319: DLLEXPORT char         DLLCALL c_unescape_char(char ch);
                    320: 
                    321: /* Microsoft (e.g. DOS/Win32) real-time system clock API (ticks since process started) */
                    322: typedef                clock_t                         msclock_t;
                    323: #if defined(_WIN32) || defined(__OS2__)
                    324:        #define         MSCLOCKS_PER_SEC        CLOCKS_PER_SEC  /* e.g. 18.2 on DOS, 1000.0 on Win32 */
                    325:        #define         msclock()                       clock()
                    326: #else
                    327:        #define         MSCLOCKS_PER_SEC        1000
                    328:        msclock_t       msclock(void);
                    329: #endif
                    330: 
                    331: #if defined(__cplusplus)
                    332: }
                    333: #endif
                    334: 
                    335: #endif /* Don't add anything after this line */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.