⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 date.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <httpd.h>/* * print dates in the format * Wkd, DD Mon YYYY HH:MM:SS GMT * parse dates of formats * Wkd, DD Mon YYYY HH:MM:SS GMT * Weekday, DD-Mon-YY HH:MM:SS GMT * Wkd Mon ( D|DD) HH:MM:SS YYYY * plus anything similar */static char *weekdayname[7] ={	"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};static char *wdayname[7] ={	"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};static char *monname[12] ={	"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};static	int	dateindex(char*, char**, int);static intdtolower(int c){	if(c >= 'A' && c <= 'Z')		return c - 'A' + 'a';	return c;}static intdisalpha(int c){	return c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z';}static intdisdig(int c){	return c >= '0' && c <= '9';}inthdatefmt(Fmt *f){	Tm *tm;	ulong t;	t = va_arg(f->args, ulong);	tm = gmtime(t);	return fmtprint(f, "%s, %.2d %s %.4d %.2d:%.2d:%.2d GMT",		wdayname[tm->wday], tm->mday, monname[tm->mon], tm->year+1900,		tm->hour, tm->min, tm->sec);}static char*dateword(char *date, char *buf){	char *p;	int c;	p = buf;	while(!disalpha(c = *date) && !disdig(c) && c)		date++;	while(disalpha(c = *date)){		if(p - buf < 30)			*p++ = dtolower(c);		date++;	}	*p = 0;	return date;}static intdatenum(char **d){	char *date;	int c, n;	date = *d;	while(!disdig(c = *date) && c)		date++;	if(c == 0){		*d = date;		return -1;	}	n = 0;	while(disdig(c = *date)){		n = n * 10 + c - '0';		date++;	}	*d = date;	return n;}/* * parse a date and return the seconds since the epoch * return 0 for a failure */ulonghdate2sec(char *date){	Tm tm;	char buf[32];	/*	 * Weekday|Wday	 */	date = dateword(date, buf);	tm.wday = dateindex(buf, wdayname, 7);	if(tm.wday < 0)		tm.wday = dateindex(buf, weekdayname, 7);	if(tm.wday < 0)		return 0;	/*	 * check for the two major formats	 */	date = dateword(date, buf);	tm.mon = dateindex(buf, monname, 12);	if(tm.mon >= 0){		/*		 * MM		 */		tm.mday = datenum(&date);		if(tm.mday < 1 || tm.mday > 31)			return 0;		/*		 * HH:MM:SS		 */		tm.hour = datenum(&date);		if(tm.hour < 0 || tm.hour >= 24)			return 0;		tm.min = datenum(&date);		if(tm.min < 0 || tm.min >= 60)			return 0;		tm.sec = datenum(&date);		if(tm.sec < 0 || tm.sec >= 60)			return 0;		/*		 * YYYY		 */		tm.year = datenum(&date);		if(tm.year < 70 || tm.year > 99 && tm.year < 1970)			return 0;		if(tm.year >= 1970)			tm.year -= 1900;	}else{		/*		 * MM-Mon-(YY|YYYY)		 */		tm.mday = datenum(&date);		if(tm.mday < 1 || tm.mday > 31)			return 0;		date = dateword(date, buf);		tm.mon = dateindex(buf, monname, 12);		if(tm.mon < 0 || tm.mon >= 12)			return 0;		tm.year = datenum(&date);		if(tm.year < 70 || tm.year > 99 && tm.year < 1970)			return 0;		if(tm.year >= 1970)			tm.year -= 1900;		/*		 * HH:MM:SS		 */		tm.hour = datenum(&date);		if(tm.hour < 0 || tm.hour >= 24)			return 0;		tm.min = datenum(&date);		if(tm.min < 0 || tm.min >= 60)			return 0;		tm.sec = datenum(&date);		if(tm.sec < 0 || tm.sec >= 60)			return 0;		/*		 * timezone		 */		dateword(date, buf);		if(strncmp(buf, "gmt", 3) != 0)			return 0;	}	strcpy(tm.zone, "GMT");	tm.tzoff = 0;	tm.yday = 0;	return tm2sec(&tm);}static intdateindex(char *d, char **tab, int n){	int i;	for(i = 0; i < n; i++)		if(cistrcmp(d, tab[i]) == 0)			return i;	return -1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -