1 // This is a slow larval-stage kludge to help massage the generated man 2 // pages. It's used like this: 3 const 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 18 typedef std::map<std::string, std::string> Map; 19 20 Map headers; 21 22 void 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 128 void 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 155 int 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