Re: [PATCH] wip: change ISSPACE to use ascii whitespace check.

Steffen Nurpmeso <[email protected]>
Newsgroups gmane.mail.mutt.devel
Message-ID <20260219211529.SIgv89F3@steffen%sdaoden.eu>
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.
I use the below script to create a lookup table, it is easily
adaptable (it is 128 bytes + alignment, and it could be like this
ASM looks even better, all in all.

#!/bin/sh -
#@ Create src/su/gen-cs-ctype.h.
# Public Domain

OUT=src/su/gen-cs-ctype.h

# Generate a more verbose output.  Not for shipout versions.
VERB=1

##

LC_ALL=C
export LC_ALL OUT

create() {
	# Note this may be ISO C89, so we cannot
	cat <<__EOT__
	#include <ctype.h>
	#include <stdint.h>
	#include <stdio.h>
	#include <stdlib.h>
	#define su_S(T,I) ((T)(I))
	#define u8 uint8_t
	#define S8_MAX INT8_MAX
	static void
	a_csc_init(FILE *fp){
		u8 i, any;
		char const *xpre, *pre;

		fprintf(fp, "CTAV(su_CS_CTYPE_NONE == 0);\n"
			"#undef a_X\n"
			"#define a_X(X) su_CONCAT(su_CS_CTYPE_,X)\n"
			"u16 const su__cs_ctype[S8_MAX + 1] = {\n");
		xpre = $VERB ? " | " : "|";
		i = 0;
		do{
			any = 0, pre = "";
			if($VERB)
				fprintf(fp, "\t/* 0x%02X=%c */ ", (unsigned)i, (isprint(i) ? (char)i : '?'));
			if(isalnum(i))
				fprintf(fp, "%sa_X(ALNUM)", pre), any = 1, pre = xpre;
			if(isalpha(i))
				fprintf(fp, "%sa_X(ALPHA)", pre), any = 1, pre = xpre;
			if(isblank(i))
				fprintf(fp, "%sa_X(BLANK)", pre), any = 1, pre = xpre;
			if(iscntrl(i))
				fprintf(fp, "%sa_X(CNTRL)", pre), any = 1, pre = xpre;
			if(isdigit(i))
				fprintf(fp, "%sa_X(DIGIT)", pre), any = 1, pre = xpre;
			if(isgraph(i))
				fprintf(fp, "%sa_X(GRAPH)", pre), any = 1, pre = xpre;
			if(islower(i))
				fprintf(fp, "%sa_X(LOWER)", pre), any = 1, pre = xpre;
			if(isprint(i))
				fprintf(fp, "%sa_X(PRINT)", pre), any = 1, pre = xpre;
			if(ispunct(i))
				fprintf(fp, "%sa_X(PUNCT)", pre), any = 1, pre = xpre;
			if(isspace(i))
				fprintf(fp, "%sa_X(SPACE)", pre), any = 1, pre = xpre;
			if(isupper(i))
				fprintf(fp, "%sa_X(UPPER)", pre), any = 1, pre = xpre;
			if(isblank(i) || i == '\n')
				fprintf(fp, "%sa_X(WHITE)", pre), any = 1, pre = xpre;
			if(isxdigit(i))
				fprintf(fp, "%sa_X(XDIGIT)", pre), any = 1, pre = xpre;
			if(!any)
				fprintf(fp, "a_X(NONE)");
			fprintf(fp, ",\n");
		}while(i++ != S8_MAX);
		fprintf(fp, "};\n#undef a_X\n");
		if($VERB)
			fprintf(fp, "\n");

		fprintf(fp, "u8 const su__cs_tolower[S8_MAX + 1] = {\n");
		i = any = 0;
		do{
			if(any + 7 >= 78){
				fprintf(fp, "\n");
				any = 0;
			}
			if(any == 0 && $VERB)
					fprintf(fp, "\t"), any = 8;
			fprintf(fp, "'\\\x%02X',", (u8)tolower((char)i));
			any += 7;
		}while(i++ != S8_MAX);
		fprintf(fp, "\n};\n");
		if($VERB)
			fprintf(fp, "\n");

		fprintf(fp, "u8 const su__cs_toupper[S8_MAX + 1] = {\n");
		i = any = 0;
		do{
			if(any + 7 >= 78){
				fprintf(fp, "\n");
				any = 0;
			}
			if(any == 0 && $VERB)
					fprintf(fp, "\t"), any = 8;
			fprintf(fp, "'\\\x%02X',", (u8)toupper((char)i));
			any += 7;
		}while(i++ != S8_MAX);
		fprintf(fp, "\n};\n");
		if($VERB)
			fprintf(fp, "\n");
	}
	int main(void){
		FILE *ofp = fopen("${OUT}", "a");
		if(ofp == NULL){
			fprintf(stderr, "ERROR: cannot open output\n");
			return 1;
		}
		fprintf(ofp, "/*@ ${OUT}, generated by su-make-cs-ctype.sh.\n *@ See cs-ctype.c for more */\n\n");
		a_csc_init(ofp);
		fclose(ofp);
		return 0;
	}
__EOT__
}

if [ ${#} -ne 0 ]; then
	if [ "${1}" = noverbose ]; then
		shift
		VERB=0
		export VERB
	fi
fi

if [ ${#} -eq 0 ]; then
	create > "${TMPDIR}"/su-mk-cs-ctype.c || exit 2
	${CC} -o "${TMPDIR}"/su-mk-cs-ctype "${TMPDIR}"/su-mk-cs-ctype.c || exit 3
	rm -f src/su/gen-cs-ctype.h
	"${TMPDIR}"/su-mk-cs-ctype || exit 4
	rm -f "${TMPDIR}"/su-mk-cs-ctype "${TMPDIR}"/su-mk-cs-ctype.c || exit 5
	exit 0
fi
echo >&2 'Invalid usage'
exit 1

# s-itt-mode

--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)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.