+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.
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.
#include <stddef.h>
+#include "idx.h"
+
#ifdef __cplusplus
extern "C" {
#endif
/* 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
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)
{
#include <stddef.h>
+#include "idx.h"
#ifdef __cplusplus
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
#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;
#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
#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
lib/full-write.c
Depends-on:
+idx
safe-read
configure.ac:
lib/full-write.c
Depends-on:
+idx
safe-write
configure.ac:
m4/safe-read.m4
Depends-on:
+idx
read
ssize_t
m4/safe-read.m4
Depends-on:
+idx
ssize_t
write