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) )