view src/parallel_execution/generate_stub.pl @ 243:6a80ab36181c

generate impl
author mir3636
date Tue, 24 Jan 2017 19:52:20 +0900
parents 24da4f217447
children afa1e02e4386
line wrap: on
line source

#!/usr/bin/perl

# interface.cbc
# typedef struct Worker {
#         int id;
#         struct Context* contexts;
#         enum Code execute;
#         enum Code taskSend;
#         enum Code taskRecive;
#         enum Code shutdown;
#         struct Queue* tasks;
#     } Worker;

system "rm -rf d";
system "mkdir d";

while (<*.cbc>) {
    &getDataGear($_);
}

&generateDataGear();

sub getDataGear {
    my ($filename) = @_;
    open my $fd,"<",$filename or die("can't open $filename $!");
    while (<$fd>) {
        if (! $inTypedef) {
            if (/^typedef struct (\w+) {/) {
                $inTypedef = 1;
                $name = $1;
                $dataGear{$name} = $_;
            }
            if (/^\_\_code (\w+)/) {
                $codeGearName = $1;
                while (/struct (\w+)\*\s(\w+)/g) {
                    $tmp = lcfirst($1);
                    if ($tmp ne $2) {
                        $tmp = ucfirst($2);
                        $dataGearName{$codeGearName} .= "\t\t(" . $1 . "*)GearImpl(context, " . $tmp . ", " . $2 . ")";
                        $dataGearName{$codeGearName} .= ",\n";
                    } else {
                        $dataGearName{$codeGearName} .= "\t\tGearef(context, " . $1 . ")";
                        $dataGearName{$codeGearName} .= ",\n";
                    }
                }
                next;
            }
            next;
        }
        $dataGear{$name} .= $_;
	if (/(\w+);$/ and !/^} (\w+)/) {
	    $tmp = $1 . "\n";
	    if (/{/) {
	            $tmp = "{" . $';
	            $tmp =~ s/;$//;
	    }
	    $var{$name} .= $tmp;
	    $tmp = $`;
	    $tmp =~ s/^\s*//;
	    $type{$name} .= $tmp . "\n";
	}
        if (/^}/) {
            $inTypedef = 0;
        }
    }
}

sub generateDataGear {
    open my $fd,">","d/extern.h" or die("can't open d/extern.h $!");
    for my $name ( sort keys %dataGear ) {
        print $fd $dataGear{$name},"\n";
    }
    print $fd "\n";

    open my $fd,">","d/type.h" or die("can't open d/stub.h $!");
    for my $name ( sort keys %dataGear ) {
        print $fd $var{$name},"\n";
    }
    for my $name ( sort keys %dataGear ) {
        print $fd $type{$name},"\n";
    }
    
    open my $fd,">","d/stub.h" or die("can't open d/stub.h $!");
    for my $codeGearName ( sort keys %dataGearName ) {
        print $fd "__code ", $codeGearName ,"_stub (struct Context* context) {\n";
	print $fd "\tgoto " . $codeGearName . "(";
        #print $fd "\tgoto " . $codeGearName . "(context,\n";
        print $fd substr($dataGearName{$codeGearName},2,-2);
        print $fd "); \n} \n\n";
    }
    print $fd "\n";
}

# end