OpenFPGA/libs/libpugiutil/src/pugixml_loc.hpp

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