[Toybox] [CLEANUP] uudecode 838

Rob Landley rob at landley.net
Sat Jan 11 13:26:06 PST 2014


Yank the "const" annotations.


The old function had a giant (static) table, the new one is a set of 5 
if statements covering the same range. This includes removing a number 
of comments, because the if statements are reasonably self-explanatory 
in a way the table wasn't.


The old one had 4 separate calls to uudecode_b64_1byte, each reading a 
byte into 4 separate variables. Then it had individual tests for each 
variable not having fetched any data, then a line to bit shift and 
collate the 4 variables into one, and then a loop to output the 
converted data from that variable.

The new one has a single loop around the whole thing, the same sort of 
4/3 loop uuencode had. It loops 4 times, each time inputting a byte. 
Each input byte gets parsed by the same code (checking for "=" padding 
for length adjustment before trying to convert the value, and calling 
error_exit() if we expected a stanza and didn't get one), convert the 
data and shift it into place, and output a byte if we've got one. (Don't 
output a byte on the first cycle because we haven't filled up the first 
byte yet, we fetched 6 bits but need 8 before we can output anything. 
And don't output a byte if the length says we've input = characters 
indicating the end of the file and there aren't 3 full bytes to output 
this time.)


Moving the while () to a for() with the test on the first line was 
mostly because it was late and I was grumpy. I don't like gcc's fussy 
"oh no, you can't have an assignment in a test, well you _can_ but put 
extra parentheses around it to show you _meant_ to do that because I 
don't trust you" warnings. (Hint: put the constant or function call on 
the left, then accidental assignments break. No need for the compiler to 
object to valid code.) I also don't like pointless tests for NULL when 
if (x) will already be true if x is nonzero, that's what tests in C 
MEAN. Between the two of them, I just chopped it into two lines to make 
that go away.

The '`' as the first character bit is odd. If you just ignore it, you 
get the right result.

Don't leak memory for the "end" line.


One more free(line) to avoid leaking memory.

More information about the Toybox mailing list