DragonFly BSD
DragonFly submit List (threaded) for 2005-08
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Re: A silly little utility


From: Max Okumoto <okumoto@xxxxxxxx>
Date: Mon, 22 Aug 2005 13:53:27 -0700

walt wrote:
This was inspired by the kde version of xterm, which allows
each new window to be opened with a random pastel-colored
background.

This program ('rlc' --> random-light-colors)
generates ascii strings of the form 'rgb:hh/hh/hh' which
can be used to open an xterm window like this:

xterm -bg `rlc`

The source is listed below.  I have a few bonehead 'c'
questions, however:

Why does this program compile without including stdio.h ?

You should include stdio.h because you are using printf(). The code still compiles because none of it depends on any data types, and printf() works most of the time since only fixed sized object are passed to it.

But since there is no prototype in scope the compiler can
not help you find problems like:

printf(10, "Hey printme!");


Look at the CWARNFLAGS in /usr/share/mk/bsd.sys.mk and use the attach Makefile. The compiler will provide more warning and will help you cleanup the code. You can find description for the warning flags in the gcc man page.

Does it matter if the variable declarations come before
or after 'main()'?

The variables should be declared in the scope of main() not in global scope. Global variables should be avoided, unless there is a need for them.

Any problems with the style or the logic of the code?

You want to describe what the intent of the code is. Someone reading your code can see what the code itself does. But they can not determine why you made those desicsions.


Thanks! ================================

#include <stdio.h>
#include<stdlib.h>

int
main(void)
{
        int n,r,g,b;	/* red, green, blue */
	int offset = 0xe0;

/* initialize random number generator */
srandomdev();

/* generate random bits, but keep only 15 bits for the color */
n = 0x7fff & random();

/* * Extract 5 bits from the random number for each color, and * add an offset to each color to make the result pastel. * * The range of each color is 0 to 255. (8 bits) */
r = (n & 0x1f) + offset;
n >>= 5;
g = (n & 0x1f) + offset; n >>= 5;
b = (n & 0x1f) + offset;


printf("rgb:%x/%x/%x\n", r, g, b);
return (0);
}

Note: if this code is too slow you can optimize the code, by using the logical-or operation once. ;-)

	n = 0xffffff & random();
	n |= 0xe0e0e0;

 	r = (n & 0xff);
 	n >>= 8;
 	g = (n & 0xff);
 	n >>= 8;	
 	b = (n & 0xff);
	
PROG	= rlc
SRCS	= main.c
NOMAN	= true		# there is no man page for this program

#
#	Turn on more warnings and fail if there were any warning generated. 
#
WARNS	= 6

#
#	Use BSD make utilities.
#
. include <bsd.prog.mk>


[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]