!TITLE The TERMINALTYPE command ! ! This command is used to discover the current terminal type. It may ! also be used to set a terminal type if a phone or PSS connection is ! being used. ! ! TERMINALTYPE prompts the user for the value to be set ! TERMINALTYPE(?) gives the user's terminal type !> !STOP !*********************************************************************** !* !* Routines to determine type of terminal in use !* !* University of Kent version !* !* R.D. Eager University of Kent MCMLXXXIV !* !*********************************************************************** ! ! !*********************************************************************** !* !* Constants !* !*********************************************************************** ! constantinteger no = 0, yes = 1 constantinteger external = -1; ! Terminal type for phone/PSS lines constantinteger not set = -100 constantinteger unspecified video = 4 constantinteger nterms = 31; ! Max number of terminal types constantinteger max space = 224; ! Space in terminal record constantstring (1) snl = " " constantstring (18) chsfile = "SUBSYS.TERMCHSFILE" ! Terminal characteristics file constantstring (18) termlocsfile = "SUBSYS.TERMLOCFILE" ! Terminal locations file ! ! !*********************************************************************** !* !* Record and array formats !* !*********************************************************************** ! recordformat hf(integer dataend,datastart,filesize,filetype,sum, datetime,format,mark,ntcps,tcpsoffset,nttys, ttysoffset,nlocns,locnsoffset,sp0,sp1) recordformat rf(integer conad,filetype,datastart,dataend) ! recordformat tcpf(string (15) name,string (31) location, integer maxline,linestart) recordformat ttyf(string (15) loclp,integer type,string (31) building, location) recordformat termf(byteinteger type,name,columns,lines,leadin, clearscreen,home,endofline,endofscreen,init,int, cursor up,cursor down,cursor left,cursor right, insert line,delete line,home at top,page mode, roll mode,can do page mode,xbase,ybase,xintro, yintro,yfirst,auto wrap,uname,start standout, end standout,cursor pos, (byteinteger string ptr or c string (max space) string space)) ! ownrecord (termf)arrayformat termaf(1:4095) ! ! !*********************************************************************** !* !* Own variables !* !*********************************************************************** ! externalinteger curtype = not set; ! Terminal type as a number externalrecord (termf) term; ! Record for 'curtype' ownrecord (termf)arrayname terms ! ! !*********************************************************************** !* !* External references to screen control package !* !*********************************************************************** ! externalstringfunctionspec term string(record (termf)name term, byteintegername ptr) externalintegerfunctionspec vdub(integer n) ! ! !*********************************************************************** !* !* Subsystem references !* !*********************************************************************** ! systemroutinespec connect(string (31) file,integer mode,hole, prot,record (rf)name r,integername flag) systemroutinespec disconnect(string (31) file,integername flag) systemstringfunctionspec failuremessage(integer mess) systemstringfunctionspec itos(integer n) systemintegerfunctionspec pstoi(string (63) s) externalroutinespec prompt(string (255) s) systemintegerfunctionspec querymode(integer n) systemroutinespec setfname(string (63) s) externalroutinespec set return code(integer i) systemroutinespec setuse(string (31) file,integer mode,value) systemroutinespec uctranslate(integer ad,len) externalintegerfunctionspec uinfi(integer entry) externalstringfunctionspec uinfs(integer entry) ! externalroutinespec option(string (255) s) externalroutinespec setmode(string (255) s) ! ! !*********************************************************************** !* !* Service routines !* !*********************************************************************** ! routine readline(stringname s) ! Reads one line from the currently selected input into 's'. Leading ! and trailing spaces, and completely blank lines, are suppressed. integer c ! s = "" cycle cycle readsymbol(c) exit if c = nl s <- s.tostring(c) repeat while length(s) > 0 and charno(s,length(s)) = ' ' cycle length(s) = length(s) - 1 repeat while length(s) # 0 and charno(s,1) = ' ' cycle s = substring(s,2,length(s)) repeat exit unless s = "" repeat end ; ! of readline ! !----------------------------------------------------------------------- ! routine do setmode(integer cols,lines) ! Checks whether the terminal is correctly set up (PAD-wise) for number ! of columns (as given by 'cols') and video mode (as given by a nonzero ! value for 'lines'). If necessary, 'setmode' is called to update the ! settings. integer i string (31) s ! i = query mode(3); ! Get PAD setting for width if cols # i # -1 then start ; ! Setting obtained, but incorrect s = "W=".itos(cols)."," finish else s = "" ! i = query mode(15); ! Get PAD setting for video mode if i > 0 and lines = 0 then start ; ! Setting obtained, but incorrect s = s."V=OFF" finish else c if i = 0 and lines # 0 then start ; ! Setting obtained, but incorrect s = s."V=ON" finish ! setmode(s) if s # "" end ; ! of do setmode ! !----------------------------------------------------------------------- ! routine set terminal type(integer n,ask) integer cols,lines,ch string (255) s ! curtype = n if n = 0 then start term = 0 term_columns = 72 cols = 72 lines = 0 s = "unspecified" else term = terms(n) cols = term_columns lines = term_lines s = term string(term,term_name) finish ! printstring("Your terminal type is """.s."""".snl) ! if ask = yes then start printstring("Use this in future remote logons?".snl) prompt("Yes or no: ") finish ! cycle if ask = yes then readline(s) else s = "N" uctranslate(addr(s)+1,length(s)) ch = charno(s,1) continue unless ch = 'N' or ch = 'Y' if ch = 'Y' then start s = "TERMINAL=".itos(n)."," finish else s = "" cols = cols - 1 if n # 0 and vdub(4) = yes ! Allow for any auto wrap at line end if cols # uinfi(15) then start s = s."ITWIDTH=".itos(cols) finish do setmode(cols, lines) if s # "" then option(s) exit repeat end ; ! of set terminal type ! ! !*********************************************************************** !* !* G E T T E R M I N A L T Y P E !* !*********************************************************************** ! externalroutine get terminal type(integer silent) ! Discovers the type of the terminal in use, and sets up 'curtype' ! accordingly. If 'silent' is 'yes', the user is given no error ! messages, and is not interrogated about PSS and phone lines. integer flag,lineno,i,tcpsad,tcpsize,ttysad,ttysize,ntcps,nttys,cols string (31) s,tcpname,work record (rf) rr record (hf)name h record (tcpf)name tcp record (ttyf)name tty ! connect(chsfile,1,0,0,rr,flag) -> err if flag # 0 setuse(chsfile,1,0); ! Prevent disconnection terms == array(rr_conad+rr_datastart,termaf) ! tcpsize = sizeof(tcp) ttysize = sizeof(tty) ! connect(termlocsfile,1,0,0,rr,flag) -> err if flag # 0 ! h == record(rr_conad) ntcps = h_ntcps nttys = h_nttys tcpsad = rr_conad + h_tcpsoffset ttysad = rr_conad + h_ttysoffset ! s = uinfs(14); ! Terminal address uctranslate(addr(s)+1,length(s)) -> bad unless s -> tcpname.(":").work.(":").s.(":") lineno = pstoi(s) ! flag = no for i = 1,1,ntcps cycle tcp == record(tcpsad) if tcpname = tcp_name then start flag = yes exit finish tcpsad = tcpsad + tcpsize repeat -> bad if flag = no; ! PAD name not found -> bad unless 0 <= lineno <= tcp_maxline ! tty == record(ttysad+(tcp_linestart+lineno)*ttysize) curtype = tty_type -> bad if curtype = 0 ! ! Handle phone and PSS lines ! if curtype = external then start curtype = uinfi(23); ! Get setting from options file if curtype = 0 then start if silent = yes then start curtype = external return finish printstring("You appear to be logged in via a telephone line or a PSS connection. It".snl) printstring("is thus not possible to determine the type of terminal you are using.".snl) printstring("Please use the command TERMINALTYPE to set up your terminal type. This".snl) printstring("will be remembered for future remote logons if you wish.".snl) return finish finish ! ! Set up terminal record for future use ! set: term = terms(curtype) -> bad unless term_name # 0 ! cols = term_columns cols = cols - 1 if vdub(4) = yes; ! Allow for any auto wrap at line end ! if cols # uinfi(15) then start ; ! ITWIDTH setting needs alteration option("ITWIDTH=".itos(cols)) finish do setmode(cols,term_lines) disconnect(termlocsfile,flag); ! Will not be needed again return ! bad: flag = 233; ! General error setfname("Terminal name not known") ! err: if silent = no then start printstring("Error -".failuremessage(flag)) printstring("Unspecified video assumed".snl) finish curtype = unspecified video -> set end ; ! of get terminal type ! ! !*********************************************************************** !* !* T E R M I N A L T Y P E !* !*********************************************************************** ! externalroutine terminaltype(string (255) parms) integer i,list,ask string (72) line,s record (termf)name t ! get terminal type(yes) if curtype = not set ! if parms = "?" then start if 1 <= curtype <= nterms then start printstring(term string(term,term_name)) else printstring("Unknown") if curtype = external then start printstring(" (phone or PSS)") curtype = 0 finish finish newline else ask = no list = 8 cycle i = pstoi(parms) exit if (1 <= i <= nterms and terms(i)_name # 0) or i = 0 if list > 7 then start list = 0 printstring("Terminals supported are:".snl) line = " 0 unspecified" for i = 1,1,nterms cycle t == terms(i) if t_name # 0 then start s = itos(i) s = " ".s if i < 10 s = s." ".term string(t,t_name) if line = "" then line = s else start line = line." " length(line) = 36 printstring(line.s.snl) line = "" finish finish repeat printstring(line.snl) unless line = "" printstring(c "Please type the number of your terminal and press 'return'") newline prompt("Terminal: ") finish list = list + 1 ask = yes readline(parms) repeat set terminal type(i,ask) finish ! set return code(0) end ; ! of terminaltype endoffile