52 lines
1.3 KiB
C++
52 lines
1.3 KiB
C++
|
#ifndef PUGIXML_LOC_H
|
||
|
#define PUGIXML_LOC_H
|
||
|
/*
|
||
|
* This file contains utilities for the PUGI XML parser,
|
||
|
* hanlding the retrieval of line numbers (useful for error messages)
|
||
|
*/
|
||
|
|
||
|
#include <vector>
|
||
|
#include "pugixml.hpp"
|
||
|
|
||
|
namespace pugiutil {
|
||
|
|
||
|
//pugi offset to line/col data based on: https://stackoverflow.com/questions/21003471/convert-pugixmls-result-offset-to-column-line
|
||
|
class loc_data {
|
||
|
public:
|
||
|
loc_data() = default;
|
||
|
|
||
|
loc_data(std::string filename_val)
|
||
|
: filename_(filename_val) {
|
||
|
build_loc_data();
|
||
|
}
|
||
|
|
||
|
//The filename this location data is for
|
||
|
const std::string& filename() const { return filename_; }
|
||
|
const char* filename_c_str() const { return filename_.c_str(); }
|
||
|
|
||
|
//Convenience wrapper which takes xml_nodes
|
||
|
std::size_t line(pugi::xml_node node) const {
|
||
|
return line(node.offset_debug());
|
||
|
}
|
||
|
|
||
|
//Convenience wrapper which takes xml_nodes
|
||
|
std::size_t col(pugi::xml_node node) const {
|
||
|
return col(node.offset_debug());
|
||
|
}
|
||
|
|
||
|
//Return the line number from the given offset
|
||
|
std::size_t line(std::ptrdiff_t offset) const;
|
||
|
|
||
|
//Return the column number from the given offset
|
||
|
std::size_t col(std::ptrdiff_t offset) const;
|
||
|
|
||
|
private:
|
||
|
void build_loc_data();
|
||
|
|
||
|
std::string filename_;
|
||
|
std::vector<std::ptrdiff_t> offsets_;
|
||
|
};
|
||
|
} // namespace pugiutil
|
||
|
|
||
|
#endif
|