6930e5f8d66864e72ada4b15e783fa5bc822b067
10 my $val = $messages{$msg};
14 $messages{$msg} = $val;
25 $id =~ /^(\w{4}:\w{4})(:.*)?/ or do {
26 warn "Invalid device ID string $id\n";
31 $match = $2 or $match = "*";
33 $devices{$id} or $devices{$id} = {};
34 $devices{$id}->{$match} = $dev;
45 $_[1] =~ s/^(\w+)Mode$/$1/;
49 my $hex_option = [ undef, \
&add_hex
];
50 my $msg_option = [ undef, \
&add_message
];
51 my $mode_option = [ "Mode", \
&add_mode
];
53 TargetVendor
=> $hex_option,
54 TargetProductList
=> [ "TargetProduct", sub { return [ map(hex,split(/,/, $_[0])) ]; } ],
55 TargetProduct
=> [ "TargetProduct", sub { return [ hex($_[0]) ]; } ],
56 TargetClass
=> $hex_option,
57 MessageContent
=> $msg_option,
58 MessageContent2
=> $msg_option,
59 MessageContent3
=> $msg_option,
61 DetachStorageOnly
=> [ ],
63 HuaweiMode
=> $mode_option,
64 HuaweiNewMode
=> $mode_option,
65 SierraMode
=> $mode_option,
66 SonyMode
=> $mode_option,
67 QisdaMode
=> $mode_option,
68 GCTMode
=> $mode_option,
69 KobilMode
=> $mode_option,
70 SequansMode
=> $mode_option,
71 MobileActionMode
=> $mode_option,
72 CiscoMode
=> $mode_option,
73 StandardEject
=> $mode_option,
74 NoDriverLoading
=> [],
75 MessageEndpoint
=> $hex_option,
78 ResponseEndpoint
=> $hex_option,
81 CheckSuccess
=> $hex_option,
82 Interface
=> $hex_option,
83 Configuration
=> $hex_option,
84 AltSetting
=> $hex_option,
92 $file =~ /\/?
([^\
/]+)$/ and $id = $1;
94 my $dev = add_device
($id);
96 open FILE
, "<$file" or die "Cannot open file '$file'\n";
102 /(\w+)\s*=\s*(.+)\s*/ or do {
103 warn "Invalid Line: $_";
107 my ($var, $val) = ($1, $2);
108 $val =~ s/^"(.+)"$/$1/;
110 my $opt = $options{$var};
112 warn "Unrecognized option $var in file $file\n";
116 $opt->[1] and $val = &{$opt->[1]}($val, $var);
117 $opt->[0] and $var = $opt->[0];
122 foreach my $file (@ARGV) {
129 $chr eq "\b" and return "\\b";
130 $chr eq "\n" and return "\\n";
131 $chr eq "\r" and return "\\r";
132 $chr eq "\t" and return "\\t";
133 $chr eq "\\" and return "\\\\";
134 $chr eq "\"" and return "\\\"";
135 $chr eq '/' and return "\\/";
136 return sprintf("\\u%04x", ord($chr));
140 $_[0] =~ s/([\x00- \/"\\])/json_chr
($1)/eg
;
145 my ($val, $type) = (shift, shift);
146 $type eq 'bool' and $val = $val > 0 ?
"true" : "false";
147 $type eq 'string' and $val = "\"$val\"";
152 my ($val, $name, $type, $sep) = (shift, shift, shift, shift);
153 return unless defined($val);
154 if ($type =~ /array:(.+)/) {
158 foreach my $elem (@val) {
159 my $json = json_val
($elem, $type);
160 next unless defined $json;
169 $val = json_val
($val, $type);
171 print "$$sep\t\t\t\t\"".json_str
($name)."\": $val";
180 foreach my $msg (sort { $messages{$a} <=> $messages{$b} } keys %messages) {
181 print "$suffix\t\t\"".json_str
($msg)."\"";
191 foreach my $devid (sort keys %devices) {
192 my $dev = $devices{$devid};
194 print "$dev_sep\t\t\"".json_str
($devid)."\": {\n";
198 foreach my $match (sort keys %$dev) {
199 my $cur = $dev->{$match};
202 print "$match_sep\t\t\t\"".json_str
($match)."\": {\n";
205 dev_opt
($cur->{TargetVendor
}, "t_vendor", "int", \
$sep);
206 dev_opt
($cur->{TargetProduct
}, "t_product", "array:int", \
$sep);
207 dev_opt
($cur->{TargetClass
}, "t_class", "int", \
$sep);
208 dev_opt
($cur->{DetachStorageOnly
}, "detach_storage", "bool", \
$sep);
209 dev_opt
($cur->{Mode
}, "mode", "string", \
$sep);
210 dev_opt
($cur->{NoDriverLoading
}, "no_driver", "bool", \
$sep);
211 dev_opt
($cur->{MessageEndpoint
}, "msg_endpoint", "int", \
$sep);
213 $cur->{MessageContent
},
214 $cur->{MessageContent2
},
215 $cur->{MessageContent3
}
217 dev_opt
($msg, "msg", "array:int", \
$sep);
218 dev_opt
($cur->{WaitBefore
}, "wait", "int", \
$sep);
219 dev_opt
($cur->{ReleaseDelay
}, "release_delay", "int", \
$sep);
220 dev_opt
($cur->{NeedResponse
}, "response", "bool", \
$sep);
221 dev_opt
($cur->{ResponseEndpoint
}, "response_endpoint", "int", \
$sep);
222 dev_opt
($cur->{ResetUSB
}, "reset", "bool", \
$sep);
223 dev_opt
($cur->{InquireDevice
}, "inquire", "int", \
$sep);
224 dev_opt
($cur->{CheckSuccess
}, "check", "bool", \
$sep);
225 dev_opt
($cur->{Interface
}, "interface", "int", \
$sep);
226 dev_opt
($cur->{Configuration
}, "config", "int", \
$sep);
227 dev_opt
($cur->{AltSetting
}, "alt", "int", \
$sep);