/* * Copyright © 2024 Nick Bowler * * 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 * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ void tap_diag(const char *fmt, ...); #undef HAVE_GETLINE #define DX_GETLINE_INITIAL_ALLOC 2 #include "getline.h" #include "tap.h" #include #define LONGLINE "this line is pretty long and may require scaling the buffer multiple times" static const char testdata[] = "\n" LONGLINE "\n" LONGLINE "\n" LONGLINE "\n" "hellorld\n"; int main(void) { char *line = NULL; size_t long_size; size_t n = 0; FILE *f; int rc; if (!(f = tmpfile())) tap_bail_out("tmpfile failed: %s\n", strerror(errno)); if (fwrite(testdata, sizeof testdata-1, 1, f) != 1) tap_bail_out("fwrite failed: %s\n", strerror(errno)); if (fflush(f) != 0) tap_bail_out("fflush failed: %s\n", strerror(errno)); if (fseek(f, 0, SEEK_SET) != 0) tap_bail_out("fseek failed: %s\n", strerror(errno)); /* First line: empty */ 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); tap_diag(" Expected: 2"); } if (!tap_result(line[0] == 0, "returned string")) { tap_diag("Failed, unexpected result"); tap_diag(" Received: \"%.*s\"", (int)n, line); tap_diag(" Expected: \"\""); } /* Next line: long line (buffer needs expanding) */ 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); tap_diag(" Expected: >%u", (unsigned)(sizeof LONGLINE)); } if (!tap_result(!strcmp(line, LONGLINE), "returned string")) { tap_diag("Failed, unexpected result"); tap_diag(" Received: \"%.*s\"", (int)n, line); tap_diag(" Expected: \"" LONGLINE "\""); } /* Next line: long line (buffer does not need expanding) */ long_size = n; 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); tap_diag(" Expected: %lu", (unsigned long)long_size); } if (!tap_result(!strcmp(line, LONGLINE), "returned string")) { tap_diag("Failed, unexpected result"); tap_diag(" Received: \"%.*s\"", (int)n, line); tap_diag(" Expected: \"" LONGLINE "\""); } /* Next line: long line (new buffer allocation) */ free(line); line = NULL; n = 0; 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); tap_diag(" Expected: %lu", (unsigned long)long_size); } if (!tap_result(!strcmp(line, LONGLINE), "returned string")) { tap_diag("Failed, unexpected result"); tap_diag(" Received: \"%.*s\"", (int)n, line); tap_diag(" Expected: \"" LONGLINE "\""); } /* Next line: short line */ 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); tap_diag(" Expected: %lu", (unsigned long)long_size); } if (!tap_result(!strcmp(line, "hellorld"), "returned string")) { tap_diag("Failed, unexpected result"); tap_diag(" Received: \"%.*s\"", (int)n, line); 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(); }