diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/grt/grt-c.ads | 2 | ||||
-rw-r--r-- | src/grt/grt-readline.ads | 16 | ||||
-rw-r--r-- | src/grt/grt-readline_gnu.ads | 12 | ||||
-rw-r--r-- | src/grt/grt-readline_none.adb | 60 | ||||
-rw-r--r-- | src/grt/grt-readline_none.ads | 29 |
5 files changed, 105 insertions, 14 deletions
diff --git a/src/grt/grt-c.ads b/src/grt/grt-c.ads index 64b43127a..e2a66c705 100644 --- a/src/grt/grt-c.ads +++ b/src/grt/grt-c.ads @@ -34,6 +34,8 @@ package Grt.C is -- Type size_t. type size_t is mod 2 ** Standard'Address_Size; + type ssize_t is range + -2 ** (Standard'Address_Size - 1) .. 2 ** (Standard'Address_Size - 1) - 1; -- Type int. It is an alias on Integer for simplicity. subtype int is Integer; diff --git a/src/grt/grt-readline.ads b/src/grt/grt-readline.ads index 5eb1b5c7f..12739f07c 100644 --- a/src/grt/grt-readline.ads +++ b/src/grt/grt-readline.ads @@ -1,14 +1,2 @@ --- Although being part of GRT, the readline binding should be independent of --- it (for easier reuse). - -with Grt.Types; use Grt.Types; - -package Grt.Readline is - function Readline (Prompt : Ghdl_C_String) return Ghdl_C_String; - pragma Import (C, Readline); - - procedure Add_History (Line : Ghdl_C_String); - pragma Import (C, Add_History); - - pragma Linker_Options ("-lreadline"); -end Grt.Readline; +with Grt.Readline_Gnu; +package Grt.Readline renames Grt.Readline_Gnu; diff --git a/src/grt/grt-readline_gnu.ads b/src/grt/grt-readline_gnu.ads new file mode 100644 index 000000000..4d0fc5473 --- /dev/null +++ b/src/grt/grt-readline_gnu.ads @@ -0,0 +1,12 @@ +-- Binding to GNU readline +with Grt.Types; use Grt.Types; + +package Grt.Readline_Gnu is + function Readline (Prompt : Ghdl_C_String) return Ghdl_C_String; + pragma Import (C, Readline); + + procedure Add_History (Line : Ghdl_C_String); + pragma Import (C, Add_History); + + pragma Linker_Options ("-lreadline"); +end Grt.Readline_Gnu; diff --git a/src/grt/grt-readline_none.adb b/src/grt/grt-readline_none.adb new file mode 100644 index 000000000..cbcf35b19 --- /dev/null +++ b/src/grt/grt-readline_none.adb @@ -0,0 +1,60 @@ +-- GHDL Run Time (GRT) - Stupid emulation of readline using stdio +-- Copyright (C) 2022 Tristan Gingold +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 2 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <gnu.org/licenses>. +-- +-- As a special exception, if other files instantiate generics from this +-- unit, or you link this unit with other files to produce an executable, +-- this unit does not by itself cause the resulting executable to be +-- covered by the GNU General Public License. This exception does not +-- however invalidate any other reasons why the executable file might be +-- covered by the GNU Public License. +with System; use System; +with Grt.C; use Grt.C; +with Grt.Stdio; use Grt.Stdio; + +package body Grt.Readline_None is + function getline (Linep : Address; Linecapp : Address; Stream : FILEs) + return ssize_t; + pragma Import (C, getline); + + function Readline (Prompt : Ghdl_C_String) return Ghdl_C_String + is + Len : ssize_t; + Linep : Ghdl_C_String; + Linecapp : size_t; + T : int; + begin + T := fputs (To_Address (Prompt), stdout); + pragma Unreferenced (T); + + Linep := null; + Linecapp := 0; + Len := getline (Linep'Address, Linecapp'Address, stdin); + if Len <= 0 then + free (Linep); + return null; + end if; + -- Remove end of line. + if Linep (Natural (Len)) = ASCII.LF then + Linep (Natural (Len)) := ASCII.NUL; + end if; + return Linep; + end Readline; + + procedure Add_History (Line : Ghdl_C_String) is + begin + null; + end Add_History; +end Grt.Readline_None; diff --git a/src/grt/grt-readline_none.ads b/src/grt/grt-readline_none.ads new file mode 100644 index 000000000..597e8f6ea --- /dev/null +++ b/src/grt/grt-readline_none.ads @@ -0,0 +1,29 @@ +-- GHDL Run Time (GRT) - Stupid emulation of readline using stdio +-- Copyright (C) 2022 Tristan Gingold +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 2 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <gnu.org/licenses>. +-- +-- As a special exception, if other files instantiate generics from this +-- unit, or you link this unit with other files to produce an executable, +-- this unit does not by itself cause the resulting executable to be +-- covered by the GNU General Public License. This exception does not +-- however invalidate any other reasons why the executable file might be +-- covered by the GNU Public License. +with Grt.Types; use Grt.Types; + +package Grt.Readline_None is + function Readline (Prompt : Ghdl_C_String) return Ghdl_C_String; + + procedure Add_History (Line : Ghdl_C_String); +end Grt.Readline_None; |