!TITLE Screen Control Procedures ! ! The following Sections describe the procedures available to a user ! program. These procedures return information about how to drive the ! type of terminal currently in use. In the case of phone and PSS ! connections, the TERMINALTYPE command must be used at some point to ! set this up. ! !<VDUI ! ! %externalintegerfunctionspec vdui(%integer n) ! ! This function returns various integer characteristics of the ! terminal. A result of zero is usually an error. ! ! n = 1 Terminal type ! n = 2 Columns per line ! n = 3 Lines per page (zero for hard copy) ! n = 4 ASCII code for recommended interrupt character ! n = 5 Base character for X position ! n = 6 Base character for Y position !> !<VDUB ! ! This function returns various boolean characteristics of the terminal. ! A result of zero indicates 'no' or 'false', and a result of 1 ! indicates 'yes' or 'true'. A result of -1 indicates an error. ! ! %externalintegerfunctionspec vdub(%integer n) ! ! n = 1 Home moves cursor to top line ! n = 2 Terminal can operate in page mode ! n = 3 Y coordinate comes first ! n = 4 Terminal auto wraps at line end !> !<VDUC ! This function returns a string which, if sent to the terminal, will ! move the cursor to specified coordinates. A null result indicates that ! the terminal is incapable of controlled cursor positioning. ! ! %externalstringfunctionspec vduc(%integer x,y) ! ! The values 'x' and 'y' have an origin of zero (e.g. top left is 0,0). !> !<VDUS ! ! %externalstringfunctionspec vdus(%integer n) ! ! This function returns a string. Sometimes this is a name, but usually ! it is a value which must be 'printch'd to achieve a particular effect ! on the terminal. A null result indicates that the operation is not ! supported by that terminal. ! ! n = 0 Terminal name ! n = 1 Clear screen (cursor moved to home) ! n = 2 Cursor home ! n = 3 Clear to end of line ! n = 4 Clear to end of screen ! n = 5 Initialise terminal ! n = 6 Cursor up ! n = 7 Cursor down ! n = 8 Cursor left ! n = 9 Cursor right ! n = 10 Insert line ! n = 11 Delete line ! n = 12 Set terminal into page mode ! n = 13 Set terminal into roll mode ! n = 14 String to append to start of cursor X movement ! n = 15 String to append to start of cursor Y movement ! n = 16 Two character Unix name for terminal type ! n = 17 Start standout mode ! n = 18 End standout mode ! n = 19 Raw cursor positioning string !> !<PRINTCHS !KEY ! ! %externalroutinespec printchs(%string(255) s) ! ! If the length of 's' is > 0, this routine effectively calls 'printch' ! for each character of the string. If the length of 's' is zero, the ! routine has no effect. !> !STOP !*********************************************************************** !* !* Screen control package !* !* R.D. Eager University of Kent MCMLXXXIV !* !*********************************************************************** ! ! !*********************************************************************** !* !* Constants !* !*********************************************************************** ! constantinteger no = 0, yes = 1 constantinteger not set = -100 constantinteger nterms = 31; ! Max number of terminal types constantinteger max space = 224; ! Space in terminal record ! ! !*********************************************************************** !* !* Record and array formats !* !*********************************************************************** ! recordformat descf(integer dr0,dr1 or c longinteger dr) 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)) ! ! !*********************************************************************** !* !* External references to TERMTYPE package !* !*********************************************************************** ! externalroutinespec get terminal type(integer n) ! externalintegerspec curtype; ! Terminal type as a number externalrecord (termf)spec term; ! Record for 'curtype' ! ! !*********************************************************************** !* !* Subsystem references !* !*********************************************************************** ! systemintegerfunctionspec iocp(integer ep,parm) systemstringfunctionspec itos(integer n) ! ! !*********************************************************************** !* !* T E R M S T R I N G !* !*********************************************************************** ! externalstringfunction term string(record (termf)name term, byteintegername ptr) ! Returns the string associated with the item described by 'ptr' in the ! record 'term'. result = "" if ptr = 0 result = string(addr(term_string space)+ptr) end ; ! of term string ! ! !*********************************************************************** !* !* V D U I !* !*********************************************************************** ! externalintegerfunction vdui(integer n) constantinteger maxvdui = 6 switch sw(1:maxvdui) ! result = 0 unless 0 < n <= maxvdui ! get terminal type(no) if curtype = not set result = 0 unless 1 <= curtype <= nterms ! -> sw(n) ! sw(1): ! Terminal type result = curtype ! sw(2): ! Columns per line result = term_columns ! sw(3): ! Lines per page result = term_lines ! sw(4): ! Interrupt character result = term_int ! sw(5): ! Base for X position result = term_xbase ! sw(6): ! Base for Y position result = term_ybase end ; ! of vdui ! ! !*********************************************************************** !* !* V D U B !* !*********************************************************************** ! externalintegerfunction vdub(integer n) constantinteger maxvdub = 4 switch sw(1:maxvdub) ! result = -1 unless 0 < n <= maxvdub ! get terminal type(no) if curtype = not set result = -1 unless 1 <= curtype <= nterms ! -> sw(n) ! sw(1): ! Home at top result = term_home at top ! sw(2): ! Terminal can operate in page mode result = term_can do page mode ! sw(3): ! Y coordinate comes first result = term_yfirst ! sw(4): ! Terminal auto wraps at line end result = term_auto wrap end ; ! of vdub ! ! !*********************************************************************** !* !* V D U S !* !*********************************************************************** ! externalstringfunction vdus(integer n) constantinteger maxvdus = 19 byteinteger key switch sw(0:maxvdus) ! result = "" unless 0 <= n <= maxvdus ! get terminal type(no) if curtype = not set result = "" unless 1 <= curtype <= nterms ! -> sw(n) ! sw(0): ! Terminal name key = term_name -> get ! sw(1): ! Clear screen key = term_clearscreen -> get ! sw(2): ! Home key = term_home -> get ! sw(3): ! End of line key = term_endofline -> get ! sw(4): ! End of screen key = term_endofscreen -> get ! sw(5): ! Initialisation string key = term_init -> get ! sw(6): ! Cursor up key = term_cursor up -> get ! sw(7): ! Cursor down key = term_cursor down -> get ! sw(8): ! Cursor left key = term_cursor left -> get ! sw(9): ! Cursor right key = term_cursor right -> get ! sw(10): ! Insert line key = term_insert line -> get ! sw(11): ! Delete line key = term_delete line -> get ! sw(12): ! Set page mode key = term_page mode -> get ! sw(13): ! Set roll mode key = term_roll mode -> get ! sw(14): ! String for start of cursor X movement key = term_xintro -> get ! sw(15): ! String for start of cursor Y movement key = term_yintro -> get ! sw(16): ! Unix name for terminal key = term_uname -> get ! sw(17): ! String to start standout mode key = term_start standout -> get ! sw(18): ! String to end standout mode key = term_end standout -> get ! sw(19): ! Raw cursor positioning key = term_cursor pos -> get ! get: result = term string(term,key) end ; ! of vdus ! ! !*********************************************************************** !* !* V D U C !* !*********************************************************************** ! externalstringfunction vduc(integer y,x) ! Note that the formal parameters 'x' and 'y' are inverted because the ! cursor positioning string is 'back to front'. This is so that the same ! string is used as that on a UNIX system (for convenience). integer i,temp,c,max,next string (255) res,s,work ! get terminal type(no) if curtype = not set ! s = term string(term,term_cursor pos) result = "" if s = ""; ! Cannot do cursor positioning ! res = "" next = x max = length(s) ! for i = 1,1,max cycle c = charno(s,i) ! if c # '%' or i = max then start res = res.tostring(c) else i = i + 1; ! Move to next character c = charno(s,i); ! Flag character if 'A' <= c <= 'Z' then c = c - 'A' + 'a' if c = '%' then start res = res."%" finish else c if c = 'd' then start res = res.itos(next) next = y finish else c if c = '2' or c = '3' then start work = itos(next) work = "0".work while length(work) < c - '0' res = res.work next = y finish else c if c = '.' then start res = res.tostring(next) next = y finish else c if c = 'r' then start temp = x x = y next = y y = temp finish else c if c = 'i' then start next = next + 1 y = y + 1 finish else c if c = '+' then start i = i + 1 if i <= max then c = charno(s,i) else c = 0 res = res.tostring(next+c) next = y finish finish repeat ! result = res end ; ! of vduc ! ! !*********************************************************************** !* !* P R I N T C H S !* !*********************************************************************** ! externalroutine printchs(string (255) s) integer res record (descf) desc ! desc_dr0 = length(s) return if desc_dr0 = 0 desc_dr1 = addr(s) + 1 res = iocp(19,addr(desc)) end ; ! of printchs endoffile