source insight 配置宏

来源:互联网 发布:linux root权限不够 编辑:程序博客网 时间:2024/05/21 09:27
/** * @file      onejacky_v1.0.em * @author    onejacky(wanshijie@126.com) * @version   v1.0 * @date      2014-7-27 * @brief     sourc insight 3.5  宏,英文版本  **************************************************************************** * @note: ref url * http://www.cnblogs.com/Red_angelX/p/3713935.html **************************************************************************** * @history: * 1. date :  2014-7-27 *   author:  onejacky(wanshijie@126.com) *   change:  creat file **************************************************************************** */macro AutoExpand(){    //配置信息    // get window, sel, and buffer handles    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    sel = GetWndSel(hwnd)    if(sel.lnFirst != sel.lnLast)    {        /*块命令处理*/        BlockCommandProc()    }    if (sel.ichFirst == 0)        stop    hbuf = GetWndBuf(hwnd)    language = getreg(LANGUAGE)    if(language != 1)    {        language = 0    }    nVer = 0    nVer = GetVersion()    /*取得用户名*/    szMyName = getreg(MYNAME)    if(strlen( szMyName ) == 0)    {        szMyName = Ask("Enter your name:")        setreg(MYNAME, szMyName)    }    // get line the selection (insertion point) is on    szLine = GetBufLine(hbuf, sel.lnFirst);    // parse word just to the left of the insertion point    wordinfo = GetWordLeftOfIch(sel.ichFirst, szLine)    ln = sel.lnFirst;    chTab = CharFromAscii(9)    // prepare a new indented blank line to be inserted.    // keep white space on left and add a tab to indent.    // this preserves the indentation level.    chSpace = CharFromAscii(32);    ich = 0    while (szLine[ich] == chSpace || szLine[ich] == chTab)    {        ich = ich + 1    }    szLine1 = strmid(szLine,0,ich)    szLine = strmid(szLine, 0, ich) # "    "    sel.lnFirst = sel.lnLast    sel.ichFirst = wordinfo.ich    sel.ichLim = wordinfo.ich    /*自动完成简化命令的匹配显示*/    wordinfo.szWord = RestoreCommand(hbuf,wordinfo.szWord)    sel = GetWndSel(hwnd)    if (wordinfo.szWord == "pn") /*问题单号的处理*/    {        DelBufLine(hbuf, ln)        AddPromblemNo()        return    }    /*配置命令执行*/    else if (wordinfo.szWord == "config" || wordinfo.szWord == "co")    {        DelBufLine(hbuf, ln)        ConfigureSystem()        return    }    /*修改历史记录更新*/    else if (wordinfo.szWord == "hi")    {        DelBufLine(hbuf, ln)        InsertHistory(hbuf,ln,language)        return    }    else if (wordinfo.szWord == "abg")    {        sel.ichFirst = sel.ichFirst - 3        SetWndSel(hwnd,sel)        InsertReviseAdd()        PutBufLine(hbuf, ln+1 ,szLine1)        SetBufIns(hwnd,ln+1,sel.ichFirst)        return    }    else if (wordinfo.szWord == "dbg")    {        sel.ichFirst = sel.ichFirst - 3        SetWndSel(hwnd,sel)        InsertReviseDel()        PutBufLine(hbuf, ln+1 ,szLine1)        SetBufIns(hwnd,ln+1,sel.ichFirst)        return    }    else if (wordinfo.szWord == "mbg")    {        sel.ichFirst = sel.ichFirst - 3        SetWndSel(hwnd,sel)        InsertReviseMod()        PutBufLine(hbuf, ln+1 ,szLine1)        SetBufIns(hwnd,ln+1,sel.ichFirst)        return    }    else if (wordinfo.szWord == "ash")    {        AddStructHeader()        return    }    else if (wordinfo.szWord == "aeh")    {        AddEnumHeader()        return    }    //if(language == 1)    //{    //    ExpandProcEN(szMyName,wordinfo,szLine,szLine1,nVer,ln,sel)    //}    //else    //{    //    ExpandProcCN(szMyName,wordinfo,szLine,szLine1,nVer,ln,sel)    //}    ExpandProcEN(szMyName,wordinfo,szLine,szLine1,nVer,ln,sel)}macro ExpandProcEN(szMyName,wordinfo,szLine,szLine1,nVer,ln,sel){    szCmd = wordinfo.szWord    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    hbuf = GetWndBuf(hwnd)    /*英文注释*/    if (szCmd == "/*")    {        if(wordinfo.ichLim > 70)        {            Msg("The right margine is small, Please use a new line")            stop        }        szCurLine = GetBufLine(hbuf, sel.lnFirst);        szLeft = strmid(szCurLine,0,wordinfo.ichLim)        lineLen = strlen(szCurLine)        kk = 0        while(wordinfo.ichLim + kk < lineLen)        {            if((szCurLine[wordinfo.ichLim + kk] != " ")||(szCurLine[wordinfo.ichLim + kk] != "\t")            {                msg("you must insert /* at the end of a line");                return            }            kk = kk + 1        }        szContent = Ask("Please input comment")        DelBufLine(hbuf, ln)        szLeft = cat( szLeft, " ")        CommentContent(hbuf,ln,szLeft,szContent,1)        return    }    else if(szCmd == "{")    {        InsBufLine(hbuf, ln + 1, "@szLine@")        InsBufLine(hbuf, ln + 2, "@szLine1@" # "}");        SetBufIns (hbuf, ln + 1, strlen(szLine))        return    }    else if (szCmd == "while" )    {        SetBufSelText(hbuf, " (#) {")        InsBufLine(hbuf, ln + 1, "@szLine@" # "#");        InsBufLine(hbuf, ln + 2, "@szLine1@" # "}");    }    else if (szCmd == "for")    {        SetBufSelText(hbuf, " (#; #; #) {")        InsBufLine(hbuf, ln + 1, "@szLine@" # "#")        InsBufLine(hbuf, ln + 2, "@szLine1@" # "}")        SetWndSel(hwnd, sel)        SearchForward()        szVar = ask("Please input loop variable")        newsel = sel        newsel.ichLim = GetBufLineLength (hbuf, ln)        SetWndSel(hwnd, newsel)        SetBufSelText(hbuf, " (@szVar@ = # ; @szVar@ # ; @szVar@++ ) {")    }    else if (szCmd == "if")    {        SetBufSelText(hbuf, " (#) {")        InsBufLine(hbuf, ln + 1, "@szLine@" # "#");        InsBufLine(hbuf, ln + 2, "@szLine1@" # "}");    }    else if( szCmd == "else" )    {        SetBufSelText(hbuf, " {")        InsBufLine(hbuf, ln + 1, "@szLine@" # "#");        InsBufLine(hbuf, ln + 2, "@szLine1@" # "}");    }    else if (szCmd == "ef")    {        PutBufLine(hbuf, ln, szLine1 # "else if (#){")        InsBufLine(hbuf, ln + 1, "@szLine@" # "#");        InsBufLine(hbuf, ln + 2, "@szLine1@" # "}");    }    else if (szCmd == "ife")    {        PutBufLine(hbuf, ln, szLine1 # "if (#) {")        InsBufLine(hbuf, ln + 1, "@szLine@" # "#");        InsBufLine(hbuf, ln + 2, "@szLine1@" # "} else {");        InsBufLine(hbuf, ln + 3, "@szLine@" # "#");        InsBufLine(hbuf, ln + 4, "@szLine1@" # "}");    }    else if (szCmd == "ifs")    {        PutBufLine(hbuf, ln, szLine1 # "if (#) {")        InsBufLine(hbuf, ln + 1, "@szLine@" # "#");        InsBufLine(hbuf, ln + 2, "@szLine1@" # "} else if (#) {");        InsBufLine(hbuf, ln + 3, "@szLine@" # "#");        InsBufLine(hbuf, ln + 4, "@szLine1@" # "} else {");        InsBufLine(hbuf, ln + 5, "@szLine@" # "#");        InsBufLine(hbuf, ln + 6, "@szLine1@" # "}");    }    else if (szCmd == "#ifd" || szCmd == "#ifdef") //#ifdef    {        DelBufLine(hbuf, ln)        InsIfdef()        return    }    else if (szCmd == "#ifn" || szCmd == "#ifndef") //#ifndef    {        DelBufLine(hbuf, ln)        InsIfndef()        return    }    else if (szCmd == "#if")    {        DelBufLine(hbuf, ln)        InsertPredefIf()        return    }    else if (szCmd == "cpp")    {        DelBufLine(hbuf, ln)        InsertCPP(hbuf,ln)        return    }    else if (szCmd == "fo")    {        SetBufSelText(hbuf, "r (i = 0; i < #; i++) {")        InsBufLine(hbuf, ln + 1, "@szLine@" # "#")        InsBufLine(hbuf, ln + 2, "@szLine1@" # "}")        symname =GetCurSymbol ()        symbol = GetSymbolLocation(symname)        if(strlen(symbol) > 0)        {            nIdx = symbol.lnName + 1;            while( 1 )            {                szCurLine = GetBufLine(hbuf, nIdx);                nRet = strstr(szCurLine,"{")                if( nRet != 0xffffffff )                {                    break;                }                nIdx = nIdx + 1                if(nIdx > symbol.lnLim)                {                    break                }             }             InsBufLine(hbuf, nIdx + 1, "    UINT32_T ulI = 0;");         }    }    else if (szCmd == "switch" )    {        nSwitch = ask("Please input the number of case")        PutBufLine(hbuf, ln, szLine1 # "switch (#) {")        InsertMultiCaseProc(hbuf, szLine1, nSwitch)    }    else if (szCmd == "do")    {        PutBufLine(hbuf, ln, szLine1 # "do {")        InsBufLine(hbuf, ln + 1, "@szLine@" # "#");        InsBufLine(hbuf, ln + 2, "@szLine1@" # "} while ( # );")    }    else if (szCmd == "case" )    {        SetBufSelText(hbuf, " # :")        InsBufLine(hbuf, ln + 1, "@szLine@" # "#")        InsBufLine(hbuf, ln + 2, "@szLine@" # "break;")    }    else if (szCmd == "struct" || szCmd == "st")    {        DelBufLine(hbuf, ln)        szStructName = Ask("Please input struct name")        InsBufLine(hbuf, ln, "@szLine1@typedef struct");        PutBufLine(hbuf, ln, szLine1 # "typedef struct{")        InsBufLine(hbuf, ln + 1, "@szLine@             ");        szStructName = cat(szStructName,"_t")        InsBufLine(hbuf, ln + 2, "@szLine1@}@szStructName@;");        SetBufIns (hbuf, ln + 1, strlen(szLine))        return    }    else if (szCmd == "enum" || szCmd == "en")    {        DelBufLine(hbuf, ln)        szStructName = Ask("Please input enum name")        InsBufLine(hbuf, ln, "@szLine1@typedef enum");        PutBufLine(hbuf, ln, szLine1 # "typedef enum{")        InsBufLine(hbuf, ln + 1, "@szLine@             ");        szStructName = cat(szStructName,"_t")        InsBufLine(hbuf, ln + 2, "@szLine1@}@szStructName@;");        SetBufIns (hbuf, ln + 1, strlen(szLine))        return    }    else if (szCmd == "file" || szCmd == "fi")    {        DelBufLine(hbuf, ln)        InsertFileHeaderEN( hbuf,0, szMyName,"" )        return    }    else if (szCmd == "filec")    {        while (1) {            myfile = getreg(MYFILEC)            if(strlen( myfile ) == 0)            {                myfile = Ask("Cannot open your templet c file, Enter your templet c file path:")                setreg(MYFILEC, myfile)            }            templet = OpenBuf(myfile)            if (templet == hNil) {                myfile = Ask("Cannot open your templet c file, Enter your templet c file path:")                setreg(MYFILEC, myfile)            } else {                break;            }        }        DelBufLine(hbuf, ln)        numline = GetBufLineCount(templet)        i = 0        while (i < numline) {            line = GetBufLine(templet, i)            //msg(line)            InsBufLine(hbuf, i, line)            i = i+1        }        InsBufLine(hbuf, i, " ")    }    else if (szCmd == "fileh")    {        while (1) {            myfile = getreg(MYFILEH)            if(strlen( myfile ) == 0)            {                myfile = Ask("Cannot open your templet h file, Enter your templet h file path:")                setreg(MYFILEH, myfile)            }            templet = OpenBuf(myfile)            if (templet == hNil) {                myfile = Ask("Cannot open your templet h file, Enter your templet h file path:")                setreg(MYFILEH, myfile)            } else {                break;            }        }        DelBufLine(hbuf, ln)        numline = GetBufLineCount(templet)        i = 0        while (i < numline) {            line = GetBufLine(templet, i)            //msg(line)            InsBufLine(hbuf, i, line)            i = i+1        }        InsBufLine(hbuf, i, " ")    }    else if (szCmd == "func" || szCmd == "fu")    {        DelBufLine(hbuf,ln)        lnMax = GetBufLineCount(hbuf)        if(ln != lnMax)        {            szNextLine = GetBufLine(hbuf,ln)            if( (strstr(szNextLine,"(") != 0xffffffff) || (nVer != 2))            {                symbol = GetCurSymbol()                if(strlen(symbol) != 0)                {                    FuncHeadCommentEN(hbuf, ln, symbol, szMyName,0)                    return                }            }        }        szFuncName = Ask("Please input function name")        FuncHeadCommentEN(hbuf, ln, szFuncName, szMyName, 1)    }    else if (szCmd == "tab")    {        DelBufLine(hbuf, ln)        ReplaceBufTab()        return    }    else if (szCmd == "ap")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        szQuestion = AddPromblemNo()        InsBufLine(hbuf, ln, "@szLine1@/* Promblem Number: @szQuestion@     Author:@szMyName@,   Date:@sz@/@sz1@/@sz3@ ");        szContent = Ask("Description")        szLeft = cat(szLine1,"   Description    : ");        if(strlen(szLeft) > 70)        {            Msg("The right margine is small, Please use a new line")            stop        }        ln = CommentContent(hbuf,ln + 1,szLeft,szContent,1)        return    }    else if (szCmd == "hd")    {        DelBufLine(hbuf, ln)        CreateFunctionDef(hbuf,szMyName,1)        return    }    else if (szCmd == "hdn")    {        DelBufLine(hbuf, ln)        /*生成不要文件名的新头文件*/        CreateNewHeaderFile()        return    }    else if (szCmd == "ab")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        szQuestion = GetReg ("PNO")        if(strlen(szQuestion)>0)        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Added by @szMyName@, @sz@/@sz1@/@sz3@   PN:@szQuestion@ */");        }        else        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Added by @szMyName@, @sz@/@sz1@/@sz3@ */");        }        return    }    else if (szCmd == "ae")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        InsBufLine(hbuf, ln, "@szLine1@/* END:   Added by @szMyName@, @sz@/@sz1@/@sz3@ */");        return    }    else if (szCmd == "db")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        szQuestion = GetReg ("PNO")            if(strlen(szQuestion) > 0)        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Deleted by @szMyName@, @sz@/@sz1@/@sz3@   PN:@szQuestion@ */");        }        else        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Deleted by @szMyName@, @sz@/@sz1@/@sz3@ */");        }        return    }    else if (szCmd == "de")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln + 0)        InsBufLine(hbuf, ln, "@szLine1@/* END: Deleted by @szMyName@, @sz@/@sz1@/@sz3@ */");        return    }    else if (szCmd == "mb")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        szQuestion = GetReg ("PNO")        if(strlen(szQuestion) > 0)        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Modified by @szMyName@, @sz@/@sz1@/@sz3@   PN:@szQuestion@ */");        }        else        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Modified by @szMyName@, @sz@/@sz1@/@sz3@ */");        }        return    }    else if (szCmd == "me")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        InsBufLine(hbuf, ln, "@szLine1@/* END:   Modified by @szMyName@, @sz@/@sz1@/@sz3@ */");        return    }    else    {        SearchForward()//            ExpandBraceLarge()        stop    }    SetWndSel(hwnd, sel)    SearchForward()}macro ExpandProcCN(szMyName,wordinfo,szLine,szLine1,nVer,ln,sel){    szCmd = wordinfo.szWord    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    hbuf = GetWndBuf(hwnd)    //中文注释    if (szCmd == "/*")    {        if(wordinfo.ichLim > 70)        {            Msg("右边空间太小,请用新的行")            stop        }        szCurLine = GetBufLine(hbuf, sel.lnFirst);        szLeft = strmid(szCurLine,0,wordinfo.ichLim)        lineLen = strlen(szCurLine)        kk = 0        /*注释只能在行尾,避免注释掉有用代码*/        while(wordinfo.ichLim + kk < lineLen)        {            if(szCurLine[wordinfo.ichLim + kk] != " ")            {                msg("只能在行尾插入");                return            }            kk = kk + 1        }        szContent = Ask("请输入注释的内容")        DelBufLine(hbuf, ln)        szLeft = cat( szLeft, " ")        CommentContent(hbuf,ln,szLeft,szContent,1)        return    }    else if(szCmd == "{")    {        InsBufLine(hbuf, ln + 1, "@szLine@")        InsBufLine(hbuf, ln + 2, "@szLine1@" # "}");        SetBufIns (hbuf, ln + 1, strlen(szLine))        return    }    else if (szCmd == "while" || szCmd == "wh")    {        SetBufSelText(hbuf, " ( # )")        InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");        InsBufLine(hbuf, ln + 2, "@szLine@" # "#");        InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");    }    else if( szCmd == "else" || szCmd == "el")    {        InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");        InsBufLine(hbuf, ln + 2, "@szLine@");        InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");        SetBufIns (hbuf, ln + 2, strlen(szLine))        return    }    else if (szCmd == "#ifd" || szCmd == "#ifdef") //#ifdef    {        DelBufLine(hbuf, ln)        InsIfdef()        return    }    else if (szCmd == "#ifn" || szCmd == "#ifndef") //#ifdef    {        DelBufLine(hbuf, ln)        InsIfndef()        return    }    else if (szCmd == "#if")    {        DelBufLine(hbuf, ln)        InsertPredefIf()        return    }    else if (szCmd == "cpp")    {        DelBufLine(hbuf, ln)        InsertCPP(hbuf,ln)        return    }    else if (szCmd == "if")    {        SetBufSelText(hbuf, " ( # )")        InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");        InsBufLine(hbuf, ln + 2, "@szLine@" # "#");        InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");/*            InsBufLine(hbuf, ln + 4, "@szLine1@" # "else");        InsBufLine(hbuf, ln + 5, "@szLine1@" # "{");        InsBufLine(hbuf, ln + 6, "@szLine@" # ";");        InsBufLine(hbuf, ln + 7, "@szLine1@" # "}");*/    }    else if (szCmd == "ef")    {        PutBufLine(hbuf, ln, szLine1 # "else if ( # )")        InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");        InsBufLine(hbuf, ln + 2, "@szLine@" # "#");        InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");    }    else if (szCmd == "ife")    {        PutBufLine(hbuf, ln, szLine1 # "if ( # )")        InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");        InsBufLine(hbuf, ln + 2, "@szLine@" # "#");        InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");        InsBufLine(hbuf, ln + 4, "@szLine1@" # "else");        InsBufLine(hbuf, ln + 5, "@szLine1@" # "{");        InsBufLine(hbuf, ln + 6, "@szLine@" # ";");        InsBufLine(hbuf, ln + 7, "@szLine1@" # "}");    }    else if (szCmd == "ifs")    {        PutBufLine(hbuf, ln, szLine1 # "if ( # )")        InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");        InsBufLine(hbuf, ln + 2, "@szLine@" # "#");        InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");        InsBufLine(hbuf, ln + 4, "@szLine1@" # "else if ( # )");        InsBufLine(hbuf, ln + 5, "@szLine1@" # "{");        InsBufLine(hbuf, ln + 6, "@szLine@" # ";");        InsBufLine(hbuf, ln + 7, "@szLine1@" # "}");        InsBufLine(hbuf, ln + 8, "@szLine1@" # "else");        InsBufLine(hbuf, ln + 9, "@szLine1@" # "{");        InsBufLine(hbuf, ln + 10, "@szLine@" # ";");        InsBufLine(hbuf, ln + 11, "@szLine1@" # "}");    }    else if (szCmd == "for")    {        SetBufSelText(hbuf, " ( # ; # ; # )")        InsBufLine(hbuf, ln + 1, "@szLine1@" # "{")        InsBufLine(hbuf, ln + 2, "@szLine@" # "#")        InsBufLine(hbuf, ln + 3, "@szLine1@" # "}")        SetWndSel(hwnd, sel)        SearchForward()        szVar = ask("请输入循环变量")        newsel = sel        newsel.ichLim = GetBufLineLength (hbuf, ln)        SetWndSel(hwnd, newsel)        SetBufSelText(hbuf, " ( @szVar@ = # ; @szVar@ # ; @szVar@++ )")    }    else if (szCmd == "fo")    {        SetBufSelText(hbuf, "r ( ulI = 0; ulI < # ; ulI++ )")        InsBufLine(hbuf, ln + 1, "@szLine1@" # "{")        InsBufLine(hbuf, ln + 2, "@szLine@" # "#")        InsBufLine(hbuf, ln + 3, "@szLine1@" # "}")        symname =GetCurSymbol ()        symbol = GetSymbolLocation(symname)        if(strlen(symbol) > 0)        {            nIdx = symbol.lnName + 1;            while( 1 )            {                szCurLine = GetBufLine(hbuf, nIdx);                nRet = strstr(szCurLine,"{")                if( nRet != 0xffffffff )                {                    break;                }                nIdx = nIdx + 1                if(nIdx > symbol.lnLim)                {                    break                }            }            InsBufLine(hbuf, nIdx + 1, "    UINT32_T ulI = 0;");        }    }    else if (szCmd == "switch" || szCmd == "sw")    {        nSwitch = ask("请输入case的个数")        SetBufSelText(hbuf, " ( # )")        InsBufLine(hbuf, ln + 1, "@szLine1@" # "{")        InsertMultiCaseProc(hbuf,szLine1,nSwitch)    }    else if (szCmd == "do")    {        InsBufLine(hbuf, ln + 1, "@szLine1@" # "{")        InsBufLine(hbuf, ln + 2, "@szLine@" # "#");        InsBufLine(hbuf, ln + 3, "@szLine1@" # "} while ( # );")    }    else if (szCmd == "case" || szCmd == "ca" )    {        SetBufSelText(hbuf, " # :")        InsBufLine(hbuf, ln + 1, "@szLine@" # "#")        InsBufLine(hbuf, ln + 2, "@szLine@" # "break;")    }    else if (szCmd == "struct" || szCmd == "st" )    {        DelBufLine(hbuf, ln)        szStructName = toupper(Ask("请输入结构名:"))        InsBufLine(hbuf, ln, "@szLine1@typedef struct @szStructName@");        InsBufLine(hbuf, ln + 1, "@szLine1@{");        InsBufLine(hbuf, ln + 2, "@szLine@      ");        szStructName = cat(szStructName,"_STRU")        InsBufLine(hbuf, ln + 3, "@szLine1@}@szStructName@;");        SetBufIns (hbuf, ln + 2, strlen(szLine))        return    }    else if (szCmd == "enum" || szCmd == "en")    {        DelBufLine(hbuf, ln)        //提示输入枚举名并转换为大写        szStructName = toupper(Ask("请输入枚举名:"))        InsBufLine(hbuf, ln, "@szLine1@typedef enum @szStructName@");        InsBufLine(hbuf, ln + 1, "@szLine1@{");        InsBufLine(hbuf, ln + 2, "@szLine@       ");        szStructName = cat(szStructName,"_ENUM")        InsBufLine(hbuf, ln + 3, "@szLine1@}@szStructName@;");        SetBufIns (hbuf, ln + 2, strlen(szLine))        return    }    else if (szCmd == "file" || szCmd == "fi" )    {        DelBufLine(hbuf, ln)        /*生成文件头说明*/        InsertFileHeaderCN( hbuf,0, szMyName,"" )        return    }    else if (szCmd == "hd")    {        DelBufLine(hbuf, ln)        /*生成C语言的头文件*/        CreateFunctionDef(hbuf,szMyName,0)        return    }    else if (szCmd == "hdn")    {        DelBufLine(hbuf, ln)        /*生成不要文件名的新头文件*/        CreateNewHeaderFile()        return    }    else if (szCmd == "func" || szCmd == "fu")    {        DelBufLine(hbuf,ln)        lnMax = GetBufLineCount(hbuf)        if(ln != lnMax)        {            szNextLine = GetBufLine(hbuf,ln)            /*对于2.1版的si如果是非法symbol就会中断执行,故该为以后一行              是否有‘(’来判断是否是新函数*/            if( (strstr(szNextLine,"(") != 0xffffffff) || (nVer != 2))            {                /*是已经存在的函数*/                symbol = GetCurSymbol()                if(strlen(symbol) != 0)                {                    FuncHeadCommentCN(hbuf, ln, symbol, szMyName,0)                    return                }            }        }        szFuncName = Ask("请输入函数名称:")        /*是新函数*/        FuncHeadCommentCN(hbuf, ln, szFuncName, szMyName, 1)    }    else if (szCmd == "tab") /*将tab扩展为空格*/    {        DelBufLine(hbuf, ln)        ReplaceBufTab()    }    else if (szCmd == "ap")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        szQuestion = AddPromblemNo()        InsBufLine(hbuf, ln, "@szLine1@/* 问 题 单: @szQuestion@     修改人:@szMyName@,   时间:@sz@/@sz1@/@sz3@ ");        szContent = Ask("修改原因")        szLeft = cat(szLine1,"   修改原因: ");        if(strlen(szLeft) > 70)        {            Msg("右边空间太小,请用新的行")            stop        }        ln = CommentContent(hbuf,ln + 1,szLeft,szContent,1)        return    }    else if (szCmd == "ab")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        szQuestion = GetReg ("PNO")        if(strlen(szQuestion)>0)        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Added by @szMyName@, @sz@/@sz1@/@sz3@   问题单号:@szQuestion@ */");        }        else        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Added by @szMyName@, @sz@/@sz1@/@sz3@ */");        }        return    }    else if (szCmd == "ae")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        InsBufLine(hbuf, ln, "@szLine1@/* END:   Added by @szMyName@, @sz@/@sz1@/@sz3@ */");        return    }    else if (szCmd == "db")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        szQuestion = GetReg ("PNO")        if(strlen(szQuestion) > 0)        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Deleted by @szMyName@, @sz@/@sz1@/@sz3@   问题单号:@szQuestion@ */");        }        else        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Deleted by @szMyName@, @sz@/@sz1@/@sz3@ */");        }        return    }    else if (szCmd == "de")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln + 0)        InsBufLine(hbuf, ln, "@szLine1@/* END: Deleted by @szMyName@, @sz@/@sz1@/@sz3@ */");        return    }    else if (szCmd == "mb")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        szQuestion = GetReg ("PNO")        if(strlen(szQuestion) > 0)        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Modified by @szMyName@, @sz@/@sz1@/@sz3@   问题单号:@szQuestion@ */");        }        else        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Modified by @szMyName@, @sz@/@sz1@/@sz3@ */");        }        return    }    else if (szCmd == "me")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        InsBufLine(hbuf, ln, "@szLine1@/* END:   Modified by @szMyName@, @sz@/@sz1@/@sz3@ */");        return    }    else    {        SearchForward()        stop    }    SetWndSel(hwnd, sel)    SearchForward()}macro BlockCommandProc(){    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    sel = GetWndSel(hwnd)    hbuf = GetWndBuf(hwnd)    if(sel.lnFirst > 0)    {        ln = sel.lnFirst - 1    }    else    {        stop    }    szLine = GetBufLine(hbuf,ln)    szLine = TrimString(szLine)    if(szLine == "while" || szLine == "wh")    {        InsertWhile()   /*插入while*/    }    else if(szLine == "do")    {        InsertDo()   //插入do while语句    }    else if(szLine == "for")    {        InsertFor()  //插入for语句    }    else if(szLine == "if")    {        InsertIf()   //插入if语句    }    else if(szLine == "el" || szLine == "else")    {        InsertElse()  //插入else语句        DelBufLine(hbuf,ln)        stop    }    else if((szLine == "#ifd") || (szLine == "#ifdef"))    {        InsIfdef()        //插入#ifdef        DelBufLine(hbuf,ln)        stop    }    else if((szLine == "#ifn") || (szLine == "#ifndef"))    {        InsIfndef()        //插入#ifdef        DelBufLine(hbuf,ln)        stop    }    else if (szLine == "abg")    {        InsertReviseAdd()        DelBufLine(hbuf, ln)        stop    }    else if (szLine == "dbg")    {        InsertReviseDel()        DelBufLine(hbuf, ln)        stop    }    else if (szLine == "mbg")    {        InsertReviseMod()        DelBufLine(hbuf, ln)        stop    }    else if(szLine == "#if")    {        InsertPredefIf()        DelBufLine(hbuf,ln)        stop    }    DelBufLine(hbuf,ln)    SearchForward()    stop}macro RestoreCommand(hbuf,szCmd){    if(szCmd == "ca")    {        SetBufSelText(hbuf, "se")        szCmd = "case"    }    else if(szCmd == "sw")    {        SetBufSelText(hbuf, "itch")        szCmd = "switch"    }    else if(szCmd == "el")    {        SetBufSelText(hbuf, "se")        szCmd = "else"    }    else if(szCmd == "wh")    {        SetBufSelText(hbuf, "ile")        szCmd = "while"    }    return szCmd}macro SearchForward(){    LoadSearchPattern("#", 1, 0, 1);    Search_Forward}macro SearchBackward(){    LoadSearchPattern("#", 1, 0, 1);    Search_Backward}macro InsertFuncName(){    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    sel = GetWndSel(hwnd)    hbuf = GetWndBuf(hwnd)    symbolname = GetCurSymbol()    SetBufSelText (hbuf, symbolname)}macro strstr(str1,str2){    i = 0    j = 0    len1 = strlen(str1)    len2 = strlen(str2)    if((len1 == 0) || (len2 == 0))    {        return 0xffffffff    }    while( i < len1)    {        if(str1[i] == str2[j])        {            while(j < len2)            {                j = j + 1                if(str1[i+j] != str2[j])                {                    break                }            }            if(j == len2)            {                return i            }            j = 0        }        i = i + 1    }    return 0xffffffff}macro InsertTraceInfo(){    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    hbuf = GetWndBuf(hwnd)    sel = GetWndSel(hwnd)    symbol = GetSymbolLocationFromLn(hbuf, sel.lnFirst)    InsertTraceInCurFunction(hbuf,symbol)}macro InsertTraceInCurFunction(hbuf,symbol){    ln = GetBufLnCur (hbuf)    symbolname = symbol.Symbol    nLineEnd = symbol.lnLim    nExitCount = 1;    InsBufLine(hbuf, ln, "    DebugTrace(\"\\r\\n |@symbolname@() entry--- \");")    ln = ln + 1    fIsEnd = 1    fIsNeedPrt = 1    fIsSatementEnd = 1    szLeftOld = ""    while(ln < nLineEnd)    {        szLine = GetBufLine(hbuf, ln)        iCurLineLen = strlen(szLine)        /*剔除其中的注释语句*/        RetVal = SkipCommentFromString(szLine,fIsEnd)        szLine = RetVal.szContent        fIsEnd = RetVal.fIsEnd        //查找是否有return语句/*        ret =strstr(szLine,"return")        if(ret != 0xffffffff)        {            if( (szLine[ret+6] == " " ) || (szLine[ret+6] == "\t" )                || (szLine[ret+6] == ";" ) || (szLine[ret+6] == "(" ))            {                szPre = strmid(szLine,0,ret)            }            SetBufIns(hbuf,ln,ret)            Paren_Right            sel = GetWndSel(hwnd)            if( sel.lnLast != ln )            {                GetbufLine(hbuf,sel.lnLast)                RetVal = SkipCommentFromString(szLine,1)                szLine = RetVal.szContent                fIsEnd = RetVal.fIsEnd            }        }*/        //获得左边空白大小        nLeft = GetLeftBlank(szLine)        if(nLeft == 0)        {            szLeft = "    "        }        else        {            szLeft = strmid(szLine,0,nLeft)        }        szLine = TrimString(szLine)        iLen = strlen(szLine)        if(iLen == 0)        {            ln = ln + 1            continue        }        szRet = GetFirstWord(szLine)//        if( (szRet == "if") || (szRet == "else")        //查找是否有return语句//        ret =strstr(szLine,"return")        if( szRet == "return")        {            if( fIsSatementEnd == 0)            {                fIsNeedPrt = 1                InsBufLine(hbuf,ln+1,"@szLeftOld@}")                szEnd = cat(szLeft,"DebugTrace(\"\\r\\n |@symbolname@() exit---: @nExitCount@ \");")                InsBufLine(hbuf, ln, szEnd )                InsBufLine(hbuf,ln,"@szLeftOld@{")                nExitCount = nExitCount + 1                nLineEnd = nLineEnd + 3                ln = ln + 3            }            else            {                fIsNeedPrt = 0                szEnd = cat(szLeft,"DebugTrace(\"\\r\\n |@symbolname@() exit---: @nExitCount@ \");")                InsBufLine(hbuf, ln, szEnd )                nExitCount = nExitCount + 1                nLineEnd = nLineEnd + 1                ln = ln + 1            }        }        else        {            ret =strstr(szLine,"}")            if( ret != 0xffffffff )            {                fIsNeedPrt = 1            }        }        szLeftOld = szLeft        ch = szLine[iLen-1]        if( ( ch  == ";" ) || ( ch  == "{" )             || ( ch  == ":" )|| ( ch  == "}" ) || ( szLine[0] == "#" ))        {            fIsSatementEnd = 1        }        else        {            fIsSatementEnd = 0        }        ln = ln + 1    }    //只要前面的return后有一个}了说明函数的结尾没有返回,需要再加一个出口打印    if(fIsNeedPrt == 1)    {        InsBufLine(hbuf, ln,  "    DebugTrace(\"\\r\\n |@symbolname@() exit---: @nExitCount@ \");")        InsBufLine(hbuf, ln,  "")    }}macro GetFirstWord(szLine){    szLine = TrimLeft(szLine)    nIdx = 0    iLen = strlen(szLine)    while(nIdx < iLen)    {        if( (szLine[nIdx] == " ") || (szLine[nIdx] == "\t")          || (szLine[nIdx] == ";") || (szLine[nIdx] == "(")          || (szLine[nIdx] == ".") || (szLine[nIdx] == "{")          || (szLine[nIdx] == ",") || (szLine[nIdx] == ":") )        {            return strmid(szLine,0,nIdx)        }        nIdx = nIdx + 1    }    return ""}macro AutoInsertTraceInfoInBuf(){    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    sel = GetWndSel(hwnd)    hbuf = GetWndBuf(hwnd)    isymMax = GetBufSymCount(hbuf)    isym = 0    while (isym < isymMax)    {        symbol = GetBufSymLocation(hbuf, isym)        isCodeBegin = 0        fIsEnd = 1        isBlandLine = 0        if(strlen(symbol) > 0)        {            if(symbol.Type == "Class Placeholder")            {                hsyml = SymbolChildren(symbol)                cchild = SymListCount(hsyml)                ichild = 0                while (ichild < cchild)                {                    symbol = GetBufSymLocation(hbuf, isym)                    hsyml = SymbolChildren(symbol)                    childsym = SymListItem(hsyml, ichild)                    ln = childsym.lnName                    isCodeBegin = 0                    fIsEnd = 1                    isBlandLine = 0                    while( ln < childsym.lnLim )                    {                        szLine = GetBufLine (hbuf, ln)                        //去掉注释的干扰                        RetVal = SkipCommentFromString(szLine,fIsEnd)                        szNew = RetVal.szContent                        fIsEnd = RetVal.fIsEnd                        if(isCodeBegin == 1)                        {                            szNew = TrimLeft(szNew)                            //检测是否是可执行代码开始                            iRet = CheckIsCodeBegin(szNew)                            if(iRet == 1)                            {                                if( isBlandLine != 0 )                                {                                    ln = isBlandLine                                }                                InsBufLine(hbuf,ln,"")                                childsym.lnLim = childsym.lnLim + 1                                SetBufIns(hbuf, ln+1 , 0)                                InsertTraceInCurFunction(hbuf,childsym)                                break                            }                            if(strlen(szNew) == 0)                            {                                if( isBlandLine == 0 )                                {                                    isBlandLine = ln;                                }                            }                            else                            {                                isBlandLine = 0                            }                        }                        //查找到函数的开始                        if(isCodeBegin == 0)                        {                            iRet = strstr(szNew,"{")                            if(iRet != 0xffffffff)                            {                                isCodeBegin = 1                            }                        }                        ln = ln + 1                    }                    ichild = ichild + 1                }                SymListFree(hsyml)            }            else if( ( symbol.Type == "Function") ||  (symbol.Type == "Method") )            {                ln = symbol.lnName                while( ln < symbol.lnLim )                {                    szLine = GetBufLine (hbuf, ln)                    //去掉注释的干扰                    RetVal = SkipCommentFromString(szLine,fIsEnd)                    szNew = RetVal.szContent                    fIsEnd = RetVal.fIsEnd                    if(isCodeBegin == 1)                    {                        szNew = TrimLeft(szNew)                        //检测是否是可执行代码开始                        iRet = CheckIsCodeBegin(szNew)                        if(iRet == 1)                        {                            if( isBlandLine != 0 )                            {                                ln = isBlandLine                            }                            SetBufIns(hbuf, ln , 0)                            InsertTraceInCurFunction(hbuf,symbol)                            InsBufLine(hbuf,ln,"")                            break                        }                        if(strlen(szNew) == 0)                        {                            if( isBlandLine == 0 )                            {                                isBlandLine = ln;                            }                        }                        else                        {                            isBlandLine = 0                        }                    }                    //查找到函数的开始                    if(isCodeBegin == 0)                    {                        iRet = strstr(szNew,"{")                        if(iRet != 0xffffffff)                        {                            isCodeBegin = 1                        }                    }                    ln = ln + 1                }            }        }        isym = isym + 1    }}macro CheckIsCodeBegin(szLine){    iLen = strlen(szLine)    if(iLen == 0)    {        return 0    }    nIdx = 0    nWord = 0    if( (szLine[nIdx] == "(") || (szLine[nIdx] == "-")           || (szLine[nIdx] == "*") || (szLine[nIdx] == "+"))    {        return 1    }    if( szLine[nIdx] == "#" )    {        return 0    }    while(nIdx < iLen)    {        if( (szLine[nIdx] == " ")||(szLine[nIdx] == "\t")             || (szLine[nIdx] == "(")||(szLine[nIdx] == "{")             || (szLine[nIdx] == ";") )        {            if(nWord == 0)            {                if( (szLine[nIdx] == "(")||(szLine[nIdx] == "{")                         || (szLine[nIdx] == ";")  )                {                    return 1                }                szFirstWord = StrMid(szLine,0,nIdx)                if(szFirstWord == "return")                {                    return 1                }            }            while(nIdx < iLen)            {                if( (szLine[nIdx] == " ")||(szLine[nIdx] == "\t") )                {                    nIdx = nIdx + 1                }                else                {                    break                }            }            nWord = nWord + 1            if(nIdx == iLen)            {                return 1            }        }        if(nWord == 1)        {            asciiA = AsciiFromChar("A")            asciiZ = AsciiFromChar("Z")            ch = toupper(szLine[nIdx])            asciiCh = AsciiFromChar(ch)            if( ( szLine[nIdx] == "_" ) || ( szLine[nIdx] == "*" )                 || ( ( asciiCh >= asciiA ) && ( asciiCh <= asciiZ ) ) )            {                return 0            }            else            {                return 1            }        }        nIdx = nIdx + 1    }    return 1}macro AutoInsertTraceInfoInPrj(){    hprj = GetCurrentProj()    ifileMax = GetProjFileCount (hprj)    ifile = 0    while (ifile < ifileMax)    {        filename = GetProjFileName (hprj, ifile)        szExt = toupper(GetFileNameExt(filename))        if( (szExt == "C") || (szExt == "CPP") )        {            hbuf = OpenBuf (filename)            if(hbuf != 0)            {                SetCurrentBuf(hbuf)                AutoInsertTraceInfoInBuf()            }        }        //自动保存打开文件,可根据需要打开/*        if( IsBufDirty (hbuf) )        {            SaveBuf (hbuf)        }        CloseBuf(hbuf)*/        ifile = ifile + 1    }}macro RemoveTraceInfo(){    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    sel = GetWndSel(hwnd)    hbuf = GetWndBuf(hwnd)    if(hbuf == hNil)       stop    symbolname = GetCurSymbol()    symbol = GetSymbolLocationFromLn(hbuf, sel.lnFirst)//    symbol = GetSymbolLocation (symbolname)    nLineEnd = symbol.lnLim    szEntry = "DebugTrace(\"\\r\\n |@symbolname@() entry--- \");"    szExit = "DebugTrace(\"\\r\\n |@symbolname@() exit---:"    ln = symbol.lnName    fIsEntry = 0    while(ln < nLineEnd)    {        szLine = GetBufLine(hbuf, ln)        /*剔除其中的注释语句*/        RetVal = TrimString(szLine)        if(fIsEntry == 0)        {            ret = strstr(szLine,szEntry)            if(ret != 0xffffffff)            {                DelBufLine(hbuf,ln)                nLineEnd = nLineEnd - 1                fIsEntry = 1                ln = ln + 1                continue            }        }        ret = strstr(szLine,szExit)        if(ret != 0xffffffff)        {            DelBufLine(hbuf,ln)            nLineEnd = nLineEnd - 1        }        ln = ln + 1    }}macro RemoveCurBufTraceInfo(){    hbuf = GetCurrentBuf()    isymMax = GetBufSymCount(hbuf)    isym = 0    while (isym < isymMax)    {        isLastLine = 0        symbol = GetBufSymLocation(hbuf, isym)        fIsEnd = 1        if(strlen(symbol) > 0)        {            if(symbol.Type == "Class Placeholder")            {                hsyml = SymbolChildren(symbol)                cchild = SymListCount(hsyml)                ichild = 0                while (ichild < cchild)                {                    hsyml = SymbolChildren(symbol)                    childsym = SymListItem(hsyml, ichild)                    SetBufIns(hbuf,childsym.lnName,0)                    RemoveTraceInfo()                    ichild = ichild + 1                }                SymListFree(hsyml)            }            else if( ( symbol.Type == "Function") ||  (symbol.Type == "Method") )            {                SetBufIns(hbuf,symbol.lnName,0)                RemoveTraceInfo()            }        }        isym = isym + 1    }}macro RemovePrjTraceInfo(){    hprj = GetCurrentProj()    ifileMax = GetProjFileCount (hprj)    ifile = 0    while (ifile < ifileMax)    {        filename = GetProjFileName (hprj, ifile)        hbuf = OpenBuf (filename)        if(hbuf != 0)        {            SetCurrentBuf(hbuf)            RemoveCurBufTraceInfo()        }        //自动保存打开文件,可根据需要打开/*        if( IsBufDirty (hbuf) )        {            SaveBuf (hbuf)        }        CloseBuf(hbuf)*/        ifile = ifile + 1    }}macro InsertFileHeaderEN(hbuf, ln,szName,szContent){    InsBufLine(hbuf, ln + 0,    "/**")    InsBufLine(hbuf, ln + 1,    " ****************************************************************************")    InsBufLine(hbuf, ln + 2,    " * @@ Copyright (C), 2013-2023, WWW.52openwrt.com. All Rights Reserved.")    InsBufLine(hbuf, ln + 3,    " ****************************************************************************")    sz = GetFileName(GetBufName (hbuf))    InsBufLine(hbuf, ln + 4,    " * @@file      @sz@")    if( strlen(szMyName)>0 )    {       InsBufLine(hbuf, ln + 5, " * @@author    @szName@")    }    else    {       InsBufLine(hbuf, ln + 5, " * @@author    #")    }    SysTime = GetSysTime(0)    szTime = SysTime.Date    sz1=SysTime.Year    sz2=SysTime.month    sz3=SysTime.day    InsBufLine(hbuf, ln + 6,    " * @@version   v1.0")    InsBufLine(hbuf, ln + 7,    " * @@date      @sz1@-@sz2@-@sz3@")    iLen = strlen (szContent)    nlnDesc = ln    InsBufLine(hbuf, ln + 8,    " * @@brief     @szContent@")    InsBufLine(hbuf, ln + 9,    " ****************************************************************************")    InsBufLine(hbuf, ln +10,    " * @@note:")    InsBufLine(hbuf, ln +11,    " *        ")    InsBufLine(hbuf, ln +12,    " ****************************************************************************")    InsBufLine(hbuf, ln +13,    " * @@history:")    InsBufLine(hbuf, ln +14,    " * 1. date :  @sz1@-@sz2@-@sz3@")    if( strlen(szMyName)>0 )    {       InsBufLine(hbuf, ln +15, " *   author:  @szName@")    }    else    {       InsBufLine(hbuf, ln +15, " *   author:   #")    }    InsBufLine(hbuf, ln +16,    " *   change:  creat file")    InsBufLine(hbuf, ln +17,    " ****************************************************************************")    InsBufLine(hbuf, ln +18,    " */")    if(strlen(szContent) != 0)    {        return    }    //如果没有输入功能描述的话提示输入    szContent = Ask("please input brief:")    SetBufIns(hbuf,nlnDesc + 8,0)    DelBufLine(hbuf,nlnDesc + 8)    //自动排列显示功能描述    CommentContent(hbuf,nlnDesc + 8, " * @@brief     ",szContent,0)}macro InsertFileHeaderCN(hbuf, ln,szName,szContent){    InsBufLine(hbuf, ln + 0,    "/**")    InsBufLine(hbuf, ln + 1,    "  ****************************************************************************")    InsBufLine(hbuf, ln + 2,    "  * @@ Copyright (C), 2013-2023, xxxxx  Corporation. All Rights Reserved.")    InsBufLine(hbuf, ln + 3,    "  ****************************************************************************")    sz = GetFileName(GetBufName (hbuf))    InsBufLine(hbuf, ln + 4,    "  * @@file      @sz@")    if( strlen(szMyName)>0 )    {       InsBufLine(hbuf, ln + 5, "  * @@author    @szName@")    }    else    {       InsBufLine(hbuf, ln + 5, "  * @@author    #")    }    SysTime = GetSysTime(0)    szTime = SysTime.Date    sz1=SysTime.Year    sz2=SysTime.month    sz3=SysTime.day    InsBufLine(hbuf, ln + 6,    "  * @@version   v1.0")    InsBufLine(hbuf, ln + 7,    "  * @@date      @sz1@-@sz2@-@sz3@")    iLen = strlen (szContent)    nlnDesc = ln    InsBufLine(hbuf, ln + 8,    "  * @@brief     @szContent@")    InsBufLine(hbuf, ln + 9,    "  ****************************************************************************")    InsBufLine(hbuf, ln +10,    "  * @@note:")    InsBufLine(hbuf, ln +11,    "  *        ")    InsBufLine(hbuf, ln +12,    "  ****************************************************************************")    InsBufLine(hbuf, ln +13,    "  * @@history:")    InsBufLine(hbuf, ln +14,    "  * 1. date :  @sz1@-@sz2@-@sz3@")    if( strlen(szMyName)>0 )    {       InsBufLine(hbuf, ln +15, "  *   author:  @szName@")    }    else    {       InsBufLine(hbuf, ln +15, "  *   author:   #")    }    InsBufLine(hbuf, ln +16,    "  *   change:  creat file")    InsBufLine(hbuf, ln +17,    "  ****************************************************************************")    InsBufLine(hbuf, ln +18,    "  */")    if(strlen(szContent) != 0)    {        return    }    //如果没有输入功能描述的话提示输入    szContent = Ask("please input brief:")    SetBufIns(hbuf,nlnDesc + 8,0)    DelBufLine(hbuf,nlnDesc + 8)    //自动排列显示功能描述    CommentContent(hbuf,nlnDesc + 8, "  * @@brief     ",szContent,0)}macro GetFunctionList(hbuf,hnewbuf){    isymMax = GetBufSymCount (hbuf)    isym = 0    //依次取出全部的但前buf符号表中的全部符号    while (isym < isymMax)    {        symbol = GetBufSymLocation(hbuf, isym)        if(symbol.Type == "Class Placeholder")        {            hsyml = SymbolChildren(symbol)            cchild = SymListCount(hsyml)            ichild = 0            while (ichild < cchild)            {                childsym = SymListItem(hsyml, ichild)                AppendBufLine(hnewbuf,childsym.symbol)                ichild = ichild + 1            }            SymListFree(hsyml)        }        if(strlen(symbol) > 0)        {            if( (symbol.Type == "Method") ||                (symbol.Type == "Function") || ("Editor Macro" == symbol.Type) )            {                //取出类型是函数和宏的符号                symname = symbol.Symbol                //将符号插入到新buf中这样做是为了兼容V2.1                AppendBufLine(hnewbuf,symname)               }           }        isym = isym + 1    }}macro InsertFileList(hbuf,hnewbuf,ln){    if(hnewbuf == hNil)    {        return ln    }    isymMax = GetBufLineCount (hnewbuf)    isym = 0    while (isym < isymMax)    {        szLine = GetBufLine(hnewbuf, isym)        InsBufLine(hbuf,ln,"              @szLine@")        ln = ln + 1        isym = isym + 1    }    return ln}macro CommentContent1 (hbuf,ln,szPreStr,szContent,isEnd){    //将剪贴板中的多段文本合并    szClip = MergeString()    //去掉多余的空格    szTmp = TrimString(szContent)    //如果输入窗口中的内容是剪贴板中的内容说明是剪贴过来的    ret = strstr(szClip,szTmp)    if(ret == 0)    {        szContent = szClip    }    szLeftBlank = szPreStr    iLen = strlen(szPreStr)    k = 0    while(k < iLen)    {        szLeftBlank[k] = " ";        k = k + 1;    }    iLen = strlen (szContent)    szTmp = cat(szPreStr,"#");    if( iLen == 0)    {        InsBufLine(hbuf, ln, "@szTmp@")    }    else    {        i = 0        while  (iLen - i > 75 - k )        {            j = 0            while(j < 75 - k)            {                iNum = szContent[i + j]                //如果是中文必须成对处理                if( AsciiFromChar (iNum)  > 160 )                {                   j = j + 2                }                else                {                   j = j + 1                }                if( (j > 70 - k) && (szContent[i + j] == " ") )                {                    break                }            }            if( (szContent[i + j] != " " ) )            {                n = 0;                iNum = szContent[i + j + n]                while( (iNum != " " ) && (AsciiFromChar (iNum)  < 160))                {                    n = n + 1                    if((n >= 3) ||(i + j + n >= iLen))                         break;                    iNum = szContent[i + j + n]                   }                if(n < 3)                {                    j = j + n                    sz1 = strmid(szContent,i,i+j)                    sz1 = cat(szPreStr,sz1)                }                else                {                    sz1 = strmid(szContent,i,i+j)                    sz1 = cat(szPreStr,sz1)                    if(sz1[strlen(sz1)-1] != "-")                    {                        sz1 = cat(sz1,"-")                    }                }            }            else            {                sz1 = strmid(szContent,i,i+j)                sz1 = cat(szPreStr,sz1)            }            InsBufLine(hbuf, ln, "@sz1@")            ln = ln + 1            szPreStr = szLeftBlank            i = i + j            while(szContent[i] == " ")            {                i = i + 1            }        }        sz1 = strmid(szContent,i,iLen)        sz1 = cat(szPreStr,sz1)        if(isEnd)        {            sz1 = cat(sz1,"*/")        }        InsBufLine(hbuf, ln, "@sz1@")    }    return ln}macro CommentContent (hbuf,ln,szPreStr,szContent,isEnd){    szLeftBlank = szPreStr    iLen = strlen(szPreStr)    k = 0    while(k < iLen)    {        szLeftBlank[k] = " ";        k = k + 1;    }    hNewBuf = newbuf("clip")    if(hNewBuf == hNil)        return    SetCurrentBuf(hNewBuf)    PasteBufLine (hNewBuf, 0)    lnMax = GetBufLineCount( hNewBuf )    szTmp = TrimString(szContent)    //判断如果剪贴板是0行时对于有些版本会有问题,要排除掉    if(lnMax != 0)    {        szLine = GetBufLine(hNewBuf , 0)        ret = strstr(szLine,szTmp)        if(ret == 0)        {            /*如果输入窗输入的内容是剪贴板的一部分说明是剪贴过来的取剪贴板中的内              容*/            szContent = TrimString(szLine)        }        else        {            lnMax = 1        }    }    else    {        lnMax = 1    }    szRet = ""    nIdx = 0    while ( nIdx < lnMax)    {        if(nIdx != 0)        {            szLine = GetBufLine(hNewBuf , nIdx)            szContent = TrimLeft(szLine)               szPreStr = szLeftBlank        }        iLen = strlen (szContent)        szTmp = cat(szPreStr,"#");        if( (iLen == 0) && (nIdx == (lnMax - 1))        {            InsBufLine(hbuf, ln, "@szTmp@")        }        else        {            i = 0            //以每行75个字符处理            while  (iLen - i > 75 - k )            {                j = 0                while(j < 75 - k)                {                    iNum = szContent[i + j]                    if( AsciiFromChar (iNum)  > 160 )                    {                       j = j + 2                    }                    else                    {                       j = j + 1                    }                    if( (j > 70 - k) && (szContent[i + j] == " ") )                    {                        break                    }                }                if( (szContent[i + j] != " " ) )                {                    n = 0;                    iNum = szContent[i + j + n]                    //如果是中文字符只能成对处理                    while( (iNum != " " ) && (AsciiFromChar (iNum)  < 160))                    {                        n = n + 1                        if((n >= 3) ||(i + j + n >= iLen))                             break;                        iNum = szContent[i + j + n]                    }                    if(n < 3)                    {                        //分段后只有小于3个的字符留在下段则将其以上去                        j = j + n                        sz1 = strmid(szContent,i,i+j)                        sz1 = cat(szPreStr,sz1)                    }                    else                    {                        //大于3个字符的加连字符分段                        sz1 = strmid(szContent,i,i+j)                        sz1 = cat(szPreStr,sz1)                        if(sz1[strlen(sz1)-1] != "-")                        {                            sz1 = cat(sz1,"-")                        }                    }                }                else                {                    sz1 = strmid(szContent,i,i+j)                    sz1 = cat(szPreStr,sz1)                }                InsBufLine(hbuf, ln, "@sz1@")                ln = ln + 1                szPreStr = szLeftBlank                i = i + j                while(szContent[i] == " ")                {                    i = i + 1                }            }            sz1 = strmid(szContent,i,iLen)            sz1 = cat(szPreStr,sz1)            if((isEnd == 1) && (nIdx == (lnMax - 1))            {                sz1 = cat(sz1," */")            }            InsBufLine(hbuf, ln, "@sz1@")        }        ln = ln + 1        nIdx = nIdx + 1    }    closebuf(hNewBuf)    return ln - 1}macro FormatLine(){    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    sel = GetWndSel(hwnd)    if(sel.ichFirst > 70)    {        Msg("选择太靠右了")        stop    }    hbuf = GetWndBuf(hwnd)    // get line the selection (insertion point) is on    szCurLine = GetBufLine(hbuf, sel.lnFirst);    lineLen = strlen(szCurLine)    szLeft = strmid(szCurLine,0,sel.ichFirst)    szContent = strmid(szCurLine,sel.ichFirst,lineLen)    DelBufLine(hbuf, sel.lnFirst)    CommentContent(hbuf,sel.lnFirst,szLeft,szContent,0)}macro CreateBlankString(nBlankCount){    szBlank=""    nIdx = 0    while(nIdx < nBlankCount)    {        szBlank = cat(szBlank," ")        nIdx = nIdx + 1    }    return szBlank}macro TrimLeft(szLine){    nLen = strlen(szLine)    if(nLen == 0)    {        return szLine    }    nIdx = 0    while( nIdx < nLen )    {        if( ( szLine[nIdx] != " ") && (szLine[nIdx] != "\t") )        {            break        }        nIdx = nIdx + 1    }    return strmid(szLine,nIdx,nLen)}macro TrimRight(szLine){    nLen = strlen(szLine)    if(nLen == 0)    {        return szLine    }    nIdx = nLen    while( nIdx > 0 )    {        nIdx = nIdx - 1        if( ( szLine[nIdx] != " ") && (szLine[nIdx] != "\t") )        {            break        }    }    return strmid(szLine,0,nIdx+1)}macro TrimString(szLine){    szLine = TrimLeft(szLine)    szLIne = TrimRight(szLine)    return szLine}macro GetFunctionDef(hbuf,symbol){    ln = symbol.lnName    szFunc = ""    if(strlen(symbol) == 0)    {       return szFunc    }    fIsEnd = 1//    msg(symbol)    while(ln < symbol.lnLim)    {        szLine = GetBufLine (hbuf, ln)        //去掉被注释掉的内容        RetVal = SkipCommentFromString(szLine,fIsEnd)        szLine = RetVal.szContent        szLine = TrimString(szLine)        fIsEnd = RetVal.fIsEnd        //如果是{表示函数参数头结束了        ret = strstr(szLine,"{")        if(ret != 0xffffffff)        {            szLine = strmid(szLine,0,ret)            szFunc = cat(szFunc,szLine)            break        }        szFunc = cat(szFunc,szLine)        ln = ln + 1    }    return szFunc}macro GetWordFromString(hbuf,szLine,nBeg,nEnd,chBeg,chSeparator,chEnd){    if((nEnd > strlen(szLine) || (nBeg > nEnd))    {        return 0    }    nMaxLen = 0    nIdx = nBeg    //先定位到开始字符标记处    while(nIdx < nEnd)    {        if(szLine[nIdx] == chBeg)        {            break        }        nIdx = nIdx + 1    }    nBegWord = nIdx + 1    //用于检测chBeg和chEnd的配对情况    iCount = 0    nEndWord = 0    //以分隔符为标记进行搜索    while(nIdx < nEnd)    {        if(szLine[nIdx] == chSeparator)        {           szWord = strmid(szLine,nBegWord,nIdx)           szWord = TrimString(szWord)           nLen = strlen(szWord)           if(nMaxLen < nLen)           {               nMaxLen = nLen           }           AppendBufLine(hbuf,szWord)           nBegWord = nIdx + 1        }        if(szLine[nIdx] == chBeg)        {            iCount = iCount + 1        }        if(szLine[nIdx] == chEnd)        {            iCount = iCount - 1            nEndWord = nIdx            if( iCount == 0 )            {                break            }        }        nIdx = nIdx + 1    }    if(nEndWord > nBegWord)    {        szWord = strmid(szLine,nBegWord,nEndWord)        szWord = TrimString(szWord)        nLen = strlen(szWord)        if(nMaxLen < nLen)        {            nMaxLen = nLen        }        AppendBufLine(hbuf,szWord)    }    return nMaxLen}macro FuncHeadCommentCN(hbuf, ln, szFunc, szMyName,newFunc){    iIns = 0    if(newFunc != 1)    {        symbol = GetSymbolLocationFromLn(hbuf, ln)        if(strlen(symbol) > 0)        {            hTmpBuf = NewBuf("Tempbuf")            if(hTmpBuf == hNil)            {                stop            }            //将文件参数头整理成一行并去掉了注释            szLine = GetFunctionDef(hbuf,symbol)            iBegin = symbol.ichName            //取出返回值定义            szTemp = strmid(szLine,0,iBegin)            szTemp = TrimString(szTemp)            szRet =  GetFirstWord(szTemp)            if(symbol.Type == "Method")            {                szTemp = strmid(szTemp,strlen(szRet),strlen(szTemp))                szTemp = TrimString(szTemp)                if(szTemp == "::")                {                    szRet = ""                }            }            if(toupper (szRet) == "MACRO")            {                //对于宏返回值特殊处理                szRet = ""            }            //从函数头分离出函数参数            nMaxParamSize = GetWordFromString(hTmpBuf,szLine,iBegin,strlen(szLine),"(",",",")")            lnMax = GetBufLineCount(hTmpBuf)            ln = symbol.lnFirst            SetBufIns (hbuf, ln, 0)        }    }    else    {        lnMax = 0        szLine = ""        szRet = ""    }    InsBufLine(hbuf, ln, "/**")    if( strlen(szFunc)>0 )    {        InsBufLine(hbuf, ln+1, " *@@brief:      @szFunc@")    }    else    {        InsBufLine(hbuf, ln+1, " *@@brief:          #")    }    oldln = ln    InsBufLine(hbuf, ln+2, " *@@details:        ")    szIns = " *@@param[in]  "    if(newFunc != 1)    {        //对于已经存在的函数插入函数参数        i = 0        while ( i < lnMax)        {            szTmp = GetBufLine(hTmpBuf, i)            nLen = strlen(szTmp);            szBlank = CreateBlankString(nMaxParamSize - nLen + 2)            szTmp = cat(szTmp,szBlank)            ln = ln + 1            szTmp = cat(szIns,szTmp)            InsBufLine(hbuf, ln+2, "@szTmp@")            iIns = 1            szIns = "               "            i = i + 1        }        closebuf(hTmpBuf)    }    if(iIns == 0)    {            ln = ln + 1            InsBufLine(hbuf, ln+2, " *@@param[in]       无")    }    InsBufLine(hbuf, ln+3, " *@@param[out]  无")    InsBufLine(hbuf, ln+4, " *@@retval:     @szRet@")    InsbufLIne(hbuf, ln+5, " */");    if ((newFunc == 1) && (strlen(szFunc)>0))    {        InsBufLine(hbuf, ln+6, "UINT32_T  @szFunc@( # )")        InsBufLine(hbuf, ln+7, "{");        InsBufLine(hbuf, ln+8, "    #");        InsBufLine(hbuf, ln+9, "}");        SearchForward()    }    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    sel = GetWndSel(hwnd)    sel.ichFirst = 0    sel.ichLim = sel.ichFirst    sel.lnFirst = ln + 6    sel.lnLast = ln + 6    szContent = Ask("请输入函数功能描述的内容")    setWndSel(hwnd,sel)    DelBufLine(hbuf,oldln + 2)    //显示输入的功能描述内容    newln = CommentContent(hbuf,oldln+2," *@@details:       ",szContent,0) - 2    ln = ln + newln - oldln    if ((newFunc == 1) && (strlen(szFunc)>0))    {        isFirstParam = 1        //提示输入新函数的返回值        szRet = Ask("请输入返回值类型")        if(strlen(szRet) > 0)        {            PutBufLine(hbuf, ln+4," *@@retval:      @szRet@")            PutBufLine(hbuf, ln+6, "@szRet@ @szFunc@(   )")            SetbufIns(hbuf,ln+6,strlen(szRet)+strlen(szFunc) + 3        }        szFuncDef = ""        sel.ichFirst = strlen(szFunc)+strlen(szRet) + 3        sel.ichLim = sel.ichFirst + 1        //循环输入参数        while (1)        {            szParam = ask("请输入函数参数名")            szParam = TrimString(szParam)            szTmp = cat(szIns,szParam)            szParam = cat(szFuncDef,szParam)            sel.lnFirst = ln + 6            sel.lnLast = ln + 6            setWndSel(hwnd,sel)            sel.ichFirst = sel.ichFirst + strlen(szParam)            sel.ichLim = sel.ichFirst            oldsel = sel            if(isFirstParam == 1)            {                PutBufLine(hbuf, ln+2, "@szTmp@")                isFirstParam  = 0            }            else            {                ln = ln + 1                InsBufLine(hbuf, ln+2, "@szTmp@")                oldsel.lnFirst = ln + 6                oldsel.lnLast = ln + 6            }            SetBufSelText(hbuf,szParam)            szIns = "               "            szFuncDef = ", "            oldsel.lnFirst = ln + 8            oldsel.lnLast = ln + 8            oldsel.ichFirst = 4            oldsel.ichLim = 5            setWndSel(hwnd,oldsel)        }    }    return ln + 9}macro FuncHeadCommentEN(hbuf, ln, szFunc, szMyName, newFunc){    iIns = 0    if(newFunc != 1)    {        symbol = GetSymbolLocationFromLn(hbuf, ln)        if(strlen(symbol) > 0)        {            hTmpBuf = NewBuf("Tempbuf")            if(hTmpBuf == hNil)            {                stop            }            //将文件参数头整理成一行并去掉了注释            szLine = GetFunctionDef(hbuf,symbol)            iBegin = symbol.ichName            //取出返回值定义            szTemp = strmid(szLine,0,iBegin)            szTemp = TrimString(szTemp)            szRet =  GetFirstWord(szTemp)            if(symbol.Type == "Method")            {                szTemp = strmid(szTemp,strlen(szRet),strlen(szTemp))                szTemp = TrimString(szTemp)                if(szTemp == "::")                {                    szRet = ""                }            }            if(toupper (szRet) == "MACRO")            {                //对于宏返回值特殊处理                szRet = ""            }            //从函数头分离出函数参数            nMaxParamSize = GetWordFromString(hTmpBuf,szLine,iBegin,strlen(szLine),"(",",",")")            lnMax = GetBufLineCount(hTmpBuf)            ln = symbol.lnFirst            SetBufIns (hbuf, ln, 0)        }    }    else    {        lnMax = 0        szLine = ""        szRet = ""    }    InsBufLine(hbuf, ln,       "/**")    InsBufLine(hbuf, ln+1,     " *  @@brief      ")    oldln = ln    InsBufLine(hbuf, ln+2,     " *  @@details    ")    szIns =                    " *  @@param[in]  "    if(newFunc != 1)    {        //对于已经存在的函数插入函数参数        i = 0        while ( i < lnMax)        {            szTmp = GetBufLine(hTmpBuf, i)            nLen = strlen(szTmp);            szBlank = CreateBlankString(nMaxParamSize - nLen + 2)            szTmp = cat(szTmp,szBlank)            ln = ln + 1            szTmp = cat(szIns, szTmp)            InsBufLine(hbuf, ln+2, "@szTmp@")            iIns = 1            szIns = " *              "            i = i + 1        }        closebuf(hTmpBuf)    }    if(iIns == 0)    {            ln = ln + 1            InsBufLine(hbuf, ln+2, " *  @@param[in]  None")    }    InsBufLine(hbuf, ln+3,         " *  @@param[out] None")    InsBufLine(hbuf, ln+4,         " *  @@retval     @szRet@")    InsbufLIne(hbuf, ln+5,         " */");    if ((newFunc == 1) && (strlen(szFunc)>0))    {        InsBufLine(hbuf, ln+6, "UINT32_T  @szFunc@( # )")        InsBufLine(hbuf, ln+7, "{");        InsBufLine(hbuf, ln+8, "    #");        InsBufLine(hbuf, ln+9, "}");        SearchForward()    }    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    sel = GetWndSel(hwnd)    sel.ichFirst = 0    sel.ichLim = sel.ichFirst    sel.lnFirst = ln + 6    sel.lnLast = ln + 6    szContent = Ask("Description")    setWndSel(hwnd,sel)    DelBufLine(hbuf,oldln + 2)    //显示输入的功能描述内容    newln = CommentContent(hbuf,oldln+2," *  @@details    ",szContent,0) - 2    ln = ln + newln - oldln    if ((newFunc == 1) && (strlen(szFunc)>0))    {        isFirstParam = 1        //提示输入新函数的返回值        szRet = Ask("Please input return value type")        if(strlen(szRet) > 0)        {            PutBufLine(hbuf, ln+4,  " *  @@retval       @szRet@")            PutBufLine(hbuf, ln+6,  "   @szRet@ @szFunc@(   )")            SetbufIns(hbuf,ln+6,strlen(szRet)+strlen(szFunc) + 3        }        szFuncDef = ""        sel.ichFirst = strlen(szFunc)+strlen(szRet) + 3        sel.ichLim = sel.ichFirst + 1        //循环输入参数        while (1)        {            szParam = ask("Please input parameter")            szParam = TrimString(szParam)            szTmp = cat(szIns,szParam)            szParam = cat(szFuncDef,szParam)            sel.lnFirst = ln + 6            sel.lnLast = ln + 6            setWndSel(hwnd,sel)            sel.ichFirst = sel.ichFirst + strlen(szParam)            sel.ichLim = sel.ichFirst            oldsel = sel            if(isFirstParam == 1)            {                PutBufLine(hbuf, ln+2, "@szTmp@")                isFirstParam  = 0            }            else            {                ln = ln + 1                InsBufLine(hbuf, ln+2, "@szTmp@")                oldsel.lnFirst = ln + 6                oldsel.lnLast = ln + 6            }            SetBufSelText(hbuf,szParam)            szIns = "                "            szFuncDef = ", "            oldsel.lnFirst = ln + 8            oldsel.lnLast = ln + 8            oldsel.ichFirst = 4            oldsel.ichLim = 5            setWndSel(hwnd,oldsel)        }    }    return ln + 9}macro InsertHistory(hbuf,ln,language){    iHistoryCount = 1    isLastLine = ln    i = 0    while(ln-i>0)    {        szCurLine = GetBufLine(hbuf, ln-i);        iBeg1 = strstr(szCurLine,"日    期")        iBeg2 = strstr(szCurLine,"date")        if((iBeg1 != 0xffffffff) || (iBeg2 != 0xffffffff))        {            iHistoryCount = iHistoryCount + 1            i = i + 1            continue        }        iBeg1 = strstr(szCurLine,"修改历史")        iBeg2 = strstr(szCurLine,"history")        if((iBeg1 != 0xffffffff) || (iBeg2 != 0xffffffff))        {            break        }        iBeg = strstr(szCurLine,"/**********************")        if( iBeg != 0xffffffff )        {            break        }        i = i + 1    }    if(language == 0)    {        InsertHistoryContentCN(hbuf,ln,iHistoryCount)    }    else    {        InsertHistoryContentEN(hbuf,ln,iHistoryCount)    }}macro UpdateFunctionList(){    hnewbuf = newbuf("")    if(hnewbuf == hNil)    {        stop    }    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    sel = GetWndSel(hwnd)    hbuf = GetWndBuf(hwnd)    GetFunctionList(hbuf,hnewbuf)    ln = sel.lnFirst    iHistoryCount = 1    isLastLine = ln    iTotalLn = GetBufLineCount (hbuf)    while(ln < iTotalLn)    {        szCurLine = GetBufLine(hbuf, ln);        iLen = strlen(szCurLine)        j = 0;        while(j < iLen)        {            if(szCurLine[j] != " ")                break            j = j + 1        }        //以文件头说明中前有大于10个空格的为函数列表记录        if(j > 10)        {            DelBufLine(hbuf, ln)        }        else        {            break        }        iTotalLn = GetBufLineCount (hbuf)    }    //插入函数列表    InsertFileList( hbuf,hnewbuf,ln )    closebuf(hnewbuf) }macro  InsertHistoryContentCN(hbuf,ln,iHostoryCount){    SysTime = GetSysTime(1);    szTime = SysTime.Date    sz1=SysTime.Year    sz2=SysTime.month    sz3=SysTime.day    szMyName = getreg(MYNAME)    InsBufLine(hbuf, ln,        "  *")                                 //* 1. date :  2014-4-1    InsBufLine(hbuf, ln + 1,    "  * @iHostoryCount@. date :  @sz1@-@sz2@-@sz3@")    if( strlen(szMyName) > 0 )    {                                 //*   author:  onejacky       InsBufLine(hbuf, ln + 2, "  *   author:  @szMyName@")    }    else    {       InsBufLine(hbuf, ln + 2, "  *   author: #")    }    szContent = Ask("Please input change info")    CommentContent(hbuf,ln + 3, "  *   change:  ",szContent,0)}macro  InsertHistoryContentEN(hbuf,ln,iHostoryCount){    SysTime = GetSysTime(1);    szTime = SysTime.Date    sz1=SysTime.Year    sz2=SysTime.month    sz3=SysTime.day    szMyName = getreg(MYNAME)    InsBufLine(hbuf, ln,        " *")                                 //* 1. date :  2014-4-1    InsBufLine(hbuf, ln + 1,    " * @iHostoryCount@. date :  @sz1@-@sz2@-@sz3@")    if( strlen(szMyName) > 0 )    {                                 //*   author:  onejacky       InsBufLine(hbuf, ln + 2, " *   author:  @szMyName@")    }    else    {       InsBufLine(hbuf, ln + 2, " *   author: #")    }    szContent = Ask("Please input change info")    CommentContent(hbuf,ln + 3, " *   change:  ",szContent,0)}macro CreateFunctionDef(hbuf, szName, language){    ln = 0    //获得当前没有后缀的文件名    szFileName = GetFileNameNoExt(GetBufName (hbuf))    if(strlen(szFileName) == 0)    {        sz = ask("请输入头文件名")        szFileName = GetFileNameNoExt(sz)        szExt = GetFileNameExt(szFileName)        szPreH = toupper (szFileName)        szPreH = cat("__",szPreH)        szExt = toupper(szExt)        szPreH = cat(szPreH,"_@szExt@__")    }    szPreH = toupper (szFileName)    sz = cat(szFileName,".h")    szPreH = cat("__",szPreH)    szPreH = cat(szPreH,"_H__")    hOutbuf = NewBuf(sz) // create output buffer    if (hOutbuf == 0)        stop    //搜索符号表取得函数名    SetCurrentBuf(hOutbuf)    isymMax = GetBufSymCount(hbuf)    isym = 0    while (isym < isymMax)    {        isLastLine = 0        symbol = GetBufSymLocation(hbuf, isym)        fIsEnd = 1        if(strlen(symbol) > 0)        {            if(symbol.Type == "Class Placeholder")            {                hsyml = SymbolChildren(symbol)                cchild = SymListCount(hsyml)                ichild = 0                szClassName = symbol.Symbol                InsBufLine(hOutbuf, ln, "}")                InsBufLine(hOutbuf, ln, "{")                InsBufLine(hOutbuf, ln, "class @szClassName@")                ln = ln + 2                while (ichild < cchild)                {                    childsym = SymListItem(hsyml, ichild)                    childsym.Symbol = szClassName                    ln = CreateClassPrototype(hbuf,ln,childsym)                    ichild = ichild + 1                }                SymListFree(hsyml)                InsBufLine(hOutbuf, ln + 1, "")                ln = ln + 2            }            else if( symbol.Type == "Function" )            {                ln = CreateFuncPrototype(hbuf,ln,"extern",symbol)            }            else if( symbol.Type == "Method" )            {                szLine = GetBufline(hbuf,symbol.lnName)                szClassName = GetLeftWord(szLine,symbol.ichName)                symbol.Symbol = szClassName                ln = CreateClassPrototype(hbuf,ln,symbol)            }        }        isym = isym + 1    }    InsertCPP(hOutbuf,0)    HeadIfdefStr(szPreH)    szContent = GetFileName(GetBufName (hbuf))    if(language == 0)    {        szContent = cat(szContent," 的头文件")        //插入文件头说明        InsertFileHeaderCN(hOutbuf,0,szName,szContent)    }    else    {        szContent = cat(szContent," header file")        //插入文件头说明        InsertFileHeaderEN(hOutbuf,0,szName,szContent)    }}macro GetLeftWord(szLine,ichRight){    if(ich == 0)    {        return ""    }    ich = ichRight    while(ich > 0)    {        if( (szLine[ich] == " ") || (szLine[ich] == "\t")            || ( szLine[ich] == ":") || (szLine[ich] == "."))        {            ich = ich - 1            ichRight = ich        }        else        {            break        }    }    while(ich > 0)    {        if(szLine[ich] == " ")        {            ich = ich + 1            break        }        ich = ich - 1    }    return strmid(szLine,ich,ichRight)}macro CreateClassPrototype(hbuf,ln,symbol){    isLastLine = 0    fIsEnd = 1    hOutbuf = GetCurrentBuf()    szLine = GetBufLine (hbuf, symbol.lnName)    sline = symbol.lnFirst    szClassName = symbol.Symbol    ret = strstr(szLine,szClassName)    if(ret == 0xffffffff)    {        return ln    }    szPre = strmid(szLine,0,ret)    szLine = strmid(szLine,symbol.ichName,strlen(szLine))    szLine = cat(szPre,szLine)    //去掉注释的干扰    RetVal = SkipCommentFromString(szLine,fIsEnd)    fIsEnd = RetVal.fIsEnd    szNew = RetVal.szContent    szLine = cat("    ",szLine)    szNew = cat("    ",szNew)    while((isLastLine == 0) && (sline < symbol.lnLim))    {        i = 0        j = 0        iLen = strlen(szNew)        while(i < iLen)        {            if(szNew[i]=="(")            {               j = j + 1;            }            else if(szNew[i]==")")            {                j = j - 1;                if(j <= 0)                {                    //函数参数头结束                    isLastLine = 1                    //去掉最后多余的字符                    szLine = strmid(szLine,0,i+1);                    szLine = cat(szLine,";")                    break                }            }            i = i + 1        }        InsBufLine(hOutbuf, ln, "@szLine@")        ln = ln + 1        sline = sline + 1        if(isLastLine != 1)        {            //函数参数头还没有结束再取一行            szLine = GetBufLine (hbuf, sline)            //去掉注释的干扰            RetVal = SkipCommentFromString(szLine,fIsEnd)            szNew = RetVal.szContent            fIsEnd = RetVal.fIsEnd        }    }    return ln}macro CreateFuncPrototype(hbuf,ln,szType,symbol){    isLastLine = 0    hOutbuf = GetCurrentBuf()    szLine = GetBufLine (hbuf,symbol.lnName)    //去掉注释的干扰    RetVal = SkipCommentFromString(szLine,fIsEnd)    szNew = RetVal.szContent    fIsEnd = RetVal.fIsEnd    szLine = cat("@szType@ ",szLine)    szNew = cat("@szType@ ",szNew)    sline = symbol.lnFirst    while((isLastLine == 0) && (sline < symbol.lnLim))    {        i = 0        j = 0        iLen = strlen(szNew)        while(i < iLen)        {            if(szNew[i]=="(")            {               j = j + 1;            }            else if(szNew[i]==")")            {                j = j - 1;                if(j <= 0)                {                    //函数参数头结束                    isLastLine = 1                    //去掉最后多余的字符                    szLine = strmid(szLine,0,i+1);                    szLine = cat(szLine,";")                    break                }            }            i = i + 1        }        InsBufLine(hOutbuf, ln, "@szLine@")        ln = ln + 1        sline = sline + 1        if(isLastLine != 1)        {            //函数参数头还没有结束再取一行            szLine = GetBufLine (hbuf, sline)            szLine = cat("         ",szLine)            //去掉注释的干扰            RetVal = SkipCommentFromString(szLine,fIsEnd)            szNew = RetVal.szContent            fIsEnd = RetVal.fIsEnd        }    }    return ln}macro CreateNewHeaderFile(){    hbuf = GetCurrentBuf()    language = getreg(LANGUAGE)    if(language != 1)    {        language = 0    }    szName = getreg(MYNAME)    if(strlen( szName ) == 0)    {        szMyName = Ask("Enter your name:")        setreg(MYNAME, szMyName)    }    isymMax = GetBufSymCount(hbuf)    isym = 0    ln = 0    //获得当前没有后缀的文件名    sz = ask("Please input header file name")    szFileName = GetFileNameNoExt(sz)    szExt = GetFileNameExt(sz)    szPreH = toupper (szFileName)    szPreH = cat("__",szPreH)    szExt = toupper(szExt)    szPreH = cat(szPreH,"_@szExt@__")    hOutbuf = NewBuf(sz) // create output buffer    if (hOutbuf == 0)        stop    SetCurrentBuf(hOutbuf)    InsertCPP(hOutbuf,0)    HeadIfdefStr(szPreH)    szContent = GetFileName(GetBufName (hbuf))    if(language == 0)    {        szContent = cat(szContent," 的头文件")        //插入文件头说明        InsertFileHeaderCN(hOutbuf,0,szName,szContent)    }    else    {        szContent = cat(szContent," header file")        //插入文件头说明        InsertFileHeaderEN(hOutbuf,0,szName,szContent)    }    lnMax = GetBufLineCount(hOutbuf)    if(lnMax > 9)    {        ln = lnMax - 9    }    else    {        return    }    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    sel = GetWndSel(hwnd)    sel.lnFirst = ln    sel.ichFirst = 0    sel.ichLim = 0    SetBufIns(hOutbuf,ln,0)    szType = Ask ("Please prototype type : extern or static")    //搜索符号表取得函数名    while (isym < isymMax)    {        isLastLine = 0        symbol = GetBufSymLocation(hbuf, isym)        fIsEnd = 1        if(strlen(symbol) > 0)        {            if(symbol.Type == "Class Placeholder")            {                hsyml = SymbolChildren(symbol)                cchild = SymListCount(hsyml)                ichild = 0                szClassName = symbol.Symbol                InsBufLine(hOutbuf, ln, "}")                InsBufLine(hOutbuf, ln, "{")                InsBufLine(hOutbuf, ln, "class @szClassName@")                ln = ln + 2                while (ichild < cchild)                {                    childsym = SymListItem(hsyml, ichild)                    childsym.Symbol = szClassName                    ln = CreateClassPrototype(hbuf,ln,childsym)                    ichild = ichild + 1                }                SymListFree(hsyml)                InsBufLine(hOutbuf, ln + 1, "")                ln = ln + 2            }            else if( symbol.Type == "Function" )            {                ln = CreateFuncPrototype(hbuf,ln,szType,symbol)            }            else if( symbol.Type == "Method" )            {                szLine = GetBufline(hbuf,symbol.lnName)                szClassName = GetLeftWord(szLine,symbol.ichName)                symbol.Symbol = szClassName                ln = CreateClassPrototype(hbuf,ln,symbol)            }        }        isym = isym + 1    }    sel.lnLast = ln    SetWndSel(hwnd,sel)}macro GetWordLeftOfIch(ich, sz){    wordinfo = "" // create a "wordinfo" structure    chTab = CharFromAscii(9)    // scan backwords over white space, if any    ich = ich - 1;    if (ich >= 0)        while (sz[ich] == " " || sz[ich] == chTab)        {            ich = ich - 1;            if (ich < 0)                break;        }    // scan backwords to start of word    ichLim = ich + 1;    asciiA = AsciiFromChar("A")    asciiZ = AsciiFromChar("Z")    while (ich >= 0)    {        ch = toupper(sz[ich])        asciiCh = AsciiFromChar(ch)/*        if ((asciiCh < asciiA || asciiCh > asciiZ)             && !IsNumber(ch)             &&  (ch != "#") )            break // stop at first non-identifier character*/        //只提取字符和# { / *作为命令        if ((asciiCh < asciiA || asciiCh > asciiZ)           && !IsNumber(ch)           && ( ch != "#" && ch != "{" && ch != "/" && ch != "*"))            break;        ich = ich - 1;    }    ich = ich + 1    wordinfo.szWord = strmid(sz, ich, ichLim)    wordinfo.ich = ich    wordinfo.ichLim = ichLim;    return wordinfo}macro ReplaceBufTab(){    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    hbuf = GetWndBuf(hwnd)    iTotalLn = GetBufLineCount (hbuf)    nBlank = Ask("一个Tab替换几个空格")    if(nBlank == 0)    {        nBlank = 4    }    szBlank = CreateBlankString(nBlank)    ReplaceInBuf(hbuf,"\t",szBlank,0, iTotalLn, 1, 0, 0, 1)}macro ReplaceTabInProj(){    hprj = GetCurrentProj()    ifileMax = GetProjFileCount (hprj)    nBlank = Ask("一个Tab替换几个空格")    if(nBlank == 0)    {        nBlank = 4    }    szBlank = CreateBlankString(nBlank)    ifile = 0    while (ifile < ifileMax)    {        filename = GetProjFileName (hprj, ifile)        hbuf = OpenBuf (filename)        if(hbuf != 0)        {            iTotalLn = GetBufLineCount (hbuf)            ReplaceInBuf(hbuf,"\t",szBlank,0, iTotalLn, 1, 0, 0, 1)        }        if( IsBufDirty (hbuf) )        {            SaveBuf (hbuf)        }        CloseBuf(hbuf)        ifile = ifile + 1    }}macro ReplaceInBuf(hbuf,chOld,chNew,nBeg,nEnd,fMatchCase, fRegExp, fWholeWordsOnly, fConfirm){    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    hbuf = GetWndBuf(hwnd)    sel = GetWndSel(hwnd)    sel.ichLim = 0    sel.lnLast = 0    sel.ichFirst = sel.ichLim    sel.lnFirst = sel.lnLast    SetWndSel(hwnd, sel)    LoadSearchPattern(chOld, 0, 0, 0);    while(1)    {        Search_Forward        selNew = GetWndSel(hwnd)        if(sel == selNew)        {            break        }        SetBufSelText(hbuf, chNew)           selNew.ichLim = selNew.ichFirst        SetWndSel(hwnd, selNew)        sel = selNew    }}macro ConfigureSystem(){    /*    szLanguage = ASK("Please select language: 0 Chinese ,1 English");    if(szLanguage == "#")    {       SetReg ("LANGUAGE", "0")    }    else    {       SetReg ("LANGUAGE", szLanguage)    }    */    SetReg ("LANGUAGE", "1")    szName = ASK("Please input your name");    if(szName == "#")    {       SetReg ("MYNAME", "")    }    else    {       SetReg ("MYNAME", szName)    }}macro GetLeftBlank(szLine){    nIdx = 0    nEndIdx = strlen(szLine)    while( nIdx < nEndIdx )    {        if( (szLine[nIdx] !=" ") && (szLine[nIdx] !="\t") )        {            break;        }        nIdx = nIdx + 1    }    return nIdx}macro ExpandBraceLittle(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    if( (sel.lnFirst == sel.lnLast)        && (sel.ichFirst == sel.ichLim) )    {        SetBufSelText (hbuf, "(  )")        SetBufIns (hbuf, sel.lnFirst, sel.ichFirst + 2)    }    else    {        SetBufIns (hbuf, sel.lnFirst, sel.ichFirst)        SetBufSelText (hbuf, "( ")        SetBufIns (hbuf, sel.lnLast, sel.ichLim + 2)        SetBufSelText (hbuf, " )")    }}macro ExpandBraceMid(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    if( (sel.lnFirst == sel.lnLast)        && (sel.ichFirst == sel.ichLim) )    {        SetBufSelText (hbuf, "[]")        SetBufIns (hbuf, sel.lnFirst, sel.ichFirst + 1)    }    else    {        SetBufIns (hbuf, sel.lnFirst, sel.ichFirst)        SetBufSelText (hbuf, "[")        SetBufIns (hbuf, sel.lnLast, sel.ichLim + 1)        SetBufSelText (hbuf, "]")    }}macro ExpandBraceLarge(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    ln = sel.lnFirst    nlineCount = 0    retVal = ""    szLine = GetBufLine( hbuf, ln )    nLeft = GetLeftBlank(szLine)    szLeft = strmid(szLine,0,nLeft);    szRight = ""    szMid = ""    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        //对于没有块选择的情况,直接插入{}即可        if( nLeft == strlen(szLine) )        {            SetBufSelText (hbuf, "{")        }        else        {            ln = ln + 1            InsBufLine(hbuf, ln, "@szLeft@{")            nlineCount = nlineCount + 1        }        InsBufLine(hbuf, ln + 1, "@szLeft@    ")        InsBufLine(hbuf, ln + 2, "@szLeft@}")        nlineCount = nlineCount + 2        SetBufIns (hbuf, ln + 1, strlen(szLeft)+4)    }    else    {        //对于有块选择的情况还得考虑将块选择区分开了        //检查选择区内是否大括号配对,如果嫌太慢则注释掉下面的判断        RetVal= CheckBlockBrace(hbuf)        if(RetVal.iCount != 0)        {            msg("Invalidated brace number")            stop        }        //取出选中区前的内容        szOld = strmid(szLine,0,sel.ichFirst)        if(sel.lnFirst != sel.lnLast)        {            //对于多行的情况            //第一行的选中部分            szMid = strmid(szLine,sel.ichFirst,strlen(szLine))            szMid = TrimString(szMid)            szLast = GetBufLine(hbuf,sel.lnLast)            if( sel.ichLim > strlen(szLast) )            {                //如果选择区长度大于改行的长度,最大取该行的长度                szLineselichLim = strlen(szLast)            }            else            {                szLineselichLim = sel.ichLim            }            //得到最后一行选择区为的字符            szRight = strmid(szLast,szLineselichLim,strlen(szLast))            szRight = TrimString(szRight)        }        else        {            //对于选择只有一行的情况             if(sel.ichLim >= strlen(szLine))             {                 sel.ichLim = strlen(szLine)             }             //获得选中区的内容             szMid = strmid(szLine,sel.ichFirst,sel.ichLim)             szMid = TrimString(szMid)             if( sel.ichLim > strlen(szLine) )             {                 szLineselichLim = strlen(szLine)             }             else             {                 szLineselichLim = sel.ichLim             }             //同样得到选中区后的内容             szRight = strmid(szLine,szLineselichLim,strlen(szLine))             szRight = TrimString(szRight)        }        nIdx = sel.lnFirst        while( nIdx < sel.lnLast)        {            szCurLine = GetBufLine(hbuf,nIdx+1)            if( sel.ichLim > strlen(szCurLine) )            {                szLineselichLim = strlen(szCurLine)            }            else            {                szLineselichLim = sel.ichLim            }            szCurLine = cat("    ",szCurLine)            if(nIdx == sel.lnLast - 1)            {                //对于最后一行应该是选中区内的内容后移四位                szCurLine = strmid(szCurLine,0,szLineselichLim + 4)                PutBufLine(hbuf,nIdx+1,szCurLine)            }            else            {                //其它情况是整行的内容后移四位                PutBufLine(hbuf,nIdx+1,szCurLine)            }            nIdx = nIdx + 1        }        if(strlen(szRight) != 0)        {            //最后插入最后一行没有被选择的内容            InsBufLine(hbuf, sel.lnLast + 1, "@szLeft@@szRight@")        }        InsBufLine(hbuf, sel.lnLast + 1, "@szLeft@}")        nlineCount = nlineCount + 1        if(nLeft < sel.ichFirst)        {            //如果选中区前的内容不是空格,则要保留该部分内容            PutBufLine(hbuf,ln,szOld)            InsBufLine(hbuf, ln+1, "@szLeft@{")            nlineCount = nlineCount + 1            ln = ln + 1        }        else        {            //如果选中区前没有内容直接删除该行            DelBufLine(hbuf,ln)            InsBufLine(hbuf, ln, "@szLeft@{")        }        if(strlen(szMid) > 0)        {            //插入第一行选择区的内容            InsBufLine(hbuf, ln+1, "@szLeft@    @szMid@")            nlineCount = nlineCount + 1            ln = ln + 1        }    }    retVal.szLeft = szLeft    retVal.nLineCount = nlineCount    //返回行数和左边的空白    return retVal}/*macro ScanStatement(szLine,iBeg){    nIdx = 0    iLen = strlen(szLine)    while(nIdx < iLen -1)    {        if(szLine[nIdx] == "/" && szLine[nIdx + 1] == "/")        {            return 0xffffffff        }        if(szLine[nIdx] == "/" && szLine[nIdx + 1] == "*")        {           while(nIdx < iLen)           {               if(szLine[nIdx] == "*" && szLine[nIdx + 1] == "/")               {                   break               }               nIdx = nIdx + 1           }        }        if( (szLine[nIdx] != " ") && (szLine[nIdx] != "\t" ))        {            return nIdx        }        nIdx = nIdx + 1    }    if( (szLine[iLen -1] == " ") || (szLine[iLen -1] == "\t" ))    {        return 0xffffffff    }    return nIdx}*//*macro MoveCommentLeftBlank(szLine){    nIdx  = 0    iLen = strlen(szLine)    while(nIdx < iLen - 1)    {        if(szLine[nIdx] == "/" && szLine[nIdx+1] == "*")        {            szLine[nIdx] = " "            szLine[nIdx + 1] = " "            nIdx = nIdx + 2            while(nIdx < iLen - 1)            {                if(szLine[nIdx] != " " && szLine[nIdx] != "\t")                {                    szLine[nIdx - 2] = "/"                    szLine[nIdx - 1] = "*"                    return szLine                }                nIdx = nIdx + 1            }        }        if(szLine[nIdx] == "/" && szLine[nIdx+1] == "/")        {            szLine[nIdx] = " "            szLine[nIdx + 1] = " "            nIdx = nIdx + 2            while(nIdx < iLen - 1)            {                if(szLine[nIdx] != " " && szLine[nIdx] != "\t")                {                    szLine[nIdx - 2] = "/"                    szLine[nIdx - 1] = "/"                    return szLine                }                nIdx = nIdx + 1            }        }        nIdx = nIdx + 1    }    return szLine}*/macro DelCompoundStatement(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    ln = sel.lnFirst    szLine = GetBufLine(hbuf,ln )    nLeft = GetLeftBlank(szLine)    szLeft = strmid(szLine,0,nLeft);    Msg("@szLine@  will be deleted !")    fIsEnd = 1    while(1)    {        RetVal = SkipCommentFromString(szLine,fIsEnd)        szTmp = RetVal.szContent        fIsEnd = RetVal.fIsEnd        //查找复合语句的开始        ret = strstr(szTmp,"{")        if(ret != 0xffffffff)        {            szNewLine = strmid(szLine,ret+1,strlen(szLine))            szNew = strmid(szTmp,ret+1,strlen(szTmp))            szNew = TrimString(szNew)            if(szNew != "")            {                InsBufLine(hbuf,ln + 1,"@szLeft@    @szNewLine@");            }            sel.lnFirst = ln            sel.lnLast = ln            sel.ichFirst = ret            sel.ichLim = ret            //查找对应的大括号            //使用自己编写的代码速度太慢            retTmp = SearchCompoundEnd(hbuf,ln,ret)            if(retTmp.iCount == 0)            {                DelBufLine(hbuf,retTmp.ln)                sel.ichFirst = 0                sel.ichLim = 0                DelBufLine(hbuf,ln)                sel.lnLast = retTmp.ln - 1                SetWndSel(hwnd,sel)                Indent_Left            }            //使用Si的大括号配对方法,但V2.1时在注释嵌套时可能有误/*            SetWndSel(hwnd,sel)            Block_Down            selNew = GetWndSel(hwnd)            if(selNew != sel)            {                DelBufLine(hbuf,selNew.lnFirst)                sel.ichFirst = 0                sel.ichLim = 0                DelBufLine(hbuf,ln)                sel.lnLast = selNew.lnFirst - 1                SetWndSel(hwnd,sel)                Indent_Left            }*/            break        }        szTmp = TrimString(szTmp)        iLen = strlen(szTmp)        if(iLen != 0)        {            if(szTmp[iLen-1] == ";")            {                break            }        }        DelBufLine(hbuf,ln)        if( ln == GetBufLineCount(hbuf ))        {             break        }        szLine = GetBufLine(hbuf,ln)    }}macro CheckBlockBrace(hbuf){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    ln = sel.lnFirst    nCount = 0    RetVal = ""    szLine = GetBufLine( hbuf, ln )    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        RetVal.iCount = 0        RetVal.ich = sel.ichFirst        return RetVal    }    if(sel.lnFirst == sel.lnLast && sel.ichFirst != sel.ichLim)    {        RetTmp = SkipCommentFromString(szLine,fIsEnd)        szTmp = RetTmp.szContent        RetVal = CheckBrace(szTmp,sel.ichFirst,sel.ichLim,"{","}",0,1)        return RetVal    }    if(sel.lnFirst != sel.lnLast)    {        fIsEnd = 1        while(ln <= sel.lnLast)        {            if(ln == sel.lnFirst)            {                RetVal = CheckBrace(szLine,sel.ichFirst,strlen(szLine)-1,"{","}",nCount,fIsEnd)            }            else if(ln == sel.lnLast)            {                RetVal = CheckBrace(szLine,0,sel.ichLim,"{","}",nCount,fIsEnd)            }            else            {                RetVal = CheckBrace(szLine,0,strlen(szLine)-1,"{","}",nCount,fIsEnd)            }            fIsEnd = RetVal.fIsEnd            ln = ln + 1            nCount = RetVal.iCount            szLine = GetBufLine( hbuf, ln )        }    }    return RetVal}macro SearchCompoundEnd(hbuf,ln,ichBeg){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    ln = sel.lnFirst    nCount = 0    SearchVal = ""//    szLine = GetBufLine( hbuf, ln )    lnMax = GetBufLineCount(hbuf)    fIsEnd = 1    while(ln < lnMax)    {        szLine = GetBufLine( hbuf, ln )        RetVal = CheckBrace(szLine,ichBeg,strlen(szLine)-1,"{","}",nCount,fIsEnd)        fIsEnd = RetVal.fIsEnd        ichBeg = 0        nCount = RetVal.iCount        //如果nCount=0则说明{}是配对的        if(nCount == 0)        {            break        }        ln = ln + 1//        szLine = GetBufLine( hbuf, ln )    }    SearchVal.iCount = RetVal.iCount    SearchVal.ich = RetVal.ich    SearchVal.ln = ln    return SearchVal}macro CheckBrace(szLine,ichBeg,ichEnd,chBeg,chEnd,nCheckCount,isCommentEnd){    retVal = ""    retVal.ich = 0    nIdx = ichBeg    nLen = strlen(szLine)    if(ichEnd >= nLen)    {        ichEnd = nLen - 1    }    fIsEnd = 1    while(nIdx <= ichEnd)    {        //如果是/*注释区,跳过该段        if( (isCommentEnd == 0) || (szLine[nIdx] == "/" && szLine[nIdx+1] == "*"))        {            fIsEnd = 0            while(nIdx <= ichEnd )            {                if(szLine[nIdx] == "*" && szLine[nIdx+1] == "/")                {                    nIdx = nIdx + 1                    fIsEnd  = 1                    isCommentEnd = 1                    break                }                nIdx = nIdx + 1            }            if(nIdx > ichEnd)            {                break            }        }        //如果是//注释则停止查找        if(szLine[nIdx] == "/" && szLine[nIdx+1] == "/")        {            break        }        if(szLine[nIdx] == chBeg)        {            nCheckCount = nCheckCount + 1        }        if(szLine[nIdx] == chEnd)        {            nCheckCount = nCheckCount - 1            if(nCheckCount == 0)            {                retVal.ich = nIdx            }        }        nIdx = nIdx + 1    }    retVal.iCount = nCheckCount    retVal.fIsEnd = fIsEnd    return retVal}macro InsertElse(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    ln = sel.lnFirst    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        szLeft = CreateBlankString(sel.ichFirst)        InsBufLine(hbuf, ln,szLeft)        SetWndSel(hwnd,sel)    }    val = ExpandBraceLarge()    szLeft = val.szLeft    InsBufLine(hbuf, ln, "@szLeft@else")    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        PutBufLine(hbuf,ln+2, "@szLeft@    ")        SetBufIns (hbuf, ln+2, strlen(szLeft)+4)        return    }    SetBufIns (hbuf, ln, strlen(szLeft)+7)}macro InsertCase(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    ln = sel.lnFirst    szLine = GetBufLine( hbuf, ln )    nLeft = GetLeftBlank(szLine)    szLeft = strmid(szLine,0,nLeft);    InsBufLine(hbuf, ln, "@szLeft@" # "case # :")    InsBufLine(hbuf, ln + 1, "@szLeft@" # "    " # "#")    InsBufLine(hbuf, ln + 2, "@szLeft@" # "    " # "break;")    SearchForward()}macro InsertSwitch(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    ln = sel.lnFirst    szLine = GetBufLine( hbuf, ln )    nLeft = GetLeftBlank(szLine)    szLeft = strmid(szLine,0,nLeft);    InsBufLine(hbuf, ln, "@szLeft@switch ( # )")    InsBufLine(hbuf, ln + 1, "@szLeft@" # "{")    nSwitch = ask("请输入case的个数")    InsertMultiCaseProc(hbuf,szLeft,nSwitch)    SearchForward()}macro InsertMultiCaseProc(hbuf,szLeft,nSwitch){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    ln = sel.lnFirst    nIdx = 0    if(nSwitch == 0)    {        hNewBuf = newbuf("clip")        if(hNewBuf == hNil)            return        SetCurrentBuf(hNewBuf)        PasteBufLine (hNewBuf, 0)        nLeftMax = 0        lnMax = GetBufLineCount(hNewBuf )        i = 0        fIsEnd = 1        while ( i < lnMax)        {            szLine = GetBufLine(hNewBuf , i)            //先去掉代码中注释的内容            RetVal = SkipCommentFromString(szLine,fIsEnd)            szLine = RetVal.szContent            fIsEnd = RetVal.fIsEnd//            nLeft = GetLeftBlank(szLine)            //从剪贴板中取得case值            szLine = GetSwitchVar(szLine)            if(strlen(szLine) != 0 )            {                ln = ln + 3                InsBufLine(hbuf, ln - 1, "@szLeft@" # "case @szLine@:")                InsBufLine(hbuf, ln    , "@szLeft@" # "    " # "#")                InsBufLine(hbuf, ln + 1, "@szLeft@" # "    " # "break;")              }              i = i + 1        }        closebuf(hNewBuf)       }       else       {        while(nIdx < nSwitch)        {            ln = ln + 3            InsBufLine(hbuf, ln - 1, "@szLeft@" # "case # :")            InsBufLine(hbuf, ln    , "@szLeft@" # "    " # "#")            InsBufLine(hbuf, ln + 1, "@szLeft@" # "    " # "break;")            nIdx = nIdx + 1        }      }    InsBufLine(hbuf, ln + 2, "@szLeft@" # "default:")    InsBufLine(hbuf, ln + 3, "@szLeft@" # "    " # "#")    InsBufLine(hbuf, ln + 4, "@szLeft@" # "}")    SetWndSel(hwnd, sel)    SearchForward()}macro GetSwitchVar(szLine){    if( (szLine == "{") || (szLine == "}") )    {        return ""    }    ret = strstr(szLine,"#define" )    if(ret != 0xffffffff)    {        szLine = strmid(szLine,ret + 8,strlen(szLine))    }    szLine = TrimLeft(szLine)    nIdx = 0    nLen = strlen(szLine)    while( nIdx < nLen)    {        if((szLine[nIdx] == " ") || (szLine[nIdx] == ",") || (szLine[nIdx] == "="))        {            szLine = strmid(szLine,0,nIdx)            return szLine        }        nIdx = nIdx + 1    }    return szLine}/*macro SkipControlCharFromString(szLine){   nLen = strlen(szLine)   nIdx = 0   newStr = ""   while(nIdx < nLen - 1)   {       if(szLine[nIdx] == "\t")       {           newStr = cat(newStr,"    ")       }       else if(szLine[nIdx] < " ")       {           newStr = cat(newStr," ")       }       else       {           newStr = cat(newStr," ")       }   }}*/macro SkipCommentFromString(szLine,isCommentEnd){    RetVal = ""    fIsEnd = 1    nLen = strlen(szLine)    nIdx = 0    while(nIdx < nLen )    {        //如果当前行开始还是被注释,或遇到了注释开始的变标记,注释内容改为空格?        if( (isCommentEnd == 0) || (szLine[nIdx] == "/" && szLine[nIdx+1] == "*"))        {            fIsEnd = 0            while(nIdx < nLen )            {                if(szLine[nIdx] == "*" && szLine[nIdx+1] == "/")                {                    szLine[nIdx+1] = " "                    szLine[nIdx] = " "                    nIdx = nIdx + 1                    fIsEnd  = 1                    isCommentEnd = 1                    break                }                szLine[nIdx] = " "                //如果是倒数第二个则最后一个也肯定是在注释内//                if(nIdx == nLen -2 )//                {//                    szLine[nIdx + 1] = " "//                }                nIdx = nIdx + 1            }            //如果已经到了行尾终止搜索            if(nIdx == nLen)            {                break            }        }        //如果遇到的是//来注释的说明后面都为注释        if(szLine[nIdx] == "/" && szLine[nIdx+1] == "/")        {            szLine = strmid(szLine,0,nIdx)            break        }        nIdx = nIdx + 1    }    RetVal.szContent = szLine;    RetVal.fIsEnd = fIsEnd    return RetVal}macro InsertDo(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    ln = sel.lnFirst    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        szLeft = CreateBlankString(sel.ichFirst)        InsBufLine(hbuf, ln,szLeft)        SetWndSel(hwnd,sel)    }    val = ExpandBraceLarge()    szLeft = val.szLeft    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        PutBufLine(hbuf,ln+1, "@szLeft@    #")    }    PutBufLine(hbuf, sel.lnLast + val.nLineCount, "@szLeft@}while ( # );")//       SetBufIns (hbuf, sel.lnLast + val.nLineCount, strlen(szLeft)+8)    InsBufLine(hbuf, ln, "@szLeft@do")    SearchForward()}macro InsertWhile(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    ln = sel.lnFirst    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        szLeft = CreateBlankString(sel.ichFirst)        InsBufLine(hbuf, ln,szLeft)        SetWndSel(hwnd,sel)    }    val = ExpandBraceLarge()    szLeft = val.szLeft    InsBufLine(hbuf, ln, "@szLeft@while ( # )")    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        PutBufLine(hbuf,ln+2, "@szLeft@    #")    }    SetBufIns (hbuf, ln, strlen(szLeft)+7)    SearchForward()}macro InsertFor(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    ln = sel.lnFirst    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        szLeft = CreateBlankString(sel.ichFirst)        InsBufLine(hbuf, ln,szLeft)        SetWndSel(hwnd,sel)    }    val = ExpandBraceLarge()    szLeft = val.szLeft    InsBufLine(hbuf, ln,"@szLeft@for ( # ; # ; # )")    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        PutBufLine(hbuf,ln+2, "@szLeft@    #")    }    sel.lnFirst = ln    sel.lnLast = ln    sel.ichFirst = 0    sel.ichLim = 0    SetWndSel(hwnd, sel)    SearchForward()    szVar = ask("请输入循环变量")    PutBufLine(hbuf,ln, "@szLeft@for ( @szVar@ = # ; @szVar@ # ; @szVar@++ )")    SearchForward()}macro InsertIf(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    ln = sel.lnFirst    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        szLeft = CreateBlankString(sel.ichFirst)        InsBufLine(hbuf, ln,szLeft)        SetWndSel(hwnd,sel)    }    val = ExpandBraceLarge()    szLeft = val.szLeft    InsBufLine(hbuf, ln, "@szLeft@if ( # )")    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        PutBufLine(hbuf,ln+2, "@szLeft@    #")    }//       SetBufIns (hbuf, ln, strlen(szLeft)+4)    SearchForward()}macro MergeString(){    hbuf = newbuf("clip")    if(hbuf == hNil)        return    SetCurrentBuf(hbuf)    PasteBufLine (hbuf, 0)    //如果剪贴板中没有内容,则返回    lnMax = GetBufLineCount(hbuf )    if( lnMax == 0 )    {        closebuf(hbuf)        return ""    }    lnLast =  0    if(lnMax > 1)    {        lnLast = lnMax - 1         i = lnMax - 1    }    while ( i > 0)    {        szLine = GetBufLine(hbuf , i-1)        szLine = TrimLeft(szLine)        nLen = strlen(szLine)        if(szLine[nLen - 1] == "-")        {              szLine = strmid(szLine,0,nLen - 1)        }        nLen = strlen(szLine)        if( (szLine[nLen - 1] != " ") && (AsciiFromChar (szLine[nLen - 1])  <= 160))        {              szLine = cat(szLine," ")        }        SetBufIns (hbuf, lnLast, 0)        SetBufSelText(hbuf,szLine)        i = i - 1    }    szLine = GetBufLine(hbuf,lnLast)    closebuf(hbuf)    return szLine}macro ClearPrombleNo(){   SetReg ("PNO", "")}macro AddPromblemNo(){    szQuestion = ASK("Please Input problem number ");    if(szQuestion == "#")    {       szQuestion = ""       SetReg ("PNO", "")    }    else    {       SetReg ("PNO", szQuestion)    }    return szQuestion}/*this macro convet selected  C++ coment block to C comment blockfor example:  line "  // aaaaa "  convert to  /* aaaaa */*//*macro ComentCPPtoC(){    hwnd = GetCurrentWnd()    lnFirst = GetWndSelLnFirst( hwnd )    lnLast = GetWndSelLnLast( hwnd )    lnCurrent = lnFirst    fIsEnd = 1    while ( lnCurrent <= lnLast )    {        fIsEnd = CmtCvtLine( lnCurrent,fIsEnd )        lnCurrent = lnCurrent + 1;    }}*/macro ComentCPPtoC(){    hwnd = GetCurrentWnd()    hbuf = GetCurrentBuf()    lnFirst = GetWndSelLnFirst( hwnd )    lnCurrent = lnFirst    lnLast = GetWndSelLnLast( hwnd )    ch_comment = CharFromAscii(47)    isCommentEnd = 1    isCommentContinue = 0    while ( lnCurrent <= lnLast )    {        ich = 0        szLine = GetBufLine(hbuf,lnCurrent)        ilen = strlen(szLine)        while ( ich < ilen )        {            if( (szLine[ich] != " ") && (szLine[ich] != "\t") )            {                break            }            ich = ich + 1        }        /*如果是空行,跳过该行*/        if(ich == ilen)        {            lnCurrent = lnCurrent + 1            szOldLine = szLine            continue        }        /*如果该行只有一个字符*/        if(ich > ilen - 2)        {            if( isCommentContinue == 1 )            {                szOldLine = cat(szOldLine,"  */")                PutBufLine(hbuf,lnCurrent-1,szOldLine)                isCommentContinue = 0            }            lnCurrent = lnCurrent + 1            szOldLine = szLine            continue        }        if( isCommentEnd == 1 )        {            /*如果不是在注释区内*/            if(( szLine[ich]==ch_comment ) && (szLine[ich+1]==ch_comment))            {                /* 去掉中间嵌套的注释 */                nIdx = ich + 2                while ( nIdx < ilen -1 )                {                    if( (( szLine[nIdx] == "/" ) && (szLine[nIdx+1] == "*")||                         ( szLine[nIdx] == "*" ) && (szLine[nIdx+1] == "/") )                    {                        szLine[nIdx] = " "                        szLine[nIdx+1] = " "                    }                    nIdx = nIdx + 1                }                if( isCommentContinue == 1 )                {                    /* 如果是连续的注释*/                    szLine[ich] = " "                    szLine[ich+1] = " "                }                else                {                    /*如果不是连续的注释则是新注释的开始*/                    szLine[ich] = "/"                    szLine[ich+1] = "*"                }                if ( lnCurrent == lnLast )                {                    /*如果是最后一行则在行尾添加结束注释符*/                    szLine = cat(szLine,"  */")                    isCommentContinue = 0                }                /*更新该行*/                PutBufLine(hbuf,lnCurrent,szLine)                isCommentContinue = 1                szOldLine = szLine                lnCurrent = lnCurrent + 1                continue            }            else            {                /*如果该行的起始不是//注释*/                if( isCommentContinue == 1 )                {                    szOldLine = cat(szOldLine,"  */")                    PutBufLine(hbuf,lnCurrent-1,szOldLine)                    isCommentContinue = 0                }            }        }        while ( ich < ilen - 1 )        {            //如果是/*注释区,跳过该段            if( (isCommentEnd == 0) || (szLine[ich] == "/" && szLine[ich+1] == "*"))            {                isCommentEnd = 0                while(ich < ilen - 1 )                {                    if(szLine[ich] == "*" && szLine[ich+1] == "/")                    {                        ich = ich + 1                        isCommentEnd = 1                        break                    }                    ich = ich + 1                }                if(ich >= ilen - 1)                {                    break                }            }            if(( szLine[ich]==ch_comment ) && (szLine[ich+1]==ch_comment))            {                /* 如果是//注释*/                isCommentContinue = 1                nIdx = ich                //去掉期间的/* 和 */注释符以免出现注释嵌套错误                while ( nIdx < ilen -1 )                {                    if( (( szLine[nIdx] == "/" ) && (szLine[nIdx+1] == "*")||                         ( szLine[nIdx] == "*" ) && (szLine[nIdx+1] == "/") )                    {                        szLine[nIdx] = " "                        szLine[nIdx+1] = " "                    }                    nIdx = nIdx + 1                }                szLine[ich+1] = "*"                if( lnCurrent == lnLast )                {                    szLine = cat(szLine,"  */")                }                PutBufLine(hbuf,lnCurrent,szLine)                break            }            ich = ich + 1        }        szOldLine = szLine        lnCurrent = lnCurrent + 1    }}macro ComentLine(){    hwnd = GetCurrentWnd()    hbuf = GetCurrentBuf()    lnFirst = GetWndSelLnFirst( hwnd )    lnCurrent = lnFirst    lnLast = GetWndSelLnLast( hwnd )    lnOld = 0    while ( lnCurrent <= lnLast )    {        szLine = GetBufLine(hbuf,lnCurrent)        DelBufLine(hbuf,lnCurrent)        nLeft = GetLeftBlank(szLine)        szLeft = strmid(szLine,0,nLeft);        szLine = TrimString(szLine)        ilen = strlen(szLine)        if(iLen == 0)        {            continue        }        nIdx = 0        //去掉期间的/* 和 */注释符以免出现注释嵌套错误        while ( nIdx < ilen -1 )        {            if( (( szLine[nIdx] == "/" ) && (szLine[nIdx+1] == "*")||                 ( szLine[nIdx] == "*" ) && (szLine[nIdx+1] == "/") )            {                szLine[nIdx] = " "                szLine[nIdx+1] = " "            }            nIdx = nIdx + 1        }        szLine = cat("/* ",szLine)        lnOld = lnCurrent        lnCurrent = CommentContent(hbuf,lnCurrent,szLeft,szLine,1)        lnLast = lnCurrent - lnOld + lnLast        lnCurrent = lnCurrent + 1    }}macro CmtCvtLine(lnCurrent, isCommentEnd){    hbuf = GetCurrentBuf()    szLine = GetBufLine(hbuf,lnCurrent)    ch_comment = CharFromAscii(47)    ich = 0    ilen = strlen(szLine)    fIsEnd = 1    iIsComment = 0;    while ( ich < ilen - 1 )    {        //如果是/*注释区,跳过该段        if( (isCommentEnd == 0) || (szLine[ich] == "/" && szLine[ich+1] == "*"))        {            fIsEnd = 0            while(ich < ilen - 1 )            {                if(szLine[ich] == "*" && szLine[ich+1] == "/")                {                    ich = ich + 1                    fIsEnd  = 1                    isCommentEnd = 1                    break                }                ich = ich + 1            }            if(ich >= ilen - 1)            {                break            }        }        if(( szLine[ich]==ch_comment ) && (szLine[ich+1]==ch_comment))        {            nIdx = ich            while ( nIdx < ilen -1 )            {                if( (( szLine[nIdx] == "/" ) && (szLine[nIdx+1] == "*")||                     ( szLine[nIdx] == "*" ) && (szLine[nIdx+1] == "/") )                {                    szLine[nIdx] = " "                    szLine[nIdx+1] = " "                }                nIdx = nIdx + 1            }            szLine[ich+1] = "*"            szLine = cat(szLine,"  */")            DelBufLine(hbuf,lnCurrent)            InsBufLine(hbuf,lnCurrent,szLine)            return fIsEnd        }        ich = ich + 1    }    return fIsEnd}macro GetFileNameExt(sz){    i = 1    j = 0    szName = sz    iLen = strlen(sz)    if(iLen == 0)      return ""    while( i <= iLen)    {      if(sz[iLen-i] == ".")      {         j = iLen-i         szExt = strmid(sz,j + 1,iLen)         return szExt      }      i = i + 1    }    return ""}macro GetFileNameNoExt(sz){    i = 1    szName = sz    iLen = strlen(sz)    j = iLen    if(iLen == 0)      return ""    while( i <= iLen)    {      if(sz[iLen-i] == ".")      {         j = iLen-i      }      if( sz[iLen-i] == "\\" )      {         szName = strmid(sz,iLen-i+1,j)         return szName      }      i = i + 1    }    szName = strmid(sz,0,j)    return szName}macro GetFileName(sz){    i = 1    szName = sz    iLen = strlen(sz)    if(iLen == 0)      return ""    while( i <= iLen)    {      if(sz[iLen-i] == "\\")      {        szName = strmid(sz,iLen-i+1,iLen)        break      }      i = i + 1    }    return szName}macro InsIfdef(){    sz = Ask("Enter #ifdef condition:")    if (sz != "")        IfdefStr(sz);}macro InsIfndef(){    sz = Ask("Enter #ifndef condition:")    if (sz != "")        IfndefStr(sz);}macro InsertCPP(hbuf,ln){    InsBufLine(hbuf, ln, "")    InsBufLine(hbuf, ln, "#endif /* __cplusplus */")    InsBufLine(hbuf, ln, "#endif")    InsBufLine(hbuf, ln, "extern \"C\"{")    InsBufLine(hbuf, ln, "#if __cplusplus")    InsBufLine(hbuf, ln, "#ifdef __cplusplus")    InsBufLine(hbuf, ln, "")    iTotalLn = GetBufLineCount (hbuf)    InsBufLine(hbuf, iTotalLn, "")    InsBufLine(hbuf, iTotalLn, "#endif /* __cplusplus */")    InsBufLine(hbuf, iTotalLn, "#endif")    InsBufLine(hbuf, iTotalLn, "}")    InsBufLine(hbuf, iTotalLn, "#if __cplusplus")    InsBufLine(hbuf, iTotalLn, "#ifdef __cplusplus")    InsBufLine(hbuf, iTotalLn, "")}macro ReviseCommentProc(hbuf,ln,szCmd,szMyName,szLine1){    if (szCmd == "ap")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        szQuestion = AddPromblemNo()        InsBufLine(hbuf, ln, "@szLine1@/* 问 题 单: @szQuestion@     修改人:@szMyName@,   时间:@sz@/@sz1@/@sz3@ ");        szContent = Ask("修改原因")        szLeft = cat(szLine1,"   修改原因: ");        if(strlen(szLeft) > 70)        {            Msg("The right margine is small, Please use a new line")            stop        }        ln = CommentContent(hbuf,ln + 1,szLeft,szContent,1)        return    }    else if (szCmd == "ab")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        szQuestion = GetReg ("PNO")        if(strlen(szQuestion)>0)        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Added by @szMyName@, @sz@/@sz1@/@sz3@   问题单号:@szQuestion@*/");        }        else        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Added by @szMyName@, @sz@/@sz1@/@sz3@ */");        }        return    }    else if (szCmd == "ae")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        InsBufLine(hbuf, ln, "@szLine1@/* END:   Added by @szMyName@, @sz@/@sz1@/@sz3@ */");        return    }    else if (szCmd == "db")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        szQuestion = GetReg ("PNO")        if(strlen(szQuestion) > 0)        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Deleted by @szMyName@, @sz@/@sz1@/@sz3@   问题单号:@szQuestion@*/");        }        else        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Deleted by @szMyName@, @sz@/@sz1@/@sz3@ */");        }        return    }    else if (szCmd == "de")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln + 0)        InsBufLine(hbuf, ln, "@szLine1@/* END: Deleted by @szMyName@, @sz@/@sz1@/@sz3@ */");        return    }    else if (szCmd == "mb")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        szQuestion = GetReg ("PNO")            if(strlen(szQuestion) > 0)        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Modified by @szMyName@, @sz@/@sz1@/@sz3@   问题单号:@szQuestion@*/");        }        else        {            InsBufLine(hbuf, ln, "@szLine1@/* BEGIN: Modified by @szMyName@, @sz@/@sz1@/@sz3@ */");        }        return    }    else if (szCmd == "me")    {        SysTime = GetSysTime(1)        sz=SysTime.Year        sz1=SysTime.month        sz3=SysTime.day        DelBufLine(hbuf, ln)        InsBufLine(hbuf, ln, "@szLine1@/* END:   Modified by @szMyName@, @sz@/@sz1@/@sz3@ */");        return    }}macro InsertReviseAdd(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    lnMax = GetBufLineCount(hbuf)    language = getreg(LANGUAGE)    if(language != 1)    {        language = 0    }    szMyName = getreg(MYNAME)    if(strlen( szMyName ) == 0)    {        szMyName = Ask("Enter your name:")        setreg(MYNAME, szMyName)    }    SysTime = GetSysTime(1)    sz=SysTime.Year    sz1=SysTime.month    sz3=SysTime.day    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        szLeft = CreateBlankString(sel.ichFirst)    }    else    {        szLine = GetBufLine( hbuf, sel.lnFirst )        nLeft = GetLeftBlank(szLine)        szLeft = strmid(szLine,0,nLeft);    }    szQuestion = GetReg ("PNO")    if(strlen(szQuestion)>0)    {        InsBufLine(hbuf, sel.lnFirst, "@szLeft@/* BEGIN: Added by @szMyName@, @sz@/@sz1@/@sz3@   PN:@szQuestion@ */");    }    else    {        InsBufLine(hbuf, sel.lnFirst, "@szLeft@/* BEGIN: Added by @szMyName@, @sz@/@sz1@/@sz3@ */");    }    if(sel.lnLast < lnMax - 1)    {        InsBufLine(hbuf, sel.lnLast + 2, "@szLeft@/* END:   Added by @szMyName@, @sz@/@sz1@/@sz3@   PN:@szQuestion@ */");    }    else    {        AppendBufLine(hbuf, "@szLeft@/* END:   Added by @szMyName@, @sz@/@sz1@/@sz3@ */");    }    SetBufIns(hbuf,sel.lnFirst + 1,strlen(szLeft))}macro InsertReviseDel(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    lnMax = GetBufLineCount(hbuf)    language = getreg(LANGUAGE)    if(language != 1)    {        language = 0    }    szMyName = getreg(MYNAME)    if(strlen( szMyName ) == 0)    {        szMyName = Ask("Enter your name:")        setreg(MYNAME, szMyName)    }    SysTime = GetSysTime(1)    sz=SysTime.Year    sz1=SysTime.month    sz3=SysTime.day    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        szLeft = CreateBlankString(sel.ichFirst)    }    else    {        szLine = GetBufLine( hbuf, sel.lnFirst )        nLeft = GetLeftBlank(szLine)        szLeft = strmid(szLine,0,nLeft);    }    szQuestion = GetReg ("PNO")    if(strlen(szQuestion)>0)    {        InsBufLine(hbuf, sel.lnFirst, "@szLeft@/* BEGIN: Deleted by @szMyName@, @sz@/@sz1@/@sz3@   PN:@szQuestion@ */");    }    else    {        InsBufLine(hbuf, sel.lnFirst, "@szLeft@/* BEGIN: Deleted by @szMyName@, @sz@/@sz1@/@sz3@ */");    }    if(sel.lnLast < lnMax - 1)    {        InsBufLine(hbuf, sel.lnLast + 2, "@szLeft@/* END:   Deleted by @szMyName@, @sz@/@sz1@/@sz3@   PN:@szQuestion@ */");    }    else    {        AppendBufLine(hbuf, "@szLeft@/* END:   Deleted by @szMyName@, @sz@/@sz1@/@sz3@ */");    }    SetBufIns(hbuf,sel.lnFirst + 1,strlen(szLeft))}macro InsertReviseMod(){    hwnd = GetCurrentWnd()    sel = GetWndSel(hwnd)    hbuf = GetCurrentBuf()    lnMax = GetBufLineCount(hbuf)    language = getreg(LANGUAGE)    if(language != 1)    {        language = 0    }    szMyName = getreg(MYNAME)    if(strlen( szMyName ) == 0)    {        szMyName = Ask("Enter your name:")        setreg(MYNAME, szMyName)    }    SysTime = GetSysTime(1)    sz=SysTime.Year    sz1=SysTime.month    sz3=SysTime.day    if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)    {        szLeft = CreateBlankString(sel.ichFirst)    }    else    {        szLine = GetBufLine( hbuf, sel.lnFirst )        nLeft = GetLeftBlank(szLine)        szLeft = strmid(szLine,0,nLeft);    }    szQuestion = GetReg ("PNO")    if(strlen(szQuestion)>0)    {        InsBufLine(hbuf, sel.lnFirst, "@szLeft@/* BEGIN: Modified by @szMyName@, @sz@/@sz1@/@sz3@   PN:@szQuestion@ */");    }    else    {        InsBufLine(hbuf, sel.lnFirst, "@szLeft@/* BEGIN: Modified by @szMyName@, @sz@/@sz1@/@sz3@ */");    }    if(sel.lnLast < lnMax - 1)    {        InsBufLine(hbuf, sel.lnLast + 2, "@szLeft@/* END:   Modified by @szMyName@, @sz@/@sz1@/@sz3@   PN:@szQuestion@ */");    }    else    {        AppendBufLine(hbuf, "@szLeft@/* END:   Modified by @szMyName@, @sz@/@sz1@/@sz3@ */");    }    SetBufIns(hbuf,sel.lnFirst + 1,strlen(szLeft))}// Wrap ifdef <sz> .. endif around the current selectionmacro IfdefStr(sz){    hwnd = GetCurrentWnd()    lnFirst = GetWndSelLnFirst(hwnd)    lnLast = GetWndSelLnLast(hwnd)    hbuf = GetCurrentBuf()    lnMax = GetBufLineCount(hbuf)    if(lnMax != 0)    {        szLine = GetBufLine( hbuf, lnFirst )    }    nLeft = GetLeftBlank(szLine)    szLeft = strmid(szLine,0,nLeft);    hbuf = GetCurrentBuf()    if(lnLast + 1 < lnMax)    {        InsBufLine(hbuf, lnLast+1, "@szLeft@#endif /* @sz@ */")    }    else if(lnLast + 1 == lnMax)    {        AppendBufLine(hbuf, "@szLeft@#endif /* @sz@ */")    }    else    {        AppendBufLine(hbuf, "")        AppendBufLine(hbuf, "@szLeft@#endif /* @sz@ */")    }    InsBufLine(hbuf, lnFirst, "@szLeft@#ifdef @sz@")    SetBufIns(hbuf,lnFirst + 1,strlen(szLeft))}macro IfndefStr(sz){    hwnd = GetCurrentWnd()    lnFirst = GetWndSelLnFirst(hwnd)    lnLast = GetWndSelLnLast(hwnd)    hbuf = GetCurrentBuf()    lnMax = GetBufLineCount(hbuf)    if(lnMax != 0)    {        szLine = GetBufLine( hbuf, lnFirst )    }    nLeft = GetLeftBlank(szLine)    hbuf = GetCurrentBuf()    if(lnLast + 1 < lnMax)    {        InsBufLine(hbuf, lnLast+1, "#endif /* @sz@ */")    }    else if(lnLast + 1 == lnMax)    {        AppendBufLine(hbuf, "#endif /* @sz@ */")    }    else    {        AppendBufLine(hbuf, "")        AppendBufLine(hbuf, "#endif /* @sz@ */")    }    InsBufLine(hbuf, lnFirst, "#ifndef @sz@")    SetBufIns(hbuf,lnFirst + 1,0)}macro InsertPredefIf(){    sz = Ask("Enter #if condition:")    PredefIfStr(sz)}macro PredefIfStr(sz){    hwnd = GetCurrentWnd()    lnFirst = GetWndSelLnFirst(hwnd)    lnLast = GetWndSelLnLast(hwnd)    hbuf = GetCurrentBuf()    lnMax = GetBufLineCount(hbuf)    if(lnMax != 0)    {        szLine = GetBufLine( hbuf, lnFirst )    }    nLeft = GetLeftBlank(szLine)    hbuf = GetCurrentBuf()    if(lnLast + 1 < lnMax)    {        InsBufLine(hbuf, lnLast+1, "#endif /* #if @sz@ */")    }    else if(lnLast + 1 == lnMax)    {        AppendBufLine(hbuf, "#endif /* #if @sz@ */")    }    else    {        AppendBufLine(hbuf, "")        AppendBufLine(hbuf, "#endif /* #if @sz@ */")    }    InsBufLine(hbuf, lnFirst, "#if  @sz@")    SetBufIns(hbuf,lnFirst + 1,0)}macro HeadIfdefStr(sz){    hwnd = GetCurrentWnd()    lnFirst = GetWndSelLnFirst(hwnd)    hbuf = GetCurrentBuf()    InsBufLine(hbuf, lnFirst, "")    InsBufLine(hbuf, lnFirst, "#define @sz@")    InsBufLine(hbuf, lnFirst, "#ifndef @sz@")    iTotalLn = GetBufLineCount (hbuf)    InsBufLine(hbuf, iTotalLn, "#endif /* @sz@ */")    InsBufLine(hbuf, iTotalLn, "")}macro GetSysTime(a){    //从sidate取得时间    RunCmd ("sidate")    SysTime=""    SysTime.Year=getreg(Year)    if(strlen(SysTime.Year)==0)    {        setreg(Year,"2002")        setreg(Month,"05")        setreg(Day,"02")        SysTime.Year="2002"        SysTime.month="05"        SysTime.day="20"        SysTime.Date="2002-05-20"    }    else    {        SysTime.Month=getreg(Month)        SysTime.Day=getreg(Day)        SysTime.Date=getreg(Date)    }    return SysTime}macro HeaderFileCreate(){    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    sel = GetWndSel(hwnd)    hbuf = GetWndBuf(hwnd)    language = getreg(LANGUAGE)    if(language != 1)    {        language = 0    }    szMyName = getreg(MYNAME)    if(strlen( szMyName ) == 0)    {        szMyName = Ask("Enter your name:")        setreg(MYNAME, szMyName)    }   CreateFunctionDef(hbuf,szMyName,language)}macro FunctionHeaderCreate(){    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    sel = GetWndSel(hwnd)    ln = sel.lnFirst    hbuf = GetWndBuf(hwnd)    language = getreg(LANGUAGE)    if(language != 1)    {        language = 0    }    szMyName = getreg(MYNAME)    if(strlen( szMyName ) == 0)    {        szMyName = Ask("Enter your name:")        setreg(MYNAME, szMyName)    }    nVer = GetVersion()    lnMax = GetBufLineCount(hbuf)    if(ln != lnMax)    {        szNextLine = GetBufLine(hbuf,ln)        if( (strstr(szNextLine,"(") != 0xffffffff) || (nVer != 2 ))        {            symbol = GetCurSymbol()            if(strlen(symbol) != 0)            {                if(language == 0)                {                    FuncHeadCommentCN(hbuf, ln, symbol, szMyName,0)                }                else                {                    FuncHeadCommentEN(hbuf, ln, symbol, szMyName,0)                }                return            }        }    }    if(language == 0 )    {        szFuncName = Ask("请输入函数名称:")            FuncHeadCommentCN(hbuf, ln, szFuncName, szMyName, 1)    }    else    {        szFuncName = Ask("Please input function name")           FuncHeadCommentEN(hbuf, ln, szFuncName, szMyName, 1)    }}macro GetVersion(){   Record = GetProgramInfo ()   return Record.versionMajor}macro GetProgramInfo (){    Record = ""    Record.versionMajor     = 2    Record.versionMinor    = 1    return Record}macro FileHeaderCreate(){    hwnd = GetCurrentWnd()    if (hwnd == 0)        stop    ln = 0    hbuf = GetWndBuf(hwnd)    language = getreg(LANGUAGE)    if(language != 1)    {        language = 0    }    szMyName = getreg(MYNAME)    if(strlen( szMyName ) == 0)    {        szMyName = Ask("Enter your name:")        setreg(MYNAME, szMyName)    }       SetBufIns (hbuf, 0, 0)    if(language == 0)    {        InsertFileHeaderCN( hbuf,ln, szMyName,"" )    }    else    {        InsertFileHeaderEN( hbuf,ln, szMyName,"" )    }}macro AddStructHeader(){    // Get a handle to the current file buffer and the name    // and location of the current symbol where the cursor is.    hbuf = GetCurrentBuf()    if( hbuf == hNil )    {        return 1    }    ln = GetBufLnCur( hbuf )    DelBufLine(hbuf,ln)    /* if owner variable exists, insert Owner: name */    lnStartPos = ln +1;    if (strlen(szMyName) > 0)    {        InsBufLine( hbuf, ln,     "/**" )        InsBufLine( hbuf, ln + 1, "  * @@struct brief   " )        InsBufLine( hbuf, ln + 2, "  */" )        ln = ln + 2    }    else    {        ln = ln + 2    }    // put the insertion point inside the header comment    SetBufIns( hbuf, lnStartPos, 10 )}macro AddEnumHeader(){    // Get a handle to the current file buffer and the name    // and location of the current symbol where the cursor is.    hbuf = GetCurrentBuf()    if( hbuf == hNil )    {        return 1    }    ln = GetBufLnCur( hbuf )    DelBufLine(hbuf,ln)    /* if owner variable exists, insert Owner: name */    lnStartPos = ln + 1;    if (strlen(szMyName) > 0)    {        InsBufLine( hbuf, ln,     "/**" )        InsBufLine( hbuf, ln + 1, "  * @@enum brief    " )        InsBufLine( hbuf, ln + 2, "  */" )        ln = ln + 2    }    else    {        ln = ln + 2    }    // put the insertion point inside the header comment    SetBufIns( hbuf, lnStartPos, 10 )}/**************************************************************************** *  Ver:    1.13 *  Date:   2002.9.18 *  Author: suqiyuan * ================================ * 这里有几个宏可以用来部分支持汉字: * 使用这些宏重载对应的键就可以了 * * 重载关系如下: * EM_delete:            DELETE * EM_backspace:         BACKSPACE * EM_CursorUp:          ↑(上方向键) * EM_CursorDown:        ↓(下方向键) * EM_CursorLeft:        ←(左方向键) * EM_CursorRight:       →(右方向键) * EM_SelectWordLeft:    Shift + ← * EM_SelectWordRight:   Shift + → * EM_SelectLineUp:      Shift + ↑ * EM_SelectLineUp:      Shift + ↓ ****************************************************************************/#if 0 //For keyboard delete Macro EM_delete() {    //get current character    hWnd = GetCurrentWnd()    if(hWnd == 0)        stop    ln      = GetWndSelLnFirst(hWnd)    lnLast  = GetWndSelLnLast(hWnd)    lnCnt   = lnLast - ln + 1    sel     = GetWndSel(hWnd)    ich     = GetWndSelIchFirst(hWnd)    ichLast = GetWndSelIchLim(hWnd)    hBuf    = GetWndBuf(hWnd)    curLine = GetBufLine(hBuf,ln)    //Msg("Now Select lines:@lnCnt@,Line @ln@ index @ich@ to line @lnLast@ index @ichLast@")    if((lnCnt > 1) || ((lnCnt==1)&&(ichLast>ich)))//选择的是块    {        //Msg("Selection is One BLOCK.")        curLine = GetBufLine(hBuf,ln)        if(ich>0)        {            index = 0            while(index < ich)            {                ch = curLine[index]                if(SearchCharInTab(ch))                    index = index + 1                else                    index = index + 2            }            //如果块首在汉字中间,块首向前调整一个字节            sel.ichFirst = ich - (index-ich)        }        curLine = GetBufLine(hBuf,lnLast)        len     = GetBufLineLength(hBuf,lnLast)        index   = 0        while(index < ichLast && index < len)        {            ch = curLine[index]            if(SearchCharInTab(ch))                index = index + 1            else                index = index + 2        }        sel.ichLim = index        if(ichLast>len)            sel.ichLim = ichLast        SetWndSel(hWnd,sel)        //Msg("See the block selected is adjusted now.")        Delete_Character    }    else//选择的不是块    {        //Msg("Selection NOT block.")        curChar = curLine[ich]        //如果在行末,应该能够使得下一行连到行尾        if(ich == strlen(curLine))        {            Delete_Character            stop        }        //Msg("Not at the end of line.")        flag    = SearchCharInTab(curChar)        //Msg("Current char:@curChar@,Valid flag:@flag@")        if(flag)        {            //Msg("Byte location to delete:@ich@,Current char:@curChar@")            DelCharOfLine(hWnd,ln,ich,1)        }        else        {            /*这里的实现方法是这样的:从行首开始找,如果是Table中的,加一继续             *如果不是,加二继续,一直到当前字符,决定怎么删除             *这里有这样的假定,当前行没有半个汉字的情形             */            index = 0            word  = 0            byte  = 0            len   = strlen(curLine)            while(index < ich)            {                ch   = curLine[index]                flag = SearchCharInTab(ch)                if(flag)                {                    index = index + 1                    byte  = byte + 1                }                else                {                    index = index + 2                    word  = word + 1                }            }            //index = ich + 1,current cursor is in the middle of word            //                or in the front of byte            //index = ich,current cursor is NOT in the front of word            nich = 2*(word-(index-ich)) + byte            //Msg("Start deleting position:@ich@,word:@word@,byte:@byte@")            DelCharOfLine(hWnd,ln,nich,2)            if((index-ich) && !flag && (ich != len-1))//当在一个不在末尾的汉字中间                Cursor_Left        }    }}//For keyboard backspace <-Macro EM_backspace(){    //get current character    hWnd = GetCurrentWnd()    if(hWnd == 0)        stop    sel     = GetWndSel(hWnd)    ln      = sel.lnFirst    ich     = sel.ichFirst    if(ich < 0)        stop    lnLast  = GetWndSelLnLast(hWnd)    lnCnt   = lnLast - ln + 1    ichLast = GetWndSelIchLim(hWnd)    //Msg("Now Select lines:@lnCnt@,Line @ln@ index @ich@ to line @lnLast@ index @ichLast@")    if((lnCnt > 1) || ((lnCnt==1)&&(ichLast>ich)))//选择的是块,直接删除调整后的块    {        EM_delete    }    else        {if(ich == 0)        {            Backspace            stop        }        hBuf    = GetWndBuf(hWnd)        curLine = GetBufLine(hBuf,ln)        index = 0        flag  = 0  // 1-byte,0-word        byte = 0        word = 0        while(index < ich)        {            ch   = curLine[index]            flag = SearchCharInTab(ch)            if(flag)                {                    byte  = byte + 1                    index = index + 1                }            else                {                    word  = word + 1                    index = index + 2                }        }        if(flag)//char before cursor is in table        {            //Msg("char before cursor is in table,byte!")            Backspace        }        else if(!flag && (index-ich))//current cursor is in the middle of word        {            //Msg("current cursor is in the middle of word.")            DelCharOfLine(hWnd,ln,ich-1,2)            if(!(sel.ichFirst == strlen(curLine)-1))                Cursor_Left        }        else if(!flag && !(index-ich))//Current cursor is after a word        {            //Msg("Current cursor is after a word.")            DelCharOfLine(hWnd,ln,ich-2,2)            if(sel.ichFirst != strlen(curLine))            {                Cursor_Left                Cursor_Left            }        }    }}Macro SearchCharInTab(curChar){     /* Total 97 chars */    AsciiChar = AsciiFromChar(curChar)    //Msg("Current char in SearchCharInTab():@curChar@.")    if(AsciiChar >= 32 && AsciiChar <= 126)        return 1    //Msg("Current Char(@curChar@) NOT between space and ~")    if(AsciiChar == 9)//Tab        return 1    //Msg("Current Char(@curChar@) NOT Tab")    if(AsciiChar == 13)//CR        return 1    //Msg("Current Char(@curChar@) Not CR")    return 0}Macro DelCharOfLine(hWnd,ln,ich,count){    if(hWnd == 0)        stop    sel     = GetWndSel(hWnd)    hBuf    = GetWndBuf(hWnd)    if(hBuf == 0)        stop    if(ln > GetBufLineCount(hBuf))        stop    szLine = GetBufLine(hBuf,ln)    len    = strlen(szLine)    if(ich >  len)        stop    NewLine = ""    if(ich > 0)    {        NewLine = NewLine # strmid(szLine,0,ich)    }    if(ich+count < len)    {        ichLast = len        NewLine = NewLine # strmid(szLine,ich+count,ichLast)    }    /**/    //Msg("Current line:@szLine@")    //Msg("Replaced as:@NewLine@")    /**/    PutBufLine(hBuf,ln,NewLine)    SetWndSel(hWnd, sel)}//上移光标macro EM_CursorUp(){    hWnd = GetCurrentWnd()    if(hWnd == 0)        stop    hbuf = GetCurrentBuf()    //移动光标    Cursor_Up    //检查移动光标后的光标位置    hwnd = GetWndhandle(hbuf)    sel = GetWndSel(hwnd)    str = GetBufline(hbuf, sel.lnFirst)    flag = StrChinChk(str, sel.ichFirst)    //光标位于中文字符之中则向前移动一个字符    if (flag == True)    {        Cursor_Left    }}//下移光标macro EM_CursorDown(){    hWnd = GetCurrentWnd()    if(hWnd == 0)        stop    hbuf = GetCurrentBuf()    //移动光标    Cursor_Down    //检查移动光标后的光标位置    hwnd = GetWndhandle(hbuf)    sel = GetWndSel(hwnd)    str = GetBufline(hbuf, sel.lnFirst)    flag = StrChinChk(str, sel.ichFirst)    //光标位于中文字符之中则向前移动一个字符    if (flag == True)    {        Cursor_Right    }}//右移光标macro EM_CursorRight(){    hWnd = GetCurrentWnd()    if(hWnd == 0)        stop    hbuf = GetCurrentBuf()    //移动光标    Cursor_Right    //检查移动光标后的光标位置    hwnd = GetWndhandle(hbuf)    sel = GetWndSel(hwnd)    str = GetBufline(hbuf, sel.lnFirst)    flag = StrChinChk(str, sel.ichFirst)    //光标位于中文字符之中则向前移动一个字符(向后移时是再向后移动一个字符)    if (flag == True)    {        Cursor_Right    }}//左移光标macro EM_CursorLeft(){    hWnd = GetCurrentWnd()    if(hWnd == 0)        stop    hbuf = GetCurrentBuf()    //移动光标    Cursor_Left    //检查移动光标后的光标位置    hwnd = GetWndhandle(hbuf)    sel = GetWndSel(hwnd)    str = GetBufline(hbuf, sel.lnFirst)    flag = StrChinChk(str, sel.ichFirst)    //光标位于中文字符之中则向前移动一个字符(向后移时是再向后移动一个字符)    if (flag == True)    {        Cursor_Left    }}//向左选择字符macro EM_SelectWordLeft(){    hWnd = GetCurrentWnd()    if(hWnd == 0)        stop    hbuf = GetCurrentBuf()    //执行命令    Select_Char_Left    hwnd = GetWndhandle(hbuf)    //selold = GetWndSel(hwnd)    sel = GetWndSel(hwnd)    //ln = GetBufLnCur(hbuf)    /*    if (selold.ichFirst == sel.ichFirst && sel.lnFirst == selold.lnFirst)        curinhead = 1    else        curinhead = 0    */    str = GetBufline(hbuf, sel.lnFirst)    hdflag = StrChinChk(str, sel.ichFirst)    str = GetBufline(hbuf, sel.lnLast)    bkflag = StrChinChk(str, sel.ichLim)    if (hdflag == TRUE || bkflag == TRUE)    {        Select_Char_Left    }}//向右选择字符macro EM_SelectWordRight(){    hWnd = GetCurrentWnd()    if(hWnd == 0)        stop    hbuf = GetCurrentBuf()    //执行命令    Select_Char_Right    hwnd = GetWndhandle(hbuf)    //selold = GetWndSel(hwnd)    sel = GetWndSel(hwnd)    //ln = GetBufLnCur(hbuf)    /*    if (selold.ichFirst == sel.ichFirst && sel.lnFirst == selold.lnFirst)        curinhead = 1    else        curinhead = 0    */    str = GetBufline(hbuf, sel.lnFirst)    hdflag = StrChinChk(str, sel.ichFirst)    str = GetBufline(hbuf, sel.lnLast)    bkflag = StrChinChk(str, sel.ichLim)    if (hdflag == TRUE || bkflag == TRUE)    {        Select_Char_Right    }}//向上选择字符macro EM_SelectLineUp(){    hWnd = GetCurrentWnd()    if(hWnd == 0)        stop    hbuf = GetCurrentBuf()    //执行命令    Select_Line_Up    hwnd = GetWndhandle(hbuf)    //selold = GetWndSel(hwnd)    sel = GetWndSel(hwnd)    //ln = GetBufLnCur(hbuf)    /*    if (selold.ichFirst == sel.ichFirst && sel.lnFirst == selold.lnFirst)        curinhead = 1    else        curinhead = 0    */    str = GetBufline(hbuf, sel.lnFirst)    hdflag = StrChinChk(str, sel.ichFirst)    str = GetBufline(hbuf, sel.lnLast)    bkflag = StrChinChk(str, sel.ichLim)    if (hdflag == TRUE || bkflag == TRUE)    {        Select_Char_Right    }}//向下选择字符macro EM_SelectLineDown(){    hWnd = GetCurrentWnd()    if(hWnd == 0)        stop    hbuf = GetCurrentBuf()    //执行命令    Select_Line_Down    hwnd = GetWndhandle(hbuf)    //selold = GetWndSel(hwnd)    sel = GetWndSel(hwnd)    //ln = GetBufLnCur(hbuf)    /*    if (selold.ichFirst == sel.ichFirst && sel.lnFirst == selold.lnFirst)        curinhead = 1    else        curinhead = 0    */    str = GetBufline(hbuf, sel.lnFirst)    hdflag = StrChinChk(str, sel.ichFirst)    str = GetBufline(hbuf, sel.lnLast)    bkflag = StrChinChk(str, sel.ichLim)    if (hdflag == TRUE || bkflag == TRUE)    {        Select_Char_Right    }}//对字符串str到ln位进行检查//如果有偶数个中文字符则返回FALSE//如果是奇数个中文字符则返回TRUEmacro StrChinChk(str, ln){    tm  = 0    flag = False    len  = strlen(str)    while (tm < ln)    {        if (str[tm] != "")            ascstr = asciifromchar(str[tm])        else            ascstr = 0        //中文字符ASCII > 128        if (ascstr > 128)            flag = !flag        tm = tm + 1        if (tm >= len)            break    }    return flag}// 在工程中查找半个汉字,依赖"macro OpenorNewBuf(szfile)"macro FindHalfChcharInProj(){    hprj = GetCurrentProj()    if (hprj == 0)        stop    ifileMax = GetProjFileCount(hprj)    hOutBuf = OpenorNewBuf("HalfChch.txt")    if (hOutBuf == hNil)    {        Msg("Can't Open file:HalfChchar.txt")        stop    }    AppendBufLine(hOutBuf, ">>半个汉字列表>>")    ifile = 0    while (ifile < ifileMax)    {        filename = GetProjFileName(hprj, ifile)        hbuf = OpenBuf(filename)        if (hbuf != 0)        {            StartMsg("@filename@ is being processing. . . press ESC to cancel.")            iTotalLn = GetBufLineCount(hbuf)            iCurLn = 0            while (iCurLn < iTotalLn)            {                str = GetBufline(hbuf, iCurLn)                flag = StrChinChk(str, strlen(str))                if (flag == True)                {                    // 存在半个汉字,记录文件名和行号                    iOutLn = iCurLn + 1                    outstr = cat(filename, "(@iOutLn@) : ")                    outstr = cat(outstr, str)                    AppendBufLine(hOutBuf, outstr)                    SetSourceLink(hOutBuf,GetBufLineCount(hOutBuf)-1,filename,iCurLn)                }                iCurLn = iCurLn + 1            }            EndMsg()        }        ifile = ifile + 1    }    //SetCurrentBuf(hOutBuf)    //Go_To_First_Link}// 如果没有szfile指明的文件打开,则新建,否则打开,并返回BUFF句柄macro OpenorNewBuf(szfile){    hout = GetBufHandle(szfile)    if (hout == hNil)    {        hout = OpenBuf(szfile)        if (hout == hNil)        {            hout = NewBuf(szfile)            NewWnd(hout)        }    }    return hout}#endif
原创粉丝点击