]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Fix Ada.Text_IO.Delete with "encoding=8bits" form
authorRonan Desplanques <desplanques@adacore.com>
Mon, 23 Oct 2023 14:02:07 +0000 (16:02 +0200)
committerMarc Poulhiès <poulhies@adacore.com>
Tue, 21 Nov 2023 09:57:40 +0000 (10:57 +0100)
Before this patch, on Windows, file with non-ASCII Latin1 names could be created
with Ada.Text_IO.Create by passing "encoding=8bits" through the Form
parameter and a Latin1-encoded string through the Name parameter,
but calling Ada.Text_IO.Delete on them raised an illegitimate exception.

This patch fixes this by making the wrappers of the unlink system function
aware of the encoding value passed through the Form parameter. It also
removes an unnecessary curly-brace block.

gcc/ada/

* adaint.c (__gnat_unlink): Add new parameter and fix text
conversion on Windows. Remove unnecessary curly braces.
* adaint.h (__gnat_unlink): Add new parameter.
* libgnat/i-cstrea.ads (unlink): Adapt to __gnat_unlink signature
change.
* libgnat/i-cstrea.adb (unlink): New Subprogram definition.
* libgnat/s-crtl.ads (unlink): Adapt to __gnat_unlink signature
change.
* libgnat/s-fileio.adb (Delete): Pass encoding argument to unlink.

gcc/ada/adaint.c
gcc/ada/adaint.h
gcc/ada/libgnat/i-cstrea.adb
gcc/ada/libgnat/i-cstrea.ads
gcc/ada/libgnat/s-crtl.ads
gcc/ada/libgnat/s-fileio.adb

index bb4ed2607e50c382185540321de1f1578b617bc7..4ab95658c62db2b9a2de4aaeb11fa95a98b7dd79 100644 (file)
@@ -747,15 +747,19 @@ __gnat_os_filename (char *filename ATTRIBUTE_UNUSED,
 /* Delete a file.  */
 
 int
-__gnat_unlink (char *path)
+__gnat_unlink (char *path, int encoding ATTRIBUTE_UNUSED)
 {
 #if defined (__MINGW32__) && ! defined (__vxworks) && ! defined (IS_CROSS)
-  {
-    TCHAR wpath[GNAT_MAX_PATH_LEN];
+  TCHAR wpath[GNAT_MAX_PATH_LEN];
 
+  if (encoding == Encoding_Unspecified)
     S2WSC (wpath, path, GNAT_MAX_PATH_LEN);
-    return _tunlink (wpath);
-  }
+  else if (encoding == Encoding_UTF8)
+    S2WSU (wpath, path, GNAT_MAX_PATH_LEN);
+  else
+    S2WS (wpath, path, GNAT_MAX_PATH_LEN);
+
+  return _tunlink (wpath);
 #else
   return unlink (path);
 #endif
index 987432c93072c05b8458f33341f8981d8d71e79b..298ea9e2f9f3eb3efdc6462b9a082869afb7d72f 100644 (file)
@@ -172,7 +172,7 @@ extern int    __gnat_open_new_temp             (char *, int);
 extern int    __gnat_mkdir                        (char *, int);
 extern int    __gnat_stat                         (char *,
                                                    GNAT_STRUCT_STAT *);
-extern int    __gnat_unlink                        (char *);
+extern int    __gnat_unlink                        (char *, int encoding);
 extern int    __gnat_rename                        (char *, char *);
 extern int    __gnat_chdir                         (char *);
 extern int    __gnat_rmdir                         (char *);
index f761f3f73aee5096d7edb1ffcf6b1f3462618b3d..fe668e159adf4c841a1d408dbd337b23db875340 100644 (file)
@@ -130,4 +130,13 @@ package body Interfaces.C_Streams is
       return C_setvbuf (stream, buffer, mode, size);
    end setvbuf;
 
+   ------------
+   -- unlink --
+   ------------
+
+   function unlink (filename : chars) return int is
+   begin
+      return System.CRTL.unlink (filename);
+   end unlink;
+
 end Interfaces.C_Streams;
index 39111225db4d02fe8ef92fad75ca5cf5827b152a..67f10cf0b428ba01ae644ef766873cdf01195908 100644 (file)
@@ -197,8 +197,7 @@ package Interfaces.C_Streams is
    function ungetc (c : int; stream : FILEs) return int
      renames System.CRTL.ungetc;
 
-   function unlink (filename : chars) return int
-     renames System.CRTL.unlink;
+   function unlink (filename : chars) return int;
 
    ---------------------
    -- Extra functions --
index c3a3b6481dbce078625915ff5e5057b7b8ee5089..56900a8756f8e0b48c53442e2b6cbd026fbcd4d7 100644 (file)
@@ -220,7 +220,8 @@ package System.CRTL is
    function ungetc (c : int; stream : FILEs) return int;
    pragma Import (C, ungetc, "ungetc");
 
-   function unlink (filename : chars) return int;
+   function unlink (filename : chars;
+     encoding : Filename_Encoding := Unspecified) return int;
    pragma Import (C, unlink, "__gnat_unlink");
 
    function open (filename : chars; oflag : int) return int;
index 931b68a3d2e447ada3717bacf502fbb06043c848..f55cdc796a3795aea433a21967acfdb02e77068a 100644 (file)
@@ -350,6 +350,7 @@ package body System.File_IO is
       declare
          Filename : aliased constant String := File.Name.all;
          Is_Temporary_File : constant Boolean := File.Is_Temporary_File;
+         Encoding : constant CRTL.Filename_Encoding := File.Encoding;
 
       begin
          Close (File_Ptr);
@@ -360,7 +361,7 @@ package body System.File_IO is
          --  it's a temporary file, then closing it already unlinked it.
 
          if not Is_Temporary_File then
-            if unlink (Filename'Address) = -1 then
+            if System.CRTL.unlink (Filename'Address, Encoding) = -1 then
                raise Use_Error with OS_Lib.Errno_Message;
             end if;
          end if;