[Toybox] [CLEANUP]

Rob Landley rob at landley.net
Tue Apr 16 20:24:46 PDT 2013

On 04/16/2013 10:18:59 AM, Kyungwan Han wrote:
> Hello,
> I learn programming skill and knowledge from following up code  
> cleaning,
> so I'm checking the change set:
> http://www.landley.net/hg/toybox/rev/6be04ec7b7ac

Ah, I never did summarize that one, did I? Sorry, my day job at Cray's  
been taking up all my time...

Ok, that's commit 852:


(Note: every mercurial commit has a sequentially increasing serial  
number, which is just the order the commits went in to that instance of  
the repository. Since my repository's the master copy I can cheat  
slightly and just use the index numbers when referring to commits in  
the repository on landley.net. I find 'em easier to deal with than the  
big commit hash.)

Ok, I switched the config default from "y" to "n", because stuff in  
pending shouldn't be enabled by default. (Minor administrative thing,  
it'll go back to "y" when it's ready to move out of pending.)

I removed the comments about "function declaration" and "structure  
declaration" because it's documenting the obvious. (It's not like  
there's hundreds of entries where the comment gives us an easy way to  
find the start of a large section via text search.)

In the case of function declarations, if the functions are in the right  
order we don't need to declare them ahead of time. Declarations are  
really so functions can be used in a different file, it mostly  
shouldn't be needed in the same file unless you have circular calls.  
Also, when we inline code functions go away along with the need to  
declare them before use. So declarations local to a single file are a  
rough edge I try to clean up. (Doesn't mean it's always possible, but  
it attracts my attention.)

Yes, I removed "const". Isaac and Felix linked you to the earlier post  
on that. It's not an absolute prohibition, but in this case it shrinks  
the code without really losing anything.

Functions returning void (like get_host_and_port()) don't need a return  
statment on the last line, it doesn't do anything.


Collate local variable declarations of the same type. (Sometimes it's  
worthwhile keeping structure members on separate lines to make it clear  
what order the structure members are in, especially when it's  
significant as in the args.c parsing of GLOBALS(), which is really an  
implicit union between a long array and the start of the structure. But  
in local variables, order isn't significant.)

The perror_exit() function already appends a colon and strerror() to  
the end of its output. (error_exit() doesn't, perror_exit() does.) so  
trim off the code that does that here. Also, both error_exit() and  
perror_exit() append a newline to the string they print, so if the  
error strings we pass them do that the newline gets printed twice.

Remove a few unnecessary parentheses, if (a == b || c == d) is obvious  

At the end of get_socket_stream(), status has to be 0 or we wouldn't  
have gotten there, and swap the ? : so we don't have to !rp (removing  
more parentheses).

get_sockaddr: Remove is_unix and status variables that are only used to  
store a value used exactly once on the next line, just inline the call  
generating the value.

Simplify setport(), and then inline it at the only call site. (Looks  
like I forgot to actually _delete_ the setport function and its  
declaration once it was no longer used, I'll do that in my pending next  
round of cleanup.)

Moving on to get_strtou():

Switching argv[0] to *argv only saves a couple characters but treating  
a pointer as an array instead of simply dereferncing it only really  
makes sense when you use more than one element of the array. (If you  
have a pointer to struct and go ptr[0].blah instead of ptr->blah it  
implies you're not really comfortable with pointers.)

Comments like "end of outfill" don't really help when the if() is on  
the screen at the same time. (And if it isn't, can the body of the if  
be shrunk enough that it is? Those are generally for really _big_  
blocks, and even then your editor will usually jump you between matched  
curly brackets.)

Note the char * typecast removed in set_irq() was already a char *, the  
cast was there to stop the compiler complaining that the char * was  
const. This is part of the reason I don't like const annotations, it  
doesn't _stop_ you from modifying it, it just makes the compiler  
complain. I've done enough python programming to not hugely care what  
the compiler has to say at compile time, I want good _runtime_ tests of  
the behavior before I'll trust it. A test suite executing all the  
corner cases and maybe some valgrind variant spotting accumulating  
memory leaks and such beats "lint" any day.

get_hw_info(): remove a #define that only exists for the lifetime of  
the function. Just substitue the value in the one place it's used.  
(Also, the #define HW_UNSPEC _and_ the comment // UNSPEC on its only  
use are one line before we strcpy "unspec" in response to it, which is  

I also moved the memset() from right before the only caller of  
get_hw_info() into the function itself. In a future pass I'll inline it  
at the only call site, and then see what simplification opportunities  
that affords us.

Replace xprintf("\n"); with xputc('\n') because the string is a two  
byte global constant (the character pluss a null) byte in a separate  
block of memory with a pointer to it (and associated ELF plumbing), and  
what it's loading onto the stack is a pointer to that global. With  
xputc we're just loading an 8 bit constant (promoted to 32 bits by C,  
but still smaller than a pointer and there's nothing to dereference).  
Not a huge deal, but a general case of "xputc exists for a reason,  
might as well use it".)

readconf(): remove another function-local #define/#undef that's used  
exactly once, just inline the constant. Putting the constant in a  
#define doesn't get rid of the constant, it just adds indirection and  
makes the code bigger.


More information about the Toybox mailing list