diff options
Diffstat (limited to 'nuttx')
-rw-r--r-- | nuttx/include/stdio.h | 8 | ||||
-rw-r--r-- | nuttx/netutils/thttpd/Makefile | 2 | ||||
-rw-r--r-- | nuttx/netutils/thttpd/tdate_parse.c | 317 |
3 files changed, 323 insertions, 4 deletions
diff --git a/nuttx/include/stdio.h b/nuttx/include/stdio.h index bdad60ed3..9528600e7 100644 --- a/nuttx/include/stdio.h +++ b/nuttx/include/stdio.h @@ -33,8 +33,8 @@ * ****************************************************************************/ -#ifndef __STDIO_H -#define __STDIO_H +#ifndef __INCLUDE_STDIO_H +#define __INCLUDE_STDIO_H /**************************************************************************** * Included Files @@ -125,12 +125,14 @@ EXTERN int puts(FAR const char *s); EXTERN int rename(FAR const char *oldpath, FAR const char *newpath); EXTERN int sprintf(FAR char *buf, const char *format, ...); EXTERN int snprintf(FAR char *buf, size_t size, const char *format, ...); +EXTERN int sscanf(const char *buf, const char *fmt, ...); EXTERN int ungetc(int c, FAR FILE *stream); EXTERN int vprintf(FAR const char *format, va_list ap); EXTERN int vfprintf(FAR FILE *stream, const char *format, va_list ap); EXTERN int vsprintf(FAR char *buf, const char *format, va_list ap); EXTERN int vsnprintf(FAR char *buf, size_t size, const char *format, va_list ap); +EXTERN int vsscanf(char *buf, const char *s, va_list ap); /* POSIX-like File System Interfaces */ @@ -142,4 +144,4 @@ EXTERN int statfs(FAR const char *path, FAR struct statfs *buf); } #endif -#endif /* __STDIO_H */ +#endif /* __INCLUDE_STDIO_H */ diff --git a/nuttx/netutils/thttpd/Makefile b/nuttx/netutils/thttpd/Makefile index 18c3da293..0840fdd35 100644 --- a/nuttx/netutils/thttpd/Makefile +++ b/nuttx/netutils/thttpd/Makefile @@ -42,7 +42,7 @@ SUBDIRS = cgi-src ASRCS = AOBJS = $(ASRCS:.S=$(OBJEXT)) -CSRCS = thttpd.c libhttpd.c timers.c fdwatch.c +CSRCS = thttpd.c libhttpd.c timers.c fdwatch.c tdate_parse.c COBJS = $(CSRCS:.c=$(OBJEXT)) SRCS = $(ASRCS) $(CSRCS) diff --git a/nuttx/netutils/thttpd/tdate_parse.c b/nuttx/netutils/thttpd/tdate_parse.c new file mode 100644 index 000000000..fcd2cfbda --- /dev/null +++ b/nuttx/netutils/thttpd/tdate_parse.c @@ -0,0 +1,317 @@ +/**************************************************************************** + * netutils/thttpd/timers.c + * Parse string dates into internal form, stripped-down version + * + * Copyright (C) 2009 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <spudmonkey@racsa.co.cr> + * + * Derived from the file of the same name in the original THTTPD package: + * + * Copyright © 1995 by Jef Poskanzer <jef@mail.acme.com>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <sys/types.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <time.h> + +#include "tdate_parse.h" + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct strlong +{ + char *s; + long l; +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static void pound_case(char *str) +{ + for (; *str != '\0'; ++str) + { + if (isupper((int)*str)) + { + *str = tolower((int)*str); + } + } +} + +static int strlong_compare(const void *v1, const void *v2) +{ + return strcmp(((struct strlong *)v1)->s, ((struct strlong *)v2)->s); +} + +static int strlong_search(char *str, struct strlong *tab, int n, long *lP) +{ + int i, h, l, r; + + l = 0; + h = n - 1; + for (;;) + { + i = (h + l) / 2; + r = strcmp(str, tab[i].s); + if (r < 0) + { + h = i - 1; + } + else if (r > 0) + { + l = i + 1; + } + else + { + *lP = tab[i].l; + return 1; + } + + if (h < l) + { + return 0; + } + } +} + +#if 0 /* Day of week not yet supported by NuttX */ +static int scan_wday(char *str_wday, long *tm_wdayP) +{ + static struct strlong wday_tab[] = { + {"sun", 0}, {"sunday", 0}, + {"mon", 1}, {"monday", 1}, + {"tue", 2}, {"tuesday", 2}, + {"wed", 3}, {"wednesday", 3}, + {"thu", 4}, {"thursday", 4}, + {"fri", 5}, {"friday", 5}, + {"sat", 6}, {"saturday", 6}, + }; + static int sorted = 0; + + if (!sorted) + { + (void)qsort(wday_tab, sizeof(wday_tab) / sizeof(struct strlong), + sizeof(struct strlong), strlong_compare); + sorted = 1; + } + pound_case(str_wday); + return strlong_search(str_wday, wday_tab, + sizeof(wday_tab) / sizeof(struct strlong), tm_wdayP); +} +#endif /* Day of week not yet supported by NuttX */ + +static int scan_mon(char *str_mon, long *tm_monP) +{ + static struct strlong mon_tab[] = { + {"jan", 0}, {"january", 0}, + {"feb", 1}, {"february", 1}, + {"mar", 2}, {"march", 2}, + {"apr", 3}, {"april", 3}, + {"may", 4}, + {"jun", 5}, {"june", 5}, + {"jul", 6}, {"july", 6}, + {"aug", 7}, {"august", 7}, + {"sep", 8}, {"september", 8}, + {"oct", 9}, {"october", 9}, + {"nov", 10}, {"november", 10}, + {"dec", 11}, {"december", 11}, + }; + static int sorted = 0; + + if (!sorted) + { + (void)qsort(mon_tab, sizeof(mon_tab) / sizeof(struct strlong), + sizeof(struct strlong), strlong_compare); + sorted = 1; + } + pound_case(str_mon); + return strlong_search(str_mon, mon_tab, + sizeof(mon_tab) / sizeof(struct strlong), tm_monP); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +time_t tdate_parse(char *str) +{ + struct tm tm; + char *cp; + char str_mon[32]; + int tm_year; + int tm_mday; + int tm_hour; + int tm_min; + int tm_sec; + long tm_mon; +#if 0 /* Day of week not yet supported by NuttX */ + char str_wday[32]; + long tm_wday; +#endif + + /* Initialize. */ + (void)memset((char *)&tm, 0, sizeof(struct tm)); + + /* Skip initial whitespace ourselves - sscanf is clumsy at this. */ + + for (cp = str; *cp == ' ' || *cp == '\t'; ++cp) + continue; + + /* And do the sscanfs. WARNING: you can add more formats here, but be + * careful! You can easily screw up the parsing of existing formats when + * you add new ones. The order is important. */ + + /* DD-mth-YY HH:MM:SS GMT */ + if (sscanf(cp, "%d-%400[a-zA-Z]-%d %d:%d:%d GMT", + &tm_mday, str_mon, &tm_year, &tm_hour, &tm_min, + &tm_sec) == 6 && scan_mon(str_mon, &tm_mon)) + { + tm.tm_mday = tm_mday; + tm.tm_mon = tm_mon; + tm.tm_year = tm_year; + tm.tm_hour = tm_hour; + tm.tm_min = tm_min; + tm.tm_sec = tm_sec; + } + + /* DD mth YY HH:MM:SS GMT */ + else if (sscanf(cp, "%d %400[a-zA-Z] %d %d:%d:%d GMT", + &tm_mday, str_mon, &tm_year, &tm_hour, &tm_min, + &tm_sec) == 6 && scan_mon(str_mon, &tm_mon)) + { + tm.tm_mday = tm_mday; + tm.tm_mon = tm_mon; + tm.tm_year = tm_year; + tm.tm_hour = tm_hour; + tm.tm_min = tm_min; + tm.tm_sec = tm_sec; + } + + /* HH:MM:SS GMT DD-mth-YY */ + else if (sscanf(cp, "%d:%d:%d GMT %d-%400[a-zA-Z]-%d", + &tm_hour, &tm_min, &tm_sec, &tm_mday, str_mon, + &tm_year) == 6 && scan_mon(str_mon, &tm_mon)) + { + tm.tm_hour = tm_hour; + tm.tm_min = tm_min; + tm.tm_sec = tm_sec; + tm.tm_mday = tm_mday; + tm.tm_mon = tm_mon; + tm.tm_year = tm_year; + } + + /* HH:MM:SS GMT DD mth YY */ + else if (sscanf(cp, "%d:%d:%d GMT %d %400[a-zA-Z] %d", + &tm_hour, &tm_min, &tm_sec, &tm_mday, str_mon, + &tm_year) == 6 && scan_mon(str_mon, &tm_mon)) + { + tm.tm_hour = tm_hour; + tm.tm_min = tm_min; + tm.tm_sec = tm_sec; + tm.tm_mday = tm_mday; + tm.tm_mon = tm_mon; + tm.tm_year = tm_year; + } + +#if 0 /* Day of week not yet supported by NuttX */ + /* wdy, DD-mth-YY HH:MM:SS GMT */ + else if (sscanf(cp, "%400[a-zA-Z], %d-%400[a-zA-Z]-%d %d:%d:%d GMT", + str_wday, &tm_mday, str_mon, &tm_year, &tm_hour, &tm_min, + &tm_sec) == 7 && + scan_wday(str_wday, &tm_wday) && scan_mon(str_mon, &tm_mon)) + { + tm.tm_wday = tm_wday; + tm.tm_mday = tm_mday; + tm.tm_mon = tm_mon; + tm.tm_year = tm_year; + tm.tm_hour = tm_hour; + tm.tm_min = tm_min; + tm.tm_sec = tm_sec; + } +#endif /* Day of week not yet supported by NuttX */ + +#if 0 /* Day of week not yet supported by NuttX */ + /* wdy, DD mth YY HH:MM:SS GMT */ + else if (sscanf(cp, "%400[a-zA-Z], %d %400[a-zA-Z] %d %d:%d:%d GMT", + str_wday, &tm_mday, str_mon, &tm_year, &tm_hour, &tm_min, + &tm_sec) == 7 && + scan_wday(str_wday, &tm_wday) && scan_mon(str_mon, &tm_mon)) + { + tm.tm_wday = tm_wday; + tm.tm_mday = tm_mday; + tm.tm_mon = tm_mon; + tm.tm_year = tm_year; + tm.tm_hour = tm_hour; + tm.tm_min = tm_min; + tm.tm_sec = tm_sec; + } +#endif /* Day of week not yet supported by NuttX */ + +#if 0 /* Day of week not yet supported by NuttX */ + /* wdy mth DD HH:MM:SS GMT YY */ + else if (sscanf(cp, "%400[a-zA-Z] %400[a-zA-Z] %d %d:%d:%d GMT %d", + str_wday, str_mon, &tm_mday, &tm_hour, &tm_min, &tm_sec, + &tm_year) == 7 && + scan_wday(str_wday, &tm_wday) && scan_mon(str_mon, &tm_mon)) + { + tm.tm_wday = tm_wday; + tm.tm_mon = tm_mon; + tm.tm_mday = tm_mday; + tm.tm_hour = tm_hour; + tm.tm_min = tm_min; + tm.tm_sec = tm_sec; + tm.tm_year = tm_year; + } +#endif /* Day of week not yet supported by NuttX */ + else + { + return (time_t) - 1; + } + + if (tm.tm_year > 1900) + { + tm.tm_year -= 1900; + } + else if (tm.tm_year < 70) + { + tm.tm_year += 100; + } + + return mktime(&tm); +} + |