Terminal control/Inverse video

From Rosetta Code
Task
Terminal control/Inverse video
You are encouraged to solve this task according to the task description, using any language you may know.

The task is to display a word in inverse video (or reverse video) followed by a word in normal video.

6502 Assembly[edit]

Works with: [VICE]

This example has been written for the C64 and uses the STROUT BASIC routine. Compile with the Turbo Macro Pro cross assembler:

tmpx -i inverse-video.s -o inverse-video.prg

Run with:

SYS680
; C64 - Terminal control: Inverse Video
 
; *** labels ***
 
strout = $ab1e
 
; *** main ***
 
*=$02a8  ; sys 680
 
lda #<str  ; Address of the message to print - low byte
ldy #>str  ; Address high byte
jsr strout  ; Print a null terminated string.
rts
 
; *** data ***
 
str .byte $12  ; the REVERSE ON control code
 ; see https://en.wikipedia.org/wiki/PETSCII
.text "reversed"
.byte $92  ; the REVERSE OFF control code
.null " normal" ; null terminated string
 

Ada[edit]

with Ada.Text_IO; use  Ada.Text_IO;
 
procedure Reverse_Video is
 
Rev_Video  : String := Ascii.ESC & "[7m";
Norm_Video : String := Ascii.ESC & "[m";
 
begin
Put (Rev_Video & "Reversed");
Put (Norm_Video & " Normal");
end Reverse_Video;
 

AutoHotkey[edit]

Call SetConsoleTextAttribute() to change foreground and background colors.

DllCall( "AllocConsole" ) ; create a console if not launched from one
hConsole := DllCall( "GetStdHandle", int, STDOUT := -11 )
 
