diff options
Diffstat (limited to 'ipl/procs/ansi.icn')
-rw-r--r-- | ipl/procs/ansi.icn | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/ipl/procs/ansi.icn b/ipl/procs/ansi.icn new file mode 100644 index 0000000..02b2f6d --- /dev/null +++ b/ipl/procs/ansi.icn @@ -0,0 +1,221 @@ +############################################################################ +# +# File: ansi.icn +# +# Subject: Procedures for ANSI-based terminal control +# +# Authors: Ralph E. Griswold and Richard Goerwitz +# +# Date: August 14, 1996 +# +############################################################################ +# +# This file is in the public domain. +# +############################################################################ +# +# Version: 1.5 +# +############################################################################ +# +# This package of procedures implements a subset of the ANSI terminal +# control sequences. The names of the procedures are taken directly from +# the ANSI names. If it is necessary to use these routines with non-ANSI +# devices, link in iolib.icn, and (optionally) iscreen.icn as well. Use +# will be made of whatever routines are made available via either of these +# libraries. Be careful of naming conflicts if you link in iscreen.icn. +# It contains procedures like "clear" and "boldface." +# +# CUB(i) Moves the cursor left i columns +# CUD(i) Moves the cursor down i rows +# CUF(i) Moves the cursor right i columns +# CUP(i,j) Moves the cursor to row i, column j +# CUU(i) Moves the cursor up i rows +# ED(i) Erases screen: i = 0, cursor to end; i = 1, +# beginning to cursor; i = 2, all (default 2) +# EL(i) Erases data in cursor row: i = 0, cursor to +# end; i = 1, beginning to cursor; i = 2, all +# (default 0) +# SGR(i) Sets video attributes: 0 = off; 1 = bold; 4 = +# underscore; 5 = blink; 7 = reverse (default +# 0) +# +# Note that not all so-called ANSI terminals support every ANSI +# screen control sequence - not even the limited subset included in +# this file. +# +# If you plan on using these routines with non-ANSI magic-cookie +# terminals (e.g. a Wyse-50) then it is strongly recommended that you +# link in iolib or itlib *and* iscreen (not just iolib or itlib by +# itself). The routines WILL WORK with most magic cookie terminals; +# they just don't always get all the modes displayed (because they +# are basically too busy erasing the cookies). +# +############################################################################ +# +# Links: iolib or itlib, iscreen (all optional) +# +############################################################################ + +# For DOS, or any system using ANSI-conformant output devices, there +# is no need to link any routines in. + +# For UNIX systems, you may choose to link in itlib or iolib, and (if +# desired) iscreen as well. Some of these may be in the IPL. You can +# get any that aren't from Richard Goerwitz (goer@sophist.uchicago.edu). + +invocable all + +link iolib + +procedure _isANSI() + static isANSI + initial { + if find("MS-DOS",&features) then { + isANSI := 1 + } else { + if proc(getname) then { + if find("ansi",map(getname())) | getname() == "li" + then isANSI := 1 + else isANSI := &null + } else { + # We'll take a chance on the user knowing what he/she + # is doing. + isANSI := 1 + # If you're not so confident, comment out the following + # line: + # stop("_isANSI: you need to link itlib or iolib") + } + } + } + return \isANSI +end + +procedure CUD(i) + if _isANSI() + then writes("\^[[",i,"B") + else { + iputs(igoto(getval("DO"),i)) | { + every 1 to i do + iputs(getval("do")) | stop("CUD: no do capability") + } + } + return +end + +procedure CUB(i) + if _isANSI() + then writes("\^[[",i,"D") + else { + iputs(igoto(getval("LE"),i)) | { + every 1 to i do + iputs(getval("le")) | stop("CUB: no le capability") + } + } + return +end + +procedure CUF(i) + if _isANSI() + then writes("\^[[",i,"C") + else { + iputs(igoto(getval("RI"),i)) | { + every 1 to i do + iputs(getval("nd")) | stop("CUF: no nd capability") + } + } + return +end + +procedure CUP(i,j) + if _isANSI() + then writes("\^[[",i,";",j,"H") + else iputs(igoto(getval("cm"), j, i)) | stop("CUP: no cm capability") + return +end + +procedure CUU(i) + if _isANSI() + then writes("\^[[",i,"A") + else { + iputs(igoto(getval("UP"),i)) | { + every 1 to i do + iputs(getval("up")) | stop("CUU: no up capability") + } + } + return +end + +procedure ED(i) + local emphasize, clear + + /i := 2 + if _isANSI() then { + writes("\^[[",i,"J") + } else { + case i of { + 0: iputs(getval("cd")) | stop("ED: no cd capability") + 1: stop("ED: termcap doesn't specify capability") + 2: { + if proc(emphasize) then clear() + else iputs(getval("cl")) | stop("ED: no cl capability") + } + default: stop("ED: unknown clear code, ",i) + } + } + return +end + +procedure EL(i) + /i := 0 + if _isANSI() then { + if i = 0 + then writes("\^[[K") + else writes("\^[[",i,"K") + } else { + case i of { + 0: iputs(getval("ce")) | stop("EL: no ce capability") + 1: stop("EL: termcap doesn't specify capability") + 2: stop("EL: try using CUP to go to col 1, then EL(0)") + default: stop("EL: unknown line clear code, ",i) + } + } + return +end + +procedure SGR(i) + + local emphasize, normal, boldface, underline, blink + + static isISCR + + initial { + if proc(emphasize) + then isISCR := 1 + } + + /i := 0 + if _isANSI() then { + writes("\^[[",i,"m") + } else { + case i of { + 0: (\isISCR, normal()) | { + every iputs(getval("me"|"se"|"ue")) + } + 1: (\isISCR, boldface()) | { + iputs(getval("md"|"so"|"us")) + } + 4: (\isISCR, underline()) | { + iputs(getval("us"|"md"|"so")) + } + 5: (\isISCR, blink()) | { + iputs(getval("mb"|"us"|"md"|"so")) + } + 7: (\isISCR, emphasize()) | { + iputs(getval("so"|"md"|"us")) + } + default: stop("SGR: unknown mode, ",i) + } + } + return +end |