#!/usr/bin/perl

if (!open( ENTRIES, "entrylist" ) ) {
  print "Can't open entrylist\n";
  exit 1;
}

  while(<ENTRIES>) {
    if (/^#/) { next; }
    chop;
    @entries = split /,/;
    if (!/^.+,(\w+),(\w+)/) { next; }
    push @entryRealNames, @entries[0];
    push @entryTypes, @entries[1];
    push @entryNames, @entries[2];
    push @entryDebug, @entries[3];
  }

close ENTRIES;

if (!open( H_IN, "addressee.src.h" ) ) {
  print "Can't open addressee.src.h\n";
  exit 1;
}
if (!open( H_OUT, ">../addressee.h" ) ) {
  print "Can't open addressee.h\n";
  exit 1;
}
  print H_OUT "/*** Warning! This file has been generated by the script makeaddressee ***/\n";

  while( <H_IN> ) {
    if (/--VARIABLES--/) {
      for( $i=0; $i<@entryNames; ++$i ) {
        print H_OUT "  $entryTypes[$i] $entryNames[$i];\n";
      }
    } elsif (/--DECLARATIONS--/) {
      for( $i=0; $i<@entryNames; ++$i ) {
        print H_OUT "    /*\n";
        print H_OUT "      Set $entryRealNames[$i].\n";
        print H_OUT "    */\n";
        print H_OUT "    void set" . ucfirst($entryNames[$i]);
        print H_OUT "( const $entryTypes[$i] &$entryNames[$i] );\n";
        print H_OUT "    /*\n";
        print H_OUT "      Return $entryRealNames[$i].\n";
        print H_OUT "    */\n";
        print H_OUT "    $entryTypes[$i] $entryNames[$i]() const;\n\n";
      }
    } else {
      print H_OUT;
    }
  }

close H_OUT;
close H_IN;

if (!open( CPP_IN, "addressee.src.cpp" ) ) {
  print "Can't open addressee.src.cpp\n";
  exit 1;
}
if (!open( CPP_OUT, ">../addressee.cpp" ) ) {
  print "Can't open addressee.cpp\n";
  exit 1;
}
  print H_OUT "/*** Warning! This file has been generated by the script makeaddressee ***/\n";

  while( <CPP_IN> ) {
    if (/--DEFINITIONS--/) {
      for( $i=0; $i<@entryNames; ++$i ) {
        print CPP_OUT "void Addressee::set" . ucfirst($entryNames[$i]);
        print CPP_OUT "( const $entryTypes[$i] &$entryNames[$i] )\n{\n";        
        print CPP_OUT "  if ( $entryNames[$i] == mData->$entryNames[$i] ) return;\n";
        print CPP_OUT "  detach();\n  mData->empty = false;\n";
        print CPP_OUT "  mData->$entryNames[$i] = $entryNames[$i];\n}\n\n";
        
        print CPP_OUT "$entryTypes[$i] Addressee::$entryNames[$i]() const\n{\n";
        print CPP_OUT "  return mData->$entryNames[$i];\n}\n\n\n";
      }
    } elsif (/--DEBUG--/) {
      for( $i=0; $i<@entryNames; ++$i ) {
        print CPP_OUT "  kdDebug(5700) << \"  " . ucfirst($entryNames[$i]);
        print CPP_OUT ": '\" << $entryNames[$i]()$entryDebug[$i] << \"'\" << endl;\n";
      }
    } else {
      print CPP_OUT;
    }
  }

close CPP_OUT;
close CPP_IN;
