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