荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: zzt (好好学习,天天向上), 信区: Linux
标  题: 写乐一个抓msg的程序(for bbs)!
发信站: BBS 荔园晨风站 (Thu Feb 17 19:44:01 2000), 站内信件

发信人: PeterPan (你快跳啊), 信区: Linux
标  题: 写乐一个抓msg的程序(for bbs)!
发信站: 一网深情 (Wed Jun  9 22:31:49 1999), 转信

【 以下文字转载自 Unix 讨论区 】
【 原文由 PeterPan 所发表 】
    用于抓收到的和回别人的msg, 花了一整天的时间总算写成乐,
贴出来于大家共享.

文件名:
        catchmsg.cpp
编译:
        g++ catchmsg.cpp -o catchmsg
用法是这样的:
        telnet bbs.your.host |catchmsg savefile
祝:
        广大的热爱Linux和Unix的GGDD们和JJMM们聊天快乐,
把更多美好回忆留在按ext2格式化的硬盘上和心中.
                                                ----蜀南血梦

#include<iostream.h>
#include<fstream.h>
#define MSG_INIT 0
#define MSG_BEGIN 1
#define MSG_PAUSE 2
#define MSG_STOP 3
#define MSG_RESUME 4
#define MSG_ESC 5

struct CStateNode{
        int nStart;
        int nEnd;
        char *pszSteps;
        char *pszFullSteps;
}aStateNodes[100]={
        {0,MSG_ESC,"\x1b[","\x1b["},
        {MSG_ESC,MSG_BEGIN,"0;1;44;36m","\x1b[0;1;44;36m"},
        {0,MSG_BEGIN,"立即回讯息给","立即回讯息给"},
        {0,MSG_BEGIN,"回讯息给","回讯息给"},
        {MSG_ESC,MSG_PAUSE,"4;","\x1b[4;"},
        {MSG_ESC,MSG_PAUSE,"1;","\x1b[1;"},
        {0,MSG_STOP,"\r","\r\n"},
        {MSG_ESC,MSG_RESUME,"2;","\x1b[2;"},
        {0,0,NULL}};
int nState=0;
int nCurNode=0;
int nCurPos=0;
int StepOn(char c,const char **pp)
{
        CStateNode *psn=aStateNodes+nCurNode;
        if(psn->pszSteps[nCurPos]=='\0'){
                nCurPos=0;
                CStateNode *p=aStateNodes;
                while(p->pszSteps!=NULL){
                        if(p->nStart==nState)
                                goto ok;
                        p++;
                        nCurNode++;
                }
                nState=nCurNode=0;
        }
ok:
        psn=aStateNodes+nCurNode;
        while(psn->pszSteps!=NULL){
                if(psn->nStart==nState&&c==psn->pszSteps[nCurPos]){
                        nCurPos++;
                        if(psn->pszSteps[nCurPos]=='\0'){
                                *pp=psn->pszFullSteps;
                                nState=psn->nEnd;
                        }else
                                *pp=NULL;
                        return nState;
                }
                nCurPos=0;
                nCurNode++;
                psn++;
        }
        nState=nCurNode=nCurPos=0;
        *pp=NULL;
//try again;
        psn=aStateNodes+nCurNode;
        while(psn->pszSteps!=NULL){
                if(psn->nStart==nState&&c==psn->pszSteps[nCurPos]){
                        nCurPos++;
                        if(psn->pszSteps[nCurPos]=='\0'){
                                *pp=psn->pszFullSteps;
                                nState=psn->nEnd;
                        }else
                                *pp=NULL;
                        return nState;
                }
                nCurNode++;
                psn++;
        }
        nState=nCurNode=nCurPos=0;
        *pp=NULL;
        return nState;
}
void main(int argc,char ** argv)
{
        char c;
        int stat=0;
        const char *pszSteps;
        ofstream out(argv[1]);
        ofstream stat_out("catchmsg.dat");
        cin.get(c);
        while(!cin.eof()){
                cout.put(c);

                if(stat==0&&StepOn(c,&pszSteps)==MSG_BEGIN&& pszSteps){
                        out.write(pszSteps,strlen(pszSteps));
                        out.flush();
                        stat=MSG_BEGIN;
                }else if(stat==MSG_BEGIN||stat==MSG_RESUME){
                        int step=StepOn(c,&pszSteps);
                        if(step==MSG_PAUSE
                                && pszSteps){
                                stat=MSG_PAUSE;
                                out.put(c);
                                out.flush();
                        }else if(step==MSG_STOP
                                && pszSteps){
                                stat=0;
                                out.put(c);
                                out.put('\n');
                                out.flush();
                        }
                        if(stat&&stat!=MSG_PAUSE){
                                out.put(c);
                                out.flush();
                        }
                }else if(stat==MSG_PAUSE
                        &&StepOn(c,&pszSteps)==MSG_RESUME
                        && pszSteps){
                        stat=MSG_RESUME;
                        out.write(pszSteps,strlen(pszSteps));
                        out.flush();
                }

                cin.get(c);
        }
}

--
                        我是天堂,
                        你跳下来吧!
                        我是地狱,
                        你也跳下来吧!!
                        爱情的规则就如同商场的规则......
                        撑死胆大的,饿死胆小的.

※ 修改:.PeterPan 于 Jun  9 22:35:05 修改本文.[FROM: 202.115.16.23]
※ 来源:.一网深情 bbs.uestc.edu.cn.[FROM: 202.115.16.23]
--
※ 转载:.一网深情 bbs.uestc.edu.cn.[FROM: 202.115.16.23]

--
☆ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: bbs@192.168.1.11]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店