// FtpCliUtil.bcpl // Copyright Xerox Corporation 1979, 1980 // Last modified October 8, 1980 4:57 PM by Boggs get "FtpProt.decl" get "FtpUser.decl" external [ // outgoing procedures CliGetString; CliConfirm; CliError CliSwitches; BadSwitch; IsCommand // incoming procedrues Allocate; FreePointer; MoveBlock; CliQuit Gets; Endofs; Puts; Closes; Resets InitCmd; Confirm; Wss; PutTemplate // incoming statics sysZone; userDsp; userKeys; errorFlag // outgoing statics overwrite; selective; verify all; dates; update; query cliStream; cli ] structure String [ length byte; char↑1,1 byte ] static [ overwrite; selective; verify all; dates; update; query cliStream; cli ] //---------------------------------------------------------------------------- let CliGetString(quitOnNoChars; numargs na) = valof //---------------------------------------------------------------------------- // Returns 0 or a string allocated from sysZone. // The number of switches read is in // string>>String.char↑(string>>String.length+1). // That many switches follow. [ if na eq 0 then quitOnNoChars = true let quotePending, count, char = false, 0, nil let string = vec 128 [ if Endofs(cliStream) test count eq 0 ifnot break ifso test quitOnNoChars ifso CliQuit() ifnot resultis 0 char = Gets(cliStream) if char eq $*S % char eq $*N test count eq 0 ifso loop ifnot break if char eq QuoteChar then [ quotePending = true; loop ] if char eq $/ unless quotePending break if count le 255 then count = count+1 string>>String.char↑count = char quotePending = false ] repeat string>>String.length = count count = count+1 if char eq $/ then [ if Endofs(cliStream) break char = Gets(cliStream) if char eq $*S % char eq $*N break if char eq $/ loop if count le 257 then count = count+1 string>>String.char↑count = char ] repeat string>>String.char↑(string>>String.length+1) = count - string>>String.length -1 let res = Allocate(sysZone, count rshift 1 +1) MoveBlock(res, string, count rshift 1 +1) resultis res ] //--------------------------------------------------------------------------- and CliSwitches() be //--------------------------------------------------------------------------- [ let notFlag = false for i = 1 to cli>>String.char↑(cli>>String.length+1) do [ switchon cli>>String.char↑(cli>>String.length+1+i) into [ case $S: case $s: [ selective = not notFlag; endcase ] case $O: case $o: [ overwrite = not notFlag; endcase ] case $V: case $v: [ verify = not notFlag; endcase ] case $Q: case $q: [ query = not notFlag; endcase ] case $N: case $n: [ overwrite = notFlag; endcase ] case $D: case $d: [ dates = not notFlag; endcase ] case $A: case $a: [ all = not notFlag; endcase ] case $U: case $u: docase $> case $C: case $c: endcase case $#: [ update = update % (notFlag? dEQ, dNE); endcase ] case $>: [ update = update % (notFlag? dLE, dGR); endcase ] case $<: [ update = update % (notFlag? dGE, dLS); endcase ] case $=: [ update = update % (notFlag? dNE, dEQ); endcase ] case $-: [ notFlag = not notFlag; loop ] default: [ BadSwitch(i); endcase ] ] notFlag = false ] if update then dates = true FreePointer(lv cli) ] //--------------------------------------------------------------------------- and BadSwitch(i) be //--------------------------------------------------------------------------- CliError("*NUnrecognized switch /$C", false, cli>>String.char↑(cli>>String.length+1+i)) //--------------------------------------------------------------------------- and IsCommand() = cli>>String.char↑(cli>>String.length+1) ne 0 % cli eq 0 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- and CliConfirm(string; numargs na) = valof //--------------------------------------------------------------------------- [ if na eq 0 then string = 0 let cs = InitCmd(256, 2, 0, 0, 0, userKeys, userDsp) if cs eq 0 resultis false let ok = Confirm(cs, string) Closes(cs) resultis ok ] //--------------------------------------------------------------------------- and CliError(string, fatal, arg1, arg2, arg3; numargs na) = valof //--------------------------------------------------------------------------- [ if na ls 2 then fatal = false Puts(userDsp, $*007) if na ge 1 then PutTemplate(userDsp, string, arg1, arg2, arg3) test fatal ifnot [ unless errorFlag resultis false Resets(userKeys) if CliConfirm("*NDo you want to continue? ") resultis false ] ifso [ Resets(userKeys) Wss(userDsp, "*NType any character to finish") Gets(userKeys) ] abort ]