Quicker.em 的函数内容

macro AutoExpand()
{
    hwnd = GetCurrentWnd()

    if(hwnd == 0)
        stop

    sel = GetWndSel(hwnd)

    if(sel.lnFirst != sel.lnLast)
    {
        BlockCommandProc()
    }

    if (sel.ichFirst == 0)
        stop

    hbuf = GetWndBuf(hwnd)

	/* get user name */
    language = getreg(LANGUAGE)

    if(language != 1)
    {
        language = 0
    }

    nVer = 0
    nVer = GetVersion()

	/* get user name */
    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;

    /* custom-command deal */
    wordinfo.szWord = RestoreCommand(hbuf, wordinfo.szWord);

    sel = GetWndSel(hwnd);

    /* config command */
    if (wordinfo.szWord == "config" || wordinfo.szWord == "co")
    {
        DelBufLine(hbuf, ln);
        ConfigureSystem();
        return;
    }
    /* intsert new modified-record history */
    else if (wordinfo.szWord == "hi")
    {
        DelBufLine(hbuf, ln);
        InsertHistory(hbuf,ln,language);
        return;
    }
    else if (wordinfo.szWord == "retval" || wordinfo.szWord == "rv")
    {
        DelBufLine(hbuf, ln);
        szRetval = Ask("please input return value and comment,example: 0 sucess");
        InsBufLine(hbuf, ln, "  * @@retval @szRetval@");
        return;
    }
    else if (wordinfo.szWord == "ngroup" || wordinfo.szWord == "ngr")
    {
		InsertGroupDefination(hbuf,ln);
		return;
    }
    else if (wordinfo.szWord == "name")
    {
        DelBufLine(hbuf, ln);
		InsertNameDefination(hbuf, ln);
		return;
    }

    ExpandProcCN(szMyName,wordinfo,szLine,szLine1,nVer,ln,sel);
}

macro InsertGroupDefination(hbuf, ln)
{
	i = 0;

    InsBufLine(hbuf, ln + i,  "/** ");
    i = i + 1;

    mContent = Ask("请输入模块名称");
    noteContent = Ask("请输入模块描述信息");

    InsBufLine(hbuf, ln + i,  " *  @@defgroup @mContent@")
    i = i + 1
    InsBufLine(hbuf, ln + i,  " *  @@brief @noteContent@")
    i = i + 1
    InsBufLine(hbuf, ln + i,  " *  @@{")
    i = i + 1
    InsBufLine(hbuf, ln + i,  " */")
    i = i + 1
    InsBufLine(hbuf, ln + i,  "")
    i = i + 1
    InsBufLine(hbuf, ln + i,  "")
    i = i + 1
    InsBufLine(hbuf, ln + i,  "")
    i = i + 1
    InsBufLine(hbuf, ln + i, "/** @@}*/")
    i = i + 1
    InsBufLine(hbuf, ln + i, "")
}

