There's not a lot to say about this; running it will quickly tell you it's a palindrome checker, and it's written using standard tricks of the genre. I thought it would be nice to have a recursive main that used its arguments in the standard way, but later discovered that it had been done before. Possibly novel features are the inclusion of what looks like a crossword clue to distract the reader, and the formatting. The layout shows the logical structure about as clearly as possible, if you prefer outdenting to indenting. If you compile this program and would like to test it, check out Gordon Dow's 306-word palindrome ‘Dog Sees Ada’.
This program does not conform to the ISO C standard, so those concerned about nasal demons should not run it. The obvious violation is that it modifies the argv array. It also breaks the sequence-point rule (ISO/IEC 9899:1999 6.5#2) in a rather obscure way. There's an expression of the form e1[e2] that will be evaluated as intended if e1 is evaluated before e2, or if e2 is evaluated before e1, but possibly not if they are evaluated in parallel or interleaved.
This program is an attempt at misdirection. The source contains some thinly disguised hints that it's a prime generator, and running it with an argument of, say, 100 appears to confirm this. Things start to go wrong at 561. The program does print out all primes up to its argument, but also prints out the Carmichael numbers, and leaves it to the user to figure out which are which. The sieve used is taken from a paper by Richard Pinch , The Carmichael numbers up to 1015, Math. Comp. 61 (1993), 381--391. The name ‘hw’ was chosen because a likely response on the news group comp.lang.c to a question such as the one spelt out by the macro names in hw.c would be “We don't do people's homework.”