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

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

?? esc_seq.cpp

?? 使用BorlandC++4.5編譯的一個MUD客戶端程序
?? CPP
字號:
head	2.1;access;symbols;locks; strict;comment	@// @;2.1date	95.10.24.15.52.51;	author tsurace;	state Release;branches;next	1.4;1.4date	95.10.11.21.00.39;	author tsurace;	state Beta;branches;next	1.3;1.3date	95.10.08.23.27.53;	author tsurace;	state Exp;branches;next	1.2;1.2date	95.10.07.00.34.18;	author tsurace;	state Exp;branches;next	1.1;1.1date	95.10.05.18.33.42;	author tsurace;	state Exp;branches;next	;desc@EscapeSequence methods.@2.1log@Roll.@text@// esc_seq.cpp - escape sequence parser methods

#include <stdio.h>
#include <string.h>

#include "debug.hpp"
#include "esc_seq.hpp"

// These will need some adjustment to parse out the position code

static const char   ESCAPE = 27; // VT102 command prefix - escape

// ------------------------------------------------------------------------
// constructor
//
//   buf - null-terminated string
//
// The sense of the parser is that a function returns nonzero if it
// successfully parsed part of an escape sequence.
// -  Functions internally set the _isComplete to true if they
//    complete a sequence, and set _type appropriately.
// -  Functions that increment the buffer pointer are responsible for
//    checking for end of string.

EscapeSequence::EscapeSequence(char * buf)
: _type(NONE),
  _isComplete(0),
  _isEscapeSequence(1),
  _nParameters(0)
{
    ASSERT(NULL != buf, "Null pointer forbidden");
    
    if (_EndOfString(buf))       // Empty string?
        _isEscapeSequence = 0;
    else if (0 == _ParseEscapeSequence(buf))
        _isEscapeSequence = 0;
}

// ------------------------------------------------------------------------
// _SetType - sets the type for this, and assumes that it is now complete!
void EscapeSequence::_SetType(_Type type)
{
    _type = type;
    _isComplete = 1;
}

int EscapeSequence::_ParseEscapeSequence(char * buf)
{
    if (*buf == ESCAPE)
    {
        ++ buf; // Great!  Parsed a character
        if (_EndOfString(buf))
            return 1;           // Valid, but end of string

        return (_ScrollReverse(buf)
                || _LeftSquareBracket(buf));
    };
    return 0; // Not escape sequence
}

// ------------------------------------------------------------------------
// _ScrollReverse -- This is actually the reverse-newline sequence
//
int EscapeSequence::_ScrollReverse(char * buf)
{
    if (*buf == 'M')       // Reverse scroll code?
    {
        _SetType(REV_NEWLINE);
        return 1;
    };
    return 0;
}

// ------------------------------------------------------------------------
// Most escape sequences are prefixed by "Esc-["
//
int EscapeSequence::_LeftSquareBracket(char * buf)
{
    int ret_val = 0;       // Default is to assume that this is invalid
    
    if (*buf != '\[')
        ret_val = 0;
    else
    {    
        ++ buf;
        if (_EndOfString(buf))         // No more string
            ret_val = 1;
        else if (0 == _GetParameters(&buf)) // Not a valid sequence?
            ret_val = 0;
        else if (_EndOfString(buf)) // No terminator, not finished
            ret_val = 1;
        else
        {
            switch (*buf)          // Get type from terminator
            {
              case 'J':            // Might be a clear screen if parameter = 2
                if (1 == ParameterCount() && Parameter(0) == 2)
                {
                    _SetType(CLRSCR);
                    ret_val = 1;
                };
                break;
                
              case 'K':                // CLREOL
                if (0 == _nParameters) // Must have no parameters
                {
                    _SetType(CLREOL);
                    ret_val = 1;
                };
                break;
                
              case 'H':                        // Cursor move
                if (2 == ParameterCount())     // Exactly two parameters?
                {
                    _SetType(CMOVE);
                    ret_val = 1;
                };
                break;
                
              case 'r':                    // Set scroll region 
                if (2 == ParameterCount()) // Exactly two parameters?
                {
                    _SetType(SCROLL);
                    ret_val = 1;
                };
                break;
                
              case 'm':            // Ansi screen color/attribute sequence
                _SetType(ANSI_COLOR);
                ret_val = 1; 
                break;
                
              default:             // Not escape sequence
                break;
            };
        };
    };
    return ret_val; // No match
}
        
