|
> >それはちょっと難しいかも...
確かに難しい 。。。
C, C++ コンパイラの phase 1 の処理をマクロにするにはしんどいので、とりあ
えず、サンプルマクロを仮に書いてみましたが。これ以上はしんどいです。まっ
たくのフリーフォーマットのソースを処理するのはきついですよね。
番頭++ でした。
// find_close_kakko9.mac - 1998/05/14
// } の相手は探しずらいです。
// 文字、数値リテラル「エスケープ処理」の考慮はない。
// この作者は C, C++ を知らない。コンパイラを持っていない。
// このマクロはあくまでもサンプルである。エンハンスの予定も無い。
escape;
if( strstr("{",char(code)) == -1 ){
#sw = 0; searchdown "{";
if( ! result ){
gosearchstarted;
#sw = 1; searchup "{";
if( ! result ){ message "{ - not found !"; endmacro; }
}
#menu = 00;
while( #menu != 01 ){
menu "{ - this one ? - (&Y) Yes", "(&D) Down", "(&U) Up";
#menu = result;
if( #menu <= 00 ){
escape; endmacro;
} else if( #menu == 01 ){
} else if( #menu == 02 ){
#sw = 0; finddown;
if( ! result ){ message "{ - not found ! - down"; endmacro; }
} else if( #menu == 03 ){
#sw = 1; findup;
if( ! result ){ message "{ - not found ! - up"; endmacro; }
}
}
escape;
}
#x_start = x; #y_start = y; #i_code = code;
call pp_set1;
#level = 00;
$str_find = "^#|//.*\\n|{|}|/\\*|\\*/";
searchdown $str_find, regular;
while( result ){
if( code == '{' ){
#level = #level + 1; // push
} else if( code == '}' ){
if( #level == 00 ){ #found = 01; break; }
#level = #level - 1; // pop
} else if( code == '/' ){
escape; right;
if( code == '/' ){
golineend2;
} else if( code == '*' ){
searchdown "\\*/|/\\*", regular;
if( ! result ){
message "*/ - not found !";
call pp_reset1; endmacro;
}
if( code == '/' ){
message "/* - found !";
call pp_reset1; endmacro;
}
escape;
}
} else if( code == '*' ){
message "*/ - found !";
call pp_reset1; endmacro;
} else if( code == '#' ){
call pp_c1;
} else {
right;
}
searchdown $str_find, regular;
}
if( ! #found ){
searchup "}";
message "} - not found !";
}
escape;
call pp_reset1;
endmacro;
pp_c1:
escape; right; selectword;
$wk1 = gettext(seltopx,seltopy,selendx,selendy);
if( $wk1 == "ifdef" ){
escape; golinetop; beginsel; golineend2;
$wk2 = gettext(seltopx,seltopy,selendx,selendy);
$wk2 = leftstr($wk2,60);
menu $wk2, "(&T) True", "(&F) False";
#menu2 = result;
if( #menu2 <= 01 ){
call pp_reset1; endmacro;
} else if( #menu2 == 02 ){
escape; golineend2;
} else if( #menu2 == 03 ){
searchdown "^(#endif|#else)", regular;
if( ! result ){
message "#endif, #else - not found !";
call pp_reset1; endmacro;
}
escape; golineend2;
} else {
}
} else if( $wk1 == "else" ){
searchdown "^#endif", regular;
if( ! result ){
message "#endif - not found !";
call pp_reset1; endmacro;
}
escape; golineend2;
} else if( $wk1 == "endif" ){
golineend2;
} else {
golineend2;
}
escape;
return;
pp_set1:
$searchbuffer = searchbuffer; #searchoption = searchoption;
#selectfound = getininum("hidemaru.ini","Env","SelectFound");
if( ! #selectfound ){
writeininum "hidemaru.ini", "Env","SelectFound", 1;
envchanged;
}
return;
pp_reset1:
// setsearch $searchbuffer, #searchoption;
setsearch "{|}", 0x10; // ,regular;
if( ! #selectfound ){
writeininum "hidemaru.ini", "Env", "SelectFound", 0;
envchanged;
}
return;
|
|