Terminal control/Positional read: Difference between revisions

Content added Content deleted
m (sorry - forget the "store in a variable" part)
Line 161: Line 161:
other = scrRead(40, 6, 1) /*same thing, but for row forty. */
other = scrRead(40, 6, 1) /*same thing, but for row forty. */
/*stick a fork in it, we're done.*/</lang>
/*stick a fork in it, we're done.*/</lang>

=={{header|TXR}}==
<lang txrlisp>;;; Type definitions and constants

(typedef BOOL (enum BOOL FALSE TRUE))
(typedef HANDLE cptr)
(typedef WCHAR wchar)
(typedef DWORD uint32)
(typedef SHORT short)
(typedef COORD (struct COORD
(X SHORT)
(Y SHORT)))

;;; 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 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* ((chars (vector 5))
(nread (vector 1))
(success-p (ReadConsoleOutputCharacter console-handle
chars
1
#S(COORD X 2 Y 5)
nread)))
(unless success-p
(error "ReadConsoleOutputCharacter failed"))
(unless (plusp [nread 0])
(error "ReadConsoleOutputCharacter read zero characters"))
(format t "character is ~s\n" [chars 0])))</lang>


=={{header|XPL0}}==
=={{header|XPL0}}==