From 8d7791ba55e2f6327454a3d1f49549798f719cf9 Mon Sep 17 00:00:00 2001 From: Steve Dunham Date: Tue, 18 Jul 2023 07:42:47 -0700 Subject: [PATCH] =?UTF-8?q?[=20base=20]=20Add=20getTermCols=20and=20getTer?= =?UTF-8?q?mLines=20to=20base=20library=20and=20fix=20pri=E2=80=A6=20(#300?= =?UTF-8?q?9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 +++ libs/base/System/Term.idr | 27 +++++++++++++++++++++++++ libs/base/base.ipkg | 3 ++- src/Libraries/Utils/Term.idr | 2 ++ support/c/idris_term.c | 14 +++++++++++-- tests/Main.idr | 2 +- tests/allschemes/scheme002/TermSize.idr | 7 +++++++ tests/allschemes/scheme002/expected | 1 + tests/allschemes/scheme002/run | 13 ++++++++++++ 9 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 libs/base/System/Term.idr create mode 100644 tests/allschemes/scheme002/TermSize.idr create mode 100644 tests/allschemes/scheme002/expected create mode 100755 tests/allschemes/scheme002/run diff --git a/CHANGELOG.md b/CHANGELOG.md index 236908d08f..18245508fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -169,6 +169,9 @@ * Adds `leftmost` and `rightmost` to `Control.Order`, a generalisation of `min` and `max`. +* Adds `getTermCols` and `getTermLines` to the base library. They return the size of the + terminal if either stdin or stdout is a tty. + #### System * Changes `getNProcessors` to return the number of online processors rather than diff --git a/libs/base/System/Term.idr b/libs/base/System/Term.idr new file mode 100644 index 0000000000..0c0a506054 --- /dev/null +++ b/libs/base/System/Term.idr @@ -0,0 +1,27 @@ +module System.Term + +%default total + +libterm : String -> String +libterm s = "C:" ++ s ++ ", libidris2_support, idris_term.h" + +%foreign libterm "idris2_setupTerm" +prim__setupTerm : PrimIO () + +%foreign libterm "idris2_getTermCols" +prim__getTermCols : PrimIO Int + +%foreign libterm "idris2_getTermLines" +prim__getTermLines : PrimIO Int + +export +setupTerm : IO () +setupTerm = primIO prim__setupTerm + +export +getTermCols : IO Int +getTermCols = primIO prim__getTermCols + +export +getTermLines : IO Int +getTermLines = primIO prim__getTermLines diff --git a/libs/base/base.ipkg b/libs/base/base.ipkg index 81f829bfb1..920834668b 100644 --- a/libs/base/base.ipkg +++ b/libs/base/base.ipkg @@ -127,4 +127,5 @@ modules = Control.App, System.File.Virtual, System.Info, System.REPL, - System.Signal + System.Signal, + System.Term diff --git a/src/Libraries/Utils/Term.idr b/src/Libraries/Utils/Term.idr index 3a8eec70de..69b08d79e9 100644 --- a/src/Libraries/Utils/Term.idr +++ b/src/Libraries/Utils/Term.idr @@ -2,6 +2,8 @@ module Libraries.Utils.Term %default total +-- TODO: remove this file and use System.Term after version following 0.6.0 is released + libterm : String -> String libterm s = "C:" ++ s ++ ", libidris2_support, idris_term.h" diff --git a/support/c/idris_term.c b/support/c/idris_term.c index 80e826928e..3b3887d408 100644 --- a/support/c/idris_term.c +++ b/support/c/idris_term.c @@ -36,13 +36,23 @@ void idris2_setupTerm() { int idris2_getTermCols() { struct winsize ts; - ioctl(0, TIOCGWINSZ, &ts); + int err = ioctl(0, TIOCGWINSZ, &ts); + if (err) { + err = ioctl(1, TIOCGWINSZ, &ts); + } + if (err) + return 0; return (int)ts.ws_col; } int idris2_getTermLines() { struct winsize ts; - ioctl(0, TIOCGWINSZ, &ts); + int err = ioctl(0, TIOCGWINSZ, &ts); + if (err) { + err = ioctl(1, TIOCGWINSZ, &ts); + } + if (err) + return 0; return (int)ts.ws_row; } diff --git a/tests/Main.idr b/tests/Main.idr index ae109ea3cc..030fd22eac 100644 --- a/tests/Main.idr +++ b/tests/Main.idr @@ -204,7 +204,7 @@ idrisTestsAllSchemes : Requirement -> TestPool idrisTestsAllSchemes cg = MkTestPool ("Test across all scheme backends: " ++ show cg ++ " instance") [] (Just cg) - [ "scheme001" + [ "scheme001", "scheme002" , "channels001", "channels002", "channels003", "channels004", "channels005" , "channels006" ] diff --git a/tests/allschemes/scheme002/TermSize.idr b/tests/allschemes/scheme002/TermSize.idr new file mode 100644 index 0000000000..fdba50480c --- /dev/null +++ b/tests/allschemes/scheme002/TermSize.idr @@ -0,0 +1,7 @@ +import System.Term + +main : IO () +main = do + width <- getTermCols + height <- getTermLines + printLn "Success \{show $ width > 0} \{show $ height > 0}" diff --git a/tests/allschemes/scheme002/expected b/tests/allschemes/scheme002/expected new file mode 100644 index 0000000000..5dbe5530d8 --- /dev/null +++ b/tests/allschemes/scheme002/expected @@ -0,0 +1 @@ +"Success False False" diff --git a/tests/allschemes/scheme002/run b/tests/allschemes/scheme002/run new file mode 100755 index 0000000000..ef7704711d --- /dev/null +++ b/tests/allschemes/scheme002/run @@ -0,0 +1,13 @@ +rm -rf build + +# observe that errors are correctly reported as zero. +$1 --exec main TermSize.idr