macro InsertNameDefination(hbuf, ln)
{
	i = 0;

    InsBufLine(hbuf, ln + i,  "/** ");
    i = i + 1;

    mContent = Ask("请输入分组名称");
    noteContent = Ask("请输入模块描述信息");

    InsBufLine(hbuf, ln + i,  " *  @@name : @mContent@")
    i = i + 1
    InsBufLine(hbuf, ln + i,  " */")
}

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
        }
        // 判断是否为空行,根据空行来判断加什么样的注释
        kk =0
        while(kk < (lineLen-2))
        {
            if(szCurLine[kk] != " ")
            {
                break;
            }
            kk = kk + 1;
        }
        // 空行加的注释为"/** 注释 */"
        if(kk == (lineLen - 2))
        {
			szLeft = cat( szLeft, "*")
        }
        // 非空行,根据行尾符号判断增加什么样的注释
        else if(kk < (lineLen-2))
        {
            kk = wordinfo.ich - 1;

            while(kk >= 0)
            {
                if((szCurLine[kk] != " " )&&( szCurLine[kk] != "\t" ))
                {
                    // 行尾为";"时添加注释为"/**< 注释 */"
                    if(szCurLine[kk] == ";"  || szCurLine[kk] == ")")
                    {
			            szLeft = cat( szLeft, "*<")
                    }
                    // 行尾为非";"时添加注释为"/** 注释 */"
                    else
                    {
                        szLeft = cat( szLeft, "*")
                    }
                    break;
                }
                kk = kk - 1;
            }
        }

        szContent = Ask("请输入注释的内容");
        DelBufLine(hbuf, ln);
        CommentContent(hbuf,ln,szLeft,szContent,1);
        return;
    }
    // 另一种注释形式
    else 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;
        }
        // 判断是否为空行,根据空行来判断加什么样的注释
        kk = 0;
        while(kk < (lineLen-2))
        {
            if(szCurLine[kk] != " ")
            {
                break;
            }
            kk = kk + 1;
        }
        Flag = 0;
        // 空行加的注释为"///"
        if(kk == (lineLen-2))
        {
			szLeft = cat( szLeft, "/");
        }
        // 非空行,根据行尾符号判断增加什么样的注释
        else if(kk < (lineLen-2))
        {
            kk = wordinfo.ich - 1;

            while(kk >= 0)
            {
                if(szCurLine[kk] != " " && szCurLine[kk] != "\t")
                {
                    // 行首为#时只能增加"///< 注释"
                    if(szCurLine[00] == "#")
                    {
			            szLeft = cat( szLeft, "/<");
                    }
                    // 行尾为";"时添加注释为"/**< 注释 */"
                    else if(szCurLine[kk] == ")")

                    {
                        szLeft = cat( szLeft, "/<");
                    }
                    // 行尾为非";"时添加注释为"/** 注释 */"
                    else
                    {
                        szLeft = strmid(szLeft,0,lineLen-1);
                        szLeft = cat( szLeft, "**<");
                        Flag = 1;
                    }
                    break;
                }
                kk = kk - 1;
            }
        }

        szLeft = cat( szLeft, " " );
        szContent = Ask("请输入注释的内容");
        DelBufLine(hbuf, ln);
        lnnew = CommentContent(hbuf,ln,szLeft,szContent,1);

        if(lnnew > ln)
        {
            // 删除已添加注释及当前行
            while(lnnew >= ln)
            {
                DelBufLine(hbuf, lnnew);
                lnnew = lnnew - 1;
            }
            // 插入当前行
            szLeft = strmid(szLeft,0,lineLen-2);
            InsBufLine(hbuf, ln, "@szLeft@");
            // 计算当前行缩进
            k = 0;
            iLen = strlen(szLeft);

            while(k < iLen)
			{
			    if(szLeft[k] != " ")
			    {
			        break;
                }
                else
                {
                    k = k + 1;
                }
			}
			szLeft = strmid(szLeft,0,k);
            // 当前行上方插入注释
	        if(szBugId == " ")
	        {
	            szLeft = cat( szLeft, "/** " );
	        }
	        else
	        {
            	szLeft = cat(szLeft, "/** JIRA-");
            	szLeft = cat( szLeft, szBugId);
                szLeft = cat( szLeft, ": " );
            }

            CommentContent(hbuf,ln,szLeft,szContent,1);
        }
        // 以非";",非")"结束行的注释转换为/**< */
        else if(Flag == 1)
        {
            DelBufLine(hbuf, ln);
            CommentContent(hbuf,ln,szLeft,szContent,1);
        }
        else
        {
            DelBufLine(hbuf, ln);
            InsBufLine(hbuf, ln, "@szLeft@@szContent@");
        }
        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 == "if")
    {
        SetBufSelText(hbuf, "( # )");
        InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
        InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
        InsBufLine(hbuf, ln + 3, "@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("请输入结构名:"));
        szStructName = Ask("请输入结构名:");
        InsBufLine(hbuf, ln, "@szLine1@typedef struct");
        InsBufLine(hbuf, ln + 1, "@szLine1@{");
        InsBufLine(hbuf, ln + 2, "@szLine@      ");
        szStructName = cat(szStructName,"_t");
        InsBufLine(hbuf, ln + 3, "@szLine1@}@szStructName@;");
        SetBufIns (hbuf, ln + 2, strlen(szLine));
        return;
    }
    else if (szCmd == "union" || szCmd == "un" )
    {
        DelBufLine(hbuf, ln);
        szUnionName = Ask("请输入联合体名:");
      //szUnionName = toupper(Ask("请输入联合体名:"));
        InsBufLine(hbuf, ln, "@szLine1@typedef union");
        InsBufLine(hbuf, ln + 1, "@szLine1@{");
        InsBufLine(hbuf, ln + 2, "@szLine@      ");
        szUnionName = cat(szUnionName,"_u");
        InsBufLine(hbuf, ln + 3, "@szLine1@}@szUnionName@;");
        SetBufIns (hbuf, ln + 2, strlen(szLine));
        return;
    }
    else if (szCmd == "enum" || szCmd == "en")
    {
        DelBufLine(hbuf, ln);
      //szStructName = toupper(Ask("请输入枚举名:"));
        szStructName = Ask("请输入枚举名:");
        InsBufLine(hbuf, ln, "@szLine1@typedef enum");
        InsBufLine(hbuf, ln + 1, "@szLine1@{");
        InsBufLine(hbuf, ln + 2, "@szLine@       ");
        szStructName = cat(szStructName,"_e");
        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)
        {
            /*是已经存在的函数*/
            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
    {
        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 == "#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 InsertFileHeaderCN(hbuf, ln,szName,szContent)
{
    hnewbuf = newbuf("");

    if(hnewbuf == hNil)
    {
        stop;
    }

    // 获取文件名
    szn = GetFileNameNoExt(GetBufName (hbuf));

	// 取得系统时间
    SysTime = GetSysTime(1);
    sz=SysTime.Year;
    sz1=SysTime.month;
    sz3=SysTime.day;

    szTime = SysTime.Date;
    SzYear = SysTime.Year;
	// 去掉文件名后缀
    Len = strlen(sz);
    szGroup = "";

    i = 0;
    GetFunctionList(hbuf,hnewbuf);
    InsBufLine(hbuf, ln + i,  "/*******************************************************************************")
    i = i + 1
    InsBufLine(hbuf, ln + i,  "            Copyright (C), @SzYear@, GoerTek Technology Co., Ltd.")
    i = i + 1

    if(szContent == "")
    {
        InsBufLine(hbuf, ln + i,  "*******************************************************************************/")
        i = i + 1
        InsBufLine(hbuf, ln + i,  "/** ")
        i = i + 1
        InsBufLine(hbuf, ln + i,  "  *  @@defgroup	@szn@ module name")
        i = i + 1
        InsBufLine(hbuf, ln + i,  "  *  @@brief 	@szn@ ")
        i = i + 1
    }
    else
    {
        InsBufLine(hbuf, ln + i,  "********************************************************************************")
        i = i + 1
    }
    InsBufLine(hbuf, ln + i,  "  *  @@file 		@szn@")
    i = i + 1
    InsBufLine(hbuf, ln + i,  "  *  @@author 	@szName@")
    i = i + 1
    InsBufLine(hbuf, ln + i,  "  *  @@version 	1.0")
    i = i + 1
    InsBufLine(hbuf, ln + i,  "  *  @@date    	@sz@/@sz1@/@sz3@")
    i = i + 1
    if(szContent == "")
    {
        InsBufLine(hbuf, ln + i,  "  *  @@{")
        i = i + 1
        InsBufLine(hbuf, ln + i,  "  *//*")
        i = i + 1
    }
    InsBufLine(hbuf, ln + i, "  *  FileName      : @szn@")
    i = i + 1
    InsBufLine(hbuf, ln + i, "  *  Description   : @szContent@")
    DescriptionLn = i
    i = i + 1
    InsBufLine(hbuf, ln + i, "  *  FunctionList  :")
    i = i + 1

    //插入函数列表
    i = InsertFileList(hbuf,hnewbuf,ln + i) - ln

    closebuf(hnewbuf);

    InsBufLine(hbuf, ln + i, "  * History        :")
    i = i + 1
    InsBufLine(hbuf, ln + i, "  * 1.Date         : @sz@/@sz1@/@sz3@")
    i = i + 1
    InsBufLine(hbuf, ln + i, "  *    Author      : @szName@")
    i = i + 1
    InsBufLine(hbuf, ln + i, "  *    Modification: Created file")
    i = i + 1
    InsBufLine(hbuf, ln + i, "*******************************************************************************/")
    i = i + 1
    InsBufLine(hbuf, ln + i, "")
    i = i + 1
    if(szContent != "")
    {
        // 给头文件的宏判断留地方
        i = i + 3
    }
    InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
    i = i + 1
    InsBufLine(hbuf, ln + i, " * Include File                                 *")
    i = i + 1
    InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
    i = i + 1

    InsBufLine(hbuf, ln + i, "")
    i = i + 1
    InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
    i = i + 1
    InsBufLine(hbuf, ln + i, " * External Declaration                         *")
    i = i + 1
    InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
    i = i + 1
    InsBufLine(hbuf, ln + i, "")
    i = i + 1
    InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
    i = i + 1
    InsBufLine(hbuf, ln + i, " * Extern Prototype                             *")
    i = i + 1
    InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
    i = i + 1
    InsBufLine(hbuf, ln + i, "")
    i = i + 1
    InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
    i = i + 1
    InsBufLine(hbuf, ln + i, " * Internal Declaration                         *")
    i = i + 1
    InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
    i = i + 1

    InsBufLine(hbuf, ln + i, "")
    i = i + 1
    InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
    i = i + 1
    InsBufLine(hbuf, ln + i, " * Globle Variables                             *")
    i = i + 1
    InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
    i = i + 1
    InsBufLine(hbuf, ln + i, "")
    i = i + 1
    InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
    i = i + 1
    InsBufLine(hbuf, ln + i, " * Module Variables                             *")
    i = i + 1
    InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
    i = i + 1
    InsBufLine(hbuf, ln + i, "")
    i = i + 1
    InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
    i = i + 1
    InsBufLine(hbuf, ln + i, " * Const Defination                             *")
    i = i + 1
    InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
    i = i + 1
    InsBufLine(hbuf, ln + i, "")
    i = i + 1
    InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
    i = i + 1
    InsBufLine(hbuf, ln + i, " * Micro Defination                             *")
    i = i + 1
    InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
    i = i + 1
    InsBufLine(hbuf, ln + i, "")
    i = i + 1
    InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
    i = i + 1
    InsBufLine(hbuf, ln + i, " * Function Declaration                         *")
    i = i + 1
    InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
    i = i + 1
    InsBufLine(hbuf, ln + i, "")
    i = i + 1
    InsBufLine(hbuf, ln + i, "")
    i = i + 1

    if(strlen(szContent) != 0)
    {
        return
    }

    //如果没有输入功能描述的话提示输入
    szContent = Ask("请输入文件功能描述的内容")
    DelBufLine(hbuf,ln + DescriptionLn)

    //自动排列显示功能描述
    j = CommentContent(hbuf,ln+DescriptionLn,"  *  Description   : ",szContent,0)
    i = i + j - (ln + DescriptionLn)

    lnLa = GetBufLineCount (hbuf);
    i = 0
    InsBufLine(hbuf, lnLa + i, "")
    i = i + 1
    InsBufLine(hbuf, lnLa + i, "/** @@}*/")
    i = i + 1
    InsBufLine(hbuf, lnLa + i, "")
}

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]
                    // 判断是否为中文,中文编码所有数据都加0xA0
                    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);

    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;

    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  = "";
    }

    j = 0
    InsBufLine(hbuf, ln + j, "/******************************************************************************/")
    j = j + 1
    InsBufLine(hbuf, ln + j, "/** ")
    lnContent = j
    j = j + 1
    InsBufLine(hbuf, ln + j, "  * ")
    j = j + 1
    InsBufLine(hbuf, ln + j, "  * @@param[in] ")
    lnParamin = j
    j = j + 1
    InsBufLine(hbuf, ln + j, "  * ")
    j = j + 1
    InsBufLine(hbuf, ln + j, "  * @@return ")
    j = j + 1
    InsBufLine(hbuf, ln + j, "  * ")
    lnRet = j
    j = j + 1
    InsBufLine(hbuf, ln + j, "  * @@note ")
    j = j + 1
    InsBufLine(hbuf, ln + j, "  * ")
    j = j + 1
    InsBufLine(hbuf, ln + j, "  *//* ")
    j = j + 1

    if(newFunc != 1)
    {
        //对于已经存在的函数插入函数参数
        i = 0
        if(lnMax > 0)
        {
            DelBufLine(hbuf,ln+lnParamin)
            j = j - 1
        }
        while ( i < lnMax)
        {
            szTmp = GetBufLine(hTmpBuf, i)
            // 取最后一个单词
            len = strlen(szTmp)
            kk = len - 1
            while(kk > 0)
            {
                if(szTmp[kk] == " "  || szTmp[kk] == "\t" ||
                    szTmp[kk] == "*" || szTmp[kk] == "(")
                {
                    break
                }
                kk = kk - 1
            }
            if(kk == 0)
            {
                szTmp = strmid(szTmp,kk,len)
            }
            else
            {
                szTmp = strmid(szTmp,kk+1,len)
            }
            InsBufLine(hbuf, ln+lnParamin, "  * @@param[in] @szTmp@")
            lnParamin = lnParamin + 1
            j = j + 1
            lnRet = lnRet + 1
            iIns = 1
            i = i + 1
        }
        // 参数类型为void类型时,删除参数行
        if(lnMax == 1 && szTmp == "void")
        {
            DelBufLine(hbuf,ln + lnParamin);
            DelBufLine(hbuf,ln + lnParamin - 1);
            lnParamin = lnParamin - 2;
            lnRet = lnRet - 2;
            j = j - 2;
        }
        // 返回值类型为void时,删除返回值行
        if(szTemp == "void")
        {
            DelBufLine(hbuf,ln + lnRet);
            DelBufLine(hbuf,ln + lnRet - 1);
            lnRet = lnRet - 2;
            j = j - 2;
        }

        closebuf(hTmpBuf)
    }

    InsBufLine(hbuf, ln+j, "  * History        :");
    j = j + 1;

    SysTime = GetSysTime(1);
    cnsz1 = SysTime.Year;
    cnsz2 = SysTime.month;
    cnsz3 = SysTime.day;

    InsBufLine(hbuf, ln+j, "  * 1.Date         : @cnsz1@/@cnsz2@/@cnsz3@");
    j = j + 1;

    if( strlen(szMyName) > 0)
    {
       InsBufLine(hbuf, ln+j, "  *   Author       : @szMyName@")
    }
    else
    {
       InsBufLine(hbuf, ln+j, "  *   Author       : @szMyName@")
    }

    j = j + 1
    InsBufLine(hbuf, ln+j, "  *   Modification : Created function")
    j = j + 1
    InsBufLine(hbuf, ln+j, " ")
    j = j + 1
    InsBufLine(hbuf, ln+j, "*******************************************************************************/")
    j = j + 1
    if ((newFunc == 1) && (strlen(szFunc)>0))
    {
        InsBufLine(hbuf, ln+j, "uint32_t  @szFunc@( # )")
        lnFunc = j
        j = j + 1
        InsBufLine(hbuf, ln+j, "{");
        j = j + 1
        InsBufLine(hbuf, ln+j, "    #");
        j = j + 1
        InsBufLine(hbuf, ln+j, "}");
        j = j + 1
        SearchForward()
    }
    hwnd = GetCurrentWnd()
    if (hwnd == 0)
        stop
    sel = GetWndSel(hwnd)
    sel.ichFirst = 0
    sel.ichLim = sel.ichFirst
    sel.lnFirst = ln + 14
    sel.lnLast = ln + 14
    szContent = Ask("请输入函数功能描述的内容")
    setWndSel(hwnd,sel)

    //显示输入的功能描述内容
    DelBufLine(hbuf,ln + lnContent)
    newln = CommentContent(hbuf,ln + lnContent,"/** ",szContent,0)
    j = j + newln - (ln + lnContent)
    lnParamin = lnParamin + newln - (ln + lnContent)

    if ((newFunc == 1) && (strlen(szFunc)>0))
    {
        lnFunc = lnFunc + newln - (ln + lnContent)
        lnRet = lnRet + newln - (ln + lnContent)
        isFirstParam = 1

        //提示输入新函数的返回值
        szRet = Ask("请输入返回值类型")
        if(strlen(szRet) > 0)
        {
            PutBufLine(hbuf, ln+lnFunc, "@szRet@ @szFunc@(   )")
            SetbufIns(hbuf,ln+lnFunc,strlen(szRet)+strlen(szFunc) + 3
            if(szRet == "void")
            {
		        DelBufLine(hbuf,ln + lnRet+1)
		        DelBufLine(hbuf,ln + lnRet)
		        lnFunc = lnFunc - 2
            }
        }
        szFuncDef = ""
        sel.ichFirst = strlen(szFunc)+strlen(szRet) + 3
        sel.ichLim = sel.ichFirst + 1
        paramnul = 0
        //循环输入参数
        while (1)
        {
            szParam = ask("请输入函数参数类型及名称");
            szTmp = szParam;
            len = strlen(szTmp);
            kk = len - 1;

            while(kk > 0)
            {
                if(szTmp[kk] == " " || szTmp[kk] == "\t" || szTmp[kk] == "*")
                {
                    break;
                }

                kk = kk - 1;
            }
            if(kk == 0)
            {
                szTmp = strmid(szTmp,kk,len);
            }
            else
            {
                szTmp = strmid(szTmp,kk+1,len);
            }

                 szParam = TrimString(szParam);
                 szParam = cat(szFuncDef,szParam);
             sel.lnFirst = ln + lnFunc;
              sel.lnLast = ln + lnFunc;
            setWndSel(hwnd,sel);
            sel.ichFirst = sel.ichFirst + strlen(szParam);
              sel.ichLim = sel.ichFirst;
                  oldsel = sel;

            if(isFirstParam == 1)
            {
                DelBufLine(hbuf,ln + lnParamin);
                InsBufLine(hbuf, ln+lnParamin, "  * @@param[in] @szTmp@");
                isFirstParam  = 0;
	            // 参数类型为void时,删除注释参数行并跳出参数输入
		        if(szTmp == "void")
		        {
		            DelBufLine(hbuf,ln + lnParamin);
		            DelBufLine(hbuf,ln + lnParamin);
		            ln = ln - 2;
					paramnul = 1;
		        }
            }
            else
            {
                lnParamin = lnParamin + 1;
                InsBufLine(hbuf, ln+lnParamin, "  * @@param[in] @szTmp@");
                lnFunc = lnFunc + 1;
                lnRet = lnRet + 1;
                oldsel.lnFirst = ln + lnFunc;
                oldsel.lnLast = ln + lnFunc;
            }

            SetBufSelText(hbuf,szParam);
            szIns = "             ";
            szFuncDef = ", ";
            oldsel.lnFirst = ln + lnFunc + 2;
            oldsel.lnLast = ln + lnFunc + 2;
            oldsel.ichFirst = 4;
            oldsel.ichLim = 5;
            setWndSel(hwnd,oldsel);

            if(1 == paramnul)
            {
				break;
            }
        }
        return ln + lnFunc + 3;
    }
    else
    {
        return ln + j;
    }
}

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)
    {
        InsertHistoryContentEN(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  InsertHistoryContentEN(hbuf,ln,iHistoryCount)
{
     SysTime = GetSysTime(1);

      szTime = SysTime.Date;

         sz1 = SysTime.Year;
    	 sz2 = SysTime.month;
    	 sz3 = SysTime.day;

    szMyName = getreg(MYNAME);

    InsBufLine(hbuf, ln, "");
    InsBufLine(hbuf, ln + 1, "  * @iHistoryCount@.Date         : @sz1@/@sz2@/@sz3@");
    InsBufLine(hbuf, ln + 2, "  *   Author       : @szMyName@");

    szContent = Ask("Please input modification");
	CommentContent(hbuf, ln + 3, "  *   Modification : ",szContent,0);
	CommentContent(hbuf, ln + 4, ""," ",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
    }
    HeadIfdefStr(szPreH)
    szContent = GetFileName(GetBufName (hbuf))

    szContent = cat(szContent,"'s Head File ")

    InsertFileHeaderCN(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
        }
        funcName = strmid(szLine,7,13);
        if("static" != funcName)
        {
            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(language == 0)
    {
        if(strlen( szName ) == 0)
        {
            szMyName = Ask("请输入你的名字:")
            setreg(MYNAME, szMyName)
        }
        isymMax = GetBufSymCount(hbuf)
        isym = 0
        ln = 0
        //获得当前没有后缀的文件名
        sz = ask("请输入头文件名")
    }
    else
    {
        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)
    HeadIfdefStr(szPreH)
    szContent = GetFileName(GetBufName (hbuf))

    szContent = cat(szContent," 的头文件")

    InsertFileHeaderCN(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)

    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()
{
    SetReg ("LANGUAGE", 1);
    szName = ASK("Please input your english name");
   	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 block
for 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);
}

// Wrap ifdef <sz> .. endif around the current selection
macro 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)
    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@#ifndef @sz@")
    SetBufIns(hbuf,lnFirst + 1,strlen(szLeft))
}


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)
    szLeft = strmid(szLine,0,nLeft);

    hbuf = GetCurrentBuf()
    if(lnLast + 1 < lnMax)
    {
        InsBufLine(hbuf, lnLast+1, "@szLeft@#endif /* #if @sz@ */")
    }
    else if(lnLast + 1 == lnMax)
    {
        AppendBufLine(hbuf, "@szLeft@#endif /* #if @sz@ */")
    }
    else
    {
        AppendBufLine(hbuf, "")
        AppendBufLine(hbuf, "@szLeft@#endif /* #if @sz@ */")
    }
    InsBufLine(hbuf, lnFirst, "@szLeft@#if  @sz@")
    SetBufIns(hbuf,lnFirst + 1,strlen(szLeft))
}

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)
   /*         SysTime.Date=cat(SysTime.Year,"年")
        SysTime.Date=cat(SysTime.Date,SysTime.Month)
        SysTime.Date=cat(SysTime.Date,"月")
        SysTime.Date=cat(SysTime.Date,SysTime.Day)
        SysTime.Date=cat(SysTime.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)
            {
                FuncHeadCommentCN(hbuf, ln, symbol, szMyName,0)
                return
            }
        }
    }

    szFuncName = Ask("请输入函数名称:")
    FuncHeadCommentCN(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);

	InsertFileHeaderCN( hbuf,ln, szMyName,"" );
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值