home *** CD-ROM | disk | FTP | other *** search
/ Phoenix CD 2.0 / Phoenix_CD.cdr / 15a / murutil.zip / DATETIME.PAS < prev    next >
Pascal/Delphi Source File  |  1986-06-04  |  6KB  |  223 lines

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