#define FGETS2_BUFSIZE (256*1024)
const char *fgets2(FILE *stream)
{
- static char buffer[FGETS2_BUFSIZE + 9]; // +9 to have zeroes past the end
+ static char buffer[FGETS2_BUFSIZE + 68];
static char *end = buffer;
static char *line = buffer;
* time.
*/
- if (next <= (end-12)) {
+ if (next <= end) {
/* max 3 bytes tested here */
while ((((unsigned long)next) & 3) && *next != '\n')
next++;
if (!has_zero(*(unsigned int *)next ^ 0x0A0A0A0AU))
next += 4;
- /* we finish if needed. Note that next might be slightly higher
- * than end here because we might have gone past it above.
+ /* We finish if needed : if <next> is below <end>, it means we
+ * found an LF in one of the 4 following bytes.
*/
while (next < end) {
if (*next == '\n') {
/* we found an incomplete line. First, let's move the
* remaining part of the buffer to the beginning, then
- * try to complete the buffer with a new read.
+ * try to complete the buffer with a new read. We can't
+ * rely on <next> anymore because it went past <end>.
*/
if (line > buffer) {
if (end != line)
}
end += ret;
+ *end = '\n'; /* make parser stop ASAP */
/* search for '\n' again */
}
}
#define FGETS2_BUFSIZE (256*1024)
const char *fgets2(FILE *stream)
{
- static char buffer[FGETS2_BUFSIZE + 5];
+ static char buffer[FGETS2_BUFSIZE + 32];
static char *end = buffer;
static char *line = buffer;
while (next < end && (((unsigned long)next) & 3) && *next != '\n')
next++;
- /* now next is multiple of 4 or equal to end */
- while (next <= (end-32)) {
+ /* Now next is multiple of 4 or equal to end. We know we can safely
+ * read up to 32 bytes past end if needed because they're allocated.
+ */
+ while (next < end) {
if (has_zero(*(unsigned int *)next ^ 0x0A0A0A0A))
break;
next += 4;
next += 4;
}
- /* we finish if needed. Note that next might be slightly higher
- * than end here because we might have gone past it above.
+ /* We finish if needed : if <next> is below <end>, it means we
+ * found an LF in one of the 4 following bytes.
*/
while (next < end) {
if (*next == '\n') {
/* we found an incomplete line. First, let's move the
* remaining part of the buffer to the beginning, then
- * try to complete the buffer with a new read.
+ * try to complete the buffer with a new read. We can't
+ * rely on <next> anymore because it went past <end>.
*/
if (line > buffer) {
if (end != line)
}
end += ret;
+ *end = '\n'; /* make parser stop ASAP */
/* search for '\n' again */
}
}