hholzgra                Tue Nov 18 01:45:03 2003 EDT

  Modified files:              
    /php-src/ext/standard       parsedate.y 
  Log:
  make strtotime() understand the datetime format used with XML Schema
  
  
Index: php-src/ext/standard/parsedate.y
diff -u php-src/ext/standard/parsedate.y:1.43 php-src/ext/standard/parsedate.y:1.44
--- php-src/ext/standard/parsedate.y:1.43       Tue Nov 11 21:55:03 2003
+++ php-src/ext/standard/parsedate.y    Tue Nov 18 01:45:01 2003
@@ -8,7 +8,7 @@
 **  This code is in the public domain and has no copyright.
 */
 
-/* $Id: parsedate.y,v 1.43 2003/11/12 02:55:03 iliaa Exp $ */
+/* $Id: parsedate.y,v 1.44 2003/11/18 06:45:01 hholzgra Exp $ */
 
 #include "php.h"
 
@@ -136,6 +136,7 @@
        int     yyRelMonth;
        int     yyRelSeconds;
        int     yyRelYear;
+       int yyFlag;
 };
 
 typedef union _date_ll {
@@ -150,30 +151,30 @@
 
 %}
 
-/* This grammar has 17 shift/reduce conflicts. */
-%expect 17
+/* This grammar has 19 shift/reduce conflicts. */
+%expect 19
 %pure_parser
 
-%token tAGO tDAY tDAY_UNIT tDAYZONE tDST tHOUR_UNIT tID
+%token tAGO tDAY tDAY_UNIT tDAYZONE tDST tHOUR_UNIT tID tTZONE tZZONE 
 %token tMERIDIAN tMINUTE_UNIT tMONTH tMONTH_UNIT
 %token tSEC_UNIT tSNUMBER tUNUMBER tYEAR_UNIT tZONE
 
 %type  <Number>        tDAY tDAY_UNIT tDAYZONE tHOUR_UNIT tMINUTE_UNIT
 %type  <Number>        tMONTH tMONTH_UNIT
-%type  <Number>        tSEC_UNIT tSNUMBER tUNUMBER tYEAR_UNIT tZONE
+%type  <Number>        tSEC_UNIT tSNUMBER tUNUMBER tYEAR_UNIT tZONE tTZONE tZZONE 
 %type  <Meridian>      tMERIDIAN o_merid
 
 %%
 
 spec   : /* NULL */
        | spec item
-       ;
+    ;
 
 item   : time {
            ((struct date_yy *)parm)->yyHaveTime++;
        }
        | zone {
-           ((struct date_yy *)parm)->yyHaveZone++;
+               ((struct date_yy *)parm)->yyHaveZone++;
        }
        | date {
            ((struct date_yy *)parm)->yyHaveDate++;
@@ -251,7 +252,26 @@
        | /* empty */
        ;
 
-zone   : tZONE {
+       /* we have to deal with a special case for the datetime format 
+          of XML Schema here: '2003-11-18T22:40:00Z'
+          the combination of a 'T' timezone specifier later followed
+          by a 'Z' is now recognized and allowed
+          TODO: change the grammer so that the exact positions are checked
+          right now '2003-11-18 22:40:00 TZ' is also accepted (hartmut)
+       */
+          
+zone   : tTZONE {
+           ((struct date_yy *)parm)->yyFlag = 1;
+           ((struct date_yy *)parm)->yyTimezone = $1;
+       }
+       | tZZONE {
+               if (((struct date_yy *)parm)->yyFlag) {
+               ((struct date_yy *)parm)->yyHaveZone--;
+                       ((struct date_yy *)parm)->yyFlag = 0;
+               }
+           ((struct date_yy *)parm)->yyTimezone = $1;
+       }
+       | tZONE {
            ((struct date_yy *)parm)->yyTimezone = $1;
        }
        | tDAYZONE {
@@ -659,13 +679,13 @@
     { "q",     tZONE,  HOUR (- 4) },
     { "r",     tZONE,  HOUR (- 5) },
     { "s",     tZONE,  HOUR (- 6) },
-    { "t",     tZONE,  HOUR (- 7) },
+    { "t",     tTZONE, 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) },
+    { "z",     tZZONE, HOUR (  0) },
     { NULL, 0, 0 }
 };
 
@@ -969,6 +989,7 @@
   date.yyHaveRel = 0;
   date.yyHaveTime = 0;
   date.yyHaveZone = 0;
+  date.yyFlag = 0;
 
   if (yyparse ((void *)&date)
       || date.yyHaveTime > 1 || date.yyHaveZone > 1 
@@ -1050,6 +1071,7 @@
       if (!gmt)
        return -1;
       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

Reply via email to