Annotation of sbbs/src/sbbs3/msgdate.c, revision 1.1

1.1     ! root        1: /* msgdate.c */
        !             2: 
        !             3: /* Synchronet RFC822 message date/time string conversion routines */
        !             4: 
        !             5: /* $Id: msgdate.c,v 1.2 2006/04/05 09:11:31 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 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: #include "sbbs.h"
        !            39: 
        !            40: /****************************************************************************/
        !            41: /* Convert when_t structure to RFC822 date header field (string)                       */
        !            42: /****************************************************************************/
        !            43: char* DLLCALL msgdate(when_t when, char* buf)
        !            44: {
        !            45:        struct tm       tm;
        !            46:        char            plus='+';
        !            47:        short           tz;
        !            48:        
        !            49:        tz=smb_tzutc(when.zone);
        !            50:        if(tz<0) {
        !            51:                plus='-';
        !            52:                tz=-tz;
        !            53:        }
        !            54:        
        !            55:        if(localtime_r((const time_t*)&when.time,&tm)==NULL)
        !            56:                memset(&tm,0,sizeof(tm));
        !            57:        sprintf(buf,"%s, %d %s %d %02d:%02d:%02d %c%02u%02u"
        !            58:                ,wday[tm.tm_wday]
        !            59:                ,tm.tm_mday
        !            60:                ,mon[tm.tm_mon]
        !            61:                ,1900+tm.tm_year
        !            62:                ,tm.tm_hour
        !            63:                ,tm.tm_min
        !            64:                ,tm.tm_sec
        !            65:                /* RFC1123: implementations SHOULD use numeric timezones instead of timezone names */
        !            66:                ,plus, tz/60, tz%60     
        !            67:                );
        !            68:        return(buf);
        !            69: }
        !            70: 
        !            71: /****************************************************************************/
        !            72: /* Convert RFC822 date header field to when_t structure                                                */
        !            73: /* dd mon yyyy hh:mm:ss [zone]                                                                                         */
        !            74: /****************************************************************************/
        !            75: when_t DLLCALL rfc822date(char* date)
        !            76: {
        !            77:        char*   p=date;
        !            78:        char    str[32];
        !            79:        char    month[32];
        !            80:        when_t  when;
        !            81:        struct tm tm;
        !            82: 
        !            83:        memset(&tm,0,sizeof(tm));
        !            84:        memset(&when,0,sizeof(when));
        !            85: 
        !            86:        while(*p && *p<=' ') p++;
        !            87:        while(*p && !isdigit(*p)) p++;
        !            88:        /* DAY */
        !            89:        tm.tm_mday=atoi(p);
        !            90:        while(*p && isdigit(*p)) p++;
        !            91:        /* MONTH */
        !            92:        while(*p && *p<=' ') p++;
        !            93:        sprintf(month,"%3.3s",p);
        !            94:        if(!stricmp(month,"jan"))
        !            95:                tm.tm_mon=0;
        !            96:        else if(!stricmp(month,"feb"))
        !            97:                tm.tm_mon=1;
        !            98:        else if(!stricmp(month,"mar"))
        !            99:                tm.tm_mon=2;
        !           100:        else if(!stricmp(month,"apr"))
        !           101:                tm.tm_mon=3;
        !           102:        else if(!stricmp(month,"may"))
        !           103:                tm.tm_mon=4;
        !           104:        else if(!stricmp(month,"jun"))
        !           105:                tm.tm_mon=5;
        !           106:        else if(!stricmp(month,"jul"))
        !           107:                tm.tm_mon=6;
        !           108:        else if(!stricmp(month,"aug"))
        !           109:                tm.tm_mon=7;
        !           110:        else if(!stricmp(month,"sep"))
        !           111:                tm.tm_mon=8;
        !           112:        else if(!stricmp(month,"oct"))
        !           113:                tm.tm_mon=9;
        !           114:        else if(!stricmp(month,"nov"))
        !           115:                tm.tm_mon=10;
        !           116:        else
        !           117:                tm.tm_mon=11;
        !           118:        p+=4;
        !           119:        /* YEAR */
        !           120:        tm.tm_year=atoi(p);
        !           121:        if(tm.tm_year<Y2K_2DIGIT_WINDOW)
        !           122:                tm.tm_year+=100;
        !           123:        else if(tm.tm_year>1900)
        !           124:                tm.tm_year-=1900;
        !           125: 
        !           126:        while(*p && isdigit(*p)) p++;
        !           127:        /* HOUR */
        !           128:        while(*p && *p<=' ') p++;
        !           129:        tm.tm_hour=atoi(p);
        !           130:        while(*p && isdigit(*p)) p++;
        !           131:        /* MINUTE */
        !           132:        if(*p) p++;
        !           133:        tm.tm_min=atoi(p);
        !           134:        while(*p && isdigit(*p)) p++;
        !           135:        /* SECONDS */
        !           136:        if(*p) p++;
        !           137:        tm.tm_sec=atoi(p);
        !           138:        while(*p && isdigit(*p)) p++;
        !           139:        /* TIME ZONE */
        !           140:        while(*p && *p<=' ') p++;
        !           141:        if(*p) {
        !           142:                if(isdigit(*p) || *p=='-' || *p=='+') { /* [+|-]HHMM format */
        !           143:                        if(*p=='+') p++;
        !           144:                        sprintf(str,"%.*s",*p=='-'? 3:2,p);
        !           145:                        when.zone=atoi(str)*60;
        !           146:                        p+=(*p=='-') ? 3:2;
        !           147:                        if(when.zone<0)
        !           148:                                when.zone-=atoi(p);
        !           149:                        else
        !           150:                                when.zone+=atoi(p);
        !           151:                }
        !           152:                else if(!strnicmp(p,"PDT",3))
        !           153:                        when.zone=(short)PDT;
        !           154:                else if(!strnicmp(p,"MDT",3))
        !           155:                        when.zone=(short)MDT;
        !           156:                else if(!strnicmp(p,"CDT",3))
        !           157:                        when.zone=(short)CDT;
        !           158:                else if(!strnicmp(p,"EDT",3))
        !           159:                        when.zone=(short)EDT;
        !           160:                else if(!strnicmp(p,"PST",3))
        !           161:                        when.zone=(short)PST;
        !           162:                else if(!strnicmp(p,"MST",3))
        !           163:                        when.zone=(short)MST;
        !           164:                else if(!strnicmp(p,"CST",3))
        !           165:                        when.zone=(short)CST;
        !           166:                else if(!strnicmp(p,"EST",3))
        !           167:                        when.zone=(short)EST;
        !           168:        }
        !           169: 
        !           170:        tm.tm_isdst=-1; /* Don't adjust for daylight-savings-time */
        !           171:        when.time=mktime(&tm);
        !           172: 
        !           173:        return(when);
        !           174: }

unix.superglobalmegacorp.com

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