BACK to addon.html#char-mapper

#! /bin/sh

case "${VERBOSE}" in
[YytT1-9]* ) set -x ;;
esac
base_name=test-cmap

case "${1}" in
-c | --cl* )
    echo "rm -f ${base_name}*"
    rm -f ${base_name}*
    exit 0
    ;;
esac

set -e

def_guard=TEST_CMAP_DEFINE

rm -f ${base_name}* || :
exec 3> ${base_name}.map
tbl_name=`echo ${base_name} | sed 's/[^a-zA-Z0-9_]/_/g'`

cat >&3 <<- _EOF_
	%guard          ${def_guard}
	%file           ${base_name}.h
	%table          ${tbl_name}
	_EOF_

cat >&3 <<- \_EOF_

	%comment
        This file contains the character classifications
        used by char-mapper to test its proper functioning.
	%

	lower-case      "a-z"
	upper-case      "A-Z"
	alphabetic      +lower-case   +upper-case
	oct-digit       "0-7"
	dec-digit       "89"          +oct-digit
	hex-digit       "a-fA-F"      +dec-digit
	alphanumeric    +alphabetic   +dec-digit
	var-first       "_"           +alphabetic
	variable-name   +var-first    +dec-digit
	option-name     "^-"          +variable-name
	value-name      ":"           +option-name
	horiz-white     "\t "
	compound-name   "[.]"         +value-name   +horiz-white
	whitespace      "\v\f\r\n\b"  +horiz-white
	unquotable      "!-~"         -"\"#(),;<=>[\\]`{}?*'"
	end-xml-token   "/>"          +whitespace
	graphic         "!-~"
	plus-n-space    "+"           +whitespace
	punctuation     "!-~"         -alphanumeric -"_"
	suffix          "-._"         +alphanumeric
	suffix-fmt      "%/"          +suffix
	_EOF_

exec 3>&-
rm -f ag-char-map.h
./char-mapper ${base_name}.map
test -f ${base_name}.h

list=$(sed -n '/^lower-case/,$s/ .*//p' ${base_name}.map | tr -- -a-z _A-Z)

exec 3> ${base_name}.c
cat >&3 <<- _EOF_
	#include <stdio.h>
	#define ${def_guard} 1
	#include "${base_name}.h"

	int main(int argc, char ** argv) {
	  int ch = 0;
	  int const chct = sizeof(${tbl_name})/sizeof(${tbl_name}[0]);
	  for (; ch < chct; ch++) {
	    int has_bit = 0;
	    printf("\n0x%04X (%c):\n", ch, (isprint(ch) ? ch : '?'));
	_EOF_

nl='
'
fmt="    if (IS_%s_CHAR(ch)) {${nl}      fputs(\"  is %s\\\\n\", stdout);\n"
fmt="${fmt}${nl}      has_bit++;${nl}    }\n"

for e in ${list}
do
    printf "${fmt}" $e $e
done >&3
cat >&3 <<- _EOF_
	    if (has_bit == 0)
	      fputs("  is *NOT* a member of any class\n", stdout);
	  }
	  return 0;
	}
	_EOF_
exec 3>&-

${CC:-cc} -o ${base_name} ${base_name}.c
case "$-" in
*x* ) ./${base_name}
      ls -l ${base_name}* ;;
*   ) ./${base_name} >/dev/null
      rm -f ${base_name}* ;;
esac