* va_end is missing, but it is mandatory. I don't care that on the PC the macro expands to nothing, there are other platforms on the world, and on some of them va_end may not be empty. * the two switch() are horrible, there is a huge lot of code duplication. The right thing to do here is having one table to convert GPM_* into STRING_*, for every allowed "*"; then one vfprintf only.