ddhill Mon Mar 31 09:40:46 2003 EDT Modified files: (Branch: PHP_4_3) /php4/ext/standard parsedate.y Log: Changing parsedate to be reentrant using pure_parse (Dave)
Index: php4/ext/standard/parsedate.y diff -u php4/ext/standard/parsedate.y:1.34 php4/ext/standard/parsedate.y:1.34.2.1 --- php4/ext/standard/parsedate.y:1.34 Mon Sep 9 15:11:35 2002 +++ php4/ext/standard/parsedate.y Mon Mar 31 09:40:46 2003 @@ -8,7 +8,7 @@ ** This code is in the public domain and has no copyright. */ -/* $Id: parsedate.y,v 1.34 2002/09/09 19:11:35 wez Exp $ */ +/* $Id: parsedate.y,v 1.34.2.1 2003/03/31 14:40:46 ddhill Exp $ */ #include "php.h" @@ -86,46 +86,9 @@ then those parser generators need to be fixed instead of adding those names to this list. */ -#define yymaxdepth php_gd_maxdepth #define yyparse php_gd_parse #define yylex php_gd_lex -#define yyerror php_gd_error -#define yylval php_gd_lval -#define yychar php_gd_char -#define yydebug php_gd_debug -#define yypact php_gd_pact -#define yyr1 php_gd_r1 -#define yyr2 php_gd_r2 -#define yydef php_gd_def -#define yychk php_gd_chk -#define yypgo php_gd_pgo -#define yyact php_gd_act -#define yyexca php_gd_exca -#define yyerrflag php_gd_errflag -#define yynerrs php_gd_nerrs -#define yyps php_gd_ps -#define yypv php_gd_pv -#define yys php_gd_s -#define yy_yys php_gd_yys -#define yystate php_gd_state -#define yytmp php_gd_tmp -#define yyv php_gd_v -#define yy_yyv php_gd_yyv -#define yyval php_gd_val -#define yylloc php_gd_lloc -#define yyreds php_gd_reds /* With YYDEBUG defined */ -#define yytoks php_gd_toks /* With YYDEBUG defined */ -#define yylhs php_gd_yylhs -#define yylen php_gd_yylen -#define yydefred php_gd_yydefred -#define yydgoto php_gd_yydgoto -#define yysindex php_gd_yysindex -#define yyrindex php_gd_yyrindex -#define yygindex php_gd_yygindex -#define yytable php_gd_yytable -#define yycheck php_gd_yycheck -static int yylex (); static int yyerror (); #define EPOCH 1970 @@ -150,45 +113,46 @@ MERam, MERpm, MER24 } MERIDIAN; +struct date_yy { + const char *yyInput; + int yyDayOrdinal; + int yyDayNumber; + int yyHaveDate; + int yyHaveDay; + int yyHaveRel; + int yyHaveTime; + int yyHaveZone; + int yyTimezone; + int yyDay; + int yyHour; + int yyMinutes; + int yyMonth; + int yySeconds; + int yyYear; + MERIDIAN yyMeridian; + int yyRelDay; + int yyRelHour; + int yyRelMinutes; + int yyRelMonth; + int yyRelSeconds; + int yyRelYear; +}; -/* -** Global variables. We could get rid of most of these by using a good -** union as the yacc stack. (This routine was originally written before -** yacc had the %union construct.) Maybe someday; right now we only use -** the %union very rarely. -*/ -static const char *yyInput; -static int yyDayOrdinal; -static int yyDayNumber; -static int yyHaveDate; -static int yyHaveDay; -static int yyHaveRel; -static int yyHaveTime; -static int yyHaveZone; -static int yyTimezone; -static int yyDay; -static int yyHour; -static int yyMinutes; -static int yyMonth; -static int yySeconds; -static int yyYear; -static MERIDIAN yyMeridian; -static int yyRelDay; -static int yyRelHour; -static int yyRelMinutes; -static int yyRelMonth; -static int yyRelSeconds; -static int yyRelYear; +typedef union _date_ll { + int Number; + enum _MERIDIAN Meridian; +} date_ll; + +#define YYPARSE_PARAM parm +#define YYLEX_PARAM parm +#define YYSTYPE date_ll +#define YYLTYPE void %} /* This grammar has 14 shift/reduce conflicts. */ %expect 14 - -%union { - int Number; - enum _MERIDIAN Meridian; -} +%pure_parser %token tAGO tDAY tDAY_UNIT tDAYZONE tDST tHOUR_UNIT tID %token tMERIDIAN tMINUTE_UNIT tMONTH tMONTH_UNIT @@ -206,94 +170,95 @@ ; item : time { - yyHaveTime++; + ((struct date_yy *)parm)->yyHaveTime++; } | zone { - yyHaveZone++; + ((struct date_yy *)parm)->yyHaveZone++; } | date { - yyHaveDate++; + ((struct date_yy *)parm)->yyHaveDate++; } | day { - yyHaveDay++; + ((struct date_yy *)parm)->yyHaveDay++; } | rel { - yyHaveRel++; + ((struct date_yy *)parm)->yyHaveRel++; } | number ; time : tUNUMBER tMERIDIAN { - yyHour = $1; - yyMinutes = 0; - yySeconds = 0; - yyMeridian = $2; + ((struct date_yy *)parm)->yyHour = $1; + ((struct date_yy *)parm)->yyMinutes = 0; + ((struct date_yy *)parm)->yySeconds = 0; + ((struct date_yy *)parm)->yyMeridian = $2; } | tUNUMBER ':' tUNUMBER o_merid { - yyHour = $1; - yyMinutes = $3; - yySeconds = 0; - yyMeridian = $4; + ((struct date_yy *)parm)->yyHour = $1; + ((struct date_yy *)parm)->yyMinutes = $3; + ((struct date_yy *)parm)->yySeconds = 0; + ((struct date_yy *)parm)->yyMeridian = $4; } | tUNUMBER ':' tUNUMBER tSNUMBER { - yyHour = $1; - yyMinutes = $3; - yyMeridian = MER24; - yyHaveZone++; - yyTimezone = ($4 < 0 + ((struct date_yy *)parm)->yyHour = $1; + ((struct date_yy *)parm)->yyMinutes = $3; + ((struct date_yy *)parm)->yyMeridian = MER24; + ((struct date_yy *)parm)->yyHaveZone++; + ((struct date_yy *)parm)->yyTimezone = ($4 < 0 ? -$4 % 100 + (-$4 / 100) * 60 : - ($4 % 100 + ($4 / 100) * 60)); } | tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid { - yyHour = $1; - yyMinutes = $3; - yySeconds = $5; - yyMeridian = $6; + ((struct date_yy *)parm)->yyHour = $1; + ((struct date_yy *)parm)->yyMinutes = $3; + ((struct date_yy *)parm)->yySeconds = $5; + ((struct date_yy *)parm)->yyMeridian = $6; } | tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER { /* ISO 8601 format. hh:mm:ss[+-][0-9]{2}([0-9]{2})?. */ - yyHour = $1; - yyMinutes = $3; - yySeconds = $5; - yyMeridian = MER24; - yyHaveZone++; + ((struct date_yy *)parm)->yyHour = $1; + ((struct date_yy *)parm)->yyMinutes = $3; + ((struct date_yy *)parm)->yySeconds = $5; + ((struct date_yy *)parm)->yyMeridian = MER24; + ((struct date_yy *)parm)->yyHaveZone++; if ($6 <= -100 || $6 >= 100) { - yyTimezone = -$6 % 100 + (-$6 / 100) * 60; + ((struct date_yy *)parm)->yyTimezone = + -$6 % 100 + (-$6 / 100) * 60; } else { - yyTimezone = -$6 * 60; + ((struct date_yy *)parm)->yyTimezone = -$6 * 60; } } ; zone : tZONE { - yyTimezone = $1; + ((struct date_yy *)parm)->yyTimezone = $1; } | tDAYZONE { - yyTimezone = $1 - 60; + ((struct date_yy *)parm)->yyTimezone = $1 - 60; } | tZONE tDST { - yyTimezone = $1 - 60; + ((struct date_yy *)parm)->yyTimezone = $1 - 60; } ; day : tDAY { - yyDayOrdinal = 1; - yyDayNumber = $1; + ((struct date_yy *)parm)->yyDayOrdinal = 1; + ((struct date_yy *)parm)->yyDayNumber = $1; } | tDAY ',' { - yyDayOrdinal = 1; - yyDayNumber = $1; + ((struct date_yy *)parm)->yyDayOrdinal = 1; + ((struct date_yy *)parm)->yyDayNumber = $1; } | tUNUMBER tDAY { - yyDayOrdinal = $1; - yyDayNumber = $2; + ((struct date_yy *)parm)->yyDayOrdinal = $1; + ((struct date_yy *)parm)->yyDayNumber = $2; } ; date : tUNUMBER '/' tUNUMBER { - yyMonth = $1; - yyDay = $3; + ((struct date_yy *)parm)->yyMonth = $1; + ((struct date_yy *)parm)->yyDay = $3; } | tUNUMBER '/' tUNUMBER '/' tUNUMBER { /* Interpret as YYYY/MM/DD if $1 >= 1000, otherwise as MM/DD/YY. @@ -302,149 +267,157 @@ you want portability, use the ISO 8601 format. */ if ($1 >= 1000) { - yyYear = $1; - yyMonth = $3; - yyDay = $5; + ((struct date_yy *)parm)->yyYear = $1; + ((struct date_yy *)parm)->yyMonth = $3; + ((struct date_yy *)parm)->yyDay = $5; } else { - yyMonth = $1; - yyDay = $3; - yyYear = $5; + ((struct date_yy *)parm)->yyMonth = $1; + ((struct date_yy *)parm)->yyDay = $3; + ((struct date_yy *)parm)->yyYear = $5; } } | tUNUMBER tSNUMBER tSNUMBER { /* ISO 8601 format. yyyy-mm-dd. */ - yyYear = $1; - yyMonth = -$2; - yyDay = -$3; + ((struct date_yy *)parm)->yyYear = $1; + ((struct date_yy *)parm)->yyMonth = -$2; + ((struct date_yy *)parm)->yyDay = -$3; } | tUNUMBER tMONTH tSNUMBER { /* e.g. 17-JUN-1992. */ - yyDay = $1; - yyMonth = $2; - yyYear = -$3; + ((struct date_yy *)parm)->yyDay = $1; + ((struct date_yy *)parm)->yyMonth = $2; + ((struct date_yy *)parm)->yyYear = -$3; } | tMONTH tUNUMBER tUNUMBER { - yyMonth = $1; - yyDay = $2; - yyYear = $3; + ((struct date_yy *)parm)->yyMonth = $1; + ((struct date_yy *)parm)->yyDay = $2; + ((struct date_yy *)parm)->yyYear = $3; } | tMONTH tUNUMBER { - yyMonth = $1; - yyDay = $2; + ((struct date_yy *)parm)->yyMonth = $1; + ((struct date_yy *)parm)->yyDay = $2; } | tMONTH tUNUMBER ',' tUNUMBER { - yyMonth = $1; - yyDay = $2; - yyYear = $4; + ((struct date_yy *)parm)->yyMonth = $1; + ((struct date_yy *)parm)->yyDay = $2; + ((struct date_yy *)parm)->yyYear = $4; } | tUNUMBER tMONTH { - yyMonth = $2; - yyDay = $1; + ((struct date_yy *)parm)->yyMonth = $2; + ((struct date_yy *)parm)->yyDay = $1; } | tUNUMBER tMONTH tUNUMBER { - yyMonth = $2; - yyDay = $1; - yyYear = $3; + ((struct date_yy *)parm)->yyMonth = $2; + ((struct date_yy *)parm)->yyDay = $1; + ((struct date_yy *)parm)->yyYear = $3; } ; rel : relunit tAGO { - yyRelSeconds = -yyRelSeconds; - yyRelMinutes = -yyRelMinutes; - yyRelHour = -yyRelHour; - yyRelDay = -yyRelDay; - yyRelMonth = -yyRelMonth; - yyRelYear = -yyRelYear; + ((struct date_yy *)parm)->yyRelSeconds = + -((struct date_yy *)parm)->yyRelSeconds; + ((struct date_yy *)parm)->yyRelMinutes = + -((struct date_yy *)parm)->yyRelMinutes; + ((struct date_yy *)parm)->yyRelHour = + -((struct date_yy *)parm)->yyRelHour; + ((struct date_yy *)parm)->yyRelDay = + -((struct date_yy *)parm)->yyRelDay; + ((struct date_yy *)parm)->yyRelMonth = + -((struct date_yy *)parm)->yyRelMonth; + ((struct date_yy *)parm)->yyRelYear = + -((struct date_yy *)parm)->yyRelYear; } | relunit ; relunit : tUNUMBER tYEAR_UNIT { - yyRelYear += $1 * $2; + ((struct date_yy *)parm)->yyRelYear += $1 * $2; } | tSNUMBER tYEAR_UNIT { - yyRelYear += $1 * $2; + ((struct date_yy *)parm)->yyRelYear += $1 * $2; } | tYEAR_UNIT { - yyRelYear += $1; + ((struct date_yy *)parm)->yyRelYear += $1; } | tUNUMBER tMONTH_UNIT { - yyRelMonth += $1 * $2; + ((struct date_yy *)parm)->yyRelMonth += $1 * $2; } | tSNUMBER tMONTH_UNIT { - yyRelMonth += $1 * $2; + ((struct date_yy *)parm)->yyRelMonth += $1 * $2; } | tMONTH_UNIT { - yyRelMonth += $1; + ((struct date_yy *)parm)->yyRelMonth += $1; } | tUNUMBER tDAY_UNIT { - yyRelDay += $1 * $2; + ((struct date_yy *)parm)->yyRelDay += $1 * $2; } | tSNUMBER tDAY_UNIT { - yyRelDay += $1 * $2; + ((struct date_yy *)parm)->yyRelDay += $1 * $2; } | tDAY_UNIT { - yyRelDay += $1; + ((struct date_yy *)parm)->yyRelDay += $1; } | tUNUMBER tHOUR_UNIT { - yyRelHour += $1 * $2; + ((struct date_yy *)parm)->yyRelHour += $1 * $2; } | tSNUMBER tHOUR_UNIT { - yyRelHour += $1 * $2; + ((struct date_yy *)parm)->yyRelHour += $1 * $2; } | tHOUR_UNIT { - yyRelHour += $1; + ((struct date_yy *)parm)->yyRelHour += $1; } | tUNUMBER tMINUTE_UNIT { - yyRelMinutes += $1 * $2; + ((struct date_yy *)parm)->yyRelMinutes += $1 * $2; } | tSNUMBER tMINUTE_UNIT { - yyRelMinutes += $1 * $2; + ((struct date_yy *)parm)->yyRelMinutes += $1 * $2; } | tMINUTE_UNIT { - yyRelMinutes += $1; + ((struct date_yy *)parm)->yyRelMinutes += $1; } | tUNUMBER tSEC_UNIT { - yyRelSeconds += $1 * $2; + ((struct date_yy *)parm)->yyRelSeconds += $1 * $2; } | tSNUMBER tSEC_UNIT { - yyRelSeconds += $1 * $2; + ((struct date_yy *)parm)->yyRelSeconds += $1 * $2; } | tSEC_UNIT { - yyRelSeconds += $1; + ((struct date_yy *)parm)->yyRelSeconds += $1; } ; number : tUNUMBER { - if (yyHaveTime && yyHaveDate && !yyHaveRel) - yyYear = $1; + if (((struct date_yy *)parm)->yyHaveTime && + ((struct date_yy *)parm)->yyHaveDate && + !((struct date_yy *)parm)->yyHaveRel) + ((struct date_yy *)parm)->yyYear = $1; else { if ($1>10000) { - yyHaveDate++; - yyDay= ($1)%100; - yyMonth= ($1/100)%100; - yyYear = $1/10000; + ((struct date_yy *)parm)->yyHaveDate++; + ((struct date_yy *)parm)->yyDay= ($1)%100; + ((struct date_yy *)parm)->yyMonth= ($1/100)%100; + ((struct date_yy *)parm)->yyYear = $1/10000; } else { - yyHaveTime++; + ((struct date_yy *)parm)->yyHaveTime++; if ($1 < 100) { - yyHour = $1; - yyMinutes = 0; + ((struct date_yy *)parm)->yyHour = $1; + ((struct date_yy *)parm)->yyMinutes = 0; } else { - yyHour = $1 / 100; - yyMinutes = $1 % 100; + ((struct date_yy *)parm)->yyHour = $1 / 100; + ((struct date_yy *)parm)->yyMinutes = $1 % 100; } - yySeconds = 0; - yyMeridian = MER24; + ((struct date_yy *)parm)->yySeconds = 0; + ((struct date_yy *)parm)->yyMeridian = MER24; } } } @@ -714,7 +687,8 @@ } static int -LookupWord (buff) +LookupWord (lvalp,buff) + YYSTYPE *lvalp; char *buff; { register char *p; @@ -730,12 +704,12 @@ if (strcmp (buff, "am") == 0 || strcmp (buff, "a.m.") == 0) { - yylval.Meridian = MERam; + lvalp->Meridian = MERam; return tMERIDIAN; } if (strcmp (buff, "pm") == 0 || strcmp (buff, "p.m.") == 0) { - yylval.Meridian = MERpm; + lvalp->Meridian = MERpm; return tMERIDIAN; } @@ -756,13 +730,13 @@ { if (strncmp (buff, tp->name, 3) == 0) { - yylval.Number = tp->value; + lvalp->Number = tp->value; return tp->type; } } else if (strcmp (buff, tp->name) == 0) { - yylval.Number = tp->value; + lvalp->Number = tp->value; return tp->type; } } @@ -770,7 +744,7 @@ for (tp = TimezoneTable; tp->name; tp++) if (strcmp (buff, tp->name) == 0) { - yylval.Number = tp->value; + lvalp->Number = tp->value; return tp->type; } @@ -780,7 +754,7 @@ for (tp = UnitsTable; tp->name; tp++) if (strcmp (buff, tp->name) == 0) { - yylval.Number = tp->value; + lvalp->Number = tp->value; return tp->type; } @@ -792,7 +766,7 @@ for (tp = UnitsTable; tp->name; tp++) if (strcmp (buff, tp->name) == 0) { - yylval.Number = tp->value; + lvalp->Number = tp->value; return tp->type; } buff[i] = 's'; /* Put back for "this" in OtherTable. */ @@ -801,7 +775,7 @@ for (tp = OtherTable; tp->name; tp++) if (strcmp (buff, tp->name) == 0) { - yylval.Number = tp->value; + lvalp->Number = tp->value; return tp->type; } @@ -811,7 +785,7 @@ for (tp = MilitaryTable; tp->name; tp++) if (strcmp (buff, tp->name) == 0) { - yylval.Number = tp->value; + lvalp->Number = tp->value; return tp->type; } } @@ -827,70 +801,70 @@ for (tp = TimezoneTable; tp->name; tp++) if (strcmp (buff, tp->name) == 0) { - yylval.Number = tp->value; + lvalp->Number = tp->value; return tp->type; } return tID; } -static int -yylex () +yylex (YYSTYPE *lvalp, void *parm) { register unsigned char c; register char *p; char buff[20]; int Count; int sign; + struct date_yy * date = (struct date_yy *)parm; for (;;) { - while (ISSPACE ((unsigned char) *yyInput)) - yyInput++; + while (ISSPACE ((unsigned char) *date->yyInput)) + date->yyInput++; - if (ISDIGIT (c = *yyInput) || c == '-' || c == '+') + if (ISDIGIT (c = *date->yyInput) || c == '-' || c == '+') { if (c == '-' || c == '+') { sign = c == '-' ? -1 : 1; - if (!ISDIGIT (*++yyInput)) + if (!ISDIGIT (*++date->yyInput)) /* skip the '-' sign */ continue; } else sign = 0; - for (yylval.Number = 0; ISDIGIT (c = *yyInput++);) - yylval.Number = 10 * yylval.Number + c - '0'; - yyInput--; + for (lvalp->Number = 0; ISDIGIT (c = *date->yyInput++);) + lvalp->Number = 10 * lvalp->Number + c - '0'; + date->yyInput--; if (sign < 0) - yylval.Number = -yylval.Number; + lvalp->Number = -lvalp->Number; /* Ignore ordinal suffixes on numbers */ - c = *yyInput; + c = *date->yyInput; if (c == 's' || c == 'n' || c == 'r' || c == 't') { - c = *++yyInput; + c = *++date->yyInput; if (c == 't' || c == 'd' || c == 'h') { - yyInput++; + date->yyInput++; } else { - yyInput--; + date->yyInput--; } } return sign ? tSNUMBER : tUNUMBER; } if (ISALPHA (c)) { - for (p = buff; (c = *yyInput++, ISALPHA (c)) || c == '.';) + for (p = buff; (c = *date->yyInput++, ISALPHA (c)) || c == '.';) if (p < &buff[sizeof buff - 1]) *p++ = c; *p = '\0'; - yyInput--; - return LookupWord (buff); + date->yyInput--; + return LookupWord (lvalp, buff); } if (c != '(') - return *yyInput++; + return *date->yyInput++; Count = 0; do { - c = *yyInput++; + c = *date->yyInput++; if (c == '\0') return c; if (c == '(') @@ -929,58 +903,60 @@ { struct tm tm, tm0, *tmp; time_t Start; + struct date_yy date; - yyInput = p; + date.yyInput = p; Start = now ? *now : time ((time_t *) NULL); tmp = localtime (&Start); if (!tmp) return -1; - yyYear = tmp->tm_year + TM_YEAR_ORIGIN; - yyMonth = tmp->tm_mon + 1; - yyDay = tmp->tm_mday; - yyHour = tmp->tm_hour; - yyMinutes = tmp->tm_min; - yySeconds = tmp->tm_sec; + date.yyYear = tmp->tm_year + TM_YEAR_ORIGIN; + date.yyMonth = tmp->tm_mon + 1; + date.yyDay = tmp->tm_mday; + date.yyHour = tmp->tm_hour; + date.yyMinutes = tmp->tm_min; + date.yySeconds = tmp->tm_sec; tm.tm_isdst = tmp->tm_isdst; - yyMeridian = MER24; - yyRelSeconds = 0; - yyRelMinutes = 0; - yyRelHour = 0; - yyRelDay = 0; - yyRelMonth = 0; - yyRelYear = 0; - yyHaveDate = 0; - yyHaveDay = 0; - yyHaveRel = 0; - yyHaveTime = 0; - yyHaveZone = 0; - - if (yyparse () - || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1) + date.yyMeridian = MER24; + date.yyRelSeconds = 0; + date.yyRelMinutes = 0; + date.yyRelHour = 0; + date.yyRelDay = 0; + date.yyRelMonth = 0; + date.yyRelYear = 0; + date.yyHaveDate = 0; + date.yyHaveDay = 0; + date.yyHaveRel = 0; + date.yyHaveTime = 0; + date.yyHaveZone = 0; + + if (yyparse ((void *)&date) + || date.yyHaveTime > 1 || date.yyHaveZone > 1 + || date.yyHaveDate > 1 || date.yyHaveDay > 1) return -1; - tm.tm_year = ToYear (yyYear) - TM_YEAR_ORIGIN + yyRelYear; - tm.tm_mon = yyMonth - 1 + yyRelMonth; - tm.tm_mday = yyDay + yyRelDay; - if (yyHaveTime || (yyHaveRel && !yyHaveDate && !yyHaveDay)) + tm.tm_year = ToYear (date.yyYear) - TM_YEAR_ORIGIN + date.yyRelYear; + tm.tm_mon = date.yyMonth - 1 + date.yyRelMonth; + tm.tm_mday = date.yyDay + date.yyRelDay; + if (date.yyHaveTime || (date.yyHaveRel && !date.yyHaveDate && !date.yyHaveDay)) { - tm.tm_hour = ToHour (yyHour, yyMeridian); + tm.tm_hour = ToHour (date.yyHour, date.yyMeridian); if (tm.tm_hour < 0) return -1; - tm.tm_min = yyMinutes; - tm.tm_sec = yySeconds; + tm.tm_min = date.yyMinutes; + tm.tm_sec = date.yySeconds; } else { tm.tm_hour = tm.tm_min = tm.tm_sec = 0; } - tm.tm_hour += yyRelHour; - tm.tm_min += yyRelMinutes; - tm.tm_sec += yyRelSeconds; + tm.tm_hour += date.yyRelHour; + tm.tm_min += date.yyRelMinutes; + tm.tm_sec += date.yyRelSeconds; /* Let mktime deduce tm_isdst if we have an absolute timestamp, or if the relative timestamp mentions days, months, or years. */ - if (yyHaveDate | yyHaveDay | yyHaveTime | yyRelDay | yyRelMonth | yyRelYear) + if (date.yyHaveDate | date.yyHaveDay | date.yyHaveTime | date.yyRelDay | date.yyRelMonth | date.yyRelYear) tm.tm_isdst = -1; tm0 = tm; @@ -998,18 +974,18 @@ we apply mktime to 1970-01-02 08:00:00 instead and adjust the time zone by 24 hours to compensate. This algorithm assumes that there is no DST transition within a day of the time_t boundaries. */ - if (yyHaveZone) + if (date.yyHaveZone) { tm = tm0; if (tm.tm_year <= EPOCH - TM_YEAR_ORIGIN) { tm.tm_mday++; - yyTimezone -= 24 * 60; + date.yyTimezone -= 24 * 60; } else { tm.tm_mday--; - yyTimezone += 24 * 60; + date.yyTimezone += 24 * 60; } Start = mktime (&tm); } @@ -1018,22 +994,22 @@ return Start; } - if (yyHaveDay && !yyHaveDate) + if (date.yyHaveDay && !date.yyHaveDate) { - tm.tm_mday += ((yyDayNumber - tm.tm_wday + 7) % 7 - + 7 * (yyDayOrdinal - (0 < yyDayOrdinal))); + tm.tm_mday += ((date.yyDayNumber - tm.tm_wday + 7) % 7 + + 7 * (date.yyDayOrdinal - (0 < date.yyDayOrdinal))); Start = mktime (&tm); if (Start == (time_t) -1) return Start; } - if (yyHaveZone) + if (date.yyHaveZone) { long delta; struct tm *gmt = gmtime (&Start); if (!gmt) return -1; - delta = yyTimezone * 60L + difftm (&tm, gmt); + delta = date.yyTimezone * 60L + difftm (&tm, gmt); if ((Start + delta < Start) != (delta < 0)) return -1; /* time_t overflow */ Start += delta;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php