⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chm__dissect_8cpp-source.html

📁 It is a chm file viewer lib with source code
💻 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> &nbsp; <a class="qindex" href="namespaces.html">Namespace List</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; <a class="qindex" href="globals.html">File Members</a> &nbsp; </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 &lt;config.h&gt;</span>00003 <span class="preprocessor">#endif</span>00004 <span class="preprocessor"></span>00005 <span class="preprocessor">#include &lt;iostream&gt;</span>00006 <span class="preprocessor">#include &lt;cstdlib&gt;</span>00007 <span class="preprocessor">#include &lt;iterator&gt;</span>00008 <span class="preprocessor">#include &lt;algorithm&gt;</span>00009 <span class="preprocessor">#include &lt;list&gt;</span>00010 00011 <span class="preprocessor">#include &lt;fstream&gt;</span>00012 00013 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>00014 <span class="preprocessor">#include &lt;sys/stat.h&gt;</span>00015 00016 <span class="preprocessor">#include &lt;cerrno&gt;</span>00017 <span class="preprocessor">#include &lt;cstring&gt;</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 &lt;&lt; string(level * 4, <span class="charliteral">' '</span>) &lt;&lt; tree-&gt;title &lt;&lt; endl;00030 00031   for_each (tree-&gt;children.begin(), tree-&gt;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&amp; pname, <span class="keyword">const</span> string&amp; err = <span class="stringliteral">""</span>) {00036   <span class="keywordflow">if</span> ( err == <span class="stringliteral">""</span> ) {00037       cerr &lt;&lt; pname &lt;&lt; <span class="stringliteral">": Usage: "</span> &lt;&lt; pname &lt;&lt; <span class="stringliteral">" &lt;file.chm&gt; list|get|listall|export|stats|topics|index|indexall [&lt;path|text&gt;]"</span> &lt;&lt; endl;00038   } <span class="keywordflow">else</span> {00039       cerr &lt;&lt; pname &lt;&lt; <span class="stringliteral">": "</span> &lt;&lt; err &lt;&lt; endl;00040   }00041   exit(1);00042 }00043 00044 <span class="keywordtype">void</span> do_export (<span class="keyword">const</span> string&amp; pname, <span class="keyword">const</span> chmfile&amp; chm, <span class="keyword">const</span> string&amp; root, <span class="keyword">const</span> string&amp; p)00045 {00046   <span class="keywordflow">if</span> ( mkdir(root.c_str(), 0755) == -1 &amp;&amp; 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&lt;string&gt; dirs;00050   chm.readdir(p, dirs, chmfile::dirs);00051 00052   list&lt;string&gt; files;00053   chm.readdir(p, files, chmfile::files);00054 00055   <span class="keywordflow">for</span> ( list&lt;string&gt;::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&lt;string&gt;::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&amp; pname, <span class="keyword">const</span> chmfile&amp; chm, <span class="keyword">const</span> string&amp; root = <span class="stringliteral">"/"</span>)00070 {00071   list&lt;string&gt; l;00072   chm.readdir (root, l);00073   <span class="keywordflow">for</span> (list&lt;string&gt;::iterator it = l.begin(); it != l.end(); it++ ) {00074       string&amp; n = *it;00075       cout &lt;&lt; root &lt;&lt; n &lt;&lt; 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 &lt; 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&lt;string&gt; dc;00094       chm.readdir (argv[3], dc);00095       ostream_iterator&lt;string&gt; 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 &lt;&lt; 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 &lt;&lt; <span class="stringliteral">"---Statistics---"</span> &lt;&lt; endl;00111       cout &lt;&lt; <span class="stringliteral">"     Title: "</span> &lt;&lt; chm.get_title() &lt;&lt; endl;00112       cout &lt;&lt; <span class="stringliteral">" Generator: "</span> &lt;&lt; chm.get_generator() &lt;&lt; endl;00113       cout &lt;&lt; <span class="stringliteral">"      Home: "</span> &lt;&lt; chm.get_home_file() &lt;&lt; endl;00114       cout &lt;&lt; <span class="stringliteral">"    Topics: "</span> &lt;&lt; chm.get_topics_file() &lt;&lt; endl;00115       cout &lt;&lt; <span class="stringliteral">"     Index: "</span> &lt;&lt; chm.get_index_file() &lt;&lt; endl;00116       <span class="keywordflow">return</span> 0;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 &lt;&lt; <span class="stringliteral">"Topics tree:"</span> &lt;&lt; endl;00120           print_topics_tree (chm.get_topics_tree());00121       } <span class="keywordflow">else</span> {00122           cout &lt;&lt; <span class="stringliteral">"No topics tree found"</span> &lt;&lt; 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 &lt;&lt; <span class="stringliteral">"Exporting.."</span> &lt;&lt; endl;00128       string w = argv[3];00129       <span class="keywordflow">if</span> ( !w.empty() &amp;&amp; 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&lt;chm_search_match&gt; f;00136       chm.cache_search_database();00137       chm.search_index(argv[3], f);00138 00139       <span class="keywordflow">for</span> ( list&lt;chm_search_match&gt;::iterator it = f.begin(); it != f.end(); it++ )00140           <span class="keywordflow">for</span> ( size_t i = 0; i &lt; it-&gt;documents.size(); i++ )00141               cout &lt;&lt; it-&gt;key &lt;&lt; <span class="stringliteral">"|"</span> &lt;&lt; it-&gt;is_title &lt;&lt; <span class="stringliteral">"|"</span> &lt;&lt; it-&gt;documents[i].offsets.size() &lt;&lt; <span class="stringliteral">"|"</span>00142                   &lt;&lt; it-&gt;documents[i].path &lt;&lt; <span class="stringliteral">"|"</span> &lt;&lt; it-&gt;documents[i].title &lt;&lt; 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&lt;chm_search_match&gt; 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&lt;chm_search_match&gt;::iterator it = f.begin(); it != f.end(); it++ )00153           <span class="keywordflow">for</span> ( size_t i = 0; i &lt; it-&gt;documents.size(); i++ )00154               cout &lt;&lt; it-&gt;key &lt;&lt; <span class="stringliteral">"|"</span> &lt;&lt; it-&gt;is_title &lt;&lt; <span class="stringliteral">"|"</span> &lt;&lt; it-&gt;documents[i].offsets.size() &lt;&lt; <span class="stringliteral">"|"</span>00155                   &lt;&lt; it-&gt;documents[i].path &lt;&lt; <span class="stringliteral">"|"</span> &lt;&lt; it-&gt;documents[i].title &lt;&lt; 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 &copy; 2003 Indrek Mandre <script language="JavaScript">  document.write ('&lt;<a href="mailto:indrek' + '@' + 'mare.ee">indrek' + '@' + 'mare.ee</a>&gt;');</script><p>&nbsp;</p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -