?? chm__dissect_8cpp-source.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>chm_dissect.cpp Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.2.18 --><center><a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> </center><hr><h1>chm_dissect.cpp</h1><a href="chm__dissect_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="preprocessor">#ifdef HAVE_CONFIG_H</span>00002 <span class="preprocessor"></span><span class="preprocessor">#include <config.h></span>00003 <span class="preprocessor">#endif</span>00004 <span class="preprocessor"></span>00005 <span class="preprocessor">#include <iostream></span>00006 <span class="preprocessor">#include <cstdlib></span>00007 <span class="preprocessor">#include <iterator></span>00008 <span class="preprocessor">#include <algorithm></span>00009 <span class="preprocessor">#include <list></span>00010 00011 <span class="preprocessor">#include <fstream></span>00012 00013 <span class="preprocessor">#include <sys/types.h></span>00014 <span class="preprocessor">#include <sys/stat.h></span>00015 00016 <span class="preprocessor">#include <cerrno></span>00017 <span class="preprocessor">#include <cstring></span>00018 00019 <span class="preprocessor">#include "<a class="code" href="chmxx_8h.html">chmxx.h</a>"</span>00020 00021 <span class="keyword">using</span> <span class="keyword">namespace </span>std;00022 <span class="keyword">using</span> <span class="keyword">namespace </span>chm;00023 00024 <span class="keyword">namespace </span>{00025 00026 <span class="keywordtype">void</span> print_topics_tree (<span class="keyword">const</span> chm_topics_tree *tree, <span class="keywordtype">int</span> level = 0)00027 {00028 <span class="keywordflow">if</span> ( level != 0 )00029 cout << string(level * 4, <span class="charliteral">' '</span>) << tree->title << endl;00030 00031 for_each (tree->children.begin(), tree->children.end(),00032 bind2nd(ptr_fun(print_topics_tree), level + 1));00033 }00034 00035 <span class="keywordtype">void</span> error (<span class="keyword">const</span> string& pname, <span class="keyword">const</span> string& err = <span class="stringliteral">""</span>) {00036 <span class="keywordflow">if</span> ( err == <span class="stringliteral">""</span> ) {00037 cerr << pname << <span class="stringliteral">": Usage: "</span> << pname << <span class="stringliteral">" <file.chm> list|get|listall|export|stats|topics|index|indexall [<path|text>]"</span> << endl;00038 } <span class="keywordflow">else</span> {00039 cerr << pname << <span class="stringliteral">": "</span> << err << endl;00040 }00041 exit(1);00042 }00043 00044 <span class="keywordtype">void</span> do_export (<span class="keyword">const</span> string& pname, <span class="keyword">const</span> chmfile& chm, <span class="keyword">const</span> string& root, <span class="keyword">const</span> string& p)00045 {00046 <span class="keywordflow">if</span> ( mkdir(root.c_str(), 0755) == -1 && errno != EEXIST)00047 error (pname, string() + <span class="stringliteral">"Unable to create the target directory ["</span> + root + <span class="stringliteral">"]: "</span> + strerror(errno));00048 00049 list<string> dirs;00050 chm.readdir(p, dirs, chmfile::dirs);00051 00052 list<string> files;00053 chm.readdir(p, files, chmfile::files);00054 00055 <span class="keywordflow">for</span> ( list<string>::iterator it = dirs.begin(); it != dirs.end(); it++ ) {00056 do_export (pname, chm, root + *it, p + *it);00057 }00058 00059 <span class="keywordflow">for</span> ( list<string>::iterator it = files.begin(); it != files.end(); it++ ) {00060 string path = root + *it;00061 ofstream out(path.c_str());00062 <span class="keywordflow">if</span> ( !out )00063 error (pname, string() + <span class="stringliteral">"Unable to open export file for writing: "</span> + strerror (errno));00064 chm.read (p + *it, out);00065 out.close();00066 }00067 }00068 00069 <span class="keywordtype">void</span> list_all (<span class="keyword">const</span> string& pname, <span class="keyword">const</span> chmfile& chm, <span class="keyword">const</span> string& root = <span class="stringliteral">"/"</span>)00070 {00071 list<string> l;00072 chm.readdir (root, l);00073 <span class="keywordflow">for</span> (list<string>::iterator it = l.begin(); it != l.end(); it++ ) {00074 string& n = *it;00075 cout << root << n << endl;00076 <span class="keywordflow">if</span> ( n[n.size()-1] == <span class="charliteral">'/'</span> ) list_all (pname, chm, root + n);00077 }00078 }00079 00080 }00081 <a name="l00082"></a><a class="code" href="chm__dissect_8cpp.html#a4">00082</a> <span class="keywordtype">int</span> <a class="code" href="chm__dissect_8cpp.html#a4">main</a>(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])00083 {00084 <span class="keywordflow">if</span> ( argc < 3 ) error(argv[0]);00085 00086 chmfile chm(argv[1]);00087 <span class="keywordflow">if</span> ( !chm ) error (argv[0], <span class="stringliteral">"Invalid chm file"</span>);00088 00089 string cmd = argv[2];00090 00091 <span class="keywordflow">if</span> ( cmd == <span class="stringliteral">"list"</span> ) {00092 <span class="keywordflow">if</span> ( argc != 4 ) error(argv[0]);00093 list<string> dc;00094 chm.readdir (argv[3], dc);00095 ostream_iterator<string> out(cout, <span class="stringliteral">"\n"</span>);00096 copy(dc.begin(), dc.end(), out);00097 <span class="keywordflow">return</span> 0;00098 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( cmd == <span class="stringliteral">"get"</span> ) {00099 <span class="keywordflow">if</span> ( argc != 4 ) error(argv[0]);00100 streambuf *sb = chm.open(argv[3]);00101 <span class="keywordflow">if</span> ( !sb )00102 error (argv[0], <span class="stringliteral">"Could not find given path inside the archive"</span>);00103 cout << sb;00104 <span class="keyword">delete</span> sb;00105 <span class="keywordflow">return</span> 0;00106 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( cmd == <span class="stringliteral">"listall"</span> ) {00107 list_all (argv[0], chm);00108 <span class="keywordflow">return</span> 0;00109 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( cmd == <span class="stringliteral">"stats"</span> ) {00110 cout << <span class="stringliteral">"---Statistics---"</span> << endl;00111 cout << <span class="stringliteral">" Title: "</span> << chm.get_title() << endl;00112 cout << <span class="stringliteral">" Generator: "</span> << chm.get_generator() << endl;00113 cout << <span class="stringliteral">" Home: "</span> << chm.get_home_file() << endl;00114 cout << <span class="stringliteral">" Topics: "</span> << chm.get_topics_file() << endl;00115 cout << <span class="stringliteral">" Index: "</span> << chm.get_index_file() << endl;00117 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( cmd == <span class="stringliteral">"topics"</span> ) {00118 <span class="keywordflow">if</span> ( chm.get_topics_tree() ) {00119 cout << <span class="stringliteral">"Topics tree:"</span> << endl;00120 print_topics_tree (chm.get_topics_tree());00121 } <span class="keywordflow">else</span> {00122 cout << <span class="stringliteral">"No topics tree found"</span> << endl;00123 }00124 <span class="keywordflow">return</span> 0;00125 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( cmd == <span class="stringliteral">"export"</span> ) {00126 <span class="keywordflow">if</span> ( argc != 4 ) error(argv[0]);00127 cout << <span class="stringliteral">"Exporting.."</span> << endl;00128 string w = argv[3];00129 <span class="keywordflow">if</span> ( !w.empty() && w[w.size() - 1] != <span class="charliteral">'/'</span> ) w += <span class="charliteral">'/'</span>;00130 do_export (argv[0], chm, w, <span class="stringliteral">"/"</span>);00131 <span class="keywordflow">return</span> 0;00132 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( cmd == <span class="stringliteral">"index"</span> ) {00133 <span class="keywordflow">if</span> ( argc != 4 ) error(argv[0]);00134 00135 list<chm_search_match> f;00136 chm.cache_search_database();00137 chm.search_index(argv[3], f);00138 00139 <span class="keywordflow">for</span> ( list<chm_search_match>::iterator it = f.begin(); it != f.end(); it++ )00140 <span class="keywordflow">for</span> ( size_t i = 0; i < it->documents.size(); i++ )00141 cout << it->key << <span class="stringliteral">"|"</span> << it->is_title << <span class="stringliteral">"|"</span> << it->documents[i].offsets.size() << <span class="stringliteral">"|"</span>00142 << it->documents[i].path << <span class="stringliteral">"|"</span> << it->documents[i].title << endl;00143 00144 <span class="keywordflow">return</span> 0;00145 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( cmd == <span class="stringliteral">"indexall"</span> ) {00146 <span class="keywordflow">if</span> ( argc != 4 ) error(argv[0]);00147 00148 list<chm_search_match> f;00149 chm.cache_search_database();00150 chm.search_index(argv[3], f, <span class="keyword">false</span>, <span class="keyword">false</span>);00151 00152 <span class="keywordflow">for</span> ( list<chm_search_match>::iterator it = f.begin(); it != f.end(); it++ )00153 <span class="keywordflow">for</span> ( size_t i = 0; i < it->documents.size(); i++ )00154 cout << it->key << <span class="stringliteral">"|"</span> << it->is_title << <span class="stringliteral">"|"</span> << it->documents[i].offsets.size() << <span class="stringliteral">"|"</span>00155 << it->documents[i].path << <span class="stringliteral">"|"</span> << it->documents[i].title << endl;00156 00157 <span class="keywordflow">return</span> 0;00158 }00159 00160 error (argv[0], <span class="stringliteral">"Invalid second argument"</span>);00161 }</pre></div><hr>Copyright © 2003 Indrek Mandre <script language="JavaScript"> document.write ('<<a href="mailto:indrek' + '@' + 'mare.ee">indrek' + '@' + 'mare.ee</a>>');</script><p> </p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -