This implementation is defined - each provider can and usually does it differently.
The most commonly used table of “signs” is an array with one element for each symbol, the value of this element, which is a collection of flags, indicates the details of the symbol. An example is:
traits[(int) 'C'] = ALPHA | UPPER | PRINTABLE;
In this case, isupper () will look something like this:
#define isupper(c) ((traits[(int)(c)] & UPPER) == UPPER)
source
share