X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fhelper-fns.h;h=d2a6c9b22bc971d48e2efee119764ccaad0c2397;hb=958c867c4ffb2cafbc87fb484a20c20dab458f3b;hp=10c311edab5e6578f3bd15ee0962f508e1f30a25;hpb=12f8d6edf83762026a782661a1e458bf4d026248;p=inkscape.git diff --git a/src/helper-fns.h b/src/helper-fns.h index 10c311eda..d2a6c9b22 100644 --- a/src/helper-fns.h +++ b/src/helper-fns.h @@ -1,25 +1,47 @@ #ifndef SEEN_HELPER_FNS_H #define SEEN_HELPER_FNS_H /** \file - * + * * Some helper functions - * + * * Authors: * Felipe Corrêa da Silva Sanches - * + * * * Copyright (C) 2006 Hugo Rodrigues * * Released under GNU GPL, read the file 'COPYING' for more information */ -static double -helperfns_read_number(gchar const *value) { - if (!value) return 0; +#include +#include +#include + +// calling helperfns_read_number(string, false), it's not obvious, what +// that false stands for. helperfns_read_number(string, HELPERFNS_NO_WARNING) +// can be more clear. +#define HELPERFNS_NO_WARNING false + +/* convert localized ascii representation to double + * the function can only be used to convert numbers as given by gui elements that use localized representation + * @param value ascii representation of the number + * @return the converted number + * + * Setting warning to false disables conversion error warnings from + * this function. This can be useful in places, where the input type + * is not known beforehand. For example, see sp_feColorMatrix_set in + * sp-fecolormatrix.cpp */ +inline double helperfns_read_number(gchar const *value, bool warning = true) { + if (!value) { + g_warning("Called helperfns_read_number with value==null_ptr, this can lead to unexpected behaviour."); + return 0; + } char *end; - double ret = g_ascii_strtod(value, &end); + double ret = g_strtod(value, &end); if (*end) { - g_warning("Unable to convert \"%s\" to number", value); + if (warning) { + g_warning("helper-fns::helperfns_read_number() Unable to convert \"%s\" to number", value); + } // We could leave this out, too. If strtod can't convert // anything, it will return zero. ret = 0; @@ -27,7 +49,7 @@ helperfns_read_number(gchar const *value) { return ret; } -static bool helperfns_read_bool(gchar const *value, bool default_value){ +inline bool helperfns_read_bool(gchar const *value, bool default_value){ if (!value) return default_value; switch(value[0]){ case 't': @@ -39,7 +61,63 @@ static bool helperfns_read_bool(gchar const *value, bool default_value){ } return default_value; } - + +/* convert localized ascii representation to double + * the function can only be used to convert numbers as given by gui elements that use localized representation + * numbers are delimeted by space + * @param value ascii representation of the number + * @param size number of elements in string + * @return the vector of the converted numbers + */ +inline std::vector helperfns_read_vector(const gchar* value, int size){ + std::vector v(size, (gdouble) 0); + std::istringstream is(value); + for(int i = 0; i < size; i++){ + std::string str; + is >> str; + char *end; + + double ret = g_strtod(str.c_str(), &end); + if (*end) { + g_warning("helper-fns::helperfns_read_vector() Unable to convert \"%s\" to number", str.c_str()); + // We could leave this out, too. If strtod can't convert + // anything, it will return zero. + ret = 0; + } + v[i] = ret; + }; + return v; +} + +/* convert localized ascii representation to double + * the function can only be used to convert numbers as given by gui elements that use localized representation + * numbers are delimeted by space + * @param value ascii representation of the number + * @return the vector of the converted numbers + */ +inline std::vector helperfns_read_vector(const gchar* value){ + std::vector v; + + gchar const* beg = value; + while(isspace(*beg)) beg++; + while(*beg) + { + char *end; + double ret = g_strtod(beg, &end); + if (end==beg){ + g_warning("helper-fns::helperfns_read_vector() Unable to convert \"%s\" to number", beg); + // We could leave this out, too. If strtod can't convert + // anything, it will return zero. + ret = 0; + } + v.push_back(ret); + + beg = end; + while(isspace(*beg)) beg++; + } + return v; +} + #endif /* !SEEN_HELPER_FNS_H */ /*