Skip to content

Commit ff61aa1

Browse files
committed
[master] tidying (#166)
1 parent a549864 commit ff61aa1

File tree

1 file changed

+63
-57
lines changed

1 file changed

+63
-57
lines changed

eg/dale-autowrap/dale-autowrap.pl

Lines changed: 63 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
use JSON::XS qw(decode_json);
77

8-
my %TYPEMAP = (
8+
my %TYPE_MAP = (
99
'unsigned-int' => 'uint',
1010
'unsigned-char' => 'uint8',
1111
'signed-char' => 'int8',
@@ -17,33 +17,27 @@
1717
'unsigned-long-long' => '(ulong-long-type)',
1818
);
1919

20-
my %SCMAP = (
21-
'static' => 'intern',
22-
'none' => 'extern-c',
23-
'extern' => 'extern-c',
24-
);
25-
2620
sub type_to_string
2721
{
28-
my ($type) = @_;
22+
my ($type, $imports) = @_;
2923

3024
my $tag = $type->{'tag'};
3125
if ($tag =~ /^:/) {
3226
$tag =~ s/^://;
3327
}
3428

3529
if ($tag eq 'pointer') {
36-
return "(p ".(type_to_string($type->{'type'})).")";
30+
return "(p ".(type_to_string($type->{'type'}, $imports)).")";
3731
}
3832
if ($tag eq 'array') {
3933
return "(array-of ".$type->{'size'}." ".
40-
(type_to_string($type->{'type'})).")";
34+
(type_to_string($type->{'type'}, $imports)).")";
4135
}
4236
if ($tag eq 'struct') {
4337
return $type->{'name'};
4438
}
4539
if ($tag eq 'bitfield') {
46-
my $bf_type = type_to_string($type->{'type'});
40+
my $bf_type = type_to_string($type->{'type'}, $imports);
4741
return sprintf("(bf %s %s)",
4842
$bf_type,
4943
$type->{'width'});
@@ -52,8 +46,11 @@ sub type_to_string
5246
return $type->{'name'};
5347
}
5448

55-
my $mapped_type = $TYPEMAP{$tag};
49+
my $mapped_type = $TYPE_MAP{$tag};
5650
if ($mapped_type) {
51+
if ($mapped_type =~ /^\(/) {
52+
$imports->{'stdlib'} = 1;
53+
}
5754
return $mapped_type;
5855
}
5956

@@ -62,26 +59,33 @@ sub type_to_string
6259

6360
sub type_to_flat_string
6461
{
65-
my ($type) = @_;
62+
my ($type, $imports) = @_;
6663

67-
my $str = type_to_string($type);
64+
my $str = type_to_string($type, $imports);
6865
$str =~ tr/() / /;
6966
$str =~ s/ //g;
7067

7168
return $str;
7269
}
7370

71+
my %SC_MAP = (
72+
'static' => 'intern',
73+
'none' => 'extern-c',
74+
'extern' => 'extern-c',
75+
);
76+
7477
sub storage_class_to_string
7578
{
76-
return $SCMAP{$_[0]};
79+
return $SC_MAP{$_[0]};
7780
}
7881

7982
sub process_function
8083
{
81-
my ($data) = @_;
84+
my ($data, $imports) = @_;
8285

8386
my @params =
84-
map { sprintf("(%s %s)", $_->{'name'}, type_to_string($_->{'type'})) }
87+
map { sprintf("(%s %s)", $_->{'name'},
88+
type_to_string($_->{'type'}, $imports)) }
8589
@{$data->{'parameters'}};
8690
if (not @params) {
8791
@params = 'void';
@@ -92,34 +96,35 @@ sub process_function
9296
$data->{'name'},
9397
storage_class_to_string($data->{'storage_class'}
9498
|| $data->{'storage-class'}),
95-
type_to_string($data->{'return-type'}),
99+
type_to_string($data->{'return-type'}, $imports),
96100
$param_str);
97101
}
98102

99103
sub process_variable
100104
{
101-
my ($data) = @_;
105+
my ($data, $imports) = @_;
102106

103107
sprintf("(def %s (var extern %s))",
104108
$data->{'name'},
105-
type_to_string($data->{'type'}));
109+
type_to_string($data->{'type'}, $imports));
106110
}
107111

108112
sub process_const
109113
{
110-
my ($data) = @_;
114+
my ($data, $imports) = @_;
111115

112116
sprintf("(def %s (var intern %s))",
113117
$data->{'name'},
114-
type_to_string($data->{'type'}));
118+
type_to_string($data->{'type'}, $imports));
115119
}
116120

117121
sub process_struct
118122
{
119-
my ($data) = @_;
123+
my ($data, $imports) = @_;
120124

121125
my @fields =
122-
map { sprintf("(%s %s)", $_->{'name'}, type_to_string($_->{'type'})) }
126+
map { sprintf("(%s %s)", $_->{'name'},
127+
type_to_string($_->{'type'}, $imports)) }
123128
@{$data->{'fields'}};
124129
my $field_str = (@fields ? " (".(join ' ', @fields).")" : "");
125130

@@ -130,7 +135,7 @@ sub process_struct
130135

131136
sub process_enum
132137
{
133-
my ($data) = @_;
138+
my ($data, $imports) = @_;
134139

135140
my @fields =
136141
map { sprintf("(%s %s)", $_->{'name'}, $_->{'value'}) }
@@ -144,24 +149,26 @@ sub process_enum
144149

145150
sub process_typedef
146151
{
147-
my ($data) = @_;
152+
my ($data, $imports) = @_;
148153

149154
sprintf("(def %s (struct extern ((a %s))))",
150155
$data->{'name'},
151-
type_to_string($data->{'type'}));
156+
type_to_string($data->{'type'}, $imports));
152157
}
153158

154159
sub process_union
155160
{
156-
my ($data) = @_;
161+
my ($data, $imports) = @_;
162+
163+
$imports->{'variant'} = 1;
157164

158165
my $name = $data->{'name'};
159166

160167
my @constructors =
161168
map { sprintf("(%s-%s ((value %s)))",
162169
$name,
163-
type_to_flat_string($_->{'type'}),
164-
type_to_string($_->{'type'})) }
170+
type_to_flat_string($_->{'type'}, $imports),
171+
type_to_string($_->{'type'}, $imports)) }
165172
@{$data->{'fields'}};
166173
my $constructor_str = join ' ', @constructors;
167174

@@ -170,47 +177,46 @@ sub process_union
170177
$constructor_str);
171178
}
172179

