zoukankan      html  css  js  c++  java
  • SourceInsight宏插件2(非常好用,强力推荐)

    Quicker宏在SI中的使用方法(下载地址:链接:https://pan.baidu.com/s/1VrDxlPhft7RPUCCOKxsGIg  提取码:2d4u)

    Quicker宏的添加到SI中配置方法:

    1. 运行SI,打开Base工程,如果没有该工程,则生成它,将Quicker.em加入到工程中

    2. 安装触发热键和菜单,打开SI的Options的Key Assignments菜单,在Command窗口中选择Macro: AutoExpand然后对其赋一个热键,例如Ctrl Enter

    3. 对于宏FormatLine,UpdateFunctionList,InsertTraceInfo,InsertFuncName,ReplaceBufTab,ReplaceTabInProj,ComentCPPtoC等功能,可以根据情况定义为菜单或热键

    4. 选择Options的Save Configuration先保存自己的配置,以便回退,回退时选择Options的Load Configuration来装载该配置.

    5. Quicker有两种命令,一种是扩展命令,一种是普通命令。

    扩展命令:在代码文件中输入命令名,然后按前面AutoExpand宏所定义的热键(Ctrl Enter)来执行该命令通命令:直接根据定义的热键或菜单来执行,目前一般的扩展命令都对应有相应的普通命令

    Quicker宏在SI中的使用方法: 

    1 标准C语言扩展

    1.1 /* 自动生成/* */ 该命令自动生成C语言的注释,它能自动换行对齐,在把文档中一长串注释拷贝过来时特别管用,不用自己去对齐了。还能自动识别中文和英文单词,对于中文不会把一个字分开,对于英文单词分开时会自动添加连字符,下面是一个注释的例子abcdefghijk = abcd + cdefg + hijk /*该命令自动生成C语言的注释,它能自动换行对齐,在把文档中一长串注释拷贝过来时特别管用,不用自己去对齐了。*/

    1.2 { 自动生成 }

    1.3 while (wh) 自动生成While语句

    while ( # )
    {
        #
    }

    1.4 if 自动生成if语句

    if 生成if结构的语句
    ife 对应生成if else结构的语句
    ifs 对应生成if elseif else结构的f语句
    if ( # )
    {
        #
    }

    1.5 for 自动生成for语句,支持块命令插入

    该命令自动生成如下格式

    for ( #; #; # )
    {
        #
    }

    1.5.1 fo 自动生成for语句与前一条命令相比它直接会定义循环变量

    UINT32 ulI = 0;
    
    for ( ulI = 0; ulI < #; ulI++ )
    {
        #
    }

    1.6 do 自动生成 do while语句

    该命令自动生成如下格式

    do
    {
        #
    } while ( # );

    1.7 #ifd 自动生成 #ifdef 命令

    该命令生成如下格式 

    #ifdef UMSC
    
    #endif /* UMSC */

    1.8 #ifn 自动生成 #ifndef 命令

    该命令生成如下格式

    #ifndef UMSC
    
    #endif /* UMSC */

    1.9 #if 自动生成 #if 命令

    该命令生成如下格式

    #if ( UMSC == 1)
    #endif /*if ( UMSC == 1) */

    1.10 cpp 自动生成适用于c++的c原型说明定义

    该命令生成如下格式

    #ifdef __cplusplus
    #if __cplusplus
    
    extern "C"{
    
    #endif
    
    #endif /* __cplusplus */
    
    
    #ifdef __cplusplus
    
    #if __cplusplus
    }
    #endif
    #endif /* __cplusplus */

    1.11 switch (sw) 自动生成switch语句

    该命令将提示输入case的个数,生成如下格式

    switch ( # )
    {
        case #:
                #
                break;
        default:
                #
    }

    1.12 case (ca)自动生成case语句

    支持块命令输入

    该命令生成如下格式,用它可以避免遗漏break

    case #:
         #
         break; 

    1.13 struct (st) 自动生成结构类型

    该命令自动生成如下结构定义,它提示输入结构名,会自动转换成大写形式,并且自动在其后添加_STRU作为结构类型

    typedef struct HELLO_TEST
    {
        #
    }HELLO_TEST_STRU;

    1.14 enum (en) 自动生成枚举类型

    该命令自动生成如下结构定义,它提示输入结构名,会自动转换成大写形式,并且自动在其后添加_STRU作为结构类型

    typedef enum HELLO_TEST
    {
        #
    }HELLO_TEST_ENUM;

     

     

    2 标准说明生成

    2.1  config (co) 配置用户名和标题的说明语种

    用户名就是前面自动生成的作者,修改者的名字,语种。

    2.2  file (fi) 生成标准的文件头

    自动生成如下格式,它能自动取得文件名,作者名,时间,以及函数列表。

    2.3 func (fu) 生成标准的函数头说明

    其自动生成如下函数头,该函数必须在该函数的前一行执行,它能自动取得函数名,能够自动取得函数的输入、输出参数,并且排列好,同时生成日期和作者。能够 提示输入功能描述,输入的内容能够自动换行对齐,这样既可以避免遗漏说明,而且一般在详细设计中对每个函数的主要功能都有详细的描述,只要把这些描述 拷贝过来即可,它能自动排列好, 非常方便。(因为SI的宏功能有限,没能自动加入调用函数和被调函数的功能),如果不是在已存在的函数前执行则提示输入函数名,提示输入函数描述,提示输入返回值类型,提示输入函数入口参数,输完后按Esc退出。

    2.4  hi  增加修改历史列表

    自动在该行增加修改历史列表,用于文件头和函数头说明中的历史记录更新,其添加形式如下。

    2.5  hd  自动生成函数头文件

    该命令能够自动生成但前C文件的头文件定义,包括常用的宏定义,还有全部的函数原型定义。 

    2.6  Hdn  生成新的有文件

    该命令能够自动生成指定的的头文件定义,包括常用的宏定义,提示输入函数原型的类型。

     

    3 代码修改注释

    3.1  pn  添加问题单号

    在进行问题单修改时都要求在修改的地方注明问题单号和修改人以及修改时间,大部分一个问题单的修改都会涉及到几个地方,本功能提供自动取问题单号的功能,下面的几个命令所生成的问题单号就是有它提供,如果输入为#则不显示问题单号

    3.2  ap 添加问题单修改说明

    该命令提示输入问题单号和修改原因,生成如下格式的说明 

    3.3 ab 添加开始说明

    它能自动生成如下说明:

    1.有问题单号的情况,其中问题单号是由ap命令加入的。

    /*BEGIN: Added by XXXX, 2002/5/13   问题单号:D02556*/

    2.没有问题单号的情况,

    /*BEGIN: Added by XXXX, 2002/5/13*/ 

    3.4  ae  添加结束命令

    该命令是as的对应命令,表示结束添加

    支持块命令操作 

    3.5  abg 插入添加开始和结束说明

    该命令是前两个命令的组合

    支持块命令操作

    3.6  db 删除开始命令

    它能自动生成如下说明:

    1.有问题单号的情况,其中问题单号是由ap命令加入的。

    /*BEGIN: Deleted by XXXX, 2002/5/13   问题单号:D02556*/

    2.没有问题单号的情况,

    /*BEGIN: Deleted by XXXX, 2002/5/13 */

    3.7  de  删除结束命令

    该命令是ds的对应命令,表示删除结束

    3.8  dbg 插入删除开始和结束说明

    该命令是前两个命令的组合

    支持块命令操作

    3.9  mb 修改开始命令

    它能自动生成如下说明:

    1.有问题单号的情况,其中问题单号是由ap命令加入的。

    /*BEGIN: Modified by XXXX, 2002/5/13   问题单号:D02556*/

    2.没有问题单号的情况,

    /*BEGIN: Modified by XXXX, 2002/5/13 */

    3.10  me  修改结束命令

    该命令是ms的对应命令,表示删除结束

    3.11  mbg 插入修改开始和结束说明

    该命令是前两个命令的组合

    支持块命令操作

     

    Quicker.em源码(下载地址 链接:https://pan.baidu.com/s/1tUn5vTbnOtY-tlT9lilL5w 提取码:nlwg)

    /*****************************************************************************
     函 数 名  : AutoExpand
     功能描述  : 扩展命令入口函数
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 修改
    
    *****************************************************************************/
    macro AutoExpand()   //Alt+~
    {
        //配置信息
        // get window, sel, and buffer handles
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        sel = GetWndSel(hwnd)
        if(sel.lnFirst != sel.lnLast) 
        {
            /*块命令处理*/
            BlockCommandProc()
        }
        if (sel.ichFirst == 0)
            stop
        hbuf = GetWndBuf(hwnd)
        language = getreg(LANGUAGE)
        if(language != 1)
        {
            language = 0
        }
        nVer = 0
        nVer = GetVersion()
        /*取得用户名*/
        szMyName = getreg(MYNAME)
        if(strlen( szMyName ) == 0)
        {
            szMyName = Ask("Enter your name:")
            setreg(MYNAME, szMyName)
        }
        // get line the selection (insertion point) is on
        szLine = GetBufLine(hbuf, sel.lnFirst);
        // parse word just to the left of the insertion point
        wordinfo = GetWordLeftOfIch(sel.ichFirst, szLine)
        ln = sel.lnFirst;
        chTab = CharFromAscii(9)
            
        // prepare a new indented blank line to be inserted.
        // keep white space on left and add a tab to indent.
        // this preserves the indentation level.
        chSpace = CharFromAscii(32);
        ich = 0
        while (szLine[ich] == chSpace || szLine[ich] == chTab)
        {
            ich = ich + 1
        }
        szLine1 = strmid(szLine,0,ich)
        szLine = strmid(szLine, 0, ich) # "    "
        
        sel.lnFirst = sel.lnLast
        sel.ichFirst = wordinfo.ich
        sel.ichLim = wordinfo.ich
    
        /*自动完成简化命令的匹配显示*/
        wordinfo.szWord = RestoreCommand(hbuf,wordinfo.szWord)
        sel = GetWndSel(hwnd)
        if (wordinfo.szWord == "pn") /*问题单号的处理*/
        {
            DelBufLine(hbuf, ln)
            AddPromblemNo()
            return
        }
        /*配置命令执行*/
        else if (wordinfo.szWord == "config" || wordinfo.szWord == "co")
        {
            DelBufLine(hbuf, ln)
            ConfigureSystem()
            return
        }
        /*修改历史记录更新*/
        else if (wordinfo.szWord == "hi")
        {
            InsertHistory(hbuf,ln+1,language)
            DelBufLine(hbuf, ln)
            return
        }
        else if (wordinfo.szWord == "abg")
        {
            sel.ichFirst = sel.ichFirst - 3
            SetWndSel(hwnd,sel)
            InsertReviseAdd()
            PutBufLine(hbuf, ln+1 ,szLine1)
            SetBufIns(hwnd,ln+1,sel.ichFirst)
            return
        }
        else if (wordinfo.szWord == "dbg")
        {
            sel.ichFirst = sel.ichFirst - 3
            SetWndSel(hwnd,sel)
            InsertReviseDel()
            PutBufLine(hbuf, ln+1 ,szLine1)
            SetBufIns(hwnd,ln+1,sel.ichFirst)
            return
        }
        else if (wordinfo.szWord == "mbg")
        {
            sel.ichFirst = sel.ichFirst - 3
            SetWndSel(hwnd,sel)
            InsertReviseMod()
            PutBufLine(hbuf, ln+1 ,szLine1)
            SetBufIns(hwnd,ln+1,sel.ichFirst)
            return
        }
        if(language == 1)
        {
            ExpandProcEN(szMyName,wordinfo,szLine,szLine1,nVer,ln,sel)
        }
        else
        {
            ExpandProcCN(szMyName,wordinfo,szLine,szLine1,nVer,ln,sel)
        }
    }
    
    /*****************************************************************************
     函 数 名  : ExpandProcEN
     功能描述  : 英文说明的扩展命令处理
     输入参数  : szMyName  用户名
                 wordinfo  
                 szLine    
                 szLine1   
                 nVer      
                 ln        
                 sel       
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
      2.日    期   : 2011年2月16日
        作    者   : 彭军
        修改内容   : 修改问题单号为mantis号,修改时间格式为xxxxxxxx(年、月、日),
                   中间没有分隔符,增加单行注释,自动扩展码为"an"
    
      3.日    期   : 2011年2月22日
        作    者   : 彭军
        修改内容   : 修改单行注释头为add by、delete by、modify by,自动扩展码分别为"as"、"ds"、"ms"
                     修改单行注释为光标所在行的最后,不删除光标所在行
                     删除原自动扩展码为"an"的单行注释
    
    *****************************************************************************/
    macro ExpandProcEN(szMyName,wordinfo,szLine,szLine1,nVer,ln,sel)
    {
      
        szCmd = wordinfo.szWord
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        hbuf = GetWndBuf(hwnd)
        /*英文注释*/
        if (szCmd == "/*")
        {   
            if(wordinfo.ichLim > 70)
            {
                Msg("The right margine is small, Please use a new line")
                stop 
            }
            szCurLine = GetBufLine(hbuf, sel.lnFirst);
            szLeft = strmid(szCurLine,0,wordinfo.ichLim)
            lineLen = strlen(szCurLine)
            kk = 0
            while(wordinfo.ichLim + kk < lineLen)
            {
                if((szCurLine[wordinfo.ichLim + kk] != " ")||(szCurLine[wordinfo.ichLim + kk] != "	")
                {
                    msg("you must insert /* at the end of a line");
                    return
                }
                kk = kk + 1
            }
            szContent = Ask("Please input comment")
            DelBufLine(hbuf, ln)
            szLeft = cat( szLeft, " ")
            CommentContent(hbuf,ln,szLeft,szContent,1)            
            return
        }
        else if(szCmd == "{")
        {
            InsBufLine(hbuf, ln + 1, "@szLine@")
            InsBufLine(hbuf, ln + 2, "@szLine1@" # "}");
            SetBufIns (hbuf, ln + 1, strlen(szLine))
            return
        }
        else if (szCmd == "while" )
        {
            SetBufSelText(hbuf, " ( # )")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
        }
        else if( szCmd == "else" )
        {
            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") //#ifndef
        {
            DelBufLine(hbuf, ln)
            InsIfndef()
            return
        }
        else if (szCmd == "#if")
        {
            DelBufLine(hbuf, ln)
            InsertPredefIf()
            return
        }
        else if (szCmd == "cpp")
        {
            DelBufLine(hbuf, ln)
            InsertCPP(hbuf,ln)
            return
        }    
        else if (szCmd == "if")
        {
            SetBufSelText(hbuf, " ( # )")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
    /*            InsBufLine(hbuf, ln + 4, "@szLine1@" # "else");
            InsBufLine(hbuf, ln + 5, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 6, "@szLine@" # ";");
            InsBufLine(hbuf, ln + 7, "@szLine1@" # "}");*/
        }
        else if (szCmd == "ef")
        {
            PutBufLine(hbuf, ln, szLine1 # "else if ( # )")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
        }
        else if (szCmd == "ife")
        {
            PutBufLine(hbuf, ln, szLine1 # "if ( # )")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
            InsBufLine(hbuf, ln + 4, "@szLine1@" # "else");
            InsBufLine(hbuf, ln + 5, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 6, "@szLine@" # ";");
            InsBufLine(hbuf, ln + 7, "@szLine1@" # "}");
        }
        else if (szCmd == "ifs")
        {
            PutBufLine(hbuf, ln, szLine1 # "if ( # )")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
            InsBufLine(hbuf, ln + 4, "@szLine1@" # "else if ( # )");
            InsBufLine(hbuf, ln + 5, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 6, "@szLine@" # ";");
            InsBufLine(hbuf, ln + 7, "@szLine1@" # "}");
            InsBufLine(hbuf, ln + 8, "@szLine1@" # "else");
            InsBufLine(hbuf, ln + 9, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 10, "@szLine@" # ";");
            InsBufLine(hbuf, ln + 11, "@szLine1@" # "}");
        }
        else if (szCmd == "for")
        {
            SetBufSelText(hbuf, " (#; #; #)")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{")
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#")
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}")
            SetWndSel(hwnd, sel)
            SearchForward()
            szVar = ask("Please input loop variable")
            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, "    VOS_UINT32 ulI = 0;");        
             }
        }
        else if (szCmd == "switch" )
        {
            nSwitch = ask("Please input the number of 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" )
        {
            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("Please input struct name"))
            InsBufLine(hbuf, ln, "@szLine1@typedef struct @szStructName@");
            InsBufLine(hbuf, ln + 1, "@szLine1@{");
            InsBufLine(hbuf, ln + 2, "@szLine@             ");
            szStructName = cat(szStructName,"_STRU")
            InsBufLine(hbuf, ln + 3, "@szLine1@}@szStructName@;");
            SetBufIns (hbuf, ln + 2, strlen(szLine))
            return
        }
        else if (szCmd == "enum" || szCmd == "en")
        {
            DelBufLine(hbuf, ln)
            szStructName = toupper(Ask("Please input enum name"))
            InsBufLine(hbuf, ln, "@szLine1@typedef enum @szStructName@");
            InsBufLine(hbuf, ln + 1, "@szLine1@{");
            InsBufLine(hbuf, ln + 2, "@szLine@             ");
            szStructName = cat(szStructName,"_ENUM")
            InsBufLine(hbuf, ln + 3, "@szLine1@}@szStructName@;");
            SetBufIns (hbuf, ln + 2, strlen(szLine))
            return
        }
        else if (szCmd == "file" || szCmd == "fi")
        {
            DelBufLine(hbuf, ln)
            InsertFileHeaderEN( hbuf,0, szMyName,".C file function description" )
            return
        }
        else if (szCmd == "func" || szCmd == "fu")
        {
            DelBufLine(hbuf,ln)
            lnMax = GetBufLineCount(hbuf)
            if(ln != lnMax)
            {
                szNextLine = GetBufLine(hbuf,ln)
                if( (strstr(szNextLine,"(") != 0xffffffff) || (nVer != 2))
                {
                    symbol = GetCurSymbol()
                    if(strlen(symbol) != 0)
                    {  
                        FuncHeadCommentEN(hbuf, ln, symbol, szMyName,0)
                        return
                    }
                }
            }
            szFuncName = Ask("Please input function name")
            FuncHeadCommentEN(hbuf, ln, szFuncName, szMyName, 1)
        }
        else if (szCmd == "tab")
        {
            DelBufLine(hbuf, ln)
            ReplaceBufTab()
            return
        }
        else if (szCmd == "ap")
        {   
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
            
            DelBufLine(hbuf, ln)
            szQuestion = AddPromblemNo()
            InsBufLine(hbuf, ln, "@szLine1@/* Promblem Number: @szQuestion@     Author:@szMyName@,   Date:@sz@-@szMonth@-@szDay@ ");
            szContent = Ask("Description")
            szLeft = cat(szLine1,"   Description    : ");
            if(strlen(szLeft) > 70)
            {
                Msg("The right margine is small, Please use a new line")
                stop 
            }
            ln = CommentContent(hbuf,ln + 1,szLeft,szContent,1)
            return
        }
        else if (szCmd == "hd")
        {
            DelBufLine(hbuf, ln)
            CreateFunctionDef(hbuf,szMyName,1)
            return
        }
        else if (szCmd == "hdn")
        {
            DelBufLine(hbuf, ln)
    
            /*生成不要文件名的新头文件*/
            CreateNewHeaderFile()
            return
        }
        else if (szCmd == "ab")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
            
            DelBufLine(hbuf, ln)
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion)>0)
            {
                InsBufLine(hbuf, ln, "@szLine1@/* add begin by @szMyName@, @sz@-@szMonth@-@szDay@*/");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* add begin by @szMyName@, @sz@-@szMonth@-@szDay@*/");        
            }
            return
        }
        else if (szCmd == "ae")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln)
            InsBufLine(hbuf, ln, "@szLine1@/* add end by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            return
        }
        else if (szCmd == "db")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln)
            szQuestion = GetReg ("PNO")
                if(strlen(szQuestion) > 0)
            {
                InsBufLine(hbuf, ln, "@szLine1@/* delete begin by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* delete begin by @szMyName@, @sz@-@szMonth@-@szDay@  */");
            }
            
            return
        }
        else if (szCmd == "de")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln + 0)
            InsBufLine(hbuf, ln, "@szLine1@/* delete end by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            return
        }
        else if (szCmd == "mb")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln)
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion) > 0)
            {
                InsBufLine(hbuf, ln, "@szLine1@/* modify begin by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* modify begin by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            }
            return
        }
        else if (szCmd == "me")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln)
            InsBufLine(hbuf, ln, "@szLine1@/* modify end by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            return
        }
        else if (szCmd == "as")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
             szLine1 = strmid (GetBufLine(hbuf, ln), 0, GetBufLineLength (hbuf, ln)-2)
            DelBufLine(hbuf, ln)
            
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion)>0)
            { 
                InsBufLine(hbuf, ln, "@szLine1@/* add by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* add by @szMyName@, @sz@-@szMonth@-@szDay@ */");        
            }
            return
        }
        else if (szCmd == "cs")/*添加一个命令cs 用于生成注释comment by xxx . 该命令被王启国添加2014-5-4*/
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
             szLine1 = strmid (GetBufLine(hbuf, ln), 0, GetBufLineLength (hbuf, ln)-2)
            DelBufLine(hbuf, ln)
            
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion)>0)
            { 
                InsBufLine(hbuf, ln, "@szLine1@/* comment by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* comment by @szMyName@, @sz@-@szMonth@-@szDay@ */");        
            }
            return
        }
        else if (szCmd == "ds")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
             szLine1 = strmid (GetBufLine(hbuf, ln), 0, GetBufLineLength (hbuf, ln)-2)
            DelBufLine(hbuf, ln)
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion)>0)
            {
                InsBufLine(hbuf, ln, "@szLine1@/* delete by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* delete by @szMyName@, @sz@-@szMonth@-@szDay@ */");        
            }
            return
        }
        else if (szCmd == "ms")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
               
             szLine1 = strmid (GetBufLine(hbuf, ln), 0, GetBufLineLength (hbuf, ln)-2)
            DelBufLine(hbuf, ln)
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion)>0)
            {
                InsBufLine(hbuf, ln, "@szLine1@/* modify by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* modify by @szMyName@, @sz@-@szMonth@-@szDay@ */");        
            }
            return
        }
        else
        {
            SearchForward()
    //            ExpandBraceLarge()
            stop
        }
        SetWndSel(hwnd, sel)
        SearchForward()
    }
    
    
    /*****************************************************************************
     函 数 名  : ExpandProcCN
     功能描述  : 中文说明的扩展命令
     输入参数  : szMyName  
                 wordinfo  
                 szLine    
                 szLine1   
                 nVer      
                 ln        
                 sel       
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
      2.日    期   : 2011年2月16日
        作    者   : 彭军
        修改内容   : 修改问题单号为mantis号,修改时间格式为xxxxxxxx(年、月、日),
                   中间没有分隔符,增加单行注释,自动扩展码为"an"
    
      3.日    期   : 2011年2月22日
        作    者   : 彭军
        修改内容   : 修改单行注释头为add by、delete by、modify by,自动扩展码分别为"as"、"ds"、"ms"
                     修改单行注释为光标所在行的最后,不删除光标所在行
                     删除原自动扩展码为"an"的单行注释
        
      4.日    期   : 2011年3月18日
        作    者   : 彭军
        修改内容   : 修改文件的注释不输入描述(不输入描述则文件头注释函数会自动提示用户输入)
    
    *****************************************************************************/
    macro ExpandProcCN(szMyName,wordinfo,szLine,szLine1,nVer,ln,sel)
    {
        szCmd = wordinfo.szWord
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        hbuf = GetWndBuf(hwnd)
    
        //中文注释
        if (szCmd == "/*")
        {   
            if(wordinfo.ichLim > 70)
            {
                Msg("右边空间太小,请用新的行")
                stop 
            }        szCurLine = GetBufLine(hbuf, sel.lnFirst);
            szLeft = strmid(szCurLine,0,wordinfo.ichLim)
            lineLen = strlen(szCurLine)
            kk = 0
            /*注释只能在行尾,避免注释掉有用代码*/
            while(wordinfo.ichLim + kk < lineLen)
            {
                if(szCurLine[wordinfo.ichLim + kk] != " ")
                {
                    msg("只能在行尾插入");
                    return
                }
                kk = kk + 1
            }
            szContent = Ask("请输入注释的内容")
            DelBufLine(hbuf, ln)
            szLeft = cat( szLeft, " ")    //在/*后加一个空格,最后出来的格式是/* 要注释的内容 */
            CommentContent(hbuf,ln,szLeft,szContent,1)            
            return
        }
        else if(szCmd == "{")
        {
            InsBufLine(hbuf, ln + 1, "@szLine@")
            InsBufLine(hbuf, ln + 2, "@szLine1@" # "}");
            SetBufIns (hbuf, ln + 1, strlen(szLine))
            return
        }
        else if (szCmd == "while" || szCmd == "wh")
        {
            SetBufSelText(hbuf, " ( # )")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
        }
        else if( szCmd == "else" || szCmd == "el")
        {
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 2, "@szLine@");
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
            SetBufIns (hbuf, ln + 2, strlen(szLine))
            return
        }
        else if (szCmd == "#ifd" || szCmd == "#ifdef") //#ifdef
        {
            DelBufLine(hbuf, ln)
            InsIfdef()
            return
        }
        else if (szCmd == "#ifn" || szCmd == "#ifndef") //#ifndef
        {
            DelBufLine(hbuf, ln)
            InsIfndef()
            return
        }
        else if (szCmd == "#if")
        {
            DelBufLine(hbuf, ln)
            InsertPredefIf()
            return
        }
        else if (szCmd == "cpp")
        {
            DelBufLine(hbuf, ln)
            InsertCPP(hbuf,ln)
            return
        }    
        else if (szCmd == "if")
        {
            SetBufSelText(hbuf, " ( # )")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
    /*            InsBufLine(hbuf, ln + 4, "@szLine1@" # "else");
            InsBufLine(hbuf, ln + 5, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 6, "@szLine@" # ";");
            InsBufLine(hbuf, ln + 7, "@szLine1@" # "}");*/
        }
        else if (szCmd == "ef")
        {
            PutBufLine(hbuf, ln, szLine1 # "else if ( # )")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
        }
        else if (szCmd == "ife")
        {
            PutBufLine(hbuf, ln, szLine1 # "if ( # )")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
            InsBufLine(hbuf, ln + 4, "@szLine1@" # "else");
            InsBufLine(hbuf, ln + 5, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 6, "@szLine@" # ";");
            InsBufLine(hbuf, ln + 7, "@szLine1@" # "}");
        }
        else if (szCmd == "ifs")
        {
            PutBufLine(hbuf, ln, szLine1 # "if ( # )")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
            InsBufLine(hbuf, ln + 4, "@szLine1@" # "else if ( # )");
            InsBufLine(hbuf, ln + 5, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 6, "@szLine@" # ";");
            InsBufLine(hbuf, ln + 7, "@szLine1@" # "}");
            InsBufLine(hbuf, ln + 8, "@szLine1@" # "else");
            InsBufLine(hbuf, ln + 9, "@szLine1@" # "{");
            InsBufLine(hbuf, ln + 10, "@szLine@" # ";");
            InsBufLine(hbuf, ln + 11, "@szLine1@" # "}");
        }
        else if (szCmd == "for")
        {
            SetBufSelText(hbuf, " (#; #; #)")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{")
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#")
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}")
            SetWndSel(hwnd, sel)
            SearchForward()
            szVar = ask("请输入循环变量")
            newsel = sel
            newsel.ichLim = GetBufLineLength (hbuf, ln)
            SetWndSel(hwnd, newsel)
            SetBufSelText(hbuf, " (@szVar@ = #; @szVar@ #; @szVar@++)")
        }
        else if (szCmd == "fo")
        {
            SetBufSelText(hbuf, "r (ulI = 0; ulI < #; ulI++)")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{")
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#")
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "}")
            symname =GetCurSymbol ()
            symbol = GetSymbolLocation(symname)
            if(strlen(symbol) > 0)
            {
                nIdx = symbol.lnName + 1;
                while( 1 )
                {
                    szCurLine = GetBufLine(hbuf, nIdx);
                    nRet = strstr(szCurLine,"{")
                    if( nRet != 0xffffffff )
                    {
                        break;
                    }
                    nIdx = nIdx + 1
                    if(nIdx > symbol.lnLim)
                    {
                        break
                    }
                }
                InsBufLine(hbuf, nIdx + 1, "    VOS_UINT32 ulI = 0;");        
            }
        }
        else if (szCmd == "switch" || szCmd == "sw")
        {
            nSwitch = ask("请输入case的个数")
            SetBufSelText(hbuf, " ( # )")
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{")
            InsertMultiCaseProc(hbuf,szLine1,nSwitch)
        }
        else if (szCmd == "do")
        {
            InsBufLine(hbuf, ln + 1, "@szLine1@" # "{")
            InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
            InsBufLine(hbuf, ln + 3, "@szLine1@" # "} while ( # );")
        }
        else if (szCmd == "case" || szCmd == "ca" )
        {
            SetBufSelText(hbuf, " # :")
            InsBufLine(hbuf, ln + 1, "@szLine@" # "#")
            InsBufLine(hbuf, ln + 2, "@szLine@" # "break;")
        }
        else if (szCmd == "struct" || szCmd == "st" )
        {
            DelBufLine(hbuf, ln)
            szStructName = toupper(Ask("请输入结构名:"))
            InsBufLine(hbuf, ln, "@szLine1@typedef struct @szStructName@");
            InsBufLine(hbuf, ln + 1, "@szLine1@{");
            InsBufLine(hbuf, ln + 2, "@szLine@      ");
            szStructName = cat(szStructName,"_STRU")
            InsBufLine(hbuf, ln + 3, "@szLine1@}@szStructName@;");
            SetBufIns (hbuf, ln + 2, strlen(szLine))
            return
        }
        else if (szCmd == "enum" || szCmd == "en")
        {
            DelBufLine(hbuf, ln)
            //提示输入枚举名并转换为大写
            szStructName = toupper(Ask("请输入枚举名:"))
            InsBufLine(hbuf, ln, "@szLine1@typedef enum @szStructName@");
            InsBufLine(hbuf, ln + 1, "@szLine1@{");
            InsBufLine(hbuf, ln + 2, "@szLine@       ");
            szStructName = cat(szStructName,"_ENUM")
            InsBufLine(hbuf, ln + 3, "@szLine1@}@szStructName@;");
            SetBufIns (hbuf, ln + 2, strlen(szLine))
            return
        }
        else if (szCmd == "file" || szCmd == "fi" )
        {
            DelBufLine(hbuf, ln)
            /*生成文件头说明*/
            InsertFileHeaderCN( hbuf,0, szMyName,"" )
            return
        }
        else if (szCmd == "hd")
        {
            DelBufLine(hbuf, ln)
            /*生成C语言的头文件*/
            CreateFunctionDef(hbuf,szMyName,0)
            return
        }
        else if (szCmd == "hdn")
        {
            DelBufLine(hbuf, ln)
            /*生成不要文件名的新头文件*/
            CreateNewHeaderFile()
            return
        }
        else if (szCmd == "func" || szCmd == "fu")
        {
            DelBufLine(hbuf,ln)
            lnMax = GetBufLineCount(hbuf)
            //最后一行肯定是新函数
            if(ln != lnMax)
            {
                szNextLine = GetBufLine(hbuf,ln)
                /*对于2.1版的si如果是非法symbol就会中断执行,故该为以后一行
                  是否有‘(’来判断是否是新函数*/
                if( (strstr(szNextLine,"(") != 0xffffffff) || (nVer != 2))
                {
                    /*是已经存在的函数*/
                    symbol = GetCurSymbol()
                    if(strlen(symbol) != 0)
                    {  
                        FuncHeadCommentCN(hbuf, ln, symbol, szMyName,0)
                        return
                    }
                }
            }
            szFuncName = Ask("请输入函数名称:")
            /*是新函数*/
            FuncHeadCommentCN(hbuf, ln, szFuncName, szMyName, 1)
        }
        else if (szCmd == "tab") /*将tab扩展为空格*/
        {
            DelBufLine(hbuf, ln)
            ReplaceBufTab()
        }
        else if (szCmd == "ap")
        {   
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }    
            
            DelBufLine(hbuf, ln)
            szQuestion = AddPromblemNo()
            InsBufLine(hbuf, ln, "@szLine1@/* 问 题 单: @szQuestion@     修改人:@szMyName@,   时间:@sz@-@szMonth@-@szDay@ ");
            szContent = Ask("修改原因")
            szLeft = cat(szLine1,"   修改原因: ");
            if(strlen(szLeft) > 70)
            {
                Msg("右边空间太小,请用新的行")
                stop 
            }
            ln = CommentContent(hbuf,ln + 1,szLeft,szContent,1)
            return
        }
        else if (szCmd == "ab")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
            
            DelBufLine(hbuf, ln)
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion)>0)
            {
                InsBufLine(hbuf, ln, "@szLine1@/* add begin by @szMyName@, @sz@-@szMonth@-@szDay@, Mantis号:@szQuestion@ 原因: */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* add begin by @szMyName@, @sz@-@szMonth@-@szDay@, 原因: */");        
            }
            return
        }
        else if (szCmd == "ae")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln)
            InsBufLine(hbuf, ln, "@szLine1@/* add end by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            return
        }
        else if (szCmd == "db")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln)
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion) > 0)
            {
                InsBufLine(hbuf, ln, "@szLine1@/* delete begin by @szMyName@, @sz@-@szMonth@-@szDay@, Mantis号:@szQuestion@ 原因: */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* delete begin by @szMyName@, @sz@-@szMonth@-@szDay@, 原因: */");
            }
            
            return
        }
        else if (szCmd == "de")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln + 0)
            InsBufLine(hbuf, ln, "@szLine1@/* delete end by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            return
        }
        else if (szCmd == "mb")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln)
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion) > 0)
            {
                InsBufLine(hbuf, ln, "@szLine1@/* modify begin by @szMyName@, @sz@-@szMonth@-@szDay@, Mantis号:@szQuestion@ 原因: */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* modify begin by @szMyName@, @sz@-@szMonth@-@szDay@, 原因: */");
            }
            return
        }
        else if (szCmd == "me")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln)
            InsBufLine(hbuf, ln, "@szLine1@/* modify end by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            return
        }
        else if (szCmd == "as")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
             szLine1 = strmid (GetBufLine(hbuf, ln), 0, GetBufLineLength (hbuf, ln)-2)
            DelBufLine(hbuf, ln)
            
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion)>0)
            { 
                InsBufLine(hbuf, ln, "@szLine1@/* add by @szMyName@, @sz@-@szMonth@-@szDay@, Mantis号:@szQuestion@, 原因: */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* add by @szMyName@, @sz@-@szMonth@-@szDay@, 原因: */");        
            }
            return
        }
        else if (szCmd == "ds")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
             szLine1 = strmid (GetBufLine(hbuf, ln), 0, GetBufLineLength (hbuf, ln)-2)
            DelBufLine(hbuf, ln)
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion)>0)
            {
                InsBufLine(hbuf, ln, "@szLine1@/* delete by @szMyName@, @sz@-@szMonth@-@szDay@, Mantis号:@szQuestion@, 原因: */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* delete by @szMyName@, @sz@-@szMonth@-@szDay@, 原因: */");        
            }
            return
        }
        else if (szCmd == "ms")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
               
             szLine1 = strmid (GetBufLine(hbuf, ln), 0, GetBufLineLength (hbuf, ln)-2)
            DelBufLine(hbuf, ln)
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion)>0)
            {
                InsBufLine(hbuf, ln, "@szLine1@/* modify by @szMyName@, @sz@-@szMonth@-@szDay@, Mantis号:@szQuestion@, 原因: */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* modify by @szMyName@, @sz@-@szMonth@-@szDay@, 原因: */");        
            }
            return
        }
        else
        {
            SearchForward()
            stop
        }
        SetWndSel(hwnd, sel)
        SearchForward()
    }
    
    /*****************************************************************************
     函 数 名  : BlockCommandProc
     功能描述  : 块命令处理函数
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro BlockCommandProc()
    {
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        sel = GetWndSel(hwnd)
        hbuf = GetWndBuf(hwnd)
        if(sel.lnFirst > 0)
        {
            ln = sel.lnFirst - 1
        }
        else
        {
            stop
        }
        szLine = GetBufLine(hbuf,ln)
        szLine = TrimString(szLine)
        if(szLine == "while" || szLine == "wh")
        {
            InsertWhile()   /*插入while*/
        }
        else if(szLine == "do")
        {
            InsertDo()   //插入do while语句
        }
        else if(szLine == "for")
        {
            InsertFor()  //插入for语句
        }
        else if(szLine == "if")
        {
            InsertIf()   //插入if语句
        }
        else if(szLine == "el" || szLine == "else")
        {
            InsertElse()  //插入else语句
            DelBufLine(hbuf,ln)
            stop
        }
        else if((szLine == "#ifd") || (szLine == "#ifdef"))
        {
            InsIfdef()        //插入#ifdef
            DelBufLine(hbuf,ln)
            stop
        }
        else if((szLine == "#ifn") || (szLine == "#ifndef"))
        {
            InsIfndef()        //插入#ifdef
            DelBufLine(hbuf,ln)
            stop
        }    
        else if (szLine == "abg")
        {
            InsertReviseAdd()
            DelBufLine(hbuf, ln)
            stop
        }
        else if (szLine == "dbg")
        {
            InsertReviseDel()
            DelBufLine(hbuf, ln)
            stop
        }
        else if (szLine == "mbg")
        {
            InsertReviseMod()
            DelBufLine(hbuf, ln)
            stop
        }
        else if(szLine == "#if")
        {
            InsertPredefIf()
            DelBufLine(hbuf,ln)
            stop
        }
        DelBufLine(hbuf,ln)
        SearchForward()
        stop
    }
    
    /*****************************************************************************
     函 数 名  : RestoreCommand
     功能描述  : 缩略命令恢复函数
     输入参数  : hbuf   
                 szCmd  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
    }
    
    /*****************************************************************************
     函 数 名  : SearchForward
     功能描述  : 向前搜索#
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro SearchForward()
    {
        LoadSearchPattern("#", 1, 0, 1);
        Search_Forward
    }
    
    /*****************************************************************************
     函 数 名  : SearchBackward
     功能描述  : 向后搜索#
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro SearchBackward()
    {
        LoadSearchPattern("#", 1, 0, 1);
        Search_Backward
    }
    
    /*****************************************************************************
     函 数 名  : InsertFuncName
     功能描述  : 在当前位置插入但前函数名
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro InsertFuncName()
    {
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        sel = GetWndSel(hwnd)
        hbuf = GetWndBuf(hwnd)
        symbolname = GetCurSymbol()
        SetBufSelText (hbuf, symbolname)
    }
    
    /*****************************************************************************
     函 数 名  : strstr
     功能描述  : 字符串匹配查询函数
     输入参数  : str1  源串
                 str2  待匹配子串
     输出参数  : 无
     返 回 值  : 0xffffffff为没有找到匹配字符串,V2.1不支持-1故采用该值
                 其它为匹配字符串的起始位置
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
    }
    
    /*****************************************************************************
     函 数 名  : InsertTraceInfo
     功能描述  : 在函数的入口和出口插入打印,不支持一行有多条语句的情况
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro InsertTraceInfo()
    {
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        hbuf = GetWndBuf(hwnd)
        sel = GetWndSel(hwnd)
        symbol = GetSymbolLocationFromLn(hbuf, sel.lnFirst)
        InsertTraceInCurFunction(hbuf,symbol)
    }
    
    /*****************************************************************************
     函 数 名  : InsertTraceInCurFunction
     功能描述  : 在函数的入口和出口插入打印,不支持一行有多条语句的情况
     输入参数  : hbuf
                 symbol
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro InsertTraceInCurFunction(hbuf,symbol)
    {
        ln = GetBufLnCur (hbuf)
        symbolname = symbol.Symbol
        nLineEnd = symbol.lnLim
        nExitCount = 1;
        InsBufLine(hbuf, ln, "    VOS_Debug_Trace("\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] == "	" )
                    || (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,"VOS_Debug_Trace("\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,"VOS_Debug_Trace("\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,  "    VOS_Debug_Trace("\r\n |@symbolname@() exit---: @nExitCount@ ");")        
            InsBufLine(hbuf, ln,  "")        
        }
    }
    
    /*****************************************************************************
     函 数 名  : GetFirstWord
     功能描述  : 取得字符串的第一个单词
     输入参数  : szLine
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro GetFirstWord(szLine)
    {
        szLine = TrimLeft(szLine)
        nIdx = 0
        iLen = strlen(szLine)
        while(nIdx < iLen)
        {
            if( (szLine[nIdx] == " ") || (szLine[nIdx] == "	") 
              || (szLine[nIdx] == ";") || (szLine[nIdx] == "(")
              || (szLine[nIdx] == ".") || (szLine[nIdx] == "{")
              || (szLine[nIdx] == ",") || (szLine[nIdx] == ":") )
            {
                return strmid(szLine,0,nIdx)
            }
            nIdx = nIdx + 1
        }
        return ""
        
    }
    
    /*****************************************************************************
     函 数 名  : AutoInsertTraceInfoInBuf
     功能描述  : 自动当前文件的全部函数出入口加入打印,只能支持C++
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
        }
        
    }
    
    /*****************************************************************************
     函 数 名  : CheckIsCodeBegin
     功能描述  : 是否为函数的第一条可执行代码
     输入参数  : szLine 左边没有空格和注释的字符串
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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] == "	") 
                 || (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] == "	") )
                    {
                        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
    }
    
    /*****************************************************************************
     函 数 名  : AutoInsertTraceInfoInPrj
     功能描述  : 自动当前工程全部文件的全部函数出入口加入打印,只能支持C++
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
        }
    }
    
    /*****************************************************************************
     函 数 名  : RemoveTraceInfo
     功能描述  : 删除该函数的出入口打印
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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 = "VOS_Debug_Trace("\r\n |@symbolname@() entry--- ");"
        szExit = "VOS_Debug_Trace("\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
        }
    }
    
    /*****************************************************************************
     函 数 名  : RemoveCurBufTraceInfo
     功能描述  : 从当前的buf中删除添加的出入口打印信息
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
        }
    }
    
    /*****************************************************************************
     函 数 名  : RemovePrjTraceInfo
     功能描述  : 删除工程中的全部加入的函数的出入口打印
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
        }
    }
    
    /*****************************************************************************
     函 数 名  : InsertFileHeaderEN
     功能描述  : 插入英文文件头描述
     输入参数  : hbuf       
                 ln         行号
                 szName     作者名
                 szContent  功能描述内容
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
      2.日    期   : 2011年2月22日
        作    者   : 彭军
        修改内容   : 修改文件头的日期为当年
    
    *****************************************************************************/
    macro InsertFileHeaderEN(hbuf, ln,szName,szContent)
    {
        
        hnewbuf = newbuf("")
        if(hnewbuf == hNil)
        {
            stop
        }
        SysTime = GetSysTime(1)
        szYear=SysTime.Year
        GetFunctionList(hbuf,hnewbuf)
        InsBufLine(hbuf, ln + 0,  "/********************************************************************************")
        InsBufLine(hbuf, ln + 1,  "")
        InsBufLine(hbuf, ln + 2,  " **** Copyright (C), @szYear@, xx xx xx xx info&tech Co., Ltd.                ****")
        InsBufLine(hbuf, ln + 3,  "")
        InsBufLine(hbuf, ln + 4,  " ********************************************************************************")
        sz = GetFileName(GetBufName (hbuf))
        InsBufLine(hbuf, ln + 5,  " * File Name     : @sz@")
        InsBufLine(hbuf, ln + 6,  " * Author        : @szName@")
        SysTime = GetSysTime(1)
        sz=SysTime.Year
        sz1=SysTime.month
        sz3=SysTime.day
        if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
        InsBufLine(hbuf, ln + 7,  " * Date          : @sz@-@szMonth@-@szDay@")
      
        /*InsBufLine(hbuf, ln + 8,  "  Created       : @sz@-@szMonth@-@szDay@")
        InsBufLine(hbuf, ln + 9,  "  Last Modified :")*/
        szTmp = " * Description   : "
        nlnDesc = ln
        iLen = strlen (szContent)
        InsBufLine(hbuf, ln + 8, " * Description   : @szContent@")
        InsBufLine(hbuf, ln + 9, " * Version       : 1.0")
        InsBufLine(hbuf, ln + 10," * Function List :")
        InsBufLine(hbuf, ln + 11," * ")
        //插入函数列表
        /*ln = InsertFileList(hbuf,hnewbuf,ln + 12) - 12
        closebuf(hnewbuf)
        */
        InsBufLine(hbuf, ln + 12, " * Record        :")
        InsBufLine(hbuf, ln + 13, " * 1.Date        : @sz@-@szMonth@-@szDay@")
        InsBufLine(hbuf, ln + 14, " *   Author      : @szName@")
        InsBufLine(hbuf, ln + 15, " *   Modification: Created file")
        InsBufLine(hbuf, ln + 16, "")
        InsBufLine(hbuf, ln + 17, "*************************************************************************************************************/")
        InsBufLine(hbuf, ln + 18, "")
      
        //InsBufLine(hbuf, ln + 19, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 20, " * external variables                           *")
        //InsBufLine(hbuf, ln + 21, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 22, "")
        //InsBufLine(hbuf, ln + 23, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 24, " * external routine prototypes                  *")
        //InsBufLine(hbuf, ln + 25, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 26, "")
        //InsBufLine(hbuf, ln + 27, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 28, " * internal routine prototypes                  *")
        //InsBufLine(hbuf, ln + 29, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 30, "")
        //InsBufLine(hbuf, ln + 31, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 32, " * project-wide global variables                *")
        //InsBufLine(hbuf, ln + 33, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 34, "")
        //InsBufLine(hbuf, ln + 35, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 36, " * module-wide global variables                 *")
        //InsBufLine(hbuf, ln + 37, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 38, "")
        //InsBufLine(hbuf, ln + 39, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 40, " * constants                                    *")
        //InsBufLine(hbuf, ln + 41, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 42, "")
        //InsBufLine(hbuf, ln + 43, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 44, " * macros                                       *")
        //InsBufLine(hbuf, ln + 45, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 46, "")
        //InsBufLine(hbuf, ln + 47, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 48, " * routines' implementations                    *")
        //InsBufLine(hbuf, ln + 49, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 50, "")
        if(iLen != 0)
        {
            return
        }
        
        //如果没有功能描述内容则提示输入
        szContent = Ask("Description")
        SetBufIns(hbuf,nlnDesc + 14,0)
        DelBufLine(hbuf,nlnDesc +10)
        
        //注释输出处理,自动换行
        CommentContent(hbuf,nlnDesc + 10,"  Description   : ",szContent,0)
    }
    
    
    /*****************************************************************************
     函 数 名  : InsertFileHeaderCN
     功能描述  : 插入中文描述文件头说明
     输入参数  : hbuf       
                 ln         
                 szName     
                 szContent  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
      2.日    期   : 2011年2月22日
        作    者   : 彭军
        修改内容   : 修改文件头的日期为当年
    
    *****************************************************************************/
    macro InsertFileHeaderCN(hbuf, ln,szName,szContent)
    {
        hnewbuf = newbuf("")
        if(hnewbuf == hNil)
        {
            stop
        }
        SysTime = GetSysTime(1)
        szYear=SysTime.Year
        szMonth=SysTime.month
        szDay=SysTime.day
        GetFunctionList(hbuf,hnewbuf)
        InsBufLine(hbuf, ln + 0,  "/***********************************************************************************")
        sz = GetFileName(GetBufName (hbuf))
        InsBufLine(hbuf, ln + 1,  " * 文 件 名   : @sz@")
        /*InsBufLine(hbuf, ln + 6,  "  版 本 号   : 初稿")*/
        InsBufLine(hbuf, ln + 2,  " * 负 责 人   : @szName@")
        InsBufLine(hbuf, ln + 3,  " * 创建日期   : @szYear@年@szMonth@月@szDay@日")
        /*InsBufLine(hbuf, ln + 9,  "  最近修改    :")*/
        iLen = strlen (szContent)
        nlnDesc = ln
        szTmp = " * 文件描述   : "
        InsBufLine(hbuf, ln + 4, " * 文件描述   : @szContent@")
        InsBufLine(hbuf, ln + 5, " * 版权说明   : Copyright (c) 2008-@szYear@   xx xx xx xx 技术有限公司")
        InsBufLine(hbuf, ln + 6, " * 其    他   : ")
        InsBufLine(hbuf, ln + 7, " * 修改日志   : ")
        InsBufLine(hbuf, ln + 8, "***********************************************************************************/")
        InsBufLine(hbuf, ln + 9, "")
    
    //    InsBufLine(hbuf, ln + 9, " * 版 本 号   : 1.0")
    //    InsBufLine(hbuf, ln + 10," * 函数列表   :")
    //    InsBufLine(hbuf, ln + 11," * ")
    //    //插入函数列表
    //    /*ln = InsertFileList(hbuf,hnewbuf,ln + 12) - 12
    //    closebuf(hnewbuf)
    //    */
    //    InsBufLine(hbuf, ln + 12, " * 历史记录   :")
    //    InsBufLine(hbuf, ln + 13, " * 1.日    期 : @sz@-@szMonth@-@szDay@")
    //
    //    if( strlen(szMyName)>0 )
    //    {
    //       InsBufLine(hbuf, ln + 14, " *   作    者 : @szName@")
    //    }
    //    else
    //    {
    //       InsBufLine(hbuf, ln + 14, " *   作    者 : #")
    //    }
    //    InsBufLine(hbuf, ln + 15, " *   修改内容 : 创建文件")    
    //    InsBufLine(hbuf, ln + 16, "")
    //    InsBufLine(hbuf, ln + 17, "***********************************************************************************/")
    //    InsBufLine(hbuf, ln + 18, "")
        //InsBufLine(hbuf, ln + 19, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 20, " * 外部变量说明                                 *")
        //InsBufLine(hbuf, ln + 21, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 22, "")
        //InsBufLine(hbuf, ln + 23, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 24, " * 外部函数原型说明                             *")
        //InsBufLine(hbuf, ln + 25, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 26, "")
        //InsBufLine(hbuf, ln + 27, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 28, " * 内部函数原型说明                             *")
        //InsBufLine(hbuf, ln + 29, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 30, "")
        //InsBufLine(hbuf, ln + 31, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 32, " * 全局变量                                     *")
        //InsBufLine(hbuf, ln + 33, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 34, "")
        //InsBufLine(hbuf, ln + 35, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 36, " * 模块级变量                                   *")
        //InsBufLine(hbuf, ln + 37, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 38, "")
        //InsBufLine(hbuf, ln + 39, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 40, " * 常量定义                                     *")
        //InsBufLine(hbuf, ln + 41, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 42, "")
        //InsBufLine(hbuf, ln + 43, "/*----------------------------------------------*")
        //InsBufLine(hbuf, ln + 44, " * 宏定义                                       *")
        //InsBufLine(hbuf, ln + 45, " *----------------------------------------------*/")
        //InsBufLine(hbuf, ln + 46, "")
        if(strlen(szContent) != 0)
        {
            return
        }
        
        //如果没有输入功能描述的话提示输入
        szContent = Ask("请输入文件功能描述的内容")
    
        //设置光标位置为注释的最后一行
        SetBufIns(hbuf,nlnDesc + 9,0)
        
        //将原"文件描述"行删掉
        DelBufLine(hbuf,nlnDesc +4)
        
        //自动排列显示功能描述
        CommentContent(hbuf,nlnDesc+4," * 文件描述   : ",szContent,0)
    }
    
    /*****************************************************************************
     函 数 名  : GetFunctionList
     功能描述  : 获得函数列表
     输入参数  : hbuf  
                 hnewbuf    
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
        }
    }
    /*****************************************************************************
     函 数 名  : InsertFileList
     功能描述  : 函数列表插入
     输入参数  : hbuf  
                 ln    
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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 
    }
    
    
    /*****************************************************************************
     函 数 名  : CommentContent1
     功能描述  : 自动排列显示文本,因为msg对话框不能处理多行的情况,而且不能超过255
                 个字符,作为折中,采用了从简帖板取数据的办法,如果如果的数据是剪
                 贴板中内容的前部分的话就认为用户是拷贝的内容,这样做虽然有可能有
                 误,但这种概率非常低。与CommentContent不同的是它将剪贴板中的内容
                 合并成一段来处理,可以根据需要选择这两种方式
     输入参数  : hbuf       
                 ln         行号
                 szPreStr   首行需要加入的字符串
                 szContent  需要输入的字符串内容
                 isEnd      是否需要在末尾加入'*'和'/'
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
    }
    
    
    
    /*****************************************************************************
     函 数 名  : CommentContent
     功能描述  : 自动排列显示文本,因为msg对话框不能处理多行的情况,而且不能超过255
                 个字符,作为折中,采用了从简帖板取数据的办法,如果如果的数据是剪
                 贴板中内容的前部分的话就认为用户是拷贝的内容,这样做虽然有可能有
                 误,但这种概率非常低
     输入参数  : hbuf       
                 ln         行号
                 szPreStr   首行需要加入的字符串
                 szContent  需要输入的字符串内容
                 isEnd      是否需要在末尾加入' '、'*'和'/'
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro CommentContent (hbuf,ln,szPreStr,szContent,isEnd)
    {
        szLeftBlank = szPreStr
        iLen = strlen(szPreStr)
        k = 0
        while(k < iLen)
        {
            szLeftBlank[k] = " ";
            k = k + 1;
        }
    
        hNewBuf = newbuf("clip")
        if(hNewBuf == hNil)
            return       
        SetCurrentBuf(hNewBuf)
        PasteBufLine (hNewBuf, 0)
        lnMax = GetBufLineCount( hNewBuf )
        szTmp = TrimString(szContent)
    
        //判断如果剪贴板是0行时对于有些版本会有问题,要排除掉
        if(lnMax != 0)
        {
            szLine = GetBufLine(hNewBuf , 0)
            ret = strstr(szLine,szTmp)
            if(ret == 0)
            {
                /*如果输入窗输入的内容是剪贴板的一部分说明是剪贴过来的取剪贴板中的内
                  容*/
                szContent = TrimString(szLine)
            }
            else
            {
                lnMax = 1
            }        
        }
        else
        {
            lnMax = 1
        }    
        szRet = ""
        nIdx = 0
        while ( nIdx < lnMax) 
        {
            if(nIdx != 0)
            {
                szLine = GetBufLine(hNewBuf , nIdx)
                szContent = TrimLeft(szLine)
                   szPreStr = szLeftBlank
            }
            iLen = strlen (szContent)
            szTmp = cat(szPreStr,"#");
            if( (iLen == 0) && (nIdx == (lnMax - 1))
            {
                InsBufLine(hbuf, ln, "@szTmp@")
            }
            else
            {
                i = 0
                //以每行75个字符处理
                while  (iLen - i > 75 - k )
                {
                    j = 0
                    while(j < 75 - k)
                    {
                        iNum = szContent[i + j]
                        if( AsciiFromChar (iNum)  > 160 )
                        {
                           j = j + 2
                        }
                        else
                        {
                           j = j + 1
                        }
                        if( (j > 70 - k) && (szContent[i + j] == " ") )
                        {
                            break
                        }
                    }
                    if( (szContent[i + j] != " " ) )
                    {
                        n = 0;
                        iNum = szContent[i + j + n]
                        //如果是中文字符只能成对处理
                        while( (iNum != " " ) && (AsciiFromChar (iNum)  < 160))
                        {
                            n = n + 1
                            if((n >= 3) ||(i + j + n >= iLen))
                                 break;
                            iNum = szContent[i + j + n]
                        }
                        if(n < 3)
                        {
                            //分段后只有小于3个的字符留在下段则将其以上去
                            j = j + n 
                            sz1 = strmid(szContent,i,i+j)
                            sz1 = cat(szPreStr,sz1)                
                        }
                        else
                        {
                            //大于3个字符的加连字符分段
                            sz1 = strmid(szContent,i,i+j)
                            sz1 = cat(szPreStr,sz1)
                            if(sz1[strlen(sz1)-1] != "-")
                            {
                                sz1 = cat(sz1,"-")                
                            }
                        }
                    }
                    else
                    {
                        sz1 = strmid(szContent,i,i+j)
                        sz1 = cat(szPreStr,sz1)
                    }
                    InsBufLine(hbuf, ln, "@sz1@")
                    ln = ln + 1
                    szPreStr = szLeftBlank
                    i = i + j
                    while(szContent[i] == " ")
                    {
                        i = i + 1
                    }
                }
                sz1 = strmid(szContent,i,iLen)
                sz1 = cat(szPreStr,sz1)
                if((isEnd == 1) && (nIdx == (lnMax - 1))
                {
                    sz1 = cat(sz1," */")
                }
                InsBufLine(hbuf, ln, "@sz1@")
            }
            ln = ln + 1
            nIdx = nIdx + 1
        }
        closebuf(hNewBuf)
        return ln - 1
    }
    
    /*****************************************************************************
     函 数 名  : FormatLine
     功能描述  : 将一行长文本进行自动分行
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro FormatLine()
    {
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        sel = GetWndSel(hwnd)
        if(sel.ichFirst > 70)
        {
            Msg("选择太靠右了")
            stop 
        }
        hbuf = GetWndBuf(hwnd)
        // get line the selection (insertion point) is on
        szCurLine = GetBufLine(hbuf, sel.lnFirst);
        lineLen = strlen(szCurLine)
        szLeft = strmid(szCurLine,0,sel.ichFirst)
        szContent = strmid(szCurLine,sel.ichFirst,lineLen)
        DelBufLine(hbuf, sel.lnFirst)
        CommentContent(hbuf,sel.lnFirst,szLeft,szContent,0)            
    
    }
    
    /*****************************************************************************
     函 数 名  : CreateBlankString
     功能描述  : 产生几个空格的字符串
     输入参数  : nBlankCount  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro CreateBlankString(nBlankCount)
    {
        szBlank=""
        nIdx = 0
        while(nIdx < nBlankCount)
        {
            szBlank = cat(szBlank," ")
            nIdx = nIdx + 1
        }
        return szBlank
    }
    
    /*****************************************************************************
     函 数 名  : TrimLeft
     功能描述  : 去掉字符串左边的空格
     输入参数  : szLine  
     输出参数  : 去掉左空格后的字符串
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro TrimLeft(szLine)
    {
        nLen = strlen(szLine)
        if(nLen == 0)
        {
            return szLine
        }
        nIdx = 0
        while( nIdx < nLen )
        {
            if( ( szLine[nIdx] != " ") && (szLine[nIdx] != "	") )
            {
                break
            }
            nIdx = nIdx + 1
        }
        return strmid(szLine,nIdx,nLen)
    }
    
    /*****************************************************************************
     函 数 名  : TrimRight
     功能描述  : 去掉字符串右边的空格
     输入参数  : szLine  
     输出参数  : 去掉右空格后的字符串
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro TrimRight(szLine)
    {
        nLen = strlen(szLine)
        if(nLen == 0)
        {
            return szLine
        }
        nIdx = nLen
        while( nIdx > 0 )
        {
            nIdx = nIdx - 1
            if( ( szLine[nIdx] != " ") && (szLine[nIdx] != "	") )
            {
                break
            }
        }
        return strmid(szLine,0,nIdx+1)
    }
    
    /*****************************************************************************
     函 数 名  : TrimString
     功能描述  : 去掉字符串左右空格
     输入参数  : szLine  
     输出参数  : 去掉左右空格后的字符串
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro TrimString(szLine)
    {
        szLine = TrimLeft(szLine)
        szLIne = TrimRight(szLine)
        return szLine
    }
    
    
    /*****************************************************************************
     函 数 名  : GetFunctionDef
     功能描述  : 将分成多行的函数参数头合并成一行
     输入参数  : hbuf    
                 symbol  函数符号
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro GetFunctionDef(hbuf,symbol)
    {
        ln = symbol.lnName
        szFunc = ""
        if(strlen(symbol) == 0)
        {
           return szFunc
        }
        fIsEnd = 1
    //    msg(symbol)
        while(ln < symbol.lnLim)
        {
            szLine = GetBufLine (hbuf, ln)
            //去掉被注释掉的内容
            RetVal = SkipCommentFromString(szLine,fIsEnd)
            szLine = RetVal.szContent
            szLine = TrimString(szLine)
            fIsEnd = RetVal.fIsEnd
            //如果是{表示函数参数头结束了
            ret = strstr(szLine,"{")        
            if(ret != 0xffffffff)
            {
                szLine = strmid(szLine,0,ret)
                szFunc = cat(szFunc,szLine)
                break
            }
            szFunc = cat(szFunc,szLine)        
            ln = ln + 1
        }
        return szFunc
    }
    
    /*****************************************************************************
     函 数 名  : GetWordFromString
     功能描述  : 从字符串中取得以某种方式分割的字符串组
     输入参数  : hbuf         生成分割后字符串的buf
                 szLine       字符串
                 nBeg         开始检索位置
                 nEnd         结束检索位置
                 chBeg        开始的字符标志
                 chSeparator  分割字符
                 chEnd        结束字符标志
     输出参数  : 最大字符长度
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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)
            {
                //nIdx不加1,在分隔符为标记的搜索中第一次就会搜到起始符
                break
            }
            nIdx = nIdx + 1
        }
        nBegWord = nIdx + 1
        
        //用于检测chBeg和chEnd的配对情况,因定位到起始符是nIdx没有加1,所以iCount=0
        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
    }
    
    
    /*****************************************************************************
     函 数 名  : FuncHeadCommentCN
     功能描述  : 生成中文的函数头注释
     输入参数  : hbuf      
                 ln        行号
                 szFunc    函数名
                 szMyName  作者名
                 newFunc   是否新函数
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro FuncHeadCommentCN(hbuf, ln, szFunc, szMyName,newFunc)
    {
        iIns = 0
        if(newFunc != 1)
        {
            symbol = GetSymbolLocationFromLn(hbuf, ln)
            if(strlen(symbol) > 0)
            {
                hTmpBuf = NewBuf("Tempbuf")
                if(hTmpBuf == hNil)
                {
                    stop
                }
                //将分成多行的函数参数头合并成一行并去掉了注释
                szLine = GetFunctionDef(hbuf,symbol)
                iBegin = symbol.ichName 
                //取出返回值定义
                szTemp = strmid(szLine,0,iBegin)
                szTemp = TrimString(szTemp)
                szRet =  GetFirstWord(szTemp)
                if(symbol.Type == "Method")
                {
                    szTemp = strmid(szTemp,strlen(szRet),strlen(szTemp))
                    szTemp = TrimString(szTemp)
                    if(szTemp == "::")
                    {
                        szRet = ""
                    }   
                }
                if(toupper (szRet) == "MACRO")
                {
                    //对于宏返回值特殊处理
                    szRet = ""
                }
                //从函数头分离出函数参数
                nMaxParamSize = GetWordFromString(hTmpBuf,szLine,iBegin,strlen(szLine),"(",",",")")
                lnMax = GetBufLineCount(hTmpBuf)
                ln = symbol.lnFirst
                SetBufIns (hbuf, ln, 0)
            }
        }
        else
        {
            lnMax = 0
            szLine = ""
            szRet = ""
        }
        InsBufLine(hbuf, ln, "/*****************************************************************************")
        if( strlen(szFunc)>0 )
        {
            InsBufLine(hbuf, ln+1, " * 函 数 名  : @szFunc@")
        }
        else
        {
            InsBufLine(hbuf, ln+1, " * 函 数 名  : #")
        }
        oldln = ln
        InsBufLine(hbuf, ln+2, " * 负 责 人  : @szMyName@")
        SysTime = GetSysTime(1);
        /*szTime = SysTime.Date*/
        SysTime = GetSysTime(1);
        sz1=SysTime.Year
        sz2=SysTime.month
        sz3=SysTime.day
        InsBufLine(hbuf, ln+3, " * 创建日期  : @sz1@年@sz2@月@sz3@日")
        InsBufLine(hbuf, ln+4, " * 函数功能  : ")
        szIns = " * 输入参数  : "
        if(newFunc != 1)
        {
            //对于已经存在的函数插入函数参数
            i = 0
            while ( i < lnMax) 
            {
                szTmp = GetBufLine(hTmpBuf, i)
                nLen = strlen(szTmp);
                szBlank = CreateBlankString(nMaxParamSize - nLen + 2)
                szTmp = cat(szTmp,szBlank)
    
                //插入参数描述
                szParamAsk = cat("请输入参数描述: ",szTmp)
                szParamDescribe = Ask(szParamAsk)
                szTmp = cat(szTmp,szParamDescribe)
                
                ln = ln + 1        //这句是关键,每找到一个参数将ln加1,保证今后在ln+?行都是在所有参数基础后加的
                szTmp = cat(szIns,szTmp)
                InsBufLine(hbuf, ln+4, "@szTmp@")    //在第ln+4行插入是因为前面每个参数都ln=ln+1,其实是从ln5行开始每个参数插入一行
                iIns = 1    //函数是否存在参数标记
                szIns = "               "        //第二个参数前面留空格对齐
                i = i + 1
            }    
            closebuf(hTmpBuf)
        }
        if(iIns == 0)
        {       
                ln = ln + 1        //为了保持如有参数的一致
                InsBufLine(hbuf, ln+4, " * 输入参数  : 无")    //在第ln+4行插入是因为前面每个参数都ln=ln+1,其实是从ln5行开始每个参数插入一行
        }
        InsBufLine(hbuf, ln+5, " * 输出参数  : 无")
        InsBufLine(hbuf, ln+6, " * 返 回 值  : @szRet@")
        InsBufLine(hbuf, ln+7, " * 调用关系  : ")
        InsBufLine(hbuf, ln+8, " * 其    它  : ")
        /*InsBufLine(hbuf, ln+6, " 创 建 者  : @szMyName@")
        InsbufLIne(hbuf, ln+7, " 创建时间  : @szTime@")*/
    //    InsBufLine(hbuf, ln+6, " * 记    录")
    //    SysTime = GetSysTime(1);
    //    /*szTime = SysTime.Date*/
    //    SysTime = GetSysTime(1);
    //    sz1=SysTime.Year
    //    sz2=SysTime.month
    //    sz3=SysTime.day
    //    if (sz2 < 10)
    //    {
    //        szMonth = "0@sz2@"
    //       }
    //       else
    //       {
    //           szMonth = sz2
    //       }
    //       if (sz3 < 10)
    //    {
    //        szDay = "0@sz3@"
    //       }
    //       else
    //       {
    //           szDay = sz3
    //       }
    //    
    //    InsBufLine(hbuf, ln+7, " * 1.日    期: @sz1@@szMonth@@szDay@")
    //
    //    if( strlen(szMyName)>0 )
    //    {
    //       InsBufLine(hbuf, ln+8, " *   作    者: @szMyName@")
    //    }
    //    else
    //    {
    //       InsBufLine(hbuf, ln+8, " *   作    者: #")
    //    }
    //    InsBufLine(hbuf, ln+9, " *   修改内容: 新生成函数")    
        InsBufLine(hbuf, ln+9, "")    
        InsBufLine(hbuf, ln+10, "*****************************************************************************/")
        //输入了函数名的新函数在注释后加上函数体
        if ((newFunc == 1) && (strlen(szFunc)>0))
        {
            InsBufLine(hbuf, ln+11, "VOS_UINT32  @szFunc@( # )")
            InsBufLine(hbuf, ln+12, "{");
            InsBufLine(hbuf, ln+13, "    #");
            InsBufLine(hbuf, ln+14, "}");
            SearchForward()        //光标定位到最前面单独出现的#上,并选中#,即函数名后面的#(函数的参数位置)
        }
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        //光标定位到"{"后
        sel = GetWndSel(hwnd)
        sel.ichFirst = 1
        sel.ichLim = sel.ichFirst
        sel.lnFirst = ln + 12
        sel.lnLast = ln + 12 
        szContent = Ask("请输入函数功能描述的内容")
        setWndSel(hwnd,sel)
        DelBufLine(hbuf,oldln + 4)
    
        //显示输入的功能描述内容
        newln = CommentContent(hbuf,oldln+4," * 函数功能  : ",szContent,0) - 4//此处减4是因为CommentContent返回的值是传进去的oldln+4之后演算出来的
        ln = ln + newln - oldln        //加上增加行数
        if ((newFunc == 1) && (strlen(szFunc)>0))
        {
            isFirstParam = 1
                
            //提示输入新函数的返回值
            szRet = Ask("请输入返回值类型")
            if(strlen(szRet) > 0)
            {
                PutBufLine(hbuf, ln+6, " * 返 回 值  : @szRet@")            
                PutBufLine(hbuf, ln+11, "@szRet@ @szFunc@(   )")
                SetbufIns(hbuf,ln+11,strlen(szRet)+strlen(szFunc) + 3    //光标定位到函数的左括号"("后一个空格处
            }
            szFuncDef = ""
            sel.ichFirst = strlen(szFunc)+strlen(szRet) + 3
            sel.ichLim = sel.ichFirst + 1
            //循环输入参数
            while (1)
            {
                szParam = ask("请输入函数参数名")
                szParam = TrimString(szParam)
                szParamOriginal = szParam
                szTmp = cat(szIns,szParam)
                szParam = cat(szFuncDef,szParam)
                
                //光标定位到函数的最后一个参数后
                sel.lnFirst = ln + 11
                sel.lnLast = ln + 11
                setWndSel(hwnd,sel)
                
                sel.ichFirst = sel.ichFirst + strlen(szParam)
                sel.ichLim = sel.ichFirst
                oldsel = sel
    
                //插入参数描述
                szParamAsk = cat("请输入参数描述: ",szParamOriginal)
                szParamDescribe = Ask(szParamAsk)
                szTmp = cat(szTmp,"  ")
                szTmp = cat(szTmp,szParamDescribe)
    
    
                //在函数头注释中插入参数
                if(isFirstParam == 1)
                {
                    PutBufLine(hbuf, ln+4, "@szTmp@")
                    isFirstParam  = 0
                }
                else
                {
                    ln = ln + 1
                    InsBufLine(hbuf, ln+4, "@szTmp@")
                    oldsel.lnFirst = ln + 11
                    oldsel.lnLast = ln + 11       
                }
    
                //在光标所在的位置插入参数
                SetBufSelText(hbuf,szParam)
                
                //函数头注释的对齐
                szIns = "               "
                //参数后加一个空格
                szFuncDef = ", "
    
                //光标定位到函数"{"后的"#"处,并选中"#"
                oldsel.lnFirst = ln + 13
                oldsel.lnLast = ln + 13
                oldsel.ichFirst = 4
                oldsel.ichLim = 5
                setWndSel(hwnd,oldsel)
            }
        }
        return ln + 14
    }
    
    /*****************************************************************************
     函 数 名  : FuncHeadCommentEN
     功能描述  : 函数头英文说明
     输入参数  : hbuf      
                 ln        
                 szFunc    
                 szMyName  
                 newFunc   
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro FuncHeadCommentEN(hbuf, ln, szFunc, szMyName,newFunc)
    {
        iIns = 0
        if(newFunc != 1)
        {
            symbol = GetSymbolLocationFromLn(hbuf, ln)
            if(strlen(symbol) > 0)
            {
                hTmpBuf = NewBuf("Tempbuf")
                    
                //将文件参数头整理成一行并去掉了注释
                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
            szRet = ""
            szLine = ""
        }
        InsBufLine(hbuf, ln, "/*****************************************************************************")
        InsBufLine(hbuf, ln+1, " * Function      : @szFunc@")
        InsBufLine(hbuf, ln+2, " * Description   : ")
        oldln  = ln 
        szIns = " * Input         : "
        if(newFunc != 1)
        {
            //对于已经存在的函数输出输入参数表
            i = 0
            while ( i < lnMax) 
            {
                szTmp = GetBufLine(hTmpBuf, i)
                nLen = strlen(szTmp);
                
                //对齐参数后面的空格,实际是对齐后面的参数的说明
                szBlank = CreateBlankString(nMaxParamSize - nLen + 2)
                szTmp = cat(szTmp,szBlank)
                ln = ln + 1
                szTmp = cat(szIns,szTmp)
                InsBufLine(hbuf, ln+2, "@szTmp@")
                iIns = 1
                szIns = "                "
                i = i + 1
            }    
            closebuf(hTmpBuf)
        }
        if(iIns == 0)
        {       
                ln = ln + 1
                InsBufLine(hbuf, ln+2, " * Input          : None")
        }
        InsBufLine(hbuf, ln+3, " * Output        : None")
        InsBufLine(hbuf, ln+4, " * Return        : @szRet@")
        /*InsBufLine(hbuf, ln+5, " Calls        : ")
        InsBufLine(hbuf, ln+6, " Called By    : ")*/
        InsbufLIne(hbuf, ln+5, " * Others        : ");
        
        SysTime = GetSysTime(1);
        sz1=SysTime.Year
        sz2=SysTime.month
        sz3=SysTime.day
        if (sz2 < 10)
        {
            szMonth = "0@sz2@"
           }
           else
           {
               szMonth = sz2
           }
           if (sz3 < 10)
        {
            szDay = "0@sz3@"
           }
           else
           {
               szDay = sz3
           }
    
        InsBufLine(hbuf, ln + 6, " * Record")
        InsBufLine(hbuf, ln + 7, " * 1.Date        : @sz1@@szMonth@@szDay@")
        InsBufLine(hbuf, ln + 8, " *   Author      : @szMyName@")
        InsBufLine(hbuf, ln + 9, " *   Modification: Created function")
        InsBufLine(hbuf, ln + 10, "")    
        InsBufLine(hbuf, ln + 11, "*****************************************************************************/")
        if ((newFunc == 1) && (strlen(szFunc)>0))
        {
            InsBufLine(hbuf, ln+12, "VOS_UINT32  @szFunc@( # )")
            InsBufLine(hbuf, ln+13, "{");
            InsBufLine(hbuf, ln+14, "    #");
            InsBufLine(hbuf, ln+15, "}");
            SearchForward()
        }        
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        sel = GetWndSel(hwnd)
        sel.ichFirst = 0
        sel.ichLim = sel.ichFirst
        sel.lnFirst = ln + 12
        sel.lnLast = ln + 12       
        szContent = Ask("Description")
        DelBufLine(hbuf,oldln + 2)
        setWndSel(hwnd,sel)
        newln = CommentContent(hbuf,oldln + 2," * Description   : ",szContent,0) - 2
        ln = ln + newln - oldln
        if ((newFunc == 1) && (strlen(szFunc)>0))
        {
            //提示输入函数返回值名
            szRet = Ask("Please input return value type")
            if(strlen(szRet) > 0)
            {
                PutBufLine(hbuf, ln+4, " * Return        : @szRet@")            
                PutBufLine(hbuf, ln+12, "@szRet@ @szFunc@( # )")
                SetbufIns(hbuf,ln+12,strlen(szRet)+strlen(szFunc) + 3
            }
            szFuncDef = ""
            isFirstParam = 1
            sel.ichFirst = strlen(szFunc)+strlen(szRet) + 3
            sel.ichLim = sel.ichFirst + 1
    
            //循环输入新函数的参数
            while (1)
            {
                szParam = ask("Please input parameter")
                szParam = TrimString(szParam)
                szTmp = cat(szIns,szParam)
                szParam = cat(szFuncDef,szParam)
                sel.lnFirst = ln + 12
                sel.lnLast = ln + 12
                setWndSel(hwnd,sel)
                sel.ichFirst = sel.ichFirst + strlen(szParam)
                sel.ichLim = sel.ichFirst
                oldsel = sel
                if(isFirstParam == 1)
                {
                    PutBufLine(hbuf, ln+2, "@szTmp@")
                    isFirstParam  = 0
                }
                else
                {
                    ln = ln + 1
                    InsBufLine(hbuf, ln+2, "@szTmp@")
                    oldsel.lnFirst = ln + 12
                    oldsel.lnLast = ln + 12        
                }
                SetBufSelText(hbuf,szParam)
                szIns = "                "
                szFuncDef = ", "
                oldsel.lnFirst = ln + 14
                oldsel.lnLast = ln + 14
                oldsel.ichFirst = 4
                oldsel.ichLim = 5
                setWndSel(hwnd,oldsel)
            }
        }
        return ln + 15
    }
    
    /*****************************************************************************
     函 数 名  : InsertHistory
     功能描述  : 插入修改历史记录
     输入参数  : hbuf      
                 ln        行号
                 language  语种
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro InsertHistory(hbuf,ln,language)
    {
        iHistoryCount = 1
    //    isLastLine = ln
    //    i = 0
    //    while(ln-i>0)
    //    {
    //        szCurLine = GetBufLine(hbuf, ln-i);
    //        iBeg1 = strstr(szCurLine,"日    期  ")
    //        iBeg2 = strstr(szCurLine,"Date      ")
    //        if((iBeg1 != 0xffffffff) || (iBeg2 != 0xffffffff))
    //        {
    //            iHistoryCount = iHistoryCount + 1
    //            i = i + 1
    //            continue
    //        }
    //        iBeg1 = strstr(szCurLine,"修改历史")
    //        iBeg2 = strstr(szCurLine,"History      ")
    //        if((iBeg1 != 0xffffffff) || (iBeg2 != 0xffffffff))
    //        {
    //            break
    //        }
    //        iBeg = strstr(szCurLine,"/**********************")
    //        if( iBeg != 0xffffffff )
    //        {
    //            break
    //        }
    //       i = i + 1
    //    }
        if(language == 0)
        {
            InsertHistoryContentCN(hbuf,ln,iHistoryCount)
        }
        else
        {
            InsertHistoryContentEN(hbuf,ln,iHistoryCount)
        }
    }
    
    /*****************************************************************************
     函 数 名  : UpdateFunctionList
     功能描述  : 更新函数列表
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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)
     }
    
    /*****************************************************************************
     函 数 名  : InsertHistoryContentCN
     功能描述  : 插入历史修改记录中文说明
     输入参数  : hbuf           
                 ln             
                 iHostoryCount  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro  InsertHistoryContentCN(hbuf,ln,iHostoryCount)
    {
        //获取时间
        SysTime = GetSysTime(1);
        szYear=SysTime.Year
        szMonth=SysTime.month
        if (szMonth < 10)
        {
            szMonth = "0@szMonth@"
           }
        szDay=SysTime.day
          if (szDay < 10)
        {
            szDay = "0@szDay@"
           }
    
        //获取用户名
        szMyName = getreg(MYNAME)
        if(strlen( szMyName ) == 0)
        {
            szMyName = Ask("Enter your name:")
            setreg(MYNAME, szMyName)
        }
    
    
           //获取光标所在位置的左侧的字符串,即得到"hi"字符串
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        sel = GetWndSel(hwnd)
        szLine = GetBufLine (hbuf, sel.lnFirst)
        wordinfo = GetWordLeftOfIch(sel.ichFirst, szLine)
    
        //获取"hi"左侧的字符
        strLeft = strmid (szLine, 0, wordinfo.ich)
    
        //判断左侧的字符是否有" * 修改日志   :"
        ret =strstr(strLeft, " * 修改日志   :")
        if(ret != 0xffffffff)    //修改日志的第一行,保留"修改日志"字符串
        {
            szTmp = strLeft
        }
        else        //修改日志的其他行,前面补空格
        {
            szTmp = CreateBlankString(16)
        }
    
        //加上修改日期,修改人
        szTmp = cat(szTmp,"@szYear@@szMonth@@szDay@ by @szMyName@, ")
    
           szContent = Ask("请输入修改的内容")
           CommentContent(hbuf,ln,szTmp,szContent,0)
    
    //    SysTime = GetSysTime(1);
    //    szTime = SysTime.Date
    //    szMyName = getreg(MYNAME)
    //
    //    InsBufLine(hbuf, ln, "")
    //    InsBufLine(hbuf, ln + 1, "  @iHostoryCount@.日    期   : @szTime@")
    //
    //    if( strlen(szMyName) > 0 )
    //    {
    //       InsBufLine(hbuf, ln + 2, "    作    者   : @szMyName@")
    //    }
    //    else
    //    {
    //       InsBufLine(hbuf, ln + 2, "    作    者   : #")
    //    }
    //       szContent = Ask("请输入修改的内容")
    //       CommentContent(hbuf,ln + 3,"    修改内容   : ",szContent,0)
    }
    
    
    /*****************************************************************************
     函 数 名  : InsertHistoryContentEN
     功能描述  : 插入历史修改记录英文说明
     输入参数  : hbuf           当前buf
                 ln             当前行号
                 iHostoryCount  修改记录的编号
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro  InsertHistoryContentEN(hbuf,ln,iHostoryCount)
    {
        SysTime = GetSysTime(1);
        szTime = SysTime.Date
        sz1=SysTime.Year
        sz2=SysTime.month
        sz3=SysTime.day
        if (sz2 < 10)
        {
            szMonth = "0@sz2@"
           }
           else
           {
               szMonth = sz2
           }
           if (sz3 < 10)
        {
            szDay = "0@sz3@"
           }
           else
           {
               szDay = sz3
           }
        szMyName = getreg(MYNAME)
        InsBufLine(hbuf, ln, "")
        InsBufLine(hbuf, ln + 1, "  @iHostoryCount@.Date         : @sz1@@szMonth@@szDay@")
    
        InsBufLine(hbuf, ln + 2, "    Author       : @szMyName@")
           szContent = Ask("Please input modification")
           CommentContent(hbuf,ln + 3,"    Modification : ",szContent,0)
    }
    
    /*****************************************************************************
     函 数 名  : CreateFunctionDef
     功能描述  : 生成C语言头文件
     输入参数  : hbuf      
                 szName    
                 language  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro CreateFunctionDef(hbuf, szName, language)
    {
        ln = 0
    
        //获得当前没有后缀的文件名
        szFileName = GetFileNameNoExt(GetBufName (hbuf))
        if(strlen(szFileName) == 0)
        {    
            sz = ask("请输入头文件名")
            szFileName = GetFileNameNoExt(sz)
            szExt = GetFileNameExt(szFileName)        
            szPreH = toupper (szFileName)
            szPreH = cat("__",szPreH)
            szExt = toupper(szExt)
            szPreH = cat(szPreH,"_@szExt@__")
        }
        szPreH = toupper (szFileName)
        sz = cat(szFileName,".h")
        szPreH = cat("__",szPreH)
        szPreH = cat(szPreH,"_H__")
        hOutbuf = NewBuf(sz) // create output buffer
        if (hOutbuf == 0)
            stop
        //搜索符号表取得函数名
        SetCurrentBuf(hOutbuf)
        isymMax = GetBufSymCount(hbuf)
        isym = 0
        while (isym < isymMax) 
        {
            isLastLine = 0
            symbol = GetBufSymLocation(hbuf, isym)
            fIsEnd = 1
            if(strlen(symbol) > 0)
            {
                if(symbol.Type == "Class Placeholder")
                {
                    hsyml = SymbolChildren(symbol)
                    cchild = SymListCount(hsyml)
                    ichild = 0
                    szClassName = symbol.Symbol
                    InsBufLine(hOutbuf, ln, "}")
                    InsBufLine(hOutbuf, ln, "{")
                    InsBufLine(hOutbuf, ln, "class @szClassName@")
                    ln = ln + 2
                    while (ichild < cchild)
                    {
                        childsym = SymListItem(hsyml, ichild)
                        childsym.Symbol = szClassName
                        ln = CreateClassPrototype(hbuf,ln,childsym)
                        ichild = ichild + 1
                    }
                    SymListFree(hsyml)
                    InsBufLine(hOutbuf, ln + 1, "")
                    ln = ln + 2
                }
                else if( symbol.Type == "Function" )
                {
                    ln = CreateFuncPrototype(hbuf,ln,"extern",symbol)
                }
                else if( symbol.Type == "Method" ) 
                {
                    szLine = GetBufline(hbuf,symbol.lnName)
                    szClassName = GetLeftWord(szLine,symbol.ichName)
                    symbol.Symbol = szClassName
                    ln = CreateClassPrototype(hbuf,ln,symbol)            
                }
                
            }
            isym = isym + 1
        }
        InsertCPP(hOutbuf,0)
        HeadIfdefStr(szPreH)
        szContent = GetFileName(GetBufName (hbuf))
        if(language == 0)
        {
            szContent = cat(szContent," 的头文件")
            //插入文件头说明
            InsertFileHeaderCN(hOutbuf,0,szName,szContent)
        }
        else
        {
            szContent = cat(szContent," header file")
            //插入文件头说明
            InsertFileHeaderEN(hOutbuf,0,szName,szContent)        
        }
    }
    
    
    /*****************************************************************************
     函 数 名  : GetLeftWord
     功能描述  : 取得左边的单词
     输入参数  : szLine    
                 ichRight 开始取词位置
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年7月05日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro GetLeftWord(szLine,ichRight)
    {
        if(ich == 0)
        {
            return ""
        }
        ich = ichRight
        while(ich > 0)
        {
            if( (szLine[ich] == " ") || (szLine[ich] == "	")
                || ( 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)
    }
    /*****************************************************************************
     函 数 名  : CreateClassPrototype
     功能描述  : 生成Class的定义
     输入参数  : hbuf      当前文件
                 hOutbuf   输出文件
                 ln        输出行号
                 symbol    符号
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年7月05日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
    }
    
    /*****************************************************************************
     函 数 名  : CreateFuncPrototype
     功能描述  : 生成C函数原型定义
     输入参数  : hbuf      当前文件
                 hOutbuf   输出文件
                 ln        输出行号
                 szType    原型类型
                 symbol    符号
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年7月05日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro CreateFuncPrototype(hbuf,ln,szType,symbol)
    {
        isLastLine = 0
        hOutbuf = GetCurrentBuf()
        szLine = GetBufLine (hbuf,symbol.lnName)
        //去掉注释的干扰
        RetVal = SkipCommentFromString(szLine,fIsEnd)
        szNew = RetVal.szContent
        fIsEnd = RetVal.fIsEnd
        szLine = cat("@szType@ ",szLine)
        szNew = cat("@szType@ ",szNew)
        sline = symbol.lnFirst     
        while((isLastLine == 0) && (sline < symbol.lnLim))
        {   
            i = 0
            j = 0
            iLen = strlen(szNew)
            while(i < iLen)
            {
                if(szNew[i]=="(")
                {
                   j = j + 1;
                }
                else if(szNew[i]==")")
                {
                    j = j - 1;
                    if(j <= 0)
                    {
                        //函数参数头结束
                        isLastLine = 1  
                        //去掉最后多余的字符
                        szLine = strmid(szLine,0,i+1);
                        szLine = cat(szLine,";")
                        break
                    }
                }
                i = i + 1
            }
            InsBufLine(hOutbuf, ln, "@szLine@")
            ln = ln + 1
            sline = sline + 1
            if(isLastLine != 1)
            {              
                //函数参数头还没有结束再取一行
                szLine = GetBufLine (hbuf, sline)
                szLine = cat("         ",szLine)
                //去掉注释的干扰
                RetVal = SkipCommentFromString(szLine,fIsEnd)
                szNew = RetVal.szContent
                fIsEnd = RetVal.fIsEnd
            }                    
        }
        return ln
    }
    
    
    /*****************************************************************************
     函 数 名  : CreateNewHeaderFile
     功能描述  : 生成一个新的头文件,文件名可输入
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro CreateNewHeaderFile()
    {
        hbuf = GetCurrentBuf()
        language = getreg(LANGUAGE)
        if(language != 1)
        {
            language = 0
        }
        szName = getreg(MYNAME)
        if(strlen( szName ) == 0)
        {
            szMyName = Ask("Enter your name:")
            setreg(MYNAME, szMyName)
        }
        isymMax = GetBufSymCount(hbuf)
        isym = 0
        ln = 0
        //获得当前没有后缀的文件名
        sz = ask("Please input header file name")
        szFileName = GetFileNameNoExt(sz)
        szExt = GetFileNameExt(sz)        
        szPreH = toupper (szFileName)
        szPreH = cat("__",szPreH)
        szExt = toupper(szExt)
        szPreH = cat(szPreH,"_@szExt@__")
        hOutbuf = NewBuf(sz) // create output buffer
        if (hOutbuf == 0)
            stop
    
        SetCurrentBuf(hOutbuf)
        InsertCPP(hOutbuf,0)
        HeadIfdefStr(szPreH)
        szContent = GetFileName(GetBufName (hbuf))
        if(language == 0)
        {
            szContent = cat(szContent," 的头文件")
    
            //插入文件头说明
            InsertFileHeaderCN(hOutbuf,0,szName,szContent)
        }
        else
        {
            szContent = cat(szContent," header file")
    
            //插入文件头说明
            InsertFileHeaderEN(hOutbuf,0,szName,szContent)        
        }
    
        lnMax = GetBufLineCount(hOutbuf)
        if(lnMax > 9)
        {
            ln = lnMax - 9
        }
        else
        {
            return
        }
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        sel = GetWndSel(hwnd)
        sel.lnFirst = ln
        sel.ichFirst = 0
        sel.ichLim = 0
        SetBufIns(hOutbuf,ln,0)
        szType = Ask ("Please prototype type : extern or static")
        //搜索符号表取得函数名
        while (isym < isymMax) 
        {
            isLastLine = 0
            symbol = GetBufSymLocation(hbuf, isym)
            fIsEnd = 1
            if(strlen(symbol) > 0)
            {
                if(symbol.Type == "Class Placeholder")
                {
                    hsyml = SymbolChildren(symbol)
                    cchild = SymListCount(hsyml)
                    ichild = 0
                    szClassName = symbol.Symbol
                    InsBufLine(hOutbuf, ln, "}")
                    InsBufLine(hOutbuf, ln, "{")
                    InsBufLine(hOutbuf, ln, "class @szClassName@")
                    ln = ln + 2
                    while (ichild < cchild)
                    {
                        childsym = SymListItem(hsyml, ichild)
                        childsym.Symbol = szClassName
                        ln = CreateClassPrototype(hbuf,ln,childsym)
                        ichild = ichild + 1
                    }
                    SymListFree(hsyml)
                    InsBufLine(hOutbuf, ln + 1, "")
                    ln = ln + 2
                }
                else if( symbol.Type == "Function" )
                {
                    ln = CreateFuncPrototype(hbuf,ln,szType,symbol)
                }
                else if( symbol.Type == "Method" ) 
                {
                    szLine = GetBufline(hbuf,symbol.lnName)
                    szClassName = GetLeftWord(szLine,symbol.ichName)
                    symbol.Symbol = szClassName
                    ln = CreateClassPrototype(hbuf,ln,symbol)            
                }
            }
            isym = isym + 1
        }
        sel.lnLast = ln 
        SetWndSel(hwnd,sel)
    }
    
    
    /*   G E T   W O R D   L E F T   O F   I C H   */
    /*-------------------------------------------------------------------------
        Given an index to a character (ich) and a string (sz),
        return a "wordinfo" record variable that describes the 
        text word just to the left of the ich.
    
        Output:
            wordinfo.szWord = the word string
            wordinfo.ich = the first ich of the word
            wordinfo.ichLim = the limit ich of the word
    -------------------------------------------------------------------------*/
    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
    }
    
    
    /*****************************************************************************
     函 数 名  : ReplaceBufTab
     功能描述  : 替换tab为空格
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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,"	",szBlank,0, iTotalLn, 1, 0, 0, 1)
    }
    
    /*****************************************************************************
     函 数 名  : ReplaceTabInProj
     功能描述  : 在整个工程内替换tab为空格
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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,"	",szBlank,0, iTotalLn, 1, 0, 0, 1)
            }
            if( IsBufDirty (hbuf) )
            {
                SaveBuf (hbuf)
            }
            CloseBuf(hbuf)
            ifile = ifile + 1
        }
    }
    
    /*****************************************************************************
     函 数 名  : ReplaceInBuf
     功能描述  : 替换tab为空格,只在2.1中有效
     输入参数  : hbuf             
                 chOld            
                 chNew            
                 nBeg             
                 nEnd             
                 fMatchCase       
                 fRegExp          
                 fWholeWordsOnly  
                 fConfirm         
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
        }
    }
    
    
    /*****************************************************************************
     函 数 名  : ConfigureSystem
     功能描述  : 配置系统
     输入参数  : 无
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro ConfigureSystem()
    {
        szLanguage = ASK("Please select language: 0 Chinese ,1 English");
        if(szLanguage == "#")
        {
           SetReg ("LANGUAGE", "0")
        }
        else
        {
           SetReg ("LANGUAGE", szLanguage)
        }
        
        szName = ASK("Please input your name");
        if(szName == "#")
        {
           SetReg ("MYNAME", "")
        }
        else
        {
           SetReg ("MYNAME", szName)
        }
    }
    
    /*****************************************************************************
     函 数 名  : GetLeftBlank
     功能描述  : 得到字符串左边的空格字符数
     输入参数  : szLine  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro GetLeftBlank(szLine)
    {
        nIdx = 0
        nEndIdx = strlen(szLine)
        while( nIdx < nEndIdx )
        {
            if( (szLine[nIdx] !=" ") && (szLine[nIdx] !="	") )
            {
                break;
            }
            nIdx = nIdx + 1
        }
        return nIdx
    }
    
    /*****************************************************************************
     函 数 名  : ExpandBraceLittle
     功能描述  : 小括号扩展
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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, " )")
        }
        
    }
    
    /*****************************************************************************
     函 数 名  : ExpandBraceMid
     功能描述  : 中括号扩展
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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, "]")
        }
        
    }
    
    /*****************************************************************************
     函 数 名  : ExpandBraceLarge
     功能描述  : 大括号扩展
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月18日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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] != "	" ))
            {
                return nIdx
            }
            nIdx = nIdx + 1
        }
        if( (szLine[iLen -1] == " ") || (szLine[iLen -1] == "	" ))
        {
            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] != "	")
                    {
                        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] != "	")
                    {
                        szLine[nIdx - 2] = "/"
                        szLine[nIdx - 1] = "/"
                        return szLine
                    }
                    nIdx = nIdx + 1
                }
            
            }
            nIdx = nIdx + 1
        }
        return szLine
    }*/
    
    /*****************************************************************************
     函 数 名  : DelCompoundStatement
     功能描述  : 删除一个复合语句
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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)
        }
    }
    
    /*****************************************************************************
     函 数 名  : CheckBlockBrace
     功能描述  : 检测定义块中的大括号配对情况
     输入参数  : hbuf  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
    }
    
    /*****************************************************************************
     函 数 名  : SearchCompoundEnd
     功能描述  : 查找一个复合语句的结束点
     输入参数  : hbuf    
                 ln      查询起始行
                 ichBeg  查询起始点
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
    }
    
    /*****************************************************************************
     函 数 名  : CheckBrace
     功能描述  : 检测括号的配对情况
     输入参数  : szLine       输入字符串
                 ichBeg       检测起始
                 ichEnd       检测结束
                 chBeg        开始字符(左括号)
                 chEnd        结束字符(右括号)
                 nCheckCount  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
    }
    
    /*****************************************************************************
     函 数 名  : InsertElse
     功能描述  : 插入else语句
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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)
    }
    
    /*****************************************************************************
     函 数 名  : InsertCase
     功能描述  : 插入case语句
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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()    
    }
    
    /*****************************************************************************
     函 数 名  : InsertSwitch
     功能描述  : 插入swich语句
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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()    
    }
    
    /*****************************************************************************
     函 数 名  : InsertMultiCaseProc
     功能描述  : 插入多个case
     输入参数  : hbuf     
                 szLeft   
                 nSwitch  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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()
    }
    
    /*****************************************************************************
     函 数 名  : GetSwitchVar
     功能描述  : 从枚举、宏定义取得case值
     输入参数  : szLine  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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] == "	")
           {
               newStr = cat(newStr,"    ")
           }
           else if(szLine[nIdx] < " ")
           {
               newStr = cat(newStr," ")           
           }
           else
           {
               newStr = cat(newStr," ")                      
           }
       }
    }
    */
    /*****************************************************************************
     函 数 名  : SkipCommentFromString
     功能描述  : 去掉注释的内容,将注释内容清为空格
     输入参数  : szLine        输入行的内容
                 isCommentEnd  是否但前行的开始已经是注释结束了
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
    }
    
    /*****************************************************************************
     函 数 名  : InsertDo
     功能描述  : 插入Do语句
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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()
    }
    
    /*****************************************************************************
     函 数 名  : InsertWhile
     功能描述  : 插入While语句
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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()
    }
    
    /*****************************************************************************
     函 数 名  : InsertFor
     功能描述  : 插入for语句
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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()
    }
    
    /*****************************************************************************
     函 数 名  : InsertIf
     功能描述  : 插入If语句
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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()
    }
    
    /*****************************************************************************
     函 数 名  : MergeString
     功能描述  : 将剪贴板中的语句合并成一行
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
    }
    
    /*****************************************************************************
     函 数 名  : ClearPrombleNo
     功能描述  : 清除问题单号
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro ClearPrombleNo()
    {
       SetReg ("PNO", "")
    }
    
    /*****************************************************************************
     函 数 名  : AddPromblemNo
     功能描述  : 添加问题单号
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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;
        }
    }*/
    
    /*****************************************************************************
     函 数 名  : ComentCPPtoC
     功能描述  : 转换C++注释为C注释
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年7月02日
        作    者   : 张强
        修改内容   : 新生成函数,支持块注释
    
    *****************************************************************************/
    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] != "	") )
                {
                    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
        }
    }
    
    /*****************************************************************************
     函 数 名  : CmtCvtLine
     功能描述  : 将//转换成/*注释
     输入参数  : lnCurrent  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 
        作    者   : 
        修改内容   : 
    
      2.日    期   : 2008年7月02日
        作    者   : 张强
        修改内容   : 修改了注释嵌套所产生的问题
    
    *****************************************************************************/
    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
    }
    
    /*****************************************************************************
     函 数 名  : GetFileNameExt
     功能描述  : 得到文件扩展名
     输入参数  : sz  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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 ""
    }
    
    /*****************************************************************************
     函 数 名  : GetFileNameNoExt
     功能描述  : 得到函数名没有扩展名
     输入参数  : sz  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
    }
    
    /*****************************************************************************
     函 数 名  : GetFileName
     功能描述  : 得到带扩展名的文件名
     输入参数  : sz  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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
    }
    
    /*****************************************************************************
     函 数 名  : InsIfdef
     功能描述  : 插入#ifdef语句
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro InsIfdef()
    {
        sz = Ask("Enter #ifdef condition:")
        if (sz != "")
            IfdefStr(sz);
    }
    
    /*****************************************************************************
     函 数 名  : InsIfndef
     功能描述  : #ifndef语句对插入的入口调用宏
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro InsIfndef()
    {
        sz = Ask("Enter #ifndef condition:")
        if (sz != "")
            IfndefStr(sz);
    }
    
    /*****************************************************************************
     函 数 名  : InsertCPP
     功能描述  : 在buf中插入C类型定义
     输入参数  : hbuf  
                 ln    
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro InsertCPP(hbuf,ln)
    {
        InsBufLine(hbuf, ln, "")
        InsBufLine(hbuf, ln, "#endif /* __cplusplus */")
        InsBufLine(hbuf, ln, "#endif")
        InsBufLine(hbuf, ln, "extern "C"{")
        InsBufLine(hbuf, ln, "#if __cplusplus")
        InsBufLine(hbuf, ln, "#ifdef __cplusplus")
        InsBufLine(hbuf, ln, "")
        
        iTotalLn = GetBufLineCount (hbuf)            
        InsBufLine(hbuf, iTotalLn, "")
        InsBufLine(hbuf, iTotalLn, "#endif /* __cplusplus */")
        InsBufLine(hbuf, iTotalLn, "#endif")
        InsBufLine(hbuf, iTotalLn, "}")
        InsBufLine(hbuf, iTotalLn, "#if __cplusplus")
        InsBufLine(hbuf, iTotalLn, "#ifdef __cplusplus")
        InsBufLine(hbuf, iTotalLn, "")
    }
    
    /*****************************************************************************
     函 数 名  : ReviseCommentProc
     功能描述  : 问题单修改命令处理
     输入参数  : hbuf      
                 ln        
                 szCmd     
                 szMyName  
                 szLine1   
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro ReviseCommentProc(hbuf,ln,szCmd,szMyName,szLine1)
    {
        if (szCmd == "ap")
        {   
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
            
            DelBufLine(hbuf, ln)
            szQuestion = AddPromblemNo()
            InsBufLine(hbuf, ln, "@szLine1@/* 问 题 单: @szQuestion@     修改人:@szMyName@,   时间:@sz@-@szMonth@-@szDay@ ");
            szContent = Ask("修改原因")
            szLeft = cat(szLine1,"   修改原因: ");
            if(strlen(szLeft) > 70)
            {
                Msg("The right margine is small, Please use a new line")
                stop 
            }
            ln = CommentContent(hbuf,ln + 1,szLeft,szContent,1)
            return
        }
        else if (szCmd == "ab")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
            
            DelBufLine(hbuf, ln)
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion)>0)
            {
                InsBufLine(hbuf, ln, "@szLine1@/* add begin by @szMyName@, @sz@-@szMonth@-@szDay@, Mantis号:@szQuestion@ */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* add begin by @szMyName@, @sz@-@szMonth@-@szDay@ */");        
            }
            return
        }
        else if (szCmd == "ae")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln)
            InsBufLine(hbuf, ln, "@szLine1@/* add end by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            return
        }
        else if (szCmd == "db")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln)
            szQuestion = GetReg ("PNO")
            if(strlen(szQuestion) > 0)
            {
                InsBufLine(hbuf, ln, "@szLine1@/* delete begin by @szMyName@, @sz@-@szMonth@-@szDay@, Mantis号:@szQuestion@ */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* delete begin by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            }
            
            return
        }
        else if (szCmd == "de")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln + 0)
            InsBufLine(hbuf, ln, "@szLine1@/* delete end by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            return
        }
        else if (szCmd == "mb")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln)
            szQuestion = GetReg ("PNO")
                if(strlen(szQuestion) > 0)
            {
                InsBufLine(hbuf, ln, "@szLine1@/* modify begin by @szMyName@, @sz@-@szMonth@-@szDay@, Mantis号:@szQuestion@ */");
            }
            else
            {
                InsBufLine(hbuf, ln, "@szLine1@/* modify begin by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            }
            return
        }
        else if (szCmd == "me")
        {
            SysTime = GetSysTime(1)
            sz=SysTime.Year
            sz1=SysTime.month
            sz3=SysTime.day
            if (sz1 < 10)
            {
                szMonth = "0@sz1@"
               }
               else
               {
                   szMonth = sz1
               }
               if (sz3 < 10)
            {
                szDay = "0@sz3@"
               }
               else
               {
                   szDay = sz3
               }
    
            DelBufLine(hbuf, ln)
            InsBufLine(hbuf, ln, "@szLine1@/* modify end by @szMyName@, @sz@-@szMonth@-@szDay@ */");
            return
        }
    }
    
    /*****************************************************************************
     函 数 名  : InsertReviseAdd
     功能描述  : 插入添加修改注释对
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro InsertReviseAdd()
    {
        hwnd = GetCurrentWnd()
        sel = GetWndSel(hwnd)
        hbuf = GetCurrentBuf()
        lnMax = GetBufLineCount(hbuf)
        language = getreg(LANGUAGE)
        if(language != 1)
        {
            language = 0
        }
        szMyName = getreg(MYNAME)
        if(strlen( szMyName ) == 0)
        {
            szMyName = Ask("Enter your name:")
            setreg(MYNAME, szMyName)
        }
        SysTime = GetSysTime(1)
        sz=SysTime.Year
        sz1=SysTime.month
        sz3=SysTime.day
        if (sz1 < 10)
        {
            szMonth = "0@sz1@"
           }
           else
           {
               szMonth = sz1
           }
           if (sz3 < 10)
        {
            szDay = "0@sz3@"
           }
           else
           {
               szDay = sz3
           }
           
        if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
        {
            szLeft = CreateBlankString(sel.ichFirst)
        }
        else
        {
            szLine = GetBufLine( hbuf, sel.lnFirst )    
            nLeft = GetLeftBlank(szLine)
            szLeft = strmid(szLine,0,nLeft);
        }
        szQuestion = GetReg ("PNO")
        if(strlen(szQuestion)>0)
        {
            InsBufLine(hbuf, sel.lnFirst, "@szLeft@/* add begin by @szMyName@, @sz@-@szMonth@-@szDay@, Mantis号:@szQuestion@ */");
        }
        else
        {
            InsBufLine(hbuf, sel.lnFirst, "@szLeft@/* add begin by @szMyName@, @sz@-@szMonth@-@szDay@ */";        
        }
    
        if(sel.lnLast < lnMax - 1)
        {
            InsBufLine(hbuf, sel.lnLast + 2, "@szLeft@/* add end by @szMyName@, @sz@-@szMonth@-@szDay@ */");            
        }
        else
        {
            AppendBufLine(hbuf, "@szLeft@/* add end by @szMyName@, @sz@-@szMonth@-@szDay@ */");                        
        }
        SetBufIns(hbuf,sel.lnFirst + 1,strlen(szLeft))
    }
    
    /*****************************************************************************
     函 数 名  : InsertReviseDel
     功能描述  : 插入删除修改注释对
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro InsertReviseDel()
    {
        hwnd = GetCurrentWnd()
        sel = GetWndSel(hwnd)
        hbuf = GetCurrentBuf()
        lnMax = GetBufLineCount(hbuf)
        language = getreg(LANGUAGE)
        if(language != 1)
        {
            language = 0
        }
        szMyName = getreg(MYNAME)
        if(strlen( szMyName ) == 0)
        {
            szMyName = Ask("Enter your name:")
            setreg(MYNAME, szMyName)
        }
        SysTime = GetSysTime(1)
        sz=SysTime.Year
        sz1=SysTime.month
        sz3=SysTime.day
        if (sz1 < 10)
        {
            szMonth = "0@sz1@"
           }
           else
           {
               szMonth = sz1
           }
           if (sz3 < 10)
        {
            szDay = "0@sz3@"
           }
           else
           {
               szDay = sz3
           }
        if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
        {
            szLeft = CreateBlankString(sel.ichFirst)
        }
        else
        {
            szLine = GetBufLine( hbuf, sel.lnFirst )    
            nLeft = GetLeftBlank(szLine)
            szLeft = strmid(szLine,0,nLeft);
        }
        szQuestion = GetReg ("PNO")
        if(strlen(szQuestion)>0)
        {
            InsBufLine(hbuf, sel.lnFirst, "@szLeft@/* delete begin by @szMyName@, @sz@-@szMonth@-@szDay@, Mantis号:@szQuestion@*/");
        }
        else
        {
            InsBufLine(hbuf, sel.lnFirst, "@szLeft@/* delete begin by @szMyName@, @sz@-@szMonth@-@szDay@ */");        
        }
    
        if(sel.lnLast < lnMax - 1)
        {
            InsBufLine(hbuf, sel.lnLast + 2, "@szLeft@/* delete end by @szMyName@, @sz@-@szMonth@-@szDay@ */");            
        }
        else
        {
            AppendBufLine(hbuf, "@szLeft@/* delete end by @szMyName@, @sz@-@szMonth@-@szDay@ */");                        
        }
        SetBufIns(hbuf,sel.lnFirst + 1,strlen(szLeft))
    }
    
    /*****************************************************************************
     函 数 名  : InsertReviseMod
     功能描述  : 插入修改注释对
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro InsertReviseMod()
    {
        hwnd = GetCurrentWnd()
        sel = GetWndSel(hwnd)
        hbuf = GetCurrentBuf()
        lnMax = GetBufLineCount(hbuf)
        language = getreg(LANGUAGE)
        if(language != 1)
        {
            language = 0
        }
        szMyName = getreg(MYNAME)
        if(strlen( szMyName ) == 0)
        {
            szMyName = Ask("Enter your name:")
            setreg(MYNAME, szMyName)
        }
        SysTime = GetSysTime(1)
        sz=SysTime.Year
        sz1=SysTime.month
        sz3=SysTime.day
        if (sz1 < 10)
        {
            szMonth = "0@sz1@"
           }
           else
           {
               szMonth = sz1
           }
           if (sz3 < 10)
        {
            szDay = "0@sz3@"
           }
           else
           {
               szDay = sz3
           }
           //得到光标所选的字符左侧的空白部分,保存在szLeft中,目的是保证缩进
        if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
        {
            szLeft = CreateBlankString(sel.ichFirst)
        }
        else
        {
            szLine = GetBufLine( hbuf, sel.lnFirst )    
            nLeft = GetLeftBlank(szLine)
            szLeft = strmid(szLine,0,nLeft);
        }
        szQuestion = GetReg ("PNO")
        if(strlen(szQuestion)>0)
        {
            InsBufLine(hbuf, sel.lnFirst, "@szLeft@/* modify begin by @szMyName@, @sz@-@szMonth@-@szDay@, Mantis号:@szQuestion@ */");
        }
        else
        {
            InsBufLine(hbuf, sel.lnFirst, "@szLeft@/* modify begin by @szMyName@, @sz@-@szMonth@-@szDay@ */");        
        }
    
        if(sel.lnLast < lnMax - 1)
        {
            InsBufLine(hbuf, sel.lnLast + 2, "@szLeft@/* modify end by @szMyName@, @sz@-@szMonth@-@szDay@ */");            
        }
        else
        {
            AppendBufLine(hbuf, "@szLeft@/* modif end by @szMyName@, @sz@-@szMonth@-@szDay@ */");                        
        }
        SetBufIns(hbuf,sel.lnFirst + 1,strlen(szLeft))
    }
    
    // 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))
    }
    
    /*****************************************************************************
     函 数 名  : IfndefStr
     功能描述  : 插入#ifndef语句对
     输入参数  : sz  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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))
    }
    
    
    /*****************************************************************************
     函 数 名  : InsertPredefIf
     功能描述  : 插入#if语句对的入口调用宏
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro InsertPredefIf()
    {
        sz = Ask("Enter #if condition:")
        PredefIfStr(sz)
    }
    
    /*****************************************************************************
     函 数 名  : PredefIfStr
     功能描述  : 在选择行前后插入#if语句对
     输入参数  : sz  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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))
    }
    
    
    /*****************************************************************************
     函 数 名  : HeadIfdefStr
     功能描述  : 在选择行前后插入#ifdef语句对
     输入参数  : sz  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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, "")
    }
    
    /*****************************************************************************
     函 数 名  : GetSysTime
     功能描述  : 取得系统时间,只在V2.1时有用
     输入参数  : a  
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月24日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro GetSysTime(a)
    {
        //从sidate取得时间
        RunCmd ("sidate")
        SysTime=""
        SysTime.Year=getreg(Year)
        if(strlen(SysTime.Year)==0)
        {
            setreg(Year,"2008")
            setreg(Month,"05")
            setreg(Day,"02")
            SysTime.Year="2008"
            SysTime.month="05"
            SysTime.day="20"
            SysTime.Date="2008年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
    }
    
    /*****************************************************************************
     函 数 名  : HeaderFileCreate
     功能描述  : 生成头文件
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    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)
    }
    
    /*****************************************************************************
     函 数 名  : FunctionHeaderCreate
     功能描述  : 生成函数头
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro FunctionHeaderCreate()
    {
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        sel = GetWndSel(hwnd)
        ln = sel.lnFirst
        hbuf = GetWndBuf(hwnd)
        language = getreg(LANGUAGE)
        if(language != 1)
        {
            language = 0
        }
        szMyName = getreg(MYNAME)
        if(strlen( szMyName ) == 0)
        {
            szMyName = Ask("Enter your name:")
            setreg(MYNAME, szMyName)
        }
        nVer = GetVersion()
        lnMax = GetBufLineCount(hbuf)
        if(ln != lnMax)
        {
            szNextLine = GetBufLine(hbuf,ln)
            if( (strstr(szNextLine,"(") != 0xffffffff) || (nVer != 2 ))
            {
                symbol = GetCurSymbol()
                if(strlen(symbol) != 0)
                {  
                    if(language == 0)
                    {
                        FuncHeadCommentCN(hbuf, ln, symbol, szMyName,0)
                    }
                    else
                    {                
                        FuncHeadCommentEN(hbuf, ln, symbol, szMyName,0)
                    }
                    return
                }
            }
        }
        if(language == 0 )
        {
            szFuncName = Ask("请输入函数名称:")
                FuncHeadCommentCN(hbuf, ln, szFuncName, szMyName, 1)
        }
        else
        {
            szFuncName = Ask("Please input function name")
               FuncHeadCommentEN(hbuf, ln, szFuncName, szMyName, 1)
        
        }
    }
    
    /*****************************************************************************
     函 数 名  : GetVersion
     功能描述  : 得到Si的版本号
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro GetVersion()
    {
       Record = GetProgramInfo ()
       return Record.versionMajor
    }
    
    /*****************************************************************************
     函 数 名  : GetProgramInfo
     功能描述  : 获得程序信息,V2.1才用
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro GetProgramInfo ()
    {   
        Record = ""
        Record.versionMajor     = 2
        Record.versionMinor    = 1
        return Record
    }
    
    /*****************************************************************************
     函 数 名  : FileHeaderCreate
     功能描述  : 生成文件头
     输出参数  : 无
     返 回 值  : 
     调用函数  : 
     被调函数  : 
     
     修改历史      :
      1.日    期   : 2008年6月19日
        作    者   : 张强
        修改内容   : 新生成函数
    
    *****************************************************************************/
    macro FileHeaderCreate()
    {
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        ln = 0
        hbuf = GetWndBuf(hwnd)
        language = getreg(LANGUAGE)
        if(language != 1)
        {
            language = 0
        }
        szMyName = getreg(MYNAME)
        if(strlen( szMyName ) == 0)
        {
            szMyName = Ask("Enter your name:")
            setreg(MYNAME, szMyName)
        }
           SetBufIns (hbuf, 0, 0)
        if(language == 0)
        {
            InsertFileHeaderCN( hbuf,ln, szMyName,"" )
        }
        else
        {
            InsertFileHeaderEN( hbuf,ln, szMyName,"" )
        }
    }

    代码非原创,如有侵权,请联系删除

  • 相关阅读:
    Android的读写文件及权限设置
    surfaceView和View的区别
    git的常见问题
    APP的缓存文件放在哪里?
    AndroidStudio遇到过的问题
    订单和支付状态不同步解决方法
    支付宝支付不成功原因
    格式化输出%s和%S的区别
    Android SDK更新下载失败以及Studio首次安装取消自动下载SDK
    SPOJ 104 HIGH
  • 原文地址:https://www.cnblogs.com/hwli/p/10163729.html
Copyright © 2011-2022 走看看