diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2011-05-21 18:38:59 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2011-05-21 18:38:59 +0200 |
commit | 9d96e274ce1fac0e82d850075acc87cd5e97fc39 (patch) | |
tree | f87b1f827aaeaf24022d4e04a685eaa164ead913 /coreutils | |
parent | 3ef344be91b153f863b91afdf6b0a0e441ac4ac7 (diff) | |
download | busybox-w32-9d96e274ce1fac0e82d850075acc87cd5e97fc39.tar.gz busybox-w32-9d96e274ce1fac0e82d850075acc87cd5e97fc39.tar.bz2 busybox-w32-9d96e274ce1fac0e82d850075acc87cd5e97fc39.zip |
od: fix -S NUM to not print chars >0x80
function old new delta
write_block 433 431 -2
print_ascii 217 215 -2
check_and_close 104 96 -8
od_main 2164 2139 -25
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/od_bloaty.c | 57 |
1 files changed, 19 insertions, 38 deletions
diff --git a/coreutils/od_bloaty.c b/coreutils/od_bloaty.c index 96a4186e2..8ed8f0be4 100644 --- a/coreutils/od_bloaty.c +++ b/coreutils/od_bloaty.c | |||
@@ -70,7 +70,7 @@ enum { | |||
70 | 70 | ||
71 | 71 | ||
72 | /* Check for 0x7f is a coreutils 6.3 addition */ | 72 | /* Check for 0x7f is a coreutils 6.3 addition */ |
73 | #define ISPRINT(c) (((c)>=' ') && (c) != 0x7f) | 73 | #define ISPRINT(c) (((c) >= ' ') && (c) < 0x7f) |
74 | 74 | ||
75 | typedef long double longdouble_t; | 75 | typedef long double longdouble_t; |
76 | typedef unsigned long long ulonglong_t; | 76 | typedef unsigned long long ulonglong_t; |
@@ -176,7 +176,7 @@ struct ERR_width_bytes_has_bad_size { | |||
176 | 176 | ||
177 | static smallint exit_code; | 177 | static smallint exit_code; |
178 | 178 | ||
179 | static size_t string_min; | 179 | static unsigned string_min; |
180 | 180 | ||
181 | /* An array of specs describing how to format each input block. */ | 181 | /* An array of specs describing how to format each input block. */ |
182 | static size_t n_specs; | 182 | static size_t n_specs; |
@@ -514,8 +514,7 @@ check_and_close(void) | |||
514 | } | 514 | } |
515 | 515 | ||
516 | if (ferror(stdout)) { | 516 | if (ferror(stdout)) { |
517 | bb_error_msg(bb_msg_write_error); | 517 | bb_error_msg_and_die(bb_msg_write_error); |
518 | exit_code = 1; | ||
519 | } | 518 | } |
520 | } | 519 | } |
521 | 520 | ||
@@ -1043,29 +1042,6 @@ dump(off_t current_offset, off_t end_offset) | |||
1043 | free(block[0]); | 1042 | free(block[0]); |
1044 | } | 1043 | } |
1045 | 1044 | ||
1046 | /* Read a single byte into *C from the concatenation of the input files | ||
1047 | named in the global array FILE_LIST. On the first call to this | ||
1048 | function, the global variable IN_STREAM is expected to be an open | ||
1049 | stream associated with the input file INPUT_FILENAME. If IN_STREAM | ||
1050 | is at end-of-file, close it and update the global variables IN_STREAM | ||
1051 | and INPUT_FILENAME so they correspond to the next file in the list. | ||
1052 | Then try to read a byte from the newly opened file. Repeat if | ||
1053 | necessary until EOF is reached for the last file in FILE_LIST, then | ||
1054 | set *C to EOF and return. Subsequent calls do likewise. */ | ||
1055 | |||
1056 | static void | ||
1057 | read_char(int *c) | ||
1058 | { | ||
1059 | while (in_stream) { /* !EOF */ | ||
1060 | *c = fgetc(in_stream); | ||
1061 | if (*c != EOF) | ||
1062 | return; | ||
1063 | check_and_close(); | ||
1064 | open_next_file(); | ||
1065 | } | ||
1066 | *c = EOF; | ||
1067 | } | ||
1068 | |||
1069 | /* Read N bytes into BLOCK from the concatenation of the input files | 1045 | /* Read N bytes into BLOCK from the concatenation of the input files |
1070 | named in the global array FILE_LIST. On the first call to this | 1046 | named in the global array FILE_LIST. On the first call to this |
1071 | function, the global variable IN_STREAM is expected to be an open | 1047 | function, the global variable IN_STREAM is expected to be an open |
@@ -1089,8 +1065,8 @@ read_char(int *c) | |||
1089 | static void | 1065 | static void |
1090 | dump_strings(off_t address, off_t end_offset) | 1066 | dump_strings(off_t address, off_t end_offset) |
1091 | { | 1067 | { |
1092 | size_t bufsize = MAX(100, string_min); | 1068 | unsigned bufsize = MAX(100, string_min); |
1093 | char *buf = xmalloc(bufsize); | 1069 | unsigned char *buf = xmalloc(bufsize); |
1094 | 1070 | ||
1095 | while (1) { | 1071 | while (1) { |
1096 | size_t i; | 1072 | size_t i; |
@@ -1106,11 +1082,17 @@ dump_strings(off_t address, off_t end_offset) | |||
1106 | bufsize += bufsize/8; | 1082 | bufsize += bufsize/8; |
1107 | buf = xrealloc(buf, bufsize); | 1083 | buf = xrealloc(buf, bufsize); |
1108 | } | 1084 | } |
1109 | read_char(&c); | 1085 | |
1110 | if (c < 0) { /* EOF */ | 1086 | while (in_stream) { /* !EOF */ |
1111 | free(buf); | 1087 | c = fgetc(in_stream); |
1112 | return; | 1088 | if (c != EOF) |
1089 | goto got_char; | ||
1090 | check_and_close(); | ||
1091 | open_next_file(); | ||
1113 | } | 1092 | } |
1093 | /* EOF */ | ||
1094 | goto ret; | ||
1095 | got_char: | ||
1114 | address++; | 1096 | address++; |
1115 | if (!c) | 1097 | if (!c) |
1116 | break; | 1098 | break; |
@@ -1122,8 +1104,7 @@ dump_strings(off_t address, off_t end_offset) | |||
1122 | if (i < string_min) /* Too short! */ | 1104 | if (i < string_min) /* Too short! */ |
1123 | goto tryline; | 1105 | goto tryline; |
1124 | 1106 | ||
1125 | /* If we get here, the string is all printable and NUL-terminated, | 1107 | /* If we get here, the string is all printable and NUL-terminated */ |
1126 | * so print it. It is all in 'buf' and 'i' is its length. */ | ||
1127 | buf[i] = 0; | 1108 | buf[i] = 0; |
1128 | format_address(address - i - 1, ' '); | 1109 | format_address(address - i - 1, ' '); |
1129 | 1110 | ||
@@ -1144,9 +1125,9 @@ dump_strings(off_t address, off_t end_offset) | |||
1144 | 1125 | ||
1145 | /* We reach this point only if we search through | 1126 | /* We reach this point only if we search through |
1146 | (max_bytes_to_format - string_min) bytes before reaching EOF. */ | 1127 | (max_bytes_to_format - string_min) bytes before reaching EOF. */ |
1147 | free(buf); | ||
1148 | |||
1149 | check_and_close(); | 1128 | check_and_close(); |
1129 | ret: | ||
1130 | free(buf); | ||
1150 | } | 1131 | } |
1151 | 1132 | ||
1152 | #if ENABLE_LONG_OPTS | 1133 | #if ENABLE_LONG_OPTS |
@@ -1397,7 +1378,7 @@ int od_main(int argc UNUSED_PARAM, char **argv) | |||
1397 | else | 1378 | else |
1398 | dump(n_bytes_to_skip, end_offset); | 1379 | dump(n_bytes_to_skip, end_offset); |
1399 | 1380 | ||
1400 | if (fclose(stdin) == EOF) | 1381 | if (fclose(stdin)) |
1401 | bb_perror_msg_and_die(bb_msg_standard_input); | 1382 | bb_perror_msg_and_die(bb_msg_standard_input); |
1402 | 1383 | ||
1403 | return exit_code; | 1384 | return exit_code; |