Annotation of sbbs/src/xpdev/datewrap.c, revision 1.1.1.1

1.1       root        1: /* datewrap.c */
                      2: 
                      3: /* Wrappers for Borland getdate() and gettime() functions */
                      4: 
                      5: /* $Id: datewrap.c,v 1.26 2006/05/31 07:35:32 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 2005 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: #include "string.h"    /* memset */
                     39: #include "genwrap.h"
                     40: #include "datewrap.h"  /* xpDateTime_t */
                     41: 
                     42: /* Compensates for struct tm "weirdness" */
                     43: time_t sane_mktime(struct tm* tm)
                     44: {
                     45:        if(tm->tm_year>=1900)
                     46:                tm->tm_year-=1900;
                     47:        if(tm->tm_mon)          /* Month is zero-based */
                     48:                tm->tm_mon--;
                     49:        tm->tm_isdst=-1;        /* Auto-adjust for DST */
                     50: 
                     51:        return mktime(tm);
                     52: }
                     53: 
                     54: /**************************************/
                     55: /* Cross-platform date/time functions */
                     56: /**************************************/
                     57: 
                     58: xpDateTime_t xpDateTime_create(unsigned year, unsigned month, unsigned day
                     59:                                                          ,unsigned hour, unsigned minute, float second
                     60:                                                          ,xpTimeZone_t zone)
                     61: {
                     62:        xpDateTime_t    xpDateTime;
                     63: 
                     64:        xpDateTime.date.year    = year;
                     65:        xpDateTime.date.month   = month;
                     66:        xpDateTime.date.day             = day;
                     67:        xpDateTime.time.hour    = hour;
                     68:        xpDateTime.time.minute  = minute;
                     69:        xpDateTime.time.second  = second;
                     70:        xpDateTime.zone                 = zone;
                     71: 
                     72:        return xpDateTime;
                     73: }
                     74: 
                     75: xpDateTime_t xpDateTime_now(void)
                     76: {
                     77: #if defined(_WIN32)
                     78:        SYSTEMTIME systime;
                     79: 
                     80:        GetLocalTime(&systime);
                     81:        return(xpDateTime_create(systime.wYear,systime.wMonth,systime.wDay
                     82:                ,systime.wHour,systime.wMinute,(float)systime.wSecond+(systime.wMilliseconds*0.001F)
                     83:                ,xpTimeZone_local()));
                     84: #else  /* !Win32 (e.g. Unix) */
                     85:        struct tm tm;
                     86:        struct timeval tv;
                     87:        time_t  t;
                     88: 
                     89:        gettimeofday(&tv, NULL);
                     90:        t=tv.tv_sec;
                     91:        localtime_r(&t,&tm);
                     92: 
                     93:        return xpDateTime_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday
                     94:                ,tm.tm_hour,tm.tm_min,(float)tm.tm_sec+(tv.tv_usec*0.00001)
                     95:                ,xpTimeZone_local());
                     96: #endif
                     97: }
                     98: 
                     99: xpTimeZone_t xpTimeZone_local(void)
                    100: {
                    101: #if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DARWIN__)
                    102:        struct tm tm;
                    103:        time_t t;
                    104: 
                    105:        localtime_r(&t, &tm);
                    106:        return(tm.tm_gmtoff/60);
                    107: #else
                    108: #if defined(__BORLANDC__) || defined(__CYGWIN__)
                    109:        #define timezone _timezone
                    110: #endif
                    111: 
                    112:        /* Converts (_)timezone from seconds west of UTC to minutes east of UTC */
                    113:        return -timezone/60;
                    114: #endif
                    115: }
                    116: 
                    117: time_t xpDateTime_to_time(xpDateTime_t xpDateTime)
                    118: {
                    119:        struct tm tm;
                    120: 
                    121:        ZERO_VAR(tm);
                    122: 
                    123:        if(xpDateTime.date.year==0)
                    124:                return(0);
                    125: 
                    126:        tm.tm_year      = xpDateTime.date.year;
                    127:        tm.tm_mon       = xpDateTime.date.month;
                    128:        tm.tm_mday      = xpDateTime.date.day;
                    129: 
                    130:        tm.tm_hour      = xpDateTime.time.hour;
                    131:        tm.tm_min       = xpDateTime.time.minute;
                    132:        tm.tm_sec       = (int)xpDateTime.time.second;
                    133: 
                    134:        return sane_mktime(&tm);
                    135: 
                    136: }
                    137: 
                    138: xpDateTime_t time_to_xpDateTime(time_t ti)
                    139: {
                    140:        xpDateTime_t    never;
                    141:        struct tm tm;
                    142: 
                    143:        memset(&never,0,sizeof(never));
                    144:        if(ti==0)
                    145:                return(never);
                    146: 
                    147:        ZERO_VAR(tm);
                    148:        if(gmtime_r(&ti,&tm)==NULL)
                    149:                return(never);
                    150: 
                    151:        return xpDateTime_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday
                    152:                ,tm.tm_hour,tm.tm_min,(float)tm.tm_sec,xpTimeZone_local());
                    153: }
                    154: 
                    155: /**********************************************/
                    156: /* Decimal-coded ISO-8601 date/time functions */
                    157: /**********************************************/
                    158: 
                    159: isoDate_t xpDateTime_to_isoDateTime(xpDateTime_t xpDateTime, isoTime_t* isoTime)
                    160: {
                    161:        if(isoTime!=NULL)
                    162:                *isoTime=0;
                    163: 
                    164:        if(xpDateTime.date.year==0)
                    165:                return(0);
                    166: 
                    167:        if(isoTime!=NULL)
                    168:                *isoTime=isoTime_create(xpDateTime.time.hour,xpDateTime.time.minute,xpDateTime.time.second);
                    169: 
                    170:        return isoDate_create(xpDateTime.date.year,xpDateTime.date.month,xpDateTime.date.day);
                    171: }
                    172: 
                    173: xpDateTime_t isoDateTime_to_xpDateTime(isoDate_t date, isoTime_t ti)
                    174: {
                    175:        return xpDateTime_create(isoDate_year(date),isoDate_month(date),isoDate_day(date)
                    176:                ,isoTime_hour(ti),isoTime_minute(ti),(float)isoTime_second(ti),xpTimeZone_local());
                    177: }
                    178: 
                    179: isoDate_t time_to_isoDateTime(time_t ti, isoTime_t* isoTime)
                    180: {
                    181:        struct tm tm;
                    182: 
                    183:        if(isoTime!=NULL)
                    184:                *isoTime=0;
                    185: 
                    186:        if(ti==0)
                    187:                return(0);
                    188: 
                    189:        ZERO_VAR(tm);
                    190:        if(gmtime_r(&ti,&tm)==NULL)
                    191:                return(0);
                    192: 
                    193:        if(isoTime!=NULL)
                    194:                *isoTime=isoTime_create(tm.tm_hour,tm.tm_min,tm.tm_sec);
                    195: 
                    196:        return isoDate_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday);
                    197: }
                    198: 
                    199: isoTime_t time_to_isoTime(time_t ti)
                    200: {
                    201:        isoTime_t isoTime;
                    202:        
                    203:        time_to_isoDateTime(ti,&isoTime);
                    204: 
                    205:        return isoTime;
                    206: }
                    207: 
                    208: time_t isoDateTime_to_time(isoDate_t date, isoTime_t ti)
                    209: {
                    210:        struct tm tm;
                    211: 
                    212:        ZERO_VAR(tm);
                    213: 
                    214:        if(date==0)
                    215:                return(0);
                    216: 
                    217:        tm.tm_year      = isoDate_year(date);
                    218:        tm.tm_mon       = isoDate_month(date);
                    219:        tm.tm_mday      = isoDate_day(date);
                    220: 
                    221:        tm.tm_hour      = isoTime_hour(ti);
                    222:        tm.tm_min       = isoTime_minute(ti);
                    223:        tm.tm_sec       = isoTime_second(ti);
                    224: 
                    225:        return sane_mktime(&tm);
                    226: }
                    227: 
                    228: BOOL isoTimeZone_parse(const char* str, xpTimeZone_t* zone)
                    229: {
                    230:        unsigned hour=0,minute=0;
                    231: 
                    232:        switch(*str) {
                    233:                case 0:         /* local time-zone */
                    234:                        *zone = xpTimeZone_local();     
                    235:                        return TRUE;    
                    236:                case 'Z':       /* UTC */
                    237:                        *zone = 0;              
                    238:                        return TRUE;
                    239:                case '+':
                    240:                case '-':       /* "+/- HH[:]MM" */
                    241:                        if(sscanf(str+1,"%2u%*s%2u",&hour,&minute)>=1) {
                    242:                                *zone = (hour*60) + minute;
                    243:                                if(*str=='-')
                    244:                                        *zone = -(*zone);
                    245:                                return TRUE;
                    246:                        }
                    247:                        break;
                    248:        }
                    249:        return FALSE;
                    250: }
                    251: 
                    252: xpDateTime_t isoDateTime_parse(const char* str)
                    253: {
                    254:        char zone[16];
                    255:        xpDateTime_t    xpDateTime;
                    256: 
                    257:        zone[0]=0;
                    258:        ZERO_VAR(xpDateTime);
                    259: 
                    260:        if((sscanf(str,"%4u-%2u-%2uT%2u:%2u:%f%6s"              /* CCYY-MM-DDThh:MM:ss�hhmm */
                    261:                ,&xpDateTime.date.year
                    262:                ,&xpDateTime.date.month
                    263:                ,&xpDateTime.date.day
                    264:                ,&xpDateTime.time.hour
                    265:                ,&xpDateTime.time.minute
                    266:                ,&xpDateTime.time.second
                    267:                ,zone)>=2
                    268:        ||      sscanf(str,"%4u%2u%2uT%2u%2u%f%6s"                      /* CCYYMMDDThhmmss�hhmm */
                    269:                ,&xpDateTime.date.year
                    270:                ,&xpDateTime.date.month
                    271:                ,&xpDateTime.date.day
                    272:                ,&xpDateTime.time.hour
                    273:                ,&xpDateTime.time.minute
                    274:                ,&xpDateTime.time.second
                    275:                ,zone)>=4
                    276:        ||      sscanf(str,"%4u%2u%2u%2u%2u%f%6s"                       /* CCYYMMDDhhmmss�hhmm */
                    277:                ,&xpDateTime.date.year
                    278:                ,&xpDateTime.date.month
                    279:                ,&xpDateTime.date.day
                    280:                ,&xpDateTime.time.hour
                    281:                ,&xpDateTime.time.minute
                    282:                ,&xpDateTime.time.second
                    283:                ,zone)>=1
                    284:                ) && isoTimeZone_parse(zone,&xpDateTime.zone))
                    285:                return xpDateTime;
                    286: 
                    287:        return xpDateTime;
                    288: }
                    289: 
                    290: /***********************************/
                    291: /* Borland DOS date/time functions */
                    292: /***********************************/
                    293: 
                    294: #if !defined(__BORLANDC__)
                    295: 
                    296: #if defined(_WIN32)
                    297:        #include <windows.h>    /* SYSTEMTIME and GetLocalTime() */
                    298: #else
                    299:        #include <sys/time.h>   /* stuct timeval, gettimeofday() */
                    300: #endif
                    301: 
                    302: #include "datewrap.h"  /* struct defs, verify prototypes */
                    303: 
                    304: void xp_getdate(struct date* nyd)
                    305: {
                    306:        time_t tim;
                    307:        struct tm dte;
                    308: 
                    309:        tim=time(NULL);
                    310:        localtime_r(&tim,&dte);
                    311:        nyd->da_year=dte.tm_year+1900;
                    312:        nyd->da_day=dte.tm_mday;
                    313:        nyd->da_mon=dte.tm_mon+1;
                    314: }
                    315: 
                    316: void gettime(struct time* nyt)
                    317: {
                    318: #if defined(_WIN32)
                    319:        SYSTEMTIME systime;
                    320: 
                    321:        GetLocalTime(&systime);
                    322:        nyt->ti_hour=(unsigned char)systime.wHour;
                    323:        nyt->ti_min=(unsigned char)systime.wMinute;
                    324:        nyt->ti_sec=(unsigned char)systime.wSecond;
                    325:        nyt->ti_hund=systime.wMilliseconds/10;
                    326: #else  /* !Win32 (e.g. Unix) */
                    327:        struct tm dte;
                    328:        time_t t;
                    329:        struct timeval tim;
                    330: 
                    331:        gettimeofday(&tim, NULL);
                    332:        t=tim.tv_sec;
                    333:        localtime_r(&t,&dte);
                    334:        nyt->ti_min=dte.tm_min;
                    335:        nyt->ti_hour=dte.tm_hour;
                    336:        nyt->ti_sec=dte.tm_sec;
                    337:        nyt->ti_hund=tim.tv_usec/10000;
                    338: #endif
                    339: }
                    340: 
                    341: #endif /* !Borland */

unix.superglobalmegacorp.com

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