.Title Ask .IDENT /2/ ;+ ; This routine is similar to the DCL cmd INQUIRE. ; It MUST be invoked via a foreign cmd. ; Command format: ; ; $ASK [/qualifiers] symbol-name "prompt-string" ; ; Command qualifiers ; ; /TIMEOUT=n ! time out in seconds ; /DEFAULT=default-string ! default answer ; /GLOBAL ! Same as INQUIRE command ; /UPPERCASE ! Force upper case input ; JGD1 ; ; Notes: ; ; o Escape sequences are passed to the symbol and are three characters ; long, followed by the two symbols. This assumes ANSI escape ; sequences (VT100) are being sent. Won't work with VT52 terminals. ; o If Control-Z is input to the prompt, a ^Z is returned to the symbol ; o The symbol-name MUST be a valid DCL symbol ; o The double quotes surrounding the prompt-string MUST be present! ; o The radix of the timeout count is assumed to be decimal ; o There may be NO double quotes surrounding the ALPHANUMERIC default-string ; ; Written by: ; Mark Paulk ; System Development Corp ; 4810 Bradford Blvd NW ; Huntsville, Al 35805 ; (205)-837-7610 ; Taken from [VAX82B.SDC.ASK] ; ; Modified by: ; James G. Downward ; KMS Fusion, Inc. ; PO Box 1567 ; Ann Arbor, Mich. 48106 ; (313)-769-8500 ; 29-March-1983 ; JGD1 Added /UPPER to force upper to ; lowercase conversion. By ; default, input now can be ; lower case unless /UPPER is ; specified. Allow Escape Seq ; to be passed. Allow ^Z to ; be returned if entered. ;- $TpaDef $CliServDef Equals = ^X3D Quote = ^X22 .Psect AskData,NoExe TParseBlk: .Long Tpa$K_Count0, Tpa$M_Abbrev .Blkb Tpa$K_Length0 - 8 LocalQualSeen: .Long 1 GlobalQualSeen: .Long 0 DefQualSeen: .Long 0 TimeQualSeen: .Long 0 UpperQualSeen: .Long 0 ; JGD1 TimeOutCnt: .Long 0 CmdBuf: .Blkb 255 CmdDesc: .Long 255,CmdBuf Request: .Long Cli$K_DefLocal@8 ! Cli$K_CliServ SymName:: .Quad 0 SymValue:: .Long 0,Answer Prompt: .Quad 0 DefAnswer: .Quad 0 Answer:: .Blkb 255 LogNam: .ASCID /SYS$COMMAND/ Term: .Blkb 15 TermDesc: .Long 15,Term Channel: .Long 0 Iosb: .Quad 0 TMO: .Long Cli$K_DefLocal@8 ! Cli$K_CliServ TMO_Name: .LONG 8,TMO_SYM TMO_Value:: .Long 1,TMO_VAL TMO_VAL: .ASCII /F/ TMO_SYM: .ASCII /$TIMEOUT/ .Psect AskCode Start: .Word ^M<> Pushal TParseBlk + Tpa$L_StringCnt Clrl -(Sp) Pushal CmdDesc Calls #3,Lib$Get_Foreign Blbs R0,10$ Brw Done 10$: Moval CmdBuf,TParseBlk + Tpa$L_StringPtr Pushal QualKey Pushal QualState Pushal TParseBlk Calls #3,G^Lib$TParse Blbs R0,20$ Brw Done 20$: $TrnLog_S LogNam=LogNam,RslBuf=TermDesc,RslLen=TermDesc Blbs R0,25$ Brw Done 25$: Cmpb #27,Term Bneq 28$ Subl2 #4,TermDesc Addl2 #4,TermDesc+4 28$: $Assign_S Chan = Channel, DevNam = TermDesc Blbs R0,30$ Brw Done 30$: Blbs TimeQualSeen,40$ Blbs UpperQualSeen,35$ ; If Force Uppercase branch ; JGD1 $Qiow_S Chan=Channel,Func=#Io$_ReadPrompt!Io$M_Escape,- ; JGD1 Iosb=Iosb,P1=Answer,P2=#255,P5=Prompt+4,P6=Prompt ; JGD1 Brw 50$ ; JGD1 35$: $Qiow_S Chan=Channel,Func=#Io$_ReadPrompt!Io$M_Escape!Io$M_Cvtlow,-;JGD1 Iosb=Iosb,P1=Answer,P2=#255,P5=Prompt+4,P6=Prompt ; JGD1 Brw 50$ ; JGD1 40$: Blbs UpperQualSeen,45$ ; JGD1 $Qiow_S Chan=Channel,- ; JGD1 Func=#Io$_ReadPrompt!Io$M_Escape!Io$M_Timed,- ; JGD1 Iosb=Iosb,- ; JGD1 P1=Answer,P2=#255,P3=TimeOutCnt,P5=Prompt+4,P6=Prompt ; JGD1 Brw 50$ ; JGD1 45$: $Qiow_S Chan=Channel,- ; JGD1 Func=#Io$_ReadPrompt!Io$M_CvtLow!Io$M_Escape!Io$M_Timed,-; JGD1 Iosb=Iosb,- ; JGD1 P1=Answer,P2=#255,P3=TimeOutCnt,P5=Prompt+4,P6=Prompt ; JGD1 50$: Blbs R0,55$ ; JGD1 Jmp Done ; JGD1 55$: CMPB Answer,#27 ; Was escape seen? ; JGD1 BNEQ 56$ ; If NEQ no ; JGD1 Movl #3,Iosb+2 ; Set proper length ; JGD1 56$: ; JGD1 Cmpb Iosb+4,#26 ; Was it ^Z ; JGD1 Bneq 58$ ; No, continue ; JGD1 Movl #1,Iosb+2 ; Yes, set propper length ; JGD1 Movb #26,Answer ; Set ^Z in the buffer ; JGD1 58$: Movzwl Iosb+2,SymValue ; JGD1 Bneq 60$ Movq DefAnswer,SymValue Cmpw Iosb,#SS$_TimeOut ; Did we timeout ; JGD1 Bneq 60$ Movb #84,TMO_VAL ; Yes, so show we did ; JGD1 $Qiow_S Chan=Channel,Func=#Io$_WriteVBlk,P1=@SymValue+4,P2=SymValue,P4=#0 60$: Blbc GlobalQualSeen,70$ Movl #Cli$K_DefGlobal@8!Cli$K_CliServ,Request 70$: Pushal Request Calls #1,G^Sys$Cli Pushal TMO ; Set the timeout flag ; JGD1 Calls #1,G^Sys$Cli ; in $TIMEOUT ; JGD1 Done: Ret .Psect AskTables $Init_State QualState,QualKey $State Begin $Tran '/',Switch $Tran TPA$_SYMBOL,,StoreVarName $State $Tran TPA$_LAMBDA,TPA$_EXIT,StorePrompt $State Switch $Tran 'LOCAL',Begin,,1,LocalQualSeen $Tran 'GLOBAL',Begin,,1,GlobalQualSeen $Tran 'TIMEOUT',TimeOut,,1,TimeQualSeen $Tran 'DEFAULT',Default,,1,DefQualSeen $Tran 'UPPERCASE',Begin,,1,UpperQualSeen ; JGD1 $State TimeOut $Tran Equals $State $Tran TPA$_DECIMAL,Begin,,,TimeOutCnt $State Default $Tran Equals $State $Tran TPA$_SYMBOL,Begin,StoreDefault $End_State StoreDefault: .Word 0 Movq Tpa$L_TokenCnt(AP),DefAnswer Ret StoreVarName: .Word 0 Movq Tpa$L_TokenCnt(AP),SymName Ret StorePrompt: .Word 0 Clrl R0 Movl Tpa$L_StringCnt(AP),Prompt Bleq 10$ Subl2 #3,Prompt Bleq 10$ Movl Tpa$L_StringPtr(AP),Prompt + 4 Addl2 #2,Prompt + 4 Incl R0 10$: Ret .End Start