#!/bin/sh set -e text="$(cat)" expr='\(0x[0-9a-fA-F]\+\|[0-9]\+\)[Ll]*[Uu]*[Ll]*' expr='\(\*\|\/\|[+~-]\|<<\|>>\)\?\s*'"$expr" expr='\('"$expr"'\|(\|)\)' expr='\s*\('"$expr"'\s*\)\+' filter () { sed -n 's/^\s*#\s*define\s\+\('"$1"'\)\s\+\('"$expr"'\)\s*\(\/.*\)\?$/\1 \2/p' } if test $# = 0; then printf '%s\n' "$text" | filter '[A-Z0-9_]\+' else for prefix; do printf '%s\n' "$text" | filter "$prefix"'_[A-Z0-9_]\+' done fi | \ while read name value; do value="$(printf '%s\n' "$value" | tr -d ULul)" value=$(printf '%s\n' "$(( $value ))" | cut -d . -f 1) printf '%s %s\n' "$name" "$value" done