--***************************************************************************** -- -- Program MORE displays one or more files (or piped input) a page at a time. -- -- Invocation: -- -- more - -- -- where -- -- -- is the number of lines to display for each page. -- -- are the input files to read. MORE currently doesn't work in -- a pipeline. -- --***************************************************************************** with TEXT_IO ; use TEXT_IO ; -- package INTEGER_IO is new INTEGER_IO(INTEGER) ; -- with INTEGER_IO ; use INTEGER_IO ; with IIO ; use IIO ; with TTY ; use TTY ; with ALEX ; use ALEX ; with BOPT ; use BOPT ; procedure MORE is CRLF : constant STRING := ascii.CR & ascii.LF ; OPTION : character ; OPTARG : STRING (1..64) ; END_OF_OPTIONS : boolean ; FILE_NAME : STRING (1..64) ; LAST : integer ; NUM_LINES : integer := 15 ; NO_FILES_DISPLAYED : boolean := TRUE ; procedure DISPLAY_FILE (FILE_NAME: in STRING ; NUM_LINES: INTEGER) is BUFFER : STRING (1..256) ; C : character ; INPUT_FILE : text_io.FILE_TYPE ; LENGTH : integer ; NUM_LINES_NOW : integer := NUM_LINES ; begin if (EQUAL (FILE_NAME, "")) then INPUT_FILE := STANDARD_INPUT ; else text_io.open (INPUT_FILE, text_io.IN_FILE, TRIM(FILE_NAME)) ; tty.put (CRLF & "Input file = " & TRIM(FILE_NAME) & CRLF & CRLF) ; end if ; loop for I in 1 .. NUM_LINES_NOW loop exit when end_of_file (INPUT_FILE) ; text_io.get_line (INPUT_FILE, BUFFER, LENGTH) ; tty.put (BUFFER(1..LENGTH) & CRLF) ; end loop ; exit when end_of_file (INPUT_FILE) ; C := tty.get (No_Echo => TRUE, Direct => FALSE, Clear => TRUE) ; exit when (C = 'q') or (C = 'Q') ; if (C = ascii.CR) then NUM_LINES_NOW := 1 ; else NUM_LINES_NOW := NUM_LINES ; end if ; end loop ; exception when NAME_ERROR => tty.put ("File not found: " & TRIM(FILE_NAME) & CRLF) ; end DISPLAY_FILE ; -- Main Program begin loop GETOPT ("9", OPTION, OPTARG, END_OF_OPTIONS) ; exit when END_OF_OPTIONS ; case OPTION is when '-' => iio.get (OPTARG, NUM_LINES, LAST) ; when ' ' => DISPLAY_FILE (OPTARG, NUM_LINES) ; NO_FILES_DISPLAYED := FALSE ; when others => tty.put ("Bad option = " & TRIM(OPTARG) & CRLF) ; end case ; end loop ; if (NO_FILES_DISPLAYED) then DISPLAY_FILE ("", NUM_LINES) ; end if ; end MORE ;