// IfsScavKbd.bcpl - various keyboard interaction procedures
// Copyright Xerox Corporation 1979
// Last modified December 27, 1979  1:44 PM by Boggs

get "CmdScan.decl"
get "Disks.d"

external
[
// outgoing procedures
OpenDisk; ScavConfirm

// incoming procedures
TFSInit; BFSInit
DefaultArgs; Dismiss
Resets; Errors; Ws; Wss; Gets; Puts; Closes
CreateKeywordTable; DestroyKeywordTable; InsertKeyword
InitCmd; EnableCatch; EndCatch; TerminatingChar
BeginDefaultPhrase; EndDefaultPhrase
GetKeyword; GetNumber; InvertWindow

// incoming statics
sysZone; sysDisk; keys; dsp; tfsDDMgr; bfsDDMgr
]

//----------------------------------------------------------------------------
let OpenDisk(string, alloc, fresh, diablo; numargs na) = valof
//----------------------------------------------------------------------------
[
DefaultArgs(lv na, 1, true, false, false)
let cs = InitCmd(256, 5); if cs eq 0 resultis 0
Wss(cs, string)
let dKT = nil
if EnableCatch(cs) then [ DestroyKeywordTable(dKT); EndCatch(cs) ]
dKT = CreateKeywordTable(2, 1)
if diablo then InsertKeyword(dKT, "DP")!0 = -1
InsertKeyword(dKT, "TP")!0 = 1
let trident = GetKeyword(cs, dKT, false, PhraseTerminator)!0 gr 0
let termChar = TerminatingChar(cs)
// there must be a better way to do this...
BeginDefaultPhrase(cs)
Puts(cs, termChar)
EndDefaultPhrase(cs)
cs>>CS.editControl = editAppend
let driveNumber = GetNumber(cs, 8)
let disk = nil
test trident
   ifso disk = TFSInit(sysZone, alloc, driveNumber, tfsDDMgr, fresh)
   ifnot test driveNumber eq sysDisk>>DSK.driveNumber
      ifso disk = sysDisk
      ifnot disk = BFSInit(sysZone, true, driveNumber, bfsDDMgr)
if disk eq 0 then Errors(cs, 0)
DestroyKeywordTable(dKT)
Closes(cs)
resultis disk
]

//----------------------------------------------------------------------------
and PhraseTerminator(cs, char) =
//----------------------------------------------------------------------------
   char ls $A % (char gr $Z & char ls $a) % char gr $z

//----------------------------------------------------------------------------
and ScavConfirm(string; numargs na) = valof
//----------------------------------------------------------------------------
[
if na gr 0 then Ws(string)
Ws(" [Confirm] ")
switchon Gets(keys) into
   [
   case $Y: case $y: case $*N:
      [ Ws("Yes."); resultis true ]
   case $N: case $n: case $*177:
      [ Ws("No."); resultis false ]
   case $?:
      [ Ws("Yes = Y|y|<cr>, No = N|n|<del>"); endcase ]
   default:
      [
      InvertWindow(dsp>>ST.par1)
      Dismiss(100)
      InvertWindow(dsp>>ST.par1)
      Resets(keys)
      ]
   ] repeat
]