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

📄 parsedate.y

📁 早期freebsd实现
💻 Y
📖 第 1 页 / 共 2 页
字号:
    { "gst",	tZONE,     HOUR( 3) },	/* Greenland Standard */    { "wat",	tZONE,     -HOUR(1) },	/* West Africa */    { "at",	tZONE,     HOUR( 2) },	/* Azores */    { "gst",	tZONE,     -HOUR(10) },	/* Guam Standard */    { "nft",	tZONE,     HOUR(3)+30 }, /* Newfoundland */    { "idlw",	tZONE,     HOUR(12) },	/* International Date Line West */    { "mewt",	tZONE,     -HOUR(1) },	/* Middle European Winter */    { "mest",	tDAYZONE,  -HOUR(1) },	/* Middle European Summer */    { "swt",	tZONE,     -HOUR(1) },	/* Swedish Winter */    { "sst",	tDAYZONE,  -HOUR(1) },	/* Swedish Summer */    { "fwt",	tZONE,     -HOUR(1) },	/* French Winter */    { "fst",	tDAYZONE,  -HOUR(1) },	/* French Summer */    { "bt",	tZONE,     -HOUR(3) },	/* Baghdad */    { "it",	tZONE,     -(HOUR(3)+30) }, /* Iran */    { "zp4",	tZONE,     -HOUR(4) },	/* USSR Zone 3 */    { "zp5",	tZONE,     -HOUR(5) },	/* USSR Zone 4 */    { "ist",	tZONE,     -(HOUR(5)+30) }, /* Indian Standard */    { "zp6",	tZONE,     -HOUR(6) },	/* USSR Zone 5 */    { "nst",	tZONE,     -HOUR(7) },	/* North Sumatra */    { "sst",	tZONE,     -HOUR(7) },	/* South Sumatra */    { "jt",	tZONE,     -(HOUR(7)+30) }, /* Java (3pm in Cronusland!) */    { "nzt",	tZONE,     -HOUR(12) },	/* New Zealand */    { "idle",	tZONE,     -HOUR(12) },	/* International Date Line East */    { "cat",	tZONE,     HOUR(10) },	/* -- expired 1967 */    { "nt",	tZONE,     HOUR(11) },	/* -- expired 1967 */    { "ahst",	tZONE,     HOUR(10) },	/* -- expired 1983 */    { "hdt",	tDAYZONE,  HOUR(10) },	/* -- expired 1986 */#endif /* 0 */};/* ARGSUSED */static voiddate_error(s)    char	*s;{    /* NOTREACHED */}static time_tToSeconds(Hours, Minutes, Seconds, Meridian)    time_t	Hours;    time_t	Minutes;    time_t	Seconds;    MERIDIAN	Meridian;{    if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 61)	return -1;    if (Meridian == MER24) {	if (Hours < 0 || Hours > 23)	    return -1;    }    else {	if (Hours < 1 || Hours > 12)	    return -1;	if (Hours == 12)	    Hours = 0;	if (Meridian == MERpm)	    Hours += 12;    }    return (Hours * 60L + Minutes) * 60L + Seconds;}static time_tConvert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, dst)    time_t	Month;    time_t	Day;    time_t	Year;    time_t	Hours;    time_t	Minutes;    time_t	Seconds;    MERIDIAN	Meridian;    DSTMODE	dst;{    static int	DaysNormal[13] = {	0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31    };    static int	DaysLeap[13] = {	0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31    };    static int	LeapYears[] = {	1972, 1976, 1980, 1984, 1988, 1992, 1996,	2000, 2004, 2008, 2012, 2016, 2020, 2024, 2028, 2032, 2036    };    register int	*yp;    register int	*mp;    register time_t	Julian;    register int	i;    time_t		tod;    if (Year < 0)	Year = -Year;    if (Year < 100)	Year += 1900;    if (Year < EPOCH)	Year += 100;    for (mp = DaysNormal, yp = LeapYears; yp < ENDOF(LeapYears); yp++)	if (Year == *yp) {	    mp = DaysLeap;	    break;	}    if (Year < EPOCH || Year > END_OF_TIME     || Month < 1 || Month > 12     /* NOSTRICT *//* conversion from long may lose accuracy */     || Day < 1 || Day > mp[(int)Month])	return -1;    Julian = Day - 1 + (Year - EPOCH) * 365;    for (yp = LeapYears; yp < ENDOF(LeapYears); yp++, Julian++)	if (Year <= *yp)	    break;    for (i = 1; i < Month; i++)	Julian += *++mp;    Julian *= SECSPERDAY;    Julian += yyTimezone * 60L;    if ((tod = ToSeconds(Hours, Minutes, Seconds, Meridian)) < 0)	return -1;    Julian += tod;    tod = Julian;    if (dst == DSTon || (dst == DSTmaybe && localtime(&tod)->tm_isdst))	Julian -= DST_OFFSET * 60L * 60L;    return Julian;}static time_tDSTcorrect(Start, Future)    time_t	Start;    time_t	Future;{    time_t	StartDay;    time_t	FutureDay;    StartDay = (localtime(&Start)->tm_hour + 1) % 24;    FutureDay = (localtime(&Future)->tm_hour + 1) % 24;    return (Future - Start) + (StartDay - FutureDay) * DST_OFFSET * 60L * 60L;}static time_tRelativeMonth(Start, RelMonth)    time_t	Start;    time_t	RelMonth;{    struct tm	*tm;    time_t	Month;    time_t	Year;    tm = localtime(&Start);    Month = 12 * tm->tm_year + tm->tm_mon + RelMonth;    Year = Month / 12;    Month = Month % 12 + 1;    return DSTcorrect(Start,	    Convert(Month, (time_t)tm->tm_mday, Year,		(time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec,		MER24, DSTmaybe));}static intLookupWord(buff, length)    char		*buff;    register int	length;{    register char	*p;    register char	*q;    register TABLE	*tp;    register int	c;    p = buff;    c = p[0];    /* See if we have an abbreviation for a month. */    if (length == 3 || (length == 4 && p[3] == '.'))	for (tp = MonthDayTable; tp < ENDOF(MonthDayTable); tp++) {	    q = tp->name;	    if (c == q[0] && p[1] == q[1] && p[2] == q[2]) {		yylval.Number = tp->value;		return tp->type;	    }	}    else	for (tp = MonthDayTable; tp < ENDOF(MonthDayTable); tp++)	    if (c == tp->name[0] && strcmp(p, tp->name) == 0) {		yylval.Number = tp->value;		return tp->type;	    }    /* Try for a timezone. */    for (tp = TimezoneTable; tp < ENDOF(TimezoneTable); tp++)	if (c == tp->name[0] && p[1] == tp->name[1]	 && strcmp(p, tp->name) == 0) {	    yylval.Number = tp->value;	    return tp->type;	}    /* Try the units table. */    for (tp = UnitsTable; tp < ENDOF(UnitsTable); tp++)	if (c == tp->name[0] && strcmp(p, tp->name) == 0) {	    yylval.Number = tp->value;	    return tp->type;	}    /* Strip off any plural and try the units table again. */    if (--length > 0 && p[length] == 's') {	p[length] = '\0';	for (tp = UnitsTable; tp < ENDOF(UnitsTable); tp++)	    if (c == tp->name[0] && strcmp(p, tp->name) == 0) {		p[length] = 's';		yylval.Number = tp->value;		return tp->type;	    }	p[length] = 's';    }    length++;    /* Drop out any periods. */    for (p = buff, q = (char*)buff; *q; q++)	if (*q != '.')	    *p++ = *q;    *p = '\0';    /* Try the meridians. */    if (buff[1] == 'm' && buff[2] == '\0') {	if (buff[0] == 'a') {	    yylval.Meridian = MERam;	    return tMERIDIAN;	}	if (buff[0] == 'p') {	    yylval.Meridian = MERpm;	    return tMERIDIAN;	}    }    /* If we saw any periods, try the timezones again. */    if (p - buff != length) {	c = buff[0];	for (p = buff, tp = TimezoneTable; tp < ENDOF(TimezoneTable); tp++)	    if (c == tp->name[0] && p[1] == tp->name[1]	    && strcmp(p, tp->name) == 0) {		yylval.Number = tp->value;		return tp->type;	    }    }    /* Unknown word -- assume GMT timezone. */    yylval.Number = 0;    return tZONE;}intdate_lex(){    register char	c;    register char	*p;    char		buff[20];    register int	sign;    register int	i;    register int	nesting;    for ( ; ; ) {	/* Get first character after the whitespace. */	for ( ; ; ) {	    while (isspace(*yyInput))		yyInput++;	    c = *yyInput;	    /* Ignore RFC 822 comments, typically time zone names. */	    if (c != LPAREN)		break;	    for (nesting = 1; (c = *++yyInput) != RPAREN || --nesting; )		if (c == LPAREN)		    nesting++;		else if (!IS7BIT(c) || c == '\0' || c == '\r'		     || (c == '\\' && ((c = *++yyInput) == '\0' || !IS7BIT(c))))		    /* Lexical error: bad comment. */		    return '?';	    yyInput++;	}	/* A number? */	if (isdigit(c) || c == '-' || c == '+') {	    if (c == '-' || c == '+') {		sign = c == '-' ? -1 : 1;		yyInput++;		if (!isdigit(*yyInput))		    /* Skip the plus or minus sign. */		    continue;	    }	    else		sign = 0;	    for (i = 0; (c = *yyInput++) != '\0' && isdigit(c); )		i = 10 * i + c - '0';	    yyInput--;	    yylval.Number = sign < 0 ? -i : i;	    return sign ? tSNUMBER : tUNUMBER;	}	/* A word? */	if (isalpha(c)) {	    for (p = buff; (c = *yyInput++) == '.' || isalpha(c); )		if (p < &buff[sizeof buff - 1])		    *p++ = isupper(c) ? tolower(c) : c;	    *p = '\0';	    yyInput--;	    return LookupWord(buff, p - buff);	}	return *yyInput++;    }}time_tparsedate(p)    char		*p;{    extern int		date_parse();    time_t		Start;    yyInput = p;    yyYear = 0;    yyMonth = 0;    yyDay = 0;    yyTimezone = 0;    yyDSTmode = DSTmaybe;    yyHour = 0;    yyMinutes = 0;    yySeconds = 0;    yyMeridian = MER24;    yyRelSeconds = 0;    yyRelMonth = 0;    yyHaveDate = 0;    yyHaveRel = 0;    yyHaveTime = 0;    if (date_parse() || yyHaveTime > 1 || yyHaveDate > 1)	return -1;    if (yyHaveDate || yyHaveTime) {	Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,		    yyMeridian, yyDSTmode);	if (Start < 0)	    return -1;    }    else	return -1;    Start += yyRelSeconds;    if (yyRelMonth)	Start += RelativeMonth(Start, yyRelMonth);    /* Have to do *something* with a legitimate -1 so it's distinguishable     * from the error return value.  (Alternately could set errno on error.) */    return Start == -1 ? 0 : Start;}#ifdef TEST#if YYDEBUGextern int	yydebug;#endif /* YYDEBUG *//* ARGSUSED */intmain(ac, av)    int		ac;    char	*av[];{    char	buff[128];    time_t	d;#if YYDEBUG    yydebug = 1;#endif /* YYDEBUG */    (void)printf("Enter date, or blank line to exit.\n\t> ");    for ( ; ; ) {	(void)printf("\t> ");	(void)fflush(stdout);	if (gets(buff) == NULL || buff[0] == '\n')	    break;#if YYDEBUG	if (strcmp(buff, "yydebug") == 0) {	    yydebug = !yydebug;	    printf("yydebug = %s\n", yydebug ? "on" : "off");	    continue;	}#endif /* YYDEBUG */	d = parsedate(buff, (TIMEINFO *)NULL);	if (d == -1)	    (void)printf("Bad format - couldn't convert.\n");	else	    (void)printf("%s", ctime(&d));    }    exit(0);    /* NOTREACHED */}#endif /* TEST */

⌨️ 快捷键说明

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