This repository has been archived on 2022-05-21. You can view files and clone it, but cannot push or open issues or pull requests.
LEFTONE/tool/crial.sh

90 lines
1.8 KiB
Bash
Raw Permalink Normal View History

#!/bin/bash
set -eu
DEFAULT_SERIALIZER="${DEFAULT_SERIALIZER:-}"
DEFAULT_DESERIALIZER="${DEFAULT_DESERIALIZER:-}"
preproc=$(cat << EOS
s|^\s*(.*)\s*$|\1|
/^\/\*\s*CRIAL\s*$/, /^\*\/$/ ! d
/^\/\*\s*CRIAL\s*$/ d
/^\*\/$/ d
EOS
)
seq=
part_serializer="$DEFAULT_SERIALIZER"
part_deserializer="$DEFAULT_DESERIALIZER"
serializer=
deserializer=
last_name=
count=0
add_property() {
name=$(awk -F ' ' '{print $1}' <<< "$1")
code=$(awk -F ' ' '{print $1}' <<< "$2")
local s="$part_serializer"
local d="$part_deserializer"
s=${s//\$name/$name}
d=${d//\$name/$name}
s=${s//\$code/$code}
d=${d//\$code/$code}
serializer+="do { $s } while (0);"
deserializer+="do { $d } while (0);"
(( ++count ))
}
while IFS=$'\n' read line; do
if [[ ! $line ]]; then continue; fi
case $seq in
serializer)
if [[ $line == "END" ]]; then
seq=
else
part_serializer+="$line"
fi
;;
deserializer)
if [[ $line == "END" ]]; then
seq=
else
part_deserializer+="$line"
fi
;;
*)
if [[ $line =~ ^# ]]; then
:
elif [[ $line =~ ^SERIALIZER_BEGIN$ ]]; then
seq="serializer"
part_serializer=
elif [[ $line =~ ^DESERIALIZER_BEGIN$ ]]; then
seq="deserializer"
part_deserializer=
elif [[ $line =~ ^PROPERTY[[:blank:]](.*)=(.*)$ ]]; then
add_property "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
elif [[ $line =~ ^PROPERTY[[:blank:]](.*)$ ]]; then
add_property "${BASH_REMATCH[1]}" "${BASH_REMATCH[1]}"
else
echo crial syntax error
exit 1
fi
;;
esac
done < <(cat - | sed -r "$preproc")
echo "#define CRIAL_PROPERTY_COUNT_ $count"
echo "#define CRIAL_SERIALIZER_ do { $serializer } while (0)"
echo "#define CRIAL_DESERIALIZER_ do { $deserializer } while (0)"