// IfsPrintErrorInit.bcpl
// Copyright Xerox Corporation 1979, 1980, 1981
// Last modified October 4, 1981 3:57 PM by Taft
get "Ifs.decl"
get "IfsSystemInfo.decl"
get "IfsDirs.decl"
get "IfsFiles.decl"
get "Streams.d"
external
[
// outgoing procedures
InitPrintError
// incoming procedures
ErrCompareKey; ErrEntryLength; UpdateRecord; OpenIFSTree
IFSOpenFile; StreamsFD; PositionPage
ReadLeaderPage; WriteLeaderPage
MyFrame; GotoLabel; Allocate; Free
Closes; Gets; Puts; Errors; IFSError
CreateStringStream
// outgoing static
errorTree
// incoming statics
primaryIFS; sysZone
]
static errorTree
manifest
[
ecRecordGenerator = 40
errorTreePages = 64
]
//----------------------------------------------------------------------------
let InitPrintError() be
//----------------------------------------------------------------------------
[
let str = IFSOpenFile("IFSErrors.Tree!1", 0, modeReadWrite, 0, lcVHighest)
if str eq 0 then
[
str = IFSOpenFile("IFSErrors.Tree!1", 0, modeReadWrite)
if str eq 0 then IFSError(ecCreateEssentialFile)
let ld = Allocate(sysZone, 1 lshift logStdPageLength)
ReadLeaderPage(str, ld)
ld>>ILD.type = ftBinary
ld>>ILD.byteSize = 8
ld>>ILD.noBackup = true
ld>>ILD.undeletable = true
ld>>ILD.readProt.world = false
WriteLeaderPage(str, ld)
Free(sysZone, ld)
PositionPage(str, errorTreePages)
]
errorTree = OpenIFSTree(lv StreamsFD(str)>>FD.dr>>DR.fp, primaryIFS,
ErrCompareKey, ErrEntryLength, true, errorTreePages)
Closes(str)
let name = "<System>IFS.Errors"
let file = IFSOpenFile(name)
if file eq 0 then IFSError(ecTridentFile, name)
let errRec = nil
let ErrorFileEOF(file) be GotoLabel(file>>ST.par2, EOF)
file>>ST.error = ErrorFileEOF
file>>ST.par2 = MyFrame()
[
let char = nil
errRec = Allocate(sysZone, maxLenErrRec)
let errorString = lv errRec>>ErrRec.errorString
// "an unsigned decimal error number (digits only),
// followed optionally by C, M, or L,
// followed by <space>":
let ifsEc = 0
[
char = Gets(file)
if char ls $0 % char gr $9 break
ifsEc = ifsEc*10 + (char-$0)
] repeat
errRec>>ErrRec.ifsEc = ifsEc
while char ne $*S do char = Gets(file)
// InitPrintError (cont'd)
// "followed by the text of the message,
// including carriage returns, etc.
// followed by $$"
let ftpEc = 0
let es = CreateStringStream(errorString, 255)
let dollarPending = false
let inFTPEc = true
[
// if the string begins with an octal number, it's an Ftp error code
char = Gets(file)
if inFTPEc test char ls $0 % char gr $7
ifso [ inFTPEc = false; if char eq $*s loop ]
ifnot [ ftpEc = ftpEc lshift 3 + (char-$0); loop ]
test char eq $$
ifso test dollarPending
ifso break
ifnot dollarPending = true
ifnot
[
if dollarPending then Puts(es, $$)
Puts(es, char)
dollarPending = false
]
] repeat
Closes(es)
// flush trailing returns
while errorString>>STRING.char↑(errorString>>STRING.length) eq $*n do
errorString>>STRING.length = errorString>>STRING.length-1
// finish constructing record and insert into tree
errRec>>ErrRec.ftpEc = ftpEc
errRec>>ErrRec.length =
lenErrRecHeader + errorString>>STRING.length rshift 1 +1
UpdateRecord(errorTree, ifsEc, RecordGenerator, errRec)
] repeat
EOF: Free(sysZone, errRec)
Closes(file)
]
//----------------------------------------------------------------------------
and RecordGenerator(oldRec, newRec) = valof
//----------------------------------------------------------------------------
[
if oldRec ne 0 then
[
IFSError(ecRecordGenerator, oldRec>>ErrRec.ifsEc) //you can proceed
Free(sysZone, oldRec)
]
resultis newRec
]