亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chm.cpp

?? It is a chm file viewer lib with source code
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include <iostream>#include <cstdio>#include <streambuf>#include <map>#include <algorithm>#include <cassert>#include "chmxx.h"#include "chm_lib.h"#include "tagreader.h"using std::string;using std::vector;using std::list;using std::map;using namespace chm;namespace {  class chmstreambuf : public std::streambuf {  public:    chmstreambuf (chmFile *chm, chmUnitInfo ui, size_t buf_size = 1024) : chm(chm), ui(ui), addr(0), buf_size(buf_size)    {      buf = new char[buf_size];      is_cached = false;      file_size = ui.length;      setg (buf, buf + buf_size, buf + buf_size);      if ( buf_size == file_size ) underflow(); // force loading of entire buffer, no more loads are done    }    chmstreambuf (const char *b, size_t buf_size) : buf((char *)buf), buf_size(buf_size)    {      is_cached = true;      setg (buf, buf, buf + buf_size);      addr = buf_size;      file_size = buf_size;    }    virtual ~chmstreambuf ()    {      if ( !is_cached ) delete buf;    }    virtual pos_type seekoff (off_type amount, std::ios_base::seekdir dir, std::ios_base::openmode)    {      LONGUINT64 naddr;      if (dir == std::ios_base::beg ) {          naddr = amount;      } else if ( dir == std::ios_base::cur ) {          LONGUINT64 cur_addr = addr - (egptr() - gptr()); // determine current real read position          naddr = cur_addr + amount;          if ( amount == 0 ) { return naddr; } // tellg optimization      } else if ( dir == std::ios_base::end ) {          naddr = file_size + amount;      } else {          return pos_type(off_type(-1));      }      if ( naddr >= file_size )          return pos_type(off_type(-1));      // try to optimise if the seek is inside our buffer      LONGUINT64 low = addr - (egptr() - eback());      LONGUINT64 high = addr;      if ( naddr >= low && naddr < high ) {          setg (eback(), egptr() - (addr - naddr), egptr());          return naddr;      }      setg (buf, buf + buf_size, buf + buf_size);      addr = naddr;      return addr;    }    virtual pos_type seekpos (pos_type pos, std::ios_base::openmode om)    {      return seekoff (pos, std::ios_base::beg, om);    }    virtual std::streamsize showmanyc ()    {      return (egptr() - gptr()) + (file_size - addr);    }    std::streamsize read_left () const    {      return (egptr() - gptr()) + (file_size - addr);    }    std::streamsize xsgetn(char_type* __s, std::streamsize __n)    {      std::streamsize r = 0;      if ( gptr() < egptr() ) {          if ( egptr() - gptr() > __n ) {              std::memcpy (__s, gptr(), __n);              gbump (__n);              return __n;          } else {              r = egptr() - gptr();              std::memcpy (__s, gptr(), r);          }      }      LONGUINT64 m = chm_retrieve_object (chm, &ui, (unsigned char *)(__s + r), addr, __n - r);      addr += m;      setg (buf, buf + buf_size, buf + buf_size);      return r + m;    }    virtual int_type underflow ()    {      if ( gptr() < egptr () )          return *gptr();      if ( addr >= file_size ) return traits_type::eof();      std::streamsize r = xsgetn (buf, buf_size);      setg (buf, buf, buf + r);      if ( r == 0 )          return traits_type::eof();      return *gptr();    }  private:    chmFile *chm;    chmUnitInfo ui;    LONGUINT64 addr;    char *buf;    size_t buf_size;    size_t file_size;    bool is_cached;  };} // namespace {chm::chmfile::chmfile (const string& path) : path(path){  chm = chm_open (path.c_str());  tree = NULL;  if ( !chm ) return;  chmistream in(*this, "/#SYSTEM");  if ( in ) {      in.get_dword();      while ( in.read_left() ) {        size_t type = in.get_word();        size_t len = in.get_word();        vector<char> data(len);        in.read (&data[0], len);//        printf ("type = %ld, len = %ld, data = [%s]\n", type, len, &data[0]);        switch (type) {          case 0:            topics_file = "/" + string(data.begin(), data.end() - 1);            break;          case 1:            index_file = "/" + string(data.begin(), data.end() - 1);            break;          case 2:            home_file = "/" + string(data.begin(), data.end() - 1);            break;          case 3:            title = string(data.begin(), data.end() - 1);            break;          case 6:            if ( topics_file.empty() )              {                string t = string(data.begin(), data.end() - 1);                if ( file_exists (t + ".hhc") )                    topics_file = "/" + t + ".hhc";                if ( file_exists (t + ".hhk") )                    index_file = "/" + t + ".hhk";              }            break;          case 9:            generator = string(data.begin(), data.end() - 1);            break;        }      }  }  if ( topics_file.empty() && index_file.empty() ) {      vector<char> buf;      if ( read ("/#STRINGS", buf) && buf.size() ) {        vector<char>::iterator i = buf.begin();        i++;  // skip first byte;        while ( i != buf.end() ) {          string next = string(i, std::find (i, buf.end(), 0));          if ( next.size() > 4 ) {            string prefix = next.substr(next.size() - 4);            std::transform (prefix.begin(), prefix.end(), prefix.begin(), (int(*)(int))std::tolower);//            std::cout << next << " " << prefix << std::endl;            if ( prefix == ".hhc" )                topics_file = "/" + next;            else if ( prefix == ".hhk" )                index_file = "/" + next;          }          i += next.size() + 1;        }      }  }}const chm::chm_topics_tree * chm::chmfile::get_topics_tree () const{  if ( tree || topics_file.empty() ) return tree;  vector<char> buf;  if ( read (topics_file, buf) ) {      tree = new chm_topics_tree ();      tree->parent = NULL;      chm_topics_tree *cur = tree;      chm_topics_tree *last = tree;      string str (buf.begin(), buf.end());      buf.clear(); // release memory  //        std::cout << str << std::endl;      tagreader tr(str);//      std::cerr << "Topics tree size in bytes: " << str.size() << "\n";      while ( tr.has_next() ) {          tagreader::tagstruct s = tr.get_next();          if ( s.tag == "object" && s.elems["type"] == "text/sitemap" ) {            s = tr.get_next ();            last = new chm_topics_tree ();            last->parent = cur;            cur->children.push_back (last);            while ( s.tag != "/object" ) {                if ( s.tag == "param" ) {                    string name = s.elems["name"];                    string value = s.elems["value"];                    if ( name == "Name" ) {                        last->title = value;                    } else if ( name == "Local" ) {                        last->path = "/" + value;                    }                }                if ( !tr.has_next () ) break; // faulty file                s = tr.get_next();            }            continue;          }          if ( s.tag == "ul" && s.tag_level > 1 ) {            cur = last;            continue;          }          if ( s.tag == "/ul" && s.tag_level > 0 && cur->parent ) {            cur = cur->parent;            continue;          }      }  }  return tree;}bool chm::chmfile::is_open () const{  return chm != NULL;}std::streambuf* chm::chmfile::open (const string& path, size_t buf_size) const{  if ( !cache_data.empty() ) {  // check cache data first      cache_data_t::const_iterator it = cache_data.find(path);      if ( it != cache_data.end() )          return new chmstreambuf (&it->second[0], it->second.size());  }  struct chmUnitInfo ui;  if ( chm_resolve_object (chm, path.c_str(), &ui) == CHM_RESOLVE_FAILURE )      return NULL;  return new chmstreambuf(chm, ui, buf_size);}std::streamsize chm::chmfile::file_size (const string& path) const{  struct chmUnitInfo ui;  if ( chm_resolve_object (chm, path.c_str(), &ui) == CHM_RESOLVE_FAILURE )      return 0;  else      return ui.length;}bool chm::chmfile::file_exists (const string& path) const{  struct chmUnitInfo ui;  return chm_resolve_object (chm, path.c_str(), &ui) != CHM_RESOLVE_FAILURE;}bool chm::chmfile::read (const string& path, std::ostream& out) const{  struct chmUnitInfo ui;  if ( chm_resolve_object (chm, path.c_str(), &ui) == CHM_RESOLVE_FAILURE )      return false;  chmstreambuf buf(chm, ui);  out << &buf;  return true;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费成人在线视频观看| 日韩一区二区高清| 日韩欧美色综合网站| 国产精品久久久久久久蜜臀| 视频一区二区中文字幕| eeuss影院一区二区三区| 日韩三级免费观看| 午夜视频一区在线观看| 99久久er热在这里只有精品66| 久久夜色精品国产欧美乱极品| 亚洲综合无码一区二区| av男人天堂一区| 国产亚洲女人久久久久毛片| 免费成人小视频| 欧美午夜不卡在线观看免费| 国产精品久久久久三级| 国产老肥熟一区二区三区| 日韩视频一区二区三区在线播放| 亚洲高清中文字幕| 欧美性xxxxx极品少妇| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | av一区二区三区黑人| 久久久99精品久久| 国产一区激情在线| 久久这里都是精品| 另类专区欧美蜜桃臀第一页| 91精品欧美综合在线观看最新| 午夜视频在线观看一区| 欧美日韩精品一区二区三区| 香蕉乱码成人久久天堂爱免费| 91久久线看在观草草青青| 中文字幕制服丝袜一区二区三区| 99麻豆久久久国产精品免费优播| 国产精品福利电影一区二区三区四区| 成人精品国产免费网站| 国产精品久久久久久久久图文区 | 国产精品免费免费| 播五月开心婷婷综合| 国产精品麻豆一区二区| 99精品热视频| 亚洲午夜在线电影| 欧美日韩亚洲综合一区二区三区| 亚洲国产精品综合小说图片区| 欧美日韩日日夜夜| 九色综合狠狠综合久久| 久久久久亚洲蜜桃| av成人免费在线| 亚洲图片欧美综合| 日韩精品一区二区在线观看| 国产在线国偷精品产拍免费yy| 国产日产欧产精品推荐色 | 欧美日韩不卡视频| 蜜桃视频第一区免费观看| 亚洲精品在线三区| 成人晚上爱看视频| 一级做a爱片久久| 日韩三级高清在线| 国产精品一区在线| 一区二区三区在线播放| 8x8x8国产精品| 国产一区二区三区在线看麻豆| 国产清纯美女被跳蛋高潮一区二区久久w| 国产91精品精华液一区二区三区| 国产人成亚洲第一网站在线播放 | 国产一二三精品| 日韩精品中文字幕一区二区三区| 国产成人在线视频播放| 国产三级欧美三级日产三级99| 国产精品嫩草影院av蜜臀| 一色屋精品亚洲香蕉网站| av不卡在线观看| 亚洲国产精品自拍| 日韩午夜在线观看视频| 成人免费毛片高清视频| 亚洲香肠在线观看| 国产欧美日本一区视频| 欧美色爱综合网| 国产精品影视在线| 亚洲不卡在线观看| 国产精品美女久久久久av爽李琼| 欧美色爱综合网| 国产精品99久久久久久久女警| 亚洲国产精品一区二区www| 久久色在线观看| 欧美日韩国产一区二区三区地区| 国产一区二区不卡在线 | 91精品国产色综合久久ai换脸| 韩国精品一区二区| 亚洲第一av色| 亚洲欧美中日韩| 日韩写真欧美这视频| 色88888久久久久久影院野外 | 日韩在线a电影| 中文字幕在线观看一区二区| 欧美电视剧免费全集观看| 一本大道久久a久久综合| 丁香桃色午夜亚洲一区二区三区| 日韩国产欧美在线播放| 亚洲乱码国产乱码精品精的特点| 国产亚洲一区二区三区在线观看 | 日韩精品资源二区在线| 欧美日韩视频在线观看一区二区三区| 成人动漫一区二区在线| 精品一区二区综合| 美女一区二区在线观看| 日韩精品成人一区二区三区| 一区二区三区色| 亚洲人成精品久久久久| 国产精品乱码一区二三区小蝌蚪| 26uuu精品一区二区| 精品久久五月天| 欧美电视剧在线看免费| 欧美日韩亚洲综合一区| 欧美自拍丝袜亚洲| 在线欧美一区二区| 在线观看91精品国产入口| 97久久久精品综合88久久| 成人一区在线观看| 成人不卡免费av| 99re这里只有精品视频首页| 波多野结衣亚洲| 97精品国产露脸对白| 99久久精品国产毛片| 欧洲激情一区二区| 777xxx欧美| 精品国产一区二区三区久久影院 | 久久福利视频一区二区| 久久丁香综合五月国产三级网站| 韩国精品久久久| 成人免费毛片嘿嘿连载视频| 成年人国产精品| 99精品视频一区| 欧美色电影在线| 欧美大片日本大片免费观看| 日韩精品中文字幕一区| 久久久天堂av| 日韩毛片一二三区| 亚洲自拍偷拍网站| 亚洲美女免费在线| 天天色综合成人网| 久久99热狠狠色一区二区| 国产毛片精品国产一区二区三区| 国产综合成人久久大片91| 成人激情小说乱人伦| 欧美亚一区二区| 欧美电视剧免费观看| 中文字幕巨乱亚洲| 亚洲va韩国va欧美va精品| 毛片av一区二区| 成人午夜精品在线| 欧美私人免费视频| 国产日韩av一区二区| 亚洲成人在线观看视频| 国产精品456| 91老师国产黑色丝袜在线| 欧美图区在线视频| 国产欧美一区视频| 婷婷综合五月天| 成人教育av在线| 日韩欧美一级在线播放| 国产精品久久久久久福利一牛影视| 艳妇臀荡乳欲伦亚洲一区| 国内成+人亚洲+欧美+综合在线| 93久久精品日日躁夜夜躁欧美| 91精品欧美一区二区三区综合在| 欧美大黄免费观看| 国产精品美女一区二区| 美女爽到高潮91| 色天天综合久久久久综合片| 久久久99精品免费观看| 日本亚洲免费观看| 99视频热这里只有精品免费| 日韩欧美123| 亚洲午夜免费视频| caoporm超碰国产精品| 欧美xxxxx裸体时装秀| 亚洲成国产人片在线观看| 91社区在线播放| 日本一区二区免费在线观看视频| 日本91福利区| 欧美精品久久久久久久多人混战 | 2023国产精品自拍| 五月天精品一区二区三区| 色婷婷久久99综合精品jk白丝| 久久久影院官网| 免费在线欧美视频| 欧美色爱综合网| 一区二区三区中文在线观看| 国产激情一区二区三区四区 | 国产精品素人视频| 久久91精品国产91久久小草| 91麻豆精品久久久久蜜臀 | 国产综合一区二区| 欧美一区二区国产| 日韩中文字幕亚洲一区二区va在线| 色噜噜偷拍精品综合在线| 中文字幕一区二区三区色视频 | 中文字幕精品综合| 国产成人啪免费观看软件| 久久伊99综合婷婷久久伊|