X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flengthcommon.cpp;h=72f5bbf88faf4274800b11edd344152b9ae79e4b;hb=4db3e641ed6765e005343010cb90ee8af26f8f99;hp=59ba5070020e90d469de872377fa77cd1e69ad9d;hpb=9b8773826cb2a59eb563e6f98883912ce591047e;p=lyx.git diff --git a/src/lengthcommon.cpp b/src/lengthcommon.cpp index 59ba507002..72f5bbf88f 100644 --- a/src/lengthcommon.cpp +++ b/src/lengthcommon.cpp @@ -47,6 +47,7 @@ char const * const unit_name_gui[] = { N_("Column Width %"), N_("Page Width %"), N_("Line Width %"), N_("Text Height %"), N_("Page Height %"), "" }; + Length::UNIT unitFromString(string const & data) { int i = 0; @@ -58,22 +59,6 @@ Length::UNIT unitFromString(string const & data) namespace { -/// used to return numeric values in parsing vspace -double number[4] = { 0, 0, 0, 0 }; - -/// used to return unit types in parsing vspace -Length::UNIT unit[4] = { - Length::UNIT_NONE, - Length::UNIT_NONE, - Length::UNIT_NONE, - Length::UNIT_NONE -}; - -/// the current position in the number array -int number_index; -/// the current position in the unit array -int unit_index; - /// skip n characters of input inline void lyx_advance(string & data, size_t n) { @@ -91,6 +76,8 @@ inline bool isEndOfData(string const & data) /** * nextToken - return the next token in the input * @param data input string + * @param number_index the current position in the number array + * @param unit_index the current position in the unit array * @return a char representing the type of token returned * * The possible return values are : @@ -100,7 +87,8 @@ inline bool isEndOfData(string const & data) * u a unit type (stored in unit array) * E parse error */ -char nextToken(string & data) +char nextToken(string & data, double * number, int & number_index, + Length::UNIT * unit, int & unit_index) { data = ltrim(data); @@ -221,6 +209,7 @@ LaTeXLength table[] = { } // namespace anon + const char * stringFromUnit(int unit) { if (unit < 0 || unit > num_units) @@ -247,8 +236,11 @@ bool isValidGlueLength(string const & data, GlueLength * result) // forward approach leads to very long, tedious code that would be // much harder to understand and maintain. (AS) - if (data.empty()) + if (data.empty()) { + if (result) + *result = GlueLength(); return true; + } string buffer = ltrim(data); // To make isValidGlueLength recognize negative values as @@ -267,7 +259,13 @@ bool isValidGlueLength(string const & data, GlueLength * result) } // end of hack - number_index = unit_index = 1; // entries at index 0 are sentinels + // used to return numeric values in parsing vspace + double number[4] = { 0, 0, 0, 0 }; + // used to return unit types in parsing vspace + Length::UNIT unit[4] = {Length::UNIT_NONE, Length::UNIT_NONE, + Length::UNIT_NONE, Length::UNIT_NONE}; + int number_index = 1; // entries at index 0 are sentinels + int unit_index = 1; // entries at index 0 are sentinels // construct "pattern" from "data" size_t const pattern_max_size = 20; @@ -275,7 +273,8 @@ bool isValidGlueLength(string const & data, GlueLength * result) while (!isEndOfData(buffer)) { if (pattern.size() > pattern_max_size) return false; - char const c = nextToken(buffer); + char const c = nextToken(buffer, number, number_index, unit, + unit_index); if (c == 'E') return false; pattern.push_back(c); @@ -310,8 +309,11 @@ bool isValidLength(string const & data, Length * result) // The parser may seem overkill for lengths without // glue, but since we already have it, using it is // easier than writing something from scratch. - if (data.empty()) + if (data.empty()) { + if (result) + *result = Length(); return true; + } string buffer = data; int pattern_index = 0; @@ -334,13 +336,20 @@ bool isValidLength(string const & data, Length * result) } // end of hack - number_index = unit_index = 1; // entries at index 0 are sentinels + // used to return numeric values in parsing vspace + double number[4] = { 0, 0, 0, 0 }; + // used to return unit types in parsing vspace + Length::UNIT unit[4] = {Length::UNIT_NONE, Length::UNIT_NONE, + Length::UNIT_NONE, Length::UNIT_NONE}; + int number_index = 1; // entries at index 0 are sentinels + int unit_index = 1; // entries at index 0 are sentinels // construct "pattern" from "data" while (!isEndOfData(buffer)) { if (pattern_index > 2) return false; - pattern[pattern_index] = nextToken(buffer); + pattern[pattern_index] = nextToken(buffer, number, + number_index, unit, unit_index); if (pattern[pattern_index] == 'E') return false; ++pattern_index;