#!/usr/bin/perl -w
use POSIX;
use FileHandle;
use integer;
use DB_File ;
use Getopt::Long;

&GetOptions("romaji" => \$use_romaji);

if ($use_romaji) { print "Using Romaji\n"; }
open KANA, "<kanarom.sjs";
$mode = 0;
while(<KANA>) {
  next if (/^#/);
  if (/\$KATAKANA/) { $mode = 1; next; } 
  if (/\$HIRAGANA/) { $mode = 2; next; }
  
  chomp;
  ($kana, $romaji) = (/^(.*?)\s+(\S+?)(?=\s)/);
  if ($mode==1) { $romaji = uc($romaji); }
  push @K, ["\Q$kana\E","$romaji"];
}
close KANA;

autoflush STDOUT 1;
$rec = 0;
open STRING, ">STRN000$rec.bin";
open KAND,  ">KAND0000.bin";  #kanji data (bushu, skip, etc).

tie %bitmaps, 'DB_File', "../font/font.db"
        || die "Couldn't tie to file";

print STRING "\000\000";  #filler for num of strings

$stringind = 0;
$stringcnt = 0;
$maxstringlen = 0;
print "Compiled program\n";
@Data = <STDIN>;
foreach $_ (@Data) 
{ 
  next unless  ( ($kanjiNum) = /^.. +([0-9a-fA-F]{4})/ ) ;
  if (not exists $bitmaps{$kanjiNum}) {
    print "Couldn't find $kanjiNum in database\n";
    next;
  }
  if (length $bitmaps{$kanjiNum} != 32) {
    print "Problem with bitmap length\n";
  } 

  open BITM, ">>BITM000$rec.bin";
  syswrite BITM, $bitmaps{$kanjiNum},32;
  close BITM;
  print "$kanjiNum:"; 
#  $kanjiNum = hex($kanjiNum) | (128 + 128*256);
#  $kv = pack("n", $kanjiNum);
   ($k) = /^(..)/;
  ($bt) = /\sB(\S+?)\s/; #bushu
  ($ob) = /\sC(\S+?)\s/; #classic bushu
  if (defined $ob) { $bt = $ob;  }
  ($se) = /\sP(\S+?)\s/; #skip
#  ($ct) = /\sS(\S+?)\s/; #count
  ($fq) = /\sF(\S+?)\s/; #freq
  ($spahnentry) = /\sI(\S+?)\s/; #spahn and hadimitzky
  ($gradebit) = /\sG(\S+?)\s/; #grade
  if ($gradebit == 8) {$gradebit = 7;}
#  $ce = "$ct $bt";
#  $be = "$bt $ct";

  # generate string with info on each kanji
  $bushubit = $bt;
  ($skip1bit, $skip2bit, $skip3bit) = ($se =~ /(\d+)-(\d+)-(\d+)/ );
  ($spahn1bit, $spahn2bit, $spahn3bit) = ($spahnentry =~ /(\d+)([a-z])(\d+)/) ;
  $spahn2bit = (ord $spahn2bit) - (ord "a");
  $freqbit = $fq;
  $skipall = ($skip1bit-1 )*1024 +($skip2bit)*32 + $skip3bit;
  $spahnall= ($spahn1bit)*600 +($spahn2bit)*30 + $spahn3bit;

  $bushuskipfreq = $bushubit * 0x800000 + $freqbit * 4096 + $skipall;
  $spahngrade = $gradebit * 8192 + $spahnall;
  $packedkand = pack("nN", $spahngrade, $bushuskipfreq);
  print KAND $packedkand;
    
  s/^(..)\s+([0-9a-fA-F]{4})//;
  chomp;

  # remove any kana following the "T"
  while(  s/( T.*)(\s([-\x7f-\xff].*?)(?=\s))/$1 /g ) {};
  $kana = join ":", /\s([-\x7f-\xff].*?(?=\s))/g ;
  s/\s([-\x7f-\xff].*?)(?=\s)//g; 
  if ($use_romaji) {
     foreach $A (@K) {
       $kana =~ s/$A->[0]/$A->[1]/g;
     }
     if ($kana =~ /\*/) {
         while ($kana =~ s/\*([a-zA-Z])/$1$1/) {};
         while ($kana =~ s/\*\.([a-zA-Z])/$1.$1/) {};
         $kana =~ s/([A-Z])\*/$1TSU+/g;
         $kana =~ s/([a-z])\*/$1tsu+/g;
         $kana =~ s/([A-Z]).\*/$1.TSU+/g;
         $kana =~ s/([a-z]).\*/$1.tsu+/g;
     } 
  } 
  $s = join ",", /\{([^}]+?)\}/g;
  $s = "${k}${kana}--$s";
  print STRING "$s\000";
  $stringind = $stringind + 1 + length "$s"; 
  if (length "$s" > $maxstringlen) {$maxstringlen = length "$s"; }
  $stringcnt++;

  if ($stringcnt == 256 * ($rec+1) ) {
    seek STRING, 0,0;
    print STRING (pack "n", 256);
    close STRING;
    $rec = $rec +1;
    open STRING, ">STRN000$rec.bin";
    print STRING "\000\000";  #filler for num of strings
    print "Starting string $rec.  Stringcnt = $stringcnt\n";
  }
}

seek STRING, 0,0;
print STRING (pack "n", $stringcnt- (256*$rec) );
close STRING;

untie %bitmaps;

print "Max string len = $maxstringlen\n";
