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

  1. PROGRAM UPDAT;
  2.  
  3. {  This Turbo Pascal program generates a BATCH file,  UPD.BAT,  based
  4.    on a SOURCE directory, SRS.DIR,  and a TARGET directory,  TAR.DIR,
  5.    which copies files from the SOURCE directory  (or device)  to  the
  6.    TARGET directory (or device) in alphabetical order and -- if files
  7.    already exist on the target disk  --  so  that  the  most  current
  8.    version of the file is copied to, or remains on, the TARGET disk.
  9.  
  10.    Note:  Files with blank extensions  (presumably  directory  files)
  11.           and files with extensions  starting  with  "~"  (presumably
  12.           Norton Editor backup files) are not copied to the TARGET.
  13.  
  14.    Program by:
  15.                 Harry M. Murphy, Consultant
  16.                 3912 Hilton Avenue, NE
  17.                 Albuquerque, NM  87110
  18.                 Tel:  (505) 881-0519
  19.                 2 June 1986.  }
  20.  
  21. {  NOTICE:
  22.  
  23.             Copyright 1986, Harry M. Murphy.
  24.  
  25.             A general license is hereby  granted  for  non-commercial
  26.             use,  copying and free exchange of this  program  without
  27.             payment of any royalties,  provided that  this  copyright
  28.             notice is not altered nor deleted.   All other rights are
  29.             reserved.  Harry M. Murphy  }
  30.  
  31. CONST
  32.       FILELEN = 12;
  33.       LONGLEN = 127;
  34.       MAXLIST = 1000;
  35.  
  36. TYPE
  37.      FILENAM = STRING[FILELEN];
  38.      FILEREC = RECORD
  39.                  NAME : FILENAM;
  40.                  DATE : INTEGER;
  41.                  TIME : INTEGER
  42.                END;
  43.      FILELST = ARRAY [1..MAXLIST] OF FILEREC;
  44.      LONGNAM = STRING[LONGLEN];
  45.  
  46. VAR
  47.     NCPY   : INTEGER;
  48.     NSRS   : INTEGER;
  49.     NTAR   : INTEGER;
  50.     SRSFIL : FILELST;
  51.     SRSNAM : LONGNAM;
  52.     TARFIL : FILELST;
  53.     TARNAM : LONGNAM;
  54.  
  55.  
  56. PROCEDURE GETDIRECT(      NAME: FILENAM;
  57.                     VAR DIRFIL: FILELST;
  58.                     VAR   NDIR: INTEGER;
  59.                     VAR DIRNAM: LONGNAM);
  60.  
  61. {  This procedure reads the SOURCE or TARGET directory file specified
  62.    by NAME and generates a list of file  names,  creation  dates  and
  63.    creation times DIRFIL.NAME, DIRFIL.DATE and DIRFIL.TIME.   On  re-
  64.    turn, NDIR is the number of entries in DIRFIL and DIRNAME  is  the
  65.    directory name (and path).  }
  66.  
  67. CONST
  68.       LINELEN = 40;
  69.  
  70. VAR
  71.     INP  : TEXT[512];
  72.     LINE : STRING[LINELEN];
  73.     LL   : 0..LINELEN;
  74.  
  75.  
  76. FUNCTION NUM(CH: CHAR): INTEGER;  {Internal to GETDIRECT }
  77.  
  78. {  This function returns the integer corresponding to  the  digit
  79.    given in CH.  If CH is blank or a non-digit, NUM returns zero.  }
  80.  
  81. BEGIN  { Function NUM }
  82.   IF CH IN ['0'..'9']
  83.     THEN
  84.       NUM := ORD(CH)-ORD('0')
  85.     ELSE
  86.       NUM := 0
  87. END { Function NUM };
  88.  
  89.  
  90. BEGIN  { Procedure GETDIRECT }
  91.   WRITELN;
  92.   ASSIGN(INP,NAME);
  93.   {$I-} RESET(INP) {$I+};
  94.   IF (IORESULT <>0)
  95.     THEN
  96.       BEGIN
  97.         NORMVIDEO;
  98.         WRITELN('  Can''t open file ',NAME,'!');
  99.         LOWVIDEO;
  100.         HALT
  101.       END
  102.     ELSE
  103.       WRITELN('  Reading file ',NAME);
  104.   NDIR := 0;
  105.   WHILE NOT EOF(INP) DO
  106.     BEGIN
  107.       READLN(INP,LINE);
  108.       LL := LENGTH(LINE);
  109.       IF LL>2
  110.         THEN
  111.           BEGIN
  112.             IF COPY(LINE,2,12)='Directory of'
  113.               THEN
  114.                 BEGIN
  115.                   DIRNAM := COPY(LINE,16,LL-15);
  116.                   IF DIRNAM[LL-15]<>'\'
  117.                     THEN
  118.                       BEGIN
  119.                         DIRNAM[LL-14] := '\';
  120.                         DIRNAM[0] := CHR(LL-14)
  121.                       END
  122.                 END
  123.               ELSE
  124.                 IF (LINE[36] = ':')  AND
  125.                    (LINE[1] <> '.')  AND
  126.                    (LINE[10] <> '~') AND
  127.                    (COPY(LINE,10,3) <> '   ')
  128.                   THEN
  129.                     BEGIN
  130.                       NDIR := NDIR+1;
  131.                       LINE[9] := '.';
  132.                       WITH DIRFIL[NDIR] DO
  133.                         BEGIN
  134.                           NAME := COPY(LINE,1,12);
  135.                           DATE := ((NUM(LINE[30])-8)*10+
  136.                                     NUM(LINE[31]))*366+
  137.                                    (NUM(LINE[27])*10+
  138.                                     NUM(LINE[28])-1)*31+
  139.                                     NUM(LINE[24])*10+
  140.                                     NUM(LINE[25]);
  141.                           TIME := ((NUM(LINE[34])*10+
  142.                                     NUM(LINE[35]))*10+
  143.                                     NUM(LINE[37]))*10+
  144.                                     NUM(LINE[38])
  145.                         END { WITH }
  146.                     END
  147.           END
  148.     END;
  149.     CLOSE(INP);
  150.     ERASE(INP);
  151.     WRITELN('  ',NAME,' is a directory of ',DIRNAM);
  152.     WRITELN('  Number of files in ',NAME,': ',NDIR)
  153. END { Procedure GETDIRECT };
  154.  
  155. PROCEDURE FILEPACK(VAR TMPNAM: FILENAM);
  156.  
  157. {  This routine packs the non-blank characters in the string variable,
  158.    TMPNAM,  and sets the length of TMPNAM to the number  of  non-blank
  159.    characters.  }
  160.  
  161. VAR
  162.     I : 1..FILELEN;
  163.     J : 0..FILELEN;
  164.  
  165. BEGIN  { Procedure FILEPACK }
  166.   J := 0;
  167.   FOR I:=1 TO FILELEN DO
  168.     IF TMPNAM[I] <> ' '
  169.       THEN
  170.         BEGIN
  171.           J := J+1;
  172.           TMPNAM[J] := TMPNAM[I]
  173.         END;
  174.   TMPNAM[0] := CHR(J)
  175. END { Procedure FILEPACK };
  176.  
  177.  
  178. PROCEDURE FILESORT(VAR DIRFIL: FILELST; NDIR: INTEGER);
  179.  
  180. {  This routine sorts the directory array, DIRFIL, in ascending order,
  181.    using a modified Shell sort algorithm.   NDIR is the length of  the
  182.    array.  }
  183.  
  184. VAR
  185.     I:    INTEGER;
  186.     IM:   INTEGER;
  187.     J:    INTEGER;
  188.     M:    INTEGER;
  189.     SWAP: BOOLEAN;
  190.     TEMP: FILEREC;
  191.  
  192. BEGIN  { Procedure FILESORT }
  193.   IF NDIR > 1
  194.     THEN
  195.       BEGIN
  196.         M := 1;
  197.         WHILE M < NDIR DO M := 2*M;
  198.         M := M-1;
  199.         WHILE M > 1 DO
  200.           BEGIN
  201.             M := M DIV 2;
  202.             FOR J:=1 TO NDIR-M DO
  203.               BEGIN
  204.                 I := J;
  205.                 REPEAT
  206.                   IM := I+M;
  207.                   SWAP := DIRFIL[I].NAME > DIRFIL[IM].NAME;
  208.                   IF SWAP
  209.                     THEN
  210.                       BEGIN
  211.                         TEMP := DIRFIL[I];
  212.                         DIRFIL[I] := DIRFIL[IM];
  213.                         DIRFIL[IM] := TEMP;
  214.                         I := I-M
  215.                       END
  216.                 UNTIL (I <1 ) OR (NOT SWAP)
  217.               END
  218.           END
  219.       END
  220. END { Procedure FILESORT };
  221.  
  222.  
  223. PROCEDURE GENUPDFILE;
  224.  
  225. {  This routine generates the update file, UPD.BAT, which copies the
  226.    selected files from the SOURCE to the TARGET.  }
  227.  
  228. VAR
  229.   I: INTEGER;
  230.   J: INTEGER;
  231.   LINE: LONGNAM;
  232.   TMPDAT: INTEGER;
  233.   TMPNAM: FILENAM;
  234.   TMPTIM: INTEGER;
  235.   UPD:    TEXT[512];
  236.  
  237. BEGIN  { Procedure GENUPDFILE }
  238.   WRITELN;
  239.   ASSIGN(UPD,'UPD.BAT');
  240.   {$I-} REWRITE(UPD) {$I+};
  241.   IF (IORESULT <> 0)
  242.     THEN
  243.       BEGIN
  244.         NORMVIDEO;
  245.         WRITELN('  Can''t open file UPD.BAT!');
  246.         LOWVIDEO;
  247.         HALT
  248.       END
  249.     ELSE
  250.       WRITELN('  Writing file UPD.BAT.');
  251.   NCPY := 0;
  252.   J := 1;
  253.   FOR I:=1 TO NSRS DO
  254.     BEGIN
  255.       WITH SRSFIL[I] DO
  256.         BEGIN
  257.           TMPNAM := NAME;
  258.           TMPDAT := DATE;
  259.           TMPTIM := TIME
  260.         END { WITH };
  261.       IF (TMPNAM <> 'SRS     .DIR') AND
  262.          (TMPNAM <> 'TAR     .DIR') AND
  263.          (TMPNAM <> 'UPD     .DIR')
  264.         THEN
  265.           BEGIN
  266.             WHILE (TARFIL[J].NAME < TMPNAM) AND (J<NTAR)
  267.               DO J := J+1;
  268.             IF  (TARFIL[J].NAME <> TMPNAM) OR
  269.                ((TARFIL[J].NAME =  TMPNAM) AND
  270.                ((TARFIL[J].DATE <  TMPDAT) OR
  271.                ((TARFIL[J].DATE =  TMPDAT) AND
  272.                 (TARFIL[J].TIME <  TMPTIM))))
  273.               THEN
  274.                 BEGIN
  275.                   FILEPACK(TMPNAM);
  276.                   LINE := 'COPY '+SRSNAM+TMPNAM+' '+
  277.                                   TARNAM+TMPNAM+'/V';
  278.                   WRITELN(UPD,LINE);
  279.                   NCPY := NCPY+1
  280.                 END
  281.           END
  282.     END;
  283.   WRITELN(UPD,'UPDKILL');
  284.   CLOSE(UPD);
  285.   WRITELN('  File UPD.BAT written.');
  286.   WRITELN('  Number of files to copy:',NCPY:5,'.');
  287.   WRITELN
  288. END { Procedure GENUPDFILE };
  289.  
  290.  
  291. BEGIN  { Program UPDAT }
  292.   LOWVIDEO;
  293.   WRITELN('Program UPDAT running . . .');
  294.   GETDIRECT('SRS.DIR',SRSFIL,NSRS,SRSNAM);
  295.   IF NSRS > 0
  296.     THEN
  297.       BEGIN
  298.         IF NSRS > 1 THEN FILESORT(SRSFIL,NSRS);
  299.         GETDIRECT('TAR.DIR',TARFIL,NTAR,TARNAM);
  300.         IF NTAR = 0
  301.           THEN
  302.             BEGIN
  303.               WITH TARFIL[1] DO
  304.                 BEGIN
  305.                   NAME := 'ZZZZZZZZ.ZZZ';
  306.                   DATE := 0;
  307.                   TIME := 0
  308.                 END;
  309.               NTAR := 1
  310.             END
  311.           ELSE
  312.             IF NTAR > 1 THEN FILESORT(TARFIL,NTAR);
  313.         GENUPDFILE;
  314.       END
  315.     ELSE
  316.       WRITELN('  No files to be copied.')
  317. END.
  318.