home *** CD-ROM | disk | FTP | other *** search
- PROGRAM SORTTEXT ;
- { This program sorts a text file. Each sort element must be
- a standard text file line, ending with a carriage-return
- and line-feed. Maximum line length is 80, including the
- <cr> & <lf>. Maximum number of lines is set by MAXLINES.
-
- WPM -- 7/31/84 }
-
- {$V- Turn off strict type checking for string length }
-
- CONST
- MAXLINES = 499 ;
-
- TYPE
- STR80 = STRING[80] ;
- FILENAME = STRING[14] ;
- LINE_ARRAY = ARRAY[0 .. MAXLINES] OF STR80 ;
-
- VAR
- IPT_NAME : FILENAME ;
- OUT_NAME : FILENAME ;
- IPT_FILE : TEXT ;
- OUT_FILE : TEXT ;
- LINES : LINE_ARRAY ;
- N : INTEGER ;
- NUM_LINES : INTEGER ;
-
- { ------------------------------------------------------------------ }
-
- PROCEDURE SORT_EM ;
- { Sort the array using Shell sort }
- VAR
- D : INTEGER ; { Distance between elements }
- N,M : INTEGER ;
- SORTED : BOOLEAN ;
- SWAP : STR80 ;
- BEGIN
- WRITELN ('Sorting') ;
- D := NUM_LINES DIV 2 ;
- WHILE D > 0 DO
- BEGIN
- WRITE ('+') ; { To show something happening }
- REPEAT
- SORTED := TRUE ;
- FOR N := 0 TO NUM_LINES - D DO
- BEGIN
- M := N + D ;
- IF LINES[N] > LINES[M] THEN
- BEGIN
- SWAP := LINES[M] ;
- LINES[M] := LINES[N] ;
- LINES[N] := SWAP ;
- SORTED := FALSE
- END
- END
- UNTIL SORTED ;
- D := D DIV 2
- END ; { WHILE }
- WRITELN ;
- END ; { --- Procedure SORT_EM --- }
-
- BEGIN { --- MAIN -------------------------------------------------- }
- WRITELN ;
- WRITELN ('This program sorts a text file.') ;
- WRITELN ;
- WRITE (' Input file? (d:filename.ext) ') ;
- READLN (IPT_NAME) ;
- WRITE ('Output file? (d:filename.ext) ') ;
- READLN (OUT_NAME) ;
- IF IPT_NAME = OUT_NAME THEN
- BEGIN
- WRITELN ('Must be different file names.', CHR(7)) ;
- HALT
- END ;
- ASSIGN (IPT_FILE, IPT_NAME) ;
- ASSIGN (OUT_FILE, OUT_NAME) ;
- {$I-} { Turn off auto I/O check }
- RESET (IPT_FILE) ;
- IF NOT (IORESULT = 0) THEN
- BEGIN
- WRITELN (' Can''t find file ',IPT_NAME, CHR(7)) ;
- HALT
- END ;
- REWRITE (OUT_FILE) ;
- IF NOT (IORESULT = 0) THEN
- BEGIN
- WRITELN ('Can''t create file ',OUT_NAME) ;
- WRITELN ('Maybe the directory is full.', CHR(7)) ;
- HALT
- END ;
- {$I+} { Turn it back on }
- N := 0 ;
- WHILE NOT(EOF(IPT_FILE)) DO
- BEGIN
- READLN (IPT_FILE, LINES[N]) ;
- IF NOT (LINES[N] = '') THEN
- N := N + 1 ;
- IF N > MAXLINES THEN
- BEGIN
- WRITELN ('Too many lines in input file -- max is ',MAXLINES + 1) ;
- HALT ;
- END
- END ;
- NUM_LINES := N - 1 ;
- SORT_EM ;
- {$I-} { Turn off auto I/O check }
- FOR N := 0 TO NUM_LINES DO
- BEGIN
- WRITELN (OUT_FILE, LINES[N]) ;
- IF NOT (IORESULT = 0) THEN
- BEGIN
- WRITELN ('Can''t write file ', OUT_NAME) ;
- WRITELN ('Maybe the disk is full.', CHR(7)) ;
- HALT
- END
- END ;
- {$I+} { Turn it back on }
- CLOSE (IPT_FILE) ;
- CLOSE (OUT_FILE) ;
- WRITELN ('Done!', CHR(7))
- END.
- { Turn it back on }
- N := 0 ;
- WHILE NOT(EOF(IPT_FILE)) DO
- BEGIN
- READLN (IPT_F