Terminal control/Positional read: Difference between revisions
Terminal control/Positional read (view source)
Revision as of 12:09, 13 February 2024
, 3 months ago→{{header|Wren}}: Minor tidy
(Added Wren) |
m (→{{header|Wren}}: Minor tidy) |
||
(6 intermediate revisions by 5 users not shown) | |||
Line 1:
{{task|Terminal control}}[[Terminal Control::task| ]]
Determine the character displayed on the screen at column 3, row 6 and store that character in a variable. Note that it is permissible to utilize system or language provided methods or system provided facilities, system maintained records or available buffers or system maintained display records to achieve this task, rather than query the terminal directly, if those methods are more usual for the system type or language.
=={{header|Action!}}==
Method 1: terminal reading
<syntaxhighlight lang="action!">proc Main()
byte CHARS, cursorinh=$2F0
graphics(0) cursorinh=1
position(2,2) printe("Action!")
CHARS=Locate(2,2) position(2,2) put(CHARS)
cursorinh=0
position(2,4) printf("Character at column 2 row 2 was %C",CHARS)
return</syntaxhighlight>
=={{header|AutoHotkey}}==
{{works with|AutoHotkey_L}}
<p>AutoHotkey is not built for the command line, so we need call the WinAPI directly.</p><p>For fun, this writes random characters to the command window so that it has something to retrieve. </p>
<
hConsole := DllCall( "GetStdHandle", int, STDOUT := -11 )
Loop 10
Line 41 ⟶ 57:
return out
return 0
}</
=={{header|BASIC}}==
==={{header|Applesoft BASIC}}===
<
20 LET V = 6:C$ = CHR$ ( FN C(3))</
==={{header|
{{works with|BBC BASIC for Windows}}
<syntaxhighlight lang="bbcbasic"> PRINT TAB(2,5) "Here"
char$ = GET$(2,5)
PRINT ''"Character at column 3 row 6 was " char$</syntaxhighlight>
{{works with|all BBC BASICs}} that support calling OSBYTE
<syntaxhighlight lang="bbcbasic"> PRINT TAB(2,5) "Here"
PRINT TAB(2,5); : REM Position cursor over character to read
A%=&87:char%=((USR&FFF4)AND&FF00)DIV256 : REM Ask operating system to read character
PRINT ''"Character at column 3 row 6 was CHR$(";char%;")"</syntaxhighlight>
==={{header|FreeBASIC}}===
The top Left corner Is at position 0,0
<syntaxhighlight lang="freebasic">'Works on Windows. On Linux, the value returned can differ from the character shown on the console.
'For example, unprintable control codes - such as the LF character (10) that implicitly occurs
'after the end of Printed text - may be picked up instead of the untouched character in its place.
Print "T@4;4G,XIJ"
Print ">C+PE0)RM;"
Print "JEV6B/8E?H"
Print "FSC>41UIGR"
Print "V>41JMXMOW"
Print "IY0*KH6M;B"' Character at column 3, row 6 = 0
Print "-6<UL*>DU7"
Print "MZ))<5D:B8"
Print ".@UB/P6UQ)"
Print "<9HYH)<ZJF"
Dim As Integer char_ascii_value = Screen(6,3)
Locate 6, 14 : Print "Character at column 3, row 6 = "; Chr(char_ascii_value)
Sleep</syntaxhighlight>
==={{header|Locomotive Basic}}===
<syntaxhighlight lang="locobasic">10 LOCATE 3,6
20 a$=COPYCHR$(#0)</syntaxhighlight>
Amstrad CPC screen memory only stores pixels but no character information (as opposed to e.g. the C64), so the firmware routine (TXT_UNWRITE) called by BASIC works by trying to find a match between screen pixels and the shape of a currently defined character. If the character table or screen pixels in the area of the character are changed between writing and reading, COPYCHR$ will therefore fail.
===[[QuickBASIC#QBasic|QBasic]]===
The top left corner is (1, 1).
<
==={{header|ZX Spectrum Basic}}===
<
20 REM So we subtract one from the coordinates
30 LET c$ = SCREEN$(5,2)</
=={{header|C}}==
Line 82 ⟶ 118:
{{libheader|Win32}}
<
#include <wchar.h>
Line 114 ⟶ 150:
wprintf(L"Character at (3, 6) had been '%lc'\n", c);
return 0;
}</
=={{header|Common Lisp}}==
==={{header|ncurses}}===
To interface the ncurses C library from Lisp, the ''croatoan'' library is used.
<
(with-screen (scr :input-blocking t :input-echoing nil :cursor-visible nil)
;; print random characters in a 10x20 grid
Line 136 ⟶ 172:
(format scr "extracted char: ~A" char))
(refresh scr)
(get-char scr)))</
=={{header|Go}}==
{{trans|Kotlin}}
<
/*
Line 167 ⟶ 203:
}
fmt.Printf("The character at column 3, row 6 is '%c'\n", c)
}</
{{out}}
Line 176 ⟶ 212:
=={{header|Julia}}==
{{trans|Raku}}
<
randtxt(n) = foldl(*, rand(split("1234567890abcdefghijklmnopqrstuvwxyz", ""), n))
Line 190 ⟶ 226:
ch = LibNCurses.winch(row, col)
LibNCurses.mvwaddstr(col, 52, "The character at ($row, $col) is $ch.") )
</syntaxhighlight>
=={{header|Kotlin}}==
This is based on the C entry and works on Windows 10:
<
import kotlinx.cinterop.*
Line 218 ⟶ 254:
else println("Something went wrong!")
}
}</
{{out}}
Line 224 ⟶ 260:
The character at column 3, row 6 is 'A'
</pre>
=={{header|Ksh}}==
<syntaxhighlight lang="ksh">
#!/bin/ksh
# Determine the character displayed on the screen at column 3, row 6 and
# store that character in a variable.
#
# Use a group of functions "shellcurses"
# # Variables:
#
FPATH="/usr/local/functions/shellcurses/"
rst="�[0m"
red="�[31m"
whi="�[37m"
integer row=${1:-6} col=${2:-3} # Allow command line row col input
# # 10x10 grid of random digits
#
typeset -A grid
for ((i=0; i<10; i++)); do
for ((j=0; j<10; j++)); do
(( grid[${i}][${j}] = (RANDOM % 9) + 1 ))
done
done
# # Functions:
#
######
# main #
######
# # Initialize the curses screen
#
initscr ; export MAX_LINES MAX_COLS
# # Display the random number grid with target in red
#
clear
for ((i=1; i<=10; i++)); do
for ((j=1; j<=10; j++)); do
colr=${whi}
(( i == row )) && (( j == col )) && colr=${red}
mvaddstr ${i} ${j} "${colr}${grid[$((i-1))][$((j-1))]}${rst}"
done
done
str=$(rtnch ${row} ${col}) # return char at (row, col) location
mvaddstr 12 1 "Digit at (${row},${col}) = ${str}" # Display result
move 14 1
refresh
endwin</syntaxhighlight>
{{out}}<pre>
2466511215
6743931696
7546513188
7233775996
4748942123
8893655153
8341639139
8772676987
3772947552
8454526539
Digit at (6,3) = 9</pre>
=={{header|Nim}}==
Line 230 ⟶ 337:
{{libheader|nim-ncurses}}
This Nim version is inspired by Raku and Julia versions.
<
import ncurses
Line 250 ⟶ 357:
discard getch()
endwin()</
{{out}}
Line 268 ⟶ 375:
=={{header|Perl}}==
{{trans|Raku}}
<
use strict;
Line 294 ⟶ 401:
$win->getch;
endwin;</
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(notonline)-->
<span style="color: #000080;font-style:italic;">--
-- demo\rosetta\Positional_read.exw
-- ================================
--</span>
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (position, get_screen_char)</span>
<span style="color: #7060A8;">position</span><span style="color: #0000FF;">(</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- line 6 column 1 (1-based)</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"abcdef"</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">,</span><span style="color: #000000;">attr</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_screen_char</span><span style="color: #0000FF;">(</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n\n=>%c"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">wait_key</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 320 ⟶ 430:
=={{header|PowerShell}}==
This gets the character at position (3, 6) of the ''buffer'', not necessarily of the screen.
<
$coord = [System.Management.Automation.Host.Coordinates]::new(3, 6)
$rect = [System.Management.Automation.Host.Rectangle]::new($coord, $coord)
$char = $Host.UI.RawUI.GetBufferContents($rect).Character
</syntaxhighlight>
=={{header|Python}}==
<
from random import randint
Line 348 ⟶ 458:
curses.endwin()
</syntaxhighlight>
{{out}}
Line 365 ⟶ 475:
=={{header|Racket}}==
Works in a CMD box on Windows:
<
#lang racket
(require ffi/unsafe ffi/unsafe/define)
Line 376 ⟶ 486:
(and (ReadConsoleOutputCharacterA (GetStdHandle -11) b 1 #x50002)
(printf "The character at 3x6 is <~a>\n" b))
</syntaxhighlight>
=={{header|Raku}}==
(formerly Perl 6)
{{trans|Python}}
<syntaxhighlight lang="raku"
# Reference:
Line 416 ⟶ 526:
delwin($win) if $win;
endwin;
}</
{{out}}
Line 449 ⟶ 559:
{{works with|PC/REXX}}
{{works with|Personal REXX}}
<
row = 6 /*point to a particular row on screen*/
col = 3 /* " " " " column " " */
Line 457 ⟶ 567:
other = scrRead(40, 3, 1) /*same thing, but for row forty. */
/*stick a fork in it, we're all done. */</
=={{header|TXR}}==
<
(typedef BOOL (enum BOOL FALSE TRUE))
Line 531 ⟶ 641:
(unless (plusp [nread 0])
(error "ReadConsoleOutputCharacter read zero characters"))
(format t "character is ~s\n" [chars 0])))</
Notes:
Line 541 ⟶ 651:
{{libheader|ncurses}}
An embedded program so we can ask the C host to communicate with ncurses for us.
<syntaxhighlight lang="wren">/* Terminal_control_Positional_read.wren */
import "random" for Random
Line 598 ⟶ 708:
// clean-up
win.delwin()
Ncurses.endwin()</
<br>
We now embed this in the following C program, compile and run it.
<syntaxhighlight lang="c">/* gcc Terminal_control_Positional_read.c -o Terminal_control_Positional_read -lncurses -lwren -lm */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Line 728 ⟶ 840:
WrenVM* vm = wrenNewVM(&config);
const char* module = "main";
const char* fileName = "
char *script = readFile(fileName);
WrenInterpretResult result = wrenInterpret(vm, module, script);
Line 744 ⟶ 856:
free(script);
return 0;
}</
{{out}}
Line 764 ⟶ 876:
=={{header|XPL0}}==
<
int C;
[Cursor(3, 6); \move cursor to column 3, row 6 (top left = 0,0)
\Call BIOS interrupt routine to read character (& attribute) at cursor position
C:= CallInt($10, $0800, 0) & $00FF; \mask off attribute, leaving the character
]</
{{omit from|ACL2}}
|