[Toybox] [CLEANUP] uudecode 838
Rob Landley
rob at landley.net
Sat Jan 11 13:26:06 PST 2014
http://landley.net/hg/toybox/rev/838
Yank the "const" annotations.
uudecode_b64_1byte:
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.
uudecode_b64_4bytes:
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.)
uudecode_uu_line:
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.
uudecode_main:
One more free(line) to avoid leaking memory.
More information about the Toybox
mailing list