Google
 

Trailing-Edge - PDP-10 Archives - mit_emacs_170_teco_1220 - emacs/tparse.emacs
There are no other files named tparse.emacs in the archive.
!* -*- Teco -*- *!

!*

   TPARSE: A library for parsing dates and times.

	   Created and maintained by KMP@MIT-MC.

   Although this library was written to help out KMP's ZBabyl library,
   it functions completely independently and may be suitable for other
   applications.

Modification History:

04/14/85 137	KMP	Installed as a standard Emacs library.
01/26/85 136	KMP	Made parser ignore text between parens since people
			 were starting to put real junk there.
12/05/83 135	KMP	Fixed 10 Dec 11pm to not think 11 was the year.
			 Does some reasonableness (>24) checking on the
			 second number before assuming it's a year.
			Added abbreviations "Thurs" and "Tues".
11/29/83 134	KMP	Fixed some minor bugs in defaulting mechanism.
10/28/83 133	KMP	Added this modification history by perusing
			 backup copies of sources that were still
			 online. Functionally same as version 132.
09/03/83 132	KMP	Added support for A, AN, HENCE, FROM.
			Fixed TWENTIETH, THIRTIETH, FORTIETH, and
			 FIFTIETH to work as they should have before.
09/03/83 128	KMP	Added support for AFTER, BEFORE, AGO, ON.
09/03/83 123	KMP	Introduced basic support for parsing relative
			 offsets from an absolute time. Also added support
			 for spelled-out numbers.
09/03/83 114	KMP	Beginning of prehistory...

 *!

!~Filename~:! !Time parser macros !
TPARSE
!& Setup TPARSE Library:! !S Setup TPARSE runtime environment !

 !* How does one check for daylight time? This is otherwise wrong !
 !* half of the year						  !

-4fo..Q Timezone_GMT_Offset m.v Timezone_GMT_Offset

 0fo..Q Timezone_EDT_Offsetm.v Timezone_EDT_Offset
 0fo..Q Timezone_EST_Offsetm.v Timezone_EST_Offset

 1fo..Q Timezone_CDT_Offsetm.v Timezone_CDT_Offset
 1fo..Q Timezone_CST_Offsetm.v Timezone_CST_Offset

 2fo..Q Timezone_MDT_Offsetm.v Timezone_MDT_Offset
 2fo..Q Timezone_MST_Offsetm.v Timezone_MST_Offset

 3fo..Q Timezone_PDT_Offsetm.v Timezone_PDT_Offset
 3fo..Q Timezone_PST_Offsetm.v Timezone_PST_Offset


:i*Monday   m.vDay_Monday_Value
:i*Monday   m.vDay_Mon_Value

:i*Tuesday  m.vDay_Tuesday_Value
:i*Tuesday  m.vDay_Tue_Value
:i*Tuesday  m.vDay_Tues_Value

:i*Wednesdaym.vDay_Wednesday_Value
:i*Wednesdaym.vDay_Wed_Value

:i*Thursday m.vDay_Thursday_Value
:i*Thursday m.vDay_Thu_Value
:i*Thursday m.vDay_Thurs_Value

:i*Friday   m.vDay_Friday_Value
:i*Friday   m.vDay_Fri_Value

:i*Saturday m.vDay_Saturday_Value
:i*Saturday m.vDay_Sat_Value

:i*Sunday   m.vDay_Sunday_Value
:i*Sunday   m.vDay_Sun_Value

1 m.vMonth_January_Value
1 m.vMonth_Jan_Value
:i*January m.vMonth_1_Name

2 m.vMonth_February_Value
2 m.vMonth_Feb_Value
:i*February m.vMonth_2_Name

3 m.vMonth_March_Value
3 m.vMonth_Mar_Value
:i*March m.vMonth_3_Name

4 m.vMonth_April_Value
4 m.vMonth_Apr_Value
:i*April m.vMonth_4_Name

5 m.vMonth_May_Value
:i*May m.vMonth_5_Name

6 m.vMonth_June_Value
6 m.vMonth_Jun_Value
:i*June m.vMonth_6_Name

7 m.vMonth_July_Value
7 m.vMonth_Jul_Value
:i*July m.vMonth_7_Name

8 m.vMonth_August_Value
8 m.vMonth_Aug_Value
:i*August m.vMonth_8_Name

9 m.vMonth_September_Value
9 m.vMonth_Sep_Value
9 m.vMonth_Sept_Value
:i*September m.vMonth_9_Name

