view src/parallel_execution/update_context.pl @ 554:bb0c841aeb8f

fix update_context.pl when empty line
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 18 Nov 2019 18:25:37 +0900
parents e9b1f533e587
children bcc137ca91da
line wrap: on
line source

#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Std;

my %opt;
getopts("wc" => \%opt);

my $interface_file = shift or die "require itnerface file";
my $h2context = parse_interface($interface_file);
my $context = dump_h2context($h2context);

if ($opt{c}) {
  print "$context";
  exit 0;
}

my ($first,$last) = slup_context_h($h2context->{name});

if ($opt{w}) {
  context_write(@{$first},$context,@{$last});
} else {
  context_dump(@{$first},$context,@{$last});
}


sub slup_context_h {
  open my $fh, '<', 'context.h';
  
  my $data_gear_name = shift;

  my @first_context_headers = ();
  my @last_context_headers = ();
  
  while (my $line = <$fh>) {
    if ( $line =~ /union Data end/) {
      push(@last_context_headers, $line);
      push(@last_context_headers, <$fh>);
      last;
    }
    if ( $line =~ /struct $data_gear_name/) {
      print "WARN! $data_gear_name struct already exists\n";
      exit 1;
    }
    push(@first_context_headers, $line);
  }
  
  close $fh;
  
  #print "@first_context_headers\n";
  #print "@last_context_headers\n";
  return (\@first_context_headers,\@last_context_headers);
}

sub parse_interface {
  my $file_name = shift;

  open my $fh, '<', $file_name;

  my $h2context = {};

  while (my $line = <$fh>) {
    if ($line =~ /typedef struct (\w+)\s?<.*/) {
      die "invalied struct name $1" unless $1;
      $h2context->{name} = $1;
      next;
    }

    if ($line =~ m[/\*|//|}]) {
      next;
    }

    if ($line =~ /__code (\w+)\(.*/) {
      push(@{$h2context->{codes}},$1);
      next;
    }

    if ($line =~ /^\s+$/) {
      next;
    }

    $line =~ s/\s*([\w\s\*]+);\s*/$1/;
    push(@{$h2context->{data}},$1);
  }

  close $fh;
  return $h2context;
}


sub dump_h2context {
  my $h2context = shift;
  my $context = '';
  my $space = '    ';
  #print "${space}struct $h2context->{name} {\n";
  $context =  "${space}struct $h2context->{name} {\n";
  for my $datum (@{$h2context->{data}}) {
    #print "${space}${space}$datum; \n";
    $context .= "${space}${space}$datum;\n";
  }
  for my $code (@{$h2context->{codes}}) {
    #print "${space}${space}enum Code $code;\n";
    $context .= "${space}${space}enum Code $code;\n";
  }
  #print "${space}} $h2context->{name};\n";
  $context .= "${space}} $h2context->{name};\n";
  return $context;
}

sub context_dump {
  for my $line (@_) {
    print "$line";
  }
}

sub context_write {
  open my $fh, '>', "context.h";
  for my $line (@_) {
    print $fh "$line";
  }
  close $fh;
}