! Display status of ISAM data files -- 9/1/87 -- V1.0

        !  Written by:  Thomas D Bellmer
        !               Curran, Colyer & Clifford, Attorneys at Law
        !               P O Box 600
        !               Osage Beach, MO  65065
        !               (314) 348-3157

! DESCRIPTION:
!   Reads the directory rock of all '.IDX' files contained in the input file,
! INDEX.FIL (WARNING -- no file or record locking is used).  Index files
! greater than 95% full will be highlighted by an asterisk (*).

! REQUIRES:
!     The following two subroutines are available on the AMUS Network
!   SYSTEM.SBR  --  AMOS calls within AlphaBASIC   by Dale A. Eichbauer
!   LOGPPN.SBR  --  Get current account (dev:p,pn) by Doug Azzarito

! OPERATION:
!   After compiling this program in DSK0:7,6 (BAS:), type RUN ISAMST from
! any partition.  Select either 'E' to exit; 'S' to display a single, or all
! ISAM files on screen; or 'P' to print status of all ISAM files.
!   If you want to print all files, a prompt will be given to include any
! new ISAM files created since the last report.
!   If you want output only on one particular ISAM file, enter that filename
! (do not use the '.IDA' extension).  This is only for screen output.
PROGRAM ISAMST,1.0A

MAP1 IDX'CTL
       MAP2 IDF1(5),B,2        ! Filler
       MAP2 R'SIZ,B,2          ! Record size
       MAP2 K'SIZ,B,1          ! Key size
       MAP2 IDF1,B,1           ! Filler
       MAP2 IDF2,B,2           ! Filler
       MAP2 KEY'P,B,2          ! Key position
       MAP2 IDF3(3),B,2        ! Filler
       MAP2 F'C2,B,2           ! IDA freecount
       MAP2 FREE'COUNT,B,2     !
       MAP2 IDF4(4),B,2        ! Filler
       MAP2 AL2,B,2            ! Records allocated
       MAP2 ALLOC,B,2          !
       MAP2 IDF5,X,470         ! Filler
MAP1 FILE'NAME,S,26             ! File name
MAP1 PLINE,S,78                 ! Print line (variable holder)
MAP1 O,S,1,"S"                  ! Output to
MAP1 NF,S,1,"N"                 ! New file
MAP1 ACCOUNT,S,15               ! Which account you are in
MAP1 BAS'ACT,S,1,"Y"            ! Logged into BAS: account
MAP1 LOG'ACT,S,19               ! LOG back to account you were in
MAP1 ONE,F,6                    ! Display one or all ISAM files on system
MAP1 TODAY,S,11
MAP1 MONTH,S,3
MAP1 BINDATE,B,4
MAP1  FILLDATE,@BINDATE
       MAP2 MO,B,1
       MAP2 DY,B,1
       MAP2 YR,B,1
BINDATE=DATE
MONTH=(" JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC")[MO*4;-3]
TODAY=DY+" "+MONTH+" 19"+YR

OUTPUT'TO:
 ON ERROR GOTO END'NOW
 ? TAB(-1,0);TAB(4,18);"***  DISPLAY STATUS OF ISAM DATA FILES  ***"
 ? TAB(10,8);"'E' to exit or 'S'creen 'P'rinter (E/S/P)?  S";CHR(8);
 INPUT "",O  : O=UCS(O) : ONE=2
 ON INSTR(1,"ESP",O)+1 GOTO OUTPUT'TO,END'NOW,SINGLE'FILE
OPEN'FILES:
   IF O="P" THEN CH=3 ELSE CH=0
 OPEN #CH,"IDXREP.LST",OUTPUT
 LOOKUP "DSK0:INDEX.FIL[7,6]",FOUND
   IF FOUND > 0 THEN ? TAB(14,24);"Any new index files (Y/N)?  N";CHR(8);&
     : INPUT "",NF : IF UCS(NF) # "Y" GOTO BEGIN'REPORT
 XCALL LOGPPN,ACCOUNT
   IF ACCOUNT # "DSK0:[7,6]" THEN BAS'ACT="N" : LOG'ACT="LOG "+ACCOUNT &
     : XCALL SYSTEM,"LOG DSK0:[7,6]"
 ? TAB(5,1);TAB(-1,10)
 ? TAB(18,16);"PRODUCING NEW ISAM FILE LISTING  --  PLEASE WAIT"
   IF FOUND # 0 KILL "INDEX.FIL"
 XCALL SYSTEM,"DIR/D DSK0:INDEX.FIL[7,6] = ALL:*.IDX[]"
   IF BAS'ACT="N" THEN XCALL SYSTEM,LOG'ACT : BAS'ACT="Y"

