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
|