As a learning exercise, my three functions—ToggleCase, LowerCase and UpperCase—each expect a pointer to an ASCII char string, terminated by the null character; they work as expected. Are there more efficient or faster methods of accomplishing this task? Am I breaking any unspoken rules of good C coding? I've made use of macros because, I think, it makes the code look better and it is more efficient than function calls. Is this typical or overkill?
Please feel free to nit-pick and critique the code (but do be nice).
case_conversion.h
#define CASE_FLAG 32
#define a_z(c) (c >= 'a' && c <= 'z')
#define A_Z(c) (c >= 'A' && c <= 'Z')
void ToggleCase(char* c);
void LowerCase(char* c);
void UpperCase(char* c);
case_conversion.c
#include "case_conversion.h"
void ToggleCase(char* c)
{
while (*c)
{
*c ^= a_z(*c) || A_Z(*c) ? CASE_FLAG : 0;
c++;
}
}
void LowerCase(char* c)
{
while (*c)
{
*c ^= A_Z(*c) ? CASE_FLAG : 0;
c++;
}
}
void UpperCase(char* c)
{
while (*c)
{
*c ^= a_z(*c) ? CASE_FLAG : 0;
c++;
}
}