diff --git a/csv_parser.c b/csv_parser.c index 7b8d1ec..e078814 100644 --- a/csv_parser.c +++ b/csv_parser.c @@ -119,8 +119,13 @@ CSVParseResult csv_parse_line_inplace(const char *line, Arena *arena, const CSVC case FIELD_START: if (c == config->enclosure) { state = QUOTED_FIELD; - field_start = &line[pos + 1]; - field_len = 0; + if (!config->preserveQuotes) { + field_start = &line[pos + 1]; + field_len = 0; + } else { + field_start = &line[pos]; + field_len = 1; + } } else if (c == config->delimiter) { if (!add_field(&result.fields, "", 0, arena)) { result.success = false; @@ -159,6 +164,9 @@ CSVParseResult csv_parse_line_inplace(const char *line, Arena *arena, const CSVC field_len += 2; pos++; } else { + if (config->preserveQuotes) { + field_len++; + } state = FIELD_END; } } else { diff --git a/tests/test_csv_parser.c b/tests/test_csv_parser.c index bac7fa9..05640c4 100644 --- a/tests/test_csv_parser.c +++ b/tests/test_csv_parser.c @@ -58,6 +58,14 @@ void test_csv_parser_escaped_quotes() { assert(result2.fields.count == 2); assert(strcmp(result2.fields.fields[0], "\"quoted\"") == 0); assert(strcmp(result2.fields.fields[1], "test") == 0); + + printf("Testing CSV parser with preserveQuotes=true...\n"); + config->preserveQuotes = true; + CSVParseResult result3 = csv_parse_line_inplace("\"Say Hello World\",normal", &arena, config, 3); + assert(result3.success == true); + assert(result3.fields.count == 2); + assert(strcmp(result3.fields.fields[0], "\"Say Hello World\"") == 0); + assert(strcmp(result3.fields.fields[1], "normal") == 0); arena_destroy(&arena); printf("✓ CSV parser escaped quotes test passed\n");