194
|
1 #!/usr/bin/perl
|
|
2
|
250
|
3 use strict;
|
|
4
|
194
|
5 # interface.cbc
|
|
6 # typedef struct Worker {
|
|
7 # int id;
|
|
8 # struct Context* contexts;
|
|
9 # enum Code execute;
|
|
10 # enum Code taskSend;
|
|
11 # enum Code taskRecive;
|
|
12 # enum Code shutdown;
|
|
13 # struct Queue* tasks;
|
|
14 # } Worker;
|
|
15
|
252
|
16 #while (<*.cbc>) {
|
|
17 while (<SingleLinkedStack.cbc>) {
|
249
|
18 my $fn = $_;
|
|
19 &getDataGear($fn);
|
|
20 &generateDataGear($fn);
|
194
|
21 }
|
|
22
|
250
|
23 my %var;
|
|
24 my %type;
|
|
25 my %code;
|
|
26 my %dataGearVar;
|
|
27 my %dataGear;
|
|
28 my %dataGearName;
|
|
29
|
194
|
30 sub getDataGear {
|
|
31 my ($filename) = @_;
|
250
|
32 my ($interface, $implementation, $codeGearName, $name, $inTypedef);
|
194
|
33 open my $fd,"<",$filename or die("can't open $filename $!");
|
|
34 while (<$fd>) {
|
|
35 if (! $inTypedef) {
|
|
36 if (/^typedef struct (\w+) {/) {
|
|
37 $inTypedef = 1;
|
|
38 $name = $1;
|
|
39 $dataGear{$name} = $_;
|
249
|
40 } elsif (/^(\w+)\* create(\w+)\(/) {
|
|
41 if (defined $interface) {
|
|
42 die "duplicate interface $interface\n";
|
|
43 }
|
|
44 $interface = $1;
|
250
|
45 $implementation = $2;
|
|
46 if ( -f "$interface.cbc") {
|
|
47 &getDataGear("$interface.cbc");
|
|
48 }
|
249
|
49 } elsif (/^\_\_code (\w+)/) {
|
226
|
50 $codeGearName = $1;
|
249
|
51 $dataGearVar{$codeGearName} = [];
|
252
|
52 args:while (/(struct|union) (\w+)(\*)+\s(\w+)/g) {
|
250
|
53 my $structType = $1;
|
|
54 my $typeName = $2;
|
252
|
55 my $varName = $4;
|
250
|
56 my $typeField = lcfirst($typeName);
|
|
57 push @{$dataGearVar{$codeGearName}},$varName;
|
|
58 if ($typeField ne $varName) {
|
252
|
59 $dataGearName{$codeGearName} .= "\t$typeName* $varName = ($typeName*)GearImpl(context, $varName, $varName);\n";
|
|
60 print STDOUT "$codeGearName \t$typeName* $varName = ($typeName*)GearImpl(context, $varName, $varName);\n";
|
243
|
61 } else {
|
252
|
62 for my $ivar ($var{$interface}) {
|
250
|
63 if ($varName eq $ivar) {
|
|
64 $dataGearName{$codeGearName} .= "\t$typeName* $varName = Gearef(context, $interface)->$varName;\n";
|
252
|
65 print STDOUT "$codeGearName \t$typeName* $varName = Gearef(context, $interface)->$varName;\n";
|
250
|
66 next args;
|
|
67 }
|
|
68 }
|
252
|
69 $dataGearName{$codeGearName} .= "\t$typeName* $varName = Gearef(context, $typeName)->$typeField;\n";
|
|
70 print STDOUT "$codeGearName \t$typeName* $varName = Gearef(context, $typeName)->$typeField;\n";
|
243
|
71 }
|
226
|
72 }
|
250
|
73 $dataGearName{$codeGearName} .= "\tgoto $codeGearName(context";
|
|
74 for my $arg ( @{$dataGearVar{$codeGearName}}) {
|
|
75 $dataGearName{$codeGearName} .= ", $arg";
|
|
76 }
|
|
77 $dataGearName{$codeGearName} .= ");";
|
226
|
78 }
|
194
|
79 next;
|
|
80 }
|
249
|
81 # gather type name and type
|
194
|
82 $dataGear{$name} .= $_;
|
195
|
83 if (/(\w+);$/ and !/^} (\w+)/) {
|
250
|
84 my $tmp = $1 . "\n";
|
200
|
85 if (/{/) {
|
|
86 $tmp = "{" . $';
|
201
|
87 $tmp =~ s/;$//;
|
200
|
88 }
|
|
89 $var{$name} .= $tmp;
|
195
|
90 $tmp = $`;
|
|
91 $tmp =~ s/^\s*//;
|
|
92 $type{$name} .= $tmp . "\n";
|
250
|
93 } elsif (/\_\_code (\w+)\(/) {
|
|
94 push $code{$name}, $1;
|
|
95 }
|
194
|
96 if (/^}/) {
|
|
97 $inTypedef = 0;
|
|
98 }
|
|
99 }
|
|
100 }
|
|
101
|
250
|
102 sub generateStub {
|
251
|
103 my($fd,$prevCodeGearName,$dataGearName) = @_;
|
250
|
104 print $fd "__code ", $prevCodeGearName ,"_stub (struct Context* context) {\n";
|
251
|
105 print $fd $dataGearName;
|
250
|
106 print $fd "\n} \n\n";
|
251
|
107 return 1;
|
250
|
108 }
|
|
109
|
194
|
110 sub generateDataGear {
|
249
|
111 my ($filename) = @_;
|
250
|
112 my $fn1 = $filename;
|
|
113 $fn1 =~ s/\.cbc/.c/;
|
249
|
114 open my $in,"<",$filename or die("can't open $filename $!");
|
250
|
115 my $i = 1;
|
|
116 my $fn = $fn1;
|
|
117 while ( -f $fn) {
|
|
118 $fn = "$fn1.$i";
|
|
119 $i++;
|
|
120 }
|
249
|
121 open my $fd,">",$fn or die("can't write $fn $!");
|
|
122 my $prevCodeGearName;
|
250
|
123 my $inTypedef = 0;
|
|
124 my %stub;
|
251
|
125 my $codeGearName;
|
249
|
126 while (<$in>) {
|
|
127 if (! $inTypedef) {
|
|
128 if (/^typedef struct (\w+) {/) {
|
|
129 $inTypedef = 1;
|
|
130 } elsif (/^\_\_code (\w+)/) {
|
251
|
131 $codeGearName = $1;
|
250
|
132 if ($codeGearName =~ /_stub$/) {
|
|
133 $stub{$codeGearName} = 1;
|
|
134 print $fd $_;
|
|
135 next;
|
|
136 }
|
252
|
137 $prevCodeGearName = $codeGearName;
|
249
|
138 if (defined $prevCodeGearName) {
|
250
|
139 if (defined $stub{$prevCodeGearName."_stub"}) {
|
|
140 undef $prevCodeGearName;
|
|
141 print $fd $_;
|
|
142 next;
|
|
143 }
|
251
|
144 $stub{$prevCodeGearName."_stub"} = &generateStub($fd,$prevCodeGearName,$dataGearName{$codeGearName});
|
249
|
145 }
|
252
|
146 #$prevCodeGearName = $codeGearName;
|
250
|
147 } elsif (/^(.*)goto next\(\.\.\.(.*)\);/) {
|
|
148 my $prev = $1;
|
|
149 my $args = $2;
|
|
150 print $fd "${prev}goto meta(context, next);\n";
|
|
151 next;
|
249
|
152 }
|
250
|
153 print $fd $_;
|
249
|
154 next;
|
|
155 }
|
|
156 # gather type name and type
|
|
157 if (/^}/) {
|
|
158 $inTypedef = 0;
|
|
159 }
|
250
|
160 print $fd $_;
|
194
|
161 }
|
250
|
162 if (defined $prevCodeGearName) {
|
|
163 if (!defined $stub{$prevCodeGearName."_stub"}) {
|
251
|
164 $stub{$prevCodeGearName."_stub"} = &generateStub($fd,$prevCodeGearName,$dataGearName{$codeGearName});
|
250
|
165 }
|
228
|
166 }
|
194
|
167 }
|
|
168
|
|
169 # end
|