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

📄 dtimep.c-lexed

📁 早期freebsd实现
💻 C-LEXED
📖 第 1 页 / 共 3 页
字号:
# include "stdio.h"static int start_cond = 0;#define BEGIN start_cond =struct yysvf { 	struct yywork *yystoff;	struct yysvf *yyother;	int *yystops;};# define Z 2#ifndef	lintstatic char ident[] = "@(#)$Id: dtimep.lex,v 2.15 1993/02/26 22:07:40 jromine Exp $";#endif#include "tws.h"#include "../h/strings.h"#include <ctype.h>#include <sys/types.h>#if !defined(SYS5) && !defined(ZONEINFO)#include <sys/timeb.h>#endif /* !defined(SYS5) && !defined(ZONEINFO) */#ifdef SYS5extern int  daylight;extern long timezone;extern char *tzname[];#endif /* SYS5 *//* * Patchable flag that says how to interpret NN/NN/NN dates. When * true, we do it European style: DD/MM/YY. When false, we do it * American style: MM/DD/YY.  Of course, these are all non-RFC822 * compliant. */int europeandate = 0;/* * Table to convert month names to numeric month.  We use the * fact that the low order 5 bits of the sum of the 2nd & 3rd * characters of the name is a hash with no collisions for the 12 * valid month names.  (The mask to 5 bits maps any combination of * upper and lower case into the same hash value). */static	int month_map[] = {	0,	6,	/* 1 - Jul */	3,	/* 2 - Apr */	5,	/* 3 - Jun */	0,	10,	/* 5 - Nov */	0,	1,	/* 7 - Feb */	11,	/* 8 - Dec */	0,	0,	0,	0,	0,	0,	0,	/*15 - Jan */	0,	0,	0,	2,	/*19 - Mar */	0,	8,	/*21 - Sep */	0,	9,	/*23 - Oct */	0,	0,	4,	/*26 - May */	0,	7	/*28 - Aug */};/* * Same trick for day-of-week using the hash function *  (c1 & 7) + (c2 & 4) */static	int day_map[] = {	0,	0,	0,	6,	/* 3 - Sat */	4,	/* 4 - Thu */	0,	5,	/* 6 - Fri */	0,	/* 7 - Sun */	2,	/* 8 - Tue */	1	/* 9 - Mon */,	0,	3	/*11 - Wed */};#define SETDAY	{ tw.tw_wday= day_map[(cp[0] & 7) + (cp[1] & 4)];\		tw.tw_flags &= ~TW_SDAY; tw.tw_flags |= TW_SEXP;\		cp += 2; }#define SETMONTH { tw.tw_mon = month_map[(cp[0] + cp[1]) & 0x1f]; gotdate++;\		 cp += 2;\		 SKIPD;}#define	CVT1OR2	(i=(*cp++ - '0'), isdigit(*cp)? i*10 + (*cp++ - '0') : i)#define	CVT2	  ((cp[0] - '0')*10 + (cp[1] - '0'))#define	CVT4	((((cp[0] - '0')*10 + (cp[1] - '0'))*10 + \				      (cp[2] - '0'))*10 + (cp[3] - '0'))#define SKIPD	{ while ( !isdigit(*cp++) ) ;  --cp; }#define EXPZONE	{ tw.tw_flags &= ~TW_SZONE; tw.tw_flags |= TW_SZEXP; }#define ZONE(x)	{ tw.tw_zone=(x); EXPZONE; }#define ZONED(x) { ZONE(x); tw.tw_flags |= TW_DST; }#define	LC(c)	(isupper (c) ? tolower (c) : (c))#ifdef	DSTXXX#ifdef	_AIX#include <sys/time.h>#include <time.h>#else#ifndef	BSD42#include <time.h>#else	/* BSD42 */#include <sys/time.h>#endif	/* BSD42 */#endifstatic	zonehack (tw)register struct tws *tw;{    register struct tm *tm;    if (twclock (tw) == -1L)	return;    tm = localtime (&tw -> tw_clock);    if (tm -> tm_isdst) {	tw -> tw_flags |= TW_DST;	tw -> tw_zone -= 60;    }}#endif	/* DSTXXX */struct tws *dparsetime (str)	char *str;{	register int i;	static struct tws tw;	register char *cp;	register int gotdate = 0;#ifndef SYS5#ifdef ZONEINFO	struct tm      *tm;	time_t		clock;#else	struct timeb	tb;#endif	/* ZONEINFO */#endif	/* not SYS5 */	long tclock;	start_cond = 0;	/* Zero out the struct. */	bzero( (char *) &tw, sizeof tw);	/* Set default time zone. */#ifdef SYS5	tzset( );	tw.tw_zone = -(timezone / 60);#else#ifdef ZONEINFO	time (&clock);	tm = localtime(&clock);	tw.tw_zone = tm->tm_gmtoff / 60;	if (tm -> tm_isdst)			/* if DST is in effect */		tw.tw_zone -= 60;		/* reset to normal offset */#else	ftime( &tb );	tw.tw_zone = -tb.timezone;#endif	/* ZONEINFO */#endif	/* SYS5 */	while (isspace(*str))		str++;	while ( 1 )		switch (cp = str, *cp ? lex_string( &str, start_cond) : 0) {		case -1:			if (!gotdate || tw.tw_year == 0)				return (struct tws *)0;			/* fall through */		case 0:			if ( tw.tw_year == 0 ) {				/* Set default year. */				time (&tclock);				tw.tw_year = localtime(&tclock)->tm_year + 1900;			}			else if (tw.tw_year < 100) {				/* assume no 2-digit years > 1999 */				tw.tw_year += 1900;			}			return &tw;case 1:			SETDAY;break;case 2:		{					cp++;					SETDAY;					}break;case 3:{					if (europeandate) {						/* European: DD/MM/YY */						tw.tw_mday = CVT1OR2;						cp++;						tw.tw_mon  = CVT1OR2 - 1;					} else {						/* American: MM/DD/YY */						tw.tw_mon  = CVT1OR2 - 1;						cp++;						tw.tw_mday = CVT1OR2;					}					cp++;					for (i = 0; isdigit(*cp); )						i = i*10 + (*cp++ - '0');					tw.tw_year = i;					gotdate++;	/* XXX */					}break;case 4:		{					if (europeandate) {						tw.tw_mday = CVT1OR2; cp++;						tw.tw_mon  = CVT1OR2 - 1;					} else {						tw.tw_mon = CVT1OR2 - 1; cp++;						tw.tw_mday  = CVT1OR2;					}					gotdate++;					}break;case 5:{					tw.tw_mday = CVT1OR2;					while ( !isalpha(*cp++) )						;					SETMONTH;					for (i = 0; isdigit(*cp); )						i = i*10 + (*cp++ - '0');					tw.tw_year = i;					}break;case 6:              {                                        tw.tw_mday = CVT1OR2;                                        while ( ! isalpha( *cp++ ) )                                                ;                                        SETMONTH;                                        }break;case 7:{					cp++;					SETMONTH;					tw.tw_mday = CVT1OR2;					SKIPD;					for (i = 0; isdigit(*cp); )						i = i*10 + (*cp++ - '0');					tw.tw_year = i;					}break;case 8:		{					cp++;					SETMONTH;					tw.tw_mday = CVT1OR2;					}break;case 9:	{	/* hack: ctime w/o TZ */					tw.tw_hour = CVT1OR2; cp++;					tw.tw_min  = CVT1OR2; cp++;					tw.tw_sec  = CVT1OR2;					SKIPD;					tw.tw_year = CVT4; cp+=4;					}break;case 10:			{					tw.tw_hour = CVT1OR2; cp++;					tw.tw_min  = CVT1OR2; cp++;					tw.tw_sec  = CVT1OR2;					BEGIN Z;					}break;case 11:			{					tw.tw_hour = CVT1OR2; cp++;					tw.tw_min = CVT1OR2;					BEGIN Z;					}break;case 12:			{					tw.tw_hour = CVT1OR2; cp++;					if (tw.tw_hour == 12)						tw.tw_hour = 0;					tw.tw_min  = CVT1OR2;					BEGIN Z;					}break;case 13:		{					tw.tw_hour = CVT1OR2; cp++;					if (tw.tw_hour == 12)						tw.tw_hour = 0;					tw.tw_min  = CVT1OR2; cp++;					tw.tw_sec  = CVT1OR2;					BEGIN Z;					}break;case 14:			{					tw.tw_hour = CVT1OR2; cp++;					if (tw.tw_hour != 12)						tw.tw_hour += 12;					tw.tw_min  = CVT1OR2;					BEGIN Z;					}break;case 15:		{					tw.tw_hour = CVT1OR2; cp++;					if (tw.tw_hour != 12)						tw.tw_hour += 12;					tw.tw_min  = CVT1OR2; cp++;					tw.tw_sec  = CVT1OR2;					BEGIN Z;					}break;case 16:		{					tw.tw_hour = CVT2; cp+=2;					tw.tw_min  = CVT2; cp+=2;					tw.tw_sec  = CVT2; cp+=2;					BEGIN Z;					}break;case 17:			{					/*					 * Luckly, 4 digit times in the range					 * 1960-1999 aren't legal as hour					 * and minutes.					 */					tw.tw_year = CVT4; cp+=4;					}break;case 18:		{					if (tw.tw_hour || tw.tw_min 							    || tw.tw_sec) {					    tw.tw_year = CVT4; cp+=4;					    tw.tw_zone = 0;					} else {					    tw.tw_hour = CVT2; cp+=2;					    tw.tw_min  = CVT2; cp+=2;					    BEGIN Z;					}					}break;case 19:			ZONE(0 * 60);break;case 20:			ZONE(0 * 60);break;case 21:			ZONE(2 * 60);break;case 22:			ZONED(2 * 60);break;case 23:			ZONE(-5 * 60);break;case 24:			ZONED(-5 * 60);break;case 25:			ZONE(-6 * 60);break;case 26:			ZONED(-6 * 60);break;case 27:			ZONE(-7 * 60);break;case 28:			ZONED(-7 * 60);break;case 29:			ZONE(-8 * 60);break;case 30:			ZONED(-8 * 60);break;case 31:			ZONE(-(3 * 60 + 30));break;case 32:			ZONE(-4 * 60);break;case 33:			ZONED(-4 * 60);break;case 34:			ZONE(-9 * 60);break;case 35:			ZONED(-9 * 60);break;case 36:			ZONE(-10 * 60);break;case 37:			ZONED(-10 * 60);break;case 38:			ZONED(-1 * 60);break;case 39:			{					tw.tw_zone = 60 * (('a'-1) - LC(*cp));					EXPZONE; 					}break;case 40:			{					tw.tw_zone = 60 * ('a' - LC(*cp));					EXPZONE; 					}break;case 41:			{					tw.tw_zone = 60 * (LC(*cp) - 'm');					EXPZONE; 					}break;case 42:		{					cp++;					tw.tw_zone = ((cp[0] * 10 + cp[1])						     -('0' * 10   + '0'))*60						    +((cp[2] * 10 + cp[3])						     -('0' * 10   + '0'));					EXPZONE;#ifdef	DSTXXX					zonehack (&tw);#endif	/* DSTXXX */					cp += 4;					}break;case 43:		{					cp++;					tw.tw_zone = (('0' * 10   + '0')						     -(cp[0] * 10 + cp[1]))*60						    +(('0' * 10   + '0')						     -(cp[2] * 10 + cp[3]));					EXPZONE;#ifdef	DSTXXX					zonehack (&tw);#endif	/* DSTXXX */					cp += 4;					}break;case 44:		{					SKIPD;					tw.tw_year = CVT4; cp+=4;					}break;case 45:case 46:;break;default: return(0);} }/* end of yylex */int yyvstop[] = {0,46,0,45,0,46,0,39,0,39,0,39,0,39,0,39,0,39,0,39,0,39,0,39,0,40,

⌨️ 快捷键说明

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