RERECHANGING the error convention for casio_read (later for casio_write)

This commit is contained in:
Lailouezzz 2020-01-03 17:37:28 +01:00
parent adc0714bce
commit 9ed9f4ec2c
Signed by: Lailouezzz
GPG Key ID: 03FCE8A99EF8482C
21 changed files with 95 additions and 98 deletions

View File

@ -23,6 +23,13 @@
CASIO_BEGIN_NAMESPACE
# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
# if defined(__WINDOWS__)
# include <BaseTsd.h>
typedef SSIZE_T ssize_t;
# else
# include <sys/types.h>
# endif
# include <stdint.h>
# include <inttypes.h>

View File

@ -100,7 +100,7 @@ typedef int casio_stream_setattrs_t
typedef int casio_stream_settm_t
OF((void *, const casio_timeouts_t *));
typedef size_t casio_stream_read_t
typedef ssize_t casio_stream_read_t
OF((void *, unsigned char *, size_t));
typedef int casio_stream_write_t
OF((void *, const unsigned char *, size_t));
@ -359,7 +359,7 @@ CASIO_EXTERN int CASIO_EXPORT casio_get_lasterr
/* Read and write data from and to a stream. */
CASIO_EXTERN size_t CASIO_EXPORT casio_read
CASIO_EXTERN ssize_t CASIO_EXPORT casio_read
OF((casio_stream_t *casio__stream,
void *casio__dest, size_t casio__size));
CASIO_EXTERN int CASIO_EXPORT casio_write

View File

@ -28,14 +28,15 @@
/* Read from a stream. */
# define READ(CASIO__TO, CASIO__SZ) /* normal read */ { \
int READ_err = casio_read(buffer, (CASIO__TO), (CASIO__SZ)); \
if (READ_err == -1) return (errno); }
ssize_t READ_err = casio_read(buffer, (CASIO__TO), (CASIO__SZ)); \
if (READ_err < 0) return -(READ_err); }
# define FREAD(CASIO__TO, CASIO__SZ) /* fail-less read */ { \
casio_read(buffer, (CASIO__TO), (CASIO__SZ)); \
err = errno; }
ssize_t READ_err = casio_read(buffer, (CASIO__TO), (CASIO__SZ)); \
err = READ_err < 0 ? -READ_err : 0; }
# define GREAD(CASIO__TO, CASIO__SZ) /* read with goto fail */ { \
casio_read(buffer, (CASIO__TO), (CASIO__SZ)); \
if ((err = errno)) \
ssize_t READ_err = casio_read(buffer, (CASIO__TO), (CASIO__SZ)); \
err = READ_err < 0 ? -READ_err : 0; \
if ((err)) \
goto fail; }
/* Read using size of the object. */

View File

