static int read_file_pfr_psb(char* filename, int do_write) { byte_reader_t* pbr = stdio_byte_reader_alloc(); string_builder_t* psb = sb_alloc(STRING_BUILDER_INIT_SIZE); pbr->popen_func(pbr, NULL, filename); peek_file_reader_t* pfr = pfr_alloc(pbr, PEEK_BUF_LEN); parse_trie_t* ptrie = parse_trie_alloc(); parse_trie_add_string(ptrie, "\n", IRS_STRIDX); parse_trie_add_string(ptrie, "\xff", EOF_STRIDX); parse_trie_add_string(ptrie, "\n\xff", IRSEOF_STRIDX); int bc = 0; while (TRUE) { char* line = read_line_pfr_psb(pfr, psb, ptrie); if (line == NULL) break; if (do_write) { fputs(line, stdout); fputc('\n', stdout); } bc += strlen(line); free(line); } sb_free(psb); pbr->pclose_func(pbr, NULL); return bc; }
static int read_file_pfr_psb(char* filename) { FILE* fp = fopen_or_die(filename); char* irs = "\n"; int irs_len = strlen(irs); peek_file_reader_t* pfr = pfr_alloc(fp, PEEK_BUF_LEN); string_builder_t sb; string_builder_t* psb = &sb; sb_init(&sb, STRING_BUILDER_INIT_SIZE); int bc = 0; while (TRUE) { char* line = read_line_pfr_psb(pfr, psb, irs, irs_len); if (line == NULL) break; bc += strlen(line); } fclose(fp); return bc; }