macro AutoExpand()
{
hwnd = GetCurrentWnd()
if(hwnd == 0)
stop
sel = GetWndSel(hwnd)
if(sel.lnFirst != sel.lnLast)
{
BlockCommandProc()
}
if (sel.ichFirst == 0)
stop
hbuf = GetWndBuf(hwnd)
/* get user name */
language = getreg(LANGUAGE)
if(language != 1)
{
language = 0
}
nVer = 0
nVer = GetVersion()
/* get user name */
szMyName = getreg(MYNAME)
if(strlen( szMyName ) == 0)
{
szMyName = Ask("Enter your name:")
setreg(MYNAME, szMyName)
}
/* get line the selection (insertion point) is on */
szLine = GetBufLine(hbuf, sel.lnFirst);
/* parse word just to the left of the insertion point */
wordinfo = GetWordLeftOfIch(sel.ichFirst, szLine)
ln = sel.lnFirst;
chTab = CharFromAscii(9);
/*
prepare a new indented blank line to be inserted.
keep white space on left and add a tab to indent.
this preserves the indentation level.
*/
chSpace = CharFromAscii(32);
ich = 0;
while (szLine[ich] == chSpace || szLine[ich] == chTab)
{
ich = ich + 1;
}
szLine1 = strmid(szLine, 0, ich);
szLine = strmid(szLine, 0, ich) # " ";
sel.lnFirst = sel.lnLast;
sel.ichFirst = wordinfo.ich;
sel.ichLim = wordinfo.ich;
/* custom-command deal */
wordinfo.szWord = RestoreCommand(hbuf, wordinfo.szWord);
sel = GetWndSel(hwnd);
/* config command */
if (wordinfo.szWord == "config" || wordinfo.szWord == "co")
{
DelBufLine(hbuf, ln);
ConfigureSystem();
return;
}
/* intsert new modified-record history */
else if (wordinfo.szWord == "hi")
{
DelBufLine(hbuf, ln);
InsertHistory(hbuf,ln,language);
return;
}
else if (wordinfo.szWord == "retval" || wordinfo.szWord == "rv")
{
DelBufLine(hbuf, ln);
szRetval = Ask("please input return value and comment,example: 0 sucess");
InsBufLine(hbuf, ln, " * @@retval @szRetval@");
return;
}
else if (wordinfo.szWord == "ngroup" || wordinfo.szWord == "ngr")
{
InsertGroupDefination(hbuf,ln);
return;
}
else if (wordinfo.szWord == "name")
{
DelBufLine(hbuf, ln);
InsertNameDefination(hbuf, ln);
return;
}
ExpandProcCN(szMyName,wordinfo,szLine,szLine1,nVer,ln,sel);
}
macro InsertGroupDefination(hbuf, ln)
{
i = 0;
InsBufLine(hbuf, ln + i, "/** ");
i = i + 1;
mContent = Ask("请输入模块名称");
noteContent = Ask("请输入模块描述信息");
InsBufLine(hbuf, ln + i, " * @@defgroup @mContent@")
i = i + 1
InsBufLine(hbuf, ln + i, " * @@brief @noteContent@")
i = i + 1
InsBufLine(hbuf, ln + i, " * @@{")
i = i + 1
InsBufLine(hbuf, ln + i, " */")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
InsBufLine(hbuf, ln + i, "/** @@}*/")
i = i + 1
InsBufLine(hbuf, ln + i, "")
}
macro InsertNameDefination(hbuf, ln)
{
i = 0;
InsBufLine(hbuf, ln + i, "/** ");
i = i + 1;
mContent = Ask("请输入分组名称");
noteContent = Ask("请输入模块描述信息");
InsBufLine(hbuf, ln + i, " * @@name : @mContent@")
i = i + 1
InsBufLine(hbuf, ln + i, " */")
}
macro ExpandProcCN(szMyName,wordinfo,szLine,szLine1,nVer,ln,sel)
{
szCmd = wordinfo.szWord;
hwnd = GetCurrentWnd();
if (hwnd == 0)
stop;
hbuf = GetWndBuf(hwnd);
if (szCmd == "/*")
{
// 判断当前行数据长度
if(wordinfo.ichLim > 70)
{
Msg("右边空间太小,请用新的行")
stop
}
szCurLine = GetBufLine(hbuf, sel.lnFirst);
szLeft = strmid(szCurLine,0,wordinfo.ichLim)
lineLen = strlen(szCurLine)
kk = 0
/*注释只能在行尾,避免注释掉有用代码*/
while(wordinfo.ichLim + kk < lineLen)
{
if(szCurLine[wordinfo.ichLim + kk] != " ")
{
msg("只能在行尾或空行插入");
return;
}
kk = kk + 1
}
// 判断是否为空行,根据空行来判断加什么样的注释
kk =0
while(kk < (lineLen-2))
{
if(szCurLine[kk] != " ")
{
break;
}
kk = kk + 1;
}
// 空行加的注释为"/** 注释 */"
if(kk == (lineLen - 2))
{
szLeft = cat( szLeft, "*")
}
// 非空行,根据行尾符号判断增加什么样的注释
else if(kk < (lineLen-2))
{
kk = wordinfo.ich - 1;
while(kk >= 0)
{
if((szCurLine[kk] != " " )&&( szCurLine[kk] != "\t" ))
{
// 行尾为";"时添加注释为"/**< 注释 */"
if(szCurLine[kk] == ";" || szCurLine[kk] == ")")
{
szLeft = cat( szLeft, "*<")
}
// 行尾为非";"时添加注释为"/** 注释 */"
else
{
szLeft = cat( szLeft, "*")
}
break;
}
kk = kk - 1;
}
}
szContent = Ask("请输入注释的内容");
DelBufLine(hbuf, ln);
CommentContent(hbuf,ln,szLeft,szContent,1);
return;
}
// 另一种注释形式
else if (szCmd == "//")
{
// 判断当前行数据长度
if(wordinfo.ichLim > 70)
{
Msg("右边空间太小,请用新的行");
stop;
}
szCurLine = GetBufLine(hbuf, sel.lnFirst);
szLeft = strmid(szCurLine,0,wordinfo.ichLim);
lineLen = strlen(szCurLine);
kk = 0;
/*注释只能在行尾,避免注释掉有用代码*/
while(wordinfo.ichLim + kk < lineLen)
{
if(szCurLine[wordinfo.ichLim + kk] != " ")
{
msg("只能在行尾或空行插入");
return;
}
kk = kk + 1;
}
// 判断是否为空行,根据空行来判断加什么样的注释
kk = 0;
while(kk < (lineLen-2))
{
if(szCurLine[kk] != " ")
{
break;
}
kk = kk + 1;
}
Flag = 0;
// 空行加的注释为"///"
if(kk == (lineLen-2))
{
szLeft = cat( szLeft, "/");
}
// 非空行,根据行尾符号判断增加什么样的注释
else if(kk < (lineLen-2))
{
kk = wordinfo.ich - 1;
while(kk >= 0)
{
if(szCurLine[kk] != " " && szCurLine[kk] != "\t")
{
// 行首为#时只能增加"///< 注释"
if(szCurLine[00] == "#")
{
szLeft = cat( szLeft, "/<");
}
// 行尾为";"时添加注释为"/**< 注释 */"
else if(szCurLine[kk] == ")")
{
szLeft = cat( szLeft, "/<");
}
// 行尾为非";"时添加注释为"/** 注释 */"
else
{
szLeft = strmid(szLeft,0,lineLen-1);
szLeft = cat( szLeft, "**<");
Flag = 1;
}
break;
}
kk = kk - 1;
}
}
szLeft = cat( szLeft, " " );
szContent = Ask("请输入注释的内容");
DelBufLine(hbuf, ln);
lnnew = CommentContent(hbuf,ln,szLeft,szContent,1);
if(lnnew > ln)
{
// 删除已添加注释及当前行
while(lnnew >= ln)
{
DelBufLine(hbuf, lnnew);
lnnew = lnnew - 1;
}
// 插入当前行
szLeft = strmid(szLeft,0,lineLen-2);
InsBufLine(hbuf, ln, "@szLeft@");
// 计算当前行缩进
k = 0;
iLen = strlen(szLeft);
while(k < iLen)
{
if(szLeft[k] != " ")
{
break;
}
else
{
k = k + 1;
}
}
szLeft = strmid(szLeft,0,k);
// 当前行上方插入注释
if(szBugId == " ")
{
szLeft = cat( szLeft, "/** " );
}
else
{
szLeft = cat(szLeft, "/** JIRA-");
szLeft = cat( szLeft, szBugId);
szLeft = cat( szLeft, ": " );
}
CommentContent(hbuf,ln,szLeft,szContent,1);
}
// 以非";",非")"结束行的注释转换为/**< */
else if(Flag == 1)
{
DelBufLine(hbuf, ln);
CommentContent(hbuf,ln,szLeft,szContent,1);
}
else
{
DelBufLine(hbuf, ln);
InsBufLine(hbuf, ln, "@szLeft@@szContent@");
}
return;
}
else if(szCmd == "{")
{
InsBufLine(hbuf, ln + 1, "@szLine@");
InsBufLine(hbuf, ln + 2, "@szLine1@" # "}");
SetBufIns (hbuf, ln + 1, strlen(szLine));
return;
}
else if (szCmd == "while" || szCmd == "wh")
{
SetBufSelText(hbuf, "( # )");
InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
}
else if( szCmd == "else" || szCmd == "el")
{
InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
InsBufLine(hbuf, ln + 2, "@szLine@");
InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
SetBufIns (hbuf, ln + 2, strlen(szLine));
return;
}
else if (szCmd == "#ifd" || szCmd == "#ifdef") //#ifdef
{
DelBufLine(hbuf, ln);
InsIfdef();
return;
}
else if (szCmd == "#ifn" || szCmd == "#ifndef") //#ifdef
{
DelBufLine(hbuf, ln);
InsIfndef();
return;
}
else if (szCmd == "#if")
{
DelBufLine(hbuf, ln);
InsertPredefIf();
return;
}
else if (szCmd == "if")
{
SetBufSelText(hbuf, "( # )");
InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
}
else if (szCmd == "ef")
{
PutBufLine(hbuf, ln, szLine1 # "else if( # )");
InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
}
else if (szCmd == "ife")
{
PutBufLine(hbuf, ln, szLine1 # "if( # )");
InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
InsBufLine(hbuf, ln + 4, "@szLine1@" # "else");
InsBufLine(hbuf, ln + 5, "@szLine1@" # "{");
InsBufLine(hbuf, ln + 6, "@szLine@" # ";");
InsBufLine(hbuf, ln + 7, "@szLine1@" # "}");
}
else if (szCmd == "ifs")
{
PutBufLine(hbuf, ln, szLine1 # "if( # )");
InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
InsBufLine(hbuf, ln + 4, "@szLine1@" # "else if( # )");
InsBufLine(hbuf, ln + 5, "@szLine1@" # "{");
InsBufLine(hbuf, ln + 6, "@szLine@" # ";");
InsBufLine(hbuf, ln + 7, "@szLine1@" # "}");
InsBufLine(hbuf, ln + 8, "@szLine1@" # "else");
InsBufLine(hbuf, ln + 9, "@szLine1@" # "{");
InsBufLine(hbuf, ln + 10, "@szLine@" # ";");
InsBufLine(hbuf, ln + 11, "@szLine1@" # "}");
}
else if (szCmd == "for")
{
SetBufSelText(hbuf, "( # ; # ; # )");
InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
SetWndSel(hwnd, sel);
SearchForward();
szVar = ask("请输入循环变量");
newsel = sel;
newsel.ichLim = GetBufLineLength (hbuf, ln);
SetWndSel(hwnd, newsel);
SetBufSelText(hbuf, " ( @szVar@ = # ; @szVar@ # ; @szVar@++ )");
}
else if (szCmd == "fo")
{
SetBufSelText(hbuf, "r( ulI = 0; ulI < # ; ulI++ )");
InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
InsBufLine(hbuf, ln + 3, "@szLine1@" # "}");
symname = GetCurSymbol();
symbol = GetSymbolLocation(symname);
if(strlen(symbol) > 0)
{
nIdx = symbol.lnName + 1;
while( 1 )
{
szCurLine = GetBufLine(hbuf, nIdx);
nRet = strstr(szCurLine,"{");
if( nRet != 0xffffffff )
{
break;
}
nIdx = nIdx + 1;
if(nIdx > symbol.lnLim)
{
break;
}
}
InsBufLine(hbuf, nIdx + 1, " UINT32_T ulI = 0;");
}
}
else if (szCmd == "switch" || szCmd == "sw")
{
nSwitch = ask("请输入case的个数");
SetBufSelText(hbuf, "( # )");
InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
InsertMultiCaseProc(hbuf,szLine1,nSwitch);
}
else if (szCmd == "do")
{
InsBufLine(hbuf, ln + 1, "@szLine1@" # "{");
InsBufLine(hbuf, ln + 2, "@szLine@" # "#");
InsBufLine(hbuf, ln + 3, "@szLine1@" # "} while( # );");
}
else if (szCmd == "case" || szCmd == "ca" )
{
SetBufSelText(hbuf, " # :");
InsBufLine(hbuf, ln + 1, "@szLine@" # "#");
InsBufLine(hbuf, ln + 2, "@szLine@" # "break;");
}
else if (szCmd == "struct" || szCmd == "st")
{
DelBufLine(hbuf, ln);
//szStructName = toupper(Ask("请输入结构名:"));
szStructName = Ask("请输入结构名:");
InsBufLine(hbuf, ln, "@szLine1@typedef struct");
InsBufLine(hbuf, ln + 1, "@szLine1@{");
InsBufLine(hbuf, ln + 2, "@szLine@ ");
szStructName = cat(szStructName,"_t");
InsBufLine(hbuf, ln + 3, "@szLine1@}@szStructName@;");
SetBufIns (hbuf, ln + 2, strlen(szLine));
return;
}
else if (szCmd == "union" || szCmd == "un" )
{
DelBufLine(hbuf, ln);
szUnionName = Ask("请输入联合体名:");
//szUnionName = toupper(Ask("请输入联合体名:"));
InsBufLine(hbuf, ln, "@szLine1@typedef union");
InsBufLine(hbuf, ln + 1, "@szLine1@{");
InsBufLine(hbuf, ln + 2, "@szLine@ ");
szUnionName = cat(szUnionName,"_u");
InsBufLine(hbuf, ln + 3, "@szLine1@}@szUnionName@;");
SetBufIns (hbuf, ln + 2, strlen(szLine));
return;
}
else if (szCmd == "enum" || szCmd == "en")
{
DelBufLine(hbuf, ln);
//szStructName = toupper(Ask("请输入枚举名:"));
szStructName = Ask("请输入枚举名:");
InsBufLine(hbuf, ln, "@szLine1@typedef enum");
InsBufLine(hbuf, ln + 1, "@szLine1@{");
InsBufLine(hbuf, ln + 2, "@szLine@ ");
szStructName = cat(szStructName,"_e");
InsBufLine(hbuf, ln + 3, "@szLine1@}@szStructName@;");
SetBufIns (hbuf, ln + 2, strlen(szLine));
return;
}
else if (szCmd == "file" || szCmd == "fi")
{
DelBufLine(hbuf, ln);
/*生成文件头说明*/
InsertFileHeaderCN( hbuf,0, szMyName,"" );
return;
}
else if (szCmd == "hd")
{
DelBufLine(hbuf, ln);
/*生成C语言的头文件*/
CreateFunctionDef(hbuf,szMyName,0);
return;
}
else if (szCmd == "hdn")
{
DelBufLine(hbuf, ln);
/*生成不要文件名的新头文件*/
CreateNewHeaderFile();
return;
}
else if (szCmd == "func" || szCmd == "fu")
{
DelBufLine(hbuf,ln);
lnMax = GetBufLineCount(hbuf);
if(ln != lnMax)
{
/*是已经存在的函数*/
symbol = GetCurSymbol();
if(strlen(symbol) != 0)
{
FuncHeadCommentCN(hbuf, ln, symbol, szMyName,0);
return;
}
}
szFuncName = Ask("请输入函数名称:");
/*是新函数*/
FuncHeadCommentCN(hbuf, ln, szFuncName, szMyName, 1);
}
else if (szCmd == "tab") /*将tab扩展为空格*/
{
DelBufLine(hbuf, ln);
ReplaceBufTab();
}
else
{
SearchForward();
stop;
}
SetWndSel(hwnd, sel);
SearchForward();
}
macro BlockCommandProc()
{
hwnd = GetCurrentWnd()
if (hwnd == 0)
stop
sel = GetWndSel(hwnd)
hbuf = GetWndBuf(hwnd)
if(sel.lnFirst > 0)
{
ln = sel.lnFirst - 1
}
else
{
stop
}
szLine = GetBufLine(hbuf,ln)
szLine = TrimString(szLine)
if(szLine == "while" || szLine == "wh")
{
InsertWhile() /*插入while*/
}
else if(szLine == "do")
{
InsertDo() //插入do while语句
}
else if(szLine == "for")
{
InsertFor() //插入for语句
}
else if(szLine == "if")
{
InsertIf() //插入if语句
}
else if(szLine == "el" || szLine == "else")
{
InsertElse() //插入else语句
DelBufLine(hbuf,ln)
stop
}
else if((szLine == "#ifd") || (szLine == "#ifdef"))
{
InsIfdef() //插入#ifdef
DelBufLine(hbuf,ln)
stop
}
else if((szLine == "#ifn") || (szLine == "#ifndef"))
{
InsIfndef() //插入#ifdef
DelBufLine(hbuf,ln)
stop
}
else if(szLine == "#if")
{
InsertPredefIf()
DelBufLine(hbuf,ln)
stop
}
DelBufLine(hbuf,ln)
SearchForward()
stop
}
macro RestoreCommand(hbuf,szCmd)
{
if(szCmd == "ca")
{
SetBufSelText(hbuf, "se")
szCmd = "case"
}
else if(szCmd == "sw")
{
SetBufSelText(hbuf, "itch")
szCmd = "switch"
}
else if(szCmd == "el")
{
SetBufSelText(hbuf, "se")
szCmd = "else"
}
else if(szCmd == "wh")
{
SetBufSelText(hbuf, "ile")
szCmd = "while"
}
return szCmd
}
macro SearchForward()
{
LoadSearchPattern("#", 1, 0, 1);
Search_Forward
}
macro SearchBackward()
{
LoadSearchPattern("#", 1, 0, 1);
Search_Backward
}
macro InsertFuncName()
{
hwnd = GetCurrentWnd()
if (hwnd == 0)
stop
sel = GetWndSel(hwnd)
hbuf = GetWndBuf(hwnd)
symbolname = GetCurSymbol()
SetBufSelText (hbuf, symbolname)
}
macro strstr(str1,str2)
{
i = 0
j = 0
len1 = strlen(str1)
len2 = strlen(str2)
if((len1 == 0) || (len2 == 0))
{
return 0xffffffff
}
while( i < len1)
{
if(str1[i] == str2[j])
{
while(j < len2)
{
j = j + 1
if(str1[i+j] != str2[j])
{
break
}
}
if(j == len2)
{
return i
}
j = 0
}
i = i + 1
}
return 0xffffffff
}
macro InsertTraceInfo()
{
hwnd = GetCurrentWnd()
if (hwnd == 0)
stop
hbuf = GetWndBuf(hwnd)
sel = GetWndSel(hwnd)
symbol = GetSymbolLocationFromLn(hbuf, sel.lnFirst)
InsertTraceInCurFunction(hbuf,symbol)
}
macro InsertTraceInCurFunction(hbuf,symbol)
{
ln = GetBufLnCur (hbuf)
symbolname = symbol.Symbol
nLineEnd = symbol.lnLim
nExitCount = 1;
InsBufLine(hbuf, ln, " DebugTrace(\"\\r\\n |@symbolname@() entry--- \");")
ln = ln + 1
fIsEnd = 1
fIsNeedPrt = 1
fIsSatementEnd = 1
szLeftOld = ""
while(ln < nLineEnd)
{
szLine = GetBufLine(hbuf, ln)
iCurLineLen = strlen(szLine)
/*剔除其中的注释语句*/
RetVal = SkipCommentFromString(szLine,fIsEnd)
szLine = RetVal.szContent
fIsEnd = RetVal.fIsEnd
//查找是否有return语句
/* ret =strstr(szLine,"return")
if(ret != 0xffffffff)
{
if( (szLine[ret+6] == " " ) || (szLine[ret+6] == "\t" )
|| (szLine[ret+6] == ";" ) || (szLine[ret+6] == "(" ))
{
szPre = strmid(szLine,0,ret)
}
SetBufIns(hbuf,ln,ret)
Paren_Right
sel = GetWndSel(hwnd)
if( sel.lnLast != ln )
{
GetbufLine(hbuf,sel.lnLast)
RetVal = SkipCommentFromString(szLine,1)
szLine = RetVal.szContent
fIsEnd = RetVal.fIsEnd
}
}*/
//获得左边空白大小
nLeft = GetLeftBlank(szLine)
if(nLeft == 0)
{
szLeft = " "
}
else
{
szLeft = strmid(szLine,0,nLeft)
}
szLine = TrimString(szLine)
iLen = strlen(szLine)
if(iLen == 0)
{
ln = ln + 1
continue
}
szRet = GetFirstWord(szLine)
// if( (szRet == "if") || (szRet == "else")
//查找是否有return语句
// ret =strstr(szLine,"return")
if( szRet == "return")
{
if( fIsSatementEnd == 0)
{
fIsNeedPrt = 1
InsBufLine(hbuf,ln+1,"@szLeftOld@}")
szEnd = cat(szLeft,"DebugTrace(\"\\r\\n |@symbolname@() exit---: @nExitCount@ \");")
InsBufLine(hbuf, ln, szEnd )
InsBufLine(hbuf,ln,"@szLeftOld@{")
nExitCount = nExitCount + 1
nLineEnd = nLineEnd + 3
ln = ln + 3
}
else
{
fIsNeedPrt = 0
szEnd = cat(szLeft,"DebugTrace(\"\\r\\n |@symbolname@() exit---: @nExitCount@ \");")
InsBufLine(hbuf, ln, szEnd )
nExitCount = nExitCount + 1
nLineEnd = nLineEnd + 1
ln = ln + 1
}
}
else
{
ret =strstr(szLine,"}")
if( ret != 0xffffffff )
{
fIsNeedPrt = 1
}
}
szLeftOld = szLeft
ch = szLine[iLen-1]
if( ( ch == ";" ) || ( ch == "{" )
|| ( ch == ":" )|| ( ch == "}" ) || ( szLine[0] == "#" ))
{
fIsSatementEnd = 1
}
else
{
fIsSatementEnd = 0
}
ln = ln + 1
}
//只要前面的return后有一个}了说明函数的结尾没有返回,需要再加一个出口打印
if(fIsNeedPrt == 1)
{
InsBufLine(hbuf, ln, " DebugTrace(\"\\r\\n |@symbolname@() exit---: @nExitCount@ \");")
InsBufLine(hbuf, ln, "")
}
}
macro GetFirstWord(szLine)
{
szLine = TrimLeft(szLine)
nIdx = 0
iLen = strlen(szLine)
while(nIdx < iLen)
{
if( (szLine[nIdx] == " ") || (szLine[nIdx] == "\t")
|| (szLine[nIdx] == ";") || (szLine[nIdx] == "(")
|| (szLine[nIdx] == ".") || (szLine[nIdx] == "{")
|| (szLine[nIdx] == ",") || (szLine[nIdx] == ":") )
{
return strmid(szLine,0,nIdx)
}
nIdx = nIdx + 1
}
return ""
}
macro AutoInsertTraceInfoInBuf()
{
hwnd = GetCurrentWnd()
if (hwnd == 0)
stop
sel = GetWndSel(hwnd)
hbuf = GetWndBuf(hwnd)
isymMax = GetBufSymCount(hbuf)
isym = 0
while (isym < isymMax)
{
symbol = GetBufSymLocation(hbuf, isym)
isCodeBegin = 0
fIsEnd = 1
isBlandLine = 0
if(strlen(symbol) > 0)
{
if(symbol.Type == "Class Placeholder")
{
hsyml = SymbolChildren(symbol)
cchild = SymListCount(hsyml)
ichild = 0
while (ichild < cchild)
{
symbol = GetBufSymLocation(hbuf, isym)
hsyml = SymbolChildren(symbol)
childsym = SymListItem(hsyml, ichild)
ln = childsym.lnName
isCodeBegin = 0
fIsEnd = 1
isBlandLine = 0
while( ln < childsym.lnLim )
{
szLine = GetBufLine (hbuf, ln)
//去掉注释的干扰
RetVal = SkipCommentFromString(szLine,fIsEnd)
szNew = RetVal.szContent
fIsEnd = RetVal.fIsEnd
if(isCodeBegin == 1)
{
szNew = TrimLeft(szNew)
//检测是否是可执行代码开始
iRet = CheckIsCodeBegin(szNew)
if(iRet == 1)
{
if( isBlandLine != 0 )
{
ln = isBlandLine
}
InsBufLine(hbuf,ln,"")
childsym.lnLim = childsym.lnLim + 1
SetBufIns(hbuf, ln+1 , 0)
InsertTraceInCurFunction(hbuf,childsym)
break
}
if(strlen(szNew) == 0)
{
if( isBlandLine == 0 )
{
isBlandLine = ln;
}
}
else
{
isBlandLine = 0
}
}
//查找到函数的开始
if(isCodeBegin == 0)
{
iRet = strstr(szNew,"{")
if(iRet != 0xffffffff)
{
isCodeBegin = 1
}
}
ln = ln + 1
}
ichild = ichild + 1
}
SymListFree(hsyml)
}
else if( ( symbol.Type == "Function") || (symbol.Type == "Method") )
{
ln = symbol.lnName
while( ln < symbol.lnLim )
{
szLine = GetBufLine (hbuf, ln)
//去掉注释的干扰
RetVal = SkipCommentFromString(szLine,fIsEnd)
szNew = RetVal.szContent
fIsEnd = RetVal.fIsEnd
if(isCodeBegin == 1)
{
szNew = TrimLeft(szNew)
//检测是否是可执行代码开始
iRet = CheckIsCodeBegin(szNew)
if(iRet == 1)
{
if( isBlandLine != 0 )
{
ln = isBlandLine
}
SetBufIns(hbuf, ln , 0)
InsertTraceInCurFunction(hbuf,symbol)
InsBufLine(hbuf,ln,"")
break
}
if(strlen(szNew) == 0)
{
if( isBlandLine == 0 )
{
isBlandLine = ln;
}
}
else
{
isBlandLine = 0
}
}
//查找到函数的开始
if(isCodeBegin == 0)
{
iRet = strstr(szNew,"{")
if(iRet != 0xffffffff)
{
isCodeBegin = 1
}
}
ln = ln + 1
}
}
}
isym = isym + 1
}
}
macro CheckIsCodeBegin(szLine)
{
iLen = strlen(szLine)
if(iLen == 0)
{
return 0
}
nIdx = 0
nWord = 0
if( (szLine[nIdx] == "(") || (szLine[nIdx] == "-")
|| (szLine[nIdx] == "*") || (szLine[nIdx] == "+"))
{
return 1
}
if( szLine[nIdx] == "#" )
{
return 0
}
while(nIdx < iLen)
{
if( (szLine[nIdx] == " ")||(szLine[nIdx] == "\t")
|| (szLine[nIdx] == "(")||(szLine[nIdx] == "{")
|| (szLine[nIdx] == ";") )
{
if(nWord == 0)
{
if( (szLine[nIdx] == "(")||(szLine[nIdx] == "{")
|| (szLine[nIdx] == ";") )
{
return 1
}
szFirstWord = StrMid(szLine,0,nIdx)
if(szFirstWord == "return")
{
return 1
}
}
while(nIdx < iLen)
{
if( (szLine[nIdx] == " ")||(szLine[nIdx] == "\t") )
{
nIdx = nIdx + 1
}
else
{
break
}
}
nWord = nWord + 1
if(nIdx == iLen)
{
return 1
}
}
if(nWord == 1)
{
asciiA = AsciiFromChar("A")
asciiZ = AsciiFromChar("Z")
ch = toupper(szLine[nIdx])
asciiCh = AsciiFromChar(ch)
if( ( szLine[nIdx] == "_" ) || ( szLine[nIdx] == "*" )
|| ( ( asciiCh >= asciiA ) && ( asciiCh <= asciiZ ) ) )
{
return 0
}
else
{
return 1
}
}
nIdx = nIdx + 1
}
return 1
}
macro AutoInsertTraceInfoInPrj()
{
hprj = GetCurrentProj()
ifileMax = GetProjFileCount (hprj)
ifile = 0
while (ifile < ifileMax)
{
filename = GetProjFileName (hprj, ifile)
szExt = toupper(GetFileNameExt(filename))
if( (szExt == "C") || (szExt == "CPP") )
{
hbuf = OpenBuf (filename)
if(hbuf != 0)
{
SetCurrentBuf(hbuf)
AutoInsertTraceInfoInBuf()
}
}
//自动保存打开文件,可根据需要打开
/* if( IsBufDirty (hbuf) )
{
SaveBuf (hbuf)
}
CloseBuf(hbuf)*/
ifile = ifile + 1
}
}
macro RemoveTraceInfo()
{
hwnd = GetCurrentWnd()
if (hwnd == 0)
stop
sel = GetWndSel(hwnd)
hbuf = GetWndBuf(hwnd)
if(hbuf == hNil)
stop
symbolname = GetCurSymbol()
symbol = GetSymbolLocationFromLn(hbuf, sel.lnFirst)
// symbol = GetSymbolLocation (symbolname)
nLineEnd = symbol.lnLim
szEntry = "DebugTrace(\"\\r\\n |@symbolname@() entry--- \");"
szExit = "DebugTrace(\"\\r\\n |@symbolname@() exit---:"
ln = symbol.lnName
fIsEntry = 0
while(ln < nLineEnd)
{
szLine = GetBufLine(hbuf, ln)
/*剔除其中的注释语句*/
RetVal = TrimString(szLine)
if(fIsEntry == 0)
{
ret = strstr(szLine,szEntry)
if(ret != 0xffffffff)
{
DelBufLine(hbuf,ln)
nLineEnd = nLineEnd - 1
fIsEntry = 1
ln = ln + 1
continue
}
}
ret = strstr(szLine,szExit)
if(ret != 0xffffffff)
{
DelBufLine(hbuf,ln)
nLineEnd = nLineEnd - 1
}
ln = ln + 1
}
}
macro RemoveCurBufTraceInfo()
{
hbuf = GetCurrentBuf()
isymMax = GetBufSymCount(hbuf)
isym = 0
while (isym < isymMax)
{
isLastLine = 0
symbol = GetBufSymLocation(hbuf, isym)
fIsEnd = 1
if(strlen(symbol) > 0)
{
if(symbol.Type == "Class Placeholder")
{
hsyml = SymbolChildren(symbol)
cchild = SymListCount(hsyml)
ichild = 0
while (ichild < cchild)
{
hsyml = SymbolChildren(symbol)
childsym = SymListItem(hsyml, ichild)
SetBufIns(hbuf,childsym.lnName,0)
RemoveTraceInfo()
ichild = ichild + 1
}
SymListFree(hsyml)
}
else if( ( symbol.Type == "Function") || (symbol.Type == "Method") )
{
SetBufIns(hbuf,symbol.lnName,0)
RemoveTraceInfo()
}
}
isym = isym + 1
}
}
macro RemovePrjTraceInfo()
{
hprj = GetCurrentProj()
ifileMax = GetProjFileCount (hprj)
ifile = 0
while (ifile < ifileMax)
{
filename = GetProjFileName (hprj, ifile)
hbuf = OpenBuf (filename)
if(hbuf != 0)
{
SetCurrentBuf(hbuf)
RemoveCurBufTraceInfo()
}
//自动保存打开文件,可根据需要打开
/* if( IsBufDirty (hbuf) )
{
SaveBuf (hbuf)
}
CloseBuf(hbuf)*/
ifile = ifile + 1
}
}
macro InsertFileHeaderCN(hbuf, ln,szName,szContent)
{
hnewbuf = newbuf("");
if(hnewbuf == hNil)
{
stop;
}
// 获取文件名
szn = GetFileNameNoExt(GetBufName (hbuf));
// 取得系统时间
SysTime = GetSysTime(1);
sz=SysTime.Year;
sz1=SysTime.month;
sz3=SysTime.day;
szTime = SysTime.Date;
SzYear = SysTime.Year;
// 去掉文件名后缀
Len = strlen(sz);
szGroup = "";
i = 0;
GetFunctionList(hbuf,hnewbuf);
InsBufLine(hbuf, ln + i, "/*******************************************************************************")
i = i + 1
InsBufLine(hbuf, ln + i, " Copyright (C), @SzYear@, GoerTek Technology Co., Ltd.")
i = i + 1
if(szContent == "")
{
InsBufLine(hbuf, ln + i, "*******************************************************************************/")
i = i + 1
InsBufLine(hbuf, ln + i, "/** ")
i = i + 1
InsBufLine(hbuf, ln + i, " * @@defgroup @szn@ module name")
i = i + 1
InsBufLine(hbuf, ln + i, " * @@brief @szn@ ")
i = i + 1
}
else
{
InsBufLine(hbuf, ln + i, "********************************************************************************")
i = i + 1
}
InsBufLine(hbuf, ln + i, " * @@file @szn@")
i = i + 1
InsBufLine(hbuf, ln + i, " * @@author @szName@")
i = i + 1
InsBufLine(hbuf, ln + i, " * @@version 1.0")
i = i + 1
InsBufLine(hbuf, ln + i, " * @@date @sz@/@sz1@/@sz3@")
i = i + 1
if(szContent == "")
{
InsBufLine(hbuf, ln + i, " * @@{")
i = i + 1
InsBufLine(hbuf, ln + i, " *//*")
i = i + 1
}
InsBufLine(hbuf, ln + i, " * FileName : @szn@")
i = i + 1
InsBufLine(hbuf, ln + i, " * Description : @szContent@")
DescriptionLn = i
i = i + 1
InsBufLine(hbuf, ln + i, " * FunctionList :")
i = i + 1
//插入函数列表
i = InsertFileList(hbuf,hnewbuf,ln + i) - ln
closebuf(hnewbuf);
InsBufLine(hbuf, ln + i, " * History :")
i = i + 1
InsBufLine(hbuf, ln + i, " * 1.Date : @sz@/@sz1@/@sz3@")
i = i + 1
InsBufLine(hbuf, ln + i, " * Author : @szName@")
i = i + 1
InsBufLine(hbuf, ln + i, " * Modification: Created file")
i = i + 1
InsBufLine(hbuf, ln + i, "*******************************************************************************/")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
if(szContent != "")
{
// 给头文件的宏判断留地方
i = i + 3
}
InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
i = i + 1
InsBufLine(hbuf, ln + i, " * Include File *")
i = i + 1
InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
i = i + 1
InsBufLine(hbuf, ln + i, " * External Declaration *")
i = i + 1
InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
i = i + 1
InsBufLine(hbuf, ln + i, " * Extern Prototype *")
i = i + 1
InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
i = i + 1
InsBufLine(hbuf, ln + i, " * Internal Declaration *")
i = i + 1
InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
i = i + 1
InsBufLine(hbuf, ln + i, " * Globle Variables *")
i = i + 1
InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
i = i + 1
InsBufLine(hbuf, ln + i, " * Module Variables *")
i = i + 1
InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
i = i + 1
InsBufLine(hbuf, ln + i, " * Const Defination *")
i = i + 1
InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
i = i + 1
InsBufLine(hbuf, ln + i, " * Micro Defination *")
i = i + 1
InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
InsBufLine(hbuf, ln + i, "/*----------------------------------------------*")
i = i + 1
InsBufLine(hbuf, ln + i, " * Function Declaration *")
i = i + 1
InsBufLine(hbuf, ln + i, " *----------------------------------------------*/")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
InsBufLine(hbuf, ln + i, "")
i = i + 1
if(strlen(szContent) != 0)
{
return
}
//如果没有输入功能描述的话提示输入
szContent = Ask("请输入文件功能描述的内容")
DelBufLine(hbuf,ln + DescriptionLn)
//自动排列显示功能描述
j = CommentContent(hbuf,ln+DescriptionLn," * Description : ",szContent,0)
i = i + j - (ln + DescriptionLn)
lnLa = GetBufLineCount (hbuf);
i = 0
InsBufLine(hbuf, lnLa + i, "")
i = i + 1
InsBufLine(hbuf, lnLa + i, "/** @@}*/")
i = i + 1
InsBufLine(hbuf, lnLa + i, "")
}
macro GetFunctionList(hbuf,hnewbuf)
{
isymMax = GetBufSymCount (hbuf)
isym = 0
//依次取出全部的但前buf符号表中的全部符号
while (isym < isymMax)
{
symbol = GetBufSymLocation(hbuf, isym)
if(symbol.Type == "Class Placeholder")
{
hsyml = SymbolChildren(symbol)
cchild = SymListCount(hsyml)
ichild = 0
while (ichild < cchild)
{
childsym = SymListItem(hsyml, ichild)
AppendBufLine(hnewbuf,childsym.symbol)
ichild = ichild + 1
}
SymListFree(hsyml)
}
if(strlen(symbol) > 0)
{
if( (symbol.Type == "Method") ||
(symbol.Type == "Function") || ("Editor Macro" == symbol.Type) )
{
//取出类型是函数和宏的符号
symname = symbol.Symbol
//将符号插入到新buf中这样做是为了兼容V2.1
AppendBufLine(hnewbuf,symname)
}
}
isym = isym + 1
}
}
macro InsertFileList(hbuf,hnewbuf,ln)
{
if(hnewbuf == hNil)
{
return ln;
}
isymMax = GetBufLineCount(hnewbuf);
isym = 0;
while (isym < isymMax)
{
szLine = GetBufLine(hnewbuf, isym);
InsBufLine(hbuf,ln," @szLine@");
ln = ln + 1;
isym = isym + 1;
}
return ln;
}
macro CommentContent1 (hbuf,ln,szPreStr,szContent,isEnd)
{
//将剪贴板中的多段文本合并
szClip = MergeString();
//去掉多余的空格
szTmp = TrimString(szContent);
//如果输入窗口中的内容是剪贴板中的内容说明是剪贴过来的
ret = strstr(szClip,szTmp);
if(ret == 0)
{
szContent = szClip;
}
szLeftBlank = szPreStr;
iLen = strlen(szPreStr);
k = 0;
while(k < iLen)
{
szLeftBlank[k] = " ";
k = k + 1;
}
iLen = strlen (szContent);
szTmp = cat(szPreStr,"#");
if( iLen == 0)
{
InsBufLine(hbuf, ln, "@szTmp@")
}
else
{
i = 0
while (iLen - i > 75 - k )
{
j = 0
while(j < 75 - k)
{
iNum = szContent[i + j]
//如果是中文必须成对处理
if( AsciiFromChar (iNum) > 160 )
{
j = j + 2
}
else
{
j = j + 1
}
if( (j > 70 - k) && (szContent[i + j] == " ") )
{
break
}
}
if( (szContent[i + j] != " " ) )
{
n = 0;
iNum = szContent[i + j + n]
while( (iNum != " " ) && (AsciiFromChar (iNum) < 160))
{
n = n + 1
if((n >= 3) ||(i + j + n >= iLen))
break;
iNum = szContent[i + j + n]
}
if(n < 3)
{
j = j + n
sz1 = strmid(szContent,i,i+j)
sz1 = cat(szPreStr,sz1)
}
else
{
sz1 = strmid(szContent,i,i+j)
sz1 = cat(szPreStr,sz1)
if(sz1[strlen(sz1)-1] != "-")
{
sz1 = cat(sz1,"-")
}
}
}
else
{
sz1 = strmid(szContent,i,i+j)
sz1 = cat(szPreStr,sz1)
}
InsBufLine(hbuf, ln, "@sz1@")
ln = ln + 1
szPreStr = szLeftBlank
i = i + j
while(szContent[i] == " ")
{
i = i + 1
}
}
sz1 = strmid(szContent,i,iLen)
sz1 = cat(szPreStr,sz1)
if(isEnd)
{
sz1 = cat(sz1,"*/")
}
InsBufLine(hbuf, ln, "@sz1@")
}
return ln
}
macro CommentContent (hbuf,ln,szPreStr,szContent,isEnd)
{
szLeftBlank = szPreStr
iLen = strlen(szPreStr)
k = 0
// 计算缩进
while(k < iLen)
{
szLeftBlank[k] = " ";
k = k + 1;
}
hNewBuf = newbuf("clip")
if(hNewBuf == hNil)
return
SetCurrentBuf(hNewBuf)
PasteBufLine (hNewBuf, 0)
lnMax = GetBufLineCount( hNewBuf )
szTmp = TrimString(szContent)
//判断如果剪贴板是0行时对于有些版本会有问题,要排除掉
if(lnMax != 0)
{
szLine = GetBufLine(hNewBuf , 0)
ret = strstr(szLine,szTmp)
if(ret == 0)
{
/*如果输入窗输入的内容是剪贴板的一部分说明是剪贴过来的取剪贴板中的内
容*/
szContent = TrimString(szLine)
}
else
{
lnMax = 1
}
}
else
{
lnMax = 1
}
szRet = ""
nIdx = 0
while ( nIdx < lnMax)
{
if(nIdx != 0)
{
szLine = GetBufLine(hNewBuf , nIdx)
szContent = TrimLeft(szLine)
szPreStr = szLeftBlank
}
iLen = strlen (szContent)
szTmp = cat(szPreStr,"#");
if( (iLen == 0) && (nIdx == (lnMax - 1))
{
InsBufLine(hbuf, ln, "@szTmp@")
}
else
{
i = 0
//以每行75个字符处理
while (iLen - i > 75 - k )
{
j = 0
while(j < 75 - k)
{
iNum = szContent[i + j]
// 判断是否为中文,中文编码所有数据都加0xA0
if(AsciiFromChar (iNum) > 160 )
{
j = j + 2
}
else
{
j = j + 1
}
if( (j > 70 - k) && (szContent[i + j] == " ") )
{
break
}
}
if( (szContent[i + j] != " " ) )
{
n = 0;
iNum = szContent[i + j + n]
//如果是中文字符只能成对处理
while( (iNum != " " ) && (AsciiFromChar (iNum) <= 160))
{
n = n + 1
if((n >= 3) ||(i + j + n >= iLen))
break
iNum = szContent[i + j + n]
}
if(n < 3)
{
//分段后只有小于3个的字符留在下段则将其以上去
j = j + n
sz1 = strmid(szContent,i,i+j)
sz1 = cat(szPreStr,sz1)
}
else
{
//大于3个字符的加连字符分段
sz1 = strmid(szContent,i,i+j)
sz1 = cat(szPreStr,sz1)
if(sz1[strlen(sz1)-1] != "-")
{
sz1 = cat(sz1,"-")
}
}
}
else
{
sz1 = strmid(szContent,i,i+j)
sz1 = cat(szPreStr,sz1)
}
InsBufLine(hbuf, ln, "@sz1@")
ln = ln + 1
szPreStr = szLeftBlank
i = i + j
while(szContent[i] == " ")
{
i = i + 1
}
}
sz1 = strmid(szContent,i,iLen)
sz1 = cat(szPreStr,sz1)
if((isEnd == 1) && (nIdx == (lnMax - 1))
{
sz1 = cat(sz1," */")
}
InsBufLine(hbuf, ln, "@sz1@")
}
ln = ln + 1
nIdx = nIdx + 1
}
closebuf(hNewBuf)
return ln - 1
}
macro FormatLine()
{
hwnd = GetCurrentWnd();
if (hwnd == 0)
stop;
sel = GetWndSel(hwnd);
if(sel.ichFirst > 70)
{
Msg("选择太靠右了");
stop;
}
hbuf = GetWndBuf(hwnd);
szCurLine = GetBufLine(hbuf, sel.lnFirst);
lineLen = strlen(szCurLine);
szLeft = strmid(szCurLine,0,sel.ichFirst);
szContent = strmid(szCurLine,sel.ichFirst,lineLen);
DelBufLine(hbuf, sel.lnFirst);
CommentContent(hbuf,sel.lnFirst,szLeft,szContent,0);
}
macro CreateBlankString(nBlankCount)
{
szBlank = "";
nIdx = 0 ;
while(nIdx < nBlankCount)
{
szBlank = cat(szBlank," ");
nIdx = nIdx + 1;
}
return szBlank;
}
macro TrimLeft(szLine)
{
nLen = strlen(szLine);
if(nLen == 0)
{
return szLine;
}
nIdx = 0;
while( nIdx < nLen )
{
if( ( szLine[nIdx] != " ") && (szLine[nIdx] != "\t") )
{
break;
}
nIdx = nIdx + 1;
}
return strmid(szLine,nIdx,nLen);
}
macro TrimRight(szLine)
{
nLen = strlen(szLine);
if(nLen == 0)
{
return szLine;
}
nIdx = nLen;
while( nIdx > 0 )
{
nIdx = nIdx - 1;
if( ( szLine[nIdx] != " ") && (szLine[nIdx] != "\t") )
{
break;
}
}
return strmid(szLine, 0, nIdx+1);
}
macro TrimString(szLine)
{
szLine = TrimLeft(szLine);
szLIne = TrimRight(szLine);
return szLine;
}
macro GetFunctionDef(hbuf,symbol)
{
ln = symbol.lnName;
szFunc = "";
if(strlen(symbol) == 0)
{
return szFunc;
}
fIsEnd = 1;
while(ln < symbol.lnLim)
{
szLine = GetBufLine (hbuf, ln);
//去掉被注释掉的内容
RetVal = SkipCommentFromString(szLine,fIsEnd);
szLine = RetVal.szContent;
szLine = TrimString(szLine);
fIsEnd = RetVal.fIsEnd;
//如果是{表示函数参数头结束了
ret = strstr(szLine,"{");
if(ret != 0xffffffff)
{
szLine = strmid(szLine,0,ret);
szFunc = cat(szFunc,szLine);
break;
}
szFunc = cat(szFunc,szLine);
ln = ln + 1;
}
return szFunc;
}
macro GetWordFromString(hbuf,szLine,nBeg,nEnd,chBeg,chSeparator,chEnd)
{
if((nEnd > strlen(szLine) || (nBeg > nEnd))
{
return 0
}
nMaxLen = 0
nIdx = nBeg
//先定位到开始字符标记处
while(nIdx < nEnd)
{
if(szLine[nIdx] == chBeg)
{
break
}
nIdx = nIdx + 1
}
nBegWord = nIdx + 1
//用于检测chBeg和chEnd的配对情况
iCount = 0
nEndWord = 0
//以分隔符为标记进行搜索
while(nIdx < nEnd)
{
if(szLine[nIdx] == chSeparator)
{
szWord = strmid(szLine,nBegWord,nIdx)
szWord = TrimString(szWord)
nLen = strlen(szWord)
if(nMaxLen < nLen)
{
nMaxLen = nLen
}
AppendBufLine(hbuf,szWord)
nBegWord = nIdx + 1
}
if(szLine[nIdx] == chBeg)
{
iCount = iCount + 1
}
if(szLine[nIdx] == chEnd)
{
iCount = iCount - 1
nEndWord = nIdx
if( iCount == 0 )
{
break
}
}
nIdx = nIdx + 1
}
if(nEndWord > nBegWord)
{
szWord = strmid(szLine,nBegWord,nEndWord)
szWord = TrimString(szWord)
nLen = strlen(szWord)
if(nMaxLen < nLen)
{
nMaxLen = nLen
}
AppendBufLine(hbuf,szWord)
}
return nMaxLen
}
macro FuncHeadCommentCN(hbuf, ln, szFunc, szMyName,newFunc)
{
iIns = 0;
// 给已有函数加注释
if(newFunc != 1)
{
symbol = GetSymbolLocationFromLn(hbuf, ln);
if(strlen(symbol) > 0)
{
hTmpBuf = NewBuf("Tempbuf");
if(hTmpBuf == hNil)
{
stop;
}
//将文件参数头整理成一行并去掉了注释
szLine = GetFunctionDef(hbuf,symbol);
iBegin = symbol.ichName;
//取出返回值定义
szTemp = strmid(szLine,0,iBegin);
szTemp = TrimString(szTemp);
szRet = GetFirstWord(szTemp);
if(symbol.Type == "Method")
{
szTemp = strmid(szTemp,strlen(szRet),strlen(szTemp));
szTemp = TrimString(szTemp);
if(szTemp == "::")
{
szRet = "";
}
}
if(toupper (szRet) == "MACRO")
{
//对于宏返回值特殊处理
szRet = "";
}
//从函数头分离出函数参数
nMaxParamSize = GetWordFromString(hTmpBuf,szLine,iBegin,strlen(szLine),"(",",",")");
lnMax = GetBufLineCount(hTmpBuf);
ln = symbol.lnFirst;
SetBufIns (hbuf, ln, 0);
}
}
else
{
lnMax = 0;
szLine = "";
szRet = "";
}
j = 0
InsBufLine(hbuf, ln + j, "/******************************************************************************/")
j = j + 1
InsBufLine(hbuf, ln + j, "/** ")
lnContent = j
j = j + 1
InsBufLine(hbuf, ln + j, " * ")
j = j + 1
InsBufLine(hbuf, ln + j, " * @@param[in] ")
lnParamin = j
j = j + 1
InsBufLine(hbuf, ln + j, " * ")
j = j + 1
InsBufLine(hbuf, ln + j, " * @@return ")
j = j + 1
InsBufLine(hbuf, ln + j, " * ")
lnRet = j
j = j + 1
InsBufLine(hbuf, ln + j, " * @@note ")
j = j + 1
InsBufLine(hbuf, ln + j, " * ")
j = j + 1
InsBufLine(hbuf, ln + j, " *//* ")
j = j + 1
if(newFunc != 1)
{
//对于已经存在的函数插入函数参数
i = 0
if(lnMax > 0)
{
DelBufLine(hbuf,ln+lnParamin)
j = j - 1
}
while ( i < lnMax)
{
szTmp = GetBufLine(hTmpBuf, i)
// 取最后一个单词
len = strlen(szTmp)
kk = len - 1
while(kk > 0)
{
if(szTmp[kk] == " " || szTmp[kk] == "\t" ||
szTmp[kk] == "*" || szTmp[kk] == "(")
{
break
}
kk = kk - 1
}
if(kk == 0)
{
szTmp = strmid(szTmp,kk,len)
}
else
{
szTmp = strmid(szTmp,kk+1,len)
}
InsBufLine(hbuf, ln+lnParamin, " * @@param[in] @szTmp@")
lnParamin = lnParamin + 1
j = j + 1
lnRet = lnRet + 1
iIns = 1
i = i + 1
}
// 参数类型为void类型时,删除参数行
if(lnMax == 1 && szTmp == "void")
{
DelBufLine(hbuf,ln + lnParamin);
DelBufLine(hbuf,ln + lnParamin - 1);
lnParamin = lnParamin - 2;
lnRet = lnRet - 2;
j = j - 2;
}
// 返回值类型为void时,删除返回值行
if(szTemp == "void")
{
DelBufLine(hbuf,ln + lnRet);
DelBufLine(hbuf,ln + lnRet - 1);
lnRet = lnRet - 2;
j = j - 2;
}
closebuf(hTmpBuf)
}
InsBufLine(hbuf, ln+j, " * History :");
j = j + 1;
SysTime = GetSysTime(1);
cnsz1 = SysTime.Year;
cnsz2 = SysTime.month;
cnsz3 = SysTime.day;
InsBufLine(hbuf, ln+j, " * 1.Date : @cnsz1@/@cnsz2@/@cnsz3@");
j = j + 1;
if( strlen(szMyName) > 0)
{
InsBufLine(hbuf, ln+j, " * Author : @szMyName@")
}
else
{
InsBufLine(hbuf, ln+j, " * Author : @szMyName@")
}
j = j + 1
InsBufLine(hbuf, ln+j, " * Modification : Created function")
j = j + 1
InsBufLine(hbuf, ln+j, " ")
j = j + 1
InsBufLine(hbuf, ln+j, "*******************************************************************************/")
j = j + 1
if ((newFunc == 1) && (strlen(szFunc)>0))
{
InsBufLine(hbuf, ln+j, "uint32_t @szFunc@( # )")
lnFunc = j
j = j + 1
InsBufLine(hbuf, ln+j, "{");
j = j + 1
InsBufLine(hbuf, ln+j, " #");
j = j + 1
InsBufLine(hbuf, ln+j, "}");
j = j + 1
SearchForward()
}
hwnd = GetCurrentWnd()
if (hwnd == 0)
stop
sel = GetWndSel(hwnd)
sel.ichFirst = 0
sel.ichLim = sel.ichFirst
sel.lnFirst = ln + 14
sel.lnLast = ln + 14
szContent = Ask("请输入函数功能描述的内容")
setWndSel(hwnd,sel)
//显示输入的功能描述内容
DelBufLine(hbuf,ln + lnContent)
newln = CommentContent(hbuf,ln + lnContent,"/** ",szContent,0)
j = j + newln - (ln + lnContent)
lnParamin = lnParamin + newln - (ln + lnContent)
if ((newFunc == 1) && (strlen(szFunc)>0))
{
lnFunc = lnFunc + newln - (ln + lnContent)
lnRet = lnRet + newln - (ln + lnContent)
isFirstParam = 1
//提示输入新函数的返回值
szRet = Ask("请输入返回值类型")
if(strlen(szRet) > 0)
{
PutBufLine(hbuf, ln+lnFunc, "@szRet@ @szFunc@( )")
SetbufIns(hbuf,ln+lnFunc,strlen(szRet)+strlen(szFunc) + 3
if(szRet == "void")
{
DelBufLine(hbuf,ln + lnRet+1)
DelBufLine(hbuf,ln + lnRet)
lnFunc = lnFunc - 2
}
}
szFuncDef = ""
sel.ichFirst = strlen(szFunc)+strlen(szRet) + 3
sel.ichLim = sel.ichFirst + 1
paramnul = 0
//循环输入参数
while (1)
{
szParam = ask("请输入函数参数类型及名称");
szTmp = szParam;
len = strlen(szTmp);
kk = len - 1;
while(kk > 0)
{
if(szTmp[kk] == " " || szTmp[kk] == "\t" || szTmp[kk] == "*")
{
break;
}
kk = kk - 1;
}
if(kk == 0)
{
szTmp = strmid(szTmp,kk,len);
}
else
{
szTmp = strmid(szTmp,kk+1,len);
}
szParam = TrimString(szParam);
szParam = cat(szFuncDef,szParam);
sel.lnFirst = ln + lnFunc;
sel.lnLast = ln + lnFunc;
setWndSel(hwnd,sel);
sel.ichFirst = sel.ichFirst + strlen(szParam);
sel.ichLim = sel.ichFirst;
oldsel = sel;
if(isFirstParam == 1)
{
DelBufLine(hbuf,ln + lnParamin);
InsBufLine(hbuf, ln+lnParamin, " * @@param[in] @szTmp@");
isFirstParam = 0;
// 参数类型为void时,删除注释参数行并跳出参数输入
if(szTmp == "void")
{
DelBufLine(hbuf,ln + lnParamin);
DelBufLine(hbuf,ln + lnParamin);
ln = ln - 2;
paramnul = 1;
}
}
else
{
lnParamin = lnParamin + 1;
InsBufLine(hbuf, ln+lnParamin, " * @@param[in] @szTmp@");
lnFunc = lnFunc + 1;
lnRet = lnRet + 1;
oldsel.lnFirst = ln + lnFunc;
oldsel.lnLast = ln + lnFunc;
}
SetBufSelText(hbuf,szParam);
szIns = " ";
szFuncDef = ", ";
oldsel.lnFirst = ln + lnFunc + 2;
oldsel.lnLast = ln + lnFunc + 2;
oldsel.ichFirst = 4;
oldsel.ichLim = 5;
setWndSel(hwnd,oldsel);
if(1 == paramnul)
{
break;
}
}
return ln + lnFunc + 3;
}
else
{
return ln + j;
}
}
macro InsertHistory(hbuf,ln,language)
{
iHistoryCount = 1;
isLastLine = ln;
i = 0;
while(ln - i > 0)
{
szCurLine = GetBufLine(hbuf, ln-i);
iBeg1 = strstr(szCurLine,"日 期 ");
iBeg2 = strstr(szCurLine,"Date ");
if((iBeg1 != 0xffffffff) || (iBeg2 != 0xffffffff))
{
iHistoryCount = iHistoryCount + 1;
i = i + 1;
continue;
}
iBeg1 = strstr(szCurLine,"修改历史");
iBeg2 = strstr(szCurLine,"History ");
if((iBeg1 != 0xffffffff) || (iBeg2 != 0xffffffff))
{
break;
}
iBeg = strstr(szCurLine,"/**********************");
if( iBeg != 0xffffffff )
{
break;
}
i = i + 1;
}
if(language == 0)
{
InsertHistoryContentEN(hbuf,ln,iHistoryCount);
}
else
{
InsertHistoryContentEN(hbuf,ln,iHistoryCount);
}
}
macro UpdateFunctionList()
{
hnewbuf = newbuf("");
if(hnewbuf == hNil)
{
stop;
}
hwnd = GetCurrentWnd();
if (hwnd == 0)
stop;
sel = GetWndSel(hwnd);
hbuf = GetWndBuf(hwnd);
GetFunctionList(hbuf,hnewbuf);
ln = sel.lnFirst;
iHistoryCount = 1;
isLastLine = ln;
iTotalLn = GetBufLineCount (hbuf);
while(ln < iTotalLn)
{
szCurLine = GetBufLine(hbuf, ln);
iLen = strlen(szCurLine);
j = 0;
while(j < iLen)
{
if(szCurLine[j] != " ");
break;
j = j + 1;
}
//以文件头说明中前有大于10个空格的为函数列表记录
if(j > 10)
{
DelBufLine(hbuf, ln);
}
else
{
break;
}
iTotalLn = GetBufLineCount (hbuf);
}
InsertFileList( hbuf,hnewbuf,ln );
closebuf(hnewbuf);
}
macro InsertHistoryContentEN(hbuf,ln,iHistoryCount)
{
SysTime = GetSysTime(1);
szTime = SysTime.Date;
sz1 = SysTime.Year;
sz2 = SysTime.month;
sz3 = SysTime.day;
szMyName = getreg(MYNAME);
InsBufLine(hbuf, ln, "");
InsBufLine(hbuf, ln + 1, " * @iHistoryCount@.Date : @sz1@/@sz2@/@sz3@");
InsBufLine(hbuf, ln + 2, " * Author : @szMyName@");
szContent = Ask("Please input modification");
CommentContent(hbuf, ln + 3, " * Modification : ",szContent,0);
CommentContent(hbuf, ln + 4, ""," ",0);
}
macro CreateFunctionDef(hbuf, szName, language)
{
ln = 0
//获得当前没有后缀的文件名
szFileName = GetFileNameNoExt(GetBufName (hbuf))
if(strlen(szFileName) == 0)
{
sz = ask("请输入头文件名")
szFileName = GetFileNameNoExt(sz)
szExt = GetFileNameExt(szFileName)
szPreH = toupper (szFileName)
szPreH = cat("__",szPreH)
szExt = toupper(szExt)
szPreH = cat(szPreH,"_@szExt@__")
}
szPreH = toupper (szFileName)
// 定义头文件宏
sz = cat(szFileName,".h")
szPreH = cat("__",szPreH)
szPreH = cat(szPreH,"_H__")
hOutbuf = NewBuf(sz) // create output buffer
if (hOutbuf == 0)
stop
//搜索符号表取得函数名
SetCurrentBuf(hOutbuf)
isymMax = GetBufSymCount(hbuf)
isym = 0
while (isym < isymMax)
{
isLastLine = 0
symbol = GetBufSymLocation(hbuf, isym)
fIsEnd = 1
if(strlen(symbol) > 0)
{
if(symbol.Type == "Class Placeholder")
{
hsyml = SymbolChildren(symbol)
cchild = SymListCount(hsyml)
ichild = 0
szClassName = symbol.Symbol
InsBufLine(hOutbuf, ln, "}")
InsBufLine(hOutbuf, ln, "{")
InsBufLine(hOutbuf, ln, "class @szClassName@")
ln = ln + 2
while (ichild < cchild)
{
childsym = SymListItem(hsyml, ichild)
childsym.Symbol = szClassName
ln = CreateClassPrototype(hbuf,ln,childsym)
ichild = ichild + 1
}
SymListFree(hsyml)
InsBufLine(hOutbuf, ln + 1, "")
ln = ln + 2
}
else if( symbol.Type == "Function" )
{
ln = CreateFuncPrototype(hbuf,ln,"extern",symbol)
}
else if( symbol.Type == "Method" )
{
szLine = GetBufline(hbuf,symbol.lnName)
szClassName = GetLeftWord(szLine,symbol.ichName)
symbol.Symbol = szClassName
ln = CreateClassPrototype(hbuf,ln,symbol)
}
}
isym = isym + 1
}
HeadIfdefStr(szPreH)
szContent = GetFileName(GetBufName (hbuf))
szContent = cat(szContent,"'s Head File ")
InsertFileHeaderCN(hOutbuf,0,szName,szContent)
}
macro GetLeftWord(szLine,ichRight)
{
if(ich == 0)
{
return ""
}
ich = ichRight
while(ich > 0)
{
if( (szLine[ich] == " ") || (szLine[ich] == "\t")
|| ( szLine[ich] == ":") || (szLine[ich] == "."))
{
ich = ich - 1
ichRight = ich
}
else
{
break
}
}
while(ich > 0)
{
if(szLine[ich] == " ")
{
ich = ich + 1
break
}
ich = ich - 1
}
return strmid(szLine,ich,ichRight)
}
macro CreateClassPrototype(hbuf,ln,symbol)
{
isLastLine = 0
fIsEnd = 1
hOutbuf = GetCurrentBuf()
szLine = GetBufLine (hbuf, symbol.lnName)
sline = symbol.lnFirst
szClassName = symbol.Symbol
ret = strstr(szLine,szClassName)
if(ret == 0xffffffff)
{
return ln
}
szPre = strmid(szLine,0,ret)
szLine = strmid(szLine,symbol.ichName,strlen(szLine))
szLine = cat(szPre,szLine)
//去掉注释的干扰
RetVal = SkipCommentFromString(szLine,fIsEnd)
fIsEnd = RetVal.fIsEnd
szNew = RetVal.szContent
szLine = cat(" ",szLine)
szNew = cat(" ",szNew)
while((isLastLine == 0) && (sline < symbol.lnLim))
{
i = 0
j = 0
iLen = strlen(szNew)
while(i < iLen)
{
if(szNew[i]=="(")
{
j = j + 1;
}
else if(szNew[i]==")")
{
j = j - 1;
if(j <= 0)
{
//函数参数头结束
isLastLine = 1
//去掉最后多余的字符
szLine = strmid(szLine,0,i+1);
szLine = cat(szLine,";")
break
}
}
i = i + 1
}
InsBufLine(hOutbuf, ln, "@szLine@")
ln = ln + 1
sline = sline + 1
if(isLastLine != 1)
{
//函数参数头还没有结束再取一行
szLine = GetBufLine (hbuf, sline)
//去掉注释的干扰
RetVal = SkipCommentFromString(szLine,fIsEnd)
szNew = RetVal.szContent
fIsEnd = RetVal.fIsEnd
}
}
return ln
}
macro CreateFuncPrototype(hbuf,ln,szType,symbol)
{
isLastLine = 0
hOutbuf = GetCurrentBuf()
szLine = GetBufLine (hbuf,symbol.lnName)
//去掉注释的干扰
RetVal = SkipCommentFromString(szLine,fIsEnd)
szNew = RetVal.szContent
fIsEnd = RetVal.fIsEnd
szLine = cat("@szType@ ",szLine)
szNew = cat("@szType@ ",szNew)
sline = symbol.lnFirst
while((isLastLine == 0) && (sline < symbol.lnLim))
{
i = 0
j = 0
iLen = strlen(szNew)
while(i < iLen)
{
if(szNew[i]=="(")
{
j = j + 1;
}
else if(szNew[i]==")")
{
j = j - 1;
if(j <= 0)
{
//函数参数头结束
isLastLine = 1
//去掉最后多余的字符
szLine = strmid(szLine,0,i+1);
szLine = cat(szLine,";")
break
}
}
i = i + 1
}
funcName = strmid(szLine,7,13);
if("static" != funcName)
{
InsBufLine(hOutbuf, ln, "@szLine@")
ln = ln + 1
}
sline = sline + 1
if(isLastLine != 1)
{
//函数参数头还没有结束再取一行
szLine = GetBufLine (hbuf, sline)
szLine = cat(" ",szLine)
//去掉注释的干扰
RetVal = SkipCommentFromString(szLine,fIsEnd)
szNew = RetVal.szContent
fIsEnd = RetVal.fIsEnd
}
}
return ln
}
macro CreateNewHeaderFile()
{
hbuf = GetCurrentBuf()
language = getreg(LANGUAGE)
if(language != 1)
{
language = 0
}
szName = getreg(MYNAME)
if(language == 0)
{
if(strlen( szName ) == 0)
{
szMyName = Ask("请输入你的名字:")
setreg(MYNAME, szMyName)
}
isymMax = GetBufSymCount(hbuf)
isym = 0
ln = 0
//获得当前没有后缀的文件名
sz = ask("请输入头文件名")
}
else
{
if(strlen( szName ) == 0)
{
szMyName = Ask("Enter your name:")
setreg(MYNAME, szMyName)
}
isymMax = GetBufSymCount(hbuf)
isym = 0
ln = 0
//获得当前没有后缀的文件名
sz = ask("Please input header file name")
}
szFileName = GetFileNameNoExt(sz)
szExt = GetFileNameExt(sz)
szPreH = toupper (szFileName)
szPreH = cat("__",szPreH)
szExt = toupper(szExt)
szPreH = cat(szPreH,"_@szExt@__")
hOutbuf = NewBuf(sz) // create output buffer
if (hOutbuf == 0)
stop
SetCurrentBuf(hOutbuf)
HeadIfdefStr(szPreH)
szContent = GetFileName(GetBufName (hbuf))
szContent = cat(szContent," 的头文件")
InsertFileHeaderCN(hOutbuf,0,szName,szContent)
lnMax = GetBufLineCount(hOutbuf)
if(lnMax > 9)
{
ln = lnMax - 9
}
else
{
return
}
hwnd = GetCurrentWnd()
if (hwnd == 0)
stop
sel = GetWndSel(hwnd)
sel.lnFirst = ln
sel.ichFirst = 0
sel.ichLim = 0
SetBufIns(hOutbuf,ln,0)
sel.lnLast = ln
SetWndSel(hwnd,sel)
}
macro GetWordLeftOfIch(ich, sz)
{
wordinfo = "" // create a "wordinfo" structure
chTab = CharFromAscii(9)
// scan backwords over white space, if any
ich = ich - 1;
if (ich >= 0)
while (sz[ich] == " " || sz[ich] == chTab)
{
ich = ich - 1;
if (ich < 0)
break;
}
// scan backwords to start of word
ichLim = ich + 1;
asciiA = AsciiFromChar("A")
asciiZ = AsciiFromChar("Z")
while (ich >= 0)
{
ch = toupper(sz[ich])
asciiCh = AsciiFromChar(ch)
/* if ((asciiCh < asciiA || asciiCh > asciiZ)
&& !IsNumber(ch)
&& (ch != "#") )
break // stop at first non-identifier character
*/
//只提取字符和# { / *作为命令
if ((asciiCh < asciiA || asciiCh > asciiZ)
&& !IsNumber(ch)
&& ( ch != "#" && ch != "{" && ch != "/" && ch != "*"))
break;
ich = ich - 1;
}
ich = ich + 1
wordinfo.szWord = strmid(sz, ich, ichLim)
wordinfo.ich = ich
wordinfo.ichLim = ichLim
return wordinfo
}
macro ReplaceBufTab()
{
hwnd = GetCurrentWnd()
if (hwnd == 0)
stop
hbuf = GetWndBuf(hwnd)
iTotalLn = GetBufLineCount (hbuf)
nBlank = Ask("一个Tab替换几个空格")
if(nBlank == 0)
{
nBlank = 4
}
szBlank = CreateBlankString(nBlank)
ReplaceInBuf(hbuf,"\t",szBlank,0, iTotalLn, 1, 0, 0, 1)
}
macro ReplaceTabInProj()
{
hprj = GetCurrentProj()
ifileMax = GetProjFileCount (hprj)
nBlank = Ask("一个Tab替换几个空格")
if(nBlank == 0)
{
nBlank = 4
}
szBlank = CreateBlankString(nBlank)
ifile = 0
while (ifile < ifileMax)
{
filename = GetProjFileName (hprj, ifile)
hbuf = OpenBuf (filename)
if(hbuf != 0)
{
iTotalLn = GetBufLineCount (hbuf)
ReplaceInBuf(hbuf,"\t",szBlank,0, iTotalLn, 1, 0, 0, 1)
}
if( IsBufDirty (hbuf) )
{
SaveBuf (hbuf)
}
CloseBuf(hbuf)
ifile = ifile + 1
}
}
macro ReplaceInBuf(hbuf,chOld,chNew,nBeg,nEnd,fMatchCase, fRegExp, fWholeWordsOnly, fConfirm)
{
hwnd = GetCurrentWnd()
if (hwnd == 0)
stop
hbuf = GetWndBuf(hwnd)
sel = GetWndSel(hwnd)
sel.ichLim = 0
sel.lnLast = 0
sel.ichFirst = sel.ichLim
sel.lnFirst = sel.lnLast
SetWndSel(hwnd, sel)
LoadSearchPattern(chOld, 0, 0, 0);
while(1)
{
Search_Forward
selNew = GetWndSel(hwnd)
if(sel == selNew)
{
break;
}
SetBufSelText(hbuf, chNew)
selNew.ichLim = selNew.ichFirst
SetWndSel(hwnd, selNew)
sel = selNew
}
}
macro ConfigureSystem()
{
SetReg ("LANGUAGE", 1);
szName = ASK("Please input your english name");
SetReg ("MYNAME", szName);
}
macro GetLeftBlank(szLine)
{
nIdx = 0
nEndIdx = strlen(szLine)
while( nIdx < nEndIdx )
{
if( (szLine[nIdx] !=" ") && (szLine[nIdx] !="\t") )
{
break;
}
nIdx = nIdx + 1
}
return nIdx
}
macro ExpandBraceLittle()
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
hbuf = GetCurrentBuf()
if( (sel.lnFirst == sel.lnLast)
&& (sel.ichFirst == sel.ichLim) )
{
SetBufSelText (hbuf, "( )")
SetBufIns (hbuf, sel.lnFirst, sel.ichFirst + 2)
}
else
{
SetBufIns (hbuf, sel.lnFirst, sel.ichFirst)
SetBufSelText (hbuf, "( ")
SetBufIns (hbuf, sel.lnLast, sel.ichLim + 2)
SetBufSelText (hbuf, " )")
}
}
macro ExpandBraceMid()
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
hbuf = GetCurrentBuf()
if( (sel.lnFirst == sel.lnLast)
&& (sel.ichFirst == sel.ichLim) )
{
SetBufSelText (hbuf, "[]")
SetBufIns (hbuf, sel.lnFirst, sel.ichFirst + 1)
}
else
{
SetBufIns (hbuf, sel.lnFirst, sel.ichFirst)
SetBufSelText (hbuf, "[")
SetBufIns (hbuf, sel.lnLast, sel.ichLim + 1)
SetBufSelText (hbuf, "]")
}
}
macro ExpandBraceLarge()
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
hbuf = GetCurrentBuf()
ln = sel.lnFirst
nlineCount = 0
retVal = ""
szLine = GetBufLine( hbuf, ln )
nLeft = GetLeftBlank(szLine)
szLeft = strmid(szLine,0,nLeft);
szRight = ""
szMid = ""
if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
{
//对于没有块选择的情况,直接插入{}即可
if( nLeft == strlen(szLine) )
{
SetBufSelText (hbuf, "{")
}
else
{
ln = ln + 1
InsBufLine(hbuf, ln, "@szLeft@{")
nlineCount = nlineCount + 1
}
InsBufLine(hbuf, ln + 1, "@szLeft@ ")
InsBufLine(hbuf, ln + 2, "@szLeft@}")
nlineCount = nlineCount + 2
SetBufIns (hbuf, ln + 1, strlen(szLeft)+4)
}
else
{
//对于有块选择的情况还得考虑将块选择区分开了
//检查选择区内是否大括号配对,如果嫌太慢则注释掉下面的判断
RetVal= CheckBlockBrace(hbuf)
if(RetVal.iCount != 0)
{
msg("Invalidated brace number")
stop
}
//取出选中区前的内容
szOld = strmid(szLine,0,sel.ichFirst)
if(sel.lnFirst != sel.lnLast)
{
//对于多行的情况
//第一行的选中部分
szMid = strmid(szLine,sel.ichFirst,strlen(szLine))
szMid = TrimString(szMid)
szLast = GetBufLine(hbuf,sel.lnLast)
if( sel.ichLim > strlen(szLast) )
{
//如果选择区长度大于改行的长度,最大取该行的长度
szLineselichLim = strlen(szLast)
}
else
{
szLineselichLim = sel.ichLim
}
//得到最后一行选择区为的字符
szRight = strmid(szLast,szLineselichLim,strlen(szLast))
szRight = TrimString(szRight)
}
else
{
//对于选择只有一行的情况
if(sel.ichLim >= strlen(szLine))
{
sel.ichLim = strlen(szLine)
}
//获得选中区的内容
szMid = strmid(szLine,sel.ichFirst,sel.ichLim)
szMid = TrimString(szMid)
if( sel.ichLim > strlen(szLine) )
{
szLineselichLim = strlen(szLine)
}
else
{
szLineselichLim = sel.ichLim
}
//同样得到选中区后的内容
szRight = strmid(szLine,szLineselichLim,strlen(szLine))
szRight = TrimString(szRight)
}
nIdx = sel.lnFirst
while( nIdx < sel.lnLast)
{
szCurLine = GetBufLine(hbuf,nIdx+1)
if( sel.ichLim > strlen(szCurLine) )
{
szLineselichLim = strlen(szCurLine)
}
else
{
szLineselichLim = sel.ichLim
}
szCurLine = cat(" ",szCurLine)
if(nIdx == sel.lnLast - 1)
{
//对于最后一行应该是选中区内的内容后移四位
szCurLine = strmid(szCurLine,0,szLineselichLim + 4)
PutBufLine(hbuf,nIdx+1,szCurLine)
}
else
{
//其它情况是整行的内容后移四位
PutBufLine(hbuf,nIdx+1,szCurLine)
}
nIdx = nIdx + 1
}
if(strlen(szRight) != 0)
{
//最后插入最后一行没有被选择的内容
InsBufLine(hbuf, sel.lnLast + 1, "@szLeft@@szRight@")
}
InsBufLine(hbuf, sel.lnLast + 1, "@szLeft@}")
nlineCount = nlineCount + 1
if(nLeft < sel.ichFirst)
{
//如果选中区前的内容不是空格,则要保留该部分内容
PutBufLine(hbuf,ln,szOld)
InsBufLine(hbuf, ln+1, "@szLeft@{")
nlineCount = nlineCount + 1
ln = ln + 1
}
else
{
//如果选中区前没有内容直接删除该行
DelBufLine(hbuf,ln)
InsBufLine(hbuf, ln, "@szLeft@{")
}
if(strlen(szMid) > 0)
{
//插入第一行选择区的内容
InsBufLine(hbuf, ln+1, "@szLeft@ @szMid@")
nlineCount = nlineCount + 1
ln = ln + 1
}
}
retVal.szLeft = szLeft
retVal.nLineCount = nlineCount
//返回行数和左边的空白
return retVal
}
/*
macro ScanStatement(szLine,iBeg)
{
nIdx = 0
iLen = strlen(szLine)
while(nIdx < iLen -1)
{
if(szLine[nIdx] == "/" && szLine[nIdx + 1] == "/")
{
return 0xffffffff
}
if(szLine[nIdx] == "/" && szLine[nIdx + 1] == "*")
{
while(nIdx < iLen)
{
if(szLine[nIdx] == "*" && szLine[nIdx + 1] == "/")
{
break
}
nIdx = nIdx + 1
}
}
if( (szLine[nIdx] != " ") && (szLine[nIdx] != "\t" ))
{
return nIdx
}
nIdx = nIdx + 1
}
if( (szLine[iLen -1] == " ") || (szLine[iLen -1] == "\t" ))
{
return 0xffffffff
}
return nIdx
}
*/
/*
macro MoveCommentLeftBlank(szLine)
{
nIdx = 0
iLen = strlen(szLine)
while(nIdx < iLen - 1)
{
if(szLine[nIdx] == "/" && szLine[nIdx+1] == "*")
{
szLine[nIdx] = " "
szLine[nIdx + 1] = " "
nIdx = nIdx + 2
while(nIdx < iLen - 1)
{
if(szLine[nIdx] != " " && szLine[nIdx] != "\t")
{
szLine[nIdx - 2] = "/"
szLine[nIdx - 1] = "*"
return szLine
}
nIdx = nIdx + 1
}
}
if(szLine[nIdx] == "/" && szLine[nIdx+1] == "/")
{
szLine[nIdx] = " "
szLine[nIdx + 1] = " "
nIdx = nIdx + 2
while(nIdx < iLen - 1)
{
if(szLine[nIdx] != " " && szLine[nIdx] != "\t")
{
szLine[nIdx - 2] = "/"
szLine[nIdx - 1] = "/"
return szLine
}
nIdx = nIdx + 1
}
}
nIdx = nIdx + 1
}
return szLine
}*/
macro DelCompoundStatement()
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
hbuf = GetCurrentBuf()
ln = sel.lnFirst
szLine = GetBufLine(hbuf,ln )
nLeft = GetLeftBlank(szLine)
szLeft = strmid(szLine,0,nLeft);
Msg("@szLine@ will be deleted !")
fIsEnd = 1
while(1)
{
RetVal = SkipCommentFromString(szLine,fIsEnd)
szTmp = RetVal.szContent
fIsEnd = RetVal.fIsEnd
//查找复合语句的开始
ret = strstr(szTmp,"{")
if(ret != 0xffffffff)
{
szNewLine = strmid(szLine,ret+1,strlen(szLine))
szNew = strmid(szTmp,ret+1,strlen(szTmp))
szNew = TrimString(szNew)
if(szNew != "")
{
InsBufLine(hbuf,ln + 1,"@szLeft@ @szNewLine@");
}
sel.lnFirst = ln
sel.lnLast = ln
sel.ichFirst = ret
sel.ichLim = ret
//查找对应的大括号
//使用自己编写的代码速度太慢
retTmp = SearchCompoundEnd(hbuf,ln,ret)
if(retTmp.iCount == 0)
{
DelBufLine(hbuf,retTmp.ln)
sel.ichFirst = 0
sel.ichLim = 0
DelBufLine(hbuf,ln)
sel.lnLast = retTmp.ln - 1
SetWndSel(hwnd,sel)
Indent_Left
}
//使用Si的大括号配对方法,但V2.1时在注释嵌套时可能有误
/* SetWndSel(hwnd,sel)
Block_Down
selNew = GetWndSel(hwnd)
if(selNew != sel)
{
DelBufLine(hbuf,selNew.lnFirst)
sel.ichFirst = 0
sel.ichLim = 0
DelBufLine(hbuf,ln)
sel.lnLast = selNew.lnFirst - 1
SetWndSel(hwnd,sel)
Indent_Left
}*/
break
}
szTmp = TrimString(szTmp)
iLen = strlen(szTmp)
if(iLen != 0)
{
if(szTmp[iLen-1] == ";")
{
break
}
}
DelBufLine(hbuf,ln)
if( ln == GetBufLineCount(hbuf ))
{
break
}
szLine = GetBufLine(hbuf,ln)
}
}
macro CheckBlockBrace(hbuf)
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
ln = sel.lnFirst
nCount = 0
RetVal = ""
szLine = GetBufLine( hbuf, ln )
if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
{
RetVal.iCount = 0
RetVal.ich = sel.ichFirst
return RetVal
}
if(sel.lnFirst == sel.lnLast && sel.ichFirst != sel.ichLim)
{
RetTmp = SkipCommentFromString(szLine,fIsEnd)
szTmp = RetTmp.szContent
RetVal = CheckBrace(szTmp,sel.ichFirst,sel.ichLim,"{","}",0,1)
return RetVal
}
if(sel.lnFirst != sel.lnLast)
{
fIsEnd = 1
while(ln <= sel.lnLast)
{
if(ln == sel.lnFirst)
{
RetVal = CheckBrace(szLine,sel.ichFirst,strlen(szLine)-1,"{","}",nCount,fIsEnd)
}
else if(ln == sel.lnLast)
{
RetVal = CheckBrace(szLine,0,sel.ichLim,"{","}",nCount,fIsEnd)
}
else
{
RetVal = CheckBrace(szLine,0,strlen(szLine)-1,"{","}",nCount,fIsEnd)
}
fIsEnd = RetVal.fIsEnd
ln = ln + 1
nCount = RetVal.iCount
szLine = GetBufLine( hbuf, ln )
}
}
return RetVal
}
macro SearchCompoundEnd(hbuf,ln,ichBeg)
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
ln = sel.lnFirst
nCount = 0
SearchVal = ""
// szLine = GetBufLine( hbuf, ln )
lnMax = GetBufLineCount(hbuf)
fIsEnd = 1
while(ln < lnMax)
{
szLine = GetBufLine( hbuf, ln )
RetVal = CheckBrace(szLine,ichBeg,strlen(szLine)-1,"{","}",nCount,fIsEnd)
fIsEnd = RetVal.fIsEnd
ichBeg = 0
nCount = RetVal.iCount
//如果nCount=0则说明{}是配对的
if(nCount == 0)
{
break
}
ln = ln + 1
// szLine = GetBufLine( hbuf, ln )
}
SearchVal.iCount = RetVal.iCount
SearchVal.ich = RetVal.ich
SearchVal.ln = ln
return SearchVal
}
macro CheckBrace(szLine,ichBeg,ichEnd,chBeg,chEnd,nCheckCount,isCommentEnd)
{
retVal = ""
retVal.ich = 0
nIdx = ichBeg
nLen = strlen(szLine)
if(ichEnd >= nLen)
{
ichEnd = nLen - 1
}
fIsEnd = 1
while(nIdx <= ichEnd)
{
//如果是/*注释区,跳过该段
if( (isCommentEnd == 0) || (szLine[nIdx] == "/" && szLine[nIdx+1] == "*"))
{
fIsEnd = 0
while(nIdx <= ichEnd )
{
if(szLine[nIdx] == "*" && szLine[nIdx+1] == "/")
{
nIdx = nIdx + 1
fIsEnd = 1
isCommentEnd = 1
break
}
nIdx = nIdx + 1
}
if(nIdx > ichEnd)
{
break
}
}
//如果是//注释则停止查找
if(szLine[nIdx] == "/" && szLine[nIdx+1] == "/")
{
break
}
if(szLine[nIdx] == chBeg)
{
nCheckCount = nCheckCount + 1
}
if(szLine[nIdx] == chEnd)
{
nCheckCount = nCheckCount - 1
if(nCheckCount == 0)
{
retVal.ich = nIdx
}
}
nIdx = nIdx + 1
}
retVal.iCount = nCheckCount
retVal.fIsEnd = fIsEnd
return retVal
}
macro InsertElse()
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
hbuf = GetCurrentBuf()
ln = sel.lnFirst
if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
{
szLeft = CreateBlankString(sel.ichFirst)
InsBufLine(hbuf, ln,szLeft)
SetWndSel(hwnd,sel)
}
val = ExpandBraceLarge()
szLeft = val.szLeft
InsBufLine(hbuf, ln, "@szLeft@else")
if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
{
PutBufLine(hbuf,ln+2, "@szLeft@ ")
SetBufIns (hbuf, ln+2, strlen(szLeft)+4)
return
}
SetBufIns (hbuf, ln, strlen(szLeft)+7)
}
macro InsertCase()
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
hbuf = GetCurrentBuf()
ln = sel.lnFirst
szLine = GetBufLine( hbuf, ln )
nLeft = GetLeftBlank(szLine)
szLeft = strmid(szLine,0,nLeft);
InsBufLine(hbuf, ln, "@szLeft@" # "case # :")
InsBufLine(hbuf, ln + 1, "@szLeft@" # " " # "#")
InsBufLine(hbuf, ln + 2, "@szLeft@" # " " # "break;")
SearchForward()
}
macro InsertSwitch()
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
hbuf = GetCurrentBuf()
ln = sel.lnFirst
szLine = GetBufLine( hbuf, ln )
nLeft = GetLeftBlank(szLine)
szLeft = strmid(szLine,0,nLeft);
InsBufLine(hbuf, ln, "@szLeft@switch ( # )")
InsBufLine(hbuf, ln + 1, "@szLeft@" # "{")
nSwitch = ask("请输入case的个数")
InsertMultiCaseProc(hbuf,szLeft,nSwitch)
SearchForward()
}
macro InsertMultiCaseProc(hbuf,szLeft,nSwitch)
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
ln = sel.lnFirst
nIdx = 0
if(nSwitch == 0)
{
hNewBuf = newbuf("clip")
if(hNewBuf == hNil)
return
SetCurrentBuf(hNewBuf)
PasteBufLine (hNewBuf, 0)
nLeftMax = 0
lnMax = GetBufLineCount(hNewBuf )
i = 0
fIsEnd = 1
while ( i < lnMax)
{
szLine = GetBufLine(hNewBuf , i)
//先去掉代码中注释的内容
RetVal = SkipCommentFromString(szLine,fIsEnd)
szLine = RetVal.szContent
fIsEnd = RetVal.fIsEnd
// nLeft = GetLeftBlank(szLine)
//从剪贴板中取得case值
szLine = GetSwitchVar(szLine)
if(strlen(szLine) != 0 )
{
ln = ln + 3
InsBufLine(hbuf, ln - 1, "@szLeft@ " # "case @szLine@:")
InsBufLine(hbuf, ln , "@szLeft@ " # " " # "#")
InsBufLine(hbuf, ln + 1, "@szLeft@ " # " " # "break;")
}
i = i + 1
}
closebuf(hNewBuf)
}
else
{
while(nIdx < nSwitch)
{
ln = ln + 3
InsBufLine(hbuf, ln - 1, "@szLeft@ " # "case # :")
InsBufLine(hbuf, ln , "@szLeft@ " # " " # "#")
InsBufLine(hbuf, ln + 1, "@szLeft@ " # " " # "break;")
nIdx = nIdx + 1
}
}
InsBufLine(hbuf, ln + 2, "@szLeft@ " # "default:")
InsBufLine(hbuf, ln + 3, "@szLeft@ " # " " # "#")
InsBufLine(hbuf, ln + 4, "@szLeft@" # "}")
SetWndSel(hwnd, sel)
SearchForward()
}
macro GetSwitchVar(szLine)
{
if( (szLine == "{") || (szLine == "}") )
{
return ""
}
ret = strstr(szLine,"#define" )
if(ret != 0xffffffff)
{
szLine = strmid(szLine,ret + 8,strlen(szLine))
}
szLine = TrimLeft(szLine)
nIdx = 0
nLen = strlen(szLine)
while( nIdx < nLen)
{
if((szLine[nIdx] == " ") || (szLine[nIdx] == ",") || (szLine[nIdx] == "="))
{
szLine = strmid(szLine,0,nIdx)
return szLine
}
nIdx = nIdx + 1
}
return szLine
}
/*
macro SkipControlCharFromString(szLine)
{
nLen = strlen(szLine)
nIdx = 0
newStr = ""
while(nIdx < nLen - 1)
{
if(szLine[nIdx] == "\t")
{
newStr = cat(newStr," ")
}
else if(szLine[nIdx] < " ")
{
newStr = cat(newStr," ")
}
else
{
newStr = cat(newStr," ")
}
}
}
*/
macro SkipCommentFromString(szLine,isCommentEnd)
{
RetVal = ""
fIsEnd = 1
nLen = strlen(szLine)
nIdx = 0
while(nIdx < nLen )
{
//如果当前行开始还是被注释,或遇到了注释开始的变标记,注释内容改为空格
if( (isCommentEnd == 0) || (szLine[nIdx] == "/" && szLine[nIdx+1] == "*"))
{
fIsEnd = 0
while(nIdx < nLen )
{
if(szLine[nIdx] == "*" && szLine[nIdx+1] == "/")
{
szLine[nIdx+1] = " "
szLine[nIdx] = " "
nIdx = nIdx + 1
fIsEnd = 1
isCommentEnd = 1
break
}
szLine[nIdx] = " "
//如果是倒数第二个则最后一个也肯定是在注释内
// if(nIdx == nLen -2 )
// {
// szLine[nIdx + 1] = " "
// }
nIdx = nIdx + 1
}
//如果已经到了行尾终止搜索
if(nIdx == nLen)
{
break
}
}
//如果遇到的是//来注释的说明后面都为注释
if(szLine[nIdx] == "/" && szLine[nIdx+1] == "/")
{
szLine = strmid(szLine,0,nIdx)
break
}
nIdx = nIdx + 1
}
RetVal.szContent = szLine;
RetVal.fIsEnd = fIsEnd
return RetVal
}
macro InsertDo()
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
hbuf = GetCurrentBuf()
ln = sel.lnFirst
if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
{
szLeft = CreateBlankString(sel.ichFirst)
InsBufLine(hbuf, ln,szLeft)
SetWndSel(hwnd,sel)
}
val = ExpandBraceLarge()
szLeft = val.szLeft
if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
{
PutBufLine(hbuf,ln+1, "@szLeft@ #")
}
PutBufLine(hbuf, sel.lnLast + val.nLineCount, "@szLeft@}while ( # );")
// SetBufIns (hbuf, sel.lnLast + val.nLineCount, strlen(szLeft)+8)
InsBufLine(hbuf, ln, "@szLeft@do")
SearchForward()
}
macro InsertWhile()
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
hbuf = GetCurrentBuf()
ln = sel.lnFirst
if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
{
szLeft = CreateBlankString(sel.ichFirst)
InsBufLine(hbuf, ln,szLeft)
SetWndSel(hwnd,sel)
}
val = ExpandBraceLarge()
szLeft = val.szLeft
InsBufLine(hbuf, ln, "@szLeft@while( # )")
if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
{
PutBufLine(hbuf,ln+2, "@szLeft@ #")
}
SetBufIns (hbuf, ln, strlen(szLeft)+7)
SearchForward()
}
macro InsertFor()
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
hbuf = GetCurrentBuf()
ln = sel.lnFirst
if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
{
szLeft = CreateBlankString(sel.ichFirst)
InsBufLine(hbuf, ln,szLeft)
SetWndSel(hwnd,sel)
}
val = ExpandBraceLarge()
szLeft = val.szLeft
InsBufLine(hbuf, ln,"@szLeft@for( # ; # ; # )")
if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
{
PutBufLine(hbuf,ln+2, "@szLeft@ #")
}
sel.lnFirst = ln
sel.lnLast = ln
sel.ichFirst = 0
sel.ichLim = 0
SetWndSel(hwnd, sel)
SearchForward()
szVar = ask("请输入循环变量")
PutBufLine(hbuf,ln, "@szLeft@for( @szVar@ = # ; @szVar@ # ; @szVar@++ )")
SearchForward()
}
macro InsertIf()
{
hwnd = GetCurrentWnd()
sel = GetWndSel(hwnd)
hbuf = GetCurrentBuf()
ln = sel.lnFirst
if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
{
szLeft = CreateBlankString(sel.ichFirst)
InsBufLine(hbuf, ln,szLeft)
SetWndSel(hwnd,sel)
}
val = ExpandBraceLarge()
szLeft = val.szLeft
InsBufLine(hbuf, ln, "@szLeft@if( # )")
if(sel.lnFirst == sel.lnLast && sel.ichFirst == sel.ichLim)
{
PutBufLine(hbuf,ln+2, "@szLeft@ #")
}
// SetBufIns (hbuf, ln, strlen(szLeft)+4)
SearchForward()
}
macro MergeString()
{
hbuf = newbuf("clip")
if(hbuf == hNil)
return
SetCurrentBuf(hbuf)
PasteBufLine (hbuf, 0)
//如果剪贴板中没有内容,则返回
lnMax = GetBufLineCount(hbuf )
if( lnMax == 0 )
{
closebuf(hbuf)
return ""
}
lnLast = 0
if(lnMax > 1)
{
lnLast = lnMax - 1
i = lnMax - 1
}
while ( i > 0)
{
szLine = GetBufLine(hbuf , i-1)
szLine = TrimLeft(szLine)
nLen = strlen(szLine)
if(szLine[nLen - 1] == "-")
{
szLine = strmid(szLine,0,nLen - 1)
}
nLen = strlen(szLine)
if( (szLine[nLen - 1] != " ") && (AsciiFromChar (szLine[nLen - 1]) <= 160))
{
szLine = cat(szLine," ")
}
SetBufIns (hbuf, lnLast, 0)
SetBufSelText(hbuf,szLine)
i = i - 1
}
szLine = GetBufLine(hbuf,lnLast)
closebuf(hbuf)
return szLine
}
macro ClearPrombleNo()
{
SetReg ("PNO", "")
}
macro AddPromblemNo()
{
szQuestion = ASK("Please Input problem number ");
if(szQuestion == "#")
{
szQuestion = ""
SetReg ("PNO", "")
}
else
{
SetReg ("PNO", szQuestion)
}
return szQuestion
}
/*
this macro convet selected C++ coment block to C comment block
for example:
line " // aaaaa "
convert to /* aaaaa */
*/
/*macro ComentCPPtoC()
{
hwnd = GetCurrentWnd()
lnFirst = GetWndSelLnFirst( hwnd )
lnLast = GetWndSelLnLast( hwnd )
lnCurrent = lnFirst
fIsEnd = 1
while ( lnCurrent <= lnLast )
{
fIsEnd = CmtCvtLine( lnCurrent,fIsEnd )
lnCurrent = lnCurrent + 1;
}
}*/
macro ComentCPPtoC()
{
hwnd = GetCurrentWnd()
hbuf = GetCurrentBuf()
lnFirst = GetWndSelLnFirst( hwnd )
lnCurrent = lnFirst
lnLast = GetWndSelLnLast( hwnd )
ch_comment = CharFromAscii(47)
isCommentEnd = 1
isCommentContinue = 0
while ( lnCurrent <= lnLast )
{
ich = 0
szLine = GetBufLine(hbuf,lnCurrent)
ilen = strlen(szLine)
while ( ich < ilen )
{
if( (szLine[ich] != " ") && (szLine[ich] != "\t") )
{
break
}
ich = ich + 1
}
/*如果是空行,跳过该行*/
if(ich == ilen)
{
lnCurrent = lnCurrent + 1
szOldLine = szLine
continue
}
/*如果该行只有一个字符*/
if(ich > ilen - 2)
{
if( isCommentContinue == 1 )
{
szOldLine = cat(szOldLine," */")
PutBufLine(hbuf,lnCurrent-1,szOldLine)
isCommentContinue = 0
}
lnCurrent = lnCurrent + 1
szOldLine = szLine
continue
}
if( isCommentEnd == 1 )
{
/*如果不是在注释区内*/
if(( szLine[ich]==ch_comment ) && (szLine[ich+1]==ch_comment))
{
/* 去掉中间嵌套的注释 */
nIdx = ich + 2
while ( nIdx < ilen -1 )
{
if( (( szLine[nIdx] == "/" ) && (szLine[nIdx+1] == "*")||
( szLine[nIdx] == "*" ) && (szLine[nIdx+1] == "/") )
{
szLine[nIdx] = " "
szLine[nIdx+1] = " "
}
nIdx = nIdx + 1
}
if( isCommentContinue == 1 )
{
/* 如果是连续的注释*/
szLine[ich] = " "
szLine[ich+1] = " "
}
else
{
/*如果不是连续的注释则是新注释的开始*/
szLine[ich] = "/"
szLine[ich+1] = "*"
}
if ( lnCurrent == lnLast )
{
/*如果是最后一行则在行尾添加结束注释符*/
szLine = cat(szLine," */")
isCommentContinue = 0
}
/*更新该行*/
PutBufLine(hbuf,lnCurrent,szLine)
isCommentContinue = 1
szOldLine = szLine
lnCurrent = lnCurrent + 1
continue
}
else
{
/*如果该行的起始不是//注释*/
if( isCommentContinue == 1 )
{
szOldLine = cat(szOldLine," */")
PutBufLine(hbuf,lnCurrent-1,szOldLine)
isCommentContinue = 0
}
}
}
while ( ich < ilen - 1 )
{
//如果是/*注释区,跳过该段
if( (isCommentEnd == 0) || (szLine[ich] == "/" && szLine[ich+1] == "*"))
{
isCommentEnd = 0
while(ich < ilen - 1 )
{
if(szLine[ich] == "*" && szLine[ich+1] == "/")
{
ich = ich + 1
isCommentEnd = 1
break
}
ich = ich + 1
}
if(ich >= ilen - 1)
{
break
}
}
if(( szLine[ich]==ch_comment ) && (szLine[ich+1]==ch_comment))
{
/* 如果是//注释*/
isCommentContinue = 1
nIdx = ich
//去掉期间的/* 和 */注释符以免出现注释嵌套错误
while ( nIdx < ilen -1 )
{
if( (( szLine[nIdx] == "/" ) && (szLine[nIdx+1] == "*")||
( szLine[nIdx] == "*" ) && (szLine[nIdx+1] == "/") )
{
szLine[nIdx] = " "
szLine[nIdx+1] = " "
}
nIdx = nIdx + 1
}
szLine[ich+1] = "*"
if( lnCurrent == lnLast )
{
szLine = cat(szLine," */")
}
PutBufLine(hbuf,lnCurrent,szLine)
break
}
ich = ich + 1
}
szOldLine = szLine
lnCurrent = lnCurrent + 1
}
}
macro ComentLine()
{
hwnd = GetCurrentWnd()
hbuf = GetCurrentBuf()
lnFirst = GetWndSelLnFirst( hwnd )
lnCurrent = lnFirst
lnLast = GetWndSelLnLast( hwnd )
lnOld = 0
while ( lnCurrent <= lnLast )
{
szLine = GetBufLine(hbuf,lnCurrent)
DelBufLine(hbuf,lnCurrent)
nLeft = GetLeftBlank(szLine)
szLeft = strmid(szLine,0,nLeft);
szLine = TrimString(szLine)
ilen = strlen(szLine)
if(iLen == 0)
{
continue
}
nIdx = 0
//去掉期间的/* 和 */注释符以免出现注释嵌套错误
while ( nIdx < ilen -1 )
{
if( (( szLine[nIdx] == "/" ) && (szLine[nIdx+1] == "*")||
( szLine[nIdx] == "*" ) && (szLine[nIdx+1] == "/") )
{
szLine[nIdx] = " "
szLine[nIdx+1] = " "
}
nIdx = nIdx + 1
}
szLine = cat("/* ",szLine)
lnOld = lnCurrent
lnCurrent = CommentContent(hbuf,lnCurrent,szLeft,szLine,1)
lnLast = lnCurrent - lnOld + lnLast
lnCurrent = lnCurrent + 1
}
}
macro CmtCvtLine(lnCurrent, isCommentEnd)
{
hbuf = GetCurrentBuf()
szLine = GetBufLine(hbuf,lnCurrent)
ch_comment = CharFromAscii(47)
ich = 0
ilen = strlen(szLine)
fIsEnd = 1
iIsComment = 0;
while ( ich < ilen - 1 )
{
//如果是/*注释区,跳过该段
if( (isCommentEnd == 0) || (szLine[ich] == "/" && szLine[ich+1] == "*"))
{
fIsEnd = 0
while(ich < ilen - 1 )
{
if(szLine[ich] == "*" && szLine[ich+1] == "/")
{
ich = ich + 1
fIsEnd = 1
isCommentEnd = 1
break
}
ich = ich + 1
}
if(ich >= ilen - 1)
{
break
}
}
if(( szLine[ich]==ch_comment ) && (szLine[ich+1]==ch_comment))
{
nIdx = ich
while ( nIdx < ilen -1 )
{
if( (( szLine[nIdx] == "/" ) && (szLine[nIdx+1] == "*")||
( szLine[nIdx] == "*" ) && (szLine[nIdx+1] == "/") )
{
szLine[nIdx] = " "
szLine[nIdx+1] = " "
}
nIdx = nIdx + 1
}
szLine[ich+1] = "*"
szLine = cat(szLine," */")
DelBufLine(hbuf,lnCurrent)
InsBufLine(hbuf,lnCurrent,szLine)
return fIsEnd
}
ich = ich + 1
}
return fIsEnd
}
macro GetFileNameExt(sz)
{
i = 1
j = 0
szName = sz
iLen = strlen(sz)
if(iLen == 0)
return ""
while( i <= iLen)
{
if(sz[iLen-i] == ".")
{
j = iLen-i
szExt = strmid(sz,j + 1,iLen)
return szExt
}
i = i + 1
}
return ""
}
macro GetFileNameNoExt(sz)
{
i = 1
szName = sz
iLen = strlen(sz)
j = iLen
if(iLen == 0)
return ""
while( i <= iLen)
{
if(sz[iLen-i] == ".")
{
j = iLen-i
}
if( sz[iLen-i] == "\\" )
{
szName = strmid(sz,iLen-i+1,j)
return szName
}
i = i + 1
}
szName = strmid(sz,0,j)
return szName
}
macro GetFileName(sz)
{
i = 1
szName = sz
iLen = strlen(sz)
if(iLen == 0)
return ""
while( i <= iLen)
{
if(sz[iLen-i] == "\\")
{
szName = strmid(sz,iLen-i+1,iLen)
break
}
i = i + 1
}
return szName
}
macro InsIfdef()
{
sz = Ask("Enter #ifdef condition:")
if (sz != "")
IfdefStr(sz);
}
macro InsIfndef()
{
sz = Ask("Enter #ifndef condition:")
if (sz != "")
IfndefStr(sz);
}
// Wrap ifdef <sz> .. endif around the current selection
macro IfdefStr(sz)
{
hwnd = GetCurrentWnd()
lnFirst = GetWndSelLnFirst(hwnd)
lnLast = GetWndSelLnLast(hwnd)
hbuf = GetCurrentBuf()
lnMax = GetBufLineCount(hbuf)
if(lnMax != 0)
{
szLine = GetBufLine( hbuf, lnFirst )
}
nLeft = GetLeftBlank(szLine)
szLeft = strmid(szLine,0,nLeft);
hbuf = GetCurrentBuf()
if(lnLast + 1 < lnMax)
{
InsBufLine(hbuf, lnLast+1, "@szLeft@#endif /* @sz@ */")
}
else if(lnLast + 1 == lnMax)
{
AppendBufLine(hbuf, "@szLeft@#endif /* @sz@ */")
}
else
{
AppendBufLine(hbuf, "")
AppendBufLine(hbuf, "@szLeft@#endif /* @sz@ */")
}
InsBufLine(hbuf, lnFirst, "@szLeft@#ifdef @sz@")
SetBufIns(hbuf,lnFirst + 1,strlen(szLeft))
}
macro IfndefStr(sz)
{
hwnd = GetCurrentWnd()
lnFirst = GetWndSelLnFirst(hwnd)
lnLast = GetWndSelLnLast(hwnd)
hbuf = GetCurrentBuf()
lnMax = GetBufLineCount(hbuf)
if(lnMax != 0)
{
szLine = GetBufLine( hbuf, lnFirst )
}
nLeft = GetLeftBlank(szLine)
szLeft = strmid(szLine,0,nLeft);
hbuf = GetCurrentBuf()
if(lnLast + 1 < lnMax)
{
InsBufLine(hbuf, lnLast+1, "@szLeft@#endif /* @sz@ */")
}
else if(lnLast + 1 == lnMax)
{
AppendBufLine(hbuf, "@szLeft@#endif /* @sz@ */")
}
else
{
AppendBufLine(hbuf, "")
AppendBufLine(hbuf, "@szLeft@#endif /* @sz@ */")
}
InsBufLine(hbuf, lnFirst, "@szLeft@#ifndef @sz@")
SetBufIns(hbuf,lnFirst + 1,strlen(szLeft))
}
macro InsertPredefIf()
{
sz = Ask("Enter #if condition:")
PredefIfStr(sz)
}
macro PredefIfStr(sz)
{
hwnd = GetCurrentWnd()
lnFirst = GetWndSelLnFirst(hwnd)
lnLast = GetWndSelLnLast(hwnd)
hbuf = GetCurrentBuf()
lnMax = GetBufLineCount(hbuf)
if(lnMax != 0)
{
szLine = GetBufLine( hbuf, lnFirst )
}
nLeft = GetLeftBlank(szLine)
szLeft = strmid(szLine,0,nLeft);
hbuf = GetCurrentBuf()
if(lnLast + 1 < lnMax)
{
InsBufLine(hbuf, lnLast+1, "@szLeft@#endif /* #if @sz@ */")
}
else if(lnLast + 1 == lnMax)
{
AppendBufLine(hbuf, "@szLeft@#endif /* #if @sz@ */")
}
else
{
AppendBufLine(hbuf, "")
AppendBufLine(hbuf, "@szLeft@#endif /* #if @sz@ */")
}
InsBufLine(hbuf, lnFirst, "@szLeft@#if @sz@")
SetBufIns(hbuf,lnFirst + 1,strlen(szLeft))
}
macro HeadIfdefStr(sz)
{
hwnd = GetCurrentWnd()
lnFirst = GetWndSelLnFirst(hwnd)
hbuf = GetCurrentBuf()
InsBufLine(hbuf, lnFirst, "")
InsBufLine(hbuf, lnFirst, "#define @sz@")
InsBufLine(hbuf, lnFirst, "#ifndef @sz@")
iTotalLn = GetBufLineCount (hbuf)
InsBufLine(hbuf, iTotalLn, "#endif /* @sz@ */")
InsBufLine(hbuf, iTotalLn, "")
}
macro GetSysTime(a)
{
//从sidate取得时间
RunCmd ("sidate")
SysTime=""
SysTime.Year=getreg(Year)
if(strlen(SysTime.Year)==0)
{
setreg(Year,"2002")
setreg(Month,"05")
setreg(Day,"02")
SysTime.Year="2002"
SysTime.month="05"
SysTime.day="20"
SysTime.Date="2002年05月20日"
}
else
{
SysTime.Month=getreg(Month)
SysTime.Day=getreg(Day)
SysTime.Date=getreg(Date)
/* SysTime.Date=cat(SysTime.Year,"年")
SysTime.Date=cat(SysTime.Date,SysTime.Month)
SysTime.Date=cat(SysTime.Date,"月")
SysTime.Date=cat(SysTime.Date,SysTime.Day)
SysTime.Date=cat(SysTime.Date,"日")*/
}
return SysTime
}
macro HeaderFileCreate()
{
hwnd = GetCurrentWnd()
if (hwnd == 0)
stop
sel = GetWndSel(hwnd)
hbuf = GetWndBuf(hwnd)
language = getreg(LANGUAGE)
if(language != 1)
{
language = 0
}
szMyName = getreg(MYNAME)
if(strlen( szMyName ) == 0)
{
szMyName = Ask("Enter your name:")
setreg(MYNAME, szMyName)
}
CreateFunctionDef(hbuf,szMyName,language)
}
macro FunctionHeaderCreate()
{
hwnd = GetCurrentWnd()
if (hwnd == 0)
stop
sel = GetWndSel(hwnd)
ln = sel.lnFirst
hbuf = GetWndBuf(hwnd)
language = getreg(LANGUAGE)
if(language != 1)
{
language = 0
}
szMyName = getreg(MYNAME)
if(strlen( szMyName ) == 0)
{
szMyName = Ask("Enter your name:")
setreg(MYNAME, szMyName)
}
nVer = GetVersion()
lnMax = GetBufLineCount(hbuf)
if(ln != lnMax)
{
szNextLine = GetBufLine(hbuf,ln)
if( (strstr(szNextLine,"(") != 0xffffffff) || (nVer != 2 ))
{
symbol = GetCurSymbol()
if(strlen(symbol) != 0)
{
FuncHeadCommentCN(hbuf, ln, symbol, szMyName,0)
return
}
}
}
szFuncName = Ask("请输入函数名称:")
FuncHeadCommentCN(hbuf, ln, szFuncName, szMyName, 1)
}
macro GetVersion()
{
Record = GetProgramInfo ()
return Record.versionMajor
}
macro GetProgramInfo ()
{
Record = ""
Record.versionMajor = 2
Record.versionMinor = 1
return Record
}
macro FileHeaderCreate()
{
hwnd = GetCurrentWnd();
if (hwnd == 0)
stop;
ln = 0;
hbuf = GetWndBuf(hwnd);
language = getreg(LANGUAGE);
if(language != 1)
{
language = 0;
}
szMyName = getreg(MYNAME);
if(strlen( szMyName ) == 0)
{
szMyName = Ask("Enter your name:");
setreg(MYNAME, szMyName);
}
SetBufIns (hbuf, 0, 0);
InsertFileHeaderCN( hbuf,ln, szMyName,"" );
}
Quicker.em 的函数内容
最新推荐文章于 2021-07-07 17:31:14 发布