SetConsoleTextAttribute(hConsole, 0x70) ; gray background, black foreground
FileAppend, Reversed`n, CONOUT$ ; print to stdout
 
SetConsoleTextAttribute(hConsole, 0x07) ; black background, gray foreground
FileAppend, Normal, CONOUT$
 
MsgBox
 
SetConsoleTextAttribute(hConsole, Attributes){
return DllCall( "SetConsoleTextAttribute", UPtr, hConsole, UShort, Attributes)
}

AWK[edit]

BEGIN {
system ("tput rev")
print "foo"
system ("tput sgr0")
print "bar"
}

Axe[edit]

A delay is added because the screen redraws with the normal font after the program exits.

Fix 3
Disp "INVERTED"
Fix 2
Disp "REGULAR",i
Pause 4500

BASIC[edit]

Applesoft BASIC[edit]

INVERSE:?"ROSETTA";:NORMAL:?" CODE"

BBC BASIC[edit]

      COLOUR 128        : REM Black background
COLOUR 15  : REM White foreground
PRINT "Inverse";
COLOUR 128+15  : REM White background
COLOUR 0  : REM Black foreground
PRINT " video"

Alternative method using 'VDU code' strings:

      inverse$ = CHR$(17)+CHR$(128)+CHR$(17)+CHR$(15)
normal$ = CHR$(17)+CHR$(128+15)+CHR$(17)+CHR$(0)
PRINT inverse$ + "Inverse" + normal$ + " video"

Locomotive Basic[edit]

The firmware routine at &bb9c (TXT INVERSE) swaps the current Locomotive BASIC PEN and PAPER colors:

10 CALL &bb9c:PRINT "inverse";
20 CALL &bb9c:PRINT "normal"

PureBasic[edit]

If OpenConsole()
ConsoleColor(0, 15) ;use the colors black (background) and white (forground)
PrintN("Inverse Video")
ConsoleColor(15, 0) ;use the colors white (background) and black (forground)
PrintN("Normal Video")
 
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit"): Input()
CloseConsole()
EndIf

Run BASIC[edit]

' ---------- foo is reverse --------------
x$ = shell$("tput mr
echo 'foo'")
 
' ---------- bar is normal --------------
x$ = shell$("tput me
echo 'bar'")
wait

Sinclair ZX81 BASIC[edit]

Inverse video is available from the keyboard (accessed with SHIFT9), so the normal way to do this would be just

PRINT "FOOBAR"

but with the 'foo' in inverse video and the 'bar' in normal video.

If this won't work (say, if we may want to use inverse video with string variables rather than string literals), we can use a small subroutine—relying on the fact that the ZX81 character set uses the high bit of each character code to select normal or inverse video.

10 LET S$="FOO"
20 GOSUB 50
30 PRINT S$;"BAR"
40 STOP
50 FOR I=1 TO LEN S$
60 LET S$(I)=CHR$ (128+CODE S$(I))
70 NEXT I
80 RETURN

Note that this subroutine assumes the source string is not already in inverse video: if it could be, you will need to test each character before you attempt to convert it.

ZX Spectrum Basic[edit]

10 INVERSE 1
20 PRINT "FOO";
30 INVERSE 0
40 PRINT "BAR"

Befunge[edit]

Assuming a terminal with support for ANSI escape sequences.

0"lamroNm["39*"esrevnIm7["39*>:#,[email protected]

C[edit]

#include <stdio.h>
 
int main()
{
printf("\033[7mReversed\033[m Normal\n");
 
return 0;
}

COBOL[edit]

       IDENTIFICATION DIVISION.
PROGRAM-ID. terminal-reverse-video.
 
PROCEDURE DIVISION.
DISPLAY "Reverse-Video" WITH REVERSE-VIDEO
DISPLAY "Normal"
 
GOBACK
.

FunL[edit]

import console.*
 
println( "${REVERSED}This is reversed.$RESET This is normal." )

Go[edit]

External command[edit]

package main
 
import (
"fmt"
"os"
"os/exec"
)
 
func main() {
tput("rev")
fmt.Print("Rosetta")
tput("sgr0")
fmt.Println(" Code")
}
 
func tput(arg string) error {
cmd := exec.Command("tput", arg)
cmd.Stdout = os.Stdout
return cmd.Run()
}

ANSI escape codes[edit]

package main
 
import "fmt"
 
func main() {
fmt.Println("\033[7mRosetta\033[m Code")
}

Ncurses[edit]

Library: Curses
package main
 
import (
"log"
 
gc "code.google.com/p/goncurses"
)
 
func main() {
s, err := gc.Init()
if err != nil {
log.Fatal("init:", err)
}
defer gc.End()
s.AttrOn(gc.A_REVERSE)
s.Print("Rosetta")
s.AttrOff(gc.A_REVERSE)
s.Println(" Code")
s.GetChar()
}

J[edit]

Use the definitions given in Terminal_control/Coloured_text#J

 
 ;:';:,#.*."3,(C.A.)/\/&.:;:' NB. some output beforehand
attributes REVERSEVIDEO NB. does as it says
2 o.^:a:0 NB. solve the fixed point equation cos(x) == x
attributes OFF NB. no more blinky flashy
parseFrench=:;:,#.*."3,(C.A.)/\/&.:;: NB. just kidding! More output.
 

Kotlin[edit]

Works with: Ubuntu version 14.04
// version 1.1.2
 
fun main(args: Array<String>) {
println("\u001B[7mInverse\u001B[m Normal")
}

Lasso[edit]

local(esc = decode_base64('Gw=='))
 
stdout( #esc + '[7m Reversed Video ' + #esc + '[0m Normal Video ')

Mathematica[edit]

Run["tput mr"]
Run["echo foo"] (* is displayed in reverse mode *)
Run["tput me"]
Run["echo bar"]

Nim[edit]

echo "\e[7mReversed\e[m Normal"

OCaml[edit]

Using the library ANSITerminal in the interactive loop:

$ ocaml unix.cma -I +ANSITerminal ANSITerminal.cma
 
# open ANSITerminal ;;
# print_string [Inverse] "Hello\n" ;;
Hello
- : unit = ()

Pascal[edit]

Works with: Free_Pascal
Library: Curses

Using Free Pascal and ncurses. On some systems linking to the libtinfo library may be necessary.

program InverseVideo;
{$LINKLIB tinfo}
uses
ncurses;
begin
initscr;
attron(A_REVERSE);
printw('reversed');
attroff(A_REVERSE);
printw(' normal');
refresh;
getch;
endwin;
end.
 

Perl 6[edit]

say "normal";
run "tput", "rev";
say "reversed";
run "tput", "sgr0";
say "normal";

Phix[edit]

--
-- demo\rosetta\Inverse_Video.exw
-- ================================
--
text_color(BLACK)
bk_color(WHITE)
printf(1,"Inverse")
text_color(WHITE)
bk_color(BLACK)
printf(1," Video")
printf(1,"\n\npress enter to exit")
{} = wait_key()
 

PicoLisp[edit]

(prin "abc")
(call "tput" "rev")
(prin "def") # These three chars are displayed in reverse video
(call "tput" "sgr0")
(prinl "ghi")

Python[edit]

#!/usr/bin/env python
 
print "\033[7mReversed\033[m Normal"


Racket[edit]

 
#lang racket
(require (planet neil/charterm:3:0))
 
(with-charterm
(charterm-clear-screen)
(charterm-cursor 0 0)
(charterm-inverse)
(charterm-display "Hello")
(charterm-normal)
(charterm-display "World"))
 

REXX[edit]

This version only works with PC/REXX.

/*REXX program to demonstrate reverse video.                            */
@day = 'day'
@night = 'night'
call scrwrite , 1, @day, , , 7 /*white on black.*/
call scrwrite , 1+length(@day), @night, , , 112 /*black on white.*/
/*stick a fork in it, we're done.*/

Ring[edit]

 
nverse = char(17)+char(128)+char(17)+char(15)
normal = char(17)+char(128+15)+char(17)+char(0)
see inverse + " inverse " + normal + " video"
 

Tcl[edit]

This only works on Unix terminals.

# Get how the terminal wants to do things...
set videoSeq(reverse) [exec tput rev]
set videoSeq(normal) [exec tput rmso]
proc reverseVideo str {
global videoSeq
return "$videoSeq(reverse)${str}$videoSeq(normal)"
}
 
# The things to print
set inReverse "foo"
set inNormal "bar"
 
# Print those words
puts "[reverseVideo $inReverse] $inNormal"

TPP[edit]

--revon
This is inverse
--revoff
This is normal

UNIX Shell[edit]

Use the tput(1) utility to write the escape sequences that enable or disable reverse video.

Works with: Bourne Shell
#!/bin/sh
tput mr # foo is reversed
echo 'foo'
tput me # bar is normal video
echo 'bar'

If the system supports terminfo, then tput rev and tput sgr0 also work. (All recent systems have terminfo, except NetBSD, but NetBSD 6 will have terminfo.) The shorter names mr and me are the backward-compatible names from termcap.

If the terminal cannot do reverse video, then tput will fail with a message to standard error.

$ TERM=dumb tput mr
tput: Unknown terminfo capability `mr'

Some programs use the standout mode, which might look exactly like reverse video. (The escape sequences might be identical!)

tput so     # enter standout mode
echo 'foo'
tput se # exit standout mode
echo 'bar'

If the system supports terminfo, then tput smso and tput rmso also work.

C Shell[edit]

tput mr
echo 'foo'
tput me
echo 'bar'

XPL0[edit]

Output device 6 is similar to the normal console screen (device 0), but it provides many combinations of foreground and background colors.

include c:\cxpl\codes;
[Attrib($70);
Text(6, "Inverse");
Attrib($07);
Text(6, " Video");
CrLf(6);
]

zkl[edit]

There is no explicit support for terminals/video. But, assuming an ANSI terminal:

println("\e[7mReversed\e[m Normal");