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

📄 tclgetdate.y

📁 linux系统下的音频通信
💻 Y
📖 第 1 页 / 共 2 页
字号:
    { "idle",   tZONE,    -HOUR(12) },      /* International Date Line East */    /* ADDED BY Marco Nijdam */    { "dst",    tDST,     HOUR( 0) },       /* DST on (hour is ignored) */    /* End ADDED */    {  NULL  }};/* * Military timezone table. */static TABLE    MilitaryTable[] = {    { "a",      tZONE,  HOUR(  1) },    { "b",      tZONE,  HOUR(  2) },    { "c",      tZONE,  HOUR(  3) },    { "d",      tZONE,  HOUR(  4) },    { "e",      tZONE,  HOUR(  5) },    { "f",      tZONE,  HOUR(  6) },    { "g",      tZONE,  HOUR(  7) },    { "h",      tZONE,  HOUR(  8) },    { "i",      tZONE,  HOUR(  9) },    { "k",      tZONE,  HOUR( 10) },    { "l",      tZONE,  HOUR( 11) },    { "m",      tZONE,  HOUR( 12) },    { "n",      tZONE,  HOUR(- 1) },    { "o",      tZONE,  HOUR(- 2) },    { "p",      tZONE,  HOUR(- 3) },    { "q",      tZONE,  HOUR(- 4) },    { "r",      tZONE,  HOUR(- 5) },    { "s",      tZONE,  HOUR(- 6) },    { "t",      tZONE,  HOUR(- 7) },    { "u",      tZONE,  HOUR(- 8) },    { "v",      tZONE,  HOUR(- 9) },    { "w",      tZONE,  HOUR(-10) },    { "x",      tZONE,  HOUR(-11) },    { "y",      tZONE,  HOUR(-12) },    { "z",      tZONE,  HOUR(  0) },    { NULL }};/* * Dump error messages in the bit bucket. */static voidyyerror(s)    char  *s;{}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 > 59)        return -1;    switch (Meridian) {    case MER24:        if (Hours < 0 || Hours > 23)            return -1;        return (Hours * 60L + Minutes) * 60L + Seconds;    case MERam:        if (Hours < 1 || Hours > 12)            return -1;        return ((Hours % 12) * 60L + Minutes) * 60L + Seconds;    case MERpm:        if (Hours < 1 || Hours > 12)            return -1;        return (((Hours % 12) + 12) * 60L + Minutes) * 60L + Seconds;    }    return -1;  /* Should never be reached */}static intConvert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode, TimePtr)    time_t      Month;    time_t      Day;    time_t      Year;    time_t      Hours;    time_t      Minutes;    time_t      Seconds;    MERIDIAN    Meridian;    DSTMODE     DSTmode;    time_t     *TimePtr;{    static int  DaysInMonth[12] = {        31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31    };    time_t tod;    time_t Julian;    int i;    DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)                    ? 29 : 28;    if (Month < 1 || Month > 12     || Year < START_OF_TIME || Year > END_OF_TIME     || Day < 1 || Day > DaysInMonth[(int)--Month])        return -1;    for (Julian = Day - 1, i = 0; i < Month; i++)        Julian += DaysInMonth[i];    if (Year >= EPOCH) {        for (i = EPOCH; i < Year; i++)            Julian += 365 + (i % 4 == 0);    } else {        for (i = Year; i < EPOCH; i++)            Julian -= 365 + (i % 4 == 0);    }    Julian *= SECSPERDAY;    Julian += yyTimezone * 60L;    if ((tod = ToSeconds(Hours, Minutes, Seconds, Meridian)) < 0)        return -1;    Julian += tod;    if (DSTmode == DSTon     || (DSTmode == DSTmaybe && TclpGetDate(&Julian, 0)->tm_isdst))        Julian -= 60 * 60;    *TimePtr = Julian;    return 0;}static time_tDSTcorrect(Start, Future)    time_t      Start;    time_t      Future;{    time_t      StartDay;    time_t      FutureDay;    StartDay = (TclpGetDate(&Start, 0)->tm_hour + 1) % 24;    FutureDay = (TclpGetDate(&Future, 0)->tm_hour + 1) % 24;    return (Future - Start) + (StartDay - FutureDay) * 60L * 60L;}static time_tRelativeDate(Start, DayOrdinal, DayNumber)    time_t      Start;    time_t      DayOrdinal;    time_t      DayNumber;{    struct tm   *tm;    time_t      now;    now = Start;    tm = TclpGetDate(&now, 0);    now += SECSPERDAY * ((DayNumber - tm->tm_wday + 7) % 7);    now += 7 * SECSPERDAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1);    return DSTcorrect(Start, now);}static intRelativeMonth(Start, RelMonth, TimePtr)    time_t Start;    time_t RelMonth;    time_t *TimePtr;{    struct tm *tm;    time_t Month;    time_t Year;    time_t Julian;    int result;    if (RelMonth == 0) {        *TimePtr = 0;        return 0;    }    tm = TclpGetDate(&Start, 0);    Month = 12 * (tm->tm_year + TM_YEAR_BASE) + tm->tm_mon + RelMonth;    Year = Month / 12;    Month = Month % 12 + 1;    result = 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, &Julian);    /*     * The following iteration takes into account the case were we jump     * into a "short month".  Far example, "one month from Jan 31" will     * fail because there is no Feb 31.  The code below will reduce the     * day and try converting the date until we succed or the date equals     * 28 (which always works unless the date is bad in another way).     */    while ((result != 0) && (tm->tm_mday > 28)) {	tm->tm_mday--;	result = 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, &Julian);    }    if (result != 0) {	return -1;    }    *TimePtr = DSTcorrect(Start, Julian);    return 0;}static intLookupWord(buff)    char                *buff;{    register char *p;    register char *q;    register TABLE *tp;    int i;    int abbrev;    /*     * Make it lowercase.     */    for (p = buff; *p; p++) {        if (isupper(UCHAR(*p))) {            *p = (char) tolower(UCHAR(*p));	}    }    if (strcmp(buff, "am") == 0 || strcmp(buff, "a.m.") == 0) {        yylval.Meridian = MERam;        return tMERIDIAN;    }    if (strcmp(buff, "pm") == 0 || strcmp(buff, "p.m.") == 0) {        yylval.Meridian = MERpm;        return tMERIDIAN;    }    /*     * See if we have an abbreviation for a month.     */    if (strlen(buff) == 3) {        abbrev = 1;    } else if (strlen(buff) == 4 && buff[3] == '.') {        abbrev = 1;        buff[3] = '\0';    } else {        abbrev = 0;    }    for (tp = MonthDayTable; tp->name; tp++) {        if (abbrev) {            if (strncmp(buff, tp->name, 3) == 0) {                yylval.Number = tp->value;                return tp->type;            }        } else if (strcmp(buff, tp->name) == 0) {            yylval.Number = tp->value;            return tp->type;        }    }    for (tp = TimezoneTable; tp->name; tp++) {        if (strcmp(buff, tp->name) == 0) {            yylval.Number = tp->value;            return tp->type;        }    }    for (tp = UnitsTable; tp->name; tp++) {        if (strcmp(buff, tp->name) == 0) {            yylval.Number = tp->value;            return tp->type;        }    }    /*     * Strip off any plural and try the units table again.     */    i = strlen(buff) - 1;    if (buff[i] == 's') {        buff[i] = '\0';        for (tp = UnitsTable; tp->name; tp++) {            if (strcmp(buff, tp->name) == 0) {                yylval.Number = tp->value;                return tp->type;            }	}    }    for (tp = OtherTable; tp->name; tp++) {        if (strcmp(buff, tp->name) == 0) {            yylval.Number = tp->value;            return tp->type;        }    }    /*     * Military timezones.     */    if (buff[1] == '\0' && isalpha(UCHAR(*buff))) {        for (tp = MilitaryTable; tp->name; tp++) {            if (strcmp(buff, tp->name) == 0) {                yylval.Number = tp->value;                return tp->type;            }	}    }    /*     * Drop out any periods and try the timezone table again.     */    for (i = 0, p = q = buff; *q; q++)        if (*q != '.') {            *p++ = *q;        } else {            i++;	}    *p = '\0';    if (i) {        for (tp = TimezoneTable; tp->name; tp++) {            if (strcmp(buff, tp->name) == 0) {                yylval.Number = tp->value;                return tp->type;            }	}    }        return tID;}static intyylex(){    register char       c;    register char       *p;    char                buff[20];    int                 Count;    int                 sign;    for ( ; ; ) {        while (isspace((unsigned char) (*yyInput))) {            yyInput++;	}        if (isdigit(c = *yyInput) || c == '-' || c == '+') {            if (c == '-' || c == '+') {                sign = c == '-' ? -1 : 1;                if (!isdigit(*++yyInput)) {                    /*		     * skip the '-' sign		     */                    continue;		}            } else {                sign = 0;	    }            for (yylval.Number = 0; isdigit(c = *yyInput++); ) {                yylval.Number = 10 * yylval.Number + c - '0';	    }            yyInput--;            if (sign < 0) {                yylval.Number = -yylval.Number;	    }            return sign ? tSNUMBER : tUNUMBER;        }        if (isalpha(UCHAR(c))) {            for (p = buff; isalpha(c = *yyInput++) || c == '.'; ) {                if (p < &buff[sizeof buff - 1]) {                    *p++ = c;		}	    }            *p = '\0';            yyInput--;            return LookupWord(buff);        }        if (c != '(') {            return *yyInput++;	}        Count = 0;        do {            c = *yyInput++;            if (c == '\0') {                return c;	    } else if (c == '(') {                Count++;	    } else if (c == ')') {                Count--;	    }        } while (Count > 0);    }}/* * Specify zone is of -50000 to force GMT.  (This allows BST to work). */intTclGetDate(p, now, zone, timePtr)    char *p;    unsigned long now;    long zone;    unsigned long *timePtr;{    struct tm *tm;    time_t Start;    time_t Time;    time_t tod;    int thisyear;    yyInput = p;    tm = TclpGetDate((time_t *) &now, 0);    thisyear = tm->tm_year + TM_YEAR_BASE;    yyYear = thisyear;    yyMonth = tm->tm_mon + 1;    yyDay = tm->tm_mday;    yyTimezone = zone;    if (zone == -50000) {        yyDSTmode = DSToff;  /* assume GMT */        yyTimezone = 0;    } else {        yyDSTmode = DSTmaybe;    }    yyHour = 0;    yyMinutes = 0;    yySeconds = 0;    yyMeridian = MER24;    yyRelSeconds = 0;    yyRelMonth = 0;    yyHaveDate = 0;    yyHaveDay = 0;    yyHaveRel = 0;    yyHaveTime = 0;    yyHaveZone = 0;    if (yyparse() || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 ||	    yyHaveDay > 1) {        return -1;    }        if (yyHaveDate || yyHaveTime || yyHaveDay) {	if (TclDateYear < 0) {	    TclDateYear = -TclDateYear;	}	/*	 * The following line handles years that are specified using	 * only two digits.  The line of code below implements a policy	 * defined by the X/Open workgroup on the millinium rollover.	 * Note: some of those dates may not actually be valid on some	 * platforms.  The POSIX standard startes that the dates 70-99	 * shall refer to 1970-1999 and 00-38 shall refer to 2000-2038.	 * This later definition should work on all platforms.	 */	if (TclDateYear < 100) {	    if (TclDateYear >= 69) {		TclDateYear += 1900;	    } else {		TclDateYear += 2000;	    }	}	if (Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,		yyMeridian, yyDSTmode, &Start) < 0) {            return -1;	}    } else {        Start = now;        if (!yyHaveRel) {            Start -= ((tm->tm_hour * 60L) + tm->tm_min * 60L) + tm->tm_sec;	}    }    Start += yyRelSeconds;    if (RelativeMonth(Start, yyRelMonth, &Time) < 0) {        return -1;    }    Start += Time;    if (yyHaveDay && !yyHaveDate) {        tod = RelativeDate(Start, yyDayOrdinal, yyDayNumber);        Start += tod;    }    *timePtr = Start;    return 0;}

⌨️ 快捷键说明

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