From: Nick Bowler Date: Sat, 18 May 2024 20:14:36 +0000 (-0400) Subject: dx_getline: Fix EOF handling in standard C fallback. X-Git-Url: http://git.draconx.ca/gitweb/dxcommon.git/commitdiff_plain/refs/heads/master dx_getline: Fix EOF handling in standard C fallback. The return value of the function at end of input was not tested so of course it does not work: in the standard C fallback, a mistake was introduced during the import and it returns DX_GETLINE_ERROR instead of the expected DX_GETLINE_EOF. Easy enough to fix and update the test program to check this. --- diff --git a/src/getline.h b/src/getline.h index b0f4999..f659c60 100644 --- a/src/getline.h +++ b/src/getline.h @@ -93,7 +93,7 @@ static inline int dx_getline(char **linebuf, size_t *n, FILE *f) if (ferror(f)) return DX_GETLINE_ERROR; - return pos ? DX_GETLINE_OK : DX_GETLINE_ERROR; + return pos ? DX_GETLINE_OK : DX_GETLINE_EOF; } pos += strlen(&work[pos]); diff --git a/t/getline.c b/t/getline.c index 912e571..f7024ea 100644 --- a/t/getline.c +++ b/t/getline.c @@ -39,6 +39,7 @@ int main(void) size_t long_size; size_t n = 0; FILE *f; + int rc; if (!(f = tmpfile())) tap_bail_out("tmpfile failed: %s\n", strerror(errno)); @@ -53,7 +54,12 @@ int main(void) tap_bail_out("fseek failed: %s\n", strerror(errno)); /* First line: empty */ - tap_result(dx_getline(&line, &n, f) != 0, "dx_getline"); + rc = dx_getline(&line, &n, f); + if (!tap_result(rc == DX_GETLINE_OK, "dx_getline")) { + tap_diag("Failed, unexpected result"); + tap_diag(" Received: %d", rc); + tap_diag(" Expected: %d (DX_GETLINE_OK)", DX_GETLINE_OK); + } if (!tap_result(n == 2, "alloc size")) { tap_diag("Failed, unexpected result"); tap_diag(" Received: %lu", (unsigned long)n); @@ -66,7 +72,12 @@ int main(void) } /* Next line: long line (buffer needs expanding) */ - tap_result(dx_getline(&line, &n, f) != 0, "dx_getline"); + rc = dx_getline(&line, &n, f); + if (!tap_result(rc == DX_GETLINE_OK, "dx_getline")) { + tap_diag("Failed, unexpected result"); + tap_diag(" Received: %d", rc); + tap_diag(" Expected: %d (DX_GETLINE_OK)", DX_GETLINE_OK); + } if (!tap_result(n > sizeof LONGLINE, "alloc size")) { tap_diag("Failed, unexpected result"); tap_diag(" Received: %lu", (unsigned long)n); @@ -80,7 +91,12 @@ int main(void) /* Next line: long line (buffer does not need expanding) */ long_size = n; - tap_result(dx_getline(&line, &n, f) != 0, "dx_getline"); + rc = dx_getline(&line, &n, f); + if (!tap_result(rc == DX_GETLINE_OK, "dx_getline")) { + tap_diag("Failed, unexpected result"); + tap_diag(" Received: %d", rc); + tap_diag(" Expected: %d (DX_GETLINE_OK)", DX_GETLINE_OK); + } if (!tap_result(n == long_size, "alloc size")) { tap_diag("Failed, unexpected result"); tap_diag(" Received: %lu", (unsigned long)n); @@ -94,7 +110,12 @@ int main(void) /* Next line: long line (new buffer allocation) */ free(line); line = NULL; n = 0; - tap_result(dx_getline(&line, &n, f) != 0, "dx_getline"); + rc = dx_getline(&line, &n, f); + if (!tap_result(rc == DX_GETLINE_OK, "dx_getline")) { + tap_diag("Failed, unexpected result"); + tap_diag(" Received: %d", rc); + tap_diag(" Expected: %d (DX_GETLINE_OK)", DX_GETLINE_OK); + } if (!tap_result(n == long_size, "alloc size")) { tap_diag("Failed, unexpected result"); tap_diag(" Received: %lu", (unsigned long)n); @@ -107,7 +128,12 @@ int main(void) } /* Next line: short line */ - tap_result(dx_getline(&line, &n, f) != 0, "dx_getline"); + rc = dx_getline(&line, &n, f); + if (!tap_result(rc == DX_GETLINE_OK, "dx_getline")) { + tap_diag("Failed, unexpected result"); + tap_diag(" Received: %d", rc); + tap_diag(" Expected: %d (DX_GETLINE_OK)", DX_GETLINE_OK); + } if (!tap_result(n == long_size, "alloc size")) { tap_diag("Failed, unexpected result"); tap_diag(" Received: %lu", (unsigned long)n); @@ -119,5 +145,18 @@ int main(void) tap_diag(" Expected: \"hellorld\""); } + /* Next line: end of file */ + rc = dx_getline(&line, &n, f); + if (!tap_result(rc == DX_GETLINE_EOF, "dx_getline (end of file)")) { + tap_diag("Failed, unexpected result"); + tap_diag(" Received: %d", rc); + tap_diag(" Expected: %d (DX_GETLINE_EOF)", DX_GETLINE_EOF); + } + if (!tap_result(n == long_size, "alloc size")) { + tap_diag("Failed, unexpected result"); + tap_diag(" Received: %lu", (unsigned long)n); + tap_diag(" Expected: %lu", (unsigned long)long_size); + } + tap_done(); }