#!/usr/bin/perl

use strict;
use warnings;

my $header =<<'END_HEADER';
#include "inttypes.h"
#include "parrot/parrot.h"
#include "parrot/embed.h"

END_HEADER

my $body =<<'END_BODY';
int main(int argc, char *argv[])
{
    Parrot_Interp interp;
    struct PackFile *pf;

    interp = Parrot_new( NULL );
    if (interp == NULL)
        return 1;

    pf = PackFile_new(interp, 0);

    if (!PackFile_unpack(interp, pf, (opcode_t *)program_code, bytecode_size))
        return 1;

    do_sub_pragmas(interp, pf->cur_cs, PBC_PBC, NULL);

    Parrot_loadbc(interp, pf);

    PackFile_fixup_subs(interp, PBC_MAIN, NULL);
    Parrot_runcode(interp, argc, argv);
    Parrot_destroy(interp);
    Parrot_exit(interp, 0);

    return 0;
}
END_BODY

print $header;

print "int32_t program_code[] = {\n";

local $/ = 1024;
my $length;
while (<>)
{
    $length += length $_;
    print "    ", join( ",\n    ", unpack( "l*", $_ )), "\n"
}

print "\n};\nint bytecode_size = $length;\n\n";

print $body;
