1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
|
// Boost.Units - A C++ library for zero-overhead dimensional analysis and
// unit/quantity manipulation and conversion
//
// Copyright (C) 2003-2008 Matthias Christian Schabel
// Copyright (C) 2007-2008 Steven Watanabe
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <iterator>
#include <string>
#include <utility>
#include <set>
#include <map>
#include <iostream>
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/regex.hpp>
namespace filesystem = boost::filesystem;
//struct stop {
// stop() { char c; std::cin >> c; }
//} stop_;
boost::regex whitespace("\\s*");
boost::regex blank_line("\\A(?://.*$|\\s)*");
boost::regex include_guard("#ifndef (\\w+)\n#define \\1\n");
boost::regex base_unit("(\\w*_base_unit)(?:;| :)");
std::pair<std::string, std::string> get_base_unit_and_include_guard(const filesystem::path& path) {
filesystem::ifstream in(path);
std::string contents(std::istreambuf_iterator<char>(in.rdbuf()), std::istreambuf_iterator<char>());
in.close();
boost::smatch include_guard_match;
boost::regex_search(contents, include_guard_match, include_guard);
boost::smatch base_unit_match;
boost::regex_search(contents, base_unit_match, base_unit);
std::cout << "creating map entry: " << base_unit_match[1].str() << " -> "<< include_guard_match[1].str() << std::endl;
return(std::make_pair(base_unit_match[1].str(), include_guard_match[1].str()));
}
int main() {
std::cout << "In main" << std::endl;
std::map<std::string, std::string> include_guards;
for(filesystem::directory_iterator begin(filesystem::path("../../../boost/units/systems/base_units")), end; begin != end; ++begin) {
if(begin->status().type() == filesystem::regular_file) {
std::cout << "reading file: " << begin->path() << std::endl;
include_guards.insert(get_base_unit_and_include_guard(begin->path()));
}
}
std::cout << "reading conversions file" << std::endl;
filesystem::ifstream conversions_file(filesystem::path("../../../boost/units/systems/base_units/detail/conversions.hpp"));
std::string line;
int line_count = 0;
boost::smatch match;
std::set<std::string> conversion_guards;
try {
boost::regex include_guard_regex("#if defined\\((\\w+)\\) && defined\\((\\w+)\\) &&\\\\");
std::cout << __LINE__ << std::endl;
boost::regex conversion_guard_regex(" !defined\\((\\w+)\\)");
std::cout << __LINE__ << std::endl;
boost::regex set_conversion_guard(" #define (\\w+)");
std::cout << __LINE__ << std::endl;
boost::regex include_conversion(" #include <boost/units/conversion.hpp>");
std::cout << __LINE__ << std::endl;
boost::regex include_absolute(" #include <boost/units/absolute.hpp>");
std::cout << __LINE__ << std::endl;
boost::regex define_conversion_factor(" BOOST_UNITS_DEFINE_CONVERSION_FACTOR\\(boost::units::(\\w+_base_unit), boost::units::(\\w+_base_unit), \\w+, (?:[\\d\\.e\\-/ ]*|one\\(\\))\\);");
std::cout << __LINE__ << std::endl;
boost::regex define_conversion_offset(" BOOST_UNITS_DEFINE_CONVERSION_OFFSET\\(boost::units::(\\w+_base_unit), boost::units::(\\w+_base_unit), \\w+, [\\d\\.e+\\* \\-/]*\\);");
std::cout << __LINE__ << std::endl;
boost::regex endif("#endif");
std::cout << __LINE__ << std::endl;
while(std::getline(conversions_file, line)) {
++line_count;
std::cout << "on line: " << line_count << std::endl;
if(boost::regex_match(line, match, blank_line)) {
continue;
} else if(boost::regex_match(line, match, include_guard_regex)) {
std::string guard1, guard2, unit1, unit2, conversion_guard;
bool uses_absolute = false;
guard1 = match[1].str();
guard2 = match[2].str();
if(!std::getline(conversions_file, line)) { std::cerr << "unexpected end of file." << std::endl; return(1); } ++line_count;
if(!boost::regex_match(line, match, conversion_guard_regex)) { std::cerr << "error on line: " << line_count << std::endl; return(1); }
conversion_guard = match[1].str();
if(!conversion_guards.insert(conversion_guard).second){ std::cerr << "error on line: " << line_count << std::endl; return(1); }
if(!std::getline(conversions_file, line)) { std::cerr << "unexpected end of file." << std::endl; return(1); } ++line_count;
if(!boost::regex_match(line, match, set_conversion_guard)) { std::cerr << "error on line: " << line_count << std::endl; return(1); }
std::cout << __LINE__ << std::endl;
if(match[1].str() != conversion_guard) { std::cerr << "error on line: " << line_count << std::endl; return(1); }
if(!std::getline(conversions_file, line)) { std::cerr << "unexpected end of file." << std::endl; return(1); } ++line_count;
if(!boost::regex_match(line, match, include_conversion)) { std::cerr << "error on line: " << line_count << std::endl; return(1); }
std::cout << __LINE__ << std::endl;
if(!std::getline(conversions_file, line)) { std::cerr << "unexpected end of file." << std::endl; return(1); } ++line_count;
if(boost::regex_match(line, match, include_absolute)) {
uses_absolute = true;
if(!std::getline(conversions_file, line)) { std::cerr << "unexpected end of file." << std::endl; return(1); } ++line_count;
}
std::cout << __LINE__ << std::endl;
if(!boost::regex_match(line, match, define_conversion_factor)) { std::cerr << "error on line: " << line_count << std::endl; return(1); }
std::cout << __LINE__ << ": " << line << std::endl;
unit1 = match[1].str();
unit2 = match[2].str();
if(!((include_guards[unit1] == guard1 && include_guards[unit2] == guard2) ||
(include_guards[unit1] == guard2 && include_guards[unit2] == guard1))) {
std::cerr << "guard1: " << guard1 << std::endl;
std::cerr << "guard2: " << guard2 << std::endl;
std::cerr << "unit1: " << unit1 << std::endl;
std::cerr << "unit2: " << unit2 << std::endl;
std::cerr << "include_guards[unit1]: " << include_guards[unit1] << std::endl;
std::cerr << "include_guards[unit2]: " << include_guards[unit2] << std::endl;
{ std::cerr << "error on line: " << line_count << std::endl; return(1); }
}
std::cout << __LINE__ << std::endl;
if(!std::getline(conversions_file, line)) { std::cerr << "unexpected end of file." << std::endl; return(1); } ++line_count;
std::cout << __LINE__ << std::endl;
if(boost::regex_match(line, match, define_conversion_offset)) {
if(!uses_absolute) { std::cerr << "error on line: " << line_count << std::endl; return(1); }
std::cout << __LINE__ << std::endl;
if(match[1].str() != unit1 || match[2].str() != unit2) { std::cerr << "error on line: " << line_count << std::endl; return(1); }
if(!std::getline(conversions_file, line)) { std::cerr << "unexpected end of file." << std::endl; return(1); } ++line_count;
} else {
if(uses_absolute) { std::cerr << "error on line: " << line_count << std::endl; return(1); }
}
std::cout << __LINE__ << std::endl;
if(!boost::regex_match(line, match, endif)) { std::cerr << "error on line: " << line_count << std::endl; return(1); }
}
}
} catch(std::exception& e) {
std::cerr << e.what() << std::endl;
return(1);
}
}
|