nash@ucselx.sdsu.edu (Ron Nash) (04/11/90)
I have recieved several requests for the tail program I wrote here
at SDSU. Here it is in all its groans and glory. It is written to
be a CCL command, but can be simply run. This has run under RSTS/E
versions 8, 9.0. I release it into the public domain.
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# tail.bas
# This archive created: Tue Apr 10 10:14:35 1990
cat << \SHAR_EOF > tail.bas
10 EXTEND
11 &
! TAIL - Print the last part of a file &
! By Ron Nash, San Diego State University &
&
! UT CCL TAIL-=[1,2]TAIL.BAC &
&
! This program will print the last N lines of a file. &
! If N is not specified, the last 20 lines are displayed. &
! Tail can be installed as a CCL command or run. &
&
! Example to print the last 40 lines of STATE.LST type: &
! TAIL STATE.LST 40 &
19 ON ERROR GOTO 900
20 LF$ = CHR$(10) &
\ N% = 20% ! Default number of lines To print
30 CORE.COMMON$ = SYS(CHR$(7%))
40 FIRST.SPACE% = INSTR(1%,CORE.COMMON$," ") &
\ GOTO 800 IF FIRST.SPACE% = 0%
50 SECOND.SPACE% = INSTR(FIRST.SPACE%+1%,CORE.COMMON$," ")
70 IF SECOND.SPACE% = 0% THEN P1$ = RIGHT(CORE.COMMON$,FIRST.SPACE%) &
\ GOTO 100
80 P1$ = MID(CORE.COMMON$,FIRST.SPACE%+1%,SECOND.SPACE%-FIRST.SPACE%)
90 P2$ = RIGHT(CORE.COMMON$,SECOND.SPACE%+1%) &
\ N% = VAL(P2$)
100 DIM M%(30%)
120 F$ = SYS(CHR$(6%)+CHR$(-10%)+P1$)
124 PPN$ = MID(F$,5%,2%)
130 RADIX50.NAME$=MID(F$,7%,6%)
140 DISK.NAME$=MID(F$,23%,4%)
150 F$ = SYS(CHR$(6%)+CHR$(17%)+STRING$(2,255%)+PPN$+ &
RADIX50.NAME$+STRING$(10%,0%)+DISK.NAME$+STRING$(3%,0%))
160 CHANGE F$ TO M%
170 L = M%(13%)+SWAP%(M%(14%))
180 L = 65536.+L IF L<0.
190 L = 65536.*M%(16%)+L
200 ! FILE IS L BLOCKS LONG - READ BACKWARDS UNTIL N LINES &
! READ. PRINT N LINES READING FORWARDS &
210 OPEN P1$ FOR INPUT AS FILE #1%
220 FIELD #1%, 512% AS R$
225 R = L
230 GET #1%, RECORD R
300 FOR K% = 1% TO 512%
310 K% = INSTR(K%,R$,lf$)
320 IF K% = 0% THEN K% = 512% \ GOTO 350
330 LINES.READ% = LINES.READ% + 1%
340 NEXT K%
350 IF LINES.READ% >= N% THEN 400
360 R = R - 1 &
\ IF R < 1 THEN 400
365 GET #1%, RECORD R
370 GOTO 300
400 LINES.TOSKIP% = LINES.READ% - N%
410 LINES.TOSKIP% = 1% IF LINES.TOSKIP% < 0%
420 IF R <= 1 THEN CLOSE #1% &
\ OPEN P1$ FOR INPUT AS FILE #1% &
\ GOTO 500
430 GET #1%, RECORD R-1
500 INPUT LINE #1%, A$ FOR I% = 1% TO LINES.TOSKIP%
510 INPUT LINE #1%, A$
520 PRINT A$;
530 GOTO 510
800 PRINT "_FILE: "; &
\ OPEN 'KB:' AS FILE #1% &
\ INPUT LINE #1%, CORE.COMMON$ &
\ CORE.COMMON$ = CVT$$(CORE.COMMON$,4%+16%+32%) &
\ FIRST.SPACE% = 0% &
\ CLOSE #1% &
\ GOTO 50
900 IF ERL = 510 THEN RESUME 999
910 IF ERR = 2% THEN RESUME 800
912 IF ERL = 800 THEN RESUME 999
920 IF ERR = 5% THEN &
PRINT "%TAIL-W-SEARCHFAIL, error searching for ";P1$ &
\ PRINT "-TAIL-E-FNF, file not found" &
\ RESUME 999
930 IF ERR = 6% THEN &
PRINT "%TAIL-W-SEARCHFAIL, error searching for ";P1$ &
\ PRINT "-TAIL-F-DEV, error in device name or inappropriate device type for operation" &
\ RESUME 999
940 IF ERL = 120 THEN &
PRINT "%TAIL-W-SEARCHFAIL, error searching for ";P1$ &
\ PRINT "-TAIL-F-FNM, error in file name" &
\ RESUME 999
950 IF ERL = 90 THEN &
PRINT "%TAIL-F-INVQUALVAL, value '";P2$;"' invalid for number of lines to print" &
\ RESUME 999
990 ON ERROR GOTO 0
999 END
SHAR_EOF
# End of shell archive
exit 0
--
Ron Nash
San Diego State University
Internet: nash@ucselx.sdsu.edu
UUCP: ucsd!sdsu!ucselx!nash