static lrec_t* lrec_reader_stdio_csv_process(void* pvhandle, void* pvstate, context_t* pctx) { FILE* input_stream = pvhandle; lrec_reader_stdio_csv_state_t* pstate = pvstate; while (TRUE) { if (pstate->expect_header_line_next) { // xxx cmt while (TRUE) { char* hline = mlr_get_line(input_stream, pstate->irs); if (hline == NULL) // EOF return NULL; pstate->ilno++; slls_t* pheader_fields = split_csv_header_line(hline, pstate->ifs, pstate->allow_repeat_ifs); if (pheader_fields->length == 0) { pstate->expect_header_line_next = TRUE; if (pstate->pheader_keeper != NULL) { pstate->pheader_keeper = NULL; } } else { pstate->expect_header_line_next = FALSE; pstate->pheader_keeper = lhmslv_get(pstate->pheader_keepers, pheader_fields); if (pstate->pheader_keeper == NULL) { pstate->pheader_keeper = header_keeper_alloc(hline, pheader_fields); lhmslv_put(pstate->pheader_keepers, pheader_fields, pstate->pheader_keeper); } else { // Re-use the header-keeper in the header cache slls_free(pheader_fields); free(hline); } break; } } } char* line = mlr_get_line(input_stream, pstate->irs); if (line == NULL) // EOF return NULL; // xxx empty-line check ... make a lib func is_empty_modulo_whitespace(). if (!*line) { if (pstate->pheader_keeper != NULL) { pstate->pheader_keeper = NULL; pstate->expect_header_line_next = TRUE; free(line); continue; } } else { pstate->ifnr++; return lrec_parse_stdio_csv_data_line(pstate->pheader_keeper, line, pstate->ifs, pstate->allow_repeat_ifs); } } }
// ---------------------------------------------------------------- static lrec_t* lrec_reader_stdio_nidx_process(void* pvstate, void* pvhandle, context_t* pctx) { FILE* input_stream = pvhandle; lrec_reader_stdio_nidx_state_t* pstate = pvstate; char* line = mlr_get_line(input_stream, pstate->irs); if (line == NULL) return NULL; else return lrec_parse_stdio_nidx(line, pstate->ifs, pstate->allow_repeat_ifs); }
// ================================================================ static int read_file_mlr_get_line(char* filename) { FILE* fp = fopen_or_die(filename); int bc = 0; while (1) { char* line = mlr_get_line(fp, '\n'); if (line == NULL) break; bc += strlen(line); free(line); } fclose(fp); return bc; }