P.S.:

Steffen Nurpmeso wrote in
 <20260220005636.rXyivqZV@steffen%sdaoden.eu>:
 |Alejandro Colomar wrote in
 | <aZeOM3sbAm6t-mq6@devuan>:
 ||On 2026-02-19T23:18:16+0100, Steffen Nurpmeso wrote:
 ||> Alejandro Colomar wrote in
 ||>  <aZeGabzZUpS4fT4B@devuan>:
 ||>|On 2026-02-19T22:15:29+0100, Steffen Nurpmeso wrote:
 ||>|> Crystal Kolipe via Mutt-dev wrote in
 ||>|>  <[email protected]>:
 ||>|>|On Thu, Feb 19, 2026 at 02:32:45PM +0100, Alejandro Colomar via \
 ||>|>|Mutt-dev \
 ||>|>|\
 ||>|>|wrote:
 ||>|> 
 ||>|> I think "the best" is a table lookup.
 | ...
 ||Of course, a LUT beats anything, but the implementation is far from
 ||readable.  And it only works for isascii(3) functions, but not so much
 ||for skipws(), because you need to write a loop, at which point you don't

Btw, where is my head, i remembered i do also have a lookup table
for RFC 5322 syntax.
Maybe because i have a logical error in how the actual code works
(it "requotes" local parts which contain quotes (or should), ie it
actively changes local-parts), but that does not affect the lookup
table.  So with it i can

  /*! (RFC 5234, B.1. Core Rules; \r{su_imf_c_SP()} or \r{su_imf_c_HT()}.) */
  SINLINE boole su_imf_c_WSP(char c) {return (a_X(c, su_IMF_C_SP | 
su_IMF_C_HT));}
  /*! Any of \r{su_imf_c_SP()}, \r{su_imf_c_HT()}, \r{su_imf_c_LF()} or 
\r{su_imf_c_CR()}. */
  SINLINE boole su_imf_c_ANY_WSP(char c) {return (a_X(c, su_IMF_C_SP | 
su_IMF_C_HT | su_IMF_C_LF | su_IMF_C_CR));}

(where a_X is

  #undef a_X
  #if su__IMF_TABLE_SIZE == U8_MAX
  # define a_X(X,Y) ((su__imf_c_tbl[S(u8,X)] & (Y)) != 0)
  #elif su__IMF_TABLE_SIZE == S8_MAX
  # define a_X(X,Y) (S(u8,X) <= S8_MAX && (su__imf_c_tbl[S(u8,X)] & (Y)) != 0)
  #else
  # error su__IMF_TABLE_SIZE must be U8_MAX or S8_MAX
  #endif
 
), which is quite comfortable.
That is, in short, and to end this, i think in working internet
message format function call overhead does practically not matter,
but still i prefer table lookups :)

Ciao already here, dear Alejandro.


/* imf_table_dump {{{ */
#ifdef a_IMF_TABLE_DUMP
SINLINE boole a_imf_c_ALPHA(char c) {return ((c >= 0x41 && c <= 0x5A) || (c >= 
0x61 && c <= 0x7A));}
SINLINE boole a_imf_c_DIGIT(char c) {return (c >= 0x30 && c <= 0x39);}
SINLINE boole a_imf_c_VCHAR(char c) {return (c >= 0x21 && c <= 0x7E);}
SINLINE boole a_imf_c_atext(char c){
        return (a_imf_c_ALPHA(c) || a_imf_c_DIGIT(c) ||
                        c == '!' || c == '#' || c == '$' || c == '%' || c == 
'&' || c == '\'' || c == '*' ||
                        c == '+' || c == '-' || c == '/' || c == '=' || c == 
'?' || c == '^' || c == '_' || c == '`' ||
                        c == '{' || c == '|' || c == '}' || c == '~');
}
SINLINE boole a_imf_c_ctext(char c) {return ((c >= 33 && c <= 39) || (c >= 42 
&& c <= 91) || (c >= 93 && c <= 126));}
SINLINE boole a_imf_c_dtext(char c) {return ((c >= 33 && c <= 90) || (c >= 94 
&& c <= 126));}
SINLINE boole a_imf_c_qtext(char c) {return (c == 33 || (c >= 35 && c <= 91) || 
(c >= 93 && c <= 126));}
SINLINE boole a_imf_c_special(char c){
        return (c == '(' || c == ')' || c == '<' || c == '>' || c == '[' || c 
== ']' || c == ':' || c == ';' ||
                        c == '@' || c == '\\' || c == ',' || c == '.' || 
su_imf_c_DQUOTE(c));
}
SINLINE boole a_imf_c_obs_NO_WS_CTL(char c){
        return (c >= 1 && c <= 8) || (c == 11 || c == 12) || (c >= 14 && c <= 
31) || (c == 127);
}

SINLINE boole a_imf_c_CR(char c) {return (c == 0x0D);}
SINLINE boole a_imf_c_DQUOTE(char c) {return (c == 0x22);}
SINLINE boole a_imf_c_HT(char c) {return (c == 0x09);}
SINLINE boole a_imf_c_LF(char c) {return (c == 0x0A);}
SINLINE boole a_imf_c_SP(char c) {return (c == 0x20);}

void
su_imf_table_dump(void){
        char c;

        fputs("#undef a_X\n", stdout);
        fputs("#define a_X(X) CONCAT(su_IMF_C_, X)\n", stdout);
        fputs("u16 const su__imf_c_tbl[su__IMF_TABLE_SIZE + 1] = { /* {{{ 
*/\n", stdout);

        for(c = '\0';;){
                fputc('\t', stdout);
                if(a_imf_c_ALPHA(c))
                        fputs("a_X(ALPHA) | ", stdout);
                if(a_imf_c_DIGIT(c))
                        fputs("a_X(DIGIT) | ", stdout);
                if(a_imf_c_VCHAR(c))
                        fputs("a_X(VCHAR) | ", stdout);
                if(a_imf_c_atext(c))
                        fputs("a_X(ATEXT) | ", stdout);
                if(a_imf_c_ctext(c))
                        fputs("a_X(CTEXT) | ", stdout);
                if(a_imf_c_dtext(c))
                        fputs("a_X(DTEXT) | ", stdout);
                if(a_imf_c_qtext(c))
                        fputs("a_X(QTEXT) | ", stdout);
                if(a_imf_c_special(c))
                        fputs("a_X(SPECIAL) | ", stdout);
                if(a_imf_c_obs_NO_WS_CTL(c))
                        fputs("a_X(NO_WS_CTL) | ", stdout);

                if(a_imf_c_CR(c))
                        fputs("a_X(CR) | ", stdout);
                if(a_imf_c_DQUOTE(c))
                        fputs("a_X(DQUOTE) | ", stdout);
                if(a_imf_c_HT(c))
                        fputs("a_X(HT) | ", stdout);
                if(a_imf_c_LF(c))
                        fputs("a_X(LF) | ", stdout);
                if(a_imf_c_SP(c))
                        fputs("a_X(SP) | ", stdout);

                fputs("0,\n", stdout);

                if(c++ == S8_MAX)
                        break;
        }

        fputs("}; /* }}} */\n", stdout);
}
#endif /* }}} a_IMF_TABLE_DUMP */

--steffen
|
|Der Kragenbaer,                The moon bear,
|der holt sich munter           he cheerfully and one by one
|einen nach dem anderen runter  wa.ks himself off
|(By Robert Gernhardt)

Reply via email to