6 /* Buffer for building field content */
7 static char field_buffer[8192];
8 static int field_pos = 0;
10 void reset_field_buffer() {
12 field_buffer[0] = '\0';
15 void append_to_field(char c) {
16 if (field_pos < sizeof(field_buffer) - 1) {
17 field_buffer[field_pos++] = c;
18 field_buffer[field_pos] = '\0';
22 void append_string_to_field(const char* s) {
23 while (*s && field_pos < sizeof(field_buffer) - 1) {
24 field_buffer[field_pos++] = *s++;
26 field_buffer[field_pos] = '\0';
29 char* get_field_content() {
30 return strdup(field_buffer);
39 TEXTDATA [\x20-\x21\x23-\x2B\x2D-\x7E]
48 {COMMA} { return COMMA_TOK; }
50 {CRLF} { return CRLF_TOK; }
52 {LF} { return CRLF_TOK; }
59 <ESCAPED_FIELD>{DQUOTE}{DQUOTE} { append_to_field('"'); }
61 <ESCAPED_FIELD>{DQUOTE} {
62 yylval.str = get_field_content();
67 <ESCAPED_FIELD>{TEXTDATA} { append_to_field(yytext[0]); }
69 <ESCAPED_FIELD>{COMMA} { append_to_field(','); }
71 <ESCAPED_FIELD>{CR} { append_to_field('\r'); }
73 <ESCAPED_FIELD>{LF} { append_to_field('\n'); }
75 <ESCAPED_FIELD>. { append_to_field(yytext[0]); }
78 yylval.str = strdup(yytext);
82 [ \t] { /* ignore whitespace outside of fields */ }
84 . { return yytext[0]; }