shell-scripts: human-readable preprocessor output

Added script I used to read preprocessor output during preprocessor metaprogramming development. Normally it is highly unreadable, this tool makes things a wee bit easier.

Signed-off-by: Michal Jerzy Wierzbicki <michalx.wierzbicki@linux.intel.com>
This commit is contained in:
Michal Jerzy Wierzbicki 2018-11-20 12:10:46 +01:00
parent c70284445a
commit 044077cb86
1 changed files with 123 additions and 0 deletions

123
scripts/pretty-macro.sh Executable file
View File

@ -0,0 +1,123 @@
#!/bin/bash
# Simple script for printing preprocessor output in human-readable fashion
# Mostly useful for debugging macro metaprogramming
# For more detailed useage, use --h option.
enstyle(){
awk \
-v style="${1}" \
-v regex="${2}" \
'{\
gsub(\
regex,\
"\033["style"m&\033[0m"\
);\
print;\
}'
}
styleUserRegexp()
{
if [[ "${USER_REGEXP}" != "" ]] ; then
enstyle "7;33" "${USER_REGEXP}"
else
tee # pipe that does nothing, just pass input to output
fi
}
styleAll(){
if [[ "${COLORISE}" == "1" ]] ; then
enstyle "33" '[{}()\\[\\],;]'\
| enstyle "1;31" '->|\\.|&'\
| enstyle "1;35" '\\s(if|while|do|for|return|exit|panic)'\
| enstyle "1;36" '(u?int(32|64)_t|void|struct|const|char|volatile|static|unsigned|long)\\s*\\**'\
| enstyle "32" '0x[A-Za-z0-9]+'\
| styleUserRegexp
else
tee # pipe that does nothing, just pass input to output
fi
}
pretty_macro(){
params="${1}"
infile="${2}"
gcc_params="${params} -E -dD ${infile}"
if [[ "${SHOW_ERR}" == "0" ]] ; then
gcc_params+=" 2>/dev/null"
fi
cmd="gcc ${gcc_params}"
if [[ "${VERBOSE}" == "1" ]] ; then
echo "params are: [${params}]"
echo "infile is: [${infile}]"
echo "cmd is: [${cmd}]"
fi
bash -c "$cmd" \
| sed\
-e 's/;\ /;\n\t/g'\
-e 's/{\ /\n{\n\t/g'\
-e 's/}[\ ]*/\n}\n/g'\
| styleAll
}
VERBOSE=0
SHOW_ERR=0
COLORISE=0
gcc_params=""
USER_REGEXP=""
while getopts ":f:I:u:hevc" opt; do
case ${opt} in
h) #usage
echo \
"usage: $0 [-hevc] (-f IN_FILE) [-I INCLUDE_DIR] [-u USER_REGEXP]
Expands c macroes in files given with -f flag and prints them prettily.
mandatory arguments:
-f IN_FILE input file to gcc
optional arguments:
-h show this help message and exit
-e don't redirect gcc errors to /dev/null
-v show verbose output
-c color the output
-u USER_REGEXP highlights user defined regular expression
-I INCLUDE_DIR pass INCLUDE_DIR to gcc with -I option
"
exit 0
;;
u)
USER_REGEXP="${OPTARG}"
;;
e)
SHOW_ERR=1
;;
v)
VERBOSE=1
;;
c)
COLORISE=1
;;
I)
gcc_params+=" -I ${OPTARG}"
;;
f)
infiles+=("${OPTARG}")
;;
\?)
echo "Invalid option: -${OPTARG}" >&2
exit 1
;;
:)
echo "Option -${OPTARG} requires an argument." >&2
exit 1
;;
esac
done
if [[ "${VERBOSE}" == "1" ]] ; then
echo "gcc_params are: [${gcc_params}]"
echo "infiles are: [${infiles[@]}]"
echo "user regexp is: [${USER_REGEXP}]"
fi
for file in ${infiles[@]} ; do
pretty_macro "${gcc_params}" "${file}"
done
exit 0