"index" command v1.1: With only a pathname (no other parameters), lists all the names

that are indexed into the file. Example: index %help/indexed.help.
This commit is contained in:
Dave Lyons 2020-08-18 00:09:45 -07:00
parent cac960e4e4
commit ad81c96a4a
1 changed files with 88 additions and 6 deletions

View File

@ -6,6 +6,16 @@
; index -- build an indexed file
;
;*********************************************
; Options:
; pathname
; -s <size>: Create a new file with specified index size
; -v name: View an entry from the file
; -a filename: Add specified file to the indexed file
; -e name: Add a 2nd name for the file being added
;
; With only a pathname specified, prints a list of all
; the items in the file.
;*********************************************
;
; Format of an indexed file is:
;
@ -19,7 +29,10 @@
; :
; $00
;
; Text chunks are terminated by a $00.
; Text chunks are terminated by a $00. The data
; is compressed, with 16 common characters using
; only 5 bits (%1xxxx), and the remaining ones
; using 8 bits (%0xxxxxxx).
;
;*********************************************
;
@ -38,7 +51,7 @@
OrgAdr = $A000 ;change as necessary (end below $B000)
; org OrgAdr
MyVersion = $10
MyVersion = $11
MinVersion = $11
;*********************************************
rts
@ -60,11 +73,11 @@ descr: pstr "build an indexed file"
;*********************************************
; dum xczpage ;32 locations
path = xczpage ;ds 2 ;index file
size = path+2 ;ds 2
fpath = size+2 ;ds 2 ;file being added
path = xczpage ;ds 2 ;index file
size = path+2 ;ds 2
fpath = size+2 ;ds 2 ;file being added
free_spc = fpath+2 ;ds 3 ;free index space
bits = free_spc+3 ;ds 1
bits = free_spc+3 ;ds 1
ViewName = bits+1 ;ds 2
extra_flag = ViewName+2 ;ds 1
oldEOFval = extra_flag+1 ;ds 3
@ -92,7 +105,76 @@ not_e:
bcs not_v
jsr ViewFile
not_v:
jsr xgetnump ;if there is only 1 parameter (the pathname), then view the index
cmp #1
beq ViewIndex
rts
;*********************************************
ViewIndex:
lda path+1
ldy path
jsr OpenFile
sta r4ref
sta EOFref
lda #0
sta previousOffset
sta previousOffset+1
sta previousOffset+2
tax
ldy #$C
jsr SeekIndex ; file index in AXY
jsr read4
jsr SeekIndex
@next: jsr ReadOneName
bcs @noMore
jsr NewLineIfNewEntry ; stay on same line for an additional entry at the same offset
bcs @exit
jsr PrintName
jmp @next
@noMore:
@exit: jmp crout
; Print one name from the index.
; pagebuff contains length-prefixed string followed by 4-byte offset, 4-byte length.
PrintName:
jsr xmess
cstr " " ; this comes at the start of the line OR separates entries on the same line
ldx pagebuff
ldy #0
: lda pagebuff+1,y
ora #$80
jsr cout
iny
dex
bne :-
rts
; Returns SEC if the user wants to abort output.
NewLineIfNewEntry:
ldx pagebuff
lda pagebuff+1,x ; low byte of offset (follows length-prefixed string)
cmp previousOffset
bne @newLine
lda pagebuff+2,x
cmp previousOffset+1
bne @newLine
lda pagebuff+3,x
cmp previousOffset+2
beq @newLine
clc
rts
@newLine:
sta previousOffset+2
lda pagebuff+2,x
sta previousOffset+1
lda pagebuff+1,x
sta previousOffset
croutAndCheckWait:
jsr crout
jmp xcheck_wait
previousOffset: .res 3
;*********************************************
crfail: jmp xProDOS_err
CreateSize: