1*36ac495dSmrg // This is a slow larval-stage kludge to help massage the generated man
2*36ac495dSmrg // pages. It's used like this:
3*36ac495dSmrg const char* const usage =
4*36ac495dSmrg "\nTakes on stdin, whitespace-separated words of the form\n"
5*36ac495dSmrg "\n"
6*36ac495dSmrg " [bits/]stl_foo.h\n"
7*36ac495dSmrg " [bits/]std_foo.h\n"
8*36ac495dSmrg "\n"
9*36ac495dSmrg "and writes on stdout the nearest matching standard header name.\n"
10*36ac495dSmrg "\n"
11*36ac495dSmrg "Takes no command-line arguments.\n"
12*36ac495dSmrg "\n";
13*36ac495dSmrg
14*36ac495dSmrg #include <cstdlib>
15*36ac495dSmrg #include <string>
16*36ac495dSmrg #include <map>
17*36ac495dSmrg #include <iostream>
18*36ac495dSmrg
19*36ac495dSmrg typedef std::map<std::string, std::string> Map;
20*36ac495dSmrg
21*36ac495dSmrg Map headers;
22*36ac495dSmrg
init_map()23*36ac495dSmrg void init_map()
24*36ac495dSmrg {
25*36ac495dSmrg // Enter the glamourous world of data entry!! Maintain these!
26*36ac495dSmrg headers["algo.h"] = "algorithm";
27*36ac495dSmrg headers["algobase.h"] = "algorithm";
28*36ac495dSmrg headers["algorithm.h"] = "algorithm";
29*36ac495dSmrg headers["heap.h"] = "algorithm";
30*36ac495dSmrg headers["bitset.h"] = "bitset";
31*36ac495dSmrg headers["complex.h"] = "complex";
32*36ac495dSmrg //headers["construct.h"] stl_construct.h entirely internal
33*36ac495dSmrg headers["deque.h"] = "deque";
34*36ac495dSmrg headers["deque.tcc"] = "deque";
35*36ac495dSmrg headers["fstream.h"] = "fstream";
36*36ac495dSmrg headers["fstream.tcc"] = "fstream";
37*36ac495dSmrg headers["function.h"] = "functional";
38*36ac495dSmrg headers["functional.h"] = "functional";
39*36ac495dSmrg headers["iomanip.h"] = "iomanip";
40*36ac495dSmrg headers["basic_ios.h"] = "ios";
41*36ac495dSmrg headers["basic_ios.tcc"] = "ios";
42*36ac495dSmrg headers["ios.h"] = "ios";
43*36ac495dSmrg headers["iosfwd.h"] = "iosfwd";
44*36ac495dSmrg headers["iostream.h"] = "iostream";
45*36ac495dSmrg headers["istream.h"] = "istream";
46*36ac495dSmrg headers["istream.tcc"] = "istream";
47*36ac495dSmrg headers["iterator.h"] = "iterator";
48*36ac495dSmrg headers["iterator_base_funcs.h"] = "iterator";
49*36ac495dSmrg headers["iterator_base_types.h"] = "iterator";
50*36ac495dSmrg headers["stream_iterator.h"] = "iterator";
51*36ac495dSmrg headers["streambuf_iterator.h"] = "iterator";
52*36ac495dSmrg headers["limits.h"] = "limits";
53*36ac495dSmrg headers["list.h"] = "list";
54*36ac495dSmrg headers["list.tcc"] = "list";
55*36ac495dSmrg headers["codecvt.h"] = "locale";
56*36ac495dSmrg headers["locale.h"] = "locale";
57*36ac495dSmrg headers["localefwd.h"] = "locale";
58*36ac495dSmrg headers["locale_classes.h"] = "locale";
59*36ac495dSmrg headers["locale_facets.h"] = "locale";
60*36ac495dSmrg headers["locale_facets.tcc"] = "locale";
61*36ac495dSmrg headers["map.h"] = "map";
62*36ac495dSmrg headers["multimap.h"] = "map";
63*36ac495dSmrg headers["memory.h"] = "memory";
64*36ac495dSmrg headers["allocator.h"] = "memory";
65*36ac495dSmrg headers["raw_storage_iter.h"] = "memory";
66*36ac495dSmrg headers["tempbuf.h"] = "memory";
67*36ac495dSmrg headers["uninitialized.h"] = "memory";
68*36ac495dSmrg headers["numeric.h"] = "numeric";
69*36ac495dSmrg headers["ostream.h"] = "ostream";
70*36ac495dSmrg headers["ostream.tcc"] = "ostream";
71*36ac495dSmrg headers["queue.h"] = "queue";
72*36ac495dSmrg headers["set.h"] = "set";
73*36ac495dSmrg headers["multiset.h"] = "set";
74*36ac495dSmrg headers["sstream.h"] = "sstream";
75*36ac495dSmrg headers["sstream.tcc"] = "sstream";
76*36ac495dSmrg headers["stack.h"] = "stack";
77*36ac495dSmrg headers["functexcept.h"] = "stdexcept";
78*36ac495dSmrg headers["stdexcept.h"] = "stdexcept";
79*36ac495dSmrg headers["streambuf.h"] = "streambuf";
80*36ac495dSmrg headers["streambuf.tcc"] = "streambuf";
81*36ac495dSmrg headers["string.h"] = "string";
82*36ac495dSmrg headers["char_traits.h"] = "string";
83*36ac495dSmrg headers["postypes.h"] = "string";
84*36ac495dSmrg headers["basic_string.h"] = "string";
85*36ac495dSmrg headers["basic_string.tcc"] = "string";
86*36ac495dSmrg headers["tree.h"] = "backward/tree.h";
87*36ac495dSmrg headers["pair.h"] = "utility";
88*36ac495dSmrg headers["utility.h"] = "utility";
89*36ac495dSmrg headers["relops.h"] = "utility";
90*36ac495dSmrg headers["gslice.h"] = "valarray";
91*36ac495dSmrg headers["gslice_array.h"] = "valarray";
92*36ac495dSmrg headers["indirect_array.h"] = "valarray";
93*36ac495dSmrg headers["mask_array.h"] = "valarray";
94*36ac495dSmrg headers["slice_array.h"] = "valarray";
95*36ac495dSmrg headers["valarray.h"] = "valarray";
96*36ac495dSmrg headers["valarray_after.h"] = "valarray";
97*36ac495dSmrg headers["valarray_before.h"] = "valarray";
98*36ac495dSmrg headers["valarray_array.h"] = "valarray";
99*36ac495dSmrg headers["valarray_array.tcc"] = "valarray";
100*36ac495dSmrg headers["valarray_meta.h"] = "valarray";
101*36ac495dSmrg headers["bvector.h"] = "vector";
102*36ac495dSmrg headers["vector.h"] = "vector";
103*36ac495dSmrg headers["vector.tcc"] = "vector";
104*36ac495dSmrg
105*36ac495dSmrg //headers["concurrence.h"] who knows
106*36ac495dSmrg //headers["atomicity.h"] who knows
107*36ac495dSmrg
108*36ac495dSmrg // C wrappers -- probably was an easier way to do these, but oh well
109*36ac495dSmrg headers["cassert.h"] = "cassert";
110*36ac495dSmrg headers["cctype.h"] = "cctype";
111*36ac495dSmrg headers["cerrno.h"] = "cerrno";
112*36ac495dSmrg headers["cfloat.h"] = "cfloat";
113*36ac495dSmrg headers["climits.h"] = "climits";
114*36ac495dSmrg headers["clocale.h"] = "clocale";
115*36ac495dSmrg headers["cmath.h"] = "cmath";
116*36ac495dSmrg headers["csetjmp.h"] = "csetjmp";
117*36ac495dSmrg headers["csignal.h"] = "csignal";
118*36ac495dSmrg headers["cstdarg.h"] = "cstdarg";
119*36ac495dSmrg headers["cstddef.h"] = "cstddef";
120*36ac495dSmrg headers["cstdio.h"] = "cstdio";
121*36ac495dSmrg headers["cstdlib.h"] = "cstdlib";
122*36ac495dSmrg headers["cstring.h"] = "cstring";
123*36ac495dSmrg headers["ctime.h"] = "ctime";
124*36ac495dSmrg headers["cwchar.h"] = "cwchar";
125*36ac495dSmrg headers["cwctype.h"] = "cwctype";
126*36ac495dSmrg }
127*36ac495dSmrg
128*36ac495dSmrg
do_word(std::string const & longheader)129*36ac495dSmrg void do_word (std::string const& longheader)
130*36ac495dSmrg {
131*36ac495dSmrg std::string::size_type start = 0;
132*36ac495dSmrg
133*36ac495dSmrg // if it doesn't contain a "." then it's already a std header
134*36ac495dSmrg if (longheader.find(".") == std::string::npos)
135*36ac495dSmrg {
136*36ac495dSmrg std::cout << longheader << '\n';
137*36ac495dSmrg return;
138*36ac495dSmrg }
139*36ac495dSmrg
140*36ac495dSmrg if (longheader.substr(start,5) == "bits/") start += 5;
141*36ac495dSmrg if ((longheader.substr(start,4) == "stl_") ||
142*36ac495dSmrg (longheader.substr(start,4) == "std_"))
143*36ac495dSmrg {
144*36ac495dSmrg start += 4;
145*36ac495dSmrg }
146*36ac495dSmrg
147*36ac495dSmrg // come on, gdb, find `p' already...
148*36ac495dSmrg const char* p = longheader.substr(start).c_str();
149*36ac495dSmrg Map::iterator word = headers.find(p);
150*36ac495dSmrg if (word != headers.end())
151*36ac495dSmrg std::cout << word->second << '\n';
152*36ac495dSmrg else std::cout << "MAYBE_AN_ERROR_MESSAGE_HERE\n";
153*36ac495dSmrg }
154*36ac495dSmrg
155*36ac495dSmrg
main(int argc,char **)156*36ac495dSmrg int main (int argc, char**)
157*36ac495dSmrg {
158*36ac495dSmrg if (argc > 1)
159*36ac495dSmrg {
160*36ac495dSmrg std::cerr << usage;
161*36ac495dSmrg std::exit(0);
162*36ac495dSmrg }
163*36ac495dSmrg
164*36ac495dSmrg init_map();
165*36ac495dSmrg
166*36ac495dSmrg std::string w;
167*36ac495dSmrg while (std::cin >> w)
168*36ac495dSmrg do_word (w);
169*36ac495dSmrg }
170*36ac495dSmrg
171*36ac495dSmrg
172