#!/bin/sh -e format="$1" shift 1 prefix="$( printf '%s\\|' "$@" | sed 's/..$//' )" definitions_with_max="$( sed -n 's/^\s*#\s*define\s\+\(\('"$prefix"'\)_[A-Za-z0-9_]*\)\s\+\(0[xX][0-9A-Fa-f]\+\|[0-9]\+\)\(.*\)$/\3 \1/p' )" definitions="$( printf '%s\n' "$definitions_with_max" | sed '/ \('"$prefix"'\)_MAX$/d' )" max=$( printf '%u\n' $( printf '%s\n' "$definitions_with_max" | sed -n 's/^\(.*\) \('"$prefix"'\)_MAX$/\1/p' ) ) nonunique="$( printf '%s\n' "$definitions" | while read num name; do printf '0x%08X\n' $num done | sort | uniq -d )" printf '%s\n' "$definitions" | while read line; do printf '0x%08X %s\n' $line done | ( prefixed="$(cat)" printf '%s\n' "$prefixed" | sed '/^\('"$(printf '%s\\|' $nonunique | sed 's/..$/\n/')"'abcdef\) /d' last_num=x last_name=x printf '%s\n' "$prefixed" | sed -n 's/^\('"$(printf '%s\\|' $nonunique | sed 's/..$/\n/')"'\) .*$/&/p' | while read num name; do num=$(printf '0x%08X\n' $num) if ! test $last_num = $num && ! test $last_num = x; then printf '%s %s\n' $last_num $last_name fi last_num=$num last_name=$name done if ! test $last_num = x; then printf '%s %s\n' $last_num $last_name fi ) | sort | while read num name; do printf '%s %u\n' $name $num; done | uniq -f 1 | awk ' BEGIN {num = 0} { while ($2 != num) { printf "\"'"$format"'\",\n", num num += 1 } printf "\"%s\",\n", $1 num += 1 } END { while (num <= '"$max"') { printf "\"'"$format"'\",\n", num num += 1 } }' | sed '$s/,$//'