diff options
Diffstat (limited to 'ipl/procs/pbkform.icn')
-rw-r--r-- | ipl/procs/pbkform.icn | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/ipl/procs/pbkform.icn b/ipl/procs/pbkform.icn new file mode 100644 index 0000000..698a9aa --- /dev/null +++ b/ipl/procs/pbkform.icn @@ -0,0 +1,136 @@ +############################################################################ +# +# File: pbkform.icn +# +# Subject: Procedures to process HP95 phone book files +# +# Author: Robert J. Alexander +# +# Date: August 14, 1996 +# +############################################################################ +# +# This file is in the public domain. +# +############################################################################ +# +# Icon procedure set to read and write HP95LX phone book (.pbk) files. +# +############################################################################ +# +# HP 95LX Phone Book File Format +# +# The HP 95LX Phone Book file is structured as a file identification +# record, followed by a variable number of phone book data records, +# and terminated by an end of file record. Each data record contains +# the information for one phone book entry. +# +# The format of these phone book records is described below. In the +# descriptions, the type <int> refers to a two byte integer stored least +# significant byte first, the type <char> refers to a one byte integer, +# and the type <ASCII> refers to a string of ASCII characters. +# +# HP 95LX Phone Book File Identification Record: +# +# Byte Offset Name Type Contents +# +# 0 ProductCode int -2 (FEh, FFh) +# 2 ReleaseNum int 1 (01h, 00h) +# 4 FileType char 3 (03h) +# +############################################################################ +# +# Links: bkutil +# +############################################################################ +# +# See also: pbkutil.icn, abkform.icn +# +############################################################################ + +link bkutil + +record pbk_id(releaseNum,fileType) + +procedure pbk_write_id(f) + writes(f,"\xfe\xff\x01\x00\x03") + return +end + +procedure pbk_read_id(f) + bk_read_int(f) = 16rfffe | fail + return pbk_id(bk_read_int(f),ord(reads(f))) +end + +# +# HP 95LX Phone Book Data Record: +# +# Byte Offset Name Type Contents +# +# 0 RecordType char 1 (01h) +# 1 RecordLength int Number of bytes in remainder +# of this data record, see note +# below. +# 3 NameLength char Length of name text in bytes. +# 4 NumberLength char Length on number text in bytes. +# 5 AddressLength int Length of address text in bytes. +# 7 NameText ASCII Name text, 30 characters maximum. +# 7+NameLength NumberText ASCII Number text, 30 characters maximum. +# 7+NameLength+ +# NumberLength AddressText ASCII Address text where the null +# character is used as the line +# terminator. Addresses are limited +# to a maximum of 8 lines of 39 +# characters per line (not counting +# the line terminator). +# +record pbk_data(name,number,address) + +procedure pbk_write_data(f,data) + local name,number,address + name := \data.name | "" + number := \data.number | "" + address := \data.address | "" + writes(f,"\x01",bk_int(*name + *number + *address + 4),char(*name), + char(*number),bk_int(*address),name,number,address) + return data +end + +procedure pbk_read_data(f,id) + local next_rec,name_len,number_len,address_len,data + (reads(f) == "\x01" | (seek(f,where(f) - 1),&fail) & + next_rec := bk_read_int(f) + where(f) & + name_len := ord(reads(f)) & + number_len := ord(reads(f)) & + address_len := bk_read_int(f) & + data := pbk_data(reads(f,0 ~= name_len) | "",reads(f,0 ~= number_len) | "", + reads(f,0 ~= address_len) | "") | fail & + seek(f,next_rec)) | fail + return data +end + +# +# HP 95LX Phone Book End of File Record: +# +# Byte Offset Name Type Contents +# +# 0 RecordType char 2 (02h) +# 1 RecordLength int 0 (00h, 00h) +# +procedure pbk_write_end(f) + writes(f,"\x02\x00\x00") + return +end + +procedure pbk_read_end(f,id) + (reads(f) == "\x02" & reads(f,2)) | fail + return +end + +# +# +# Note: Files created by the Phone Book application may contain +# some padding following the last field of some data records. Hence, +# the RecordLength field must be used to determine the start of the +# next record. Phone book files created by other programs need not +# have any padding. |