static void parse_elements (string_view name, TypeDesc type, const char *type_code, string_view value, ImageIOParameter ¶m) { int num_items = type.numelements() * type.aggregate; T *data = (T*) param.data(); // Erase any leading whitespace value.remove_prefix (value.find_first_not_of (" \t")); for (int i = 0; i < num_items; ++i) { // Make a temporary copy so we for sure have a 0-terminated string. std::string temp = value; // Grab the first value from it sscanf (temp.c_str(), type_code, &data[i]); // Skip the value (eat until we find a delimiter -- space, comma, tab) value.remove_prefix (value.find_first_of (" ,\t")); // Skip the delimiter value.remove_prefix (value.find_first_not_of (" ,\t")); if (value.empty()) break; // done if nothing left to parse } }
static string ProcessMetasymbols(string_view Str, subst_data& Data) { string Result; Result.reserve(Str.size()); while (!Str.empty()) { if (Str.front() == L'!') { Str = ProcessMetasymbol(Str, Data, Result); } else { Result.push_back(Str.front()); Str.remove_prefix(1); } } return Result; }
void ltrim(string_view& s) noexcept { const auto pos = s.find_first_not_of(Space); s.remove_prefix(pos != string_view::npos ? pos : s.size()); }
// Add the attribute -- figure out the type void parse_param(string_view paramname, string_view val, ImageSpec& spec) { TypeDesc type; // start out unknown // If the param string starts with a type name, that's what it is if (size_t typeportion = type.fromstring(paramname)) { paramname.remove_prefix(typeportion); Strutil::skip_whitespace(paramname); } // If the value string starts with a type name, that's what it is else if (size_t typeportion = type.fromstring(val)) { val.remove_prefix(typeportion); Strutil::skip_whitespace(val); } if (type.basetype == TypeDesc::UNKNOWN) { // If we didn't find a type name, try to guess if (val.size() >= 2 && val.front() == '\"' && val.back() == '\"') { // Surrounded by quotes? it's a string (strip off the quotes) val.remove_prefix(1); val.remove_suffix(1); type = TypeDesc::TypeString; } else if (Strutil::string_is<int>(val)) { // Looks like an int, is an int type = TypeDesc::TypeInt; } else if (Strutil::string_is<float>(val)) { // Looks like a float, is a float type = TypeDesc::TypeFloat; } else { // Everything else is assumed a string type = TypeDesc::TypeString; } } // Read the values and set the attribute int n = type.numelements() * type.aggregate; if (type.basetype == TypeDesc::INT) { std::vector<int> values(n); for (int i = 0; i < n; ++i) { Strutil::parse_int(val, values[i]); Strutil::parse_char(val, ','); // optional } if (n > 0) spec.attribute(paramname, type, &values[0]); } if (type.basetype == TypeDesc::FLOAT) { std::vector<float> values(n); for (int i = 0; i < n; ++i) { Strutil::parse_float(val, values[i]); Strutil::parse_char(val, ','); // optional } if (n > 0) spec.attribute(paramname, type, &values[0]); } else if (type.basetype == TypeDesc::STRING) { std::vector<ustring> values(n); for (int i = 0; i < n; ++i) { string_view v; Strutil::parse_string(val, v); Strutil::parse_char(val, ','); // optional values[i] = v; } if (n > 0) spec.attribute(paramname, type, &values[0]); } }