{
enum bytesearch_mode mode;
bool blank_delimited;
+ bool at_eof;
char *line_end;
bool line_end_known;
};
+static inline void
+bytesearch_context_reset (struct bytesearch_context *ctx)
+{
+ ctx->mode = BYTESEARCH_FIELDS;
+ ctx->line_end = NULL;
+ ctx->line_end_known = false;
+}
+
struct mbfield_parser
{
bool whitespace_delimited;
}
static inline enum field_terminator
-find_bytesearch_field_terminator (char *buf, idx_t len, bool at_eof,
+find_bytesearch_field_terminator (char *buf, idx_t len,
struct bytesearch_context *ctx,
char **terminator)
{
if (!*terminator)
return FIELD_DATA;
- return (at_eof && *terminator + 1 == buf + len
+ return (ctx->at_eof && *terminator + 1 == buf + len
? FIELD_FINAL_DELIMITER
: FIELD_DELIMITER);
}
write_field = begin_field_output (field_idx, buffer_first_field,
&found_any_selected_field);
+ struct bytesearch_context search = { .blank_delimited = whitespace_delimited};
+ bytesearch_context_reset (&search);
+
while (true)
{
idx_t safe = mbbuf_fill (&mbbuf);
if (safe == 0)
break;
+ search.at_eof = feof (mbbuf.fp);
+ search.line_end_known = false;
char *chunk = mbbuf.buffer + mbbuf.offset;
idx_t processed = 0;
&& !field_delim_is_line_delim ()
&& !find_bytesearch_field_delim (chunk, safe))
{
- char *last_line_delim = feof (mbbuf.fp)
+ char *last_line_delim = search.at_eof
? chunk + safe - 1
: memrchr ((void *) chunk, line_delim, safe);
if (last_line_delim)
}
idx_t n = last_line_delim - chunk + 1;
write_bytes (chunk, n);
- if (feof (mbbuf.fp) && chunk[n - 1] != line_delim)
+ if (search.at_eof && chunk[n - 1] != line_delim)
write_line_delim ();
mbbuf_advance (&mbbuf, n);
have_pending_line = false;
- if (feof (mbbuf.fp))
+ if (search.at_eof)
return;
continue;
}
}
- struct bytesearch_context search =
- {
- .mode = BYTESEARCH_FIELDS,
- .blank_delimited = whitespace_delimited
- };
-
while (processed < safe)
{
char *terminator = NULL;
enum field_terminator terminator_kind
= find_bytesearch_field_terminator (chunk + processed,
safe - processed,
- feof (mbbuf.fp), &search,
- &terminator);
+ &search, &terminator);
if (terminator_kind == FIELD_LINE_DELIMITER)
{
processed = terminator - chunk + 1;
enum field_terminator terminator_kind
= find_bytesearch_field_terminator (chunk + processed,
safe - processed,
- feof (mbbuf.fp), &search,
- &terminator);
+ &search, &terminator);
idx_t field_len = terminator ? terminator - (chunk + processed)
: safe - processed;
current_rp = frp;
found_any_selected_field = false;
have_pending_line = false;
- search.line_end = NULL;
- search.line_end_known = false;
- search.mode = BYTESEARCH_FIELDS;
+ bytesearch_context_reset (&search);
write_field = begin_field_output (field_idx, buffer_first_field,
&found_any_selected_field);
}