summaryrefslogtreecommitdiff
path: root/tr.c
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2000-07-13 16:40:41 +0000
committerEric Andersen <andersen@codepoet.org>2000-07-13 16:40:41 +0000
commit00143ba921f64caab7e55bc4c90006586d4bcc4a (patch)
tree856fdf2d40af7489dfc34050138788e4638081f9 /tr.c
parentac48461da9b04ecf8548f4a0497e3b622a0ae5f1 (diff)
downloadbusybox-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.c52
1 files changed, 28 insertions, 24 deletions
diff --git a/tr.c b/tr.c
index 293bbce6b..563ee0837 100644
--- a/tr.c
+++ b/tr.c
@@ -98,21 +98,23 @@ static void convert()
98 /* NOTREACHED */ 98 /* NOTREACHED */
99} 99}
100 100
101static void map(register unsigned char *string1, register unsigned char *string2) 101static 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
114static void expand(char *arg, register unsigned char *buffer) 115static 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
139static void complement(unsigned char *buffer) 143static 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
157extern int tr_main(int argc, char **argv) 160extern 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);