diff --git a/src/fstapi.c b/src/fstapi.c index 465845d..82ca1bd 100644 --- a/src/fstapi.c +++ b/src/fstapi.c @@ -4756,7 +4756,7 @@ fstReaderContext *fstReaderOpen(const char *nam) ((xc->fh) || (xc->contains_hier_section || (xc->contains_hier_section_lz4)))) { /* more init */ xc->do_rewind = 1; - } else { + } else if (!rc) { fstReaderClose(xc); xc = NULL; } diff --git a/tests/empty_file.c b/tests/empty_file.c new file mode 100644 index 0000000..33032f2 --- /dev/null +++ b/tests/empty_file.c @@ -0,0 +1,43 @@ +#include +#include + +int main(int argc, char **argv) +{ + (void)argc; + (void)argv; + + // Write empty FST file + + fstWriterContext *writer = fstWriterCreate("empty1.fst", 1); + g_assert_true(writer != NULL); + + fstWriterClose(writer); + + // Should be able to open the generated FST file + + fstReaderContext *reader = fstReaderOpen("empty1.fst"); + g_assert_true(reader != NULL); + + g_assert_cmpint(fstReaderGetStartTime(reader), ==, 0); + g_assert_cmpint(fstReaderGetEndTime(reader), ==, 0); + g_assert_cmpint(fstReaderGetVarCount(reader), ==, 0); + g_assert_cmpint(fstReaderGetScopeCount(reader), ==, 0); + g_assert_cmpint(fstReaderGetAliasCount(reader), ==, 0); + + struct fstHier *iter = fstReaderIterateHier(reader); + g_assert_true(iter == NULL); + + fstReaderClose(reader); + + // An empty file without FST header should still fail + + FILE *f = fopen("empty2.fst", "w"); + g_assert_true(f != NULL); + + fclose(f); + + reader = fstReaderOpen("empty2.fst"); + g_assert_true(reader == NULL); + + return 0; +} diff --git a/tests/meson.build b/tests/meson.build index ca39c70..2d917ce 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -1,5 +1,6 @@ libfst_tests = [ 'write_and_read', + 'empty_file', ] foreach test : libfst_tests @@ -10,4 +11,4 @@ foreach test : libfst_tests ) test(test, exe) -endforeach \ No newline at end of file +endforeach