diff options
author | Peter Breitenlohner <peb@mppmu.mpg.de> | 2015-09-29 07:38:47 +0000 |
---|---|---|
committer | Peter Breitenlohner <peb@mppmu.mpg.de> | 2015-09-29 07:38:47 +0000 |
commit | 336137654c829d8c5ac0da382f5bf883c950ed67 (patch) | |
tree | f49b0314890048978699c10923236df83c34c1d2 /Build/source/texk/dvisvgm/dvisvgm-1.11/src/PageRanges.cpp | |
parent | 262d7479d3f5a6b3c66ccec160af2122333996c2 (diff) |
dvisvgm 1.11
git-svn-id: svn://tug.org/texlive/trunk@38494 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-1.11/src/PageRanges.cpp')
-rw-r--r-- | Build/source/texk/dvisvgm/dvisvgm-1.11/src/PageRanges.cpp | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-1.11/src/PageRanges.cpp b/Build/source/texk/dvisvgm/dvisvgm-1.11/src/PageRanges.cpp new file mode 100644 index 00000000000..8e6339c72e8 --- /dev/null +++ b/Build/source/texk/dvisvgm/dvisvgm-1.11/src/PageRanges.cpp @@ -0,0 +1,87 @@ +/************************************************************************* +** PageRanges.cpp ** +** ** +** This file is part of dvisvgm -- the DVI to SVG converter ** +** Copyright (C) 2005-2015 Martin Gieseking <martin.gieseking@uos.de> ** +** ** +** This program is free software; you can redistribute it and/or ** +** modify it under the terms of the GNU General Public License as ** +** published by the Free Software Foundation; either version 3 of ** +** the License, or (at your option) any later version. ** +** ** +** This program is distributed in the hope that it will be useful, but ** +** WITHOUT ANY WARRANTY; without even the implied warranty of ** +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** +** GNU General Public License for more details. ** +** ** +** You should have received a copy of the GNU General Public License ** +** along with this program; if not, see <http://www.gnu.org/licenses/>. ** +*************************************************************************/ + +#include <config.h> +#include <sstream> +#include "InputBuffer.h" +#include "InputReader.h" +#include "PageRanges.h" + +#include "macros.h" + +using namespace std; + + +/** Analyzes a string describing a range sequence. + * Syntax: ([0-9]+(-[0-9]*)?)|(-[0-9]+)(,([0-9]+(-[0-9]*)?)|(-[0-9]+))* + * @param[in] str string to parse + * @param[in] max_page greatest allowed value + * @return true on success; false denotes a syntax error */ +bool PageRanges::parse (string str, int max_page) { + StringInputBuffer ib(str); + BufferInputReader ir(ib); + while (ir) { + int first=1; + int last=max_page; + ir.skipSpace(); + if (!isdigit(ir.peek()) && ir.peek() != '-') + return false; + + if (isdigit(ir.peek())) + first = ir.getInt(); + ir.skipSpace(); + if (ir.peek() == '-') { + while (ir.peek() == '-') + ir.get(); + ir.skipSpace(); + if (isdigit(ir.peek())) + last = ir.getInt(); + } + else + last = first; + ir.skipSpace(); + if (ir.peek() == ',') { + ir.get(); + if (ir.eof()) + return false; + } + else if (!ir.eof()) + return false; + if (first > last) + swap(first, last); + first = max(1, first); + last = max(first, last); + if (max_page > 0) { + first = min(first, max_page); + last = min(last, max_page); + } + addRange(first, last); + } + return true; +} + + +/** Returns the number of pages. */ +size_t PageRanges::numberOfPages () const { + size_t sum=0; + for (NumericRanges<int>::ConstIterator it=begin(); it != end(); ++it) + sum += it->second - it->first + 1; + return sum; +} |