/* PSPP - a program for statistical analysis.
- Copyright (C) 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
+ Copyright (C) 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
is->head = is->buffer;
/* Read more input. */
+ n = 0;
do
{
- n = read (is->fd, is->buffer + is->length,
- U8_ISTREAM_BUFFER_SIZE - is->length);
+ ssize_t retval = read (is->fd, is->buffer + is->length,
+ U8_ISTREAM_BUFFER_SIZE - is->length);
+ if (retval > 0)
+ {
+ n += retval;
+ is->length += retval;
+ }
+ else if (retval == 0)
+ return n;
+ else if (errno != EINTR)
+ return n > 0 ? n : -1;
}
- while (n < 0 && errno == EINTR);
- if (n > 0)
- is->length += n;
+ while (is->length < U8_ISTREAM_BUFFER_SIZE);
return n;
}
AT_SETUP([read UTF-16 as Auto])
AT_KEYWORDS([u8_istream])
AT_CHECK([i18n-test supports_encodings UTF-16 UTF-16BE UTF-16LE])
-AT_CHECK([printf '\0e\0n\0t\0r\0\351\0e\0\n' | u8-istream-test read - Auto],
+dnl The "sleep 1" checks for a bug in which u8-istream did not properly
+dnl handle receiving data in multiple chunks.
+AT_CHECK([{ printf '\0e\0n\0t\0'; sleep 1; printf 'r\0\351\0e\0\n'; } | u8-istream-test read - Auto],
[0], [entrée
])
AT_CHECK([printf 'e\0n\0t\0r\0\351\0e\0\n\0' | u8-istream-test read - Auto],