diff --git a/c/containers/join_bucket_keeper.c b/c/containers/join_bucket_keeper.c index 86d4f00bc..3a17c9553 100644 --- a/c/containers/join_bucket_keeper.c +++ b/c/containers/join_bucket_keeper.c @@ -192,14 +192,14 @@ join_bucket_keeper_t* join_bucket_keeper_alloc_from_reader( } // ---------------------------------------------------------------- -void join_bucket_keeper_free(join_bucket_keeper_t* pkeeper) { +void join_bucket_keeper_free(join_bucket_keeper_t* pkeeper, char* prepipe) { if (pkeeper == NULL) return; if (pkeeper->pbucket->pleft_field_values != NULL) slls_free(pkeeper->pbucket->pleft_field_values); if (pkeeper->pbucket->precords != NULL) sllv_free(pkeeper->pbucket->precords); - pkeeper->plrec_reader->pclose_func(pkeeper->plrec_reader->pvstate, pkeeper->pvhandle); + pkeeper->plrec_reader->pclose_func(pkeeper->plrec_reader->pvstate, pkeeper->pvhandle, prepipe); free(pkeeper); } diff --git a/c/containers/join_bucket_keeper.h b/c/containers/join_bucket_keeper.h index e1e3d7394..e3c7e6a6d 100644 --- a/c/containers/join_bucket_keeper.h +++ b/c/containers/join_bucket_keeper.h @@ -53,7 +53,7 @@ join_bucket_keeper_t* join_bucket_keeper_alloc_from_reader( char* left_file_name, slls_t* pleft_field_names); -void join_bucket_keeper_free(join_bucket_keeper_t* pkeeper); +void join_bucket_keeper_free(join_bucket_keeper_t* pkeeper, char* prepipe); // *pprecords_paired should not be freed by the caller. // *pprecords_left_unpaired should be freed by the caller. diff --git a/c/experimental/getlines.c b/c/experimental/getlines.c index 379acebba..dcbb8fa46 100644 --- a/c/experimental/getlines.c +++ b/c/experimental/getlines.c @@ -317,7 +317,7 @@ static int read_file_mmap_psb(char* filename, int do_write) { bc += strlen(line); } sb_free(psb); - file_reader_mmap_close(ph); + file_reader_mmap_close(ph, NULL); return bc; } diff --git a/c/input/byte_reader.h b/c/input/byte_reader.h index 17032c54d..26644e0c7 100644 --- a/c/input/byte_reader.h +++ b/c/input/byte_reader.h @@ -18,7 +18,7 @@ typedef int byte_reader_read_func_t(struct _byte_reader_t* pbr); // The close function should close file pointers/descriptors, as well as any // necessary heap-frees. -typedef void byte_reader_close_func_t(struct _byte_reader_t* pbr); +typedef void byte_reader_close_func_t(struct _byte_reader_t* pbr, char* prepipe); typedef struct _byte_reader_t { void* pvstate; diff --git a/c/input/file_reader_mmap.c b/c/input/file_reader_mmap.c index 12f21c797..3946e26f3 100644 --- a/c/input/file_reader_mmap.c +++ b/c/input/file_reader_mmap.c @@ -43,7 +43,7 @@ file_reader_mmap_state_t* file_reader_mmap_open(char* prepipe, char* file_name) } // ---------------------------------------------------------------- -void file_reader_mmap_close(file_reader_mmap_state_t* pstate) { +void file_reader_mmap_close(file_reader_mmap_state_t* pstate, char* prepipe) { if (close(pstate->fd) < 0) { perror("close"); exit(1); @@ -57,6 +57,6 @@ void* file_reader_mmap_vopen(void* pvstate, char* prepipe, char* file_name) { } // ---------------------------------------------------------------- -void file_reader_mmap_vclose(void* pvstate, void* pvhandle) { - file_reader_mmap_close(pvhandle); +void file_reader_mmap_vclose(void* pvstate, void* pvhandle, char* prepipe) { + file_reader_mmap_close(pvhandle, prepipe); } diff --git a/c/input/file_reader_mmap.h b/c/input/file_reader_mmap.h index 3186ed1c0..08e09ff03 100644 --- a/c/input/file_reader_mmap.h +++ b/c/input/file_reader_mmap.h @@ -12,9 +12,9 @@ typedef struct _file_reader_mmap_state_t { } file_reader_mmap_state_t; file_reader_mmap_state_t* file_reader_mmap_open(char* prepipe, char* file_name); -void file_reader_mmap_close(file_reader_mmap_state_t* pstate); +void file_reader_mmap_close(file_reader_mmap_state_t* pstate, char* prepipe); void* file_reader_mmap_vopen(void* pvstate, char* prepipe, char* file_name); -void file_reader_mmap_vclose(void* pvstate, void* pvhandle); +void file_reader_mmap_vclose(void* pvstate, void* pvhandle, char* prepipe); #endif // FILE_READER_MMAP_H diff --git a/c/input/file_reader_stdio.c b/c/input/file_reader_stdio.c index 5b7f96167..d605ea4d3 100644 --- a/c/input/file_reader_stdio.c +++ b/c/input/file_reader_stdio.c @@ -30,7 +30,7 @@ void* file_reader_stdio_vopen(void* pvstate, char* prepipe, char* filename) { } // ---------------------------------------------------------------- -void file_reader_stdio_vclose(void* pvstate, void* pvhandle) { +void file_reader_stdio_vclose(void* pvstate, void* pvhandle, char* prepipe) { FILE* input_stream = pvhandle; if (input_stream != stdin) fclose(input_stream); diff --git a/c/input/file_reader_stdio.h b/c/input/file_reader_stdio.h index 893c9056e..64146e4ea 100644 --- a/c/input/file_reader_stdio.h +++ b/c/input/file_reader_stdio.h @@ -6,6 +6,6 @@ #define FILE_READER_STDIO_H void* file_reader_stdio_vopen(void* pvstate, char* prepipe, char* file_name); -void file_reader_stdio_vclose(void* pvstate, void* pvhandle); +void file_reader_stdio_vclose(void* pvstate, void* pvhandle, char* prepipe); #endif // FILE_READER_STDIO_H diff --git a/c/input/lrec_reader.h b/c/input/lrec_reader.h index fd3d7e8b2..7274c6765 100644 --- a/c/input/lrec_reader.h +++ b/c/input/lrec_reader.h @@ -8,7 +8,7 @@ // The void* pvhandle is either FILE* for stdio readers or file_reader_mmap_state_t* for mmap readers. typedef void* lrec_reader_open_func_t(void* pvstate, char* prepipe, char* filename); -typedef void lrec_reader_close_func_t(void* pvstate, void* pvhandle); +typedef void lrec_reader_close_func_t(void* pvstate, void* pvhandle, char* prepipe); typedef lrec_t* lrec_reader_process_func_t(void* pvstate, void* pvhandle, context_t* pctx); typedef void lrec_reader_sof_func_t(void* pvstate); typedef void lrec_reader_free_func_t(void* pvstate); diff --git a/c/input/lrec_reader_in_memory.c b/c/input/lrec_reader_in_memory.c index 4a282db08..d795c908f 100644 --- a/c/input/lrec_reader_in_memory.c +++ b/c/input/lrec_reader_in_memory.c @@ -14,7 +14,7 @@ static void lrec_reader_in_memory_free(void* pvstate); static void lrec_reader_in_memory_sof(void* pvstate); static lrec_t* lrec_reader_in_memory_process(void* pvstate, void* pvhandle, context_t* pctx); static void* lrec_reader_in_memory_vopen(void* pvstate, char* prepipe, char* filename); -static void lrec_reader_in_memory_vclose(void* pvstate, void* pvhandle); +static void lrec_reader_in_memory_vclose(void* pvstate, void* pvhandle, char* prepipe); // ---------------------------------------------------------------- lrec_reader_t* lrec_reader_in_memory_alloc(sllv_t* precords) { @@ -56,5 +56,5 @@ static void* lrec_reader_in_memory_vopen(void* pvstate, char* prepipe, char* fil return NULL; } -static void lrec_reader_in_memory_vclose(void* pvstate, void* pvhandle) { +static void lrec_reader_in_memory_vclose(void* pvstate, void* pvhandle, char* prepipe) { } diff --git a/c/input/lrec_reader_stdio_csv.c b/c/input/lrec_reader_stdio_csv.c index a75c38cd3..caa52158c 100644 --- a/c/input/lrec_reader_stdio_csv.c +++ b/c/input/lrec_reader_stdio_csv.c @@ -78,7 +78,7 @@ static lrec_t* paste_indices_and_data(lrec_reader_stdio_csv_state_t* pstate, rsl static lrec_t* paste_header_and_data(lrec_reader_stdio_csv_state_t* pstate, rslls_t* pdata_fields, context_t* pctx); static void* lrec_reader_stdio_csv_open(void* pvstate, char* prepipe, char* filename); -static void lrec_reader_stdio_csv_close(void* pvstate, void* pvhandle); +static void lrec_reader_stdio_csv_close(void* pvstate, void* pvhandle, char* prepipe); // ---------------------------------------------------------------- lrec_reader_t* lrec_reader_stdio_csv_alloc(char* irs, char* ifs, int use_implicit_header) { @@ -377,7 +377,7 @@ static void* lrec_reader_stdio_csv_open(void* pvstate, char* prepipe, char* file return NULL; } -static void lrec_reader_stdio_csv_close(void* pvstate, void* pvhandle) { +static void lrec_reader_stdio_csv_close(void* pvstate, void* pvhandle, char* prepipe) { lrec_reader_stdio_csv_state_t* pstate = pvstate; - pstate->pfr->pbr->pclose_func(pstate->pfr->pbr); + pstate->pfr->pbr->pclose_func(pstate->pfr->pbr, prepipe); } diff --git a/c/input/mmap_byte_reader.c b/c/input/mmap_byte_reader.c index f3d45a53d..d61b60218 100644 --- a/c/input/mmap_byte_reader.c +++ b/c/input/mmap_byte_reader.c @@ -19,7 +19,7 @@ typedef struct _mmap_byte_reader_state_t { 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); +static void mmap_byte_reader_close_func(struct _byte_reader_t* pbr, char* prepipe); // ---------------------------------------------------------------- byte_reader_t* mmap_byte_reader_alloc() { @@ -88,7 +88,7 @@ static int mmap_byte_reader_read_func(struct _byte_reader_t* pbr) { } } -static void mmap_byte_reader_close_func(struct _byte_reader_t* pbr) { +static void mmap_byte_reader_close_func(struct _byte_reader_t* pbr, char* prepipe) { mmap_byte_reader_state_t* pstate = pbr->pvstate; if (close(pstate->fd) < 0) { perror("close"); diff --git a/c/input/stdio_byte_reader.c b/c/input/stdio_byte_reader.c index 024ea4fcd..8bf34bf6e 100644 --- a/c/input/stdio_byte_reader.c +++ b/c/input/stdio_byte_reader.c @@ -11,7 +11,7 @@ typedef struct _stdio_byte_reader_state_t { 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); +static void stdio_byte_reader_close_func(struct _byte_reader_t* pbr, char* prepipe); // ---------------------------------------------------------------- byte_reader_t* stdio_byte_reader_alloc() { @@ -68,7 +68,8 @@ static int stdio_byte_reader_read_func(struct _byte_reader_t* pbr) { return c; } -static void stdio_byte_reader_close_func(struct _byte_reader_t* pbr) { +static void stdio_byte_reader_close_func(struct _byte_reader_t* pbr, char* prepipe) { + // xxx stdio_byte_reader_state_t* pstate = pbr->pvstate; if (pstate->fp != stdin) fclose(pstate->fp); diff --git a/c/input/string_byte_reader.c b/c/input/string_byte_reader.c index 324dadca0..7d2ad836e 100644 --- a/c/input/string_byte_reader.c +++ b/c/input/string_byte_reader.c @@ -10,7 +10,7 @@ typedef struct _string_byte_reader_state_t { 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); +static void string_byte_reader_close_func(struct _byte_reader_t* pbr, char* prepipe); // ---------------------------------------------------------------- byte_reader_t* string_byte_reader_alloc() { @@ -48,6 +48,6 @@ static int string_byte_reader_read_func(struct _byte_reader_t* pbr) { } } -static void string_byte_reader_close_func(struct _byte_reader_t* pbr) { +static void string_byte_reader_close_func(struct _byte_reader_t* pbr, char* prepipe) { pbr->pvstate = NULL; } diff --git a/c/mapping/mapper_join.c b/c/mapping/mapper_join.c index 224a90a0b..7fe27c3de 100644 --- a/c/mapping/mapper_join.c +++ b/c/mapping/mapper_join.c @@ -236,7 +236,7 @@ static void mapper_join_free(void* pvstate) { if (pstate->popts->poutput_join_field_names != NULL) slls_free(pstate->popts->poutput_join_field_names); if (pstate->pjoin_bucket_keeper != NULL) - join_bucket_keeper_free(pstate->pjoin_bucket_keeper); + join_bucket_keeper_free(pstate->pjoin_bucket_keeper, pstate->popts->prepipe); } // ---------------------------------------------------------------- @@ -504,5 +504,5 @@ static void ingest_left_file(mapper_join_state_t* pstate) { } } - plrec_reader->pclose_func(plrec_reader->pvstate, pvhandle); + plrec_reader->pclose_func(plrec_reader->pvstate, pvhandle, pstate->popts->prepipe); } diff --git a/c/stream/stream.c b/c/stream/stream.c index 80d39cb44..2c44ba3bb 100644 --- a/c/stream/stream.c +++ b/c/stream/stream.c @@ -74,7 +74,7 @@ static int do_file_chained(char* prepipe, char* filename, context_t* pctx, drive_lrec(pinrec, pctx, pmapper_list->phead, plrec_writer, output_stream); } - plrec_reader->pclose_func(plrec_reader->pvstate, pvhandle); + plrec_reader->pclose_func(plrec_reader->pvstate, pvhandle, prepipe); return 1; } diff --git a/c/todo.txt b/c/todo.txt index 6951a090a..723ae1820 100644 --- a/c/todo.txt +++ b/c/todo.txt @@ -45,6 +45,8 @@ TOP OF LIST - fminus -> python too - mlr as data prep clean +* mixed-format joins ... + ---------------------------------------------------------------- COOKBOOK/FAQ/ETC.: diff --git a/c/unit_test/test_byte_readers.c b/c/unit_test/test_byte_readers.c index e66d88cc6..196761979 100644 --- a/c/unit_test/test_byte_readers.c +++ b/c/unit_test/test_byte_readers.c @@ -22,14 +22,14 @@ static char* test_string_byte_reader() { mu_assert_lf(pbr->pread_func(pbr) == EOF); mu_assert_lf(pbr->pread_func(pbr) == EOF); mu_assert_lf(pbr->pread_func(pbr) == EOF); - pbr->pclose_func(pbr); + pbr->pclose_func(pbr, NULL); 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); + pbr->pclose_func(pbr, NULL); ok = pbr->popen_func(pbr, NULL, "abc"); mu_assert_lf(ok == TRUE); @@ -38,7 +38,7 @@ static char* test_string_byte_reader() { mu_assert_lf(pbr->pread_func(pbr) == 'c'); mu_assert_lf(pbr->pread_func(pbr) == EOF); mu_assert_lf(pbr->pread_func(pbr) == EOF); - pbr->pclose_func(pbr); + pbr->pclose_func(pbr, NULL); return NULL; } diff --git a/c/unit_test/test_peek_file_reader.c b/c/unit_test/test_peek_file_reader.c index 22724c5ef..5271f027c 100644 --- a/c/unit_test/test_peek_file_reader.c +++ b/c/unit_test/test_peek_file_reader.c @@ -23,7 +23,7 @@ static char* test_empty() { mu_assert_lf(pfr_peek_char(pfr) == (char)EOF); // char defaults to unsigned on some platforms mu_assert_lf(pfr_read_char(pfr) == (char)EOF); - pbr->pclose_func(pbr); + pbr->pclose_func(pbr, NULL); pfr_free(pfr); return NULL; @@ -62,7 +62,7 @@ static char* test_non_empty() { pfr_print(pfr); pfr_advance_by(pfr, 5); pfr_print(pfr); mu_assert_lf(pfr_read_char(pfr) == '\n'); - pbr->pclose_func(pbr); + pbr->pclose_func(pbr, NULL); pfr_free(pfr); return NULL;