// TODO: Make the linereader more efficient and flexible, and make // it a standard library function. static int de_linereader_readnextline(deark *c, struct de_linereader *lr, char *buf, size_t buf_len, unsigned int flags) { int ret; i64 content_len = 0; i64 total_len = 0; buf[0] = '\0'; ret = dbuf_find_line(lr->f, lr->f_pos, &content_len, &total_len); if(!ret) return 0; if(content_len > (i64)buf_len-1) { lr->f_pos += total_len; return 0; } dbuf_read(lr->f, (u8*)buf, lr->f_pos, content_len); buf[content_len] = '\0'; lr->f_pos += total_len; return 1; }
static int read_pam_header_line(deark *c, lctx *d, struct page_ctx *pg, de_int64 pos, de_int64 *content_len, de_int64 *total_len, char *linebuf, size_t linebuf_len) { int ret; de_int64 amt_to_read; linebuf[0]='\0'; ret = dbuf_find_line(c->infile, pos, content_len, total_len); if(!ret) return 0; amt_to_read = *content_len; if(amt_to_read > (de_int64)(linebuf_len-1)) amt_to_read = (de_int64)(linebuf_len-1); de_read((de_byte*)linebuf, pos, amt_to_read); *content_len = amt_to_read; linebuf[amt_to_read] = '\0'; return 1; }