!*! Updated on 16-Oct-89 at 1:29 PM by Matt Badger; edit time: 0:00:16
!*************************** AMUS Program Label ******************************
! Filename: HOTIDX.RUN                                      Date: 042289
! Category: UTIL         Hash Code: 300-302-307-524      Version: 1.0(101)
! Initials: AMI/AM       Name: AMI BAR-YADIN
! Company: UNITED FASHIONS OF TEXAS                Telephone #:512-631-2277
! Related Files:
! Min. Op. Sys.:                               Expertise Level: INT
! Special: Requires d/RUN
! Description: Prints an index of a d/Soft .HOT key file
!
!
!*****************************************************************************
!* Updated on 16-Aug-89 at 6:34 PM by Ami Bar-Yadin; edit time: 1:54:24 *!
PROGRAM HOTIDX,1.0(103)
!
! by Ami Bar-Yadin, AMI/AM
!
! Display, or write to a file, a list of the keywords of a .HOT key file
!
! Usage:
!
!       .run hotidx {output=}{input}
! IE:   .RUN HOTIDX DBASIC.IDX=HLP:DBASIC.HOT
!
!   o   Default extension for both input and output is .DAT
!
!   o   if no input file is given on the command line,
!       the user is prompted for a file name.
!
!   o   if not output file is given output is displayed on the screen
!
!   o   for more about .HOT key files, please bug Michael Lewis, NOT me.
!
!
       MAP1    IC,F,,1         ! input file channel
       MAP1    OC,F,,2         ! output file channel

       MAP1    OUTFIL,S,30
       MAP1    INFIL,S,30
       MAP1    INRCN,F
       MAP1    INBUF,X,512

       MAP1    TOPIDX,F
       MAP1    TOP'REC
       MAP2            TOP'ENTRIES(64)
       MAP3                    TOP'BLK'FIRST,S,3
       MAP3                    TOP'BLK'LAST,S,3
       MAP3                    TOP'BLK'NO,B,2

       MAP1    KEYWORDS,S,512
       MAP1    INDEX,S,10000
       MAP1    LENINDEX,F

DEF PAGELINES=23
DEF PAGEWIDTH=80
       MAP1    SCREEN'AREA,S
       MAP2            SL,F
       MAP2            SW,F
       MAP2            SLINE(PAGELINES),S,PAGEWIDTH

       MAP1    I,F
       MAP1    J,F
       MAP1    P,F
       MAP1    L,F
       MAP1    A$,S,25
!
!=======
!
HOTIDX:
       GOSUB SETUP
       GOSUB READ'DIRECTORY
       GOSUB PRINT'INDEX
       END

SETUP:
       I=INSTR(1,.OPTIONS,"=")
       WHEN I=0
               OC=0
               INFIL=.OPTIONS
       ELSE
               OUTFIL=.OPTIONS[1,I-1]
               INFIL=.OPTIONS[I+1,-1]
       WEND
       WHEN INFIL=SPACE
               REPEAT
                       INPUT "Input .hot file?";INFIL
                       LOOKUP INFIL,I
               UNTIL I<0
       WEND
       OPEN #IC,INFIL,RANDOM,512,INRCN
       IF OC  OPEN #OC,OUTFIL,OUTPUT
       RETURN


READ'DIRECTORY:
       INRCN=0
       READ #IC TOP'REC
       sort.memory 64 TOP'ENTRIES(1) TOP'BLK'FIRST(1),TOP'BLK'LAST(1)
       FOR TOPIDX=1 TO 64
               INRCN=TOP'BLK'NO(TOPIDX)
               WHEN INRCN>0
                       GOSUB READ'DIR'BLOCK
                       INDEX+=KEYWORDS
                       LENINDEX+=LEN(KEYWORDS)
               WEND
       NEXT
       RETURN

READ'DIR'BLOCK:
       READ #IC INBUF
       KEYWORDS=SPACE
       I=1
       REPEAT
               A$=INBUF[I;20]
               P=LEN(A$)
               IF P=0  BREAK
!               XCALL REPCHR,A$,0," ^",0
               J=0 : DO J=INSTR(J+1,A$," ")  UNTIL J=0 : A$[J;1]="^" : ENDDO
               KEYWORDS=CHR(P)+A$+KEYWORDS
               P+=1
               I+=P+(P MOD 2)+4
       UNTIL 0
       RETURN

PRINT'INDEX:
       WHEN LENINDEX>10000
               PRINT "%Index buffer overflow, some keywords lost"
               LENINDEX=LEN(INDEX)
       WEND
       I=1
       SCREEN'AREA=SPACE : SL=1 : SW=-1
       REPEAT
               P=ASC(INDEX[I;1])
               A$=INDEX[I+1;P]
               I+=1+P
               L=LEN(A$)
               WHEN LEN(SLINE(SL))+L>PAGEWIDTH
                       J=PAGELINES
                       GOSUB OUTPUT'PAGE
                       IF OC  PRINT #OC  ELSE  PRINT
                       WHEN SW>0
                               FOR L=1 TO PAGELINES
                                       SLINE(L)=SLINE(L)[SW+1,-1]
                               NEXT
                       WEND
                       SW=-1
               WEND
               SLINE(SL)+=A$
               SL+=1
               WHEN SL>PAGELINES
                       SL=0
                       FOR L=1 TO PAGELINES
                               SL=SL MAX LEN(SLINE(L))
                       NEXT
                       FOR L=1 TO PAGELINES
                               SLINE(L)+=SPACE(1+SL-LEN(SLINE(L)))
                       NEXT
                       SW=SL+1
                       SL=1
               WEND
       UNTIL I>LENINDEX
       IF SL>1  J=SL-1 : GOSUB OUTPUT'PAGE
       RETURN


OUTPUT'PAGE:
       IF SW>0  J=PAGELINES
       FOR L=1 TO J
               WHEN OC
                       PRINT #OC SLINE(L)[1,SW]
               ELSE
                       PRINT SLINE(L)[1,SW]
               WEND
       NEXT
       RETURN