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

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*>:#,_$@

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.1
 
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";

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");