BEGIN'REPORT:
 ? TAB(-1,0)
   IF O="P" ? TAB(12,22);"Current file:  ";
 CALL PRINT'NOBREAK
 OPEN #1,"DSK0:INDEX.FIL[7,6]",INPUT   ! Open list of *.IDX files

NEXT'IDX:
 INPUT LINE #1,FILE'NAME
     IF EOF(1)=1 THEN GOTO END'IT
  LOOKUP FILE'NAME,FOUND
     IF FOUND = 0 ON ONE GOTO END'IT,NEXT'IDX  ! File does not exist
     IF O="P" THEN ? TAB(12,37);FILE'NAME+SPACE(6);
 READ'IDX:
  OPEN #2,FILE'NAME,RANDOM,512,F2      ! Open '.IDX' as a random file
  READ #2,IDX'CTL                      ! Read directory rock
  CLOSE #2
  FREE=FREE'COUNT+(F'C2*65536)         ! Shift high and low order words
  AL=ALLOC+(AL2*65536)
  TOTAL=FREE+AL                        ! Total number of records
  PCNT=(AL/TOTAL)*100                  ! Percentage full
  Q=INSTR(1,FILE'NAME,".IDX")
    IF Q # 0 FILE'NAME=FILE'NAME[1;Q-1]+FILE'NAME[Q+4,26]
  PLINE[3;22]=FILE'NAME
  PLINE[26;2]=KEY'P USING "##"
  PLINE[32;2]=K'SIZ USING "##"
  PLINE[39;3]=R'SIZ USING "###"
  PLINE[47;9]=AL USING "########,"
  PLINE[60;9]=TOTAL USING "########,"
  PLINE[73;6]=PCNT  USING "###.##"
    IF PCNT => 95 PLINE[1;1]="*"       ! Mark file as being nearly full
  CALL PRINT
    IF ONE=1 GOTO END'IT               ! Only one file requested
GOTO NEXT'IDX

PRINT:
 LINCNT=LINCNT+1
   IF O="P" THEN ? #CH,PLINE ELSE ? TAB(LINCNT,1);PLINE
 PLINE=SPACE(78)
   IF O="S" AND LINCNT < 21 RETURN
   IF O="P" AND LINCNT < 55 RETURN
   IF O="P" CALL PRINT'HEAD : RETURN
 ? TAB(23,24); : INPUT "'CR' to continue or 'E' to end ",CR$
   IF UCS(CR$)="E" THEN GOTO END'NOW
 LINCNT=5
 ? TAB(6,1);TAB(-1,10)
RETURN

PRINT'HEAD:
  ? #CH,CHR$(12)
PRINT'NOBREAK:
 PG=PG+1 : LINCNT=0
 PLINE[3;18]="Date:  "+TODAY
 PLINE[26;29]="ISAM DATA FILES STATUS REPORT"
 PLINE[63;16]="Page number:  "+PG
 CALL PRINT
 PLINE[28;20]="Key       Rec."
 CALL PRINT
 PLINE[6;79]="Filename           Pos  Size    Lgth"
 PLINE[48;31]="No. used    Allowable    % used"
 CALL PRINT
  FOR I = 3 TO 78 : PLINE[I;1]="-" : NEXT I
 CALL PRINT : CALL PRINT
RETURN

SINGLE'FILE:
 ? TAB(12,18);"'CR' for all or enter filename :  ";
 INPUT LINE "",FILE'NAME
 FILE'NAME=UCS(FILE'NAME)
   IF FILE'NAME = "" : GOTO OPEN'FILES
 X=INSTR(1,FILE'NAME,".IDX")
 Y=INSTR(1,FILE'NAME,"[")
   IF X=0 AND Y=0 THEN FILE'NAME=FILE'NAME+".IDX" ! In same account
   IF X=0 AND Y#0 FILE'NAME=FILE'NAME[1;Y-1]+".IDX"+FILE'NAME[Y,LEN(FILE'NAME)]
 LOOKUP FILE'NAME,FND : IF FND=0 THEN ? TAB(22,20);&
    : INPUT "FILE NOT FOUND  'CR' TO CONTINUE ",CR : GOTO OUTPUT'TO
   IF FILE'NAME # "" ONE=1 : ?TAB(-1,0) : CALL PRINT'NOBREAK : GOTO READ'IDX

END'IT:
   IF ONE=1 ? TAB(23,34);:INPUT "'CR' to continue ",CR
 CLOSE #CH
   IF ONE=1 GOTO OUTPUT'TO
   IF O="P" XCALL SPOOL,"IDXREP.LST","",4  ! Print and erase file
END'NOW:
   IF ERR(0)=1 AND BAS'ACT="N" THEN XCALL SYSTEM,LOG'ACT ! GOTO orig account
 ? TAB(23,24);CHR(7);">>****   End of program   ****<<" : END