Annotation of sbbs/src/xpdev/genwrap.h, revision 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.