Value *Parser::parse_value(void) { int c; Value *value; c = read_byte(); switch (c) { case trace::TYPE_NULL: value = new Null; break; case trace::TYPE_FALSE: value = new Bool(false); break; case trace::TYPE_TRUE: value = new Bool(true); break; case trace::TYPE_SINT: value = parse_sint(); break; case trace::TYPE_UINT: value = parse_uint(); break; case trace::TYPE_FLOAT: value = parse_float(); break; case trace::TYPE_DOUBLE: value = parse_double(); break; case trace::TYPE_STRING: value = parse_string(); break; case trace::TYPE_ENUM: value = parse_enum(); break; case trace::TYPE_BITMASK: value = parse_bitmask(); break; case trace::TYPE_ARRAY: value = parse_array(); break; case trace::TYPE_STRUCT: value = parse_struct(); break; case trace::TYPE_BLOB: value = parse_blob(); break; case trace::TYPE_OPAQUE: value = parse_opaque(); break; default: std::cerr << "error: unknown type " << c << "\n"; exit(1); case -1: value = NULL; break; } #if TRACE_VERBOSE if (value) { std::cerr << "\tVALUE " << value << "\n"; } #endif return value; }
uint8_t Nordic::term_complete() { uint8_t ret_val = _SENTENCE_NONE; // the first term determines the sentence type if (_term_number == 0) { if (!nstrcmp(_term, _LOC_TERM)) _sentence_type = _SENTENCE_LOC; else if (!nstrcmp(_term, _HRM_TERM)) _sentence_type = _SENTENCE_HRM; else if (!nstrcmp(_term, _CAD_TERM)) _sentence_type = _SENTENCE_CAD; else if (!nstrcmp(_term, _ANCS_TERM)) _sentence_type = _SENTENCE_ANCS; else if (!nstrcmp(_term, _PC_TERM)) _sentence_type = _SENTENCE_PC; else if (!nstrcmp(_term, _BTN_TERM)) _sentence_type = _SENTENCE_BTN; else if (!nstrcmp(_term, _DBG_TERM)) _sentence_type = _SENTENCE_DBG; else _sentence_type = _SENTENCE_OTHER; return false; } if (_sentence_type != _SENTENCE_OTHER && _term[0]) { // on doit parser l'info (_term) switch (COMBINE(_sentence_type, _term_number)) { case COMBINE(_SENTENCE_LOC, 1): _sec_jour = natol(_term); break; case COMBINE(_SENTENCE_LOC, 2): _lat = parse_sint(); break; case COMBINE(_SENTENCE_LOC, 3): _lon = parse_sint(); break; case COMBINE(_SENTENCE_LOC, 4): _ele = parse_sint(); break; case COMBINE(_SENTENCE_LOC, 5): _gps_speed = parse_sint(); ret_val = _SENTENCE_LOC; break; case COMBINE(_SENTENCE_HRM, 1): _bpm = natol(_term); break; case COMBINE(_SENTENCE_HRM, 2): _rr = natol(_term); ret_val = _SENTENCE_HRM; break; case COMBINE(_SENTENCE_CAD, 1): _rpm = natol(_term); break; case COMBINE(_SENTENCE_CAD, 2): _cad_speed = natol(_term); ret_val = _SENTENCE_CAD; break; case COMBINE(_SENTENCE_ANCS, 1): _ancs_type = natol(_term); break; case COMBINE(_SENTENCE_ANCS, 2): if (_ancs_type == 0) { _ancs_msg = _term; ret_val = _SENTENCE_ANCS; } else { _ancs_title = _term; } break; case COMBINE(_SENTENCE_ANCS, 3): _ancs_msg = _term; ret_val = _SENTENCE_ANCS; break; case COMBINE(_SENTENCE_DBG, 1): _dbg_type = natol(_term); break; case COMBINE(_SENTENCE_DBG, 2): _dbg_code = natol(_term); break; case COMBINE(_SENTENCE_DBG, 3): _dbg_line = natol(_term); if (_dbg_type == 0) { ret_val = _SENTENCE_DBG; } break; case COMBINE(_SENTENCE_DBG, 4): if (_dbg_type == 1) { _dbg_file = _term; ret_val = _SENTENCE_DBG; } break; case COMBINE(_SENTENCE_BTN, 1): _btn = natol(_term) + 1; ret_val = _SENTENCE_BTN; break; case COMBINE(_SENTENCE_PC, 1): _pc = natol(_term); ret_val = _SENTENCE_PC; break; } } return ret_val; }