// ResistState.bcpl
// Last modified November 6, 1979 2:40 PM
get "Resist.decl"
get "Streams.d"
get "AltoFileSys.d"
external
[
// outgoing procedures
InitState; ScalarState; StringState; ICState
GetBlock; PutBlock; ReEstablishStream
// incoming procedures
SymbolsObject; ObjectsString; MustLookupSymbol; ReportError
OpenFile; CreateDiskStream; JumpToFa
Gets; Puts; Allocate; Free; CallSwat
// outgoing statics
stateStream
// incoming statics
serialNumber; errorTolerance; maxNPins; stuffed
resName; outName; symbolTable
sysZone
]
static
[
stateStream
]
// ---------------------------------------------------------------------------
let InitState(restore) be
// ---------------------------------------------------------------------------
[
stateStream = OpenFile("Resist.state$", ksTypeReadWrite, wordItem)
if stateStream eq 0 then
[ ReportError("Cannot restart -- Resist.state$ missing"); abort ]
ScalarState(restore, lv serialNumber, lv errorTolerance, lv maxNPins,
lv stuffed)
StringState(restore, lv resName, lv outName)
]
// ---------------------------------------------------------------------------
and ScalarState(restore, lvScalar, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil; numargs na) be
// ---------------------------------------------------------------------------
[
let lvLvScalar = lv lvScalar
for i = 0 to na-2 do
test restore
ifso @(lvLvScalar!i) = Gets(stateStream)
ifnot Puts(stateStream, @(lvLvScalar!i))
]
// ---------------------------------------------------------------------------
and StringState(restore, lvString, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil; numargs na) be
// ---------------------------------------------------------------------------
[
let lvLvString = lv lvString
for i = 0 to na-2 do
test restore
ifso
[
let word0 = Gets(stateStream)
let lenString = word0<<String.length rshift 1 +1
let string = Allocate(sysZone, lenString)
string!0 = word0
GetBlock(stateStream, string+1, lenString-1)
@(lvLvString!i) = string
]
ifnot
[
let string = @(lvLvString!i)
let lenString = string>>String.length rshift 1 +1
PutBlock(stateStream, string, lenString)
]
]
// ---------------------------------------------------------------------------
and ICState(restore, ic) = valof
// ---------------------------------------------------------------------------
[
test restore
ifso
[
let icString = nil
StringState(true, lv icString)
ic = SymbolsObject(MustLookupSymbol(symbolTable, icString))
Free(sysZone, icString)
]
ifnot
[
let icString = ObjectsString(ic)
StringState(false, lv icString)
]
for i = 1 to ic>>IC.nPins do
ScalarState(restore, lv ic>>IC.pins↑i.expectedOhms)
resultis ic
]
// ---------------------------------------------------------------------------
and GetBlock(stream, block, length) be
// ---------------------------------------------------------------------------
for i = 0 to length-1 do block!i = Gets(stream)
// ---------------------------------------------------------------------------
and PutBlock(stream, block, length) be
// ---------------------------------------------------------------------------
for i = 0 to length-1 do Puts(stream, block!i)
// ---------------------------------------------------------------------------
and ReEstablishStream(cfa, ksType, itemSize) = valof
// ---------------------------------------------------------------------------
[
let stream = CreateDiskStream(lv cfa>>CFA.fp, ksType, itemSize)
if stream eq 0 then CallSwat("CreateDiskStream failed")
JumpToFa(stream, lv cfa>>CFA.fa)
resultis stream
]