LCOV - code coverage report
Current view: top level - AP_CSVReader - AP_CSVReader.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 51 64 79.7 %
Date: 2026-09-09 11:02:08 Functions: 3 3 100.0 %

          Line data    Source code
       1             : #include "AP_CSVReader.h"
       2             : 
       3             : #include <AP_Common/AP_Common.h>
       4             : 
       5             : #include <stdio.h>
       6             : 
       7         198 : AP_CSVReader::RetCode AP_CSVReader::handle_unquoted_term(uint8_t c)
       8             : {
       9         198 :     if (c == separator) {
      10          38 :         set_state(State::START_OF_START_OF_TERM);
      11          38 :         return RetCode::TERM_DONE;
      12             :     }
      13         160 :     switch (c) {
      14          12 :     case '\r':
      15          12 :         set_state(State::END_OF_VECTOR_CR);
      16          12 :         return RetCode::VECTOR_DONE;
      17          16 :     case '\n':
      18          16 :         set_state(State::START_OF_START_OF_TERM);
      19          16 :         return RetCode::VECTOR_DONE;
      20         132 :     default:
      21         132 :         if (term_ofs >= term_len-1) { // -1 for null termination
      22           2 :             return RetCode::ERROR;
      23             :         }
      24         130 :         term[term_ofs++] = c;
      25         130 :         term[term_ofs] = '\0';
      26         130 :         return RetCode::OK;
      27             :     }
      28             : }
      29             : 
      30           6 : AP_CSVReader::RetCode AP_CSVReader::handle_quoted_term(uint8_t c)
      31             : {
      32           6 :     if (c == '"') {
      33           2 :         set_state(State::END_OF_QUOTED_TERM);
      34           2 :         return RetCode::OK;
      35             :     }
      36           4 :     if (state == State::END_OF_QUOTED_TERM) {
      37           2 :         if (c == separator) {
      38           0 :             set_state(State::START_OF_START_OF_TERM);
      39           0 :             return RetCode::TERM_DONE;
      40             :         }
      41             : 
      42           2 :         switch (c) {
      43           0 :         case '\r':
      44           0 :             set_state(State::END_OF_VECTOR_CR);
      45           0 :             return RetCode::VECTOR_DONE;
      46           0 :         case '\n':
      47           0 :             set_state(State::START_OF_START_OF_TERM);
      48           0 :             return RetCode::VECTOR_DONE;
      49             :         }
      50           2 :         return RetCode::ERROR;
      51             :     }
      52             : 
      53             :     // still within the quoted term, append to current value
      54           2 :     if (term_ofs >= term_len-1) { // -1 for null termination
      55           0 :         return RetCode::ERROR;
      56             :     }
      57           2 :     term[term_ofs++] = c;
      58           2 :     term[term_ofs] = '\0';
      59           2 :     return RetCode::OK;
      60             : }
      61             : 
      62         218 : AP_CSVReader::RetCode AP_CSVReader::feed(uint8_t c)
      63             : {
      64         218 :     if (term_len == 0) {
      65           0 :         return RetCode::ERROR;
      66             :     }
      67             : 
      68         218 : again:
      69         218 :     switch (state) {
      70          72 :     case State::START_OF_START_OF_TERM:
      71          72 :         term_ofs = 0;
      72          72 :         term[term_ofs] = '\0';
      73          72 :         state = State::START_OF_TERM;
      74             :         FALLTHROUGH;
      75          72 :     case State::START_OF_TERM:
      76             :         // if (c == '"') {
      77             :         //     set_state(State::START_OF_QUOTED_TERM);
      78             :         //     return RetCode::OK;
      79             :         // }
      80          72 :         if (c == '"') {
      81           2 :             set_state(State::IN_QUOTED_TERM);
      82           2 :             return RetCode::OK;
      83             :         } else {
      84          70 :             set_state(State::IN_UNQUOTED_TERM);
      85          70 :             return handle_unquoted_term(c);
      86             :         }
      87          12 :     case State::END_OF_VECTOR_CR:
      88          12 :         if (c == '\n') {
      89          12 :             set_state(State::START_OF_START_OF_TERM);
      90          12 :             return RetCode::OK;
      91             :         }
      92           0 :         set_state(State::START_OF_START_OF_TERM);
      93           0 :         goto again;
      94         128 :     case State::IN_UNQUOTED_TERM:
      95         128 :         return handle_unquoted_term(c);
      96           6 :     case State::IN_QUOTED_TERM:
      97             :     case State::END_OF_QUOTED_TERM:
      98           6 :         return handle_quoted_term(c);
      99             :     }
     100             : 
     101           0 :     return RetCode::ERROR;
     102             : }

Generated by: LCOV version 1.14