File:  [ELWIX - Embedded LightWeight unIX -] / libelwix / src / time.c
Revision 1.1.2.2: download - view: text, annotated - select for diffs - revision graph
Thu Mar 7 15:34:26 2013 UTC (11 years, 3 months ago) by misho
Branches: elwix1_1
added new time parse api

    1: #include "global.h"
    2: 
    3: 
    4: struct stridx {
    5: 	char	*str;
    6: 	int	id;
    7: };
    8: 
    9: static struct stridx months[] = {
   10: 	{ "jan", 0 }, { "january", 0 },
   11: 	{ "feb", 1 }, { "february", 1 },
   12: 	{ "mar", 2 }, { "march", 2 },
   13: 	{ "apr", 3 }, { "april", 3 },
   14: 	{ "may", 4 },
   15: 	{ "jun", 5 }, { "june", 5 },
   16: 	{ "jul", 6 }, { "july", 6 },
   17: 	{ "aug", 7 }, { "august", 7 },
   18: 	{ "sep", 8 }, { "september", 8 },
   19: 	{ "oct", 9 }, { "october", 9 },
   20: 	{ "nov", 10 }, { "november", 10 },
   21: 	{ "dec", 11 }, { "december", 11 },
   22: };
   23: 
   24: static struct stridx wdays[] = {
   25: 	{ "sun", 0 }, { "sunday", 0 },
   26: 	{ "mon", 1 }, { "monday", 1 },
   27: 	{ "tue", 2 }, { "tuesday", 2 },
   28: 	{ "wed", 3 }, { "wednesday", 3 },
   29: 	{ "thu", 4 }, { "thursday", 4 },
   30: 	{ "fri", 5 }, { "friday", 5 },
   31: 	{ "sat", 6 }, { "saturday", 6 },
   32: };
   33: 
   34: static int
   35: stridx_compare(struct stridx * __restrict a, struct stridx * __restrict b)
   36: {
   37: 	return strcmp(a->str, b->str);
   38: }
   39: 
   40: static int
   41: search4month(char * __restrict psMonth, int * __restrict id)
   42: {
   43: 	static int sorted = 0;
   44: 	struct stridx *el;
   45: 
   46: 	if (!psMonth)
   47: 		return -1;
   48: 
   49: 	if (!sorted) {
   50: 		qsort(months, sizeof(months) / sizeof(struct stridx), sizeof(struct stridx), 
   51: 				(int (*)(const void*, const void*)) stridx_compare);
   52: 		sorted++;
   53: 	}
   54: 
   55: 	str_Lower(psMonth);
   56: 	el = bsearch(psMonth, months, sizeof(months) / sizeof(struct stridx), sizeof(struct stridx), 
   57: 				(int (*)(const void*, const void*)) stridx_compare);
   58: 	if (el && id)
   59: 		*id = el->id;
   60: 
   61: 	return !!el;
   62: }
   63: 
   64: static int
   65: search4wday(char * __restrict psWDay, int * __restrict id)
   66: {
   67: 	static int sorted = 0;
   68: 	struct stridx *el;
   69: 
   70: 	if (!psWDay)
   71: 		return -1;
   72: 
   73: 	if (!sorted) {
   74: 		qsort(wdays, sizeof(wdays) / sizeof(struct stridx), sizeof(struct stridx), 
   75: 				(int (*)(const void*, const void*)) stridx_compare);
   76: 		sorted++;
   77: 	}
   78: 
   79: 	str_Lower(psWDay);
   80: 	el = bsearch(psWDay, wdays, sizeof(wdays) / sizeof(struct stridx), sizeof(struct stridx), 
   81: 				(int (*)(const void*, const void*)) stridx_compare);
   82: 	if (el && id)
   83: 		*id = el->id;
   84: 
   85: 	return !!el;
   86: }
   87: 
   88: 
   89: /*
   90:  * time_Parse() - Parse and make unix time from standart time strings ...
   91:  *
   92:  * @csTime = Time string
   93:  * return: =0 error or !=0 converted time 
   94:  */
   95: time_t
   96: time_Parse(const char *csTime)
   97: {
   98: 	struct tm tm;
   99: 	char *s;
  100: 	int tm_sec, tm_min, tm_hour, tm_mday, tm_year, tm_mon, tm_wday;
  101: 	char str_mon[512], str_wday[512];
  102: 
  103: 	memset(&tm, 0, sizeof tm);
  104: 	memset(&str_mon, 0, sizeof str_mon);
  105: 	memset(&str_wday, 0, sizeof str_wday);
  106: 
  107: 	for (s = (char*) csTime; isspace(*s); s++);
  108: 
  109: 	/*
  110: 	 * And do the sscanfs.  WARNING: you can add more formats here,
  111: 	 * but be careful!  You can easily screw up the parsing of existing
  112: 	 * formats when you add new ones.  The order is important.
  113: 	 */
  114: 
  115: 	/* DD-mth-YY HH:MM:SS GMT */
  116: 	if (sscanf(s, "%d-%400[a-zA-Z]-%d %d:%d:%d GMT", 
  117: 				&tm_mday, str_mon, &tm_year, 
  118: 				&tm_hour, &tm_min, &tm_sec) == 6 && 
  119: 			search4month(str_mon, &tm_mon)) {
  120: 		tm.tm_mday = tm_mday;
  121: 		tm.tm_mon = tm_mon;
  122: 		tm.tm_year = tm_year;
  123: 		tm.tm_hour = tm_hour;
  124: 		tm.tm_min = tm_min;
  125: 		tm.tm_sec = tm_sec;
  126: 	}
  127: 	/* DD mth YY HH:MM:SS GMT */
  128: 	else if (sscanf(s, "%d %400[a-zA-Z] %d %d:%d:%d GMT", 
  129: 				&tm_mday, str_mon, &tm_year, 
  130: 				&tm_hour, &tm_min, &tm_sec) == 6 && 
  131: 			search4month(str_mon, &tm_mon)) {
  132: 		tm.tm_mday = tm_mday;
  133: 		tm.tm_mon = tm_mon;
  134: 		tm.tm_year = tm_year;
  135: 		tm.tm_hour = tm_hour;
  136: 		tm.tm_min = tm_min;
  137: 		tm.tm_sec = tm_sec;
  138: 	}
  139: 	/* HH:MM:SS GMT DD-mth-YY */
  140: 	else if (sscanf(s, "%d:%d:%d GMT %d-%400[a-zA-Z]-%d", 
  141: 				&tm_hour, &tm_min, &tm_sec, 
  142: 				&tm_mday, str_mon, &tm_year) == 6 && 
  143: 			search4month(str_mon, &tm_mon)) {
  144: 		tm.tm_hour = tm_hour;
  145: 		tm.tm_min = tm_min;
  146: 		tm.tm_sec = tm_sec;
  147: 		tm.tm_mday = tm_mday;
  148: 		tm.tm_mon = tm_mon;
  149: 		tm.tm_year = tm_year;
  150: 	}
  151: 	/* HH:MM:SS GMT DD mth YY */
  152: 	else if (sscanf(s, "%d:%d:%d GMT %d %400[a-zA-Z] %d", 
  153: 				&tm_hour, &tm_min, &tm_sec, 
  154: 				&tm_mday, str_mon, &tm_year) == 6 && 
  155: 			search4month(str_mon, &tm_mon)) {
  156: 		tm.tm_hour = tm_hour;
  157: 		tm.tm_min = tm_min;
  158: 		tm.tm_sec = tm_sec;
  159: 		tm.tm_mday = tm_mday;
  160: 		tm.tm_mon = tm_mon;
  161: 		tm.tm_year = tm_year;
  162: 	}
  163: 	/* wdy, DD-mth-YY HH:MM:SS GMT */
  164: 	else if (sscanf(s, "%400[a-zA-Z], %d-%400[a-zA-Z]-%d %d:%d:%d GMT", 
  165: 				str_wday, &tm_mday, str_mon, 
  166: 				&tm_year, &tm_hour, &tm_min, &tm_sec) == 7 && 
  167: 			search4wday(str_wday, &tm_wday) && 
  168: 			search4month(str_mon, &tm_mon)) {
  169: 		tm.tm_wday = tm_wday;
  170: 		tm.tm_mday = tm_mday;
  171: 		tm.tm_mon = tm_mon;
  172: 		tm.tm_year = tm_year;
  173: 		tm.tm_hour = tm_hour;
  174: 		tm.tm_min = tm_min;
  175: 		tm.tm_sec = tm_sec;
  176: 	}
  177: 	/* wdy, DD mth YY HH:MM:SS GMT */
  178: 	else if (sscanf(s, "%400[a-zA-Z], %d %400[a-zA-Z] %d %d:%d:%d GMT", 
  179: 				str_wday, &tm_mday, str_mon, 
  180: 				&tm_year, &tm_hour, &tm_min, &tm_sec) == 7 && 
  181: 			search4wday(str_wday, &tm_wday) && 
  182: 			search4month(str_mon, &tm_mon)) {
  183: 		tm.tm_wday = tm_wday;
  184: 		tm.tm_mday = tm_mday;
  185: 		tm.tm_mon = tm_mon;
  186: 		tm.tm_year = tm_year;
  187: 		tm.tm_hour = tm_hour;
  188: 		tm.tm_min = tm_min;
  189: 		tm.tm_sec = tm_sec;
  190: 	}
  191: 	/* wdy mth DD HH:MM:SS GMT YY */
  192: 	else if (sscanf(s, "%400[a-zA-Z] %400[a-zA-Z] %d %d:%d:%d GMT %d", 
  193: 				str_wday, str_mon, &tm_mday, 
  194: 				&tm_hour, &tm_min, &tm_sec, &tm_year) == 7 && 
  195: 			search4wday(str_wday, &tm_wday) && 
  196: 			search4month(str_mon, &tm_mon)) {
  197: 		tm.tm_wday = tm_wday;
  198: 		tm.tm_mon = tm_mon;
  199: 		tm.tm_mday = tm_mday;
  200: 		tm.tm_hour = tm_hour;
  201: 		tm.tm_min = tm_min;
  202: 		tm.tm_sec = tm_sec;
  203: 		tm.tm_year = tm_year;
  204: 	} else
  205: 		return (time_t) -1;
  206: 
  207: 	if (tm.tm_year > 1900)
  208: 		tm.tm_year -= 1900;
  209: 	else if (tm.tm_year < 70)
  210: 		tm.tm_year += 100;
  211: 
  212: 	return timegm(&tm);
  213: }

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