#!/usr/bin/perl
use warnings;
use strict;
use Getopt::Std;
my %options;
getopt("ivcm",\%options);
do {
die "Usage: $0 -i -v -c -m \n" unless defined $options{$_}
} for qw/i v c m/;
open my $input, "<", $options{i} || die "$options{i}: $!\n";
open my $code, ">", $options{c} || die "$options{c}: $!\n";
open my $var, ">", $options{v} || die "$options{v}: $!\n";
open my $macro, ">", $options{m} || die "$options{m}: $!\n";
while (defined(my $line = <$input>)) {
chomp $line;
next if $line=~/^\s*$/;
next if $line=~/^\s*\*/;
$line=~s/EQU\s+\*//;
$line=~s/\s*$//;
my @fields = split /\s+/,$line,4;
shift @fields until $fields[0] ne '';
if ($fields[0] eq 'BEGIN') {
print $code join ("\t",@fields),"\n";
} elsif ($fields[0] =~ /^(BEGIN|L|CLI|BNE|LTR)$/) { #code
pop @fields;
print $code (join "\t",@fields),($fields[0] eq 'CLI' ? "" : "\n");
} elsif ($fields[0] =~ /^@/) { # macro
print $macro (join "\t",@fields),"\n";
pop @fields;
print $code (join "\t",@fields),"\n";
} elsif ($fields[1] =~ /^D[CS]$/) { #variable?
my ($len) = ($fields[2] =~ /L(\d+)/); #???
my ($type) = $fields[2] =~ /^(.)/; # ???
my ($value) = ($fields[2] =~ /'(\d+)'$/); #???
print $var (join "\t",$fields[0],$len,$type,$value,$fields[3]),"\n";
} else {
warn "Don't know what to do with line\n$line\n";
}
}
close $_ || die $! for ($input,$code,$var,$macro);