#!/usr/bin/perl
#
# $Id: convvia,v 1.1 1997/05/22 22:01:16 fachat Exp ettore $
#
# This file is part of VICE, the Versatile Commodore Emulator.
# See README for copyright notice.
#
# This prg converts the via-tmpl.c file into a real C file,
# using the functions in via1.def/via2.def
#
# Written (i.e. taken from convop script) by
#   Andre' Fachat (fachat@physik.tu-chemnitz.de)
#
# $Log: convvia,v $
# Revision 1.1  1997/05/22 22:01:16  fachat
# Initial revision
#
#

#sub doit;
#$odir=$ENV{ODIR};
$odir = ".";

&doit( "via-tmpl.c", "via1.def", "${odir}/via1.c", "via", "VIA", "1", "maincpu", "clk");
&doit( "via-tmpl.c", "via2.def", "${odir}/via2.c", "via", "VIA", "2", "maincpu", "clk");
&doit( "via-tmpl.c", "viap.def", "${odir}/via.c", "via", "VIA", "", "maincpu", "clk");
&doit( "via-tmpl.c", "viad1.def", "${odir}/viad1.c", "via", "VIA", "D1", "true1541",
       "true1541_clk");
&doit( "via-tmpl.c", "viad2.def", "${odir}/viad2.c", "via", "VIA", "D2", "true1541",
       "true1541_clk");

sub doit {
  $TEMPL = $_[0];
  $CIAD  = $_[1];
  $CIAO  = $_[2];
  $LBASE = $_[3];
  $UBASE = $_[4];
  $NUM   = $_[5];
  $CPU   = $_[6];
  $CLK   = $_[7];
  
  @DEFVAL = ();
  %DEFINE = ();
  @FUNC = ();

  # Scan defines in via?.def
  open (M, "<$CIAD") || die ("\nCannot open $CIAD\n");
  $ndefs = 0;
  while (<M>) {
        if (/^#define\s+(\S*)\s+(.*)/) {
            print "define $1=$2.\n";
            if ($DEFINE{$1} ne "") {
                print "already defined to $DEFINE{$1}\n";
            } else {
                $DEFINE{$1} = $2;
		$DEFVAL[$ndefs] = $1;
		$ndefs += 1;
            }
        }
  }
  close(M);

  # Scan functions in via?.def
  open (M, "<$CIAD") || die ("\nCannot open $CIAD\n");
  while($_ = <M>) {
    if (/^s*(\S*)\s*\(\s*\)/) {
        $name = $1;
        ($c = getc(M)) while ($c ne '{');
        $s = ""; $bc = 1;

        do {
            $c = getc(M);
            ($c eq '{') && $bc++;
            ($c eq '}') && $bc--;
            $bc && ($s .= $c);
            #print "$bc,$c\n";
        } while (!eof(M) && $bc); 
        $FUNC{$name} = $s;
        print "func $name\n<$FUNC{$name}>\n";
    } else {
        !/^$|^#/ && print O $_;
    }
  }
  close (M);

  # Open Input/Output files for loops
  #
  open(O, ">$CIAO");
  print O "\n/*\n * $CIAO\n * This file is generated from $TEMPL and $CIAD,\n * Do not edit!\n */\n";

  open(I, "<$TEMPL");
  while(<I>) {
    chomp;
    s/\n//g;
    s/my$LBASE/$LBASE$NUM/g;
    s/MY$UBASE/$UBASE$NUM/g;
    s/mycpu/$CPU/g;
    s/myclk/$CLK/g;
	
    $t = $_;
    $i = 0;
    #print "define(0) = $DEFVAL[$i]\n";
    while ($DEFVAL[$i] ne "") {
      s/$DEFVAL[$i]/$DEFINE{$DEFVAL[$i]}/g;
      $i += 1;
    }
    $f = $_;
    s/^\s+//g;

    #print "f=$f, _='$_' FUNC()=$FUNC{$f}, DEFINE()=$DEFINE{$_}\n";
  
    if($FUNC{$_}) {
      print O $FUNC{$_};
    } else {
#      if($DEFINE{$_}) { 
#        print O $DEFINE{$_};
#      } else {
        print O "$f\n";
#      }
    }
  }
  close (O);  
}

