diff options
author | Eric Andersen <andersen@codepoet.org> | 2000-07-13 16:40:41 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2000-07-13 16:40:41 +0000 |
commit | 00143ba921f64caab7e55bc4c90006586d4bcc4a (patch) | |
tree | 856fdf2d40af7489dfc34050138788e4638081f9 /tr.c | |
parent | ac48461da9b04ecf8548f4a0497e3b622a0ae5f1 (diff) | |
download | busybox-w32-00143ba921f64caab7e55bc4c90006586d4bcc4a.tar.gz busybox-w32-00143ba921f64caab7e55bc4c90006586d4bcc4a.tar.bz2 busybox-w32-00143ba921f64caab7e55bc4c90006586d4bcc4a.zip |
From Matt Kraai <kraai@alumni.carnegiemellon.edu>
> Here is a patch so that tr can handle NULL characters as well. Give it
> a shot and let me know what you think. It is against the latest CVS
> version.
>
> In my tests, the following now works as expected.
>
> tr '\0' '\n'
>
> Later,
> Matt
Diffstat (limited to 'tr.c')
-rw-r--r-- | tr.c | 52 |
1 files changed, 28 insertions, 24 deletions
@@ -98,21 +98,23 @@ static void convert() | |||
98 | /* NOTREACHED */ | 98 | /* NOTREACHED */ |
99 | } | 99 | } |
100 | 100 | ||
101 | static void map(register unsigned char *string1, register unsigned char *string2) | 101 | static void map(register unsigned char *string1, unsigned int string1_len, |
102 | register unsigned char *string2, unsigned int string2_len) | ||
102 | { | 103 | { |
103 | unsigned char last = '0'; | 104 | unsigned char last = '0'; |
105 | unsigned int i, j; | ||
104 | 106 | ||
105 | while (*string1) { | 107 | for (j = 0, i = 0; i < string1_len; i++) { |
106 | if (*string2 == '\0') | 108 | if (string2_len <= j) |
107 | vector[*string1] = last; | 109 | vector[string1[i]] = last; |
108 | else | 110 | else |
109 | vector[*string1] = last = *string2++; | 111 | vector[string1[i]] = last = string2[j++]; |
110 | string1++; | ||
111 | } | 112 | } |
112 | } | 113 | } |
113 | 114 | ||
114 | static void expand(char *arg, register unsigned char *buffer) | 115 | static unsigned int expand(char *arg, register unsigned char *buffer) |
115 | { | 116 | { |
117 | unsigned char *buffer_start = buffer; | ||
116 | int i, ac; | 118 | int i, ac; |
117 | 119 | ||
118 | while (*arg) { | 120 | while (*arg) { |
@@ -134,29 +136,31 @@ static void expand(char *arg, register unsigned char *buffer) | |||
134 | } else | 136 | } else |
135 | *buffer++ = *arg++; | 137 | *buffer++ = *arg++; |
136 | } | 138 | } |
139 | |||
140 | return (buffer - buffer_start); | ||
137 | } | 141 | } |
138 | 142 | ||
139 | static void complement(unsigned char *buffer) | 143 | static int complement(unsigned char *buffer, unsigned int buffer_len) |
140 | { | 144 | { |
141 | register unsigned char *ptr; | 145 | register short i, j, index; |
142 | register short i, index; | ||
143 | unsigned char conv[ASCII + 2]; | 146 | unsigned char conv[ASCII + 2]; |
144 | 147 | ||
145 | index = 0; | 148 | index = 0; |
146 | for (i = 1; i <= ASCII; i++) { | 149 | for (i = 0; i <= ASCII; i++) { |
147 | for (ptr = buffer; *ptr; ptr++) | 150 | for (j = 0; j < buffer_len; j++) |
148 | if (*ptr == i) | 151 | if (buffer[j] == i) |
149 | break; | 152 | break; |
150 | if (*ptr == '\0') | 153 | if (j == buffer_len) |
151 | conv[index++] = i & ASCII; | 154 | conv[index++] = i & ASCII; |
152 | } | 155 | } |
153 | conv[index] = '\0'; | 156 | memcpy(buffer, conv, index); |
154 | strcpy((char *) buffer, (char *) conv); | 157 | return index; |
155 | } | 158 | } |
156 | 159 | ||
157 | extern int tr_main(int argc, char **argv) | 160 | extern int tr_main(int argc, char **argv) |
158 | { | 161 | { |
159 | register unsigned char *ptr; | 162 | register unsigned char *ptr; |
163 | unsigned int output_length, input_length; | ||
160 | int index = 1; | 164 | int index = 1; |
161 | short i; | 165 | short i; |
162 | 166 | ||
@@ -184,19 +188,19 @@ extern int tr_main(int argc, char **argv) | |||
184 | } | 188 | } |
185 | 189 | ||
186 | if (argv[index] != NULL) { | 190 | if (argv[index] != NULL) { |
187 | expand(argv[index++], input); | 191 | input_length = expand(argv[index++], input); |
188 | if (com_fl) | 192 | if (com_fl) |
189 | complement(input); | 193 | input_length = complement(input, input_length); |
190 | if (argv[index] != NULL) { | 194 | if (argv[index] != NULL) { |
191 | if (*argv[index] == '\0') | 195 | if (*argv[index] == '\0') |
192 | fatalError("STRING2 cannot be empty\n"); | 196 | fatalError("STRING2 cannot be empty\n"); |
193 | expand(argv[index], output); | 197 | output_length = expand(argv[index], output); |
194 | map(input, output); | 198 | map(input, input_length, output, output_length); |
195 | } | 199 | } |
196 | for (ptr = input; *ptr; ptr++) | 200 | for (i = 0; i < input_length; i++) |
197 | invec[*ptr] = TRUE; | 201 | invec[input[i]] = TRUE; |
198 | for (ptr = output; *ptr; ptr++) | 202 | for (i = 0; i < output_length; i++) |
199 | outvec[*ptr] = TRUE; | 203 | outvec[output[i]] = TRUE; |
200 | } | 204 | } |
201 | convert(); | 205 | convert(); |
202 | return (0); | 206 | return (0); |