10 m.vMonth_October_Value
10 m.vMonth_Oct_Value
:i*October m.vMonth_10_Name

11 m.vMonth_November_Value
11 m.vMonth_Nov_Value
:i*November m.vMonth_11_Name

12 m.vMonth_December_Value
12 m.vMonth_Dec_Value
:i*December m.vMonth_12_Name
!& Parse Date:! !S Parses a date/time string
With no precomma arg, uses current point to end of buffer.
With a precomma arg, uses that string.

Returns a string which is a parse of the given time.
An additional value (precomma) is returned which is 0 or a day of week string
if possible to determine!

 ff"n f[bbindw g() j '	    !* Maybe bind temp buffer	!

 [0[1[2[3 [S[M[H [D[O[Y [Q [W [P[N[X [R  !* Temp qregs			!

 -1uS -1uM -1uH			    !* Initialize Sec, Min, Hrs		!
 -1uD -1uO -1uY			    !*		  Day, Mon, Yrs		!
 -1uN				    !*	An unassigned number		!
 0uX 0uQ 0uR 0uW		    !* State (1 Time, 2 Date, 4 Dow)	!
 
 !Main!

 @f-_	
l
 .-z"e oRet '

 1a-("e fll oMain'

 1a-,"e c qO:"l qN:"l qD"l 
   qNuD -1uN''' oMain'		    !* Watch for MONTH DAY, YR		!

 .uP \u1 .-qP"n			    !* q1: a number (maybe)		!
   qN:"l oSyn'			    !*  Don't lose data			!
   q1uN oNum '			    !*  If so, update qN		!

 fwx0 fwl			    !* q0: Next word			!
  0fo..Q Month_0_Valueu1	    !* Look for Month name		!
   q1"n qN:"l qNuD -1uN'
        qX2uX			    !* Acknowledge part of date seen	!
        q1uO oMain'		    !*  Hack month			!
  0fo..Q Day_0_Valueu1	    !* Look for Day of Week name	!
   q1"n q1uW oMain'		    !*  Hack day of week		!
  f~0PM"e !Eve!
   qH"l qN"l oSyn' qN-12"g oSyn '
        qNuH -1uN'
     "# qN:"l oSyn ' '		    !* This might have meaning?		!
   qH-12"e 0uH '
   qH+12uH oMain '
  f~0AM"e !Morn!
   qH"l qN"l oSyn' qN-12"g oSyn '
        qNuH -1uN'
     "# qN:"l oSyn ' '		    !* Ditto				!
   qH-12"e 0uH '
   oMain'    
 f~0the"e oMain'
 1000 fo..Q Timezone_0_Offsetu1 q1-1000"n q1+qQuQ oMain '
 f~0at"e oMain'
 f~0in"e oMain'
 f~0on"e oMain'

 f~0st"e oDate-End '
 f~0nd"e oDate-End '
 f~0rd"e oDate-End '
 f~0th"e oDate-End '

 f~0o"e qN:"l !"! fwf~'clock"e fwl qNuH qX1uX -1uN oMain '''
 f~0a"e oMain '


 f~0noon"e      qX&1"n oSyn ' 12uH 0uM 0uS qX1uX oMain '

 f~0now"e	  qX1uX oMain '
 f~0today"e		  oMain '
 f~0tomorrow"e   qQ+24uQ oMain '
 f~0yesterday"e  qQ-24uQ oMain '

 f~0hence"e qX1uX :i0after '    !* Simulate the effect of AFTER NOW !

 (f~0after"'e)(f~0from"'e)"n qN:"l oSyn '  qR+qQuQ 0uR oMain '
 (f~0ago"'e)(f~0before"'e)"n qN:"l oSyn ' -qR+qQuQ 0uR oMain '

 f~0of"e qR:"g oMain ' qR/24*24-qR"n oSyn '
   qR-24+qQuQ 0uR oMain '

 (f~0wk"'e)(f~0wks"'e)(f~0week"'e)(f~0weeks"'e)"n 
   qNf"lw1'*168+qRuR -1uN oMain'
 (f~0dy"'e)(f~0dys"'e)(f~0day "'e)(f~0days "'e)"n
   qNf"lw1'* 24+qRuR -1uN oMain'
 (f~0hr"'e)(f~0hrs"'e)(f~0hour"'e)(f~0hours"'e)"n
   qNf"lw1'    +qRuR -1uN oMain'

 (f~0afternoon"'e)(f~0evening"'e)(f~0night"'e)(f~0late"'e)"n oEve '
 (f~0morning"'e)(f~0early"'e)"n oMorn '

 !* This stuff comes last since it is slowest... !

 qN"l
  (f~0 fifty   "'e)(f~0 fiftieth "'e)"n 50uN o CK units'
  (f~0 forty   "'e)(f~0 fortieth "'e)"n 40uN o CK units'
  (f~0 thirty  "'e)(f~0 thirtieth"'e)"n 30uN o CK units'
  (f~0 twenty  "'e)(f~0 twentieth"'e)"n 20uN o CK units'
  oNoTens
  !CKunits!
  0,1a--"e c 0,1a"a .,(fwl.)x0 oUnits '' oNum 
  !NoTens!
  (f~0 nineteen  "'e)(f~0 nineteenth  "'e)"n 19uN '
  (f~0 eighteen  "'e)(f~0 eighteenth  "'e)"n 18uN '
  (f~0 seventeen "'e)(f~0 seventeenth "'e)"n 17uN '
  (f~0 sixteen   "'e)(f~0 sixteenth   "'e)"n 16uN '
  (f~0 fifteen   "'e)(f~0 fifteenth   "'e)"n 15uN '
  (f~0 fourteen  "'e)(f~0 fourteenth  "'e)"n 14uN '
  (f~0 thirteen  "'e)(f~0 thirteenth  "'e)"n 13uN '
  (f~0 twelve    "'e)(f~0 twelfth     "'e)"n 12uN '
  (f~0 eleven    "'e)(f~0 eleventh    "'e)"n 11uN '
  (f~0 ten       "'e)(f~0 tenth       "'e)"n 10uN '
  !Units!
  (f~0 nine      "'e)(f~0 ninth       "'e)"n qN"l 0uN ' qN+9uN '
  (f~0 eight     "'e)(f~0 eighth      "'e)"n qN"l 0uN ' qN+8uN '
  (f~0 seven     "'e)(f~0 seventh     "'e)"n qN"l 0uN ' qN+7uN '
  (f~0 six       "'e)(f~0 sixth       "'e)"n qN"l 0uN ' qN+6uN '
  (f~0 five      "'e)(f~0 fifth       "'e)"n qN"l 0uN ' qN+5uN '
  (f~0 four      "'e)(f~0 fourth      "'e)"n qN"l 0uN ' qN+4uN '
  (f~0 three     "'e)(f~0 third       "'e)"n qN"l 0uN ' qN+3uN '
  (f~0 two       "'e)(f~0 second      "'e)"n qN"l 0uN ' qN+2uN '
  (f~0an)(f~0a)(
   f~0 one       "'e)(f~0 first       "'e)"n qN"l 0uN ' qN+1uN '
  qN:"l oNum ''

 !Syn!

 :i*SYN	Syntax_error_in_time_specfserr

 !Date-End!

 qN"g qN-32"l qNuD -1uN qX2uX oMain''
 oSyn 

 !Num!				    !* qN must have a number in it	!
				    !*  if a go is done to this tag.	!

 qN-1899"g qY"l qN-1900uY -1uN qX2uX oMain''

 .-qP-3"l
  0,1a-:"e 
   qX&1"n oSyn ' qX1uX 
   qN-24"g oSyn '
   qNuH -1uN c \uM 
   0,1a-:"e c \uS '"# 0uS '
   oMain'
  (0,1a-/)*(0,1a--)"e
   qX&2"n oSyn ' qX2uX
   c .uP \u0 .-qP"e oNotDate '
   qN-12"g oSyn '
   qNuO -1uN q0uD
   (0,1a-/)*(0,1a--)"e c \uY '"# 0uY '
   oMain''

 !NotDate!
 qD:"l qO:"l qY"l qN-24"g qNuY qX2uX -1uN oMain''''

 qY:"l qO:"l qD:"l
  qX&1"e .-qP-2:"g qN-25"l oMain ''
         qN/100uH qN-(qH*100)uM 0uS qX2uX -1uN oMain ''''

 qO:"l qD"l (qX&1"'n)*((qH:"'l)*(qM:"'l)*(qS:"'l)"'e)"e 
    qNuD qX2uX -1uN oMain '''
 

 oMain

 !Ret!

 qN:"l
  qD"l         qNuD -1uN qX2uX oDefaults '
  qY"l qY-24"g qNuY -1uN qX2uX oDefaults ''
  qH"l         qNuH -1uN qX1uX oDefaults '
  :i*NOP	Number_out_of_placefserr '

 !Defaults!

 f[bbind			    !* Bind fresh buffer		!
 fsdatefsfdconv		    !* Get current date in buffer	!
 qX&1"n qH"l qM"l qS"l		    !* If time marked but not given,...	!
  9j \uH c \uM c \uS''''
 qS"l 0uS' qM"l 0uM' qH"l 0uH'	    !* Default time			!
 qY"l qO"l qD"l qX&2"n oToday''''  !* Force today default in some cases!
 qX&2"e				    !* If date not given		!
  !Today! j \uO c \uD c \uY'	    !*  use today			!
 qY"l 6j\uY '			    !* Default year is current		!
 qO"l qD:"l j\uO '		    !* If date given, default this month!
	 "# 1uO ''		    !*  else use January		!
 qD"l 1uD '			    !* Default date is the 1st		!

 hk				    !* Empty buffer			!

 qQ"n
  1+(2*(qQ"'g))u0		    !* q0: 1 or -1			!
  qH+qQuH			    !* Affect hours			!
  < 1,m(m.m &_Normalize_Date)
    qH:"l qH-24"l 0; ''		    !* Check date out of bounds		!
    24*q0+qHuH			    !* Normalize hours			!
    qD-q0uD 0uW >'		    !* and affect date			!

     qO-10"l i0 ' gO i/ qD-10"l i0 ' gD i/ qY-10"l i0 ' gY 
 i_ qH-10"l i0 ' gH i: qM-10"l i0 ' gM i: qS-10"l i0 ' gS

 m(m.m&_Date_to_DOW)[X		    !* Get DOW in qX		!
 qW"e qXuW '			    !* Maybe just use that DOW	!
   "# 0,3:gW[0 f~X0"n
      hx*[1 
      !"!
      :i*DDM	Day/Date_Mismatch:__Isn't_it_X,_1_rather_than_0fserr ''

 qW,(hx*)			    !* Return !
!& Normalize Date:! !& Correct for date underflow/overflow. 
Expects date in qY,qO,qD and day of week (if any) in qW !

 qD"g qD-29"l 0  ''		    !* If qD is in safe range, just return  !
 m(m.m &_Date_to_DOW)[TuT	    !* T: Target Day of week		    !
 [X				    !* Temp qreg			    !
 qD:"g				    !* If qD is smaller than 1,...	    !
  qO-1uO 28uD			    !* O: Previous month		    !
  qO"e 12uO qY-1uY '		    !* Hack qO,qY if crossing year bound    !
  m(m.m &_Date_to_DOW)uXuX	    !* X: New day of week number	    !
  qT-qX"l qT+7uT '		    !* Make sure qT is greater than qX	    !
  qD+qT-qXuD'			    !* D: Normalized date		    !
 "# [Y[O[D			    !* Else,... Bind temps		    !
  1uD qO+1uO qO-13"e 1uO qY+1uY '   !* Select day 1 of subsequent month	    !
  m(m.m &_Date_to_DOW)uXuX	    !* X: Day of week for that day	    !
  qX-qT"e ]*]*]* ''		    !* If same day of week, keep D,O,Y	    !
 				    !* Return				    !
!& Compare Dates:! !S Compares two date strings as numeric arg1 and arg2.
Returns 0 if the dates are the same, 1 if in the right order, and -1 if
they are in reverse order!

 f[bbind			    !* Temp buffer		!
 [1[2
 hk g() j			    !* Get into buffer		!
 m(m.m &_Parse_Date)u1		    !* Parse date 1		!
 hk g1 j fsfdconvu1		    !*  and convert format	!
 hk g() j			    !* Get into buffer		!
 m(m.m &_Parse_Date)u2		    !* Parse date 2		!
 hk g2 j fsfdconvu2		    !*  and convert format	!
 q2-q1"e 0 '			    !*  0 = Same		!
 q2-q1"g 1 '			    !*  1 = in order		!
 -1 				    !* -1 = reversed		!
!& Date to DOW:! !& Returns a day index and day of week string for a date
Expects its arguments to be set up in qY (Year), qO (Month), and qD (Date)!


qO-14/12+(1900+qY)[A		    !* qA: Magic temp	!
qO+10/(-13)*12+10+qO*13-1/5+qD+77[B !* qB: Temp		!
qA-(qA/100*100)*5/4[C		    !* qC: Temp		!
qA/(-2000)+(qA/400)+(qA/(-100)*2)+qC+qBuB
qB-(qB/7*7)uB
qB,( qB*3uB qB,(qB+3):g(:i*SunMonTueWedThuFriSat) )