swap ssize_t for gint64 where possible

Some versions of the Windows headers define ssize_t as unsigned. This
patch removes (where possible) use of ssize_t inside libvips, esp. in
the new stream API.

See https://github.com/libvips/libvips/issues/1494#issuecomment-568254731
This commit is contained in:
John Cupitt 2019-12-22 13:45:45 +00:00
parent e48f45187b
commit 0429a0080e
8 changed files with 49 additions and 42 deletions

View File

@ -180,7 +180,7 @@ typedef struct {
*/
unsigned char input_buffer[INPUT_BUFFER_SIZE];
unsigned char *next_byte;
ssize_t bytes_in_buffer;
gint64 bytes_in_buffer;
} Read;
@ -225,10 +225,10 @@ vips_png_read_stream( png_structp pPng, png_bytep data, png_size_t length )
* syscall for each one. Read via our own buffer.
*/
while( length > 0 ) {
ssize_t bytes_available;
gint64 bytes_available;
if( read->bytes_in_buffer <= 0 ) {
ssize_t bytes_read;
gint64 bytes_read;
bytes_read = vips_streami_read( read->streami,
read->input_buffer, INPUT_BUFFER_SIZE );

View File

@ -184,8 +184,11 @@ typedef struct _VipsStreamiClass {
/* Read from the stream into the supplied buffer, args exactly as
* read(2). Set errno on error.
*
* We must return gint64, since ssize_t is often defined as unsigned
* on Windows.
*/
ssize_t (*read)( VipsStreami *, void *, size_t );
gint64 (*read)( VipsStreami *, void *, size_t );
/* Seek to a certain position, args exactly as lseek(2). Set errno on
* error.
@ -211,7 +214,7 @@ VipsStreami *vips_streami_new_from_options( const char *options );
void vips_streami_minimise( VipsStreami *streami );
int vips_streami_unminimise( VipsStreami *streami );
int vips_streami_decode( VipsStreami *streami );
ssize_t vips_streami_read( VipsStreami *streami, void *data, size_t length );
gint64 vips_streami_read( VipsStreami *streami, void *data, size_t length );
gboolean vips_streami_is_mappable( VipsStreami *streami );
const void *vips_streami_map( VipsStreami *streami, size_t *length );
VipsBlob *vips_streami_map_blob( VipsStreami *streami );
@ -314,8 +317,11 @@ typedef struct _VipsStreamoClass {
VipsStreamClass parent_class;
/* Write to output. Args exactly as write(2).
*
* We must return gint64, since ssize_t is often defined as unsigned
* on Windows.
*/
ssize_t (*write)( VipsStreamo *, const void *, size_t );
gint64 (*write)( VipsStreamo *, const void *, size_t );
/* Output has been generated, so do any clearing up,
* eg. copy the bytes we saved in memory to the stream blob.

View File

@ -132,10 +132,10 @@ vips_bufis_unbuffer( VipsBufis *bufis )
/* Returns -1 on error, 0 on EOF, otherwise bytes read.
*/
static ssize_t
static gint64
vips_bufis_refill( VipsBufis *bufis )
{
ssize_t bytes_read;
gint64 bytes_read;
VIPS_DEBUG_MSG( "vips_bufis_refill:\n" );

View File

@ -276,12 +276,12 @@ vips_streami_build( VipsObject *object )
return( 0 );
}
static ssize_t
static gint64
vips_streami_read_real( VipsStreami *streami, void *data, size_t length )
{
VipsStream *stream = VIPS_STREAM( streami );
ssize_t bytes_read;
gint64 bytes_read;
VIPS_DEBUG_MSG( "vips_streami_read_real:\n" );
@ -624,14 +624,14 @@ vips_streami_decode( VipsStreami *streami )
*
* Arguments exactly as read(2).
*
* Returns: the number of bytes raed, 0 on end of file, -1 on error.
* Returns: the number of bytes read, 0 on end of file, -1 on error.
*/
ssize_t
gint64
vips_streami_read( VipsStreami *streami, void *buffer, size_t length )
{
VipsStreamiClass *class = VIPS_STREAMI_GET_CLASS( streami );
ssize_t bytes_read;
gint64 total_read;
VIPS_DEBUG_MSG( "vips_streami_read:\n" );
@ -641,19 +641,19 @@ vips_streami_read( VipsStreami *streami, void *buffer, size_t length )
vips_streami_test_features( streami ) )
return( -1 );
bytes_read = 0;
total_read = 0;
if( streami->data ) {
/* The whole thing is in memory somehow.
*/
ssize_t available = VIPS_MIN( length,
gint64 available = VIPS_MIN( length,
streami->length - streami->read_position );
VIPS_DEBUG_MSG( " %zd bytes from memory\n", available );
memcpy( buffer,
streami->data + streami->read_position, available );
streami->read_position += available;
bytes_read += available;
total_read += available;
}
else {
/* Some kind of filesystem or custom source.
@ -663,7 +663,7 @@ vips_streami_read( VipsStreami *streami, void *buffer, size_t length )
*/
if( streami->header_bytes &&
streami->read_position < streami->header_bytes->len ) {
ssize_t available = VIPS_MIN( length,
gint64 available = VIPS_MIN( length,
streami->header_bytes->len -
streami->read_position );
@ -676,18 +676,19 @@ vips_streami_read( VipsStreami *streami, void *buffer, size_t length )
streami->read_position += available;
buffer += available;
length -= available;
bytes_read += available;
total_read += available;
}
/* Any more bytes requested? Call the read() vfunc.
*/
if( length > 0 ) {
ssize_t n;
gint64 bytes_read;
VIPS_DEBUG_MSG( " calling class->read()\n" );
n = class->read( streami, buffer, length );
VIPS_DEBUG_MSG( " %zd bytes from read()\n", n );
if( n == -1 ) {
bytes_read = class->read( streami, buffer, length );
VIPS_DEBUG_MSG( " %zd bytes from read()\n",
bytes_read );
if( bytes_read == -1 ) {
vips_error_system( errno,
vips_stream_nick(
VIPS_STREAM( streami ) ),
@ -701,20 +702,20 @@ vips_streami_read( VipsStreami *streami, void *buffer, size_t length )
if( streami->header_bytes &&
streami->is_pipe &&
!streami->decode &&
n > 0 )
bytes_read > 0 )
g_byte_array_append( streami->header_bytes,
buffer, n );
buffer, bytes_read );
streami->read_position += n;
bytes_read += n;
streami->read_position += bytes_read;
total_read += bytes_read;
}
}
VIPS_DEBUG_MSG( " %zd bytes total\n", bytes_read );
VIPS_DEBUG_MSG( " %zd bytes total\n", total_read );
SANITY( streami );
return( bytes_read );
return( total_read );
}
/* -1 on a pipe isn't actually unbounded. Have a limit to prevent
@ -753,7 +754,7 @@ vips_streami_pipe_read_to_position( VipsStreami *streami, gint64 target )
while( target == -1 ||
streami->read_position < target ) {
ssize_t bytes_read;
gint64 bytes_read;
bytes_read = vips_streami_read( streami, buffer, 4096 );
if( bytes_read == -1 )
@ -805,7 +806,7 @@ vips_streami_read_to_memory( VipsStreami *streami )
read_position = 0;
q = byte_array->data;
while( read_position < streami->length ) {
ssize_t bytes_read;
gint64 bytes_read;
bytes_read = vips_streami_read( streami, q,
VIPS_MAX( 4096, streami->length - read_position ) );
@ -1187,7 +1188,7 @@ vips_streami_sniff_at_most( VipsStreami *streami,
read_position = 0;
q = streami->sniff->data;
while( read_position < length ) {
ssize_t bytes_read;
gint64 bytes_read;
bytes_read = vips_streami_read( streami, q,
length - read_position );

View File

@ -70,7 +70,7 @@ enum {
static guint vips_streamiu_signals[SIG_LAST] = { 0 };
static ssize_t
static gint64
vips_streamiu_read_real( VipsStreami *streami,
void *buffer, size_t length )
{

View File

@ -142,7 +142,7 @@ vips_streamo_build( VipsObject *object )
return( 0 );
}
static ssize_t
static gint64
vips_streamo_write_real( VipsStreamo *streamo, const void *data, size_t length )
{
VipsStream *stream = VIPS_STREAM( streamo );
@ -305,14 +305,14 @@ vips_streamo_write_unbuffered( VipsStreamo *streamo,
g_byte_array_append( streamo->memory_buffer, data, length );
else
while( length > 0 ) {
ssize_t n;
gint64 bytes_written;
n = class->write( streamo, data, length );
bytes_written = class->write( streamo, data, length );
/* n == 0 isn't strictly an error, but we treat it as
* one to make sure we don't get stuck in this loop.
*/
if( n <= 0 ) {
if( bytes_written <= 0 ) {
vips_error_system( errno,
vips_stream_nick(
VIPS_STREAM( streamo ) ),
@ -320,8 +320,8 @@ vips_streamo_write_unbuffered( VipsStreamo *streamo,
return( -1 );
}
length -= n;
data += n;
length -= bytes_written;
data += bytes_written;
}
return( 0 );

View File

@ -70,7 +70,7 @@ enum {
static guint vips_streamou_signals[SIG_LAST] = { 0 };
static ssize_t
static gint64
vips_streamou_write_real( VipsStreamo *streamo,
const void *data, size_t length )
{

View File

@ -549,8 +549,8 @@ parser_read_fd( XML_Parser parser, int fd )
{
const int chunk_size = 1024;
ssize_t bytes_read;
ssize_t len;
gint64 bytes_read;
gint64 len;
bytes_read = 0;
@ -563,7 +563,7 @@ parser_read_fd( XML_Parser parser, int fd )
return( -1 );
}
len = read( fd, buf, chunk_size );
if( len == (ssize_t) -1 ) {
if( len == -1 ) {
vips_error( "VipsImage",
"%s", _( "read error while fetching XML" ) );
return( -1 );