Annotation of sbbs/sbbs3/sbbswrap.h, revision 1.1.1.1

1.1       root        1: /* sbbswrap.h */
                      2: 
                      3: /* Synchronet system-call wrappers */
                      4: 
                      5: /* $Id: sbbswrap.h,v 1.27 2000/12/05 03:25:45 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 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU 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 General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.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 _SBBSWRAP_H
                     39: #define _SBBSWRAP_H
                     40: 
                     41: #include "gen_defs.h"  /* ulong */
                     42: 
                     43: #ifdef DLLEXPORT
                     44: #undef DLLEXPORT
                     45: #endif
                     46: #ifdef DLLCALL
                     47: #undef DLLCALL
                     48: #endif
                     49: 
                     50: #ifdef _WIN32
                     51:        #ifdef WRAPPER_DLL
                     52:                #define DLLEXPORT       __declspec(dllexport)
                     53:        #else
                     54:                #define DLLEXPORT       __declspec(dllimport)
                     55:        #endif
                     56:        #ifdef __BORLANDC__
                     57:                #define DLLCALL __stdcall
                     58:        #else
                     59:                #define DLLCALL
                     60:        #endif
                     61: #else  /* !_WIN32 */
                     62:        #define DLLEXPORT
                     63:        #define DLLCALL
                     64: #endif
                     65: 
                     66: #ifdef __cplusplus
                     67: extern "C" {
                     68: #endif
                     69: 
                     70: 
                     71: #ifdef _MSC_VER
                     72:        #include "msdirent.h"
                     73: #else
                     74:        #include <dirent.h>     /* POSIX directory functions */
                     75: #endif
                     76: 
                     77: /***************/
                     78: /* OS-specific */
                     79: /***************/
                     80: 
                     81: #ifdef __unix__
                     82: 
                     83:        #include <glob.h>               /* POSIX.2 directory pattern matching function */
                     84:        #define ALLFILES "*"    /* matches all files in a directory */
                     85: 
                     86: #else  /* glob-compatible findfirst/findnext wrapper */
                     87: 
                     88:        typedef struct 
                     89:        {
                     90:                        size_t gl_pathc;                        /* Count of paths matched so far */
                     91:                        char **gl_pathv;                        /* List of matched pathnames. */
                     92:                        size_t gl_offs;                         /* Slots to reserve in 'gl_pathv'. */
                     93:        } glob_t;
                     94: 
                     95:        /* Bits set in the FLAGS argument to `glob'.  */
                     96:        #define GLOB_ERR        (1 << 0)        /* Return on read errors.  */
                     97:        #define GLOB_MARK       (1 << 1)        /* Append a slash to each name.  */
                     98:        #define GLOB_NOSORT     (1 << 2)        /* Don't sort the names.  */
                     99:        #define GLOB_DOOFFS     (1 << 3)        /* Insert PGLOB->gl_offs NULLs.  */
                    100:        #define GLOB_NOCHECK    (1 << 4)        /* If nothing matches, return the pattern.  */
                    101:        #define GLOB_APPEND     (1 << 5)        /* Append to results of a previous call.  */
                    102:        #define GLOB_NOESCAPE   (1 << 6)        /* Backslashes don't quote metacharacters.  */
                    103:        #define GLOB_PERIOD     (1 << 7)        /* Leading `.' can be matched by metachars.  */
                    104:        #define GLOB_MAGCHAR    (1 << 8)        /* Set in gl_flags if any metachars seen.  */
                    105:        #define GLOB_ALTDIRFUNC (1 << 9)        /* Use gl_opendir et al functions.  */
                    106:        #define GLOB_BRACE      (1 << 10)       /* Expand "{a,b}" to "a" "b".  */
                    107:        #define GLOB_NOMAGIC    (1 << 11)       /* If no magic chars, return the pattern.  */
                    108:        #define GLOB_TILDE      (1 << 12)       /* Expand ~user and ~ to home directories. */
                    109:        #define GLOB_ONLYDIR    (1 << 13)       /* Match only directories.  */
                    110:        #define GLOB_TILDE_CHECK (1 << 14)      /* Like GLOB_TILDE but return an error
                    111:                                                                                  if the user name is not available.  */
                    112:        /* Error returns from `glob'.  */
                    113:        #define GLOB_NOSPACE    1       /* Ran out of memory.  */
                    114:        #define GLOB_ABORTED    2       /* Read error.  */
                    115:        #define GLOB_NOMATCH    3       /* No matches found.  */
                    116:        #define GLOB_NOSYS      4       /* Not implemented.  */
                    117: 
                    118:        DLLEXPORT int   DLLCALL glob(const char *pattern, int flags, void* unused, glob_t*);
                    119:        DLLEXPORT void  DLLCALL globfree(glob_t*);
                    120: 
                    121:        #define ALLFILES "*.*"  /* matches all files in a directory */
                    122: 
                    123: #endif
                    124: 
                    125: #ifdef __unix__
                    126: 
                    127:        #include <pthread.h>    /* POSIX threads and mutexes */
                    128:        #include <semaphore.h>  /* POSIX semaphores */
                    129:        ulong _beginthread(void( *start_address )( void * )
                    130:                ,unsigned stack_size, void *arglist);
                    131: 
                    132: #elif defined(_WIN32)  
                    133: 
                    134:        /* POIX semaphores */
                    135:        typedef HANDLE sem_t;
                    136:        #define sem_init(psem,ps,v)                     ResetEvent(*(psem))
                    137:        #define sem_wait(psem)                          WaitForSingleObject(*(psem),INFINITE)
                    138:        #define sem_post(psem)                          SetEvent(*(psem))
                    139:        #define sem_destroy(psem)                       CloseHandle(*(psem))
                    140:        int             sem_getvalue(sem_t*, int* val);
                    141: 
                    142:        /* POIX mutexes */
                    143:        typedef HANDLE pthread_mutex_t;
                    144:        #define PTHREAD_MUTEX_INITIALIZER       CreateMutex(NULL,FALSE,NULL)
                    145:        #define pthread_mutex_init(pmtx,v)      *(pmtx)=CreateMutex(NULL,FALSE,NULL)
                    146:        #define pthread_mutex_lock(pmtx)        WaitForSingleObject(*(pmtx),INFINITE)
                    147:        #define pthread_mutex_unlock(pmtx)      ReleaseMutex(*(pmtx))
                    148:        #define pthread_mutex_destroy(pmtx)     CloseHandle(*(pmtx))
                    149: 
                    150: #else
                    151: 
                    152:        #warning "Need semaphore wrappers."
                    153: 
                    154: #endif
                    155: 
                    156: 
                    157: #if defined(_WIN32)
                    158: 
                    159:        #define mswait(x)                       Sleep(x)
                    160:        #define sbbs_beep(freq,dur)     Beep(freq,dur)
                    161: 
                    162: #elif defined(__OS2__)
                    163: 
                    164:        #define mswait(x)                       DosSleep(x)
                    165:        #define sbbs_beep(freq,dur)     DosBeep(freq,dur)
                    166: 
                    167: #elif defined(__unix__)
                    168: 
                    169:        #define mswait(x)                       usleep(x*1000)
                    170:        #define _mkdir(dir)                     mkdir(dir,0777)
                    171:        #define _rmdir(dir)                     rmdir(dir)
                    172:        #define _fullpath(a,r,l)        realpath(r,a)
                    173:        #define tell(fd)                        lseek(fd,0,SEEK_CUR)
                    174: 
                    175:        DLLEXPORT void  DLLCALL sbbs_beep(int freq, int dur);
                    176:        DLLEXPORT char* DLLCALL strrev(char* str);
                    177: 
                    178: #else  /* Unsupported OS */
                    179: 
                    180:        #warning "Unsupported Target: Need some macros of function prototypes here."
                    181: 
                    182: #endif
                    183: 
                    184: /*********************/
                    185: /* Compiler-specific */
                    186: /*********************/
                    187: 
                    188: /* Compiler Description */
                    189: #if defined(__BORLANDC__)
                    190: 
                    191:        #define COMPILER_DESC(str) sprintf(str,"BCC %X.%02X" \
                    192:                ,__BORLANDC__>>8,__BORLANDC__&0xff);    
                    193: 
                    194: #elif defined(_MSC_VER)
                    195: 
                    196:        #define COMPILER_DESC(str) sprintf(str,"MSC %u", _MSC_VER);
                    197: 
                    198: #elif defined(__GNUC__) && defined(__GLIBC__)
                    199: 
                    200:        #define COMPILER_DESC(str) sprintf(str,"GCC %u.%02u (GLIBC %u.%u)" \
                    201:                ,__GNUC__,__GNUC_MINOR__,__GLIBC__,__GLIBC_MINOR__);
                    202: 
                    203: #elif defined(__GNUC__)
                    204: 
                    205:        #define COMPILER_DESC(str) sprintf(str,"GCC %u.%02u" \
                    206:                ,__GNUC__,__GNUC_MINOR__);
                    207: 
                    208: #else /* Unknown compiler */
                    209: 
                    210:        #define COMPILER_DESC(str) strcpy(str,"UNKNOWN COMPILER");
                    211: 
                    212: #endif
                    213: 
                    214: /**********/
                    215: /* Macros */
                    216: /**********/
                    217: 
                    218: /* POSIX readdir convenience macro */
                    219: #ifndef DIRENT
                    220: #define DIRENT struct dirent   
                    221: #endif
                    222: 
                    223: #if defined(__unix__)
                    224: #define BACKSLASH      '/'
                    225: #else /* MS-DOS based OS */
                    226: #define BACKSLASH      '\\'
                    227: #endif
                    228: 
                    229: /* Target Platform Description */
                    230: #if defined(_WIN32)
                    231:        #define PLATFORM_DESC   "Win32"
                    232: #elif defined(__OS2__)
                    233:        #define PLATFORM_DESC   "OS/2"
                    234: #elif defined(__MSDOS__)
                    235:        #define PLATFORM_DESC   "DOS"
                    236: #elif defined(__linux__)
                    237:        #define PLATFORM_DESC   "Linux"
                    238: #elif defined(__unix__)
                    239:        #define PLATFORM_DESC   "Unix"
                    240: #else
                    241:        #warning "Need to describe target platform"
                    242:        #define PLATFORM_DESC   "UNKNOWN"
                    243: #endif
                    244: 
                    245: #if defined(_MSC_VER) || defined(__MINGW32__)
                    246: 
                    247: #define CHMOD(s,m)             _chmod(s,m)
                    248: #define PUTENV                 _putenv
                    249: #define GETCWD                 _getcwd
                    250: #define snprintf               _snprintf
                    251: 
                    252: #elif defined(__BORLANDC__)
                    253: 
                    254: #define CHMOD(s,m)             _chmod(s,1,m)
                    255: #define PUTENV                 putenv
                    256: #define GETCWD                 getcwd
                    257: 
                    258: #else  /* ??? */
                    259: 
                    260: #define CHMOD(s,m)             chmod(s,m)
                    261: #define PUTENV                 putenv
                    262: #define GETCWD                 getcwd
                    263: 
                    264: #endif
                    265: 
                    266: #if defined(__BORLANDC__)
                    267:        #define sbbs_random(x)          random(x)
                    268: #else 
                    269:        DLLEXPORT int   DLLCALL sbbs_random(int n);
                    270: #endif
                    271: 
                    272: #if __BORLANDC__ > 0x0410
                    273:        #define _chmod(p,f,a)           _rtl_chmod(p,f,a)       /* _chmod obsolete in 4.x */
                    274: #endif
                    275: 
                    276: #if !defined(_MSC_VER) && !defined(__BORLANDC__)
                    277:        DLLEXPORT char* DLLCALL ultoa(ulong, char*, int radix);
                    278: #endif
                    279: 
                    280: 
                    281: /* General file system wrappers for all platforms and compilers */
                    282: DLLEXPORT long DLLCALL fdate(char *filename);
                    283: DLLEXPORT BOOL DLLCALL isdir(char *filename);
                    284: DLLEXPORT int  DLLCALL getfattr(char* filename);
                    285: DLLEXPORT ulong        DLLCALL getfreediskspace(char* path);
                    286: 
                    287: #ifdef __cplusplus
                    288: }
                    289: #endif
                    290: 
                    291: #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.