xref: /netbsd-src/external/gpl3/gcc/dist/libstdc++-v3/doc/doxygen/stdheader.cc (revision b1e838363e3c6fc78a55519254d99869742dd33c)
14fee23f9Smrg #include <string>
2*b1e83836Smrg #include <string_view>
34fee23f9Smrg #include <map>
4*b1e83836Smrg #include <set>
5*b1e83836Smrg #include <algorithm>
6*b1e83836Smrg #include <iterator>
74fee23f9Smrg #include <iostream>
84fee23f9Smrg 
9*b1e83836Smrg // This is a slow larval-stage kludge to help massage the generated man
10*b1e83836Smrg // pages.  It's used like this:
11*b1e83836Smrg const std::string_view usage = R"(
12*b1e83836Smrg Takes on stdin, whitespace-separated words of the form
134fee23f9Smrg 
14*b1e83836Smrg     [bits/]stl_foo.h
15*b1e83836Smrg     [bits/]std_foo.h
16*b1e83836Smrg 
17*b1e83836Smrg and writes on stdout the nearest matching standard header name.
18*b1e83836Smrg 
19*b1e83836Smrg Takes no command-line arguments.
20*b1e83836Smrg )";
21*b1e83836Smrg 
22*b1e83836Smrg // List of standard headers
23*b1e83836Smrg std::set<std::string_view> std_headers;
24*b1e83836Smrg // Map of partial header filenames to standard headers.
25*b1e83836Smrg std::map<std::string_view, std::string_view>  headers;
264fee23f9Smrg 
init_map()274fee23f9Smrg void init_map()
284fee23f9Smrg {
294fee23f9Smrg     // Enter the glamourous world of data entry!!  Maintain these!
30*b1e83836Smrg     // Because the map_header function removes common prefixes and suffixes,
31*b1e83836Smrg     // a header "bits/st[dl]_foo.h" will automatically map to "foo" if that
32*b1e83836Smrg     // is a standard header, so we don't need to list those cases here.
33*b1e83836Smrg     headers["atomic_base.h"]            = "atomic";
34*b1e83836Smrg     headers["atomic_lockfree_defines.h"] = "atomic";
35*b1e83836Smrg     headers["atomic_timed_wait.h"]      = "atomic";
36*b1e83836Smrg     headers["atomic_wait.h"]            = "atomic";
37*b1e83836Smrg     headers["algorithmfwd.h"]           = "algorithm";
384fee23f9Smrg     headers["algo.h"]                   = "algorithm";
394fee23f9Smrg     headers["algobase.h"]               = "algorithm";
40*b1e83836Smrg     headers["ranges_algo.h"]            = "algorithm";
41*b1e83836Smrg     headers["ranges_algobase.h"]        = "algorithm";
424fee23f9Smrg     headers["heap.h"]                   = "algorithm";
43*b1e83836Smrg     headers["exception_ptr.h"]          = "exception";
44*b1e83836Smrg     headers["nested_exception.h"]       = "exception";
45*b1e83836Smrg     headers["fs_dir.h"]                 = "filesystem";
46*b1e83836Smrg     headers["fs_fwd.h"]                 = "filesystem";
47*b1e83836Smrg     headers["fs_ops.h"]                 = "filesystem";
48*b1e83836Smrg     headers["fs_path.h"]                = "filesystem";
49*b1e83836Smrg     headers["binders.h"]                = "functional";
504fee23f9Smrg     headers["function.h"]               = "functional";
51*b1e83836Smrg     headers["functional_hash.h"]        = "functional";
52*b1e83836Smrg     headers["mofunc_impl.h"]            = "functional";
53*b1e83836Smrg     headers["move_only_function.h"]     = "functional";
54*b1e83836Smrg     headers["invoke.h"]                 = "functional";
55*b1e83836Smrg     headers["refwrap.h"]                = "functional";
56*b1e83836Smrg     headers["quoted_string.h"]          = "iomanip";
57*b1e83836Smrg     headers["ios_base.h"]               = "ios";
584fee23f9Smrg     headers["basic_ios.h"]              = "ios";
594fee23f9Smrg     headers["basic_ios.tcc"]            = "ios";
604fee23f9Smrg     headers["iosfwd.h"]                 = "iosfwd";
614fee23f9Smrg     headers["iostream.h"]               = "iostream";
624fee23f9Smrg     headers["iterator_base_funcs.h"]    = "iterator";
634fee23f9Smrg     headers["iterator_base_types.h"]    = "iterator";
644fee23f9Smrg     headers["stream_iterator.h"]        = "iterator";
654fee23f9Smrg     headers["streambuf_iterator.h"]     = "iterator";
66*b1e83836Smrg     headers["iterator_concepts.h"]      = "iterator";
67*b1e83836Smrg     headers["range_access.h"]           = "iterator";
684fee23f9Smrg     headers["codecvt.h"]                = "locale";
69*b1e83836Smrg     headers["c++locale.h"]              = "locale";
704fee23f9Smrg     headers["localefwd.h"]              = "locale";
71*b1e83836Smrg     headers["ctype_base.h"]             = "locale";
724fee23f9Smrg     headers["locale_classes.h"]         = "locale";
73*b1e83836Smrg     headers["locale_classes.tcc"]       = "locale";
744fee23f9Smrg     headers["locale_facets.h"]          = "locale";
754fee23f9Smrg     headers["locale_facets.tcc"]        = "locale";
76*b1e83836Smrg     headers["locale_facets_nonio.h"]    = "locale";
77*b1e83836Smrg     headers["locale_facets_nonio.tcc"]  = "locale";
78*b1e83836Smrg     headers["locale_conv.h"]            = "locale";
794fee23f9Smrg     headers["multimap.h"]               = "map";
80*b1e83836Smrg     headers["memoryfwd.h"]              = "memory";
81*b1e83836Smrg     headers["align.h"]                  = "memory";
82*b1e83836Smrg     headers["alloc_traits.h"]           = "memory";
83*b1e83836Smrg     headers["auto_ptr.h"]		= "memory";
84*b1e83836Smrg     headers["construct.h"]              = "memory";
854fee23f9Smrg     headers["allocator.h"]              = "memory";
864fee23f9Smrg     headers["raw_storage_iter.h"]       = "memory";
874fee23f9Smrg     headers["tempbuf.h"]                = "memory";
884fee23f9Smrg     headers["uninitialized.h"]          = "memory";
89*b1e83836Smrg     headers["shared_ptr.h"]             = "memory";
90*b1e83836Smrg     headers["shared_ptr_base.h"]        = "memory";
91*b1e83836Smrg     headers["shared_ptr_atomic.h"]      = "memory";
92*b1e83836Smrg     headers["unique_ptr.h"]             = "memory";
93*b1e83836Smrg     headers["ranges_uninitialized.h"]   = "memory";
94*b1e83836Smrg     headers["ptr_traits.h"]             = "memory";
95*b1e83836Smrg     headers["uses_allocator.h"]         = "memory";
96*b1e83836Smrg     headers["uses_allocator_args.h"]    = "memory";
97*b1e83836Smrg     headers["unique_lock.h"]            = "mutex";
98*b1e83836Smrg     headers["uniform_int_dist.h"]       = "random";
99*b1e83836Smrg     headers["ranges_base.h"]            = "ranges";
100*b1e83836Smrg     headers["ranges_util.h"]            = "ranges";
101*b1e83836Smrg     headers["ranges_cmp.h"]             = "functional";
102*b1e83836Smrg     headers["regex_automaton.h"]        = "regex";
103*b1e83836Smrg     headers["regex_automaton.tcc"]      = "regex";
104*b1e83836Smrg     headers["regex_compiler.h"]         = "regex";
105*b1e83836Smrg     headers["regex_compiler.tcc"]       = "regex";
106*b1e83836Smrg     headers["regex_constants.h"]        = "regex";
107*b1e83836Smrg     headers["regex_error.h"]            = "regex";
108*b1e83836Smrg     headers["regex_executor.h"]         = "regex";
109*b1e83836Smrg     headers["regex_executor.tcc"]       = "regex";
110*b1e83836Smrg     headers["regex_scanner.h"]          = "regex";
111*b1e83836Smrg     headers["regex_scanner.tcc"]        = "regex";
112*b1e83836Smrg     headers["semaphore_base.h"]         = "semaphore";
1134fee23f9Smrg     headers["multiset.h"]               = "set";
114*b1e83836Smrg     headers["node_handle.h"]            = "set";
1154fee23f9Smrg     headers["functexcept.h"]            = "stdexcept";
1164fee23f9Smrg     headers["char_traits.h"]            = "string";
117*b1e83836Smrg     headers["stringfwd.h"]              = "string";
1184fee23f9Smrg     headers["postypes.h"]               = "string";
1194fee23f9Smrg     headers["basic_string.h"]           = "string";
1204fee23f9Smrg     headers["basic_string.tcc"]         = "string";
121*b1e83836Smrg     headers["cow_string.h"]             = "string";
122*b1e83836Smrg     headers["string_view.tcc"]          = "string_view";
123*b1e83836Smrg     headers["this_thread_sleep.h"]      = "thread";
124*b1e83836Smrg     headers["tree.h"]                   = "map";
1254fee23f9Smrg     headers["pair.h"]                   = "utility";
1264fee23f9Smrg     headers["relops.h"]                 = "utility";
1274fee23f9Smrg     headers["gslice.h"]                 = "valarray";
1284fee23f9Smrg     headers["gslice_array.h"]           = "valarray";
1294fee23f9Smrg     headers["indirect_array.h"]         = "valarray";
1304fee23f9Smrg     headers["mask_array.h"]             = "valarray";
1314fee23f9Smrg     headers["slice_array.h"]            = "valarray";
1324fee23f9Smrg     headers["valarray_after.h"]         = "valarray";
1334fee23f9Smrg     headers["valarray_before.h"]        = "valarray";
1344fee23f9Smrg     headers["valarray_array.h"]         = "valarray";
1354fee23f9Smrg     headers["valarray_array.tcc"]       = "valarray";
1364fee23f9Smrg     headers["valarray_meta.h"]          = "valarray";
1374fee23f9Smrg     headers["bvector.h"]                = "vector";
1384fee23f9Smrg 
1394fee23f9Smrg     //headers["concurrence.h"]             who knows
1404fee23f9Smrg     //headers["atomicity.h"]               who knows
1414fee23f9Smrg 
142*b1e83836Smrg     headers["abs.h"]                    = "cstdlib";
143*b1e83836Smrg     headers["specfun.h"]                = "cmath";
144*b1e83836Smrg 
145*b1e83836Smrg     // This list is complete as of the October 2021 working draft.
146*b1e83836Smrg     std_headers = {
147*b1e83836Smrg 	"algorithm", "any", "array", "atomic",
148*b1e83836Smrg 	"barrier", "bit", "bitset",
149*b1e83836Smrg 	"charconv", "chrono", "codecvt", "compare", "complex",
150*b1e83836Smrg 	"concepts", "condition_variable", "coroutine",
151*b1e83836Smrg 	"deque",
152*b1e83836Smrg 	"exception", "execution",
153*b1e83836Smrg 	"filesystem", "format", "forward_list", "fstream",
154*b1e83836Smrg 	"functional", "future",
155*b1e83836Smrg 	"initializer_list", "iomanip", "ios", "iosfwd",
156*b1e83836Smrg 	"iostream", "istream", "iterator",
157*b1e83836Smrg 	"latch", "limits", "list", "locale",
158*b1e83836Smrg 	"map", "memory", "memory_resource", "mutex",
159*b1e83836Smrg 	"new", "numbers", "numeric",
160*b1e83836Smrg 	"optional", "ostream",
161*b1e83836Smrg 	"queue",
162*b1e83836Smrg 	"random", "ranges", "ratio", "regex",
163*b1e83836Smrg 	"scoped_allocator", "semaphore", "set", "shared_mutex",
164*b1e83836Smrg 	"source_location", "span", "spanstream", "sstream",
165*b1e83836Smrg 	"stack", "stacktrace", "stdexcept", "stop_token",
166*b1e83836Smrg 	"streambuf", "string", "string_view", "strstream",
167*b1e83836Smrg 	"syncstream", "system_error",
168*b1e83836Smrg 	"thread", "tuple", "typeindex", "typeinfo", "type_traits",
169*b1e83836Smrg 	"unordered_map", "unordered_set", "utility",
170*b1e83836Smrg 	"valarray", "variant", "vector", "version",
171*b1e83836Smrg 
172*b1e83836Smrg 	"cassert", "cctype", "cerrno", "cfenv", "cfloat",
173*b1e83836Smrg 	"cinttypes", "climits", "clocale", "cmath", "csetjmp",
174*b1e83836Smrg 	"csignal", "cstdarg", "cstddef", "cstdint", "cstdio",
175*b1e83836Smrg 	"cstdlib", "cstring", "ctime", "cuchar", "cwchar",
176*b1e83836Smrg 	"cwctype",
177*b1e83836Smrg 
178*b1e83836Smrg 	"assert.h", "ctype.h", "errno.h", "fenv.h", "float.h",
179*b1e83836Smrg 	"inttypes.h", "limits.h", "locale.h", "math.h", "setjmp.h",
180*b1e83836Smrg 	"signal.h", "stdarg.h", "stddef.h", "stdint.h", "stdio.h",
181*b1e83836Smrg 	"stdlib.h", "string.h", "time.h", "uchar.h", "wchar.h",
182*b1e83836Smrg 	"wctype.h",
183*b1e83836Smrg     };
184*b1e83836Smrg 
185*b1e83836Smrg     // In case we missed any:
186*b1e83836Smrg     for (const auto& h : headers)
187*b1e83836Smrg 	std_headers.insert(h.second);
1884fee23f9Smrg }
1894fee23f9Smrg 
1904fee23f9Smrg 
map_header(std::string_view header)191*b1e83836Smrg std::string_view map_header (std::string_view header)
1924fee23f9Smrg {
1934fee23f9Smrg     // if it doesn't contain a "." then it's already a std header
194*b1e83836Smrg     if (!header.contains('.'))
1954fee23f9Smrg     {
196*b1e83836Smrg 	// make sure it's in the set:
197*b1e83836Smrg 	std_headers.insert(header);
198*b1e83836Smrg 	return header;
1994fee23f9Smrg     }
2004fee23f9Smrg 
201*b1e83836Smrg     for (std::string_view prefix : {"bits/", "stl_", "std_"})
202*b1e83836Smrg 	if (header.starts_with(prefix))
203*b1e83836Smrg 	    header.remove_prefix(prefix.size());
204*b1e83836Smrg 
205*b1e83836Smrg     if (auto it = headers.find(header); it != headers.end())
206*b1e83836Smrg 	return it->second;
207*b1e83836Smrg 
208*b1e83836Smrg     for (std::string_view ext : {".h", ".tcc"})
209*b1e83836Smrg 	if (header.ends_with(ext))
2104fee23f9Smrg 	{
211*b1e83836Smrg 	    header.remove_suffix(ext.size());
212*b1e83836Smrg 	    break;
2134fee23f9Smrg 	}
2144fee23f9Smrg 
215*b1e83836Smrg     if (auto it = std_headers.find(header); it != std_headers.end())
216*b1e83836Smrg 	return *it;
217*b1e83836Smrg 
218*b1e83836Smrg     return {};
219*b1e83836Smrg }
220*b1e83836Smrg 
map_header_or_complain(std::string header)221*b1e83836Smrg std::string map_header_or_complain (std::string header)
222*b1e83836Smrg {
223*b1e83836Smrg     // For <experimental/xxx.h> and <tr1/xxx.h> try to map <xxx.h>
224*b1e83836Smrg     // then add the directory back to it.
225*b1e83836Smrg     if (header.contains('.'))
226*b1e83836Smrg 	for (std::string_view dir : {"experimental/", "tr1/"})
227*b1e83836Smrg 	    if (header.starts_with(dir))
228*b1e83836Smrg 	    {
229*b1e83836Smrg 		auto h = map_header(header.substr(dir.size()));
230*b1e83836Smrg 		if (!h.empty())
231*b1e83836Smrg 		    return std::string(dir) + std::string(h);
232*b1e83836Smrg 		return std::string(header);
233*b1e83836Smrg 	    }
234*b1e83836Smrg 
235*b1e83836Smrg     if (auto mapped = map_header(header); !mapped.empty())
236*b1e83836Smrg 	return std::string(mapped);
237*b1e83836Smrg 
238*b1e83836Smrg     std::cerr << "Could not map <" << header << "> to a standard header\n";
239*b1e83836Smrg     return std::string(header);
2404fee23f9Smrg }
2414fee23f9Smrg 
2424fee23f9Smrg 
main(int argc,char ** argv)243*b1e83836Smrg int main (int argc, char** argv)
2444fee23f9Smrg {
2454fee23f9Smrg     if (argc > 1)
2464fee23f9Smrg     {
247*b1e83836Smrg         std::cerr << "Usage: " << argv[0] << '\n' << usage;
248*b1e83836Smrg 	return 1;
2494fee23f9Smrg     }
2504fee23f9Smrg 
2514fee23f9Smrg     init_map();
2524fee23f9Smrg 
253*b1e83836Smrg     std::transform(std::istream_iterator<std::string>(std::cin), {},
254*b1e83836Smrg 		   std::ostream_iterator<std::string>(std::cout),
255*b1e83836Smrg 		   map_header_or_complain);
2564fee23f9Smrg }
257