home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / io / io_23 / date23.pas next >
Pascal/Delphi Source File  |  1987-12-04  |  21KB  |  701 lines

  1. { DAT23.U -- Routines to write, read and compare dates, etc.,
  2.   by Bill Meacham.  Turbo Pascal ver. 3.0.
  3.   You must include IO23.INC before this file.
  4.   Ver 2.0 --  Includes type declarations in this module and allows
  5.               entry of a null date (00/00/0000) -- 1/19/86.
  6.               Cosmetic improvement -- 4/16/86.
  7.   Ver 2.1 --  Function Zeller to determine the day of the week -- 10/8/86.
  8.   Ver 2.1a -- New Read_date -- 10/11/86
  9.   Ver 2.2 --  Made compatible with IO22.INC
  10.   Ver 2.3 --  Changed beep to error_buzz -- 11/25/87
  11.               Added proc Getdate to get DOS date,
  12.               Fixed bug in Read_date -- 11/27/87
  13.               Converted to Unit -- 12/2/87 }
  14.  
  15. { -------------------------------------------------------------------------- }
  16.  
  17. unit date23 ;
  18. {$v-}
  19. interface
  20.  
  21. uses
  22.     crt, dos, io23unit ;
  23.  
  24. const
  25.     fdslen     = 29 ;  { length of fulldatestring }
  26.  
  27. type
  28.     date = record
  29.         yr : integer ; { 0 .. 9999 }
  30.         mo : integer ; { 1 .. 12 }
  31.         dy : integer ; { 1 .. 31 }
  32.       end ;
  33.  
  34.     datestring = string[10] ;  { 'MM/DD/YYYY' }
  35.  
  36.     fulldatestring = string[fdslen] ;
  37.  
  38.     juldate = record
  39.         yr  : integer ; { 0 .. 9999 }
  40.         day : integer ; { 1 .. 366 }
  41.       end ;
  42.  
  43.     juldatestring = string[8] ; { 'YYYY/DDD' }
  44.  
  45. const
  46.     null_date  : date       = (yr:0 ; mo:0 ; dy:0) ;
  47.     null_date_str : datestring = 'MM/DD/YYYY' ;
  48.  
  49. function mk_dt_st (dt : date) : datestring ;
  50.   { Makes a string out of a date -- used for printing dates }
  51. procedure write_date (dt: date ; col, row: integer) ;
  52.   { Writes date at column and row specified }
  53. function mk_jul_dt_st (jdt : juldate) : juldatestring ;
  54.   { makes a string out of a julian date }
  55. function leapyear (yr : integer) : boolean ;
  56.   { Whether the year is a leap year or not.
  57.     The year is year and century, e.g. year 1984 is '1984,' not '84' }
  58. function valid_date (dt:date) : boolean ;
  59.   { Test whether date is valid }
  60. procedure read_date (var dt: date ; col, row: integer) ;
  61.   { Read date at column and row specified.  If the user enters only
  62.     two digits for the year, the procedure plugs the century as 1900 or
  63.     2000, but the user can enter all four digits to override the plug. }
  64. function greater_date (dt1, dt2 : date) : integer ;
  65.   { Compares two dates, returns 0 if both equal, 1 if first is
  66.     greater, 2 if second is greater. }
  67. procedure greg_to_jul (dt : date ; var jdt : juldate) ;
  68.   { converts a gregorian date to a julian date }
  69. procedure jul_to_greg (jdt : juldate ; var dt : date) ;
  70.   { converts a julian date to a gregorian date }
  71. procedure next_day (var dt : date) ;
  72.   { Adds one day to the date }
  73. procedure prev_day (var dt : date) ;
  74.   { Subtracts one day from the date }
  75. function date_diff (dt1, dt2 : date) : real ;
  76.   { computes the number of days between two dates }
  77. function month_diff (dt1, dt2 : date ) : integer ;
  78.   { Computes number of months between two dates, rounded. }
  79. function equal_date (dt1, dt2 : date) : boolean ;
  80.   { Tests whether two dates are equal }
  81. function build_full_date_str (dt : date) : fulldatestring ;
  82.   { Build printable string of current date. }
  83. procedure getdate (var dt : date) ;
  84.   { get DOS system date }
  85. function date_and_time : str14 ;
  86.   { get DOS system date and time, return string }
  87.  
  88. { ========================================================================== }
  89.  
  90. implementation
  91.  
  92. type
  93.    montharray = array [1 .. 13] of integer ;
  94.  
  95. const
  96.    monthtotal : montharray = (0,31,59,90,120,151,181,212,243,273,304,334,365) ;
  97.      { used to convert julian date to gregorian and back }
  98.  
  99. { ------------------------------------------------------------ }
  100.  
  101. function mk_dt_st (dt : date) : datestring ;
  102.   { Makes a string out of a date -- used for printing dates }
  103.     var
  104.         yr_st : string[4] ;
  105.         mo_st : string[2] ;
  106.         dy_st : string[2] ;
  107.         dt_st : datestring ;
  108.     begin
  109.         with dt do
  110.           begin
  111.             if (yr=0) and (mo=0) and (dy=0) then
  112.                 dt_st := 'MM/DD/YYYY'
  113.             else
  114.               begin
  115.                 str (yr:4,yr_st) ;
  116.                 str (mo:2,mo_st) ;
  117.                 str (dy:2,dy_st) ;
  118.                 dt_st := concat (mo_st,'/',dy_st,'/',yr_st)
  119.               end  { else }
  120.           end ;  { with dt do }
  121.         mk_dt_st := dt_st
  122.     end ;  { --- proc mk_dt_st --- }
  123.  
  124. { ------------------------------------------------------------ }
  125.  
  126. procedure write_date (dt: date ; col, row: integer) ;
  127.   { Writes date at column and row specified }
  128.     var
  129.         ds : datestring ;
  130.     begin
  131.         ds := mk_dt_st (dt) ;
  132.         write_str (ds,col,row)
  133.     end ; { --- proc write_date --- }
  134.  
  135. { ------------------------------------------------------------ }
  136.  
  137. function mk_jul_dt_st (jdt : juldate) : juldatestring ;
  138. { makes a string out of a julian date }
  139.   var
  140.       yr_st  : string[4] ;
  141.       day_st : string[3] ;
  142.       jdt_st : juldatestring ;
  143.   begin
  144.       with jdt do
  145.         if (yr=0) and (day = 0) then
  146.             jdt_st := 'YYYY/DDD'
  147.         else
  148.           begin
  149.             str(yr:4,yr_st) ;
  150.             str(day:3,day_st) ;
  151.             jdt_st := concat (yr_st,'/',day_st)
  152.           end ;
  153.       mk_jul_dt_st := jdt_st
  154.   end ;  { function mk_jul_dt_st }
  155.  
  156. { ------------------------------------------------------------ }
  157.  
  158. function leapyear (yr : integer) : boolean ;
  159.   { Whether the year is a leap year or not.
  160.     The year is year and century, e.g. year 1984 is '1984,' not '84' }
  161.   begin
  162.     leapyear := ((yr mod 4 = 0) and (not(yr mod 100 = 0)))
  163.              or ( yr mod 400 = 0 )
  164.   end ;
  165.  
  166. { ------------------------------------------------------------ }
  167.  
  168. function valid_date (dt:date) : boolean ;
  169.   { Test whether date is valid }
  170.     var
  171.         bad_fld : integer ;
  172.     begin
  173.         bad_fld := 0 ;
  174.         with dt do
  175.             begin
  176.                 if (mo = 0) and (dy = 0) and (yr = 0) then
  177.                     bad_fld := 0
  178.                 else if not (mo in [1 .. 12]) then
  179.                         bad_fld := 1
  180.                 else if (dy > 31)
  181.                 or (dy < 1)
  182.                 or ((mo in [4,6,9,11]) and (dy > 30)) then
  183.                         bad_fld := 2
  184.                 else if mo = 2 then
  185.                   begin
  186.                     if (leapyear(yr) and (dy > 29))
  187.                     or ((not leapyear(yr)) and (dy > 28)) then
  188.                         bad_fld := 2
  189.                   end
  190.                 else if yr = 0 then
  191.                         bad_fld := 3
  192.             end ; { with dt do }
  193.         valid_date := (bad_fld = 0)
  194.     end ; { function valid_date }
  195.  
  196. { ------------------------------------------------------------ }
  197.  
  198. procedure read_date (var dt: date ; col, row: integer) ;
  199.  
  200. { Read date at column and row specified.  If the user enters only
  201.   two digits for the year, the procedure plugs the century as 1900 or
  202.   2000, but the user can enter all four digits to override the plug. }
  203.  
  204.   var
  205.     ch       : char ;
  206.     savex,
  207.     savey,
  208.     savefld,
  209.     bad_fld,
  210.     key,
  211.     p        : integer ;
  212.     s,
  213.     template : datestring ;
  214.  
  215. { ==================== }
  216.  
  217.   procedure add_to_str ;
  218.     var
  219.       l : integer ;
  220.     begin
  221.       l := length(s) ;
  222.       if l = 10 then
  223.           error_buzz
  224.       else if (l=1) or (l=4) then
  225.         begin
  226.           s := concat(s,ch,'/') ;
  227.           write (ch,'/')
  228.         end
  229.       else
  230.         begin
  231.           s := concat(s,ch) ;
  232.           write (ch)
  233.         end
  234.     end ; { proc add_to_str }
  235.  
  236. { ==================== }
  237.  
  238.   procedure adjust_dt_str ;
  239.     var
  240.       l : integer ;
  241.     begin
  242.       case key of
  243.         del_fld :
  244.           begin
  245.             s := '' ;
  246.             write_str (template,col,row) ;
  247.             gotoxy (col,row)
  248.           end ;
  249.         del_left,
  250.         prev_char :                    { prev_char is destructive backspace! }
  251.           begin
  252.             l := length(s) ;
  253.             if l = 0 then
  254.                 error_buzz
  255.             else if (l=3) or (l=6) then
  256.               begin
  257.                 write (^H,^H,chr(filler),^H) ;
  258.                 delete (s,l-1,2)
  259.               end
  260.             else
  261.               begin
  262.                 write (^H,chr(filler),^H) ;
  263.                 delete (s,l,1)
  264.               end
  265.           end
  266.       end { case }
  267.     end ; { proc adjust_dt_str }
  268.  
  269. { ==================== }
  270.  
  271.   procedure convert_date ;
  272.   { convert the string to a date -- three integers }
  273.     var
  274.       code : integer ;
  275.     begin
  276.       p := pos(' ',s) ;
  277.       while p <> 0 do
  278.         begin
  279.           s[p] := '0' ;
  280.           p := pos(' ',s)
  281.         end ;
  282.       with dt do
  283.         begin
  284.           if (copy(s,1,2) = '') then
  285.             begin
  286.               mo := 0 ; code := 0
  287.             end
  288.           else
  289.               val (copy(s,1,2),mo,code) ;
  290.           if code <> 0 then
  291.             begin
  292.               write ('** CONVERSION ERROR ',code) ;
  293.               halt
  294.             end ;
  295.           if (copy(s,4,2) = '') then
  296.             begin
  297.               dy := 0 ; code := 0
  298.             end
  299.           else
  300.               val (copy(s,4,2),dy,code) ;
  301.           if code <> 0 then
  302.             begin
  303.               write ('** CONVERSION ERROR ',code) ;
  304.               halt
  305.             end ;
  306.           if (copy(s,7,4) = '') then
  307.             begin
  308.               yr := 0 ; code := 0
  309.             end
  310.           else
  311.               val (copy(s,7,4),yr,code) ;
  312.           if code <> 0 then
  313.             begin
  314.               write ('** CONVERSION ERROR ',code) ;
  315.               halt
  316.             end ;
  317.           if not ((yr = 0) and (mo = 0) and (dy = 0)) then
  318.             begin                                          { plug century }
  319.               if yr < 80 then
  320.                   yr := 2000 + yr
  321.               else if yr < 100 then
  322.                   yr := 1900 + yr
  323.             end
  324.         end { with }
  325.     end ; { proc convert_date}
  326.  
  327. { ==================== }
  328.  
  329.   procedure edit_date ;                  { Edit for valid date }
  330.     begin
  331.       bad_fld := 0 ;
  332.       with dt do
  333.         begin
  334.           if (mo = 0) and (dy = 0) and (yr = 0) then
  335.               bad_fld := 0
  336.           else if not (mo in [1 .. 12]) then
  337.               bad_fld := 1
  338.           else if (dy > 31)
  339.           or (dy < 1)
  340.           or ((mo in [4,6,9,11]) and (dy > 30)) then
  341.               bad_fld := 2
  342.           else if mo = 2 then
  343.             begin
  344.               if (leapyear(yr) and (dy > 29))
  345.               or ((not leapyear(yr)) and (dy > 28)) then
  346.                   bad_fld := 2
  347.             end
  348.           else if yr = 0 then
  349.               bad_fld := 3
  350.         end   { with dt do }
  351.     end ; { proc edit_date }
  352.  
  353. { ==================== }
  354.  
  355.   procedure display_date ;               { write date on screen }
  356.     begin
  357.     if (dt.mo = 0) and (dt.dy = 0) and (dt.yr = 0) then
  358.       begin
  359.         write_str (template,col,row) ;
  360.         s := '' ;
  361.         gotoxy (col,row)
  362.       end
  363.     else
  364.       begin
  365.         s := mk_dt_st(dt) ;
  366.         p := pos(' ',s) ;
  367.         while p <> 0 do
  368.           begin
  369.            s[p] := '0' ;
  370.             p := pos(' ',s)
  371.           end ;
  372.         write_str (s,col,row)
  373.       end
  374.     end ;  { proc display_date }
  375.  
  376. { ==================== }
  377.  
  378. begin { proc read_date }
  379.   savefld := fld ;
  380.   ch := chr(filler) ;
  381.   template := concat(ch,ch,'/',ch,ch,'/',ch,ch,ch,ch) ;
  382.   display_date ;
  383.   repeat
  384.       keyin(ch) ;
  385.       key := ord(ch) ;
  386.       if ch in ['0'..'9'] then
  387.           add_to_str
  388.       else if key in adjusting then
  389.           adjust_dt_str
  390.       else if key in terminating then
  391.         begin
  392.           convert_date ;
  393.           edit_date ;
  394.           do_fld_ctl (key) ;
  395.           if bad_fld <> 0 then                  { error message only if }
  396.             begin                               { going forward }
  397.               if (fld < maxint) and (fld > savefld) then
  398.                 begin
  399.                   savex := wherex ;
  400.                   savey := wherey ;
  401.                   case bad_fld of
  402.                     1 : show_msg ('INVALID MONTH') ;
  403.                     2 : show_msg ('INVALID DAY') ;
  404.                     3 : show_msg ('INVALID YEAR')
  405.                   end ; { case }
  406.                   fld := savefld ;              { if bad date, may not go foward }
  407.                   gotoxy (savex,savey)          { restore cursor position }
  408.                 end
  409.             end
  410.         end
  411.       else                                      { invalid character }
  412.           error_buzz
  413.   until not (fld = savefld) ;
  414.   if (bad_fld <> 0) then                        { if bad date, zero it out }
  415.       dt := null_date ;
  416.   write_date (dt,col,row)
  417. end ; { proc read_date }
  418.  
  419. { ------------------------------------------------------------ }
  420.  
  421. function greater_date (dt1, dt2 : date) : integer ;
  422.   { Compares two dates, returns 0 if both equal, 1 if first is
  423.     greater, 2 if second is greater.  Converts both to strings,
  424.     then compares the strings. }
  425.  
  426.     var
  427.         stdt1, stdt2 : string[8] ;
  428.         styr1, styr2 : string[4] ;
  429.         stmo1, stmo2 : string[2] ;
  430.         stdy1, stdy2 : string[2] ;
  431.  
  432.     begin
  433.         with dt1 do
  434.             begin
  435.                 str(yr:4,styr1) ;
  436.                 str(mo:2,stmo1) ;
  437.                 str(dy:2,stdy1) ;
  438.                 stdt1 := concat (styr1,stmo1,stdy1)
  439.             end ;
  440.         with dt2 do
  441.             begin
  442.                 str(yr:4,styr2) ;
  443.                 str(mo:2,stmo2) ;
  444.                 str(dy:2,stdy2) ;
  445.                 stdt2 := concat (styr2,stmo2,stdy2)
  446.             end ;
  447.         if stdt1 > stdt2 then
  448.                 greater_date := 1
  449.         else if stdt2 > stdt1 then
  450.                 greater_date := 2
  451.         else { both equal }
  452.                 greater_date := 0
  453.     end ; { --- of greater_date --- }
  454.  
  455. { ------------------------------------------------------------ }
  456.  
  457. procedure greg_to_jul (dt : date ; var jdt : juldate) ;
  458. { converts a gregorian date to a julian date }
  459.   begin
  460.     jdt.yr := dt.yr ;
  461.     if (dt.yr = 0) and (dt.mo = 0) and (dt.dy = 0) then
  462.         jdt.day := 0
  463.     else
  464.       begin
  465.         if (leapyear(dt.yr)) and (dt.mo > 2) then
  466.             jdt.day := 1
  467.         else
  468.             jdt.day := 0 ;
  469.         jdt.day := jdt.day + monthtotal[dt.mo] + dt.dy
  470.       end
  471.   end ;  { --- procedure greg_to_jul --- }
  472.  
  473. { ------------------------------------------------------------ }
  474.  
  475. procedure jul_to_greg (jdt : juldate ; var dt : date) ;
  476. { converts a julian date to a gregorian date }
  477.   var
  478.       i, workday : integer ;
  479.   begin
  480.     dt.yr := jdt.yr ;
  481.     if (jdt.yr = 0) and (jdt.day = 0) then
  482.       begin
  483.         dt.mo := 0 ; dt.dy := 0
  484.       end
  485.     else
  486.       begin
  487.         workday := jdt.day ;
  488.         if (leapyear(jdt.yr)) and (workday > 59) then
  489.             workday := workday - 1 ;   { make it look like a non-leap year }
  490.         i := 1 ;
  491.         repeat
  492.             i := i + 1
  493.         until not (workday > monthtotal[i]) ;
  494.         i := i - 1 ;
  495.         dt.mo := i ;
  496.         dt.dy := workday - monthtotal[i] ;
  497.         if leapyear(jdt.yr) and (jdt.day = 60) then
  498.             dt.dy := dt.dy + 1
  499.       end
  500.   end ;  { --- procedure jul_to_greg --- }
  501.  
  502. { ------------------------------------------------------------ }
  503.  
  504. procedure next_day (var dt : date) ;
  505.   { Adds one day to the date }
  506.     var
  507.         jdt  : juldate ;
  508.         leap : boolean ;
  509.     begin
  510.         greg_to_jul (dt,jdt) ;
  511.         jdt.day := jdt.day + 1 ;
  512.         leap := leapyear (dt.yr) ;
  513.         if (leap and (jdt.day = 367))
  514.         or (not leap and (jdt.day = 366)) then
  515.           begin
  516.             jdt.yr := jdt.yr + 1 ;
  517.             jdt.day := 1
  518.           end ;
  519.         jul_to_greg (jdt,dt)
  520.     end ;  { --- procedure next_day --- }
  521.  
  522. { ------------------------------------------------------------ }
  523.  
  524. procedure prev_day (var dt : date) ;
  525.   { Subtracts one day from the date }
  526.     var
  527.         jdt : juldate ;
  528.     begin
  529.         greg_to_jul (dt,jdt) ;
  530.         jdt.day := jdt.day - 1 ;
  531.         if jdt.day < 1 then
  532.           begin
  533.             jdt.yr := jdt.yr - 1 ;
  534.             if leapyear (jdt.yr) then
  535.                 jdt.day := 366
  536.             else
  537.                 jdt.day := 365
  538.           end ;
  539.         jul_to_greg (jdt,dt)
  540.     end ;  { --- procedure prev_day --- }
  541.  
  542. { ------------------------------------------------------------ }
  543.  
  544. function date_diff (dt1, dt2 : date) : real ;
  545.   { computes the number of days between two dates }
  546.     var
  547.         jdt1, jdt2 : juldate ;
  548.         i, num_leap_yrs : integer ;
  549.     begin
  550.         greg_to_jul (dt1, jdt1) ;
  551.         greg_to_jul (dt2, jdt2) ;
  552.  
  553.         num_leap_yrs := 0 ;         { adjust for leap years }
  554.         if dt2.yr > dt1.yr then
  555.           begin
  556.             for i := dt1.yr to dt2.yr - 1 do
  557.                 if leapyear(i) then
  558.                     num_leap_yrs := num_leap_yrs + 1
  559.           end
  560.         else if dt1.yr > dt2.yr then
  561.           begin
  562.             for i := dt2.yr to dt1.yr - 1 do
  563.                 if leapyear(i) then
  564.                     num_leap_yrs := num_leap_yrs - 1
  565.           end ;
  566.  
  567.         date_diff := jdt2.day - jdt1.day + ((jdt2.yr - jdt1.yr) * 365.0) + num_leap_yrs
  568.     end ;
  569.  
  570. { ------------------------------------------------------------ }
  571.  
  572. function month_diff (dt1, dt2 : date ) : integer ;
  573.   { Computes number of months between two dates, rounded.
  574.     30.4167 = 356/12, average number of days in a month. }
  575.     begin
  576.         month_diff := round((date_diff(dt1, dt2) + 1) / 30.4167)
  577.     end ;
  578.  
  579. { ------------------------------------------------------------ }
  580.  
  581. function equal_date (dt1, dt2 : date) : boolean ;
  582.   { Tests whether two dates are equal }
  583.     begin
  584.         equal_date := (dt1.mo = dt2.mo) and (dt1.dy = dt2.dy)
  585.                       and (dt1.yr = dt2.yr)
  586.     end ;
  587.  
  588. { ------------------------------------------------------------ }
  589.  
  590. function zeller (dt : date) : integer ;
  591. { Compute the day of the week using Zeller's Congruence.
  592.   From ROS 3.4 source code }
  593.   var
  594.     century: integer ;
  595.   begin
  596.     with dt do
  597.       begin
  598.         if mo > 2
  599.           then mo := mo - 2
  600.           else
  601.             begin
  602.               mo := mo + 10 ;
  603.               yr := pred(yr)
  604.             end ;
  605.         century := yr div 100 ;
  606.         yr := yr mod 100 ;
  607.         zeller := (dy - 1 + ((13 * mo - 1) div 5) + (5 * yr div 4) +
  608.             century div 4 - 2 * century + 1) mod 7
  609.       end
  610.   end ;  { function zeller }
  611.  
  612. { ------------------------------------------------------------ }
  613.  
  614. function build_full_date_str (dt : date) : fulldatestring ;
  615. { Build printable string of current date -- from ROS 3.4 source code. }
  616.   const
  617.     day: array [0..6] of string[6] =
  618.       ('Sun','Mon','Tues','Wednes','Thurs','Fri','Satur') ;
  619.     month: array [1..12] of string[9] =
  620.       ('January','February','March','April','May','June','July','August','September','October','November','December') ;
  621.   var
  622.     i: integer ;
  623.     s: fulldatestring ;
  624.  
  625.   function intstr(n, w: integer): str_type ;
  626.   { Return a string value of width w for the input integer n }
  627.     var
  628.       st: str_type ;
  629.     begin
  630.       str(n:w, st) ;
  631.       st := purgech (st,' ') ;
  632.       intstr := st
  633.     end ;
  634.  
  635.   begin { build_full_date_str }
  636.     with dt do
  637.       begin
  638.         if  (mo = 0) and (dy = 0) and (yr = 0) then
  639.             s := 'No Date'
  640.         else
  641.             s := day[zeller(dt)] + 'day, ' +
  642.                  month[mo] + ' ' + intstr(dy, 2) + ', ' + intstr(yr, 4) ;
  643.         if length (s) < fdslen then
  644.             s := pad (s,' ',fdslen)
  645.       end ;
  646.     build_full_date_str := s
  647.   end ; { function build_full_date_str }
  648.  
  649. { ----------------------------------------------------------------- }
  650.  
  651. procedure getdate (var dt : date) ;
  652.   { get DOS system date }
  653.  
  654.     var regs : registers ;
  655.  
  656.     begin
  657.       with regs do
  658.         begin
  659.           AX := $2A00 ;
  660.           msdos(regs) ;
  661.           dt.yr := CX ;
  662.           dt.mo := DH ;
  663.           dt.dy := DL
  664.         end
  665.     end ; { proc getdate }
  666.  
  667. { ----------------------------------------------------------------- }
  668.  
  669. function date_and_time : str14 ;
  670.   { get DOS system date and time, return string }
  671.  
  672. var
  673.   year,
  674.   month,day,
  675.   hour,min  : string[2] ;
  676.   regs : registers ;
  677.  
  678. begin
  679.   with regs do
  680.     begin
  681.       AX := $2A00 ;
  682.       msdos(regs) ;
  683.       str(CX-1900,year) ;
  684.       str(DH,month) ;
  685.       str(DL,day) ;
  686.       AX := $2C00 ;
  687.       msdos (regs) ;
  688.       str(CH:2,hour) ;
  689.       str(CL:2,min) ;
  690.     end ;
  691.   if  min[1] = ' ' then  min[1] := '0' ;
  692.   if  (hour[1] = ' ')
  693.   and (hour[2] = '0') then
  694.       hour := '00' ;
  695.   date_and_time := concat (month,'/',day,'/',year,' ',hour,':',min) ;
  696. end ; { function getdate }
  697.  
  698. end. { implementation }
  699.  
  700. { ----- EOF DAT23.U ------------------------------------------ }
  701.