home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Utilities / byacc 1.8.2 / test / getdate.y < prev    next >
Encoding:
Text File  |  1993-02-04  |  15.3 KB  |  743 lines  |  [TEXT/R*ch]

  1. %token ID MONTH DAY MERIDIAN NUMBER UNIT MUNIT SUNIT ZONE DAYZONE AGO
  2. %{
  3. #     Steven M. Bellovin (unc!smb)
  4. #    Dept. of Computer Science
  5. #    University of North Carolina at Chapel Hill
  6. #    @(#)getdate.y    2.13    9/16/86
  7. #
  8. #    Richard J. Ohnemus (rick@IMD.Sterling.COM)
  9. #    (Where do I work??? I'm not even sure who I am! 8-{)
  10. #    04/24/92  converted to PERL.
  11. #    07/06/92  New date format (MONTH NUMBER NUMBER ':' NUMBER ':' NUMBER)
  12. #          suggested by Raphael Manfredi <ram@eiffel.com>.
  13. #    07/08/92  Fixed table search in &lookup.
  14. #          Call &localtime with correct value in &monthadd.
  15. #    10/08/92  Numeric values starting with pattern '0+[89]' interpretted
  16. #          correctly.
  17. #          Corrected European Western and Eastern time offsets.
  18. #          Borrowed code from timelocal.pl to determine timezone offset
  19. #          from GMT.
  20. #    10/10/92  Handle time zone offsets correctly (sign was reversed).
  21. #          Set global time zone variable ('ourzone') correctly.
  22.  
  23. package getdate;
  24.  
  25. $AM = 1;
  26. $PM = 2;
  27. $DAYLIGHT = 1;
  28. $STANDARD = 2;
  29. $MAYBE = 3;
  30.  
  31. @mdays = (31, 0, 31,  30, 31, 30,  31, 31, 30,  31, 30, 31);
  32. $epoch = 1970;
  33. $daysec = 24 * 60 * 60;
  34. %}
  35.  
  36. %%
  37. timedate:         /* empty */
  38.     | timedate item
  39.     ;
  40.  
  41. item:    tspec =
  42.         {
  43.             $timeflag++;
  44.         }
  45.     | zone =
  46.         {
  47.             $zoneflag++;
  48.         }
  49.     | dtspec =
  50.         {
  51.             $dateflag++;
  52.         }
  53.     | dyspec =
  54.         {
  55.             $dayflag++;
  56.         }
  57.     | rspec =
  58.         {
  59.             $relflag++;
  60.         }
  61.     | nspec
  62.     ;
  63.  
  64. nspec:    NUMBER =
  65.         {
  66.             if ($timeflag && $dateflag && !$relflag) {
  67.             $year = $1;
  68.             }
  69.             else {
  70.             $timeflag++;
  71.             $hh = int($1 / 100);
  72.             $mm = $1 % 100;
  73.             $ss = 0;
  74.             $merid = 24;
  75.             }
  76.         }
  77.     ;
  78.  
  79. tspec:    NUMBER MERIDIAN =
  80.         {
  81.             $hh = $1;
  82.             $mm = 0;
  83.             $ss = 0;
  84.             $merid = $2;
  85.         }
  86.     | NUMBER ':' NUMBER =
  87.         {
  88.             $hh = $1;
  89.             $mm = $3;
  90.             $merid = 24;
  91.         }
  92.     | NUMBER ':' NUMBER MERIDIAN =
  93.         {
  94.             $hh = $1;
  95.             $mm = $3;
  96.             $merid = $4;
  97.         }
  98.     | NUMBER ':' NUMBER NUMBER =
  99.         {
  100.             $hh = $1;
  101.             $mm = $3;
  102.             $merid = 24;
  103.             $daylight = $STANDARD;
  104.             $ourzone = -($4 % 100 + 60 * int($4 / 100));
  105.         }
  106.     | NUMBER ':' NUMBER ':' NUMBER =
  107.         {
  108.             $hh = $1;
  109.             $mm = $3;
  110.             $ss = $5;
  111.             $merid = 24;
  112.         }
  113.     | NUMBER ':' NUMBER ':' NUMBER MERIDIAN =
  114.         {
  115.             $hh = $1;
  116.             $mm = $3;
  117.             $ss = $5;
  118.             $merid = $6;
  119.         }
  120.     | NUMBER ':' NUMBER ':' NUMBER NUMBER =
  121.         {
  122.             $hh = $1;
  123.             $mm = $3;
  124.             $ss = $5;
  125.             $merid = 24;
  126.             $daylight = $STANDARD;
  127.             $ourzone = -($6 % 100 + 60 * int($6 / 100));
  128.         }
  129.     ;
  130.  
  131. zone:    ZONE =
  132.         {
  133.             $ourzone = $1;
  134.             $daylight = $STANDARD;
  135.         }
  136.     | DAYZONE =
  137.         {
  138.             $ourzone = $1;
  139.             $daylight = $DAYLIGHT;
  140.         }
  141.     ;
  142.  
  143. dyspec:    DAY =
  144.         {
  145.             $dayord = 1;
  146.             $dayreq = $1;
  147.         }
  148.     | DAY ',' =
  149.         {
  150.             $dayord = 1;
  151.             $dayreq = $1;
  152.         }
  153.     | NUMBER DAY =
  154.         {
  155.             $dayord = $1;
  156.             $dayreq = $2;
  157.         }
  158.     ;
  159.  
  160. dtspec:    NUMBER '/' NUMBER =
  161.         {
  162.             $month = $1;
  163.             $day = $3;
  164.         }
  165.     | NUMBER '/' NUMBER '/' NUMBER =
  166.         {
  167.             /*
  168.              * HACK ALERT!!!!
  169.              * The 1000 is a magic number to attempt to force
  170.              * use of 4 digit years if year/month/day can be
  171.              * parsed. This was only done for backwards
  172.              * compatibility in rh.
  173.              */
  174.             if ($1 > 1000) {
  175.             $year = $1;
  176.             $month = $3;
  177.             $day = $5;
  178.             }
  179.             else {
  180.             $month = $1;
  181.             $day = $3;
  182.             $year = $5;
  183.             }
  184.         }
  185.     | MONTH NUMBER =
  186.         {
  187.             $month = $1;
  188.             $day = $2;
  189.         }
  190.     | MONTH NUMBER ',' NUMBER =
  191.         {
  192.             $month = $1;
  193.             $day = $2;
  194.             $year = $4;
  195.         }
  196.     | MONTH NUMBER NUMBER ':' NUMBER =
  197.         {
  198.             $month = $1;
  199.             $day = $2;
  200.             $hh = $3;
  201.             $mm = $5;
  202.             $merid = 24;
  203.             $timeflag++;
  204.         }
  205.     | MONTH NUMBER NUMBER ':' NUMBER ':' NUMBER =
  206.         {
  207.             $month = $1;
  208.             $day = $2;
  209.             $hh = $3;
  210.             $mm = $5;
  211.             $ss = $7;
  212.             $merid = 24;
  213.             $timeflag++;
  214.         }
  215.     | MONTH NUMBER NUMBER =
  216.         {
  217.             $month = $1;
  218.             $day = $2;
  219.             $year = $3;
  220.         }
  221.     | NUMBER MONTH =
  222.         {
  223.             $month = $2;
  224.             $day = $1;
  225.         }
  226.     | NUMBER MONTH NUMBER =
  227.         {
  228.             $month = $2;
  229.             $day = $1;
  230.             $year = $3;
  231.         }
  232.     ;
  233.  
  234. rspec:    NUMBER UNIT =
  235.         {
  236.             $relsec += 60 * $1 * $2;
  237.         }
  238.     | NUMBER MUNIT =
  239.         {
  240.             $relmonth += $1 * $2;
  241.         }
  242.     | NUMBER SUNIT =
  243.         {
  244.             $relsec += $1;
  245.         }
  246.     | UNIT =
  247.         {
  248.             $relsec +=  60 * $1;
  249.         }
  250.     | MUNIT =
  251.         {
  252.             $relmonth += $1;
  253.         }
  254.     | SUNIT =
  255.         {
  256.             $relsec++;
  257.         }
  258.     | rspec AGO =
  259.         {
  260.             $relsec = -$relsec;
  261.             $relmonth = -$relmonth;
  262.         }
  263.     ;
  264. %%
  265.  
  266. sub dateconv
  267. {
  268.     local($mm, $dd, $yy, $h, $m, $s, $mer, $zone, $dayflag) = @_;
  269.     local($time_of_day, $jdate);
  270.     local($i);
  271.  
  272.     if ($yy < 0) {
  273.     $yy = -$yy;
  274.     }
  275.     if ($yy < 100) {
  276.     $yy += 1900;
  277.     }
  278.     $mdays[1] =
  279.     28 + (($yy % 4) == 0 && (($yy % 100) != 0 || ($yy % 400) == 0));
  280.     if ($yy < $epoch || $yy > 2001 || $mm < 1 || $mm > 12
  281.     || $dd < 1 || $dd > $mdays[--$mm]) {
  282.     return -1;
  283.     }
  284.     $jdate = $dd - 1;
  285.     for ($i = 0; $i < $mm; $i++) {
  286.     $jdate += $mdays[$i];
  287.     }
  288.     for ($i = $epoch; $i < $yy; $i++) {
  289.     $jdate += 365 + (($i % 4) == 0);
  290.     }
  291.     $jdate *= $daysec;
  292.     $jdate += $zone * 60;
  293.     if (($time_of_day = &timeconv($h, $m, $s, $mer)) < 0) {
  294.     return -1;
  295.     }
  296.     $jdate += $time_of_day;
  297.     if ($dayflag == $DAYLIGHT
  298.     || ($dayflag == $MAYBE && (localtime($jdate))[8])) {
  299.     $jdate -= 60 * 60;
  300.     }
  301.     return $jdate;
  302. }
  303.  
  304. sub dayconv
  305. {
  306.     local($ordday, $day, $now) = @_;
  307.     local(@loctime);
  308.     local($time_of_day);
  309.  
  310.     $time_of_day = $now;
  311.     @loctime = localtime($time_of_day);
  312.     $time_of_day += $daysec * (($day - $loctime[6] + 7) % 7);
  313.     $time_of_day += 7 * $daysec * ($ordday <= 0 ? $ordday : $ordday - 1);
  314.     return &daylcorr($time_of_day, $now);
  315. }
  316.  
  317. sub timeconv
  318. {
  319.     local($hh, $mm, $ss, $mer) = @_;
  320.  
  321.     return -1 if ($mm < 0 || $mm > 59 || $ss < 0 || $ss > 59);
  322.  
  323.     if ($mer == $AM) {
  324.     return -1 if ($hh < 1 || $hh > 12);
  325.     return 60 * (($hh % 12) * 60 + $mm) + $ss;
  326.     }
  327.     if ($mer == $PM) {
  328.     return -1 if ($hh < 1 || $hh > 12);
  329.     return 60 * (($hh % 12 + 12) * 60 + $mm) + $ss;
  330.     }
  331.     if ($mer == 24) {
  332.     return -1 if ($hh < 0 || $hh > 23);
  333.     return 60 * ($hh * 60 + $mm) + $ss;
  334.     }
  335.     return -1;
  336. }
  337.  
  338. sub monthadd
  339. {
  340.     local($sdate, $relmonth) = @_;
  341.     local(@ltime);
  342.     local($mm, $yy);
  343.     
  344.     return 0 if ($relmonth == 0);
  345.  
  346.     @ltime = localtime($sdate);
  347.     $mm = 12 * $ltime[5] + $ltime[4] + $relmonth;
  348.     $yy = int($mm / 12);
  349.     $mm = $mm % 12 + 1;
  350.     return &daylcorr(&dateconv($mm, $ltime[3], $yy, $ltime[2],
  351.                    $ltime[1], $ltime[0], 24, $ourzone, $MAYBE),
  352.              $sdate);
  353. }
  354.  
  355. sub daylcorr
  356. {
  357.     local($future, $now) = @_;
  358.     local($fdayl, $nowdayl);
  359.  
  360.     $nowdayl = ((localtime($now))[2] + 1) % 24;
  361.     $fdayl = ((localtime($future))[2] + 1) % 24;
  362.     return ($future - $now) + 60 * 60 * ($nowdayl - $fdayl);
  363. }
  364.  
  365. sub yylex
  366. {
  367.     local($pcnt, $sign);
  368.  
  369.     while (1) {
  370.     $dtstr =~ s/^\s*//;
  371.     
  372.     if ($dtstr =~ /^([-+])/) {
  373.         $sign = ($1 eq '-') ? -1 : 1;
  374.         $dtstr =~ s/^.//;
  375.         if ($dtstr =~ /^(\d+)/) {
  376.         $num = $1;
  377.         $num =~ s/^0+//;
  378.         if ($num eq '') {
  379.             $yylval = 0;
  380.         }
  381.         else {
  382.             $yylval = eval "$num * $sign";
  383.         }
  384.         $dtstr =~ s/^\d+//;
  385.         return $NUMBER;
  386.         }
  387.         else {
  388.         return &yylex;
  389.         }
  390.     }
  391.     elsif ($dtstr =~ /^(\d+)/) {
  392.         $num = $1;
  393.         $num =~ s/^0+//;
  394.         if ($num eq '') {
  395.         $yylval = 0;
  396.         }
  397.         else {
  398.         $yylval = eval "$num";
  399.         }
  400.         $dtstr =~ s/^\d+//;
  401.         return $NUMBER;
  402.     }
  403.     elsif ($dtstr =~ /^([a-zA-z][a-zA-Z.]*)/) {
  404.         $dtstr = substr($dtstr, length($1));
  405.         return &lookup($1);
  406.     }
  407.     elsif ($dtstr =~ /^\(/) {
  408.         $pcnt = 0;
  409.         do {
  410.         $dtstr = s/^(.)//;
  411.         return 0 if !defined($1);
  412.         $pcnt++ if ($1 eq '(');
  413.         $pcnt-- if ($1 eq ')');
  414.         } while ($pcnt > 0);
  415.     }
  416.     else {
  417.         $yylval = ord(substr($dtstr, 0, 1));
  418.         $dtstr =~ s/^.//;
  419.         return $yylval;
  420.     }
  421.     }
  422. }
  423.  
  424.  
  425. %mdtab = (
  426.       "January",    "$MONTH,1",
  427.       "February",    "$MONTH,2",
  428.       "March",     "$MONTH,3",
  429.       "April",    "$MONTH,4",
  430.       "May",    "$MONTH,5",
  431.       "June",    "$MONTH,6",
  432.       "July",    "$MONTH,7",
  433.       "August",    "$MONTH,8",
  434.       "September",    "$MONTH,9",
  435.       "Sept",    "$MONTH,9",
  436.       "October",    "$MONTH,10",
  437.       "November",    "$MONTH,11",
  438.       "December",    "$MONTH,12",
  439.  
  440.       "Sunday",    "$DAY,0",
  441.       "Monday",    "$DAY,1",
  442.       "Tuesday",    "$DAY,2",
  443.       "Tues",    "$DAY,2",
  444.       "Wednesday",    "$DAY,3",
  445.       "Wednes",    "$DAY,3",
  446.       "Thursday",    "$DAY,4",
  447.       "Thur",    "$DAY,4",
  448.       "Thurs",    "$DAY,4",
  449.       "Friday",    "$DAY,5",
  450.       "Saturday",    "$DAY,6"
  451.       );
  452.  
  453. $HRS='*60';
  454. $HALFHR='30';
  455.  
  456. %mztab = (
  457.       "a.m.",    "$MERIDIAN,$AM",
  458.       "am",        "$MERIDIAN,$AM",
  459.       "p.m.",    "$MERIDIAN,$PM",
  460.       "pm",        "$MERIDIAN,$PM",
  461.       "nst",    "$ZONE,3 $HRS + $HALFHR",    # Newfoundland
  462.       "n.s.t.",    "$ZONE,3 $HRS + $HALFHR",
  463.       "ast",    "$ZONE,4 $HRS",            # Atlantic
  464.       "a.s.t.",    "$ZONE,4 $HRS",
  465.       "adt",    "$DAYZONE,4 $HRS",
  466.       "a.d.t.",    "$DAYZONE,4 $HRS",
  467.       "est",    "$ZONE,5 $HRS",            # Eastern
  468.       "e.s.t.",    "$ZONE,5 $HRS",
  469.       "edt",    "$DAYZONE,5 $HRS",
  470.       "e.d.t.",    "$DAYZONE,5 $HRS",
  471.       "cst",    "$ZONE,6 $HRS",            # Central
  472.       "c.s.t.",    "$ZONE,6 $HRS",
  473.       "cdt",    "$DAYZONE,6 $HRS",
  474.       "c.d.t.",    "$DAYZONE,6 $HRS",
  475.       "mst",    "$ZONE,7 $HRS",            # Mountain
  476.       "m.s.t.",    "$ZONE,7 $HRS",
  477.       "mdt",    "$DAYZONE,7 $HRS",
  478.       "m.d.t.",    "$DAYZONE,7 $HRS",
  479.       "pst",    "$ZONE,8 $HRS",            # Pacific
  480.       "p.s.t.",    "$ZONE,8 $HRS",
  481.       "pdt",    "$DAYZONE,8 $HRS",
  482.       "p.d.t.",    "$DAYZONE,8 $HRS",
  483.       "yst",    "$ZONE,9 $HRS",            # Yukon
  484.       "y.s.t.",    "$ZONE,9 $HRS",
  485.       "ydt",    "$DAYZONE,9 $HRS",
  486.       "y.d.t.",    "$DAYZONE,9 $HRS",
  487.       "hst",    "$ZONE,10 $HRS",        # Hawaii
  488.       "h.s.t.",    "$ZONE,10 $HRS",
  489.       "hdt",    "$DAYZONE,10 $HRS",
  490.       "h.d.t.",    "$DAYZONE,10 $HRS",
  491.  
  492.       "gmt",    "$ZONE,0 $HRS",
  493.       "g.m.t.",    "$ZONE,0 $HRS",
  494.       "bst",    "$DAYZONE,0 $HRS",        # British Summer Time
  495.       "b.s.t.",    "$DAYZONE,0 $HRS",
  496.       "wet",    "$ZONE,0 $HRS ",        # Western European Time
  497.       "w.e.t.",    "$ZONE,0 $HRS ",
  498.       "west",    "$DAYZONE,0 $HRS",        # Western European Summer Time
  499.       "w.e.s.t.",    "$DAYZONE,0 $HRS",
  500.  
  501.       "met",    "$ZONE,-1 $HRS",        # Middle European Time
  502.       "m.e.t.",    "$ZONE,-1 $HRS",
  503.       "mest",    "$DAYZONE,-1 $HRS",        # Middle European Summer Time
  504.       "m.e.s.t.",    "$DAYZONE,-1 $HRS",
  505.       "eet",    "$ZONE,-2 $HRS",        # European Eastern Time
  506.       "e.e.t.",    "$ZONE,-2 $HRS",
  507.       "eest",    "$DAYZONE,-2 $HRS",        # European Eastern Summer Time
  508.       "e.e.s.t.",    "$DAYZONE,-2 $HRS",
  509.       "jst",    "$ZONE,-9 $HRS",        # Japan Standard Time
  510.       "j.s.t.",    "$ZONE,-9 $HRS",        # Japan Standard Time
  511.                               # No daylight savings time
  512.  
  513.       "aest",    "$ZONE,-10 $HRS",        # Australian Eastern Time
  514.       "a.e.s.t.",    "$ZONE,-10 $HRS",
  515.       "aesst",    "$DAYZONE,-10 $HRS",        # Australian Eastern Summer Time
  516.       "a.e.s.s.t.",    "$DAYZONE,-10 $HRS",
  517.       "acst",    "$ZONE,-(9 $HRS + $HALFHR)",    # Australian Central Time
  518.       "a.c.s.t.",    "$ZONE,-(9 $HRS + $HALFHR)",
  519.       "acsst",    "$DAYZONE,-(9 $HRS + $HALFHR)",    # Australian Central Summer
  520.       "a.c.s.s.t.",    "$DAYZONE,-(9 $HRS + $HALFHR)",
  521.       "awst",    "$ZONE,-8 $HRS",        # Australian Western Time
  522.       "a.w.s.t.",    "$ZONE,-8 $HRS"            # (no daylight time there, I'm told)
  523.       );
  524.  
  525. %unittab = (
  526.        "year",    "$MUNIT,12",
  527.        "month",    "$MUNIT,1",
  528.        "fortnight",    "$UNIT,14*24*60",
  529.        "week",    "$UNIT,7*24*60",
  530.        "day",    "$UNIT,1*24*60",
  531.        "hour",    "$UNIT,60",
  532.        "minute",    "$UNIT,1",
  533.        "min",    "$UNIT,1",
  534.        "second",    "$SUNIT,1",
  535.        "sec",    "$SUNIT,1"
  536.        );
  537.  
  538. %othertab = (
  539.         "tomorrow",    "$UNIT,1*24*60",
  540.         "yesterday","$UNIT,-1*24*60",
  541.         "today",    "$UNIT,0",
  542.         "now",    "$UNIT,0",
  543.         "last",    "$NUMBER,-1",
  544.         "this",    "$UNIT,0",
  545.         "next",    "$NUMBER,2",
  546.         "first",    "$NUMBER,1",
  547.         # "second",    "$NUMBER,2",
  548.         "third",    "$NUMBER,3",
  549.         "fourth",    "$NUMBER,4",
  550.         "fifth",    "$NUMBER,5",
  551.         "sixth",    "$NUMBER,6",
  552.         "seventh",    "$NUMBER,7",
  553.         "eigth",    "$NUMBER,8",
  554.         "ninth",    "$NUMBER,9",
  555.         "tenth",    "$NUMBER,10",
  556.         "eleventh",    "$NUMBER,11",
  557.         "twelfth",    "$NUMBER,12",
  558.         "ago",    "$AGO,1"
  559.         );
  560.  
  561. %milzone = (
  562.         "a",    "$ZONE,1 $HRS",
  563.         "b",    "$ZONE,2 $HRS",
  564.         "c",    "$ZONE,3 $HRS",
  565.         "d",    "$ZONE,4 $HRS",
  566.         "e",    "$ZONE,5 $HRS",
  567.         "f",    "$ZONE,6 $HRS",
  568.         "g",    "$ZONE,7 $HRS",
  569.         "h",    "$ZONE,8 $HRS",
  570.         "i",    "$ZONE,9 $HRS",
  571.         "k",    "$ZONE,10 $HRS",
  572.         "l",    "$ZONE,11 $HRS",
  573.         "m",    "$ZONE,12 $HRS",
  574.         "n",    "$ZONE,-1 $HRS",
  575.         "o",    "$ZONE,-2 $HRS",
  576.         "p",    "$ZONE,-3 $HRS",
  577.         "q",    "$ZONE,-4 $HRS",
  578.         "r",    "$ZONE,-5 $HRS",
  579.         "s",    "$ZONE,-6 $HRS",
  580.         "t",    "$ZONE,-7 $HRS",
  581.         "u",    "$ZONE,-8 $HRS",
  582.         "v",    "$ZONE,-9 $HRS",
  583.         "w",    "$ZONE,-10 $HRS",
  584.         "x",    "$ZONE,-11 $HRS",
  585.         "y",    "$ZONE,-12 $HRS",
  586.         "z",    "$ZONE,0 $HRS"
  587.         );
  588.  
  589. sub lookup
  590. {
  591.     local($id) = @_;
  592.     local($abbrev, $idvar, $key, $token);
  593.  
  594.     $idvar = $id;
  595.     if (length($idvar) == 3) {
  596.     $abbrev = 1;
  597.     }
  598.     elsif (length($idvar) == 4 && substr($idvar, 3, 1) eq '.') {
  599.     $abbrev = 1;
  600.     $idvar = substr($idvar, 0, 3);
  601.     }
  602.     else {
  603.     $abbrev = 0;
  604.     }
  605.  
  606.     substr($idvar, 0, 1) =~ tr/a-z/A-Z/;
  607.     if (defined($mdtab{$idvar})) {
  608.     ($token, $yylval) = split(/,/,$mdtab{$idvar});
  609.     $yylval = eval "$yylval";
  610.     return $token;
  611.     }
  612.     foreach $key (keys %mdtab) {
  613.     if ($idvar eq substr($key, 0, 3)) {
  614.         ($token, $yylval) = split(/,/,$mdtab{$key});
  615.         $yylval = eval "$yylval";
  616.         return $token;
  617.     }
  618.     }
  619.     
  620.     $idvar = $id;
  621.     if (defined($mztab{$idvar})) {
  622.     ($token, $yylval) = split(/,/,$mztab{$idvar});
  623.     $yylval = eval "$yylval";
  624.     return $token;
  625.     }
  626.     
  627.     $idvar =~ tr/A-Z/a-z/;
  628.     if (defined($mztab{$idvar})) {
  629.     ($token, $yylval) = split(/,/,$mztab{$idvar});
  630.     $yylval = eval "$yylval";
  631.     return $token;
  632.     }
  633.     
  634.     $idvar = $id;
  635.     if (defined($unittab{$idvar})) {
  636.     ($token, $yylval) = split(/,/,$unittab{$idvar});
  637.     $yylval = eval "$yylval";
  638.     return $token;
  639.     }
  640.     
  641.     if ($idvar =~ /s$/) {
  642.     $idvar =~ s/s$//;
  643.     }
  644.     if (defined($unittab{$idvar})) {
  645.     ($token, $yylval) = split(/,/,$unittab{$idvar});
  646.     $yylval = eval "$yylval";
  647.     return $token;
  648.     }
  649.     
  650.     $idvar = $id;
  651.     if (defined($othertab{$idvar})) {
  652.     ($token, $yylval) = split(/,/,$othertab{$idvar});
  653.     $yylval = eval "$yylval";
  654.     return $token;
  655.     }
  656.     
  657.     if (length($idvar) == 1 && $idvar =~ /[a-zA-Z]/) {
  658.     $idvar =~ tr/A-Z/a-z/;
  659.     if (defined($milzone{$idvar})) {
  660.         ($token, $yylval) = split(/,/,$milzone{$idvar});
  661.         $yylval = eval "$yylval";
  662.         return $token;
  663.     }
  664.     }
  665.     
  666.     return $ID;
  667. }
  668.  
  669. sub main'getdate
  670. {
  671.     local($now);
  672.     local(@lt);
  673.     local($sdate);
  674.     local($TZ);
  675.  
  676.     ($dtstr, $now, $ourzone) = @_;
  677.  
  678.     if (!$now) {
  679.     $now = time;
  680.     }
  681.  
  682.     if (!$ourzone) {
  683.     $TZ = defined($ENV{'TZ'}) ? ($ENV{'TZ'} ? $ENV{'TZ'} : '') : '';
  684.     if($TZ =~
  685.        /^([^:\d+\-,]{3,})([+-]?\d{1,2}(:\d{1,2}){0,2})([^\d+\-,]{3,})?/) {
  686.         $ourzone = $2 * 60;
  687.     }
  688.     else {
  689.         @lt = localtime(0);
  690.         $ourzone = $lt[2] * 60 + $lt[1];        # minutes east of GMT
  691.         if ($ourzone > 0) {
  692.         $ourzone = 24 * 60 - $ourzone;        # minutes west of GMT
  693.             $ourzone -= 24 * 60 if $lt[5] == 70;    # account for date line
  694.         }
  695.     }
  696.     }
  697.  
  698.     @lt = localtime($now);
  699.     $year = 0;
  700.     $month = $lt[4] + 1;
  701.     $day = $lt[3];
  702.     $relsec = $relmonth = 0;
  703.     $timeflag = $zoneflag = $dateflag = $dayflag = $relflag = 0;
  704.     $daylight = $MAYBE;
  705.     $hh = $mm = $ss = 0;
  706.     $merid = 24;
  707.     
  708.     $dtstr =~ tr/A-Z/a-z/;
  709.  
  710.     return -1 if &yyparse;
  711.     
  712.     return -1 if ($timeflag > 1 || $zoneflag > 1 || $dateflag > 1 || $dayflag > 1);
  713.  
  714.     if (!$year) {
  715.     $year = ($month > ($lt[4] + 1)) ? ($lt[5] - 1) : $lt[5];
  716.     }
  717.  
  718.     if ($dateflag || $timeflag || $dayflag) {
  719.     $sdate = &dateconv($month, $day, $year, $hh, $mm, $ss,
  720.                $merid, $ourzone, $daylight);
  721.     if ($sdate < 0) {
  722.         return -1;
  723.     }
  724.     }
  725.     else {
  726.     $sdate = $now;
  727.     if ($relflag == 0) {
  728.         $sdate -= ($lt[0] + $lt[1] * 60 + $lt[2] * (60 * 60));
  729.     }
  730.     }
  731.     
  732.     $sdate += $relsec + &monthadd($sdate, $relmonth);
  733.     $sdate += &dayconv($dayord, $dayreq, $sdate) if ($dayflag && !$dateflag);
  734.     
  735.     return $sdate;
  736. }
  737.  
  738. sub yyerror
  739. {
  740. }
  741.  
  742. 1;
  743.