/* * Convert a string to a size and perform syntax verification. */ static int strtosize (const char* start, unsigned long* psize) { unsigned long size; char* end; size = stoui(start, &end, 0); if (start != end) { if ((*end & 0xdf) == 'K') { size = size * 1024; end++; } else if ((*end & 0xdf) == 'M') { size = size * 1024 * 1024; end++; } else if ((*end & 0xdf) == 'G') { size = size * 1024 * 1024 * 1024; end++; } if ((*end == ',') || (*end == '\0')) { *psize = size; return 0; } } *psize = 0; return -EINVAL; }
sample hydrator:: process_sample(const std::string& line, const unsigned int line_number) const { std::vector<std::string> tokens; boost::split(tokens, line, boost::is_space(), boost::token_compress_on); BOOST_LOG_SEV(lg, trace) << "Parsing line with tokens: " << tokens; if (tokens.size() < minimum_number_of_fields) { BOOST_LOG_SEV(lg, error) << missing_fields << ". Expected: " << minimum_number_of_fields << " Actual: " << tokens.size(); BOOST_THROW_EXCEPTION(hydration_error(missing_fields)); } unsigned int field_number(0); try { sample r; r.number(stoui(tokens[field_number])); const auto usi(stoi(tokens[++field_number])); r.unparsed_structure_identifier(usi); r.structure_identifier(to_structure_identifier_type(usi)); point p; p.x(stod(tokens[++field_number])); p.y(stod(tokens[++field_number])); p.z(stod(tokens[++field_number])); r.position(p); r.radius(stod(tokens[++field_number])); r.parent(stoi(tokens[++field_number])); r.line_number(line_number); return r; } catch (const std::invalid_argument& e) { BOOST_LOG_SEV(lg, error) << "Conversion error. Field " << field_number << ". Value: '" << tokens[field_number] << "'"; hydration_error he(invalid_field_value); he << error_in_field(field_number); throw he; } catch (const std::out_of_range& e) { BOOST_LOG_SEV(lg, error) << "Conversion error. Field " << field_number << ". Value: '" << tokens[field_number] << "'"; hydration_error he(invalid_field_value); he << error_in_field(field_number); throw he; } }
/* * Convert a string to a number and perform syntax verification. */ static int strtonum (const char* start, unsigned long* pnum) { unsigned long num; char* end; num = stoui(start, &end, 0); if ((start != end) && ((*end == ',') || (*end == '\0'))) { *pnum = num; return 0; } *pnum = 0; return -EINVAL; }
unsigned int VString::toui() const { return stoui((char*)data, sz); }