/*
     * 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;
}
Пример #2
0
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;
}
Пример #4
0
unsigned int VString::toui() const { return stoui((char*)data, sz); }