h[++lines]=$0のようにすればいいでしょう。 そしてこの ``lines'' という変数で現在保存している行数を管理すれば、 リセットも ``lines=0''、および必要ならばフラグのクリアで済みます。
現在保存している行があるかどうかも、 この ``lines'' の値を見ればいいだけ (正ならば保存している行がある) ですし、出力部分もこれを利用すれば、
for(j=1;j<lines;j++) print h[j] print h[lines] ";"でできます。
また、「ア」
「オ」のパターンは、正規表現を使って、以下のように書けます。
/^[_a-zA-Z].*\(/
/\)[ \t]*$/ /^[ \t]/
/^\{[ \t]*$/ /;[ \t]*$/ これで今までの疑似コードをすべて具体的なコードとして書くことができます。 それらを上げてみます。
まず、単純なアルゴリズムの場合 (cf. 6 節):
{
while(1){
if($0 !~ /^[_a-zA-Z].*\(/) next
lines=0; h[++lines]=$0
while(1){
if($0 ~ /\)[ \t]*$/){
getline
if($0 ~ /^\{[ \t]*$/){
for(j=1;j<lines;j++) print h[j]
print h[lines] ";"
next
}
else break
}
else if($0 ~ /;[ \t]*$/) next
else{
getline
if($0 !~ /^[ \t]/) break
h[++lines]=$0
}
}
}
}
次は、パターンマッチ中心のコード (cf. 7 節):
{ flag1=0 }
/^[_a-zA-Z].*\(/ {
lines=0; flag2=0; h[++lines]=$0
flag1=1
}
/^[ \t]/ {
if(lines>0){ h[++lines]=$0; flag1=1 }
else{ lines=0; flag2=0; next }
}
/^\{[ \t]*$/ {
if(flag2==1){
for(j=1;j<lines;j++) print h[j]
print h[lines] ";"
}
lines=0; flag2=0
next
}
/\)[ \t]*$/ { if(flag1==1) flag2=1; next }
(flag1==0){ lines=0; flag2=0 }
また、この無駄を省いたもの:
{ flag1=0 }
{
if($0 ~ /^[_a-zA-Z].*\(/){
lines=0; flag2=0; h[++lines]=$0
flag1=1
}
else if($0 ~ /^[ \t]/){
if(lines>0){ h[++lines]=$0; flag1=1 }
else{ lines=0; flag2=0; next }
}
else if($0 ~ /^\{[ \t]*$/){
if(flag2==1){
for(j=1;j<lines;j++) print h[j]
print h[lines] ";"
}
lines=0; flag2=0
next;
}
}
/\)[ \t]*$/{ if(flag1==1) flag2=1; next }
(flag1==0){ lines=0; flag2=0 }
および、いっそ一つのブロックで書いたもの:
{
flag1=0
if($0 ~ /^[_a-zA-Z].*\(/){
lines=0; flag2=0; h[++lines]=$0
flag1=1;
}
else if($0 ~ /^[ \t]/){
if(lines>0){ h[++lines]=$0; flag1=1 }
else{ lines=0; flag2=0; next }
}
else if($0 ~ /^\{[ \t]*$/){
if(flag2==1){
for(j=1;j<lines;j++) print h[j]
print h[lines] ";"
}
lines=0; flag2=0
next;
}
if(/\)[ \t]*$/){ if(flag1==1) flag2=1; next }
if(flag1==0){ lines=0; flag2=0 }
}
そして状態を保存するアルゴリズムの場合 (cf. 8 節):
/^[_a-zA-Z].*\(/ { lines=0; h[++lines]=$0; mode=1 }
(mode==1 || mode==2){
if($0 ~ /^[ \t]/) h[++lines]=$0
else if(mode!=1){ mode=0; next }
if($0 ~ /\)[ \t]*$/) mode=3
else if($0 ~ /;[ \t]*$/) mode=0
else mode=2
next
}
(mode==3){
if($0 ~ /^\{[ \t]*$/){
for(j=1;j<lines;j++) print h[j]
print h[lines] ";"
}
mode=0
}
それの例外処理を先にしたもの:
/^[_a-zA-Z].*\(/ { lines=0; h[++lines]=$0; mode=1 }
(mode==0){ next }
(mode==3){
if($0 ~ /^\{[ \t]*$/){
for(j=1;j<lines;j++) print h[j]
print h[lines] ";"
}
mode=0
next
}
{
if($0 ~ /^[ \t]/) h[++lines]=$0
else if(mode!=1){ mode=0; next }
if($0 ~ /\)[ \t]*$/) mode=3
else if($0 ~ /;[ \t]*$/) mode=0
else mode=2
}