function  do_if(proc,sym,  direct ) {
   if( (sym in defined) && (defined[sym]!=0 ) ) {
       while( direct!="else" && direct!="endif" )  direct=proc_line(proc)
       if(direct=="else")
           while( direct!="endif" )  direct=proc_line(0)
   } else {
       while( direct!="else" && direct!="endif" )  direct=proc_line(0)
       if(direct=="else")
           while( direct!="endif" )  direct=proc_line(proc)
   }
}

function  do_if_not(proc,sym,  direct ) {
   if( (!(sym in defined)) || (defined[sym]==0 ) ) {
       while( direct!="else" && direct!="endif" )  direct=proc_line(proc)
       if(direct=="else")
           while( direct!="endif" )  direct=proc_line(0)
   } else {
       while( direct!="else" && direct!="endif" )  direct=proc_line(0)
       if(direct=="else")
           while( direct!="endif" )  direct=proc_line(proc)
   }
}

function  do_ifdef(proc,sym,  direct ) {
   if( sym in defined ) {
       while( direct!="else" && direct!="endif" )  direct=proc_line(proc)
       if(direct=="else")
           while( direct!="endif" )  direct=proc_line(0)
   } else {
       while( direct!="else" && direct!="endif" )  direct=proc_line(0)
       if(direct=="else")
           while( direct!="endif" )  direct=proc_line(proc)
   }
}

function  do_ifndef(proc,sym,    direct) {
   if( !(sym in defined) ) {
       while( direct!="else" && direct!="endif" )  direct=proc_line(proc)
       if(direct=="else")
           while( direct!="endif" )  direct=proc_line(0)
   } else {
       while( direct!="else" && direct!="endif" )  direct=proc_line(0)
       if(direct=="else")
           while( direct!="endif" )  direct=proc_line(proc)
   }
}

function proc_line(proc, direct) {
   if( (getline<"jbtxbst.doc") <1 ) {
       exit
   }
   lno++;
   if( $0 ~ /^#/ ) {
       if( $1=="#" ) {
           direct=$2; arg1=$3; arg2=$4
       }else {
           direct=substr($1,2,16); arg1=$2; arg2=$3
       }
       if(direct=="define") {
           if(proc)  defined[arg1]=arg2+0
       } else if(direct=="ifdef" ){
           do_ifdef(proc,arg1)
       }else if(direct=="ifndef") {
           do_ifndef(proc,arg1)
       }else if(direct=="if") {
           if( substr(arg1,1,1)=="!" ) do_if_not(proc,substr(arg1,2,32))
           else do_if(proc,arg1)
       }else if( (direct!="else") && (direct!="endif") ){
           print "% Error **undefined **",direct,"** in line",lno >"/dev/tty"
           exit
       }
       return direct;
   }else if($0 ~ /^%/ ) {
       return ""       # コメントは基本的には削除する
   }else if($0 ~ /^    %/ ) {
       sub(/   /,"")   # この形式のコメントは出力する
       print $0
       return ""
   }else {
       if(proc) print $0
       return ""
   }
}
BEGIN{
   if(ARGC<2) {
       print "usage: gawk -f cpp.awk <style-type> [<option>]"
       print "<style-type> = JPLAIN | JALPHA | JABBRV | JUNSRT | JIPSJ"
       print "               TIPSJ  | TIEICE | JNAME  | JORSJ"
       print "<option> = ASCII"
       exit
   }
   opt=ARGV[1]
   name["JPLAIN"]="jplain"; name["JALPHA"]="jalpha"; name["JABBRV"]="jabbrv"
   name["JUNSRT"]="junsrt"; name["JIPSJ" ]="jipsj" ; name["TIPSJ" ]="tipsj"
   name["TIEICE"]="tieice"; name["JNAME" ]="jname" ; name["JORSJ" ]="jorsj"
   if( opt in name )
      printf("%% JBibTeX standard bibliography style `%s'\n",name[opt])
   for(i=1;i<ARGC;i++) {
       defined[ARGV[i]]=1
       ARGV[i]=""
   }
   while(1) proc_line(1)
}