summaryrefslogtreecommitdiff
path: root/data/gen-common.pm
blob: 6c3492f25a8c6a937fdcc5272e44cb2d3e3614d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use lib "$Bin/lib";
use JSON;

@ARGV < 2 and die "Usage: $0 <prefix> <file>\n";
my $prefix = shift @ARGV;

our $ctl;
our %tlv_types = (
	gint8 => "int8_t",
	guint8 => "uint8_t",
	gint16 => "int16_t",
	guint16 => "uint16_t",
	gint32 => "int32_t",
	guint32 => "uint32_t",
	gint64 => "int64_t",
	guint64 => "uint64_t",
	gfloat => "float",
	gboolean => "bool",
);

$prefix eq 'ctl_' and $ctl = 1;

sub get_json() {
	local $/;
	my $json = <>;
	$json =~ s/^\s*\/\/.*$//mg;
	return decode_json($json);
}

sub gen_cname($) {
	my $name = shift;

	$name =~ s/[^a-zA-Z0-9_]/_/g;
	return lc($name);
}

sub gen_has_types($) {
	my $data = shift;

	foreach my $field (@$data) {
		my $type = $field->{"format"};
		$type and return 1;
	}
	return undef
}

sub gen_tlv_set_func($$) {
	my $name = shift;
	my $data = shift;

	$name = gen_cname($name);
	if (gen_has_types($data)) {
		return "int qmi_set_$name(struct qmi_msg *msg, struct qmi_$name *req)"
	} else {
		return "int qmi_set_$name(struct qmi_msg *msg)"
	}
}

sub gen_tlv_parse_func($$) {
	my $name = shift;
	my $data = shift;

	$name = gen_cname($name);
	if (gen_has_types($data)) {
		return "int qmi_parse_$name(struct qmi_msg *msg, struct qmi_$name *res)"
	} else {
		return "int qmi_parse_$name(struct qmi_msg *msg)"
	}
}

sub gen_foreach_message_type($$$)
{
	my $data = shift;
	my $req_sub = shift;
	my $res_sub = shift;

	foreach my $entry (@$data) {
		my $args = [];
		my $fields = [];

		next if $entry->{type} ne 'Message';
		next if not defined $entry->{input} and not defined $entry->{output};

		&$req_sub($prefix.$entry->{name}." Request", $entry->{input}, $entry);
		&$res_sub($prefix.$entry->{name}." Response", $entry->{output}, $entry);
	}
}

1;