The register keyword is a hint to the compiler that you'd like that value to be kept in a dedicated register on the processor. This can speed up reads and writes. With modern compilers, however, this sort of optimization is not only unnecessary but often counterproductive.
The reason it is between the function declaration and the block is that in old c (pre C90) you wouldn't declare parameter type next to the parameter but between the declaration of the function and the block.
For example:
int main(argc, argv)
char ** argv;
{
...
}
Notice I didn't do anything for argc because if you don't explicitly define a type it defaults to int.
You'll see this more often than you'd think. I ran into this a bunch when I did work on FFMPEG.
The (void) cast thing prevents unused parameter warnings/errors. I've run into this when working on PortAudio with a low-level callback function.
(void)in front of fprintf is just used to make it explicit that the return value is not being used.