home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol023 / sigmv023.ark / DATE.PAS < prev    next >
Pascal/Delphi Source File  |  1984-04-29  |  7KB  |  303 lines

  1. EXTERNAL progname::date;
  2.  
  3. {    This is a complete collection of the various date routines,
  4.     set up for separate compilation under Pascal/Z, ver 3.2 or
  5.     later.
  6.  
  7.     DATE.LIB contains the necessary subprogram calls for inclusion
  8.     in the main program.
  9.  
  10.     Note that <progname> has to be substituted with the name of the
  11.     main program to be separately compiled.
  12.  
  13.     The following global declarations must be made in the main
  14.     program:
  15.         TYPE    string0 = string 0;
  16.             string255 = string 255;
  17.             byte = 0..255;
  18.         PROCEDURE setlength;
  19.         FUNCTION length;
  20. }
  21.  
  22. PROCEDURE prompt (msg : string255);
  23.  
  24. CONST    msglength = 12;    { should be longer than longest message }
  25.     leader = '.';    { could be a space if desire }
  26.     endprompt = ' =>  ';
  27.  
  28. VAR    count : integer;
  29.     esc : char;
  30.  
  31. begin
  32.     append (msg,' ');
  33.     if length(msg) < msglength then
  34.         for count := succ(length(msg)) to msglength do
  35.             append (msg,leader);
  36.     write (msg,endprompt)
  37. end;
  38.  
  39. PROCEDURE getdate (msg : string255; VAR mo, da, yr : byte);
  40.  
  41. CONST    yrspan = 89;
  42.     yrbase = 10;
  43.  
  44. VAR    ch : char;
  45.     good : boolean;
  46.     temp : integer;
  47.  
  48. begin
  49.       repeat
  50.         good := true;
  51.         prompt (msg);
  52.         readln (mo,ch,da,ch,temp);
  53.         temp := temp mod 100 - yrbase;
  54.         if (da < 1) or (da > 31) or (mo < 1) or (mo >12)
  55.             or (temp < 0) or (temp > yrspan) then
  56.             begin
  57.                 good := false;
  58.                 writeln (' *** Bad date ***')
  59.             end
  60.     until good;
  61.     yr := temp
  62. end;
  63.  
  64. FUNCTION makedate (msg : string255) : integer;
  65.  
  66. CONST    yrbase = 10;
  67.  
  68. VAR    days : integer;
  69.     da, mo, yr : byte;
  70.     str : string255;
  71.  
  72. begin
  73.     getdate (msg,mo,da,yr);
  74.     case mo of
  75.         1 : days := 0;
  76.         2 : days := 31;
  77.         3 : days := 59;
  78.         4 : days := 90;
  79.         5 : days := 120;
  80.         6 : days := 151;
  81.         7 : days := 181;
  82.         8 : days := 212;
  83.         9 : days := 243;
  84.         10 : days := 273;
  85.         11 : days := 304;
  86.         12 : days := 334;
  87.         end;
  88.     days := days + (yr*365) + (yr div 4) + da;
  89.     if ((yr + yrbase) mod 4 = 0) and (mo > 2) then days := days + 1;
  90.     makedate := days
  91. end;
  92.  
  93. PROCEDURE rgetdate (msg : string255; minyr, maxyr : byte;
  94.             VAR mo, da, yr : byte);
  95.  
  96. CONST    yrspan = 89;
  97.     yrbase = 10;
  98.  
  99. VAR    ch : char;
  100.     good : boolean;
  101.     temp : integer;
  102.  
  103. begin
  104.       repeat
  105.         good := true;
  106.         prompt (msg);
  107.         readln (mo,ch,da,ch,temp);
  108.         temp := temp mod 100;
  109.         if (da < 1) or (da > 31) or (mo < 1) or (mo >12)
  110.             or (temp < minyr) or (temp > maxyr) then
  111.             begin
  112.                 good := false;
  113.                 writeln (' *** Bad date ***')
  114.             end
  115.     until good;
  116.     yr := temp - yrbase
  117. end;
  118.  
  119. FUNCTION rmakedate (msg : string255; minyr, maxyr : byte) : integer;
  120.  
  121. CONST    yrbase = 10;
  122.  
  123. VAR    days : integer;
  124.     da, mo, yr : byte;
  125.     str : string255;
  126.  
  127. begin
  128.     rgetdate (msg,minyr,maxyr,mo,da,yr);
  129.     case mo of
  130.         1 : days := 0;
  131.         2 : days := 31;
  132.         3 : days := 59;
  133.         4 : days := 90;
  134.         5 : days := 120;
  135.         6 : days := 151;
  136.         7 : days := 181;
  137.         8 : days := 212;
  138.         9 : days := 243;
  139.         10 : days := 273;
  140.         11 : days := 304;
  141.         12 : days := 334;
  142.         end;
  143.     days := days + (yr*365) + (yr div 4) + da;
  144.     if ((yr + yrbase) mod 4 = 0) and (mo > 2) then days := days + 1;
  145.     rmakedate := days
  146. end;
  147.  
  148. PROCEDURE brkdate (days : integer; VAR mo, da, yr, weekday : byte);
  149.  
  150. CONST    yrbase = 10;
  151.     yrfix = yrbase - 1;
  152.  
  153. VAR    data, temp, adjust, yradj : integer;
  154.  
  155. begin
  156.     adjust := 1 + yrfix mod 4 + (((yrfix mod 28) div 4) * 5);
  157.     yradj := (yrbase mod 4) * 365;
  158.     weekday := (days + adjust) mod 7;
  159.     data := trunc((days + yradj) / 365.25) - yrbase mod 4;
  160.     yr := data + yrbase;
  161.     temp := days - (365 * data) - (data + yrfix mod 4) div 4;
  162.     mo := 0;
  163.     data := 0;
  164.     repeat
  165.         if (data < temp) then
  166.             begin
  167.             mo := mo + 1;
  168.             temp := temp - data
  169.             end;
  170.         case mo of
  171.             1,3,5,7,8,10,12 : data := 31;
  172.             4,6,9,11 : data := 30;
  173.             2 : if (yr mod 4 = 0) then data := 29
  174.                 else data := 28
  175.             end
  176.     until (data >= temp) or (mo = 12);
  177.     da := temp
  178. end;
  179.  
  180. FUNCTION dastrlong (days : integer; withday : boolean) : string255;
  181.  
  182. CONST    zero = 48;
  183.  
  184. VAR    day, mo, date, yr : byte;
  185.     str, str2 : string255;
  186.  
  187. begin
  188.     brkdate (days,mo,date,yr,day);
  189.     if withday then
  190.         begin
  191.         case day of
  192.             0 : str := 'Sunday';
  193. ********************************************************************************************************************************;
  194.             6 : str := 'Saturday'
  195.             end;
  196.         append (str,', ')
  197.         end
  198.         else setlength (str,0);
  199.      case mo of
  200.         1 : str2 := 'January';
  201.         2 : str2 := 'February';
  202.         3 : str2 := 'March';
  203.         4 : str2 := 'April';
  204.         5 : str2 := 'May';
  205.         6 : str2 := 'June';
  206.         7 : str2 := 'July';
  207.         8 : str2 := 'August';
  208.         9 : str2 := 'September';
  209.         10 : str2 := 'October';
  210.         11 : str2 := 'November';
  211.         12 : str2 := 'December'
  212.         end;
  213.     append (str,str2);
  214.     append (str,' ');
  215.     if (date > 9) then append (str,chr((date div 10) + zero));
  216.     append (str,chr((date mod 10) + zero));
  217.     append (str,', 19');
  218.     append (str,chr((yr div 10) + zero));
  219.     append (str,chr((yr mod 10) + zero));
  220.     dastrlong := str
  221. end;
  222.  
  223. FUNCTION dastrshort (days : integer; withday : boolean) : string255;
  224.  
  225. CONST    zero = 48;
  226.  
  227. VAR    day, mo, date, yr : byte;
  228.     str, str2 : string255;
  229.  
  230. begin
  231.     brkdate (days,mo,date,yr,day);
  232.     if withday then
  233.         begin
  234.             case day of
  235.                 0 : str := 'Sun';
  236.                 1 : str := 'Mon';
  237.                 2 : str := 'Tues';
  238.                 3 : str := 'Wed';
  239.                 4 : str := 'Thurs';
  240.                 5 : str := 'Fri';
  241.                 6 : str := 'Sat'
  242.                 end;
  243.             append (str,', ')
  244.         end
  245.         else setlength (str,0);
  246.     case mo of
  247.         1 : str2 := 'Jan';
  248.         2 : str2 := 'Feb';
  249.         3 : str2 := 'Mar';
  250.         4 : str2 := 'Apr';
  251.         5 : str2 := 'May';
  252.         6 : str2 := 'June';
  253.         7 : str2 := 'July';
  254.         8 : str2 := 'Aug';
  255.         9 : str2 := 'Sept';
  256.         10 : str2 := 'Oct';
  257.         11 : str2 := 'Nov';
  258.         12 : str2 := 'Dec'
  259.     end;
  260.     append (str,str2);
  261.     append (str,' ');
  262.     if (date > 9) then append (str,chr((date div 10) +********************************************************************************************************************************chr((yr mod 10) + zero));
  263.     dastrshort := str
  264. end;
  265.  
  266. FUNCTION strbyte (val : byte; withspace : boolean) : string255;
  267.  
  268. CONST    zero = 48;
  269.  
  270. VAR    ch : char;
  271.     str : string255;
  272.  
  273. begin
  274.     setlength (str,0);
  275.     if (val div 10 = 0) and withspace
  276.         then str := ' '
  277.         else str := chr (val div 10 + zero);
  278.     append (str,chr(val mod 10 + zero));
  279.     strbyte := str
  280. end;
  281.  
  282. FUNCTION dastrfixed (days : integer; spaces : boolean) : string255;
  283.  
  284. CONST    zero = 48;
  285.     separator = '-';
  286.  
  287. VAR    day, mo, da, yr : byte;
  288.     str : string255;
  289.  
  290. begin
  291.     brkdate (days,mo,da,yr,day);
  292.     setlength (str,0);
  293.     append (str,strbyte(mo,spaces));
  294.     append (str,separator);
  295.     append (str,strbyte(da,spaces));
  296.     append (str,separator);
  297.     append (str,strbyte(yr,false));
  298.     dastrfixed := str
  299. end;
  300.  
  301.  
  302.  
  303.