#!/usr/bin/perl
#
#clean a latex file for camera-ready submission
#this is the third part of cleanlatex, it flattens all branches
#\newif\ifsomething\somethingtrue ... \ifsomething ... \else (alternative) \fi
#of the latex file
#
#Jan Poland, March 8, 2006
#

%C=(true => 1, false => -1);
@V=();

$s=<STDIN>;
while ($s) {
  $s1=$s;
  $s1=~s/\\(newif\\if\w)/\\@&\1/; 
  $s1=~s/\\(if\w)/\\@&\1/; 
  $s1=~s/\\(else\W)/\\@&\1/; 
  $s1=~s/\\(fi\W)/\\@&\1/; 
  $s1=~s/\\(\w+true\W)/\\@&\1/; 
  $s1=~s/\\(\w+false\W)/\\@&\1/; 
  
  $idx=index($s1,"\\@&"); if ($idx<0) {$idx=length($s);}
    
  if (all(@V)) {print substr($s,0,$idx);}
  $s=substr($s,$idx,length($s)-$idx);
  
  if ($s=~/^\\newif\\if\w/) {
    $_=$s; ($name) = (m/^\\newif\\if(\w+)/);
    $C{$name}=-1;
    $idx=9+length($name);
    if (all(@V)) {print '\relax';}
  } elsif ($s=~/^\\if\w/) {
    $_=$s; ($name) = (m/^\\if(\w+)/);
    push(@V,$C{$name});
    $idx=3+length($name);
    if (all(@V)) {print '\relax';}
  } elsif ($s=~/^\\else\W/) {
    push(@V,-pop(@V));
    $idx=5;
    if (all(@V)) {print '\relax';}
  } elsif ($s=~/^\\fi\W/) {
    pop(@V);
    $idx=3;
    if (all(@V)) {print '\relax';}
  } elsif ($s=~/^\\\w+true\W/) {
    $_=$s; ($name) = (m/^\\(\w+)true/);
    $idx=5+length($name);
    if ($C{$name}) {
      $C{$name}=1;
      if (all(@V)) {print '\relax';}
    } else {
      if (all(@V)) {print substr($s,0,$idx);}
    }  
  } elsif ($s=~/^\\\w+false\W/) {
    $_=$s; ($name) = (m/^\\(\w+)false/);
    $idx=6+length($name);
    if ($C{$name}) {
      $C{$name}=-1;
      if (all(@V)) {print '\relax';}
    } else {
      if (all(@V)) {print substr($s,0,$idx);}
    }  
  }
  $s=substr($s,$idx,length($s)-$idx);
  
  if (!$s) {$s=<STDIN>;}
}

sub all {
  my $r = 1;
  my $v;
  foreach $v (@_) {if ($v<0) {$r=0;}}
  return $r;
}

sub min { 
  my $min = pop(@_); 
  my $v; 
  foreach $v (@_) { if ($min>$v) {$min=$v;} } 
  return $min;
}