180+
my %PROCESS_MAP = (
181+
function => \&process_function,
182+
extern => \&process_variable,
183+
struct => \&process_struct,
184+
const => \&process_const,
185+
enum => \&process_enum,
186+
typedef => \&process_typedef,
187+
union => \&process_union,
188+
);
189+
173190
sub main
174191
{
175-
print "(import stdlib)\n";
176-
print "(import variant)\n";
192+
my %imports;
193+
my @bindings;
177194

178195
while (defined (my $entry = <>)) {
179196
chomp $entry;
180-
if ($entry eq '[') {
181-
next;
182-
}
183-
if ($entry eq ']') {
197+
if (($entry eq '[') or ($entry eq ']')) {
184198
next;
185199
}
186200
$entry =~ s/,\s*$//;
187201
my $data = decode_json($entry);
188202
my $tag = $data->{'tag'};
189-
if ($tag eq 'function') {
190-
my $str = process_function($data);
191-
print "$str\n";
192-
} elsif ($tag eq 'extern') {
193-
my $str = process_variable($data);
194-
print "$str\n";
195-
} elsif ($tag eq 'struct') {
196-
my $str = process_struct($data);
197-
print "$str\n";
198-
} elsif ($tag eq 'const') {
199-
my $str = process_const($data);
200-
print "$str\n";
201-
} elsif ($tag eq 'enum') {
202-
my $str = process_enum($data);
203-
print "$str\n";
204-
} elsif ($tag eq 'typedef') {
205-
my $str = process_typedef($data);
206-
print "$str\n";
207-
} elsif ($tag eq 'union') {
208-
my $str = process_union($data);
209-
print "$str\n";
203+
if ($PROCESS_MAP{$tag}) {
204+
push @bindings, $PROCESS_MAP{$tag}->($data, \%imports);
210205
} else {
211206
warn "unable to process tag '$tag'";
212207
}
213208
}
209+
210+
my @imports = sort keys %imports;
211+
if (@imports) {
212+
for my $import (@imports) {
213+
print "(import $import)\n";
214+
}
215+
print "\n";
216+
}
217+
for my $binding (@bindings) {
218+
print "$binding\n";
219+
}
214220
}
215221

216222
main();

0 commit comments

Comments
 (0)