?TACL ROUTINE #FRAME { Inputs date, time, and increment in the form YYMMDD HHMMSS number UNIT } { where UNIT is one of MONTH, DAY, HOUR, or MINUTE } { Outputs date, time in the form YYMMDD HHMMSS } #PUSH date,time,number #PUSH ccyy,year,month,day,hour,minute,second #PUSH charcount [#CASE [#ARGUMENT/TEXT date/NUMBER END] |1| #SET charcount [#CHARCOUNT date] [#IF (charcount = 6) |THEN| |ELSE| #OUTPUT Error! Expecting DATE in the form YYMMDD. #UNFRAME #RETURN ] #SET year [#CHARGET date 1 FOR 2] #SET month [#CHARGET date 3 FOR 2] #SET day [#CHARGET date 5 FOR 2] [#IF ([year]<70) |THEN| #SET ccyy [#COMPUTE 2000 + [year]] |ELSE| #SET ccyy [#COMPUTE 1900 + [year]] ] [#IF ([month]<1) OR ([month] > 12) |THEN| #OUTPUT Illegal MONTH value! Must be a number in the range 1 to 12. #UNFRAME #RETURN ] [#IF ([day]<1) OR ([day] > 31) |THEN| #OUTPUT Illegal DAY value! Must be a number in the range 1 to 31. #UNFRAME #RETURN ] SINK [#ARGUMENT/TEXT time/NUMBER] #SET hour [#CHARGET time 1 FOR 2] #SET minute [#CHARGET time 3 FOR 2] #SET second [#CHARGET time 5 FOR 2] #SET charcount [#CHARCOUNT time] [#IF (charcount = 6) |THEN| |ELSE| #OUTPUT Error! Expecting TIME in the form HHMMSS. #UNFRAME #RETURN ] [#IF ([hour]>23) |THEN| #OUTPUT Illegal HOUR value! Must be a number less than 24. #UNFRAME #RETURN ] [#IF ([minute]>59) |THEN| #OUTPUT Illegal MINUTE value! Must be a number less than 60. #UNFRAME #RETURN ] [#IF ([second]>59) |THEN| #OUTPUT Illegal SECOND value! Must be a number less than 60. #UNFRAME #RETURN ] [#DEF return^data MACRO |BODY| [#IF ([ccyy]< 2000) |THEN| #SET year [#COMPUTE [ccyy] - 1900] |ELSE| #SET year [#COMPUTE [ccyy] - 2000] ] #SET year [^utils:z^two^digits [#COMPUTE [year]]] #SET month [^utils:z^two^digits [#COMPUTE [month]]] #SET day [^utils:z^two^digits [#COMPUTE [day]]] #SET hour [^utils:z^two^digits [#COMPUTE [hour]]] #SET minute [^utils:z^two^digits [#COMPUTE [minute]]] #SET second [^utils:z^two^digits [#COMPUTE [second]]] #RESULT [year][month][day] [hour][minute][second] ] [#DEF process^month MACRO |BODY| #SET month [#COMPUTE [month] + [number]] [#IF ([month]>12) |THEN| #SET month [#COMPUTE [month] - 12] #SET ccyy [#COMPUTE [ccyy] + 1] ] return^data ] [#DEF process^day MACRO |BODY| #FRAME #PUSH julianday #SETMANY julianday _ _ _ , [#COMPUTEJULIANDAYNO [ccyy] [month] [day]] #SET julianday [#COMPUTE [julianday] + [number]] #SETMANY ccyy month day , [#INTERPRETJULIANDAYNO [julianday]] #UNFRAME return^data ] [#DEF process^hour MACRO |BODY| #FRAME #PUSH timestamp #SETMANY timestamp _ _ _ _ _ _ _ _ , [#COMPUTETIMESTAMP [ccyy] [month] [day] [hour] [minute] [second] 0 0] #SET timestamp [#COMPUTE [timestamp] + [number] * 3600 * 1000000 ] #SETMANY _ ccyy month day hour minute second _ _ , [#INTERPRETTIMESTAMP [timestamp]] #UNFRAME return^data ] [#DEF process^minute MACRO |BODY| #FRAME #PUSH timestamp #SETMANY timestamp _ _ _ _ _ _ _ _ , [#COMPUTETIMESTAMP [ccyy] [month] [day] [hour] [minute] [second] 0 0] #SET timestamp [#COMPUTE [timestamp] + [number] * 60 * 1000000 ] #SETMANY _ ccyy month day hour minute second _ _ , [#INTERPRETTIMESTAMP [timestamp]] #UNFRAME return^data ] SINK [#ARGUMENT/TEXT number/NUMBER] [#CASE [#ARGUMENT KEYWORD /WORDLIST MONTH / KEYWORD /WORDLIST MONTHS / KEYWORD /WORDLIST DAY / KEYWORD /WORDLIST DAYS / KEYWORD /WORDLIST HOUR / KEYWORD /WORDLIST HOURS / KEYWORD /WORDLIST MINUTE / KEYWORD /WORDLIST MINUTES/ ] |1| process^month |2| process^month |3| process^day |4| process^day |5| process^hour |6| process^hour |7| process^minute |8| process^minute |OTHERWISE| ] |2| { help } #OUTPUT #OUTPUT Returns a DATE and TIME, incremented by the specified amount. #OUTPUT #OUTPUT FORMAT: DATE TIME # UNIT #OUTPUT #OUTPUT where DATE is in the form YYMMDD #OUTPUT and TIME is in the form HHMMSS #OUTPUT and # is an integer number by which to increment the date/time #OUTPUT and UNIT is either MONTH(s), DAY(s), HOUR(s), or MINUTE(s). #OUTPUT #OUTPUT EXAMPLES: #OUTPUT . #OUTPUT . To add 1 week to January 3rd, 1991, 2:32pm #OUTPUT . #OUTPUT . DATETIME 910103 143200 7 DAYS #OUTPUT . #OUTPUT . To add 1 hour to February 14th, 8:02:04pm #OUTPUT . #OUTPUT DATETIME 910214 200204 1 HOUR #OUTPUT |OTHERWISE| ] #UNFRAME