Annotation of embedaddon/axTLS/httpd/tdate_parse.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (c) Cameron Rich
        !             3:  * 
        !             4:  * All rights reserved.
        !             5:  * 
        !             6:  * Redistribution and use in source and binary forms, with or without 
        !             7:  * modification, are permitted provided that the following conditions are met:
        !             8:  *
        !             9:  * * Redistributions of source code must retain the above copyright notice, 
        !            10:  *   this list of conditions and the following disclaimer.
        !            11:  * * Redistributions in binary form must reproduce the above copyright notice, 
        !            12:  *   this list of conditions and the following disclaimer in the documentation 
        !            13:  *   and/or other materials provided with the distribution.
        !            14:  * * Neither the name of the axTLS project nor the names of its contributors 
        !            15:  *   may be used to endorse or promote products derived from this software 
        !            16:  *   without specific prior written permission.
        !            17:  *
        !            18:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        !            19:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        !            20:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        !            21:  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
        !            22:  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
        !            23:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
        !            24:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
        !            25:  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
        !            26:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
        !            27:  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
        !            28:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            29:  */
        !            30: 
        !            31: #include <sys/types.h>
        !            32: #include <ctype.h>
        !            33: #include <stdio.h>
        !            34: #include <stdlib.h>
        !            35: #include <string.h>
        !            36: #include <time.h>
        !            37: #include "axhttp.h"
        !            38: 
        !            39: struct day_mon_map 
        !            40: {
        !            41:     const char* s;
        !            42:     uint8_t l;
        !            43: };
        !            44: 
        !            45: static struct day_mon_map wday_tab[] = 
        !            46: {
        !            47:     { "Sun", 0 }, { "Mon", 1 }, { "Tue", 2 }, { "Wed", 3 },
        !            48:     { "Thu", 4 }, { "Fri", 5 }, { "Sat", 6 }, 
        !            49: };
        !            50: 
        !            51: static struct day_mon_map mon_tab[] = 
        !            52: {
        !            53:     { "Jan", 0 }, { "Feb", 1 }, { "Mar", 2 }, { "Apr", 3 },
        !            54:     { "May", 4 }, { "Jun", 5 }, { "Jul", 6 }, { "Aug", 7 },
        !            55:     { "Sep", 8 }, { "Oct", 9 }, { "Nov", 10 }, { "Dec", 11 },
        !            56: };
        !            57: 
        !            58: static int day_mon_map_compare(const char *v1, const char *v2)
        !            59: {
        !            60:     return strcmp(((struct day_mon_map*)v1)->s, ((struct day_mon_map*)v2)->s);
        !            61: }
        !            62: 
        !            63: void tdate_init(void)
        !            64: {
        !            65:     qsort(wday_tab, sizeof(wday_tab)/sizeof(struct day_mon_map),
        !            66:             sizeof(struct day_mon_map), 
        !            67:             (int (*)(const void *, const void *))day_mon_map_compare);
        !            68:     qsort(mon_tab, sizeof(mon_tab)/sizeof(struct day_mon_map),
        !            69:             sizeof(struct day_mon_map), 
        !            70:             (int (*)(const void *, const void *))day_mon_map_compare);
        !            71: }
        !            72: 
        !            73: static int8_t day_mon_map_search(const char* str, 
        !            74:                             const struct day_mon_map* tab, int n)
        !            75: {
        !            76:     struct day_mon_map *search = bsearch(&str, tab, n,
        !            77:             sizeof(struct day_mon_map), 
        !            78:                 (int (*)(const void *, const void *))day_mon_map_compare);
        !            79:     return search ? search->l : -1;
        !            80: }
        !            81: 
        !            82: time_t tdate_parse(const char* str)
        !            83: {
        !            84:     struct tm tm;
        !            85:     char str_mon[4], str_wday[4];
        !            86:     int tm_sec, tm_min, tm_hour, tm_mday, tm_year;
        !            87: 
        !            88:     /* Initialize. */
        !            89:     memset(&tm, 0, sizeof(struct tm));
        !            90: 
        !            91:     /* wdy, DD mth YY HH:MM:SS GMT */
        !            92:     if (sscanf(str, "%3[a-zA-Z], %d %3[a-zA-Z] %d %d:%d:%d GMT",
        !            93:                 str_wday, &tm_mday, str_mon, &tm_year, &tm_hour, &tm_min,
        !            94:                     &tm_sec) == 7)
        !            95:     {
        !            96:         int8_t tm_wday = day_mon_map_search(str_wday, wday_tab, 
        !            97:                         sizeof(wday_tab)/sizeof(struct day_mon_map));
        !            98:         int8_t tm_mon = day_mon_map_search(str_mon, mon_tab, 
        !            99:                         sizeof(mon_tab)/sizeof(struct day_mon_map));
        !           100: 
        !           101:         if (tm_wday < 0 || tm_mon < 0)
        !           102:             return -1;
        !           103: 
        !           104:         tm.tm_wday = tm_wday;
        !           105:         tm.tm_mon = tm_mon;
        !           106:         tm.tm_mday = tm_mday;
        !           107:         tm.tm_hour = tm_hour;
        !           108:         tm.tm_min = tm_min;
        !           109:         tm.tm_sec = tm_sec;
        !           110:         tm.tm_year = tm_year - 1900;
        !           111:         return mktime(&tm);
        !           112:     }
        !           113: 
        !           114:     return -1;  /* error */
        !           115: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>