Annotation of sbbs/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.69 2004/11/17 11:11:29 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 2004 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:        #ifdef _THREAD_SAFE
        !            52:                #include <pthread.h>/* Check for GNU PTH libs */
        !            53:                #ifdef _PTH_PTHREAD_H_
        !            54:                        #include <pth.h>
        !            55:                #endif
        !            56:        #endif
        !            57: #elif defined(_WIN32)
        !            58:        #include <process.h>    /* getpid() */
        !            59: #endif
        !            60: 
        !            61: /* utime() support */
        !            62: #if defined(_MSC_VER) || defined(__WATCOMC__)
        !            63:        #include <sys/utime.h>
        !            64: #else
        !            65:        #include <utime.h>
        !            66: #endif
        !            67: 
        !            68: #if defined(__cplusplus)
        !            69: extern "C" {
        !            70: #endif
        !            71: 
        !            72: /*********************/
        !            73: /* Compiler-specific */
        !            74: /*********************/
        !            75: 
        !            76: /* Compiler Description */
        !            77: #if defined(__BORLANDC__)
        !            78: 
        !            79:        #define DESCRIBE_COMPILER(str) SAFEPRINTF2(str,"BCC %X.%02X" \
        !            80:                ,__BORLANDC__>>8,__BORLANDC__&0xff);    
        !            81: 
        !            82: #elif defined(_MSC_VER)
        !            83: 
        !            84:        #define DESCRIBE_COMPILER(str) SAFEPRINTF(str,"MSC %u", _MSC_VER);
        !            85: 
        !            86: #elif defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__)
        !            87: 
        !            88:        #define DESCRIBE_COMPILER(str) SAFEPRINTF3(str,"GCC %u.%u.%u" \
        !            89:                ,__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__);
        !            90: 
        !            91: #elif defined(__GNUC__) && defined(__GNUC_MINOR__)
        !            92: 
        !            93:        #define DESCRIBE_COMPILER(str) SAFEPRINTF2(str,"GCC %u.%u" \
        !            94:                ,__GNUC__,__GNUC_MINOR__);
        !            95: 
        !            96: #elif defined(__WATCOMC__)
        !            97: 
        !            98:        #define DESCRIBE_COMPILER(str) SAFEPRINTF(str,"WATC %d" \
        !            99:                ,__WATCOMC__);
        !           100: 
        !           101: #elif defined(__DMC__) /* Digital Mars C/C++ */
        !           102: 
        !           103:        #define DESCRIBE_COMPILER(str) SAFEPRINTF(str,"DMC %X.%02X" \
        !           104:                ,__DMC__>>8,__DMC__&0xff);      
        !           105: 
        !           106: #else /* Unknown compiler */
        !           107: 
        !           108:        #define DESCRIBE_COMPILER(str) SAFECOPY(str,"UNKNOWN COMPILER");
        !           109: 
        !           110: #endif
        !           111: 
        !           112: /**********/
        !           113: /* Macros */
        !           114: /**********/
        !           115: 
        !           116: /* Target Platform Description */
        !           117: #if defined(_WIN64)
        !           118:        #define PLATFORM_DESC   "Win64"
        !           119: #elif defined(_WIN32)
        !           120:        #define PLATFORM_DESC   "Win32"
        !           121: #elif defined(__OS2__)
        !           122:        #define PLATFORM_DESC   "OS/2"
        !           123: #elif defined(__MSDOS__)
        !           124:        #define PLATFORM_DESC   "DOS"
        !           125: #elif defined(__linux__)
        !           126:        #define PLATFORM_DESC   "Linux"
        !           127: #elif defined(__FreeBSD__)
        !           128:        #define PLATFORM_DESC   "FreeBSD"
        !           129: #elif defined(__OpenBSD__)
        !           130:        #define PLATFORM_DESC   "OpenBSD"
        !           131: #elif defined(__NetBSD__)
        !           132:        #define PLATFORM_DESC   "NetBSD"
        !           133: #elif defined(__APPLE__) && defined(__MACH__) && defined(__POWERPC__)
        !           134:        #define PLATFORM_DESC   "MacOSX"
        !           135: #elif defined(BSD)
        !           136:        #define PLATFORM_DESC   "BSD"
        !           137: #elif defined(__solaris__)
        !           138:        #define PLATFORM_DESC   "Solaris"
        !           139: #elif defined(__sun__)
        !           140:        #define PLATFORM_DESC   "SunOS"
        !           141: #elif defined(__gnu__)
        !           142:        #define PLATFORM_DESC   "GNU/Hurd"
        !           143: #elif defined(__QNX__)
        !           144:        #define PLATFORM_DESC   "QNX"
        !           145: #elif defined(__unix__)
        !           146:        #define PLATFORM_DESC   "Unix"
        !           147: #else
        !           148:        #error "Need to describe target platform"
        !           149: #endif
        !           150: 
        !           151: /*********************/
        !           152: /* String Functionss */
        !           153: /*********************/
        !           154: 
        !           155: #define snprintf       safe_snprintf
        !           156: 
        !           157: #if defined(_MSC_VER) || defined(__MINGW32__) || defined(__DMC__)
        !           158:        #define vsnprintf               _vsnprintf
        !           159: #endif
        !           160: 
        !           161: #if defined(__WATCOMC__)
        !           162:        #define vsnprintf(s,l,f,a)      vsprintf(s,f,a)
        !           163: #endif
        !           164: 
        !           165: #if !defined(_MSC_VER) && !defined(__BORLANDC__) && !defined(__WATCOMC__)
        !           166:        DLLEXPORT char* DLLCALL ultoa(ulong, char*, int radix);
        !           167: #endif
        !           168: 
        !           169: #if defined(__unix__)
        !           170:        DLLEXPORT char* DLLCALL strupr(char* str);
        !           171:        DLLEXPORT char* DLLCALL strlwr(char* str);
        !           172:        DLLEXPORT char* DLLCALL strrev(char* str);
        !           173:        #if !defined(stricmp)
        !           174:                #define stricmp(x,y)            strcasecmp(x,y)
        !           175:                #define strnicmp(x,y,z)         strncasecmp(x,y,z)
        !           176:        #endif
        !           177: #endif
        !           178: 
        !           179: /* Truncate white-space chars off end of string */
        !           180: DLLEXPORT char*                DLLCALL truncsp(char* str);
        !           181: /* Truncate white-space chars off end of every \n-terminated line in string */
        !           182: DLLEXPORT char*                DLLCALL truncsp_lines(char* str);
        !           183: /* Truncate new-line chars off end of string */
        !           184: DLLEXPORT char*                DLLCALL truncnl(char* str);
        !           185: 
        !           186: #if defined(__unix__)
        !           187:        #define STRERROR(x)             strerror(x)
        !           188: #else
        !           189:        #define STRERROR(x)             truncsp(strerror(x))
        !           190: #endif
        !           191: 
        !           192: /*********************/
        !           193: /* Utility Functions */
        !           194: /*********************/
        !           195: /* Thunking for multi-threaded specific implementations of "errno" */
        !           196: DLLEXPORT int DLLCALL  get_errno(void);
        !           197: 
        !           198: /**********************************/
        !           199: /* Common Utility Macro Functions */
        !           200: /**********************************/
        !           201: 
        !           202: #if defined(_WIN32)
        !           203: 
        !           204:        #define YIELD()                 Sleep(1) /* Must sleep at least 1ms to avoid 100% CPU utilization */
        !           205:        #define MAYBE_YIELD()   Sleep(0)
        !           206:        #define SLEEP(x)                Sleep(x)
        !           207:        #define BEEP(freq,dur)  Beep((DWORD)(freq),(DWORD)(dur))
        !           208:        #define popen                   _popen
        !           209:        #define pclose                  _pclose
        !           210:        #define tzname                  _tzname
        !           211: 
        !           212: #elif defined(__OS2__)
        !           213: 
        !           214:        #define YIELD()                 DosSleep(1)     /* Must sleep at least 1ms to avoid 100% CPU utilization */
        !           215:        #define MAYBE_YIELD()   DosSleep(0)
        !           216:        #define SLEEP(x)                DosSleep(x)
        !           217:        #define BEEP(freq,dur)  DosBeep(freq,dur)
        !           218: 
        !           219: #elif defined(__unix__) || defined(__APPLE__)
        !           220: 
        !           221:        #if defined(_PTH_PTHREAD_H_)
        !           222:                #define SLEEP(x)                ({ int y=x; struct timeval tv; \
        !           223:                                                                tv.tv_sec=(y/1000); tv.tv_usec=((y%1000)*1000); \
        !           224:                                                                pth_nap(tv); })
        !           225:        #else
        !           226:                #define SLEEP(x)                ({      int y=x; struct timeval tv; \
        !           227:                                                                tv.tv_sec=(y/1000); tv.tv_usec=((y%1000)*1000); \
        !           228:                                                                select(0,NULL,NULL,NULL,&tv); })
        !           229:        #endif
        !           230: 
        !           231:        #define YIELD()                 SLEEP(1)
        !           232: 
        !           233:        #if defined(_THREAD_SAFE)
        !           234:                #if defined(__FreeBSD__)
        !           235:                        #define MAYBE_YIELD()                   pthread_yield()
        !           236:                #elif defined(_PTH_PTHREAD_H_)
        !           237:                        #define MAYBE_YIELD()                   pth_yield(NULL)
        !           238:                #elif defined(_POSIX_PRIORITY_SCHEDULING)
        !           239:                        #define MAYBE_YIELD()                   sched_yield()
        !           240:                #else
        !           241:                        #define MAYBE_YIELD()                   YIELD()
        !           242:                #endif
        !           243:        #else
        !           244:                #if defined(_POSIX_PRIORITY_SCHEDULING)
        !           245:                        #define MAYBE_YIELD()                   sched_yield()
        !           246:                #else
        !           247:                        #define MAYBE_YIELD()                   YIELD()
        !           248:                #endif
        !           249:        #endif
        !           250: 
        !           251:        /*
        !           252:         * QNX doesn't support fork() in threaded apps (yet) using vfork() instead
        !           253:         * works, but relies on undefined behaviours not being nasty.  On most OSs
        !           254:         * vfork() will share the stack between the parent and child...
        !           255:         */
        !           256:        #if defined(__QNX__)
        !           257:                #define FORK()  vfork()
        !           258:        #else
        !           259:                #define FORK()  fork()
        !           260:        #endif
        !           261: 
        !           262:        #define BEEP(freq,dur)  unix_beep(freq,dur)
        !           263:        DLLEXPORT void  DLLCALL unix_beep(int freq, int dur);
        !           264: 
        !           265: #else  /* Unsupported OS */
        !           266: 
        !           267:        #error "Unsupported Target: Need some macros and/or function prototypes here."
        !           268: 
        !           269: #endif
        !           270: 
        !           271: /* Win32 implementations of recursive (thread-safe) std C time functions on Unix */
        !           272: 
        !           273: #if !defined(__unix__) 
        !           274: 
        !           275:        #include <time.h>               /* time_t, etc. */
        !           276: 
        !           277:        DLLEXPORT struct tm*    DLLCALL         gmtime_r(const time_t* t, struct tm* tm);
        !           278:        DLLEXPORT struct tm*    DLLCALL         localtime_r(const time_t* t, struct tm* tm);
        !           279:        DLLEXPORT char*         DLLCALL         ctime_r(const time_t *t, char *buf);
        !           280:        DLLEXPORT char*         DLLCALL         asctime_r(const struct tm *tm, char *buf);
        !           281: #endif
        !           282: 
        !           283: #if defined(__solaris__)
        !           284:        #define CTIME_R(x,y)    ctime_r(x,y)
        !           285:        /* #define CTIME_R(x,y) ctime_r(x,y,sizeof y) */
        !           286: #else
        !           287:        #define CTIME_R(x,y)    ctime_r(x,y)
        !           288: #endif
        !           289: 
        !           290: DLLEXPORT int          DLLCALL xp_random(int);
        !           291: DLLEXPORT char*                DLLCALL os_version(char *str);
        !           292: DLLEXPORT char*                DLLCALL lastchar(const char* str);
        !           293: DLLEXPORT int          DLLCALL safe_snprintf(char *dst, size_t size, const char *fmt, ...);
        !           294: 
        !           295: /* C string/char escape-sequence processing */
        !           296: DLLEXPORT char*                DLLCALL unescape_cstr(char* str);
        !           297: DLLEXPORT char         DLLCALL unescape_char_ptr(const char* str, char** endptr);
        !           298: DLLEXPORT char         DLLCALL unescape_char(char ch);
        !           299: 
        !           300: #if !defined(__unix__)
        !           301:        #define         msclock()                       clock()
        !           302:        #define         MSCLOCKS_PER_SEC        CLOCKS_PER_SEC
        !           303: #else
        !           304:        #define         MSCLOCKS_PER_SEC        1000
        !           305:        clock_t         msclock(void);
        !           306: #endif
        !           307: 
        !           308: #if defined(__cplusplus)
        !           309: }
        !           310: #endif
        !           311: 
        !           312: #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.