home *** CD-ROM | disk | FTP | other *** search
- ############################################################################
- #
- # File: ansi.icn
- #
- # Subject: Procedures for ANSI-based terminal control
- #
- # Author: Ralph E. Griswold and Richard Goerwitz
- #
- # Date: February 8, 1992
- #
- ###########################################################################
- #
- # Version: 1.4
- #
- ###########################################################################
- #
- # 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)
- #
- # see also: ansi.icn
- #
- ############################################################################
-
- # 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).
-
- # link iolib, iscreen
-
- 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)
- /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)
-
- 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
-