Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
3
Task/Terminal-control-Positional-read/00-META.yaml
Normal file
3
Task/Terminal-control-Positional-read/00-META.yaml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
from: http://rosettacode.org/wiki/Terminal_control/Positional_read
|
||||
note: Terminal control
|
||||
3
Task/Terminal-control-Positional-read/00-TASK.txt
Normal file
3
Task/Terminal-control-Positional-read/00-TASK.txt
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[[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.
|
||||
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
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
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
10 DEF FN C(H) = SCRN( H - 1,(V - 1) * 2) + SCRN( H - 1,(V - 1) * 2 + 1) * 16
|
||||
20 LET V = 6:C$ = CHR$ ( FN C(3))
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
DllCall( "AllocConsole" ) ; create a console if not launched from one
|
||||
hConsole := DllCall( "GetStdHandle", int, STDOUT := -11 )
|
||||
Loop 10
|
||||
{
|
||||
Loop 10
|
||||
{
|
||||
Random, asc, % asc("A"), % Asc("Z")
|
||||
WriteConsole(hConsole, Chr(asc))
|
||||
}
|
||||
WriteConsole(hConsole, "`n")
|
||||
}
|
||||
|
||||
MsgBox % ReadConsoleOutputCharacter(hConsole, 1, 3, 6)
|
||||
|
||||
; === The below simply wraps part of the WinAPI ===
|
||||
|
||||
WriteConsole(hConsole, text){
|
||||
VarSetCapacity(out, 16)
|
||||
If DllCall( "WriteConsole", UPtr, hConsole, Str, text, UInt, StrLen(text)
|
||||
, UPtrP, out, uint, 0 )
|
||||
return out
|
||||
return 0
|
||||
}
|
||||
ReadConsoleOutputCharacter(hConsole, length, x, y){
|
||||
VarSetCapacity(out, length * (1 << !!A_IsUnicode))
|
||||
VarSetCapacity(n, 16)
|
||||
if DllCall( "ReadConsoleOutputCharacter"
|
||||
, UPtr, hConsole
|
||||
, Str, out
|
||||
, UInt, length
|
||||
, UInt, x | (y << 16)
|
||||
, UPtrP, n )
|
||||
|
||||
&& VarSetCapacity(out, -1)
|
||||
return out
|
||||
return 0
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
PRINT TAB(2,5) "Here"
|
||||
char$ = GET$(2,5)
|
||||
PRINT ''"Character at column 3 row 6 was " char$
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
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%;")"
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
#include <windows.h>
|
||||
#include <wchar.h>
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
CONSOLE_SCREEN_BUFFER_INFO info;
|
||||
COORD pos;
|
||||
HANDLE conout;
|
||||
long len;
|
||||
wchar_t c;
|
||||
|
||||
/* Create a handle to the console screen. */
|
||||
conout = CreateFileW(L"CONOUT$", GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
|
||||
0, NULL);
|
||||
if (conout == INVALID_HANDLE_VALUE)
|
||||
return 1;
|
||||
|
||||
/* Where is the display window? */
|
||||
if (GetConsoleScreenBufferInfo(conout, &info) == 0)
|
||||
return 1;
|
||||
|
||||
/* c = character at position. */
|
||||
pos.X = info.srWindow.Left + 3; /* Column */
|
||||
pos.Y = info.srWindow.Top + 6; /* Row */
|
||||
if (ReadConsoleOutputCharacterW(conout, &c, 1, pos, &len) == 0 ||
|
||||
len <= 0)
|
||||
return 1;
|
||||
|
||||
wprintf(L"Character at (3, 6) had been '%lc'\n", c);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
'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
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
package main
|
||||
|
||||
/*
|
||||
#include <windows.h>
|
||||
*/
|
||||
import "C"
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
for i := 0; i < 80*25; i++ {
|
||||
fmt.Print("A") // fill 80 x 25 console with 'A's
|
||||
}
|
||||
fmt.Println()
|
||||
conOut := C.GetStdHandle(C.STD_OUTPUT_HANDLE)
|
||||
info := C.CONSOLE_SCREEN_BUFFER_INFO{}
|
||||
pos := C.COORD{}
|
||||
C.GetConsoleScreenBufferInfo(conOut, &info)
|
||||
pos.X = info.srWindow.Left + 3 // column number 3 of display window
|
||||
pos.Y = info.srWindow.Top + 6 // row number 6 of display window
|
||||
var c C.wchar_t
|
||||
var le C.ulong
|
||||
ret := C.ReadConsoleOutputCharacterW(conOut, &c, 1, pos, &le)
|
||||
if ret == 0 || le <= 0 {
|
||||
fmt.Println("Something went wrong!")
|
||||
return
|
||||
}
|
||||
fmt.Printf("The character at column 3, row 6 is '%c'\n", c)
|
||||
}
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
using LibNCurses
|
||||
|
||||
randtxt(n) = foldl(*, rand(split("1234567890abcdefghijklmnopqrstuvwxyz", ""), n))
|
||||
|
||||
initscr()
|
||||
|
||||
for i in 1:20
|
||||
LibNCurses.mvwaddstr(i, 1, randtxt(50))
|
||||
end
|
||||
|
||||
row = rand(1:20)
|
||||
col = rand(1:50)
|
||||
ch = LibNCurses.winch(row, col)
|
||||
LibNCurses.mvwaddstr(col, 52, "The character at ($row, $col) is $ch.") )
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
// Kotlin Native version 0.3
|
||||
|
||||
import kotlinx.cinterop.*
|
||||
import win32.*
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
for (i in 0 until (80 * 25)) print("A") // fill 80 x 25 console with 'A's
|
||||
println()
|
||||
memScoped {
|
||||
val conOut = GetStdHandle(-11)
|
||||
val info = alloc<CONSOLE_SCREEN_BUFFER_INFO>()
|
||||
val pos = alloc<COORD>()
|
||||
GetConsoleScreenBufferInfo(conOut, info.ptr)
|
||||
pos.X = (info.srWindow.Left + 3).toShort() // column number 3 of display window
|
||||
pos.Y = (info.srWindow.Top + 6).toShort() // row number 6 of display window
|
||||
val c = alloc<wchar_tVar>()
|
||||
val len = alloc<IntVar>()
|
||||
ReadConsoleOutputCharacterW(conOut, c.ptr, 1, pos.readValue(), len.ptr)
|
||||
if (len.value == 1) {
|
||||
val ch = c.value.toChar()
|
||||
println("The character at column 3, row 6 is '$ch'")
|
||||
}
|
||||
else println("Something went wrong!")
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
#!/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="<22>[0m"
|
||||
red="<22>[31m"
|
||||
whi="<22>[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
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
10 LOCATE 3,6
|
||||
20 a$=COPYCHR$(#0)
|
||||
|
|
@ -0,0 +1 @@
|
|||
c$ = CHR$(SCREEN(6, 3))
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
import random, sequtils, strutils
|
||||
import ncurses
|
||||
|
||||
randomize()
|
||||
|
||||
let win = initscr()
|
||||
assert not win.isNil, "Unable to initialize."
|
||||
|
||||
for y in 0..9:
|
||||
mvaddstr(y.cint, 0, newSeqWith(10, sample({'0'..'9', 'a'..'z'})).join())
|
||||
|
||||
let row = rand(9).cint
|
||||
let col = rand(9).cint
|
||||
let ch = win.mvwinch(row, col)
|
||||
|
||||
mvaddstr(row, col + 11, "The character at ($1, $2) is $3.".format(row, col, chr(ch)))
|
||||
mvaddstr(11, 0, "Press any key to quit.")
|
||||
refresh()
|
||||
discard getch()
|
||||
|
||||
endwin()
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
# 20200917 added Perl programming solution
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Curses;
|
||||
|
||||
initscr or die;
|
||||
|
||||
my $win = Curses->new;
|
||||
|
||||
foreach my $row (0..9) {
|
||||
$win->addstr( $row , 0, join('', map { chr(int(rand(50)) + 41) } (0..9)))
|
||||
};
|
||||
|
||||
my $icol = 3 - 1;
|
||||
my $irow = 6 - 1;
|
||||
|
||||
my $ch = $win->inch($irow,$icol);
|
||||
|
||||
$win->addstr( $irow, $icol+10, 'Character at column 3, row 6 = '.$ch );
|
||||
|
||||
$win->addstr( LINES() - 2, 2, "Press any key to exit..." );
|
||||
|
||||
$win->getch;
|
||||
|
||||
endwin;
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
(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>
|
||||
<!--
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
$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
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
import curses
|
||||
from random import randint
|
||||
|
||||
|
||||
# Print random text in a 10x10 grid
|
||||
stdscr = curses.initscr()
|
||||
for rows in range(10):
|
||||
line = ''.join([chr(randint(41, 90)) for i in range(10)])
|
||||
stdscr.addstr(line + '\n')
|
||||
|
||||
# Read
|
||||
icol = 3 - 1
|
||||
irow = 6 - 1
|
||||
ch = stdscr.instr(irow, icol, 1).decode(encoding="utf-8")
|
||||
|
||||
# Show result
|
||||
stdscr.move(irow, icol + 10)
|
||||
stdscr.addstr('Character at column 3, row 6 = ' + ch + '\n')
|
||||
stdscr.getch()
|
||||
|
||||
curses.endwin()
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
/*REXX program demonstrates reading a character from (at) at specific screen location. */
|
||||
row = 6 /*point to a particular row on screen*/
|
||||
col = 3 /* " " " " column " " */
|
||||
howMany = 1 /*read this many characters from screen*/
|
||||
|
||||
stuff = scrRead(row, col, howMany) /*this'll do it. */
|
||||
|
||||
other = scrRead(40, 3, 1) /*same thing, but for row forty. */
|
||||
/*stick a fork in it, we're all done. */
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
#lang racket
|
||||
(require ffi/unsafe ffi/unsafe/define)
|
||||
(define-ffi-definer defwin #f)
|
||||
(defwin GetStdHandle (_fun _int -> _pointer))
|
||||
(defwin ReadConsoleOutputCharacterA
|
||||
(_fun _pointer _pointer _uint _uint [len : (_ptr o _uint)] -> _bool))
|
||||
|
||||
(define b (make-bytes 1 32))
|
||||
(and (ReadConsoleOutputCharacterA (GetStdHandle -11) b 1 #x50002)
|
||||
(printf "The character at 3x6 is <~a>\n" b))
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
use NCurses;
|
||||
|
||||
# Reference:
|
||||
# https://github.com/azawawi/perl6-ncurses
|
||||
|
||||
# Initialize curses window
|
||||
my $win = initscr() or die "Failed to initialize ncurses\n";
|
||||
|
||||
# Print random text in a 10x10 grid
|
||||
|
||||
for ^10 { mvaddstr($_ , 0, (for ^10 {(41 .. 90).roll.chr}).join )};
|
||||
|
||||
# Read
|
||||
|
||||
my $icol = 3 - 1;
|
||||
my $irow = 6 - 1;
|
||||
|
||||
my $ch = mvinch($irow,$icol);
|
||||
|
||||
# Show result
|
||||
|
||||
mvaddstr($irow, $icol+10, 'Character at column 3, row 6 = ' ~ $ch.chr);
|
||||
|
||||
mvaddstr( LINES() - 2, 2, "Press any key to exit..." );
|
||||
|
||||
# Refresh (this is needed)
|
||||
nc_refresh;
|
||||
|
||||
# Wait for a keypress
|
||||
getch;
|
||||
|
||||
# Cleanup
|
||||
LEAVE {
|
||||
delwin($win) if $win;
|
||||
endwin;
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
;;; Type definitions and constants
|
||||
|
||||
(typedef BOOL (enum BOOL FALSE TRUE))
|
||||
(typedef HANDLE cptr)
|
||||
(typedef WCHAR wchar)
|
||||
(typedef DWORD uint32)
|
||||
(typedef WORD uint16)
|
||||
(typedef SHORT short)
|
||||
|
||||
(typedef COORD
|
||||
(struct COORD
|
||||
(X SHORT)
|
||||
(Y SHORT)))
|
||||
|
||||
(typedef SMALL_RECT
|
||||
(struct SMALL_RECT
|
||||
(Left SHORT)
|
||||
(Top SHORT)
|
||||
(Right SHORT)
|
||||
(Bottom SHORT)))
|
||||
|
||||
(typedef CONSOLE_SCREEN_BUFFER_INFO
|
||||
(struct CONSOLE_SCREEN_BUFFER_INFO
|
||||
(dwSize COORD)
|
||||
(dwCursorPosition COORD)
|
||||
(wAttributes WORD)
|
||||
(srWindow SMALL_RECT)
|
||||
(dwMaximumWindowSize COORD)))
|
||||
|
||||
;;; Various constants
|
||||
|
||||
(defvarl STD_INPUT_HANDLE (- #x100000000 10))
|
||||
(defvarl STD_OUTPUT_HANDLE (- #x100000000 11))
|
||||
(defvarl STD_ERROR_HANDLE (- #x100000000 12))
|
||||
|
||||
(defvarl NULL cptr-null)
|
||||
(defvarl INVALID_HANDLE_VALUE (cptr-int -1))
|
||||
|
||||
;;; Foreign Function Bindings
|
||||
|
||||
(with-dyn-lib "kernel32.dll"
|
||||
(deffi GetStdHandle "GetStdHandle" HANDLE (DWORD))
|
||||
(deffi GetConsoleScreenBufferInfo "GetConsoleScreenBufferInfo"
|
||||
BOOL (HANDLE (ptr-out CONSOLE_SCREEN_BUFFER_INFO)))
|
||||
(deffi ReadConsoleOutputCharacter "ReadConsoleOutputCharacterW"
|
||||
BOOL (HANDLE (ptr-out (array 1 WCHAR))
|
||||
DWORD COORD (ptr-out (array 1 DWORD)))))
|
||||
|
||||
;;; Now the character at <2, 5> -- column 3, row 6.
|
||||
|
||||
(let ((console-handle (GetStdHandle STD_OUTPUT_HANDLE)))
|
||||
(when (equal console-handle INVALID_HANDLE_VALUE)
|
||||
(error "couldn't get console handle"))
|
||||
|
||||
(let* ((cinfo (new CONSOLE_SCREEN_BUFFER_INFO))
|
||||
(getinfo-ok (GetConsoleScreenBufferInfo console-handle cinfo))
|
||||
(coord (if getinfo-ok
|
||||
^#S(COORD X ,(+ 2 cinfo.srWindow.Left)
|
||||
Y ,(+ 5 cinfo.srWindow.Top))
|
||||
#S(COORD X 0 Y 0)))
|
||||
(chars (vector 1))
|
||||
(nread (vector 1))
|
||||
(read-ok (ReadConsoleOutputCharacter console-handle chars
|
||||
1 coord nread)))
|
||||
(when (eq getinfo-ok 'FALSE)
|
||||
(error "GetConsoleScreenBufferInfo failed"))
|
||||
(prinl cinfo)
|
||||
(when (eq read-ok 'FALSE)
|
||||
(error "ReadConsoleOutputCharacter failed"))
|
||||
(unless (plusp [nread 0])
|
||||
(error "ReadConsoleOutputCharacter read zero characters"))
|
||||
(format t "character is ~s\n" [chars 0])))
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
/* terminal_control_positional_read.wren */
|
||||
|
||||
import "random" for Random
|
||||
|
||||
foreign class Window {
|
||||
construct initscr() {}
|
||||
|
||||
foreign addstr(str)
|
||||
|
||||
foreign inch(y, x)
|
||||
|
||||
foreign move(y, x)
|
||||
|
||||
foreign refresh()
|
||||
|
||||
foreign getch()
|
||||
|
||||
foreign delwin()
|
||||
}
|
||||
|
||||
class Ncurses {
|
||||
foreign static endwin()
|
||||
}
|
||||
|
||||
// initialize curses window
|
||||
var win = Window.initscr()
|
||||
if (win == 0) {
|
||||
System.print("Failed to initialize ncurses.")
|
||||
return
|
||||
}
|
||||
|
||||
// print random text in a 10x10 grid
|
||||
var rand = Random.new()
|
||||
for (row in 0..9) {
|
||||
var line = (0..9).map{ |d| String.fromByte(rand.int(41, 91)) }.join()
|
||||
win.addstr(line + "\n")
|
||||
}
|
||||
|
||||
// read
|
||||
var col = 3 - 1
|
||||
var row = 6 - 1
|
||||
var ch = win.inch(row, col)
|
||||
|
||||
// show result
|
||||
win.move(row, col + 10)
|
||||
win.addstr("Character at column 3, row 6 = %(ch)")
|
||||
win.move(11, 0)
|
||||
win.addstr("Press any key to exit...")
|
||||
|
||||
// refresh
|
||||
win.refresh()
|
||||
|
||||
// wait for a keypress
|
||||
win.getch()
|
||||
|
||||
// clean-up
|
||||
win.delwin()
|
||||
Ncurses.endwin()
|
||||
|
|
@ -0,0 +1,144 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ncurses.h>
|
||||
#include "wren.h"
|
||||
|
||||
/* C <=> Wren interface functions */
|
||||
|
||||
void C_windowAllocate(WrenVM* vm) {
|
||||
WINDOW** pwin = (WINDOW**)wrenSetSlotNewForeign(vm, 0, 0, sizeof(WINDOW*));
|
||||
*pwin = initscr();
|
||||
}
|
||||
|
||||
void C_addstr(WrenVM* vm) {
|
||||
WINDOW* win = *(WINDOW**)wrenGetSlotForeign(vm, 0);
|
||||
const char *str = wrenGetSlotString(vm, 1);
|
||||
waddstr(win, str);
|
||||
}
|
||||
|
||||
void C_inch(WrenVM* vm) {
|
||||
WINDOW* win = *(WINDOW**)wrenGetSlotForeign(vm, 0);
|
||||
int y = (int)wrenGetSlotDouble(vm, 1);
|
||||
int x = (int)wrenGetSlotDouble(vm, 2);
|
||||
char c = (char)mvwinch(win, y, x);
|
||||
char s[2] = "\0";
|
||||
sprintf(s, "%c", c);
|
||||
wrenSetSlotString(vm, 0, s);
|
||||
}
|
||||
|
||||
void C_move(WrenVM* vm) {
|
||||
WINDOW* win = *(WINDOW**)wrenGetSlotForeign(vm, 0);
|
||||
int y = (int)wrenGetSlotDouble(vm, 1);
|
||||
int x = (int)wrenGetSlotDouble(vm, 2);
|
||||
wmove(win, y, x);
|
||||
}
|
||||
|
||||
void C_refresh(WrenVM* vm) {
|
||||
WINDOW* win = *(WINDOW**)wrenGetSlotForeign(vm, 0);
|
||||
wrefresh(win);
|
||||
}
|
||||
|
||||
void C_getch(WrenVM* vm) {
|
||||
WINDOW* win = *(WINDOW**)wrenGetSlotForeign(vm, 0);
|
||||
wgetch(win);
|
||||
}
|
||||
|
||||
void C_delwin(WrenVM* vm) {
|
||||
WINDOW* win = *(WINDOW**)wrenGetSlotForeign(vm, 0);
|
||||
delwin(win);
|
||||
}
|
||||
|
||||
void C_endwin(WrenVM* vm) {
|
||||
endwin();
|
||||
}
|
||||
|
||||
WrenForeignClassMethods bindForeignClass(WrenVM* vm, const char* module, const char* className) {
|
||||
WrenForeignClassMethods methods;
|
||||
methods.allocate = NULL;
|
||||
methods.finalize = NULL;
|
||||
if (strcmp(module, "main") == 0) {
|
||||
if (strcmp(className, "Window") == 0) {
|
||||
methods.allocate = C_windowAllocate;
|
||||
}
|
||||
}
|
||||
return methods;
|
||||
}
|
||||
|
||||
WrenForeignMethodFn bindForeignMethod(
|
||||
WrenVM* vm,
|
||||
const char* module,
|
||||
const char* className,
|
||||
bool isStatic,
|
||||
const char* signature) {
|
||||
if (strcmp(module, "main") == 0) {
|
||||
if (strcmp(className, "Window") == 0) {
|
||||
if (!isStatic && strcmp(signature, "addstr(_)") == 0) return C_addstr;
|
||||
if (!isStatic && strcmp(signature, "inch(_,_)") == 0) return C_inch;
|
||||
if (!isStatic && strcmp(signature, "move(_,_)") == 0) return C_move;
|
||||
if (!isStatic && strcmp(signature, "refresh()") == 0) return C_refresh;
|
||||
if (!isStatic && strcmp(signature, "getch()") == 0) return C_getch;
|
||||
if (!isStatic && strcmp(signature, "delwin()") == 0) return C_delwin;
|
||||
} else if (strcmp(className, "Ncurses") == 0) {
|
||||
if ( isStatic && strcmp(signature, "endwin()") == 0) return C_endwin;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void writeFn(WrenVM* vm, const char* text) {
|
||||
printf("%s", text);
|
||||
}
|
||||
|
||||
void errorFn(WrenVM* vm, WrenErrorType errorType, const char* module, const int line, const char* msg) {
|
||||
switch (errorType) {
|
||||
case WREN_ERROR_COMPILE:
|
||||
printf("[%s line %d] [Error] %s\n", module, line, msg);
|
||||
break;
|
||||
case WREN_ERROR_STACK_TRACE:
|
||||
printf("[%s line %d] in %s\n", module, line, msg);
|
||||
break;
|
||||
case WREN_ERROR_RUNTIME:
|
||||
printf("[Runtime Error] %s\n", msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
char *readFile(const char *fileName) {
|
||||
FILE *f = fopen(fileName, "r");
|
||||
fseek(f, 0, SEEK_END);
|
||||
long fsize = ftell(f);
|
||||
rewind(f);
|
||||
char *script = malloc(fsize + 1);
|
||||
fread(script, 1, fsize, f);
|
||||
fclose(f);
|
||||
script[fsize] = 0;
|
||||
return script;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
WrenConfiguration config;
|
||||
wrenInitConfiguration(&config);
|
||||
config.writeFn = &writeFn;
|
||||
config.errorFn = &errorFn;
|
||||
config.bindForeignClassFn = &bindForeignClass;
|
||||
config.bindForeignMethodFn = &bindForeignMethod;
|
||||
WrenVM* vm = wrenNewVM(&config);
|
||||
const char* module = "main";
|
||||
const char* fileName = "terminal_control_positional_read.wren";
|
||||
char *script = readFile(fileName);
|
||||
WrenInterpretResult result = wrenInterpret(vm, module, script);
|
||||
switch (result) {
|
||||
case WREN_RESULT_COMPILE_ERROR:
|
||||
printf("Compile Error!\n");
|
||||
break;
|
||||
case WREN_RESULT_RUNTIME_ERROR:
|
||||
printf("Runtime Error!\n");
|
||||
break;
|
||||
case WREN_RESULT_SUCCESS:
|
||||
break;
|
||||
}
|
||||
wrenFreeVM(vm);
|
||||
free(script);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
include c:\cxpl\stdlib;
|
||||
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
|
||||
]
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
10 REM The top left corner is at position 0,0
|
||||
20 REM So we subtract one from the coordinates
|
||||
30 LET c$ = SCREEN$(5,2)
|
||||
Loading…
Add table
Add a link
Reference in a new issue