194
|
1 #!/usr/bin/perl
|
|
2
|
|
3 # interface.cbc
|
|
4 # typedef struct Worker {
|
|
5 # int id;
|
|
6 # struct Context* contexts;
|
|
7 # enum Code execute;
|
|
8 # enum Code taskSend;
|
|
9 # enum Code taskRecive;
|
|
10 # enum Code shutdown;
|
|
11 # struct Queue* tasks;
|
|
12 # } Worker;
|
|
13
|
|
14 system "rm -rf d";
|
|
15 system "mkdir d";
|
|
16
|
|
17 while (<*.cbc>) {
|
|
18 &getDataGear($_);
|
|
19 }
|
|
20
|
|
21 &generateDataGear();
|
|
22
|
|
23 sub getDataGear {
|
|
24 my ($filename) = @_;
|
|
25 open my $fd,"<",$filename or die("can't open $filename $!");
|
|
26 while (<$fd>) {
|
|
27 if (! $inTypedef) {
|
|
28 if (/^typedef struct (\w+) {/) {
|
|
29 $inTypedef = 1;
|
|
30 $name = $1;
|
|
31 $dataGear{$name} = $_;
|
|
32 }
|
226
|
33 if (/^\_\_code (\w+)/) {
|
|
34 $codeGearName = $1;
|
243
|
35 while (/struct (\w+)\*\s(\w+)/g) {
|
|
36 $tmp = lcfirst($1);
|
|
37 if ($tmp ne $2) {
|
|
38 $tmp = ucfirst($2);
|
|
39 $dataGearName{$codeGearName} .= "\t\t(" . $1 . "*)GearImpl(context, " . $tmp . ", " . $2 . ")";
|
|
40 $dataGearName{$codeGearName} .= ",\n";
|
|
41 } else {
|
|
42 $dataGearName{$codeGearName} .= "\t\tGearef(context, " . $1 . ")";
|
|
43 $dataGearName{$codeGearName} .= ",\n";
|
|
44 }
|
226
|
45 }
|
228
|
46 next;
|
226
|
47 }
|
194
|
48 next;
|
|
49 }
|
|
50 $dataGear{$name} .= $_;
|
195
|
51 if (/(\w+);$/ and !/^} (\w+)/) {
|
200
|
52 $tmp = $1 . "\n";
|
|
53 if (/{/) {
|
|
54 $tmp = "{" . $';
|
201
|
55 $tmp =~ s/;$//;
|
200
|
56 }
|
|
57 $var{$name} .= $tmp;
|
195
|
58 $tmp = $`;
|
|
59 $tmp =~ s/^\s*//;
|
|
60 $type{$name} .= $tmp . "\n";
|
|
61 }
|
194
|
62 if (/^}/) {
|
|
63 $inTypedef = 0;
|
|
64 }
|
|
65 }
|
|
66 }
|
|
67
|
|
68 sub generateDataGear {
|
|
69 open my $fd,">","d/extern.h" or die("can't open d/extern.h $!");
|
|
70 for my $name ( sort keys %dataGear ) {
|
|
71 print $fd $dataGear{$name},"\n";
|
|
72 }
|
|
73 print $fd "\n";
|
195
|
74
|
228
|
75 open my $fd,">","d/type.h" or die("can't open d/stub.h $!");
|
195
|
76 for my $name ( sort keys %dataGear ) {
|
|
77 print $fd $var{$name},"\n";
|
|
78 }
|
|
79 for my $name ( sort keys %dataGear ) {
|
|
80 print $fd $type{$name},"\n";
|
|
81 }
|
228
|
82
|
|
83 open my $fd,">","d/stub.h" or die("can't open d/stub.h $!");
|
|
84 for my $codeGearName ( sort keys %dataGearName ) {
|
|
85 print $fd "__code ", $codeGearName ,"_stub (struct Context* context) {\n";
|
243
|
86 print $fd "\tgoto " . $codeGearName . "(";
|
|
87 #print $fd "\tgoto " . $codeGearName . "(context,\n";
|
|
88 print $fd substr($dataGearName{$codeGearName},2,-2);
|
|
89 print $fd "); \n} \n\n";
|
228
|
90 }
|
195
|
91 print $fd "\n";
|
194
|
92 }
|
|
93
|
|
94 # end
|