[Toybox] [CLEANUP] uudecode 838
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
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