// ------------------------------------------------------------------------
// _GetParameters - Count the parameters.
//
// Leaves the pointer buf pointing at the first character after the
// parameters, which may be end-of-string.
//
// Returns:
//   zero if for some reason this can't be an escape sequence
//
int EscapeSequence::_GetParameters(char ** buf)
{
    ASSERT(NULL != buf, "Invalid pointer?");
    ASSERT(NULL != *buf, "Invalid string?");
    
    int ret_val = 1; // So far, this is an escape sequence

    int value;           // Scanned numeric value
    int chars_read;      // Number of characters scanned from string
    int fields_scanned;  // Number of fields matched
    while (1)          // Loop forever
    {
        // Check for integer value first
        
        fields_scanned = sscanf(*buf, "%d%n", &value, &chars_read);
        if (0 == fields_scanned) // Nothing scanned
            break;
        else if (1 == fields_scanned)
        {
            if (_nParameters >= 20)
            {
                // Give up on this escape sequence--too many parameters.
                ret_val = 0; 
                break;
            };
            _parameters[_nParameters] = value;
            ++ _nParameters;
            *buf += chars_read; // Move to next parameter
        };

        // Check for semicolon or terminator
        if (_EndOfString(*buf))          // End of string, not finished
            break;
        else if (**buf == ';')           // Another parameter?
            ++ *buf;                     // Keep going
        else
            break;                       // No more parameters, exit
    };
    return ret_val; 
}

