+
+/* Adjusts FMT's width and decimal places to be valid for USE. */
+void
+fmt_fix (struct fmt_spec *fmt, enum fmt_use use)
+{
+ /* Clamp width to those allowed by format. */
+ fmt_clamp_width (fmt, use);
+
+ /* If FMT has more decimal places than allowed, attempt to increase FMT's
+ width until that number of decimal places can be achieved. */
+ if (fmt->d > fmt_max_decimals (fmt->type, fmt->w, use)
+ && fmt_takes_decimals (fmt->type))
+ {
+ int max_w = fmt_max_width (fmt->type, use);
+ for (; fmt->w < max_w; fmt->w++)
+ if (fmt->d <= fmt_max_decimals (fmt->type, fmt->w, use))
+ break;
+ }
+
+ /* Clamp decimals to those allowed by format and width. */
+ fmt_clamp_decimals (fmt, use);
+}
+
+/* Adjusts FMT's width and decimal places to be valid for an
+ input format. */
+void
+fmt_fix_input (struct fmt_spec *fmt)
+{
+ fmt_fix (fmt, FMT_FOR_INPUT);
+}
+
+/* Adjusts FMT's width and decimal places to be valid for an
+ output format. */
+void
+fmt_fix_output (struct fmt_spec *fmt)
+{
+ fmt_fix (fmt, FMT_FOR_OUTPUT);
+}
+
+/* Sets FMT's width to WIDTH (or the nearest width allowed by FMT's type) and
+ reduces its decimal places as necessary (if necessary) for that width. */
+void
+fmt_change_width (struct fmt_spec *fmt, int width, enum fmt_use use)
+{
+ fmt->w = width;
+ fmt_clamp_width (fmt, use);
+ fmt_clamp_decimals (fmt, use);
+}
+
+/* Sets FMT's decimal places to DECIMALS (or the nearest number of decimal
+ places allowed by FMT's type) and increases its width as necessary (if
+ necessary) for that number of decimal places. */
+void
+fmt_change_decimals (struct fmt_spec *fmt, int decimals, enum fmt_use use)
+{
+ fmt->d = decimals;
+ fmt_fix (fmt, use);
+}