diff --git a/c/input/byte_reader.h b/c/input/byte_reader.h index b449aff08..17032c54d 100644 --- a/c/input/byte_reader.h +++ b/c/input/byte_reader.h @@ -10,7 +10,7 @@ struct _byte_reader_t; // The open function should return TRUE on success and FALSE on failure. // For the string reader, the char* argument is the backing string itself. -typedef int byte_reader_open_func_t(struct _byte_reader_t* pbr, char* filename); +typedef int byte_reader_open_func_t(struct _byte_reader_t* pbr, char* prepipe, char* filename); // The reader function should return a character, as an int. Reads past end of // file should keep returning EOF, even if called multiple times. diff --git a/c/input/file_reader_stdio.c b/c/input/file_reader_stdio.c index d5dab1c26..5b7f96167 100644 --- a/c/input/file_reader_stdio.c +++ b/c/input/file_reader_stdio.c @@ -13,6 +13,11 @@ void* file_reader_stdio_vopen(void* pvstate, char* prepipe, char* filename) { FILE* input_stream = stdin; +// if (prepipe == NULL) +// printf("NULL PREPIPE\n"); +// else +// printf("PREPIPE [%s]\n", prepipe); + if (!streq(filename, "-")) { input_stream = fopen(filename, "r"); if (input_stream == NULL) { diff --git a/c/input/lrec_reader_stdio_csv.c b/c/input/lrec_reader_stdio_csv.c index c789842f9..a75c38cd3 100644 --- a/c/input/lrec_reader_stdio_csv.c +++ b/c/input/lrec_reader_stdio_csv.c @@ -370,7 +370,7 @@ static lrec_t* paste_header_and_data(lrec_reader_stdio_csv_state_t* pstate, rsll // ---------------------------------------------------------------- static void* lrec_reader_stdio_csv_open(void* pvstate, char* prepipe, char* filename) { lrec_reader_stdio_csv_state_t* pstate = pvstate; - pstate->pfr->pbr->popen_func(pstate->pfr->pbr, filename); + pstate->pfr->pbr->popen_func(pstate->pfr->pbr, prepipe, filename); pfr_reset(pstate->pfr); // Different from the other readers, we keep the file handle within the // byte_reader object. diff --git a/c/input/mmap_byte_reader.c b/c/input/mmap_byte_reader.c index 1c2838be2..f3d45a53d 100644 --- a/c/input/mmap_byte_reader.c +++ b/c/input/mmap_byte_reader.c @@ -17,7 +17,7 @@ typedef struct _mmap_byte_reader_state_t { char* eof; } mmap_byte_reader_state_t; -static int mmap_byte_reader_open_func(struct _byte_reader_t* pbr, char* filename); +static int mmap_byte_reader_open_func(struct _byte_reader_t* pbr, char* prepipe, char* filename); static int mmap_byte_reader_read_func(struct _byte_reader_t* pbr); static void mmap_byte_reader_close_func(struct _byte_reader_t* pbr); @@ -42,7 +42,8 @@ void mmap_byte_reader_free(byte_reader_t* pbr) { } // ---------------------------------------------------------------- -static int mmap_byte_reader_open_func(struct _byte_reader_t* pbr, char* filename) { +static int mmap_byte_reader_open_func(struct _byte_reader_t* pbr, char* prepipe, char* filename) { + // xxx abend unless prepipe == NULL mmap_byte_reader_state_t* pstate = mlr_malloc_or_die(sizeof(mmap_byte_reader_state_t)); pstate->filename = mlr_strdup_or_die(filename); pstate->fd = open(filename, O_RDONLY); diff --git a/c/input/stdio_byte_reader.c b/c/input/stdio_byte_reader.c index 68a1c6e99..024ea4fcd 100644 --- a/c/input/stdio_byte_reader.c +++ b/c/input/stdio_byte_reader.c @@ -9,7 +9,7 @@ typedef struct _stdio_byte_reader_state_t { FILE* fp; } stdio_byte_reader_state_t; -static int stdio_byte_reader_open_func(struct _byte_reader_t* pbr, char* filename); +static int stdio_byte_reader_open_func(struct _byte_reader_t* pbr, char* prepipe, char* filename); static int stdio_byte_reader_read_func(struct _byte_reader_t* pbr); static void stdio_byte_reader_close_func(struct _byte_reader_t* pbr); @@ -34,8 +34,14 @@ void stdio_byte_reader_free(byte_reader_t* pbr) { } // ---------------------------------------------------------------- -static int stdio_byte_reader_open_func(struct _byte_reader_t* pbr, char* filename) { +static int stdio_byte_reader_open_func(struct _byte_reader_t* pbr, char* prepipe, char* filename) { stdio_byte_reader_state_t* pstate = mlr_malloc_or_die(sizeof(stdio_byte_reader_state_t)); + +// if (prepipe == NULL) +// printf("NULL QREPIPE\n"); +// else +// printf("QREPIPE [%s]\n", prepipe); + pstate->filename = mlr_strdup_or_die(filename); if (streq(pstate->filename, "-")) { pstate->fp = stdin; diff --git a/c/input/string_byte_reader.c b/c/input/string_byte_reader.c index 0364fa15b..324dadca0 100644 --- a/c/input/string_byte_reader.c +++ b/c/input/string_byte_reader.c @@ -8,7 +8,7 @@ typedef struct _string_byte_reader_state_t { char* pend; } string_byte_reader_state_t; -static int string_byte_reader_open_func(struct _byte_reader_t* pbr, char* backing); +static int string_byte_reader_open_func(struct _byte_reader_t* pbr, char* prepipe, char* backing); static int string_byte_reader_read_func(struct _byte_reader_t* pbr); static void string_byte_reader_close_func(struct _byte_reader_t* pbr); @@ -29,7 +29,8 @@ void string_byte_reader_free(byte_reader_t* pbr) { } // ---------------------------------------------------------------- -static int string_byte_reader_open_func(struct _byte_reader_t* pbr, char* backing) { +static int string_byte_reader_open_func(struct _byte_reader_t* pbr, char* prepipe, char* backing) { + // xxx abend unless prepipe == NULL string_byte_reader_state_t* pstate = mlr_malloc_or_die(sizeof(string_byte_reader_state_t)); pstate->backing = backing; pstate->p = pstate->backing; diff --git a/c/unit_test/test_byte_readers.c b/c/unit_test/test_byte_readers.c index 0114b5400..e66d88cc6 100644 --- a/c/unit_test/test_byte_readers.c +++ b/c/unit_test/test_byte_readers.c @@ -15,7 +15,7 @@ int assertions_failed = 0; static char* test_string_byte_reader() { byte_reader_t* pbr = string_byte_reader_alloc(); - int ok = pbr->popen_func(pbr, ""); + int ok = pbr->popen_func(pbr, NULL, ""); mu_assert_lf(ok == TRUE); // char defaults to unsigned on some platforms -- but, byte_reader_t API is // in terms of ints. @@ -24,14 +24,14 @@ static char* test_string_byte_reader() { mu_assert_lf(pbr->pread_func(pbr) == EOF); pbr->pclose_func(pbr); - ok = pbr->popen_func(pbr, "a"); + ok = pbr->popen_func(pbr, NULL, "a"); mu_assert_lf(ok == TRUE); mu_assert_lf(pbr->pread_func(pbr) == 'a'); mu_assert_lf(pbr->pread_func(pbr) == EOF); mu_assert_lf(pbr->pread_func(pbr) == EOF); pbr->pclose_func(pbr); - ok = pbr->popen_func(pbr, "abc"); + ok = pbr->popen_func(pbr, NULL, "abc"); mu_assert_lf(ok == TRUE); mu_assert_lf(pbr->pread_func(pbr) == 'a'); mu_assert_lf(pbr->pread_func(pbr) == 'b'); @@ -49,7 +49,7 @@ static char* test_stdio_byte_reader_1() { char* contents = ""; char* path = write_temp_file_or_die(contents); - int ok = pbr->popen_func(pbr, path); + int ok = pbr->popen_func(pbr, NULL, path); mu_assert_lf(ok == TRUE); mu_assert_lf(pbr->pread_func(pbr) == EOF); mu_assert_lf(pbr->pread_func(pbr) == EOF); @@ -65,7 +65,7 @@ static char* test_stdio_byte_reader_2() { char* contents = "abcdefg"; char* path = write_temp_file_or_die(contents); - int ok = pbr->popen_func(pbr, path); + int ok = pbr->popen_func(pbr, NULL, path); mu_assert_lf(ok == TRUE); mu_assert_lf(pbr->pread_func(pbr) == 'a'); mu_assert_lf(pbr->pread_func(pbr) == 'b'); @@ -88,7 +88,7 @@ static char* test_stdio_byte_reader_reuse() { char* contents = "abc"; char* path = write_temp_file_or_die(contents); - int ok = pbr->popen_func(pbr, path); + int ok = pbr->popen_func(pbr, NULL, path); mu_assert_lf(ok == TRUE); mu_assert_lf(pbr->pread_func(pbr) == 'a'); mu_assert_lf(pbr->pread_func(pbr) == 'b'); @@ -100,7 +100,7 @@ static char* test_stdio_byte_reader_reuse() { contents = "defg"; path = write_temp_file_or_die(contents); - ok = pbr->popen_func(pbr, path); + ok = pbr->popen_func(pbr, NULL, path); mu_assert_lf(ok == TRUE); mu_assert_lf(pbr->pread_func(pbr) == 'd'); mu_assert_lf(pbr->pread_func(pbr) == 'e'); @@ -120,7 +120,7 @@ static char* test_mmap_byte_reader_1() { char* contents = ""; char* path = write_temp_file_or_die(contents); - int ok = pbr->popen_func(pbr, path); + int ok = pbr->popen_func(pbr, NULL, path); mu_assert_lf(ok == TRUE); mu_assert_lf(pbr->pread_func(pbr) == EOF); mu_assert_lf(pbr->pread_func(pbr) == EOF); @@ -136,7 +136,7 @@ static char* test_mmap_byte_reader_2() { char* contents = "abcdefg"; char* path = write_temp_file_or_die(contents); - int ok = pbr->popen_func(pbr, path); + int ok = pbr->popen_func(pbr, NULL, path); mu_assert_lf(ok == TRUE); mu_assert_lf(pbr->pread_func(pbr) == 'a'); mu_assert_lf(pbr->pread_func(pbr) == 'b'); @@ -159,7 +159,7 @@ static char* test_mmap_byte_reader_reuse() { char* contents = "abc"; char* path = write_temp_file_or_die(contents); - int ok = pbr->popen_func(pbr, path); + int ok = pbr->popen_func(pbr, NULL, path); mu_assert_lf(ok == TRUE); mu_assert_lf(pbr->pread_func(pbr) == 'a'); mu_assert_lf(pbr->pread_func(pbr) == 'b'); @@ -171,7 +171,7 @@ static char* test_mmap_byte_reader_reuse() { contents = "defg"; path = write_temp_file_or_die(contents); - ok = pbr->popen_func(pbr, path); + ok = pbr->popen_func(pbr, NULL, path); mu_assert_lf(ok == TRUE); mu_assert_lf(pbr->pread_func(pbr) == 'd'); mu_assert_lf(pbr->pread_func(pbr) == 'e'); diff --git a/c/unit_test/test_peek_file_reader.c b/c/unit_test/test_peek_file_reader.c index a1e9abe95..22724c5ef 100644 --- a/c/unit_test/test_peek_file_reader.c +++ b/c/unit_test/test_peek_file_reader.c @@ -15,7 +15,7 @@ int assertions_failed = 0; // ---------------------------------------------------------------- static char* test_empty() { byte_reader_t* pbr = string_byte_reader_alloc(); - int ok = pbr->popen_func(pbr, ""); + int ok = pbr->popen_func(pbr, NULL, ""); mu_assert_lf(ok == TRUE); peek_file_reader_t* pfr = pfr_alloc(pbr, 7); @@ -33,6 +33,9 @@ static char* test_empty() { static char* test_non_empty() { byte_reader_t* pbr = string_byte_reader_alloc(); int ok = pbr->popen_func(pbr, + + NULL, + "ab,cde\n" "123,4567\n" );