#!/usr/bin/perl
# -*- mode:perl -*-
# easy config for nicolatter

sub usage() {
  print "usage:\n";
  print "  configure (gtk|xt) [canna] [wnn]\n";
  print "\n";
  print "  gtk, xtϤɤ餫canna, wnnϾʤƤĤ\n";
  exit 1;
}

sub look_for(@) {
  my @files = @_;
  foreach $file (@files) {
    return $file if (-f $file);
  }
  return "";
}

sub wnn_config() {
  my @WNNENVRC = ('/usr/lib/wnn/ja_JP/wnnenvrc',
                  '/usr/local/lib/wnn/ja_JP/wnnenvrc',
                  '/usr/lib/wnn6/ja_JP/wnnenvrc',
                  '/usr/local/lib/wnn6/ja_JP/wnnenvrc',
                  '/usr/share/wnn/ja_JP/wnnenvrc',
                  '/etc/FreeWnn/ja/wnnenvrc');
    
  my @JLLIBH = ('/usr/include/wnn/jllib.h',
                '/usr/local/include/wnn/jllib.h',
                '/usr/X11R6/include/wnn/jllib.h',
                '/usr/include/wnn6/jllib.h',
                '/usr/local/include/wnn6/jllib.h');

  my @LIBWNN = ('/usr/lib/libwnn.a',
                '/usr/local/lib/libwnn.a',
                '/usr/lib/libwnn6.a',
                '/usr/local/lib/libwnn6.a',
                '/usr/lib/libwnn.so',
                '/usr/local/lib/libwnn.so',
                '/usr/lib/libwnn6.so',
                '/usr/local/lib/libwnn6.so',
                '/usr/X11R6/lib/libwnn.a');

  # look for files
  print "Looking for wnnenvrc...";
  if ($ENV{'WNNENVRC'}) {
    $wnnenvrc = $ENV{'WNNENVRC'};
  }
  else {
    $wnnenvrc = look_for(@WNNENVRC);
  }
  if (!$wnnenvrc) { print "failed.\n"; exit 1; }
  print "found.\n";

  print "Looking for jllib.h....";
  $jllibh = look_for(@JLLIBH);
  if (!$jllibh) { print "failed.\n"; exit 1; }
  print "found.\n";

  print "Looking for libwnn.....";
  $libwnn = look_for(@LIBWNN);
  if (!$libwnn) { print "failed.\n"; exit 1; }
  print "found.\n";
}

sub canna_config() {
  my @CANNA_INC = ('/usr/local/canna/include/canna/jrkanji.h',
                   '/usr/local/include/canna/jrkanji.h',
                   '/usr/include/canna/jrkanji.h');

  # sysdep.hإåʤΤǡޤ˾ޤʤ
  # jrkanji.hCANNAWC_DEFINEDƤ뤫ɤĴ٤٤
  my @CANNA37_INC = ('/usr/local/canna/include/canna/sysdep.h',
                   '/usr/local/include/canna/sysdep.h',
                   '/usr/include/canna/sysdep.h');

  my @CANNA_LIB = ('/usr/local/canna/lib/libcanna16.a',
                   '/usr/local/lib/libcanna16.a',
                   '/usr/lib/libcanna16.a');

  print "Looking for jrkanji.h...";
  $canna_inc = look_for(@CANNA_INC);
  if (!$canna_inc) { print "failed.\n"; exit 1; }
  print "found.\n";

  print "Looking for libcanna16...";
  $canna_lib = look_for(@CANNA_LIB);
  if (!$canna_lib) { print "failed.\n"; exit 1; }
  print "found.\n";

  print "Canna version...";
  $canna37_inc = look_for(@CANNA37_INC);
  if (!$canna37_inc) {
    print "3.6 or older.\n";
    $canna37 = 0;
  }
  else {
    print "3.7 or later.\n";
    $canna37 = 1;
  }
}

sub iconv_config() {
  my @ICONV_INC = ('/usr/local/include/iconv.h',
                   '/usr/include/iconv.h');

  my @ICONV_LIB = ('/usr/local/lib/libiconv.so',
                   '/usr/lib/libiconv.so');

  print "Looking for iconv.h...";
  my $iconv_h = look_for(@ICONV_INC);
  if (!$iconv_h) { print "failed.\n"; exit 1; }
  print "found.\n";

  print "Looking for libiconv.so...";
  $iconv_lib = look_for(@ICONV_LIB);
  if ($iconv_lib) { print "found.\n"; } else { print "not found.\n"; }
}

while ($x = shift(@ARGV)) {
    if (($x eq "gtk") && !$toolkit) { $toolkit = 1; }
    elsif (($x eq "xt") && !$toolkit) { $toolkit = 2; }
    elsif ($x eq "canna") { $use_canna = 1; }
    elsif ($x eq "wnn") { $use_wnn = 1; }
    else { usage(); }
}
if (!$toolkit || !$use_canna && !$use_wnn) { usage(); }

if ($use_wnn) { wnn_config(); }
if ($use_canna) { canna_config(); }
iconv_config();

