PDP-10 Archive: emacs/tparse.emacs from mit_emacs_170_teco_1220 (original) (raw)


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

:iMonday m.vDay_Monday_Value :iMonday m.vDay_Mon_Value

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

:iWednesdaym.vDay_Wednesday_Value :iWednesdaym.vDay_Wed_Value

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

:iFriday m.vDay_Friday_Value :iFriday m.vDay_Fri_Value

:iSaturday m.vDay_Saturday_Value :iSaturday m.vDay_Sat_Value

:iSunday m.vDay_Sunday_Value :iSunday 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 ! f0PM"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 ' f0AM"e !Morn! qH"l qN"l oSyn' qN-12"g oSyn ' qNuH -1uN' "# qN:"l oSyn ' ' !* Ditto ! qH-12"e 0uH ' oMain'
f0the"e oMain' 1000 fo..Q Timezone_0_Offsetu1 q1-1000"n q1+qQuQ oMain ' f0at"e oMain' f0in"e oMain' f0on"e oMain'

f0st"e oDate-End ' f0nd"e oDate-End ' f0rd"e oDate-End ' f0th"e oDate-End '

f0o"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 '

f0now"e qX1uX oMain ' f0today"e oMain ' f0tomorrow"e qQ+24uQ oMain ' f0yesterday"e qQ-24uQ oMain '

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

(f0after"'e)(f0from"'e)"n qN:"l oSyn ' qR+qQuQ 0uR oMain ' (f0ago"'e)(f0before"'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 '

(f0wk"'e)(f0wks"'e)(f0week"'e)(f0weeks"'e)"n qNf"lw1'168+qRuR -1uN oMain' (f0dy"'e)(f0dys"'e)(f0day "'e)(f0days "'e)"n qNf"lw1' 24+qRuR -1uN oMain' (f0hr"'e)(f0hrs"'e)(f0hour"'e)(f0hours"'e)"n qNf"lw1' +qRuR -1uN oMain'

(f0afternoon"'e)(f0evening"'e)(f0night"'e)(f0late"'e)"n oEve ' (f0morning"'e)(f0early"'e)"n oMorn '

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

qN"l (f0 fifty "'e)(f0 fiftieth "'e)"n 50uN o CK units' (f0 forty "'e)(f0 fortieth "'e)"n 40uN o CK units' (f0 thirty "'e)(f0 thirtieth"'e)"n 30uN o CK units' (f0 twenty "'e)(f0 twentieth"'e)"n 20uN o CK units' oNoTens !CKunits! 0,1a--"e c 0,1a"a .,(fwl.)x0 oUnits '' oNum !NoTens! (f0 nineteen "'e)(f0 nineteenth "'e)"n 19uN ' (f0 eighteen "'e)(f0 eighteenth "'e)"n 18uN ' (f0 seventeen "'e)(f0 seventeenth "'e)"n 17uN ' (f0 sixteen "'e)(f0 sixteenth "'e)"n 16uN ' (f0 fifteen "'e)(f0 fifteenth "'e)"n 15uN ' (f0 fourteen "'e)(f0 fourteenth "'e)"n 14uN ' (f0 thirteen "'e)(f0 thirteenth "'e)"n 13uN ' (f0 twelve "'e)(f0 twelfth "'e)"n 12uN ' (f0 eleven "'e)(f0 eleventh "'e)"n 11uN ' (f0 ten "'e)(f0 tenth "'e)"n 10uN ' !Units! (f0 nine "'e)(f0 ninth "'e)"n qN"l 0uN ' qN+9uN ' (f0 eight "'e)(f0 eighth "'e)"n qN"l 0uN ' qN+8uN ' (f0 seven "'e)(f0 seventh "'e)"n qN"l 0uN ' qN+7uN ' (f0 six "'e)(f0 sixth "'e)"n qN"l 0uN ' qN+6uN ' (f0 five "'e)(f0 fifth "'e)"n qN"l 0uN ' qN+5uN ' (f0 four "'e)(f0 fourth "'e)"n qN"l 0uN ' qN+4uN ' (f0 three "'e)(f0 third "'e)"n qN"l 0uN ' qN+3uN ' (f0 two "'e)(f0 second "'e)"n qN"l 0uN ' qN+2uN ' (f0an)(f0a)( f0 one "'e)(f0 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 ! 24q0+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+qO13-1/5+qD+77[B !* qB: Temp ! qA-(qA/100100)5/4[C ! qC: Temp ! qA/(-2000)+(qA/400)+(qA/(-100)2)+qC+qBuB qB-(qB/77)uB qB,( qB3uB qB,(qB+3):g(:i*SunMonTueWedThuFriSat) )