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 : }