view src/parallel_execution/update_context.pl @ 549:05fd14d8edbe

add update_context.pl
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Wed, 13 Nov 2019 16:04:34 +0900
parents
children 91c8f5613a49
line wrap: on
line source

#!/usr/bin/env perl
use strict;
use warnings;

my $interface_file = shift or die "require itnerface file";
my $h2context = parse_interface($interface_file);
my $context = dump_h2context($h2context);
my ($first,$last) = slup_context_h($h2context->{name});
print "@{$first}";
print "$context";
print "    //INFO: NEXT_CONTEXT\n";
print "@{$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 =~ /INFO: NEXT_CONTEXT/) {
      push(@last_context_headers, <$fh>);
      last;
    }
    if ( $line =~ /struct $data_gear_name/) {
      print "WARN! This 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;
    }

    $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;
}