\ FILER - Copyright 2006,2009 J.L. Bezemer
\ You can redistribute this file and/or modify it under
\ the terms of the GNU General Public License
true constant ignorenumbers
include lib/interprt.4th
include lib/ansblock.4th
include lib/padding.4th
\ ENTER Finds the first free record, then moves four strings delimited
\ by commas into the surname, given, job and phone fields
\ of that record.
\ Usage: ENTER lastname,firstname,job,phone
\ REMOVE Erases the current record.
\ CHANGE Changes the contents of the given field in the current record.
\ Usage: CHANGE field-name new-contents
\ GET Prints the contents of the given type of field from the current
\ record.
\ Usage: GET field-name
\ FIND Finds the record in which there is a match between the contents
\ of the given field and the given string.
\ Usage: FIND field-name string
\ ANOTHER Beginning with the next record after the current one, and using
\ KIND to determine type of field, attempts to find a match on WHAT.
\ If successful, types the name; otherwise nothing.
\ ALL Beginning at the top of the file, uses KIND to determine type of
\ field and finds all matches on WHAT. Types the full name(s).
\ FULLNAME Types the current full name.
1 constant oops \ general error
16 chars constant /field \ size of any field
[char] , constant ',' \ ASCII character ,
[char] - constant '-' \ ASCII character -
struct \ field structure
/field +field surname \ field surname
/field +field given \ field given name
/field +field job \ field job
/field +field phone \ field telephone
end-struct entry
variable chapter \ screen number
variable verse \ record number
variable window \ address of screen buffer
/field 1 [+] string what \ temporary string search argument
c/l l/scr [*] entry [/] -1 [+] constant max-verses
0 value kind \ temporary field
:noname oops throw ; is NotFound ( --)
create fields \ phonebook fields
," surname" ' surname ,
," given" ' given ,
," job" ' job ,
," phone" ' phone ,
NULL ,
\ search fields and return offset
:this fields does>
bl parse rot 2 string-key row
if nip nip cell+ @c dup to kind else drop notfound then
;
: select save-buffers dup chapter ! block window ! 0 verse ! ;
: that! /field min what place what /field +pad ;
: field! >r that! what r> /field cmove ;
: parse, ',' parse ; ( -- a n)
: top 0 select ; ( --)
: this window @ verse @ entry * + ; ( -- a)
: next verse @ max-verses = if chapter @ 1+ select else 1 verse +! then ;
: what? top 0 parse that! ; ( --)
: .field /field -trailing type ; ( a --)
: field? this fields + ; ( -- a)
: _remove this entry '-' fill update ; ( --)
: _get field? .field cr ; ( --)
: _bye save-buffers quit ; ( --)
: _change field? 0 parse rot field! update ;
: _fullname this given .field space this surname .field cr ;
: entry? ( -- f)
this entry bounds \ setup record addresses
begin 2dup > while dup c@ bl = while char+ repeat <>
;
: _enter ( --)
top begin entry? while next repeat \ find empty entry
parse, this surname field! parse, this given field!
parse, this job field! parse, this phone field! update
;
\ search for WHAT
: search ( a1 -- a2)
begin \ compare strings
dup chars this + /field what count compare
while \ not found?
entry? if next else exit then \ continue if not empty
repeat _fullname \ print fullname
;
: _another kind next search drop ; ( --)
: _find fields what? search drop ; ( --)
: _all kind top begin search entry? while next repeat drop ;
create wordlist \ commands
," enter" ' _enter ,
," remove" ' _remove ,
," change" ' _change ,
," get" ' _get ,
," fullname" ' _fullname ,
," find" ' _find ,
," another" ' _another ,
," all" ' _all ,
," bye" ' _bye ,
NULL ,
wordlist to dictionary
: phonebook ( --)
begin
." OK" cr refill drop ['] interpret catch
if ." Oops! " then
again
;
: setup argn 2 < abort" Usage: filer phonebook.scr" 1 args use-block top ;
setup phonebook
|