diff options
Diffstat (limited to 'ipl/procs/abkform.icn')
-rw-r--r-- | ipl/procs/abkform.icn | 532 |
1 files changed, 532 insertions, 0 deletions
diff --git a/ipl/procs/abkform.icn b/ipl/procs/abkform.icn new file mode 100644 index 0000000..82990ae --- /dev/null +++ b/ipl/procs/abkform.icn @@ -0,0 +1,532 @@ +############################################################################ +# +# File: abkform.icn +# +# Subject: Procedures to process HP95LX appointment books +# +# Author: Robert J. Alexander +# +# Date: May 2, 2001 +# +############################################################################ +# +# This file is in the public domain. +# +############################################################################ +# +# Procedures set to read and write HP95LX appointment book (.abk) files. +# +# +# Notes: +# +# 1. Files created by the Appointment 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. Appointment book files created by other programs need not +# have any padding. +# +# 2. ApptState has several bit fields. Only bit 0 is meaningful to software +# processing an appointment book file. Bit 0 being set or cleared +# corresponds to the alarm being enabled or disabled, respectively. +# Programs creating Appointment book files should clear all bits, except +# perhaps bit 0. +# +# 3. ToDoState has two one-bit bit fields. Bit 0 being set or cleared +# corresponds to carry forward being enabled or disabled for this todo +# item, respectively. Bit 1 being set or cleared corresponds to the doto +# being checked off or not checked off, respectively. +# +# 4. Appointment and ToDo texts are each limited to a maximum of 27 +# characters. +# +# 5. Note text is limited to a maximum of 11 lines of 39 characters per line +# (not counting the line terminator). +# +# +############################################################################ +# +# Links: bkutil, pbkform +# +############################################################################ +# +# See also: bkutil.icn, pbkform.icn +# +############################################################################ + +link bkutil, pbkform + +# HP 95LX Appointment Book File Format +# +# The HP 95LX Appointment Book file is structured as a file-identification +# record, followed by a settings record, followed by a variable number of data +# records, and terminated by an end-of-file record. There are multiple types of +# data records corresponding to the different types of appointment book entries. +# +# The formats of these appointment book records is described in the following +# tables. In the descriptions, the type <int> refers to a two-byte integer +# stored least significant byte first, the type <swpint> refers to a two-byte +# integer stored most 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 Appointment Book File Identification Record: +# +# Byte Offset Name Type Contents +# +# 0 ProductCode int -1 (FFh, FFh) +# 2 ReleaseNum int 1 (01h, 00h) +# 4 FileType char 1 (01h) +# +procedure abk_write_id(f) + return writes(f,"\xff\xff\x01\x00\x01") +end + +record abk_id(releaseNum,filetype) + +procedure abk_read_id(f) + bk_read_int(f) = 16rffff | fail + return pbk_id(bk_read_int(f),ord(reads(f))) +end + +# +# HP 95LX Appointment Book Settings Record: +# +# Byte Offset Name Type Contents +# +# 0 StartTime int Daily display start time as the +# number of minutes past midnight. +# 2 Granularity int Daily display time line granularity +# in minutes. +# 4 AlarmEnable char 1 = on, 0 = off +# 5 LeadTime char Alarm default lead time in minutes. +# 6 CarryForward char To do carry forward default, +# 1 = on, 0 = off. +# +record abk_settings(startTime,granularity,alarmEnable,leadTime,carryForward) + +procedure abk_write_settings(f,data) + return writes(f,bk_int(data.startTime),bk_int(data.granularity), + char(data.alarmEnable), char(data.leadTime),char(data.carryForward)) +end + +procedure abk_read_settings(f) + return abk_settings(bk_read_int(f),bk_read_int(f),ord(reads(f)), + ord(reads(f)),ord(reads(f))) +end + +# +# +# HP 95LX Appointment Book Daily 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 1 +# below. +# 3 ApptState char See note 2 below. +# 4 Year char Year counting from 1900. +# 5 Month char Month, 1 - 12. +# 6 Day char Day, 1 - 31. +# 7 StartTime swpint Start time in minutes since midnight. +# 9 EndTime int End time in minutes since midnight. +# 11 LeadTime char Alarm lead time in minutes, 0 - 30. +# 12 ApptLength char Length of appointment text in bytes. +# 13 NoteLength int Length of note text in bytes. +# 15 ApptText ASCII Appointment text - see note 4 below. +# 15+ApptLength NoteText ASCII Note text where the null character +# is used as the line terminator - +# see note 5. +# +record abk_daily(alarmEnable,year,month,day,startTime,endTime,leadTime, + apptText,noteText) + +procedure abk_write_daily(f,data) + writes(char((\data.alarmEnable,1) | 0), + char(data.year),char(data.month),char(data.day), + bk_int(data.startTime),bk_int(data.endTime),bk_int(data.leadTime), + char(*data.apptText),char(*data.noteText),data.apptText,data.noteText) + return data +end + +procedure abk_read_daily(f) + local alarmEnable,year,month,day,startTime,endTime,leadTime, + apptText,noteText,apptLength,noteLength,next_rec + (reads(f) == "\x01" | (seek(f,where(f) - 1),&fail) & + next_rec := bk_read_int(f) + where(f) & + alarmEnable := iand(ord(reads(f)),1) = 1 | &null & + year := ord(reads(f)) & + month := ord(reads(f)) & + day := ord(reads(f)) & + startTime := bk_read_int(f) & + endTime := bk_read_int(f) & + leadTime := ord(reads(f)) & + apptLength := ord(reads(f)) & + noteLength := bk_read_int(f) & + apptText := reads(f,apptLength) & + noteText := reads(f,noteLength)) | fail + return abk_daily(alarmEnable,year,month,day,startTime,endTime,leadTime, + apptText,noteText) +end + +# +# HP 95LX Appointment Book Weekly Data Record: +# +# Byte Offset Name Type Contents +# +# 0 RecordType char 2 (02h) +# 1 RecordLength int Number of bytes in remainder +# of this data record, see note 1 +# below. +# 3 ApptState char See note 2 below. +# 4 DayOfWeek char Day of week, 1=Sun, ..., 7=Sat. +# 5 StartTime swpint Start time in minutes since midnight. +# 7 StartYear char Start year counting from 1900. +# 8 StartMonth char Start month, 1 - 12. +# 9 StartDay char Start day, 1 - 31. +# 10 EndTime int End time in minutes since midnight. +# 12 EndYear char End year counting from 1900. +# 13 EndMonth char End month, 1 - 12. +# 14 EndDay char End day, 1 - 31. +# 15 LeadTime char Alarm lead time in minutes, 0 - 30. +# 16 ApptLength char Length of appointment text in bytes. +# 17 NoteLength int Length of note text in bytes. +# 19 ApptText ASCII Appointment text - see note 4 below. +# 19+ApptLength NoteText ASCII Note text where the null character +# is used as the line terminator - +# see note 5 below. +# +record abk_weekly(alarmEnable,dayOfWeek,startTime,startYear,startMonth,startDay, + endTime,endYear,endMonth,endDay,leadTime,apptText,noteText) + +procedure abk_write_weekly(f,data) + writes(char((\data.alarmEnable,1) | 0), + char(data.dayOfWeek), + bk_int(data.startTime),char(data.startYear), + char(data.startMonth),char(data.startDay), + bk_int(data.endTime),char(data.endYear), + char(data.endMonth),char(data.endDay), + bk_int(data.leadTime), + char(*data.apptText),char(*data.noteText),data.apptText,data.noteText) + return data +end + +procedure abk_read_weekly(f) + local alarmEnable,dayOfWeek,startTime,startYear,startMonth,startDay, + endTime,endYear,endMonth,endDay,leadTime,apptLength,noteLength, + apptText,noteText,next_rec + (reads(f) == "\x02" | (seek(f,where(f) - 1),&fail) & + next_rec := bk_read_int(f) + where(f) & + alarmEnable := iand(ord(reads(f)),1) = 1 | &null & + dayOfWeek := ord(reads(f)) & + startTime := bk_read_int(f) & + startYear := ord(reads(f)) & + startMonth := ord(reads(f)) & + startDay := ord(reads(f)) & + endTime := bk_read_int(f) & + endYear := ord(reads(f)) & + endMonth := ord(reads(f)) & + endDay := ord(reads(f)) & + leadTime := ord(reads(f)) & + apptLength := ord(reads(f)) & + noteLength := bk_read_int(f) & + apptText := reads(f,apptLength) & + noteText := reads(f,noteLength)) | fail + return abk_daily(alarmEnable,dayOfWeek,startTime,startYear,startMonth, + startDay,endTime,endYear,endMonth,endDay,leadTime,apptText,noteText) +end + +# +# +# HP 95LX Appointment Book Monthly by Date Data Record: +# +# Byte Offset Name Type Contents +# +# 0 RecordType char 3 (03h) +# 1 RecordLength int Number of bytes in remainder +# of this data record, see note 1 +# below. +# 3 ApptState char See note 2 below. +# 4 DayOfMonth char Day of month, 1 - 31. +# 5 StartTime swpint Start time in minutes since midnight. +# 7 StartYear char Start year counting from 1900. +# 8 StartMonth char Start month, 1 - 12. +# 9 StartDay char Start day, 1 - 31. +# 10 EndTime int End time in minutes since midnight. +# 12 EndYear char End year counting from 1900. +# 13 EndMonth char End month, 1 - 12. +# 14 EndDay char End day, 1 - 31. +# 15 LeadTime char Alarm lead time in minutes, 0 - 30. +# 16 ApptLength char Length of appointment text in bytes. +# 17 NoteLength int Length of note text in bytes. +# 19 ApptText ASCII Appointment text - see note 4 below. +# 19+ApptLength NoteText ASCII Note text where the null character +# is used as the line terminator - +# see note 5 below. +# +record abk_monthly(alarmEnable,dayOfMonth,startTime,startYear,startMonth, + startDay,endTime,endYear,endMonth,endDay,leadTime,apptText,noteText) + +procedure abk_write_monthly(f,data) + writes(char((\data.alarmEnable,1) | 0), + char(data.dayOfMonth), + bk_int(data.startTime),char(data.startYear), + char(data.startMonth),char(data.startDay), + bk_int(data.endTime),char(data.endYear), + char(data.endMonth),char(data.endDay), + bk_int(data.leadTime), + char(*data.apptText),char(*data.noteText),data.apptText,data.noteText) + return data +end + +procedure abk_read_monthly(f) + local alarmEnable,dayOfMonth,startTime,startYear,startMonth,startDay, + endTime,endYear,endMonth,endDay,leadTime,apptLength,noteLength, + apptText,noteText,next_rec + (reads(f) == "\x03" | (seek(f,where(f) - 1),&fail) & + next_rec := bk_read_int(f) + where(f) & + alarmEnable := iand(ord(reads(f)),1) = 1 | &null & + dayOfMonth := ord(reads(f)) & + startTime := bk_read_int(f) & + startYear := ord(reads(f)) & + startMonth := ord(reads(f)) & + startDay := ord(reads(f)) & + endTime := bk_read_int(f) & + endYear := ord(reads(f)) & + endMonth := ord(reads(f)) & + endDay := ord(reads(f)) & + leadTime := ord(reads(f)) & + apptLength := ord(reads(f)) & + noteLength := bk_read_int(f) & + apptText := reads(f,apptLength) & + noteText := reads(f,noteLength)) | fail + return abk_daily(alarmEnable,dayOfMonth,startTime,startYear,startMonth, + startDay,endTime,endYear,endMonth,endDay,leadTime,apptText,noteText) +end + +# +# HP 95LX Appointment Book Monthly by Position Data Record: +# +# Byte Offset Name Type Contents +# +# 0 RecordType char 4 (04h) +# 1 RecordLength int Number of bytes in remainder +# of this data record, see note 1 +# below. +# 3 ApptState char See note 2 below. +# 4 WeekOfMonth char Week of month, 1 - 5. +# 5 DayOfWeek char Day of week, 1=Sun, ..., 7=Sat. +# 6 StartTime swpint Start time in minutes since midnight. +# 8 StartYear char Start year counting from 1900. +# 9 StartMonth char Start month, 1 - 12. +# 10 StartDay char Start day, 1 - 31. +# 11 EndTime int End time in minutes since midnight. +# 13 EndYear char End year counting from 1900. +# 14 EndMonth char End month, 1 - 12. +# 15 EndDay char End day, 1 - 31. +# 16 LeadTime char Alarm lead time in minutes, 0 - 30. +# 17 ApptLength char Length of appointment text in bytes. +# 18 NoteLength int Length of note text in bytes. +# 20 ApptText ASCII Appointment text - see note 4 below. +# 20+ApptLength NoteText ASCII Note text where the null character +# is used as the line terminator - +# see note 5 below. +# +record abk_monthly_pos(alarmEnable,weekOfMonth,dayOfWeek,startTime,startYear, + startMonth,startDay,endTime,endYear,endMonth,endDay,leadTime, + apptText,noteText) + +procedure abk_write_monthly_pos(f,data) + writes(char((\data.alarmEnable,1) | 0), + char(data.weekOfMonth), + char(data.dayOfWeek), + bk_int(data.startTime),char(data.startYear), + char(data.startMonth),char(data.startDay), + bk_int(data.endTime),char(data.endYear), + char(data.endMonth),char(data.endDay), + bk_int(data.leadTime), + char(*data.apptText),char(*data.noteText),data.apptText,data.noteText) + return data +end + +procedure abk_read_monthly_pos(f) + local alarmEnable,weekOfMonth,dayOfWeek,startTime,startYear,startMonth, + startDay,endTime,endYear,endMonth,endDay,leadTime,apptLength,noteLength, + apptText,noteText,next_rec + (reads(f) == "\x04" | (seek(f,where(f) - 1),&fail) & + next_rec := bk_read_int(f) + where(f) & + alarmEnable := iand(ord(reads(f)),1) = 1 | &null & + weekOfMonth := ord(reads(f)) & + dayOfWeek := ord(reads(f)) & + startTime := bk_read_int(f) & + startYear := ord(reads(f)) & + startMonth := ord(reads(f)) & + startDay := ord(reads(f)) & + endTime := bk_read_int(f) & + endYear := ord(reads(f)) & + endMonth := ord(reads(f)) & + endDay := ord(reads(f)) & + leadTime := ord(reads(f)) & + apptLength := ord(reads(f)) & + noteLength := bk_read_int(f) & + apptText := reads(f,apptLength) & + noteText := reads(f,noteLength)) | fail + return abk_daily(alarmEnable,weekOfMonth,dayOfWeek,startTime,startYear, + startMonth,startDay,endTime,endYear,endMonth,endDay,leadTime,apptText, + noteText) +end + +# +# HP 95LX Appointment Book Yearly Data Record: +# +# Byte Offset Name Type Contents +# +# 0 RecordType char 5 (05h) +# 1 RecordLength int Number of bytes in remainder +# of this data record, see note 1 +# below. +# 3 ApptState char See note 2 below. +# 4 MonthOfYear char Month of year, 1=Jan, ... 12=Dec. +# 5 DayOfMonth char Day of month, 1 - 31. +# 6 StartTime swpint Start time in minutes since midnight. +# 8 StartYear char Start year counting from 1900. +# 9 StartMonth char Start month, 1 - 12. +# 10 StartDay char Start day, 1 - 31. +# 11 EndTime int End time in minutes since midnight. +# 13 EndYear char End year counting from 1900. +# 14 EndMonth char End month, 1 - 12. +# 15 EndDay char End day, 1 - 31. +# 16 LeadTime char Alarm lead time in minutes, 0 - 30. +# 17 ApptLength char Length of appointment text in bytes. +# 18 NoteLength int Length of note text in bytes. +# 20 ApptText ASCII Appointment text - see note 4 below. +# 20+ApptLength NoteText ASCII Note text where the null character +# is used as the line terminator - +# see note 5 below. +# +record abk_yearly(alarmEnable,monthOfYear,dayOfMonth,startTime,startYear, + startMonth,startDay,endTime,endYear,endMonth,endDay,leadTime, + apptText,noteText) + +procedure abk_write_yearly(f,data) + writes(char((\data.alarmEnable,1) | 0), + char(data.monthOfYear), + char(data.dayOfMonth), + bk_int(data.startTime),char(data.startYear), + char(data.startMonth),char(data.startDay), + bk_int(data.endTime),char(data.endYear), + char(data.endMonth),char(data.endDay), + bk_int(data.leadTime), + char(*data.apptText),char(*data.noteText),data.apptText,data.noteText) + return data +end + +procedure abk_read_yearly(f) + local alarmEnable,monthOfYear,dayOfMonth,startTime,startYear,startMonth, + startDay,endTime,endYear,endMonth,endDay,leadTime,apptLength,noteLength, + apptText,noteText,next_rec + (reads(f) == "\x05" | (seek(f,where(f) - 1),&fail) & + next_rec := bk_read_int(f) + where(f) & + alarmEnable := iand(ord(reads(f)),1) = 1 | &null & + monthOfYear := ord(reads(f)) & + dayOfMonth := ord(reads(f)) & + startTime := bk_read_int(f) & + startYear := ord(reads(f)) & + startMonth := ord(reads(f)) & + startDay := ord(reads(f)) & + endTime := bk_read_int(f) & + endYear := ord(reads(f)) & + endMonth := ord(reads(f)) & + endDay := ord(reads(f)) & + leadTime := ord(reads(f)) & + apptLength := ord(reads(f)) & + noteLength := bk_read_int(f) & + apptText := reads(f,apptLength) & + noteText := reads(f,noteLength)) | fail + return abk_daily(alarmEnable,monthOfYear,dayOfMonth,startTime,startYear, + startMonth,startDay,endTime,endYear,endMonth,endDay,leadTime,apptText, + noteText) +end + +# +# HP 95LX Appointment Book To Do Data Record: +# +# Byte Offset Name Type Contents +# +# 0 RecordType char 6 (06h) +# 1 RecordLength int Number of bytes in remainder +# of this data record, see note 1 +# below. +# 3 ToDoState char See note 3 below. +# 4 Priority char Priority, 1 - 9. +# 5 StartYear char Start year counting from 1900. +# 6 StartMonth char Start month, 1 - 12. +# 7 StartDay char Start day, 1 - 31. +# 8 CheckOffYear char Check off year counting from 1900, +# 0 indicates not checked off. +# 9 CheckOffMonth char Check off month, 1 - 12, +# 0 indicates not checked off. +# 10 CheckOffDay char Check off day, 1 - 31, +# 0 indicates not checked off. +# 11 ToDoLength char Length of to do text in bytes. +# 12 NoteLength int Length of note text in bytes. +# 14 ToDoText ASCII To do text - see note 4 below. +# 14+ToDoLength NoteText ASCII Note text where the null character +# is used as the line terminator - +# see note 5 below. +# +record abk_todo(carryForward,checkOff,priority,startYear,startMonth, + startDay,CheckOffYear,CheckOffMonth,CheckOffDay,toDoText,toDoNote) + +procedure abk_write_todo(f,data) + writes(char(ior((\data.carryForward,1) | 0,(\data.checkOff,2) | 0)), + char(data.priority), + char(data.startYear), + char(data.startMonth),char(data.startDay), + char(data.checkOffYear), + char(data.checkOffMonth),char(data.checkOffDay), + char(*data.toDoText),char(*data.noteText),data.toDoText,data.noteText) + return data +end + +procedure abk_read_todo(f) + local carryForward,checkOff,priority,startYear,startMonth, + startDay,CheckOffYear,CheckOffMonth,CheckOffDay,toDoLength,noteLength, + toDoText,toDoNote,toDoState,next_rec + (reads(f) == "\x06" | (seek(f,where(f) - 1),&fail) & + next_rec := bk_read_int(f) + where(f) & + toDoState := ord(reads(f)) & + carryForward := iand(toDoState,1) = 1 | &null & + checkOff := iand(toDoState,2) = 1 | &null & + priority := ord(reads(f)) & + startYear := ord(reads(f)) & + startMonth := ord(reads(f)) & + startDay := ord(reads(f)) & + CheckOffYear := ord(reads(f)) & + CheckOffMonth := ord(reads(f)) & + CheckOffDay := ord(reads(f)) & + toDoLength := ord(reads(f)) & + noteLength := bk_read_int(f) & + toDoText := reads(f,toDoLength) & + toDoNote := reads(f,noteLength)) | fail + return abk_daily(carryForward,checkOff,priority,startYear,startMonth, + startDay,CheckOffYear,CheckOffMonth,CheckOffDay,toDoText,toDoNote) +end + +# +# HP 95LX Appointment Book End of File Record: +# +# Byte Offset Name Type Contents +# +# 0 RecordType char 50 (32h) +# 1 RecordLength int 0 (00h, 00h) +# +procedure abk_write_end(f) + writes(f,"\x32\x00\x00") + return +end + +procedure abk_read_end(f,id) + (reads(f) == "\x32" & reads(f,2)) | fail + return +end |