@ -51,10 +51,10 @@ typedef struct {
* @arg cookie the cookie.
* @arg data the data to read.
* @arg size the size of the data to read.
* @return the size written and -1 if error (error code is in errno).
* @return the size if > 0, or if < 0 the error code is -[returned value].
*/
CASIO_LOCAL size_t casio_seven_data_read(seven_data_cookie_t *cookie,
CASIO_LOCAL ssize_t casio_seven_data_read(seven_data_cookie_t *cookie,
unsigned char *data, size_t size)
{
int err; size_t tocopy;
@ -64,7 +64,7 @@ CASIO_LOCAL size_t casio_seven_data_read(seven_data_cookie_t *cookie,
/* Check if the stream is faulty. */
if (cookie->_faulty)
return (casio_error_noread);
return -(casio_error_noread);
/* Empty the current buffer. */
tocopy = cookie->_lastsize;
@ -79,8 +79,7 @@ CASIO_LOCAL size_t casio_seven_data_read(seven_data_cookie_t *cookie,
/* Check if we have already finished. */
if (cookie->_total && cookie->_id == cookie->_total) {
errno = casio_error_eof;
return (-1);
return -(casio_error_eof);
}
/* Receive packets. */
@ -137,8 +136,7 @@ CASIO_LOCAL size_t casio_seven_data_read(seven_data_cookie_t *cookie,
fail:
/* XXX: tell the distant device we have a problem? */
cookie->_faulty = 1;
errno = err;
return (-1);
return -(err);
}
/**

View File

@ -175,9 +175,9 @@ CASIO_LOCAL const char *gettermstring(casio_seven_term_t code)
#define buffer handle->casio_link_recv_buffer
#define COMPLETE_PACKET(N) { \
int COMP_PACKET_err = casio_read(handle->casio_link_stream, \
ssize_t COMP_PACKET_err = casio_read(handle->casio_link_stream, \
&buffer[received], (size_t)N); \
received += COMP_PACKET_err; if (COMP_PACKET_err == -1) return (errno); }
received += COMP_PACKET_err >= 0 ? COMP_PACKET_err : 0; if (COMP_PACKET_err < 0) return -(COMP_PACKET_err); }
CASIO_LOCAL int casio_seven_decode(casio_link_t *handle, int scralign)
{

View File

@ -83,7 +83,7 @@ typedef struct {
* Read and write from the stream.
* --- */
CASIO_LOCAL size_t seven_scsi_read(seven_scsi_cookie_t *cookie,
CASIO_LOCAL ssize_t seven_scsi_read(seven_scsi_cookie_t *cookie,
unsigned char *buffer, size_t size)
{
casio_scsi_t scsi; int err;
@ -129,8 +129,7 @@ CASIO_LOCAL size_t seven_scsi_read(seven_scsi_cookie_t *cookie,
scsi.casio_scsi_data_len = 16;
if ((err = casio_scsi_request(cookie->stream, &scsi))) {
errno = err;
return (-1);
return -(err);
}
mem((ll_info, poll_data, 16));
@ -182,8 +181,7 @@ CASIO_LOCAL size_t seven_scsi_read(seven_scsi_cookie_t *cookie,
scsi.casio_scsi_data_len = avail;
if ((err = casio_scsi_request(cookie->stream, &scsi))) {
errno = err;
return (-1);
return -(err);
}
}

View File

@ -27,14 +27,15 @@
/* Read from a stream. */
# define READ(CASIO__TO, CASIO__SZ) /* normal read */ { \
int READ_err = casio_read(buffer, (CASIO__TO), (CASIO__SZ)); \
if (READ_err == -1) return (errno); }
ssize_t READ_err = casio_read(buffer, (CASIO__TO), (CASIO__SZ)); \
if (READ_err < 0) return -(READ_err); }
# define FREAD(CASIO__TO, CASIO__SZ) /* fail-less read */ { \
casio_read(buffer, (CASIO__TO), (CASIO__SZ)); \
err = errno; }
ssize_t READ_err = casio_read(buffer, (CASIO__TO), (CASIO__SZ)); \
err = READ_err < 0 ? -READ_err : 0; }
# define GREAD(CASIO__TO, CASIO__SZ) /* read with goto fail */ { \
casio_read(buffer, (CASIO__TO), (CASIO__SZ)); \
if ((err = errno)) \
ssize_t READ_err = casio_read(buffer, (CASIO__TO), (CASIO__SZ)); \
err = READ_err < 0 ? -READ_err : 0; \
if ((err)) \
goto fail; }
/* Read using size of the object. */

View File

@ -38,20 +38,20 @@ struct thecookie {
* @arg cookie the cookie.
* @arg data the data pointer.
* @arg size the data size.
* @return the size written and -1 if error (error code is in errno).
* @return the size if > 0, or if < 0 the error code is -[returned value].
*/
CASIO_LOCAL size_t csum32_read(struct thecookie *cookie,
CASIO_LOCAL ssize_t csum32_read(struct thecookie *cookie,
unsigned char *dest, size_t size)
{
int err;
/* Make the call. */
size = casio_read(cookie->_stream, dest, size);
if (size == (size_t)-1) {
errno = errno;
return (-1);
ssize_t ssize = casio_read(cookie->_stream, dest, size);
if (ssize < 0) {
err = -ssize;
return -(err);
}
/* Make the checksum. */

View File

@ -46,10 +46,10 @@ typedef struct {
* @arg cookie the cookie.
* @arg data the data pointer
* @arg size the data size.
* @return the size written and -1 if error (error code is in errno).
* @return the size if > 0, or if < 0 the error code is -[returned value].
*/
CASIO_LOCAL size_t casio_file_read(file_cookie_t *cookie,
CASIO_LOCAL ssize_t casio_file_read(file_cookie_t *cookie,
unsigned char *dest, size_t size)
{
size_t recv;
@ -92,8 +92,7 @@ CASIO_LOCAL size_t casio_file_read(file_cookie_t *cookie,
/* End of file. */
msg((ll_error, "encountered an end of file"));
errno = casio_error_eof;
return (-1);
return -(casio_error_eof);
case EINTR: /* alarm */
case ETIMEDOUT:
@ -103,21 +102,18 @@ CASIO_LOCAL size_t casio_file_read(file_cookie_t *cookie,
/* A timeout has occurred. */
msg((ll_error, "timeout received"));
errno = casio_error_timeout;
return (-1);
return -(casio_error_timeout);
case ENODEV:
case EPIPE: case ESPIPE:
/* A device error has occured. */
msg((ll_error, "calculator was disconnected"));
errno = casio_error_nocalc;
return (-1);
return -(casio_error_nocalc);
default:
msg((ll_fatal, "errno was %d: %s", errno, strerror(errno)));
errno = casio_error_unknown;
return (-1);
return -(casio_error_unknown);
}
return copiedsize;

View File

@ -58,7 +58,7 @@ CASIO_EXTERN int CASIO_EXPORT casio_libusb_settm
/* Character device callbacks. */
CASIO_EXTERN size_t CASIO_EXPORT casio_libusb_read
CASIO_EXTERN ssize_t CASIO_EXPORT casio_libusb_read
OF((cookie_libusb_t *casio__cookie,
unsigned char *casio__dest, size_t casio__size));
CASIO_EXTERN int CASIO_EXPORT casio_libusb_write

View File

@ -26,10 +26,10 @@
* @arg vcookie the cookie (voided)
* @arg data the data pointer.
* @arg size the data size.
* @return the size written and -1 if error (error code is in errno).
* @return the size if > 0, or if < 0 the error code is -[returned value].
*/
size_t CASIO_EXPORT casio_libusb_read(cookie_libusb_t *cookie,
ssize_t CASIO_EXPORT casio_libusb_read(cookie_libusb_t *cookie,
unsigned char *dest, size_t size)
{
int libusberr;
@ -66,18 +66,15 @@ size_t CASIO_EXPORT casio_libusb_read(cookie_libusb_t *cookie,
case LIBUSB_ERROR_NO_DEVICE:
case LIBUSB_ERROR_IO:
msg((ll_error, "The calculator is not here anymore :("));
errno = casio_error_nocalc;
return (-1);
return -(casio_error_nocalc);
case LIBUSB_ERROR_TIMEOUT:
errno = casio_error_timeout;
return (-1);
return -(casio_error_timeout);
default:
msg((ll_fatal, "libusb error was %d: %s", libusberr,
libusb_strerror(libusberr)));
errno = casio_error_unknown;
return (-1);
return -(casio_error_unknown);
}
/* Get the current size to copy. */

View File

@ -37,10 +37,10 @@ typedef struct {
* @arg vcookie the cookie (uncasted).
* @arg data the data pointer.
* @arg size the data size.
* @return the size written and -1 if error (error code is in errno).
* @return the size if > 0, or if < 0 the error code is -[returned value].
*/
CASIO_LOCAL size_t casio_limited_read(void *vcookie, unsigned char *dest,
CASIO_LOCAL ssize_t casio_limited_read(void *vcookie, unsigned char *dest,
size_t size)
{
int err; limited_cookie_t *cookie = (void*)vcookie;
@ -52,21 +52,19 @@ CASIO_LOCAL size_t casio_limited_read(void *vcookie, unsigned char *dest,
left = cookie->_left;
cookie->_left = 0;
if ((err = casio_skip(cookie->_stream, left))) {
errno = err;
return (-1);
return -(err);
}
/* Once the skip is done successfully, we return that we
* have an EOF. */
errno = casio_error_eof;
return (-1);
return -(casio_error_eof);
}
size = casio_read(cookie->_stream, dest, size);
if (size == (size_t)-1) {
ssize_t ssize = casio_read(cookie->_stream, dest, size);
if (ssize < 0) {
cookie->_left = 0; /* XXX: depends on the error? */
errno = errno;
return (-1);
err = -ssize;
return -(err);
}
cookie->_left -= size;
return size;

View File

@ -35,21 +35,19 @@ typedef struct {
* @arg vcookie the cookie (uncasted)
* @arg data the data pointer.
* @arg size the data size.
* @return the size written and -1 if error (error code is in errno).
* @return the size if > 0, or if < 0 the error code is -[returned value].
*/
CASIO_LOCAL size_t casio_memory_read(void *vcookie, unsigned char *dest, size_t size)
CASIO_LOCAL ssize_t casio_memory_read(void *vcookie, unsigned char *dest, size_t size)
{
memory_cookie_t *cookie = (void*)vcookie;
if (((size_t)-1 - cookie->_offset) < size) { /* overflow */
errno = casio_error_read;
return (-1);
return -(casio_error_read);
}
if (cookie->_offset + (casio_off_t)size > cookie->_size) {
cookie->_offset = cookie->_size - 1;
errno = casio_error_eof;
return (-1);
return -(casio_error_eof);
}
memcpy(dest, &cookie->_memory[cookie->_offset], size);

View File

@ -26,10 +26,10 @@
* @arg cookie the cookie.
* @arg data the data pointer.
* @arg size the data size.
* @return the size written and -1 if error (error code is in errno).
* @return the size if > 0, or if < 0 the error code is -[returned value].
*/
size_t CASIO_EXPORT casio_streams_read(streams_cookie_t *cookie,
ssize_t CASIO_EXPORT casio_streams_read(streams_cookie_t *cookie,
unsigned char *dest, size_t size)
{
int fd = cookie->_readfd;
@ -65,12 +65,11 @@ size_t CASIO_EXPORT casio_streams_read(streams_cookie_t *cookie,
if (recv < 0) switch (errno) {
case 0: continue;
case ENODEV: case EIO:
return (casio_error_nocalc);
return -(casio_error_nocalc);
default:
msg((ll_fatal, "error was %d: %s",
errno, strerror(errno)));
errno = casio_error_unknown;
return (-1);
return -(casio_error_unknown);
}
/* Get the current size to copy. */

View File

@ -51,7 +51,7 @@ CASIO_EXTERN int CASIO_EXPORT casio_streams_settm
/* Character device callbacks. */
CASIO_EXTERN size_t CASIO_EXPORT casio_streams_read
CASIO_EXTERN ssize_t CASIO_EXPORT casio_streams_read
OF((streams_cookie_t *casio__cookie,
unsigned char *casio__dest, size_t casio__size));
CASIO_EXTERN int CASIO_EXPORT casio_streams_write

View File

@ -20,14 +20,14 @@
#ifndef LIBCASIO_DISABLED_WINDOWS
/**
* casio_windows_read:
* casio_windows_read: TODO
* Read from an MS-Windows stream.
*
* @arg cookie the cookie.
* @return the error code (0 if ok).
* @return the size if > 0, or if < 0 the error code is -[returned value].
*/
int CASIO_EXPORT casio_windows_read(win_cookie_t *cookie,
ssize_t CASIO_EXPORT casio_windows_read(win_cookie_t *cookie,
unsigned char *dest, size_t size)
{
DWORD werr, wsuccess, recv; size_t tocopy;

View File

@ -51,7 +51,7 @@ CASIO_EXTERN int CASIO_EXPORT casio_windows_settm
/* Character device callbacks. */
CASIO_EXTERN int CASIO_EXPORT casio_windows_read
CASIO_EXTERN ssize_t CASIO_EXPORT casio_windows_read
OF((win_cookie_t *cookie, unsigned char *dest, size_t size));
CASIO_EXTERN int CASIO_EXPORT casio_windows_write
OF((win_cookie_t *cookie, const unsigned char *data, size_t size));

View File

@ -25,27 +25,27 @@
* @arg stream the stream to read from.
* @arg dest the destination buffer.
* @arg size the amount of bytes to read.
* @return the size written and -1 if error (error code is in errno).
* @return the size if > 0, or if < 0 the error code is -[returned value].
*/
size_t CASIO_EXPORT casio_read(casio_stream_t *stream, void *dest, size_t size)
ssize_t CASIO_EXPORT casio_read(casio_stream_t *stream, void *dest, size_t size)
{
int err = casio_error_ok;
ssize_t ssize = 0;
/* check if we can read */
failure(~stream->casio_stream_mode & CASIO_OPENMODE_READ, casio_error_read)
/* read */
if (size == 0) {
errno = err;
return (0);
}
size = (*getcb(stream, read))(stream->casio_stream_cookie, dest, size);
ssize = (*getcb(stream, read))(stream->casio_stream_cookie, dest, size);
if (size == (size_t)-1) {
err = errno;
if (ssize < 0) {
err = -ssize;
if (err == casio_error_eof) {
msg((ll_info, "Stream reading get to the end (EOF)"));
msg((ll_info, "Stream reading is at the end (EOF)"));
goto fail;
}
msg((ll_error, "Stream reading failure: %s", casio_strerror(err)));
@ -53,11 +53,10 @@ size_t CASIO_EXPORT casio_read(casio_stream_t *stream, void *dest, size_t size)
}
/* move the cursor and return */
if(size != 1) {
if(ssize >= 0) {
stream->casio_stream_offset += size;
}
fail:
stream->casio_stream_lasterr = err;
errno = err;
return size;
return ssize;
}

View File

@ -63,9 +63,9 @@ int CASIO_EXPORT casio_seek(casio_stream_t *stream, casio_off_t offset,
size_t rd = min(to_skip, 128);
/* Read that much from the stream. */
size_t readed = casio_read(stream, buf, rd);
if (readed == (size_t)-1) {
err = errno;
ssize_t readed = casio_read(stream, buf, rd);
if (readed < 0) {
err = -readed;
goto fail;
}

View File

@ -394,13 +394,17 @@ int main(int ac, char **av)
err = casio_error_unknown;
break;
}
size_t size;
ssize_t size;
do
{
size = casio_read(fileStream, buffer, sizeof(buffer));
if(size == (size_t)-1)
err = errno;
if(err == casio_error_eof)
if(size < 0) {
err = -size;
if(err == casio_error_eof)
break;
else
goto fail;
}
fwrite(buffer, 1, size, file);
} while (err == 0);

View File

@ -83,11 +83,12 @@ static int send_sector(casio_link_t *handle, casio_stream_t *buffer,
/* Prepare the block. */
block.destination = casio_be32toh(buf);
block.length = casio_be32toh(len);
len = casio_read(buffer, block.data, len);
if (len == (size_t)-1) {
ssize_t slen = casio_read(buffer, block.data, len);
if (slen < 0) {
osdisp_interrupt(&osdisp_cookie);
return (casio_error_read);
}
len = slen;
/* Pass the block. */
buf += len; left -= len;