print "\n";
print "nicolatter was configured as follows:\n";
print "\n";
print "toolkit: ", ($toolkit == 1 ? "gtk+" : "Xt"), "\n";
if ($use_wnn) {
    print "Wnn support: enable\n";
    print "       wnnenvrc: $wnnenvrc\n";
    print "        jllib.h: $jllibh\n";
    print "         libwnn: $libwnn\n";
}
else {
    print "Wnn support: disable\n";
}

if ($use_canna) {
  print "Canna support: enable\n";
  print "      jrkanji.h: $canna_inc\n";
  print "   libcanna16.a: $canna_lib\n";
}
else {
  print "Canna support: disable\n";
}

if ($iconv_lib) {
  print "iconv: $iconv_lib\n";
}
else {
  print "iconv: built-in function\n";
}

# edit configuration files
system "mv config.h config.h.bak" || die $!;
open(IN, "config.h.bak") || die $!;
open(OUT, ">config.h") || die $!;
while (<IN>) {
    if (/#define USE_CANNA/ || /#undef USE_CANNA/) {
        if ($use_canna) { print OUT "#define USE_CANNA\n"; next; }
        else { print OUT "#undef USE_CANNA\n"; next; }
    }
    if (/#define CANNA37/ || /#undef CANNA37/) {
        if ($canna37) { print OUT "#define CANNA37\n"; next; }
        else { print OUT "#undef CANNA37\n"; next; }
    }
    if (/#define USE_WNN/ || /#undef USE_WNN/) {
        if ($use_wnn) { print OUT "#define USE_WNN\n"; next; }
        else { print OUT "#undef USE_WNN\n"; next; }
    }
    if ($use_wnn && /#define WNN_ENVRCFILE/) {
        print OUT "#define WNN_ENVRCFILE \"$wnnenvrc\"\n"; next;
    }
    print OUT;
}
close(IN);
close(OUT);
print "Modified config.h\n";

if ($use_wnn) {
  $jllibh =~ s/\/jllib.h//;
  if ($libwnn =~ /libwnn6/) { $wnn6 = 1; }
  $libwnn =~ s/\/libwnn.*$//;
}

if ($use_canna) {
  $canna_inc =~ s/\/canna\/jrkanji.h//;
  $canna_lib =~ s/\/libcanna16.a//;
}

system "mv Makefile.conf Makefile.conf.bak" || die $!;
open(IN, "Makefile.conf.bak") || die $!;
open(OUT, ">Makefile.conf") || die $!;
while (<IN>) {
    if ($use_canna) {
      if (/CANNAINCDIR/) {
        print OUT "CANNAINCDIR=-I$canna_inc\n";
        next;
      }
      if (/CANNALIBS/) {
        print OUT "CANNALIBS=-L$canna_lib -lcanna16\n";
        next;
      }
    }
    else {
        if (/^CANNAINCDIR/) { s/^/#/; }
        if (/^CANNALIBS/) { s/^/#/; }
    }

    if ($use_wnn) {
        if (/WNNINCDIR/) {
            print OUT "WNNINCDIR=-I$jllibh\n";
            next;
        }
        if (/WNNLIBS/) {
            if ($wnn6) { print OUT "WNNLIBS=-lwnn6 -lcrypt\n"; }
            else { print OUT "WNNLIBS=-lwnn -lcrypt\n"; }
            next;
        }
    }
    else {
        if (/^WNNINCDIR/) { s/^/#/; }
        if (/^WNNLIBS/) { s/^/#/; }
    }
    print OUT;
}
close(IN);
close(OUT);
print "Modified Makefile.conf\n";

system "mv nicolatter/Makefile nicolatter/Makefile.bak" || die $!;
open(IN, "nicolatter/Makefile.bak") || die $!;
open(OUT, ">nicolatter/Makefile") || die $!;
while (<IN>) {
    if ($use_canna) {
        if (/^#CANNAFILES/) { s/^#//; }
    }
    else {
        if (/^CANNAFILES/) { s/^/#/; }
    }

    if ($use_wnn) {
        if (/^#WNNFILES/) { s/^#//; }
    }
    else {
        if (/^WNNFILES/) { s/^/#/; }
    }

    if ($toolkit == 1) {
        # gtk+
        if (/^#GTKCFLAGS/) { s/^#//; }
        elsif (/^#GTKLDFLAGS/) { s/^#//; }
        elsif (/^#GTKFILES/) { s/^#//; }
        elsif (/^XTCFLAGS/) { s/^/#/; }
        elsif (/^XTLDFLAGS/) { s/^/#/; }
        elsif (/^XTFILES/) { s/^/#/; }
    }
    else {
        # Xt
        if (/^GTKCFLAGS/) { s/^/#/; }
        elsif (/^GTKLDFLAGS/) { s/^/#/; }
        elsif (/^GTKFILES/) { s/^/#/; }
        elsif (/^#XTCFLAGS/) { s/^#//; }
        elsif (/^#XTLDFLAGS/) { s/^#//; }
        elsif (/^#XTFILES/) { s/^#//; }
    }

  if (/^ICONVLIBS/) {
    if ($iconv_lib) {
      print OUT "ICONVLIBS=-L$iconv_lib -liconv\n";
    }
    else {
      print OUT "ICONVLIBS=\n";
    }
    next
  }

  print OUT;
}
close(IN);
close(OUT);
print "Modified nicolatter/Makefile\n";

# End
