8#ifndef ORCUS_CSV_PARSER_HPP
9#define ORCUS_CSV_PARSER_HPP
11#include "csv_parser_base.hpp"
49 void cell(std::string_view value,
bool transient)
51 (void)value; (void)transient;
61template<
typename HandlerT>
65 typedef HandlerT handler_type;
77 void parse_cell_with_quote(
const char* p0,
size_t len0);
82 void push_cell_value(
const char* p,
size_t n);
85 handler_type& m_handler;
88template<
typename _Handler>
89csv_parser<_Handler>::csv_parser(
93template<
typename _Handler>
94void csv_parser<_Handler>::parse()
97 for (
const char* p = mp_begin; p < mp_end; ++p)
99 std::cout << std::endl;
102 m_handler.begin_parse();
105 m_handler.end_parse();
108template<
typename _Handler>
109void csv_parser<_Handler>::row()
111 m_handler.begin_row();
114 if (is_text_qualifier(cur_char()))
130 cout <<
"(LF)" << endl;
137 throw orcus::parse_error(
"expected a delimiter", offset());
141 if (m_config.trim_cell_value)
152template<
typename _Handler>
153void csv_parser<_Handler>::cell()
155 const char* p = mp_char;
158 while (c !=
'\n' && !is_delim(c))
170 push_cell_value(p, len);
173template<
typename _Handler>
174void csv_parser<_Handler>::quoted_cell()
177 cout <<
"--- quoted cell" << endl;
180 assert(is_text_qualifier(c));
185 const char* p0 = mp_char;
187 for (; has_char(); next(), ++len)
191 cout <<
"'" << c <<
"'" << endl;
193 if (!is_text_qualifier(c))
199 if (has_next() && is_text_qualifier(peek_char()))
202 parse_cell_with_quote(p0, len);
207 m_handler.cell({p0, len-1},
false);
214 m_handler.cell({p0, len},
false);
217template<
typename _Handler>
218void csv_parser<_Handler>::parse_cell_with_quote(
const char* p0,
size_t len0)
222 cout <<
"--- parse cell with quote" << endl;
224 assert(is_text_qualifier(cur_char()));
228 m_cell_buf.append(p0, len0);
232 const char* p_cur = mp_char;
234 for (; has_char(); next(), ++cur_len)
238 cout <<
"'" << c <<
"'" << endl;
240 if (!is_text_qualifier(c))
243 if (has_next() && is_text_qualifier(peek_char()))
246 m_cell_buf.append(p_cur, cur_len);
256 m_cell_buf.append(p_cur, cur_len);
258 m_handler.cell(m_cell_buf.str(),
true);
265 throw parse_error(
"stream ended prematurely while parsing quoted cell.", offset());
268template<
typename _Handler>
269void csv_parser<_Handler>::push_cell_value(
const char* p,
size_t n)
273 if (m_config.trim_cell_value)
276 for (
size_t i = 0; i < n; ++i, --len, ++p)
285 const char* p_end = p + (len-1);
286 for (; p != p_end; --p_end, --len)
288 if (!is_blank(*p_end))
294 m_handler.cell({p, len},
false);
297 cout <<
"(cell:'" << std::string(p, len) <<
"')" << endl;
299 cout <<
"(cell:'')" << endl;
Definition csv_parser_base.hpp:58
Definition csv_parser.hpp:16
void end_row()
Definition csv_parser.hpp:36
void end_parse()
Definition csv_parser.hpp:26
void begin_row()
Definition csv_parser.hpp:31
void begin_parse()
Definition csv_parser.hpp:21
void cell(std::string_view value, bool transient)
Definition csv_parser.hpp:49
Definition exception.hpp:94
Definition parser_base.hpp:23
Definition csv_parser_base.hpp:37