@@ -26,7 +26,7 @@ use vars qw/ $opt_A $opt_b $opt_c $opt_d $opt_f $opt_i $opt_j $opt_l $opt_N
26
26
$opt_o $opt_v $opt_x / ;
27
27
28
28
my ($offset1 , $radix , $data , @arr , $len , $fh , $lim );
29
- my ($lastline , $upformat , $ pffmt , $strfmt , $ml );
29
+ my ($lastline , $pffmt , $strfmt , $ml );
30
30
31
31
my %charescs = (
32
32
0 => ' \0' ,
@@ -168,19 +168,17 @@ close $fh;
168
168
exit EX_SUCCESS;
169
169
170
170
sub octal1 {
171
- $upformat = ' C*' ; # for -b
172
171
$pffmt = ' %.3o ' ;
173
- @arr = unpack ( $upformat , $data ) ;
172
+ @arr = unpack ' C* ' , $data ;
174
173
$strfmt = $pffmt x (scalar @arr );
175
174
}
176
175
177
176
sub char1 {
178
- $upformat = ' C*' ; # for -c
179
177
$pffmt = ' %s' ;
180
178
$strfmt = $pffmt ;
181
179
182
180
@arr = ();
183
- my @arr1 = unpack ( $upformat , $data ) ;
181
+ my @arr1 = unpack ' C* ' , $data ;
184
182
for my $val (@arr1 ) {
185
183
if (exists $charescs {$val }) {
186
184
$arr [0] .= $charescs {$val } . " " ;
@@ -195,52 +193,72 @@ sub char1 {
195
193
}
196
194
197
195
sub udecimal {
198
- $upformat = ' S*' ; # for -d
199
- $data .= " \0 " if ($len & 1); # zero-fill 16 bit input
196
+ if (length ($data ) & 1) { # pad to 16 bit
197
+ @arr = unpack ' S*' , $data . " \0 " ;
198
+ }
199
+ else {
200
+ @arr = unpack ' S*' , $data ;
201
+ }
200
202
$pffmt = ' %5u ' ;
201
- @arr = unpack ($upformat ,$data );
202
203
$strfmt = $pffmt x (scalar @arr );
203
204
}
204
205
205
206
sub float {
206
- $upformat = ' f*' ; # for -f
207
- my $remain = $len % 4;
208
- $data .= " \0 " x $remain if ($remain ); # zero-fill 32 bit input
207
+ my $remain = length ($data ) % 4;
208
+ if ($remain ) { # pad to 32 bit
209
+ my $pad = " \0 " x $remain ;
210
+ @arr = unpack ' f*' , $data . $pad ;
211
+ }
212
+ else {
213
+ @arr = unpack ' f*' , $data ;
214
+ }
209
215
$pffmt = ' %6.6e ' ;
210
- @arr = unpack ($upformat ,$data );
211
216
$strfmt = $pffmt x (scalar @arr );
212
217
}
213
218
214
219
sub decimal {
215
- $upformat = ' s*' ; # for -i
216
- $data .= " \0 " if ($len & 1); # zero-fill 16 bit input
220
+ if (length ($data ) & 1) { # pad to 16 bit
221
+ @arr = unpack ' s*' , $data . " \0 " ;
222
+ }
223
+ else {
224
+ @arr = unpack ' s*' , $data ;
225
+ }
217
226
$pffmt = ' %5d ' ;
218
- @arr = unpack ($upformat ,$data );
219
227
$strfmt = $pffmt x (scalar @arr );
220
228
}
221
229
222
230
sub long {
223
- $upformat = ' L*' ; # for -l
224
- my $remain = $len % 4;
225
- $data .= " \0 " x $remain if ($remain ); # zero-fill 32 bit input
231
+ my $remain = length ($data ) % 4;
232
+ if ($remain ) { # pad to 32 bit
233
+ my $pad = " \0 " x $remain ;
234
+ @arr = unpack ' L*' , $data . $pad ;
235
+ }
236
+ else {
237
+ @arr = unpack ' L*' , $data ;
238
+ }
226
239
$pffmt = ' %10ld ' ;
227
- @arr = unpack ($upformat ,$data );
228
240
$strfmt = $pffmt x (scalar @arr );
229
241
}
230
242
231
243
sub octal2 {
232
- $upformat = ' S*' ; # for -o
233
- $data .= " \0 " if ($len & 1); # zero-fill 16 bit input
244
+ if (length ($data ) & 1) { # pad to 16 bit
245
+ @arr = unpack ' S*' , $data . " \0 " ;
246
+ }
247
+ else {
248
+ @arr = unpack ' S*' , $data ;
249
+ }
234
250
$pffmt = ' %.6o ' ;
235
- @arr = unpack ($upformat ,$data );
236
251
$strfmt = $pffmt x (scalar @arr );
237
252
}
238
253
239
254
sub hex {
240
- $upformat = ' S*' ; # for -x
241
- $data .= " \0 " if ($len & 1); # zero-fill 16 bit input
255
+ if (length ($data ) & 1) { # pad to 16 bit
256
+ @arr = unpack ' S*' , $data . " \0 " ;
257
+ }
258
+ else {
259
+ @arr = unpack ' S*' , $data ;
260
+ }
242
261
$pffmt = ' %.4x ' ;
243
- @arr = unpack ($upformat ,$data );
244
262
$strfmt = $pffmt x (scalar @arr );
245
263
}
246
264
@@ -261,7 +279,7 @@ od - dump files in octal and other formats
261
279
262
280
=head1 SYNOPSIS
263
281
264
- B<od > [ I<-abcdfiloxv > ] [I<-j skip_n_bytes > ] [I<-N read_n_bytes > ] [ I<-A radix > ] F<filename>
282
+ B<od > [ I<-bcdfiloxv > ] [I<-j skip_n_bytes > ] [I<-N read_n_bytes > ] [ I<-A radix > ] F<filename>
265
283
266
284
=head1 DESCRIPTION
267
285
0 commit comments