90 lines
1.8 KiB
Bash
90 lines
1.8 KiB
Bash
|
#!/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)"
|