]> git.draconx.ca Git - dxcommon.git/commitdiff
dx_getline: Fix EOF handling in standard C fallback. master
authorNick Bowler <nbowler@draconx.ca>
Sat, 18 May 2024 20:14:36 +0000 (16:14 -0400)
committerNick Bowler <nbowler@draconx.ca>
Sat, 18 May 2024 20:14:36 +0000 (16:14 -0400)
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.

src/getline.h
t/getline.c

index b0f4999125b774535482a86f119698440f491efe..f659c607b020e71a3b12f767184db77c46469641 100644 (file)
@@ -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]);
index 912e57196541bd33999f5a864e2be43201c00b99..f7024ea5039b058c3b889c31a473afe033a072be 100644 (file)
@@ -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();
 }