• Re: strspn()

    From Bonita Montero@Bonita.Montero@gmail.com to comp.lang.c on Tue Dec 2 13:44:59 2025
    From Newsgroup: comp.lang.c

    Am 22.11.2025 um 01:04 schrieb bart:
    On 21/11/2025 18:41, Michael Sanders wrote:
    So strspn, perfect for what I need!

    before:

    int ok = 1;

    if (strlen(colorSpec) == 4) {
         for (int i = 0; i < 4; i++) {
             char c = colorSpec[i];
             if (c < '1' || c > '8') { ok = 0; break; }
         }
    } else ok = 0;

    after:

    strspn() returns the length of the leading substring
    consisting ONLY of characters in the allowed set...

    if (strlen(colorSpec) != 4 && strspn(colorSpec, "12345678") = 4) FAIL;


    Performance probably isn't critical in your use-case, but the solution
    using 'strspn' was three times as slow as doing the explicit code.
    (Test string was a fixed "8725" and tested 100M times.)
    Try that with AVX. Make a 256 bit vector with 0's and a vector with '9's.
    Have two compares resulting in a 32 * 8 bit 0 / 0xFF mask. Convert that
    mask to a bitmask (with AVX-512 the comparison directly results in a
    bitmask, i.e. no conversion is necessary).
    --- Synchronet 3.21a-Linux NewsLink 1.2