8#ifndef ORCUS_CSV_PARSER_HPP
9#define ORCUS_CSV_PARSER_HPP
11#include "csv_parser_base.hpp"
50 void cell(
const char* p,
size_t n,
bool transient)
52 (void)p; (void)n; (void)transient;
56template<
typename _Handler>
60 typedef _Handler handler_type;
72 void parse_cell_with_quote(
const char* p0,
size_t len0);
77 void push_cell_value(
const char* p,
size_t n);
80 handler_type& m_handler;
83template<
typename _Handler>
88template<
typename _Handler>
89void csv_parser<_Handler>::parse()
92 for (
const char* p = mp_begin; p < mp_end; ++p)
94 std::cout << std::endl;
97 m_handler.begin_parse();
100 m_handler.end_parse();
103template<
typename _Handler>
104void csv_parser<_Handler>::row()
106 m_handler.begin_row();
109 if (is_text_qualifier(cur_char()))
125 cout <<
"(LF)" << endl;
136 if (m_config.trim_cell_value)
147template<
typename _Handler>
148void csv_parser<_Handler>::cell()
150 const char* p = mp_char;
153 while (c !=
'\n' && !is_delim(c))
165 push_cell_value(p, len);
168template<
typename _Handler>
169void csv_parser<_Handler>::quoted_cell()
172 cout <<
"--- quoted cell" << endl;
175 assert(is_text_qualifier(c));
180 const char* p0 = mp_char;
182 for (; has_char(); next(), ++len)
186 cout <<
"'" << c <<
"'" << endl;
188 if (!is_text_qualifier(c))
194 if (has_next() && is_text_qualifier(next_char()))
197 parse_cell_with_quote(p0, len);
202 m_handler.cell(p0, len-1,
false);
209 m_handler.cell(p0, len,
false);
212template<
typename _Handler>
213void csv_parser<_Handler>::parse_cell_with_quote(
const char* p0,
size_t len0)
217 cout <<
"--- parse cell with quote" << endl;
219 assert(is_text_qualifier(cur_char()));
223 m_cell_buf.append(p0, len0);
227 const char* p_cur = mp_char;
229 for (; has_char(); next(), ++cur_len)
233 cout <<
"'" << c <<
"'" << endl;
235 if (!is_text_qualifier(c))
238 if (has_next() && is_text_qualifier(next_char()))
241 m_cell_buf.append(p_cur, cur_len);
251 m_cell_buf.append(p_cur, cur_len);
253 m_handler.cell(m_cell_buf.get(), m_cell_buf.size(),
true);
260 throw csv::parse_error(
"stream ended prematurely while parsing quoted cell.");
263template<
typename _Handler>
264void csv_parser<_Handler>::push_cell_value(
const char* p,
size_t n)
268 if (m_config.trim_cell_value)
271 for (
size_t i = 0; i < n; ++i, --len, ++p)
280 const char* p_end = p + (len-1);
281 for (; p != p_end; --p_end, --len)
283 if (!is_blank(*p_end))
289 m_handler.cell(p, len,
false);
292 cout <<
"(cell:'" << std::string(p, len) <<
"')" << endl;
294 cout <<
"(cell:'')" << endl;
Definition csv_parser_base.hpp:58
Definition csv_parser_base.hpp:67
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 cell(const char *p, size_t n, bool transient)
Definition csv_parser.hpp:50
void begin_parse()
Definition csv_parser.hpp:21
Definition csv_parser.hpp:58
Definition parser_base.hpp:41
Definition csv_parser_base.hpp:37