Proposal for Optimized Character Type Function
The Cuthour
cuthour@gmail.com
Sun Mar 2 08:59:15 GMT 2025
here, 15-18% faster
----------
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
/*
* ch&0x01==1 => lower
* ch&0x02==1 => upper
* ch&0x04==1 => digit
* ch&0x08==1 => punct
* ch&0x10==1 => space
* ch&0x20==1 => hexdigit
* ch&0x40==1 =>
* ch&0x80==1 =>
*/
const unsigned char __ctype_table[256] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
0x0C, 0x0C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x20, 0x20, 0x20, 0x20, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const bool inline
my_islower (const unsigned char ch)
{
return __ctype_table[ch] & 0x01;
}
const bool inline
my_isupper (const unsigned char ch)
{
return __ctype_table[ch] & 0x02;
}
const bool inline
my_isdigit (const unsigned char ch)
{
return __ctype_table[ch] & 0x04;
}
const bool inline
my_ispunct (const unsigned char ch)
{
return __ctype_table[ch] & 0x08;
}
const bool inline
my_isalpha (const unsigned char ch)
{
return __ctype_table[ch] & 0x03;
}
const bool inline
my_isalnum (const unsigned char ch)
{
return __ctype_table[ch] & 0x07;
}
const bool inline
my_isgraph (const unsigned char ch)
{
return __ctype_table[ch] & 0x0F;
}
const bool inline
my_isspace (const unsigned char ch)
{
return __ctype_table[ch] & 0x10;
}
const bool inline
my_isxdigit (const unsigned char ch)
{
return __ctype_table[ch] & 0x20;
}
const bool inline
my_isprint (const unsigned char ch)
{
return (ch>=0x20 && ch<=0x7E);
}
const bool inline
my_iscntrl (const unsigned char ch)
{
return (ch<0x20 || ch==0x7F);
}
More information about the Libc-alpha
mailing list