diff --git a/include/libcasio/cdefs/integers.h b/include/libcasio/cdefs/integers.h index 9197922..dbc23c6 100644 --- a/include/libcasio/cdefs/integers.h +++ b/include/libcasio/cdefs/integers.h @@ -23,6 +23,13 @@ CASIO_BEGIN_NAMESPACE # if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +# if defined(__WINDOWS__) +# include +typedef SSIZE_T ssize_t; +# else +# include +# endif + # include # include diff --git a/include/libcasio/stream.h b/include/libcasio/stream.h index 77feebb..a27bd7d 100644 --- a/include/libcasio/stream.h +++ b/include/libcasio/stream.h @@ -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 diff --git a/lib/file/file.h b/lib/file/file.h index ec14301..30bc53b 100644 --- a/lib/file/file.h +++ b/lib/file/file.h @@ -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. */ diff --git a/lib/link/seven/datastream.c b/lib/link/seven/datastream.c index ea8ef2c..2af1a54 100644 --- a/lib/link/seven/datastream.c +++ b/lib/link/seven/datastream.c @@ -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); } /** diff --git a/lib/link/seven/receive.c b/lib/link/seven/receive.c index 43754ad..410d1e7 100644 --- a/lib/link/seven/receive.c +++ b/lib/link/seven/receive.c @@ -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) { diff --git a/lib/link/seven/scsi.c b/lib/link/seven/scsi.c index 86ea65a..a8af9b8 100644 --- a/lib/link/seven/scsi.c +++ b/lib/link/seven/scsi.c @@ -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); } } diff --git a/lib/mcsfile/mcsfile.h b/lib/mcsfile/mcsfile.h index 8d68e99..46d39f5 100644 --- a/lib/mcsfile/mcsfile.h +++ b/lib/mcsfile/mcsfile.h @@ -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. */ diff --git a/lib/stream/builtin/csum32.c b/lib/stream/builtin/csum32.c index 3e3a439..de0de11 100644 --- a/lib/stream/builtin/csum32.c +++ b/lib/stream/builtin/csum32.c @@ -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. */ diff --git a/lib/stream/builtin/file.c b/lib/stream/builtin/file.c index b3deb5d..ea3a1ea 100644 --- a/lib/stream/builtin/file.c +++ b/lib/stream/builtin/file.c @@ -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; diff --git a/lib/stream/builtin/libusb/libusb.h b/lib/stream/builtin/libusb/libusb.h index 75196b9..0cd1a10 100644 --- a/lib/stream/builtin/libusb/libusb.h +++ b/lib/stream/builtin/libusb/libusb.h @@ -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 diff --git a/lib/stream/builtin/libusb/read.c b/lib/stream/builtin/libusb/read.c index 9859394..e249b32 100644 --- a/lib/stream/builtin/libusb/read.c +++ b/lib/stream/builtin/libusb/read.c @@ -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. */ diff --git a/lib/stream/builtin/limited.c b/lib/stream/builtin/limited.c index d07a84d..3ef47f8 100644 --- a/lib/stream/builtin/limited.c +++ b/lib/stream/builtin/limited.c @@ -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; diff --git a/lib/stream/builtin/memory.c b/lib/stream/builtin/memory.c index 33fa8e6..d7a3166 100644 --- a/lib/stream/builtin/memory.c +++ b/lib/stream/builtin/memory.c @@ -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); diff --git a/lib/stream/builtin/streams/read.c b/lib/stream/builtin/streams/read.c index 2f61377..e51f4f8 100644 --- a/lib/stream/builtin/streams/read.c +++ b/lib/stream/builtin/streams/read.c @@ -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. */ diff --git a/lib/stream/builtin/streams/streams.h b/lib/stream/builtin/streams/streams.h index d884a1c..9f077f1 100644 --- a/lib/stream/builtin/streams/streams.h +++ b/lib/stream/builtin/streams/streams.h @@ -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 diff --git a/lib/stream/builtin/windows/read.c b/lib/stream/builtin/windows/read.c index af56a3e..872ccfb 100644 --- a/lib/stream/builtin/windows/read.c +++ b/lib/stream/builtin/windows/read.c @@ -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; diff --git a/lib/stream/builtin/windows/windows.h b/lib/stream/builtin/windows/windows.h index 34402a9..05b5eea 100644 --- a/lib/stream/builtin/windows/windows.h +++ b/lib/stream/builtin/windows/windows.h @@ -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)); diff --git a/lib/stream/read.c b/lib/stream/read.c index c49a9d8..d6b3118 100644 --- a/lib/stream/read.c +++ b/lib/stream/read.c @@ -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; } diff --git a/lib/stream/seek.c b/lib/stream/seek.c index c688d0d..293cb0a 100644 --- a/lib/stream/seek.c +++ b/lib/stream/seek.c @@ -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; } diff --git a/src/p7/main.c b/src/p7/main.c index 8b3797f..1a987c5 100644 --- a/src/p7/main.c +++ b/src/p7/main.c @@ -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); diff --git a/src/p7os/procs/fxremote_flash.c b/src/p7os/procs/fxremote_flash.c index 7fdc13c..fd703a3 100644 --- a/src/p7os/procs/fxremote_flash.c +++ b/src/p7os/procs/fxremote_flash.c @@ -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;