home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / murutil / datetime.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-09-28  |  5.7 KB  |  235 lines

  1. PROGRAM DATETIME;
  2.  
  3. {$N-} {No numeric coprocessor}
  4.  
  5. {  This Turbo Pascal V4.0 program gets the current date and time from
  6.    the keyboard and sets the MSDOS date and time parameters.
  7.  
  8.    Acceptable date formats are:  "04-JUN-86", "4JUN86", "4 JUN 1986"
  9.                                  and so forth.
  10.  
  11.    Acceptable time formats are:  "9:55:12", "9:55", "9.55", "9;55"
  12.                                  and so forth.
  13.  
  14.    Updated for Turbo Pascal Version 4.0 by H.M.M. on 24 November 1987.
  15.  
  16.    Version:  24 November 1987.
  17.  
  18.    Program by:
  19.                 Harry M. Murphy, Consultant
  20.                 3912 Hilton Avenue, NE
  21.                 Albuquerque, NM  87110
  22.                 Tel:  (505) 881-0519
  23.                 4 June 1986.  }
  24.  
  25. {                               NOTICE
  26.  
  27.        Copyright 1986, Harry M. Murphy.
  28.  
  29.        A general license is hereby  granted  for  non-commercial
  30.        use,  copying and free exchange of this  program  without
  31.        payment of any royalties,  provided that  this  copyright
  32.        notice is not altered nor deleted.   All other rights are
  33.        reserved.  Harry M. Murphy  }
  34.  
  35.  
  36. USES
  37.       CRT, DOS;
  38.  
  39. CONST
  40.       BLANK  = '            ';
  41.       LENREC = 12;
  42.       MONTHS = 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
  43.  
  44. TYPE
  45.      LINIDX = 0..LENREC;
  46.      LINSTR = STRING[LENREC];
  47.  
  48. VAR
  49.     CH   : CHAR;
  50.     DAY  : INTEGER;
  51.     GOOD : BOOLEAN;
  52.     HR   : INTEGER;
  53.     K    : LINIDX;
  54.     L    : LINIDX;
  55.     LINE : LINSTR;
  56.     LL   : LINIDX;
  57.     MN   : INTEGER;
  58.     MON  : INTEGER;
  59.     REGS : REGISTERS;
  60.     SC   : INTEGER;
  61.     YEAR : INTEGER;
  62.  
  63. { -------------------------------- }
  64.  
  65. PROCEDURE BEEP;
  66.  
  67. BEGIN { Procedure BEEP }
  68.   SOUND(512);
  69.   DELAY(100);
  70.   NOSOUND
  71. END { Procedure BEEP };
  72.  
  73. { -------------------------------- }
  74.  
  75. PROCEDURE ERROR;
  76.  
  77. BEGIN { Procedure ERROR }
  78.   SOUND(128);
  79.   DELAY(200);
  80.   NOSOUND;
  81.   DELAY(800)
  82. END { Procedure ERROR };
  83.  
  84. { -------------------------------- }
  85.  
  86. PROCEDURE SCAN(VAR LINE: LINSTR;
  87.                VAR    L: LINIDX;
  88.                VAR  NUM: INTEGER;
  89.                    MXDG: LINIDX);
  90.  
  91. VAR
  92.     ND : INTEGER;
  93.  
  94. BEGIN { Procedure SCAN }
  95.   NUM := 0;
  96.   ND := 0;
  97.   WHILE (LINE[L] IN ['0'..'9']) AND (ND < MXDG) DO
  98.     BEGIN
  99.       NUM := 10*NUM+ORD(LINE[L])-ORD('0');
  100.       ND := ND+1;
  101.       L := L+1
  102.     END
  103. END { Prodecure SCAN };
  104.  
  105. { -------------------------------- }
  106.  
  107. BEGIN  {Program DATETIME }
  108.  
  109.   {  Ask for today's date.  Keep asking until it parses OK.  }
  110.  
  111.   REPEAT
  112.     BEEP;
  113.     WRITE('Date (dd-mmm-yy): ');
  114.     LINE := BLANK;
  115.     READLN(LINE);
  116.  
  117.     {  There must be at least six characters in the date:
  118.        for example "4JUN86".  }
  119.  
  120.     LL := LENGTH(LINE);
  121.     GOOD := (LL > 5) AND (LL < LENREC);
  122.  
  123.     {  Parse the date line.  }
  124.  
  125.     IF GOOD
  126.       THEN
  127.         BEGIN
  128.           K := 0;
  129.           FOR L:=1 TO LL DO
  130.             BEGIN
  131.               CH := UPCASE(LINE[L]);
  132.               IF (CH IN ['0'..'9','A'..'Z'])
  133.                 THEN
  134.                   BEGIN
  135.                     K := K+1;
  136.                     LINE[K] := CH
  137.                   END
  138.             END;
  139.           LINE[K+1] := CHR(0);
  140.           LL := K;
  141.           GOOD := LL > 5;
  142.           IF GOOD
  143.             THEN
  144.               BEGIN
  145.                 L := 1;
  146.                 SCAN(LINE,L,DAY,2);
  147.                 MON := (POS(COPY(LINE,L,3),MONTHS)+2) DIV 3;
  148.                 L := L+3;
  149.                 SCAN(LINE,L,YEAR,4);
  150.                 IF YEAR < 100 THEN YEAR := YEAR+1900;
  151.                 GOOD := (DAY > 0) AND
  152.                         (MON > 0) AND
  153.                        ((YEAR > 1985) AND (YEAR < 2100));
  154.                 IF GOOD
  155.                   THEN
  156.                     CASE MON OF
  157.                       1,3,5,7,8,10,12: GOOD := DAY <= 31;
  158.                                     2: IF (YEAR MOD 4) = 0
  159.                                          THEN
  160.                                            GOOD := DAY <= 29
  161.                                          ELSE
  162.                                            GOOD := DAY <= 28;
  163.                              4,6,9,11: GOOD := DAY <= 30
  164.                     END { CASE }
  165.               END
  166.         END;
  167.     IF NOT GOOD THEN ERROR
  168.   UNTIL GOOD;
  169.  
  170.   {  At this point we have a valid date.  Call MSDOS to save it.  }
  171.  
  172.   WITH REGS DO
  173.     BEGIN
  174.       AX := $2B00;
  175.       CX := YEAR;
  176.       DX := MON*256+DAY
  177.     END { WITH };
  178.   MSDOS(REGS);
  179.  
  180.   {  Ask for the time.  Keep asking until it parses OK.  }
  181.  
  182.   REPEAT
  183.     BEEP;
  184.     WRITE('Time  (hh:mm:ss): ');
  185.     LINE := BLANK;
  186.     READLN(LINE);
  187.     LL := LENGTH(LINE);
  188.  
  189.     {  There must be at least four characters in the time;
  190.        for example:  "9:45".  }
  191.  
  192.     GOOD := (LL > 3) AND (LL < 12);
  193.     LINE[LL+1] := CHR(0);
  194.  
  195.     {  Parse the time line.  }
  196.  
  197.     IF GOOD
  198.       THEN
  199.         BEGIN
  200.           FOR L:=1 TO LL DO
  201.             IF LINE[L] IN [';','.',',','/'] THEN LINE[L] := ':';
  202.           L := 1;
  203.           SCAN(LINE,L,HR,2);
  204.           GOOD := (HR < 24) AND (LINE[L] = ':');
  205.           IF GOOD
  206.             THEN
  207.               BEGIN
  208.                 L := L+1;
  209.                 SCAN(LINE,L,MN,2);
  210.                 GOOD := (MN < 60) AND ((LINE[L] = ':') OR (L >= LL));
  211.                 IF GOOD AND (L < LL)
  212.                   THEN
  213.                     BEGIN
  214.                       L := L+1;
  215.                       SCAN(LINE,L,SC,2);
  216.                       GOOD := SC < 60
  217.                     END
  218.                   ELSE
  219.                     SC := 0
  220.               END
  221.         END;
  222.     IF NOT GOOD THEN ERROR
  223.   UNTIL GOOD;
  224.  
  225.   {  At this point we have a valid time.  Call MSDOS to save it.  }
  226.  
  227.   WITH REGS DO
  228.     BEGIN
  229.       AX := $2D01;
  230.       CX := HR*256+MN;
  231.       DX := SC*256
  232.     END { WITH };
  233.   MSDOS(REGS)
  234. END.
  235.