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

📄 getdate.y

📁 操作系统SunOS 4.1.3版本的源码
💻 Y
字号:
%token MONTH MERIDIAN NUMBER FULLYEAR%{#ifndef lintstatic	char sccsid[] = "@(#)getdate.y 1.1 92/07/30 SMI";#endif#include <sys/types.h>#include <ctype.h>#include <time.h>extern time_t timelocal();static struct tm tmbuf;static int	merid;static char	*lptr;static int	us_canada_flag;static int	lookup();#define	MERID_NONE	0#define MERID_AM	1#define MERID_PM	2%}%%datetime: timespec datespec	| datespec timespec;timespec: NUMBER MERIDIAN		= { maketime($1, 0, 0, $2); }	| NUMBER ':' NUMBER		= { maketime($1, $3, 0, MERID_NONE); }	| NUMBER '.' NUMBER		= { maketime($1, $3, 0, MERID_NONE); }	| NUMBER ':' NUMBER MERIDIAN		= { maketime($1, $3, 0, $4); }	| NUMBER '.' NUMBER MERIDIAN		= { maketime($1, $3, 0, $4); }	| NUMBER ':' NUMBER ':' NUMBER		= { maketime($1, $3, $5, MERID_NONE); }	| NUMBER '.' NUMBER '.' NUMBER		= { maketime($1, $3, $5, MERID_NONE); }	| NUMBER ':' NUMBER ':' NUMBER MERIDIAN		= { maketime($1, $3, $5, $6); }	| NUMBER '.' NUMBER '.' NUMBER MERIDIAN		= { maketime($1, $3, $5, $6); }	;datespec: NUMBER '/' NUMBER '/' NUMBER		= { if (us_canada_flag)			makedate($3, $1 - 1, $5);		    else			makedate($1, $3 - 1, $5);		}	| NUMBER '/' NUMBER '/' FULLYEAR		= { if (us_canada_flag)			makedate($3, $1 - 1, $5);		    else			makedate($1, $3 - 1, $5);		}	| NUMBER '.' NUMBER '.' FULLYEAR		= { makedate($1, $3 - 1, $5); }	| NUMBER '-' NUMBER '-' FULLYEAR		= { makedate($1, $3 - 1, $5); }	| NUMBER '-' NUMBER '-' NUMBER		= { makedate($1, $3 - 1, $5); }	| MONTH NUMBER ',' FULLYEAR		= { makedate($2, $1, $4); }	| NUMBER MONTH FULLYEAR		= { makedate($1, $2, $3); }	;%%staticmaketime(hour, minute, second, meridian)	int hour;	int minute;	int second;	int meridian;{	tmbuf.tm_hour = hour;	tmbuf.tm_min = minute;	tmbuf.tm_sec = second;	merid = meridian;}staticmakedate(day, month, year)	int day;	int month;	int year;{	tmbuf.tm_mday = day;	tmbuf.tm_mon = month;	tmbuf.tm_year = year;}static int dmsize[12] = {	31,	28,	31,	30,	31,	30,	31,	31,	30,	31,	30,	31};#define isleap(y) (((y) % 4) == 0 && ((y) % 100) != 0 || ((y) % 400) == 0)time_tgetdate(p, us_canada)	char *p;	int us_canada;{	register int mdays;	lptr = p;	us_canada_flag = us_canada;	if (yyparse())		return (-1);	if (tmbuf.tm_year >= 1900)		tmbuf.tm_year -= 1900;	if (tmbuf.tm_year < 70 || tmbuf.tm_mon < 0 || tmbuf.tm_mon > 11)		return (-1);	mdays = dmsize[tmbuf.tm_mon];	if (tmbuf.tm_mon == 1 && isleap(tmbuf.tm_year))		mdays++;	if (tmbuf.tm_mday < 1 || tmbuf.tm_mday > mdays)		return (-1);	switch (merid) {	case MERID_AM:		if (tmbuf.tm_hour < 1 || tmbuf.tm_hour > 12)			return(-1);		tmbuf.tm_hour = tmbuf.tm_hour%12;		break;	case MERID_PM:		if (tmbuf.tm_hour < 1 || tmbuf.tm_hour > 12)			return(-1);		tmbuf.tm_hour = tmbuf.tm_hour%12 + 12;		break;	case MERID_NONE:		if (tmbuf.tm_hour < 0 || tmbuf.tm_hour > 23)			return (-1);		break;	default:		return (-1);	}	if (tmbuf.tm_min < 0 || tmbuf.tm_min > 59	    || tmbuf.tm_sec < 0 || tmbuf.tm_sec > 59)		return (-1);	return (timelocal(&tmbuf));}yylex(){	extern int yylval;	register char c;	register char *p;	char idbuf[128+1];	for (;;) {		while (isspace(*lptr))			lptr++;		if (isdigit(c = *lptr)) {			yylval = 0;			while (isdigit(c = *lptr++))				yylval = 10*yylval + c - '0';			lptr--;			if (yylval >= 1900) {				yylval -= 1900;				return (FULLYEAR);			} else				return (NUMBER);		} else if (isalpha(c)) {			p = idbuf;			while (isalpha(c = *lptr++) || c == '.') {				if (p >= &idbuf[128])					return (-1);				if (isupper(c))					c = tolower(c);				*p++ = c;			}			*p = '\0';			lptr--;			return (lookup(idbuf));		} else			return (*lptr++);	}}struct table {	char	*name;	int	value;};static struct table monthtab[] = {	{ "january",	0 },	{ "jan",	0 },	{ "jan.",	0 },	{ "february",	1 },	{ "feb",	1 },	{ "feb.",	1 },	{ "march",	2 },	{ "mar",	2 },	{ "mar.",	2 },	{ "april",	3 },	{ "apr",	3 },	{ "apr.",	3 },	{ "may",	4 },	{ "june",	5 },	{ "jun",	5 },	{ "jun.",	5 },	{ "july",	6 },	{ "jul",	6 },	{ "jul.",	6 },	{ "august",	7 },	{ "aug",	7 },	{ "aug.",	7 },	{ "september",	8 },	{ "sept",	8 },	{ "sept.",	8 },	{ "sep",	8 },	{ "sep.",	8 },	{ "october",	9 },	{ "oct",	9 },	{ "oct.",	9 },	{ "november",	10 },	{ "nov",	10 },	{ "nov.",	10 },	{ "december",	11 },	{ "dec",	11 },	{ "dec.",	11 },};#define	NMONTHTAB	(sizeof monthtab / sizeof monthtab[0])static struct table meridtab[] = {	{ "a.m.",	MERID_AM },	{ "am",		MERID_AM },	{ "p.m.",	MERID_PM },	{ "pm",		MERID_PM },};#define	NMERIDTAB	(sizeof meridtab / sizeof meridtab[0])static intlookup(id)	char *id;{	register struct table *tabp;	for (tabp = &monthtab[0]; tabp < &monthtab[NMONTHTAB]; tabp++) {		if (strcmp(id, tabp->name) == 0) {			yylval = tabp->value;			return (MONTH);		}	}	for (tabp = &meridtab[0]; tabp < &meridtab[NMERIDTAB]; tabp++) {		if (strcmp(id, tabp->name) == 0) {			yylval = tabp->value;			return (MERIDIAN);		}	}	return(-1);}/*VARARGS*/yyerror(s) char *s;{}

⌨️ 快捷键说明

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