1
0
mirror of https://github.com/irssi/irssi.git synced 2024-12-04 14:46:39 -05:00
irssi/.github/workflows/clangformat/clang-format-xs
2020-04-29 04:24:51 +02:00

115 lines
2.2 KiB
Bash
Executable File

#!/bin/bash
set -eu
srcdir=$(dirname "$(readlink -f "$0")")
test -z "$srcdir" && srcdir=.
CLANG_FORMAT=${CLANG_FORMAT:-clang-format}
options=()
files=()
lines=()
no_options=0;inplace=0;xml=0;keep_offset=0;keep_length=0;keep=0;
filename=tmp.1.c
offsets=
karg=
off_opts=()
for arg in "$@"; do
if [[ $keep = 1 ]]; then
if [[ "$karg" = "-offset" ]]; then
offsets="$offsets${offsets:+ }$arg"
off_opts+=("$karg" "$arg")
elif [[ "$karg" = "-length" ]]; then
offsets="$offsets:$arg"
off_opts+=("$karg" "$arg")
elif [[ "$karg" = "-assume-filename" ]]; then
filename="$arg"
options+=("$karg" "$arg")
else
options+=("$karg" "$arg")
fi
keep=0
elif [[ $no_options = 0 ]]; then
case "$arg" in
-assume-filename=*)
filename="${arg#-assume-filename=}"
;;
-lines=*)
lines+=("${arg#-lines=}")
;;
*)
;;
esac
case "$arg" in
--) no_options=1
;;
-i) inplace=1
;;
-output-replacements-xml)
xml=1
;;
-offset|-length|-cursor|-assume-filename|-fallback-style|-style)
keep=1
karg="$arg"
;;
-*) options+=("$arg")
;;
*) files+=("$arg")
;;
esac
else
files+=("$arg")
fi
done
export IN_LINES="${lines[*]}"
export OFFSETS="$offsets"
options_o=("${options[@]}")
if [[ $inplace = 1 ]]; then
options_o=("-i" "${options[@]}")
fi
if [[ $xml = 1 ]]; then
options_o=("-output-replacements-xml" "${options[@]}")
fi
options_o+=("${off_opts[@]}")
do_xs() {
perl "$srcdir"/format-xs-1.pl "$1" > "$1".1.c
$CLANG_FORMAT -i "${options[@]}" -- "$1".1.c
if [[ $xml = 1 ]]; then
perl "$srcdir"/format-xs-2.pl "$1".1.c > "$1".1.xs
perl "$srcdir"/format-xs-xml.pl <(diff -U0 <(od -An -tu1 -w1 -v "$1") <(od -An -tu1 -w1 -v "$1".1.xs))
rm "$1".1.xs
elif [[ $inplace = 1 ]]; then
perl "$srcdir"/format-xs-2.pl "$1".1.c > "$1"
else
perl "$srcdir"/format-xs-2.pl "$1".1.c
fi
rm "$1".1.c
}
if [[ ${#files[@]} -eq 0 ]]; then
case "$filename" in
*.xs)
cat > "$filename".1.xs
do_xs "$filename".1.xs
rm "$filename".1.xs
;;
*)
$CLANG_FORMAT "${options_o[@]}"
;;
esac
else
for file in "${files[@]}"; do
case "$file" in
*.xs)
do_xs "$file"
;;
*)
$CLANG_FORMAT "${options_o[@]}" -- "$file"
;;
esac
done
fi