// A L T O E X E C U T I V E
// User Input Module - ExecInput.bcpl
// Copyright Xerox Corporation 1980
// last modified by R. Johnsson, May 21, 1980 10:27 PM
get "streams.d"
get "altofilesys.d"
get "COMSTRUCT.BCPL"
static [
ShouldFlash = false
]
let Cancel() = LASTONEINKEYS(CONTROLC) ne 0
and EDITCHARS(TOQ, FROMQ, PROMPT, OKFORTIMEOUT,
Terminators, OverwritePreload;
numargs na) = valof
[ if PROMPT ne 0 then InitUserLine(PROMPT)
if na ls 6 then OverwritePreload = false
let InPreload = not ISEMPTYQ(FROMQ)
let C = GNC(FROMQ,
(na gr 3? OKFORTIMEOUT, true)&
ISEMPTYQ(TOQ))
[ if (na le 4)?
C eq $*N,
valof [ for i=1 to Terminators>>STRING.length do
if C eq Terminators>>STRING.char↑i then
resultis true
resultis false
]
then
[ PUTQR(TOQ, C)
resultis true
]
switchon C into
[ case NULL: endcase
case CONTROLA:
case BACKSPACE:
test ISEMPTYQ(TOQ)
ifso if PROMPT ne 0 then
[ WRITE($?)
InitUserLine(PROMPT)
]
ifnot [ let char = GETQR(TOQ)
if PROMPT ne 0 then
unless EraseChar(char) do
OverType(TOQ, PROMPT)
]
endcase
case CONTROLW:
DeleteWord(TOQ, PROMPT)
endcase
case $↑:
case $':
if PROMPT ne 0 then WRITE(C)
PUTQR(TOQ, C)
C = GNC(FROMQ, false)
if PROMPT ne 0 then WRITE(C)
PUTQR(TOQ, C)
endcase
case CONTROLU:
CALLBRAVO = true
endcase
case CONTROLX:
[ let MYBQ = vec size QS/16
INITQ(MYBQ)
APPENDQ(MYBQ, MYBQ, TOQ)
PUTQR(MYBQ, $*N) // Add CR for EXPAND
INITQ(TOQ)
unless EXPAND(TOQ, MYBQ, true) do
resultis false
GETQR(TOQ) // Remove added CR
RETYPE(TOQ, WRITE, PROMPT)
]
endcase
case CONTROLC:
if PROMPT ne 0 then WRITE(CONTROLC)
resultis false
case DELETEKEY:
EMPTYOUTQ(TOQ)
CALLBRAVO = false
if PROMPT ne 0 then
[ WRITE("*SXXX")
InitUserLine(PROMPT)
]
endcase
case ESCAPE:
[ let REMQ = vec size QS/16
INITQ(REMQ)
test EXPANDESC(TOQ, REMQ, true) ne 1
ifso ShouldFlash = true
ifnot PUTQR(REMQ, CONDSP)
APPENDQ(FROMQ, REMQ, FROMQ)
]
endcase
case CONDSP:
C = GNC(FROMQ, false)
if ISFILECHAR(C) & (C ne $!) & (C ne $$) then
[ if PROMPT ne 0 then
WRITE($*S)
PUTQR(TOQ, $*S)
]
loop
case $*T:
case $?:
[ if PROMPT ne 0 then
WRITE($?)
let MYQ = vec size QS/16
INITQ(MYQ)
PUTQR(MYQ, $?)
let S = vec 20
let DE = GETSUBSYS(MYQ, S, ";")
EMPTYOUTQ(MYQ)
COPYQ(TOQ, MYQ)
QFToComCm(MYQ)
CALLIFLOCAL(DE)
if C eq $*T then
XFERQWHILE(GETQR, PUTQR,
TOQ, PUTQF, MYQ,
IsCommandChar)
EMPTYOUTQ(MYQ)
InitUserLine(PROMPT)
MapQ(TOQ, WRITE)
]
endcase
case $*L:
case 201b:
case 202b:
case 203b:
[ let filename = nil
test C eq $*L ifso filename = "Line.cm"
ifnot
[ let num = C - 200b
filename = "Key0.cm"
filename>>STRING.char↑4 = num + $0
]
let s = MyOpenFile(filename, ksTypeReadOnly, charItem)
if s eq 0 then endcase
until Endofs(s) do
[
let c = Gets(s)
if PROMPT ne 0 then WRITE(c)
PUTQR(TOQ, c)
]
Closes(s)
endcase
]
default:
if (not InPreload) & OverwritePreload then
[ EMPTYOUTQ(TOQ)
if PROMPT ne 0 then
OverType(TOQ, PROMPT)
]
if PROMPT ne 0 then
WRITE(C)
PUTQR(TOQ, C)
]
unless InPreload do OverwritePreload = false
InPreload = not ISEMPTYQ(FROMQ)
C = GNC(FROMQ, OKFORTIMEOUT&ISEMPTYQ(TOQ))
] repeat
]
and RemoveUpArrows(Q) be
[ let DestQ = vec size QS/16
INITQ(DestQ)
until ISEMPTYQ(Q) do
[ let C = GETQF(Q)
if C eq $↑ then
[ DIDEXPAND = true
unless ISEMPTYQ(Q) do C = GETQF(Q)
loop
]
if C eq $' then
[ DIDEXPAND = true
unless ISEMPTYQ(Q) do C = GETQF(Q)
]
PUTQR(DestQ, C)
]
APPENDQ(Q, DestQ, Q)
]
and GNC(Q, OKFORTIMEOUT) = ISEMPTYQ(Q)? valof
[ if ShouldFlash then
[ FlashScreen()
ShouldFlash = false
]
if Endofs(keys) then
TwiddleThumbs(OKFORTIMEOUT? Q, 0)
unless ISEMPTYQ(Q) resultis GETQF(Q)
resultis Gets(keys)
] , GETQF(Q)
and DeleteWord(Q, PROMPT) be
[ if ISEMPTYQ(Q) then
[ if PROMPT ne 0 then
[ WRITE($?)
InitUserLine(PROMPT)
]
return
]
let C = GETQR(Q)
let erasing = true
until ISEMPTYQ(Q) % IsCommandChar(C) do
[ if erasing then erasing = EraseChar(C)
C = GETQR(Q)
]
if ISEMPTYQ(Q) then
[ if erasing then erasing = EraseChar(C)
if PROMPT ne 0 & (not erasing) then OverType(Q, PROMPT)
return
]
until ISEMPTYQ(Q) % ISNTFILECHAR(C) do
[ if erasing then erasing = EraseChar(C)
C = GETQR(Q)
]
test IsCommandChar(C)
ifso if erasing then erasing = EraseChar(C)
ifnot PUTQR(Q, C)
if PROMPT ne 0 & (not erasing) then OverType(Q)
]
and EXPAND(LQ, BQ, FULLBUF; numargs NA) = valof
[ if NA ls 3 then FULLBUF = false
if ISEMPTYQ(BQ) then resultis true
let C = GETQF(BQ)
let INFILENAME = false
let HASASTAR = false
[ if HASASTAR & (not ISITEMCHAR(C)) do
[ EXPANDSTAR(LQ)
HASASTAR = false
DIDEXPAND = true
]
switchon C into
[ case $;:
case $*N:
if INFILENAME then
[ PUTQF(BQ, C)
PUTQF(BQ, $@) // Convenience
endcase
]
test FULLBUF
ifso [ PUTQR(LQ, C)
]
ifnot [ PUTQR(LQ, $*N)
until ISEMPTYQ(BQ) do
[ let NC = GETQF(BQ)
if (NC ne $*N) & (NC ne $;)
then
[ PUTQF(BQ, NC)
break
]
]
resultis true
]
endcase
case $↑:
case $': PUTQR(LQ, C)
PUTQR(LQ, GETQF(BQ))
endcase
case $/: C = GETQF(BQ)
test C eq $/
ifso [ while (C ne $*N) &
(C ne $;) do
C = GETQF(BQ)
]
ifnot PUTQR(LQ, $/)
loop
endcase
case $@:
INFILENAME = not INFILENAME
test INFILENAME
ifso PUTQR(LQ, $@)
ifnot [ let EXPQ = vec size QS/16
INITQ(EXPQ)
unless SUBSTFILE(LQ, EXPQ) do
resultis 0
test FULLBUF
ifso APPENDQ(LQ, LQ, EXPQ)
ifnot APPENDQ(BQ, EXPQ, BQ)
]
endcase
case $**:
case $#: PUTQR(LQ, C)
HASASTAR = true
endcase
default: PUTQR(LQ, C)
]
if ISEMPTYQ(BQ) then
[ if HASASTAR then
[ EXPANDSTAR(LQ)
DIDEXPAND = true
]
resultis true
]
if ISEMPTYQ(BQ) then resultis true
C = GETQF(BQ)
] repeat
]
and SUBSTFILE(LQ, Q) = valof
[ if LOOKFORCTLC() then resultis false
let FNQ = vec size QS/16
INITQ(FNQ)
let C = GETQR(LQ)
while C ne $@ do
[ PUTQF(FNQ, C)
C = GETQR(LQ)
]
let STR = vec 200
let MYDE = GETSUBSYS(FNQ, STR, ".CM.;**.CM.;.;**.")
EMPTYOUTQ(FNQ)
let V = true
switchon MYDE into
[ default: if (MYDE>>MYDE.TYPE eq ISFILE) then
[ let FILE =
MyOpenFile(STR, ksTypeReadOnly,
charItem)
STREAMTOQR(FILE, FNQ)
Closes(FILE)
APPENDQ(Q, FNQ, Q)
INITQ(FNQ)
PUTQR(Q, $*N) // To make EDITCHARS stop
EDITCHARS(FNQ, Q, 0, false)
APPENDQ(Q, FNQ, Q)
GETQR(Q) // Removes extra CR
endcase
]
case NONAME:
case NOFILE:
WRITE(FORMATN(
"*NFile name *"<S>*" unknown. Type what it would contain.",
STR))
V = ASKUSER(FNQ)
unless ISEMPTYQ(FNQ) do GETQR(FNQ) // Remove final
// CR
APPENDQ(Q, FNQ, Q)
endcase
]
DIDEXPAND = true
resultis V
]
and ASKUSER(Q) = valof
[ Resets(keys) // FLUSH KBD
let MYQ = vec size QS/16
INITQ(MYQ)
resultis EDITCHARS(Q, MYQ, ">>", false)
]
and ISNTITEMCHAR(C) = not ISITEMCHAR(C)