mirror of https://github.com/thesofproject/sof.git
124 lines
2.5 KiB
Bash
Executable File
124 lines
2.5 KiB
Bash
Executable File
#!/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
|
|
|