]> Savannah Git Hosting - gnulib.git/commitdiff
full-read, etc.: prefer signed types
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 9 Aug 2024 21:33:31 +0000 (14:33 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 9 Aug 2024 21:36:11 +0000 (14:36 -0700)
* lib/full-read.h, lib/full-write.h, lib/safe-read.h, lib/safe-write.h:
Include idx.h.
* lib/full-write.c (full_read, full_write):
Now accept and returns idx_t.
* lib/safe-read.c (bufptr): New type, since apps are not
supposed to #define keywords like ‘const’.
(safe_read, safe_write): Now accept idx_t and return ptrdiff_t.
* lib/safe-read.h (SAFE_READ_ERROR):
* lib/safe-write.h (SAFE_WRITE_ERROR):
Now ptrdiff_t, not size_t.
* modules/full-read, modules/full-write, modules/safe-read:
* modules/safe-write (Depends-on): Add idx.

12 files changed:
ChangeLog
NEWS
lib/full-read.h
lib/full-write.c
lib/full-write.h
lib/safe-read.c
lib/safe-read.h
lib/safe-write.h
modules/full-read
modules/full-write
modules/safe-read
modules/safe-write

index 7c9f9bce7628d6fb4e5328cc27dc61779924e426..ff3704336b3cd49e7e56725e3ada5ad04b3cd310 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2024-08-09  Paul Eggert  <eggert@cs.ucla.edu>
+
+       full-read, etc.: prefer signed types
+       * lib/full-read.h, lib/full-write.h, lib/safe-read.h, lib/safe-write.h:
+       Include idx.h.
+       * lib/full-write.c (full_read, full_write):
+       Now accept and returns idx_t.
+       * lib/safe-read.c (bufptr): New type, since apps are not
+       supposed to #define keywords like ‘const’.
+       (safe_read, safe_write): Now accept idx_t and return ptrdiff_t.
+       * lib/safe-read.h (SAFE_READ_ERROR):
+       * lib/safe-write.h (SAFE_WRITE_ERROR):
+       Now ptrdiff_t, not size_t.
+       * modules/full-read, modules/full-write, modules/safe-read:
+       * modules/safe-write (Depends-on): Add idx.
+
 2024-08-09  Bruno Haible  <bruno@clisp.org>
 
        sig2str: Align with POSIX:2024.
diff --git a/NEWS b/NEWS
index 4c5d9fc5de3ce34da358ba825941184a9951c484..865b86ba3cbf1f3a9a45394947f043859d0d4a8f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -74,6 +74,12 @@ User visible incompatible changes
 
 Date        Modules         Changes
 
+2024-08-09  full-read       These modules now prefer signed types to size_t.
+            full-write      The preferred types are idx_t for object sizes and
+            safe-read       ptrdiff_t for values that are either a size or -1.
+            safe-write      SAFE_READ_ERROR and SAFE_WRITE_ERROR are now
+                            obsolescent; callers can just check for < 0.
+
 2024-06-22  xvasprintf      It is now the programmer's responsibility to pass
             c-xvasprintf    a valid format string without %ls, %lc directives
                             and that all widths are >= -INT_MAX and <= INT_MAX.
index 617702a60b3db97da99d31f589413196ee5e1818..9d44e4fbc9b37dd80c7b0f5399ee26352c7ba9d6 100644 (file)
@@ -17,6 +17,8 @@
 
 #include <stddef.h>
 
+#include "idx.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -25,7 +27,7 @@ extern "C" {
 /* Read COUNT bytes at BUF to descriptor FD, retrying if interrupted
    or if partial reads occur.  Return the number of bytes successfully
    read, setting errno if that is less than COUNT.  errno = 0 means EOF.  */
-extern size_t full_read (int fd, void *buf, size_t count);
+extern idx_t full_read (int fd, void *buf, idx_t count);
 
 
 #ifdef __cplusplus
index 8e27b9c13441ef5830ded69f1cb6057239a22daa..0559a0a128d1b8f8709bb7e4db36bcc30342b3da 100644 (file)
    When writing, set errno if fewer than COUNT bytes are written.
    When reading, if fewer than COUNT bytes are read, you must examine
    errno to distinguish failure from EOF (errno == 0).  */
-size_t
-full_rw (int fd, const void *buf, size_t count)
+idx_t
+full_rw (int fd, const void *buf, idx_t count)
 {
-  size_t total = 0;
+  idx_t total = 0;
   const char *ptr = (const char *) buf;
 
   while (count > 0)
     {
-      size_t n_rw = safe_rw (fd, ptr, count);
-      if (n_rw == (size_t) -1)
+      ptrdiff_t n_rw = safe_rw (fd, ptr, count);
+      if (n_rw < 0)
         break;
       if (n_rw == 0)
         {
index 87f9b928b919ad7c0c1f04c476d21fdbc4c2eb79..72654996185e24ad4fa2ab3cd69a7a8719b158e8 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <stddef.h>
 
+#include "idx.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -26,7 +27,7 @@ extern "C" {
 /* Write COUNT bytes at BUF to descriptor FD, retrying if interrupted
    or if partial writes occur.  Return the number of bytes successfully
    written, setting errno if that is less than COUNT.  */
-extern size_t full_write (int fd, const void *buf, size_t count);
+extern idx_t full_write (int fd, const void *buf, idx_t count);
 
 
 #ifdef __cplusplus
index a389b57bfb3864c8df980eacba8d4127157e6b8f..c7d31d535dda46c0460fdb0d1c53d30e021855a8 100644 (file)
 #ifdef SAFE_WRITE
 # define safe_rw safe_write
 # define rw write
+typedef void const *bufptr;
 #else
 # define safe_rw safe_read
 # define rw read
-# undef const
-# define const /* empty */
+typedef void *bufptr;
 #endif
 
 /* Read(write) up to COUNT bytes at BUF from(to) descriptor FD, retrying if
-   interrupted.  Return the actual number of bytes read(written), zero for EOF,
-   or SAFE_READ_ERROR(SAFE_WRITE_ERROR) upon error.  */
-size_t
-safe_rw (int fd, void const *buf, size_t count)
+   interrupted.  Return the number of bytes read(written), zero for EOF,
+   or -1 upon error.  */
+ptrdiff_t
+safe_rw (int fd, bufptr buf, idx_t count)
 {
   for (;;)
     {
-      ssize_t result = rw (fd, buf, count);
+      ssize_t result = rw (fd, buf, count <= (size_t) -1 ? count : (size_t) -1);
 
       if (0 <= result)
         return result;
index df7acfd479393df4d2e874f9c48fcc743d39d35d..6843092948b36456fa9decf8227e427c76128cda 100644 (file)
 
 #include <stddef.h>
 
+#include "idx.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 
-#define SAFE_READ_ERROR ((size_t) -1)
+/* This is present for backward compatibility with older versions of this code
+   where safe_read returned size_t, so SAFE_READ_ERROR was SIZE_MAX.  */
+#define SAFE_READ_ERROR ((ptrdiff_t) -1)
 
 /* Read up to COUNT bytes at BUF from descriptor FD, retrying if interrupted.
-   Return the actual number of bytes read, zero for EOF, or SAFE_READ_ERROR
-   upon error.  */
-extern size_t safe_read (int fd, void *buf, size_t count);
+   Return the number of bytes read, zero for EOF, or -1 upon error.  */
+extern ptrdiff_t safe_read (int fd, void *buf, idx_t count);
 
 
 #ifdef __cplusplus
index 4415dd05131a44f2c1dd537ebf823da0b646f340..0f771562934f09b427d2e93baf0c7b611a98cb7f 100644 (file)
 
 #include <stddef.h>
 
+#include "idx.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 
-#define SAFE_WRITE_ERROR ((size_t) -1)
+/* This is present for backward compatibility with older versions of this code
+   where safe_read returned size_t, so SAFE_WRITE_ERROR was SIZE_MAX.  */
+#define SAFE_WRITE_ERROR ((ptrdiff_t) -1)
 
 /* Write up to COUNT bytes at BUF to descriptor FD, retrying if interrupted.
-   Return the actual number of bytes written, zero for EOF, or SAFE_WRITE_ERROR
-   upon error.  */
-extern size_t safe_write (int fd, const void *buf, size_t count);
+   Return the number of bytes written, zero for EOF, or -1 upon error.  */
+extern ptrdiff_t safe_write (int fd, const void *buf, idx_t count);
 
 
 #ifdef __cplusplus
index e05728f235ea02886783e4f6527e107df158f713..ce77f9e5c087163475babe66dd1fe94a533a7b4f 100644 (file)
@@ -7,6 +7,7 @@ lib/full-read.c
 lib/full-write.c
 
 Depends-on:
+idx
 safe-read
 
 configure.ac:
index 2ef42bb866efdefccd3f9ab1716eb83df8852f71..42b660167c44cff66d556bbb682b2e1a802b27e8 100644 (file)
@@ -6,6 +6,7 @@ lib/full-write.h
 lib/full-write.c
 
 Depends-on:
+idx
 safe-write
 
 configure.ac:
index f19e14b8c7bcb96d004b266c4fb7a01085f098b0..3960a3a431a577a23ef0c4e070f6c6f66616cce2 100644 (file)
@@ -8,6 +8,7 @@ lib/sys-limits.h
 m4/safe-read.m4
 
 Depends-on:
+idx
 read
 ssize_t
 
index f09c0abddd3588c3e3635b92742510ccbe62e29d..7796a9e09b5e57ee577b7eb6200cd2ab2127a760 100644 (file)
@@ -10,6 +10,7 @@ m4/safe-write.m4
 m4/safe-read.m4
 
 Depends-on:
+idx
 ssize_t
 write