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