1 // Boost.Units - A C++ library for zero-overhead dimensional analysis and
2 // unit/quantity manipulation and conversion
4 // Copyright (C) 2003-2008 Matthias Christian Schabel
5 // Copyright (C) 2007-2008 Steven Watanabe
7 // Distributed under the Boost Software License, Version 1.0. (See
8 // accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
18 #include <boost/filesystem.hpp>
19 #include <boost/filesystem/fstream.hpp>
20 #include <boost/regex.hpp>
22 namespace filesystem
= boost::filesystem
;
25 // stop() { char c; std::cin >> c; }
28 boost::regex
whitespace("\\s*");
29 boost::regex
blank_line("\\A(?://.*$|\\s)*");
31 boost::regex
include_guard("#ifndef (\\w+)\n#define \\1\n");
32 boost::regex
base_unit("(\\w*_base_unit)(?:;| :)");
34 std::pair
<std::string
, std::string
> get_base_unit_and_include_guard(const filesystem::path
& path
) {
35 filesystem::ifstream
in(path
);
36 std::string
contents(std::istreambuf_iterator
<char>(in
.rdbuf()), std::istreambuf_iterator
<char>());
38 boost::smatch include_guard_match
;
39 boost::regex_search(contents
, include_guard_match
, include_guard
);
40 boost::smatch base_unit_match
;
41 boost::regex_search(contents
, base_unit_match
, base_unit
);
42 std::cout
<< "creating map entry: " << base_unit_match
[1].str() << " -> "<< include_guard_match
[1].str() << std::endl
;
43 return(std::make_pair(base_unit_match
[1].str(), include_guard_match
[1].str()));
47 std::cout
<< "In main" << std::endl
;
48 std::map
<std::string
, std::string
> include_guards
;
49 for(filesystem::directory_iterator
begin(filesystem::path("../../../boost/units/systems/base_units")), end
; begin
!= end
; ++begin
) {
50 if(begin
->status().type() == filesystem::regular_file
) {
51 std::cout
<< "reading file: " << begin
->path() << std::endl
;
52 include_guards
.insert(get_base_unit_and_include_guard(begin
->path()));
56 std::cout
<< "reading conversions file" << std::endl
;
57 filesystem::ifstream
conversions_file(filesystem::path("../../../boost/units/systems/base_units/detail/conversions.hpp"));
64 std::set
<std::string
> conversion_guards
;
68 boost::regex
include_guard_regex("#if defined\\((\\w+)\\) && defined\\((\\w+)\\) &&\\\\");
69 std::cout
<< __LINE__
<< std::endl
;
70 boost::regex
conversion_guard_regex(" !defined\\((\\w+)\\)");
71 std::cout
<< __LINE__
<< std::endl
;
72 boost::regex
set_conversion_guard(" #define (\\w+)");
73 std::cout
<< __LINE__
<< std::endl
;
74 boost::regex
include_conversion(" #include <boost/units/conversion.hpp>");
75 std::cout
<< __LINE__
<< std::endl
;
76 boost::regex
include_absolute(" #include <boost/units/absolute.hpp>");
77 std::cout
<< __LINE__
<< std::endl
;
78 boost::regex
define_conversion_factor(" BOOST_UNITS_DEFINE_CONVERSION_FACTOR\\(boost::units::(\\w+_base_unit), boost::units::(\\w+_base_unit), \\w+, (?:[\\d\\.e\\-/ ]*|one\\(\\))\\);");
79 std::cout
<< __LINE__
<< std::endl
;
80 boost::regex
define_conversion_offset(" BOOST_UNITS_DEFINE_CONVERSION_OFFSET\\(boost::units::(\\w+_base_unit), boost::units::(\\w+_base_unit), \\w+, [\\d\\.e+\\* \\-/]*\\);");
81 std::cout
<< __LINE__
<< std::endl
;
82 boost::regex
endif("#endif");
83 std::cout
<< __LINE__
<< std::endl
;
85 while(std::getline(conversions_file
, line
)) {
87 std::cout
<< "on line: " << line_count
<< std::endl
;
88 if(boost::regex_match(line
, match
, blank_line
)) {
90 } else if(boost::regex_match(line
, match
, include_guard_regex
)) {
91 std::string guard1
, guard2
, unit1
, unit2
, conversion_guard
;
92 bool uses_absolute
= false;
94 guard1
= match
[1].str();
95 guard2
= match
[2].str();
96 if(!std::getline(conversions_file
, line
)) { std::cerr
<< "unexpected end of file." << std::endl
; return(1); } ++line_count
;
97 if(!boost::regex_match(line
, match
, conversion_guard_regex
)) { std::cerr
<< "error on line: " << line_count
<< std::endl
; return(1); }
99 conversion_guard
= match
[1].str();
100 if(!conversion_guards
.insert(conversion_guard
).second
){ std::cerr
<< "error on line: " << line_count
<< std::endl
; return(1); }
102 if(!std::getline(conversions_file
, line
)) { std::cerr
<< "unexpected end of file." << std::endl
; return(1); } ++line_count
;
103 if(!boost::regex_match(line
, match
, set_conversion_guard
)) { std::cerr
<< "error on line: " << line_count
<< std::endl
; return(1); }
104 std::cout
<< __LINE__
<< std::endl
;
106 if(match
[1].str() != conversion_guard
) { std::cerr
<< "error on line: " << line_count
<< std::endl
; return(1); }
108 if(!std::getline(conversions_file
, line
)) { std::cerr
<< "unexpected end of file." << std::endl
; return(1); } ++line_count
;
109 if(!boost::regex_match(line
, match
, include_conversion
)) { std::cerr
<< "error on line: " << line_count
<< std::endl
; return(1); }
110 std::cout
<< __LINE__
<< std::endl
;
112 if(!std::getline(conversions_file
, line
)) { std::cerr
<< "unexpected end of file." << std::endl
; return(1); } ++line_count
;
113 if(boost::regex_match(line
, match
, include_absolute
)) {
114 uses_absolute
= true;
115 if(!std::getline(conversions_file
, line
)) { std::cerr
<< "unexpected end of file." << std::endl
; return(1); } ++line_count
;
118 std::cout
<< __LINE__
<< std::endl
;
119 if(!boost::regex_match(line
, match
, define_conversion_factor
)) { std::cerr
<< "error on line: " << line_count
<< std::endl
; return(1); }
121 std::cout
<< __LINE__
<< ": " << line
<< std::endl
;
122 unit1
= match
[1].str();
123 unit2
= match
[2].str();
124 if(!((include_guards
[unit1
] == guard1
&& include_guards
[unit2
] == guard2
) ||
125 (include_guards
[unit1
] == guard2
&& include_guards
[unit2
] == guard1
))) {
126 std::cerr
<< "guard1: " << guard1
<< std::endl
;
127 std::cerr
<< "guard2: " << guard2
<< std::endl
;
128 std::cerr
<< "unit1: " << unit1
<< std::endl
;
129 std::cerr
<< "unit2: " << unit2
<< std::endl
;
130 std::cerr
<< "include_guards[unit1]: " << include_guards
[unit1
] << std::endl
;
131 std::cerr
<< "include_guards[unit2]: " << include_guards
[unit2
] << std::endl
;
132 { std::cerr
<< "error on line: " << line_count
<< std::endl
; return(1); }
134 std::cout
<< __LINE__
<< std::endl
;
136 if(!std::getline(conversions_file
, line
)) { std::cerr
<< "unexpected end of file." << std::endl
; return(1); } ++line_count
;
137 std::cout
<< __LINE__
<< std::endl
;
138 if(boost::regex_match(line
, match
, define_conversion_offset
)) {
139 if(!uses_absolute
) { std::cerr
<< "error on line: " << line_count
<< std::endl
; return(1); }
140 std::cout
<< __LINE__
<< std::endl
;
141 if(match
[1].str() != unit1
|| match
[2].str() != unit2
) { std::cerr
<< "error on line: " << line_count
<< std::endl
; return(1); }
142 if(!std::getline(conversions_file
, line
)) { std::cerr
<< "unexpected end of file." << std::endl
; return(1); } ++line_count
;
144 if(uses_absolute
) { std::cerr
<< "error on line: " << line_count
<< std::endl
; return(1); }
146 std::cout
<< __LINE__
<< std::endl
;
149 if(!boost::regex_match(line
, match
, endif
)) { std::cerr
<< "error on line: " << line_count
<< std::endl
; return(1); }
154 } catch(std::exception
& e
) {
155 std::cerr
<< e
.what() << std::endl
;