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

📄 tcldate.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 += TclDateTimezone * 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) {        TclDatelval.Meridian = MERam;        return tMERIDIAN;    }    if (strcmp(buff, "pm") == 0 || strcmp(buff, "p.m.") == 0) {        TclDatelval.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) {                TclDatelval.Number = tp->value;                return tp->type;            }        } else if (strcmp(buff, tp->name) == 0) {            TclDatelval.Number = tp->value;            return tp->type;        }    }    for (tp = TimezoneTable; tp->name; tp++) {        if (strcmp(buff, tp->name) == 0) {            TclDatelval.Number = tp->value;            return tp->type;        }    }    for (tp = UnitsTable; tp->name; tp++) {        if (strcmp(buff, tp->name) == 0) {            TclDatelval.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) {                TclDatelval.Number = tp->value;                return tp->type;            }	}    }    for (tp = OtherTable; tp->name; tp++) {        if (strcmp(buff, tp->name) == 0) {            TclDatelval.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) {                TclDatelval.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) {                TclDatelval.Number = tp->value;                return tp->type;            }	}    }        return tID;}static intTclDatelex(){    register char       c;    register char       *p;    char                buff[20];    int                 Count;    int                 sign;    for ( ; ; ) {        while (isspace((unsigned char) (*TclDateInput))) {            TclDateInput++;	}        if (isdigit(c = *TclDateInput) || c == '-' || c == '+') {            if (c == '-' || c == '+') {                sign = c == '-' ? -1 : 1;                if (!isdigit(*++TclDateInput)) {                    /*		     * skip the '-' sign		     */                    continue;		}            } else {                sign = 0;	    }            for (TclDatelval.Number = 0; isdigit(c = *TclDateInput++); ) {                TclDatelval.Number = 10 * TclDatelval.Number + c - '0';	    }            TclDateInput--;            if (sign < 0) {                TclDatelval.Number = -TclDatelval.Number;	    }            return sign ? tSNUMBER : tUNUMBER;        }        if (isalpha(UCHAR(c))) {            for (p = buff; isalpha(c = *TclDateInput++) || c == '.'; ) {                if (p < &buff[sizeof buff - 1]) {                    *p++ = c;		}	    }            *p = '\0';            TclDateInput--;            return LookupWord(buff);        }        if (c != '(') {            return *TclDateInput++;	}        Count = 0;        do {            c = *TclDateInput++;            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;    TclDateInput = p;    tm = TclpGetDate((time_t *) &now, 0);    thisyear = tm->tm_year + TM_YEAR_BASE;    TclDateYear = thisyear;    TclDateMonth = tm->tm_mon + 1;    TclDateDay = tm->tm_mday;    TclDateTimezone = zone;    if (zone == -50000) {        TclDateDSTmode = DSToff;  /* assume GMT */        TclDateTimezone = 0;    } else {        TclDateDSTmode = DSTmaybe;    }    TclDateHour = 0;    TclDateMinutes = 0;    TclDateSeconds = 0;    TclDateMeridian = MER24;    TclDateRelSeconds = 0;    TclDateRelMonth = 0;    TclDateHaveDate = 0;    TclDateHaveDay = 0;    TclDateHaveRel = 0;    TclDateHaveTime = 0;    TclDateHaveZone = 0;    if (TclDateparse() || TclDateHaveTime > 1 || TclDateHaveZone > 1 || TclDateHaveDate > 1 ||	    TclDateHaveDay > 1) {        return -1;    }        if (TclDateHaveDate || TclDateHaveTime || TclDateHaveDay) {	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(TclDateMonth, TclDateDay, TclDateYear, TclDateHour, TclDateMinutes, TclDateSeconds,		TclDateMeridian, TclDateDSTmode, &Start) < 0) {            return -1;	}    } else {        Start = now;        if (!TclDateHaveRel) {            Start -= ((tm->tm_hour * 60L) + tm->tm_min * 60L) + tm->tm_sec;	}    }    Start += TclDateRelSeconds;    if (RelativeMonth(Start, TclDateRelMonth, &Time) < 0) {        return -1;    }    Start += Time;    if (TclDateHaveDay && !TclDateHaveDate) {        tod = RelativeDate(Start, TclDateDayOrdinal, TclDateDayNumber);        Start += tod;    }    *timePtr = Start;    return 0;}TclDatetabelem TclDateexca[] ={-1, 1,	0, -1,	-2, 0,	};# define YYNPROD 41# define YYLAST 227TclDatetabelem TclDateact[]={    14,    11,    23,    28,    17,    12,    19,    18,    16,     9,    10,    13,    42,    21,    46,    45,    44,    48,    41,    37,    36,    35,    32,    29,    34,    33,    31,    43,    39,    38,    30,    15,     8,     7,     6,     5,     4,     3,     2,     1,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,    47,     0,     0,     0,     0,     0,

⌨️ 快捷键说明

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