// ================================================================ static char* read_line_fgetc_psb(FILE* fp, string_builder_t* psb, char* irs) { while (TRUE) { int c = fgetc(fp); if (c == EOF) { if (sb_is_empty(psb)) return NULL; else return sb_finish(psb); } else if (c == irs[0]) { return sb_finish(psb); } else { sb_append_char(psb, c); } } }
// ================================================================ static char* read_line_mmap_psb(file_reader_mmap_state_t* ph, string_builder_t* psb, char* irs) { char *p = ph->sol; while (TRUE) { if (p == ph->eof) { ph->sol = p; if (sb_is_empty(psb)) return NULL; else return sb_finish(psb); } else if (*p == irs[0]) { ph->sol = p+1; return sb_finish(psb); } else { sb_append_char(psb, *p); p++; } } }
// ================================================================ static char* read_line_pfr_psb(peek_file_reader_t* pfr, string_builder_t* psb, char* irs, int irs_len) { while (TRUE) { if (pfr_at_eof(pfr)) { if (sb_is_empty(psb)) return NULL; else return sb_finish(psb); } else if (pfr_next_is(pfr, irs, irs_len)) { if (!pfr_advance_past(pfr, irs)) { fprintf(stderr, "%s: Internal coding error: IRS found and lost.\n", MLR_GLOBALS.argv0); exit(1); } return sb_finish(psb); } else { sb_append_char(psb, pfr_read_char(pfr)); } } }