#!/bin/bash
# Per C11 a real number token is of the regular forms:
#
#  fractional_constant ?exponent_part ?floating_suffix
#  digit_sequence exponent_part ?floating_suffix
#  hexadecimal_prefix hexadecimal_fractional_constant binary_exponent_part ?floating_suffix
#  hexadecimal_prefix hexadecimal_digit_sequence binary_exponent_part ?floating_suffix

digit_sequence="[0-9]+"
sign="([+-])?"
fractional_constant_1="${digit_sequence}\\."
fractional_constant_2="(${digit_sequence})?\\.${digit_sequence}"
fractional_constant="((${fractional_constant_2})|(${fractional_constant_1}))"
exponent_part="([eE]${sign}${digit_sequence})"
floating_suffix="[lL]"; # Note, explicitly long double

x_prefix="0[xX]"
x_digit_sequence="[0-9a-fA-F]+"
x_fractional_constant="(((${x_digit_sequence})?\\.${x_digit_sequence})|(${x_digit_sequence}\\.))"
bin_exponent_part="([pp]${sign}${digit_sequence})"

form1="((${fractional_constant}${exponent_part}?)|(${digit_sequence}${exponent_part}))"
form2="(${x_prefix}((${x_fractional_constant}${bin_exponent_part}?)|(${x_digit_sequence}${bin_exponent_part})))"
slit="(($form1)|($form2))${floating_suffix}"

FILES="
sysdeps/ieee754/ldbl-128/e_acoshl.c
sysdeps/ieee754/ldbl-128/e_acosl.c
sysdeps/ieee754/ldbl-128/e_asinl.c
sysdeps/ieee754/ldbl-128/e_atan2l.c
sysdeps/ieee754/ldbl-128/e_atanhl.c
sysdeps/ieee754/ldbl-128/e_coshl.c
sysdeps/ieee754/ldbl-128/e_exp10l.c
sysdeps/ieee754/ldbl-128/e_expl.c
sysdeps/ieee754/ldbl-128/e_gammal_r.c
sysdeps/ieee754/ldbl-128/e_hypotl.c
sysdeps/ieee754/ldbl-128/e_j0l.c
sysdeps/ieee754/ldbl-128/e_j1l.c
sysdeps/ieee754/ldbl-128/e_jnl.c
sysdeps/ieee754/ldbl-128/e_lgammal_r.c
sysdeps/ieee754/ldbl-128/e_log10l.c
sysdeps/ieee754/ldbl-128/e_log2l.c
sysdeps/ieee754/ldbl-128/e_logl.c
sysdeps/ieee754/ldbl-128/e_powl.c
sysdeps/ieee754/ldbl-128/e_rem_pio2l.c
sysdeps/ieee754/ldbl-128/e_remainderl.c
sysdeps/ieee754/ldbl-128/e_sinhl.c
sysdeps/ieee754/ldbl-128/k_cosl.c
sysdeps/ieee754/ldbl-128/k_sincosl.c
sysdeps/ieee754/ldbl-128/k_sinl.c
sysdeps/ieee754/ldbl-128/k_tanl.c
sysdeps/ieee754/ldbl-128/lgamma_negl.c
sysdeps/ieee754/ldbl-128/s_asinhl.c
sysdeps/ieee754/ldbl-128/s_atanl.c
sysdeps/ieee754/ldbl-128/s_cbrtl.c
sysdeps/ieee754/ldbl-128/s_cosl.c
sysdeps/ieee754/ldbl-128/s_erfl.c
sysdeps/ieee754/ldbl-128/s_expm1l.c
sysdeps/ieee754/ldbl-128/s_fmal.c
sysdeps/ieee754/ldbl-128/s_frexpl.c
sysdeps/ieee754/ldbl-128/s_llrintl.c
sysdeps/ieee754/ldbl-128/s_llroundl.c
sysdeps/ieee754/ldbl-128/s_log1pl.c
sysdeps/ieee754/ldbl-128/s_lrintl.c
sysdeps/ieee754/ldbl-128/s_lroundl.c
sysdeps/ieee754/ldbl-128/s_nearbyintl.c
sysdeps/ieee754/ldbl-128/s_nextafterl.c
sysdeps/ieee754/ldbl-128/s_remquol.c
sysdeps/ieee754/ldbl-128/s_scalblnl.c
sysdeps/ieee754/ldbl-128/s_scalbnl.c
sysdeps/ieee754/ldbl-128/s_sincosl.c
sysdeps/ieee754/ldbl-128/s_sinl.c
sysdeps/ieee754/ldbl-128/s_tanhl.c
sysdeps/ieee754/ldbl-128/s_tanl.c
sysdeps/ieee754/ldbl-128/t_expl.h
sysdeps/ieee754/ldbl-128/t_sincosl.c
sysdeps/ieee754/ldbl-128/x2y2m1l.c
"

for i in $FILES; do
	# Wrap C11 long double literals, removing the suffix on lines which
	# obviously aren't just comments.
	sed -i -re  "/^[ \\t]*\\/\\*/! s/${slit}/L(\1)/g" $i

	# Unwrap 5 digit or smaller integral constants as integers
	sed -i -re  "s/L\(([0-9]{1,5})\\.0*(e0)?\)/\\1/g" $i

	# Move negation inside the macro for the sake of
	# human readers, after we fold integral values.
	sed -i -e "s/-L(/L(-/g" $i
done