// EOF //
@1.4log@Changed from assert to ASSERT.@text@@1.3log@Rearranged parsing algorithm to allow variable numbers of parametersto better support ANSI color/attribute sequences.@text@a2 1#include <assert.h>d6 1d31 1a31 1    assert(NULL != buf); // Null pointer forbiddend152 2a153 2    assert(NULL != buf);   // Invalid pointer?    assert(NULL != *buf);  // Invalid string?@1.2log@Fixed ClearScreen lockup bug.@text@d28 2a29 1  _isEscapeSequence(1)d79 6a84 2    if (*buf == '\[')    {d86 51a136 8        if (_EndOfString(buf))            return 1;        return (_ClearScreen(buf)                || _ClearEOL(buf)                || _BoldOn(buf)                || _BoldOff(buf)                || _TwoParameters(buf));d138 1a138 1    return 0; // No matchd142 9a150 2// Not implementedint EscapeSequence::_ClearScreen(char * buf)d152 4a155 24    // ClearScreen ends with 2J     if (*buf == '2')     {        ++ buf;        if (_EndOfString(buf))            return 1;          // Valid/incomplete        else if (*buf == 'J')   // Clrscr?        {            _SetType(CLRSCR); // Complete escape sequence            return 1;    // Valid escape sequence        };    };    return 0;        // Not a clear screen}int EscapeSequence::_ClearEOL(char * buf){    if (*buf == 'K')            // CLREOL ends with a K    {        _SetType(CLREOL);       // Complete        return 1;               // Valid escape sequence    };    return 0;                   // Not clreol}d157 4a160 4int EscapeSequence::_BoldOn(char * buf){    // ClearScreen ends with 2J     if (*buf == '1') d162 6a167 4        ++ buf;        if (_EndOfString(buf))            return 1;        else if (*buf == 'm')d169 9a177 2            _SetType(BOLD_ON); // Complete escape sequence            return 1;    // Valid escape sequencea178 3    };    return 0;        // Not a bold on}d180 7a186 69int EscapeSequence::_BoldOff(char * buf){    if (*buf == 'm')            // May also be 0m, I think    {        _SetType(BOLD_OFF);     // Complete        return 1;               // Valid escape sequence    };    return 0;                   // Not clreol}// ------------------------------------------------------------------------// TwoParameters - all types that take two parameters fall into this//   categoryint EscapeSequence::_TwoParameters(char * buf){    int chars_read1, chars_read2; // Number of characters scanned from string        int n_scanned = sscanf(buf, "%d%n;%d%n",                           &_parameters[0],                           &chars_read1,                           &_parameters[1],                           &chars_read2);        char * new_buf; // Extra char pointer    if (n_scanned == 2)    {        new_buf = buf + chars_read2;        if (_EndOfString(new_buf))        // Not complete, but valid?            return 1;        else                              // More data!        {            return (_CursorMove(new_buf)                    || _Scroll(new_buf));        };    }    else if (n_scanned == 1)    {        // Note:  chars_read is invalid here        new_buf = buf + chars_read1;        if (_EndOfString(new_buf)       // Is there more to come?            || *new_buf == ';')        {            return 1;        };    }    else        assert(0);                     // Internal error            return 0; // Not a 2-parameter}// ------------------------------------------------------------------------// _CursorMove takes two parameters, then the terminator.int EscapeSequence::_CursorMove(char * buf){    if (*buf == 'H')               {        _SetType(CMOVE);     // Complete        return 1;               // Valid escape sequence    };    return 0;                   // Not this one}int EscapeSequence::_Scroll(char * buf){    if (*buf == 'r')               {        _SetType(SCROLL);       // Complete        return 1;               // Valid escape sequenced188 1a188 1    return 0;                   // Not this oned191 1a191 32#ifdef QQQ // comment out - obsolete// Consider a train of newlines to be one "escape sequence"//int EscapeSequence::_ParseNewlineSequence(char * buf){    int count = 0;    while(1)    {        if (_EndOfString(buf))            break;        else if (*buf == '\n')        {            ++ buf;            ++ count;        }        else if (count > 0)        {            _parameters[0] = count;            _parameters[1] = *buf;            _SetType(NEWLINE);       // Complete sequence!            break;        }        else                        // Not a newline sequence            break;    };    if (count > 0)              // Newline sequence!        return 1;        return 0;                   // Not a newline sequence}#endif // QQQ@1.1log@Initial revision@text@a38 8// _EndOfString - returns nonzero at the NULL at the end of a string//int EscapeSequence::_EndOfString(char * buf){    return (*buf == '\0');}// ------------------------------------------------------------------------d61 1a61 1// _ScrollReverse, for some reason, is not prefixed by a "["d67 1a67 1        _SetType(SCR_REV);d101 3a103 2        if (! _EndOfString(buf)            && *buf == 'J')d106 1a107 1        return 1;    // Valid escape sequence@

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91在线观看成人| 蜜桃av一区二区三区| 国产美女主播视频一区| 精品久久一区二区| 国产一区欧美日韩| 欧美韩国一区二区| 色美美综合视频| 亚洲国产美国国产综合一区二区| 欧美亚洲一区二区三区四区| 亚洲成人资源网| 精品国产3级a| 成人av在线电影| 亚洲综合丝袜美腿| 日韩天堂在线观看| 成人18精品视频| 天堂久久久久va久久久久| 欧美哺乳videos| 不卡视频在线观看| 亚洲va欧美va国产va天堂影院| 欧美丰满少妇xxxbbb| 91欧美一区二区| 亚洲人成网站在线| 91精选在线观看| 国产成人精品综合在线观看| 亚洲色图欧美激情| 91精品国产91久久久久久一区二区 | 久久精品免费在线观看| 成人黄色电影在线| 五月婷婷激情综合网| 欧美xxxxx牲另类人与| jvid福利写真一区二区三区| 亚洲成人免费电影| 国产精品你懂的在线欣赏| 欧美亚洲国产bt| 国产精品自在欧美一区| 亚洲国产精品久久不卡毛片| 欧美成人伊人久久综合网| 91丨九色丨国产丨porny| 蜜臀a∨国产成人精品| ...av二区三区久久精品| 日韩欧美另类在线| 欧洲视频一区二区| 国产98色在线|日韩| 日韩精品色哟哟| 亚洲欧美日韩综合aⅴ视频| 精品国产不卡一区二区三区| 欧美综合一区二区三区| 国产不卡在线播放| 六月丁香综合在线视频| 亚洲免费看黄网站| 中文字幕乱码亚洲精品一区| 日韩视频一区二区在线观看| 色哟哟精品一区| 成人免费看黄yyy456| 老司机一区二区| 视频在线观看一区二区三区| 综合电影一区二区三区| 国产欧美日韩激情| 精品免费国产二区三区| 欧美日韩一本到| 91久久精品一区二区二区| 国产成人精品免费在线| 久久不见久久见中文字幕免费| 亚洲美女精品一区| 亚洲女性喷水在线观看一区| 国产三级精品在线| 久久精品亚洲精品国产欧美kt∨| 日韩限制级电影在线观看| 欧美视频中文字幕| 在线视频一区二区三区| 91理论电影在线观看| 成人黄色国产精品网站大全在线免费观看| 久久国产精品99精品国产| 美女高潮久久久| 男女性色大片免费观看一区二区| 一区二区三区四区中文字幕| 色狠狠色噜噜噜综合网| 国产福利一区二区三区视频 | 懂色中文一区二区在线播放| 秋霞午夜鲁丝一区二区老狼| 亚洲成人高清在线| 午夜私人影院久久久久| 一区二区在线观看视频| 亚洲综合精品自拍| 亚洲3atv精品一区二区三区| 亚洲.国产.中文慕字在线| 午夜在线成人av| 日韩福利视频导航| 韩国av一区二区三区四区| 国产精选一区二区三区| 成人黄色a**站在线观看| 91麻豆免费在线观看| 色999日韩国产欧美一区二区| 在线观看三级视频欧美| 欧美亚州韩日在线看免费版国语版| 91福利社在线观看| 777色狠狠一区二区三区| 在线综合视频播放| 久久一夜天堂av一区二区三区| 久久久一区二区三区| 亚洲欧洲三级电影| 亚洲国产aⅴ天堂久久| 免费一区二区视频| 国产91精品露脸国语对白| 91美女福利视频| 欧美va亚洲va| 国产精品久久久久久久午夜片| 国产精品电影院| 亚洲va欧美va人人爽| 国产永久精品大片wwwapp | 一区免费观看视频| 午夜久久久久久电影| 国产一区在线观看视频| 91一区一区三区| 日韩一区二区三区精品视频| 国产女主播视频一区二区| 亚洲精品久久7777| 精品一区二区三区久久| 成人手机电影网| 9191国产精品| 国产精品欧美一区喷水| 日韩高清一级片| 91丨porny丨最新| 欧美大片在线观看| 一区二区三区在线看| 狠狠v欧美v日韩v亚洲ⅴ| 欧美在线观看一二区| 久久久国产精华| 蜜桃久久精品一区二区| 91麻豆自制传媒国产之光| 久久久久久久久蜜桃| 午夜婷婷国产麻豆精品| 成人动漫在线一区| 精品sm在线观看| 午夜亚洲福利老司机| www.成人在线| 欧美精品一区二区三区很污很色的 | 亚洲电影你懂得| 国产91精品免费| 精品国产一二三| 日韩中文字幕亚洲一区二区va在线| 成人国产精品免费网站| 欧美sm美女调教| 首页亚洲欧美制服丝腿| 色哟哟国产精品| 国产精品久久久久久久午夜片 | 国产美女久久久久| 911国产精品| 亚洲第一成人在线| 91社区在线播放| 国产精品素人视频| 国产伦精品一区二区三区免费迷 | 久久一二三国产| 蜜臀av性久久久久蜜臀av麻豆| 91蜜桃传媒精品久久久一区二区| 中文字幕欧美区| 国产成人av福利| 久久男人中文字幕资源站| 青娱乐精品在线视频| 欧美日韩在线播| 亚洲成人先锋电影| 欧美日韩黄色影视| 午夜a成v人精品| 欧美日韩精品一区视频| 亚洲国产裸拍裸体视频在线观看乱了| 91在线视频官网| 亚洲视频 欧洲视频| 福利一区二区在线| 国产精品伦一区| 色欲综合视频天天天| 亚洲色图在线播放| 91久久精品一区二区三区| 亚洲精品视频免费观看| 色综合久久99| 亚洲超碰精品一区二区| 欧美日韩国产在线观看| 天堂久久一区二区三区| 欧美成人激情免费网| 国产成人免费视频一区| 欧美国产精品一区二区三区| 国产99久久精品| 亚洲女同一区二区| 欧美日韩成人综合天天影院| 日韩国产欧美在线播放| 日韩一区二区电影网| 国产白丝精品91爽爽久久| 亚洲日本乱码在线观看| 色88888久久久久久影院按摩| 夜色激情一区二区| 欧美一区午夜精品| 国产一区二区精品久久99| 国产精品久久久久久户外露出| 91天堂素人约啪| 天天综合色天天综合色h| 久久亚区不卡日本| 91亚洲男人天堂| 日日夜夜免费精品| 国产日韩成人精品| 欧美最新大片在线看| 老司机免费视频一区二区|