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

📄 win2mb.cpp

📁 让你在linux命令行下轻松支持中文显示和中文输入
💻 CPP
字号:
/***************************************************************************                          winime2mb.cpp  -  description                             -------------------    begin                : Tue Apr 3 2001    copyright            : (C) 2001 by ejoy    email                : ejoy@peoplemail.com.cn ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#include <iostream>#include <cstdlib>#include <unistd.h>#include <cstring>#include <string>#include <deque>#include <algorithm>#include <cassert>#include <fstream>using namespace std;struct WinImeHead {char mName[12];int mMaxCodes;char mCodeSet[47];char mWildChar;//unsigned int mIndex1,mIndex2,mText;};class Word{public:    Word(){mpOffset = NULL;}    Word(const Word& w);    ~Word(){};  string mText;  string mCode;  char* mpOffset;};Word::Word(const Word& w) {    mText = w.mText;    mCode = w.mCode;    mpOffset = w.mpOffset;}bool operator<(const Word& w1,const Word& w2) {        return w1.mCode < w2.mCode;}bool operator==(const Word& w1,const Word& w2) {    return w1.mCode == w2.mCode && w1.mText == w2.mText        && w1.mpOffset == w2.mpOffset;}const int SIZE = 81;char buf[SIZE];char o[SIZE],v[SIZE];char** I1;char** I2;WinImeHead h;typedef deque<class Word> LIST;LIST list;bool InCodeSet(char c) {    int len = strlen(h.mCodeSet);    char* p = find(h.mCodeSet,h.mCodeSet + len,c);    return p != h.mCodeSet + len;}    int Index(char c) {    int len = strlen(h.mCodeSet);    char* p = find(h.mCodeSet,h.mCodeSet + len,c);    return p - h.mCodeSet;}void GetOption(char buf[],char o[],char v[]) {    char *p = buf;    int i = 0;    while (*p != ' ' && *p != '=')        o[i++] = *p++;    o[i] = '\0';    while (*p == ' ' || *p == '=')        p++;    i = 0;    while (*p && *p != ' ')        v[i++] = *p++;    v[i] = '\0';}void ParseHead(istream& in) {    in.getline(buf,SIZE);     while ( in.getline(buf,SIZE) && buf[0] != '[') {         GetOption(buf,o,v);      if (strcmp("Name",o) == 0)           strcpy(h.mName,v);      else if (strcmp("MaxCodes",o) == 0)              h.mMaxCodes = atoi(v);      else if (strcmp("UsedCodes",o) == 0) {        if (strlen(o) > 46) {            cerr<<"UsedCodes exceed 46 chars!\n"<<endl;            exit(-1);        }        strcpy(h.mCodeSet,v);    }      else if (strcmp("WildChar",o) == 0)        h.mWildChar = v[0];     }    //while     //skip [Rule] if it exist     if (buf[1] == 'R')         while ( in.getline(buf,SIZE) && buf[0] != '['); }    void ParseText(istream& in) {     Word w;     skip:     while (in.getline(buf,SIZE) && strlen(buf) > 0) {        char* p = buf;       int i = 0;        while (!InCodeSet(*p)) {            o[i++] = *p++;            o[i++] = *p++;        }       o[i] = '\0';       w.mText = o;//      while (*p) {     i = 0;     while (*p && *p != ' ')       v[i++] = *p++;     v[i] = '\0';       w.mCode = v;       list.push_back(w);       //skip blanks//       while(*p && *p == ' ')//           p++;      }//     }}void BuildIndex() {     //build index     int len = strlen(h.mCodeSet);    I1 = new char*[len];    I2 = new char*[len * len];    // h.mIndex1 = sizeof(h);     //h.mIndex2 = h.mIndex1 + len * sizeof(char *);     //h.mText = h.mIndex2 + len * len * sizeof(char *);     fill(I1,I1 + len,(char*)0xffffffff);     fill(I2,I2 + len * len,(char*)0xffffffff);        LIST::iterator w;    char* p = 0;     for(w = list.begin();w != list.end();w++) {         w->mpOffset = p;         p+= w->mCode.size() + w->mText.size();     }    //build index     for(w = list.begin();w != list.end();w++) {         string s = w->mCode;//         cerr<<w->mCode<<"  :"<<w->mCode.size()<<endl;//         cerr<<w->mText<<"  :"<<w->mText.size()<<endl<<flush;        int i;         if( s.size() > 0) {             i = Index(s[0]);             if (I1[i] == (char*)0xffffffff)                 I1[i] = w->mpOffset;            if (s.size() > 1) {                 i = i * len + Index(s[1]);                 if (I2[i] == (char*)0xffffffff)                     I2[i] = w->mpOffset;             }         }     }}void Output(ostream& out) {    out.write((char*)&h,sizeof(h));    int len = strlen(h.mCodeSet);    out.write((char*)I1,len * sizeof(char*));    out.write((char*)I2,len * len * sizeof(char*));     for(LIST::iterator w = list.begin();w < list.end();w++) {         out<<w->mCode<<w->mText;         //cerr<<w->mCode<<":"<<(int)w->mpOffset<<"\t";         //cerr<<w->mText<<":"<<(int)w->mpOffset<<endl;     }    char* p = 0; //end tag     out.write((char*)&p,sizeof(char*));}int main(int argc,char** argv){        ParseHead(cin);    ParseText(cin);    BuildIndex();    Output(cout);     return 0;}

⌨️ 快捷键说明

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