+/* Returns the minimum width of the given format TYPE,
+ for input if FOR_INPUT is true,
+ for output otherwise. */
+int
+fmt_min_width (enum fmt_type type, bool for_input)
+{
+ return for_input ? fmt_min_input_width (type) : fmt_min_output_width (type);
+}
+
+/* Returns the maximum width of the given format TYPE,
+ for input if FOR_INPUT is true,
+ for output otherwise. */
+int
+fmt_max_width (enum fmt_type type, bool for_input UNUSED)
+{
+ /* Maximum width is actually invariant of whether the format is
+ for input or output, so FOR_INPUT is unused. */
+ assert (is_fmt_type (type));
+ switch (type)
+ {
+ case FMT_P:
+ case FMT_PK:
+ case FMT_PIBHEX:
+ case FMT_RBHEX:
+ return 16;
+
+ case FMT_IB:
+ case FMT_PIB:
+ case FMT_RB:
+ return 8;
+
+ case FMT_A:
+ return MAX_STRING;
+
+ case FMT_AHEX:
+ return 2 * MAX_STRING;
+
+ default:
+ return 40;
+ }
+}
+
+/* Returns the maximum number of decimal places allowed for the
+ given format TYPE with a width of WIDTH places,
+ for input if FOR_INPUT is true,
+ for output otherwise. */
+int
+fmt_max_decimals (enum fmt_type type, int width, bool for_input)
+{
+ int max_d;
+
+ switch (type)
+ {
+ case FMT_F:
+ case FMT_COMMA:
+ case FMT_DOT:
+ max_d = for_input ? width : width - 1;
+ break;
+
+ case FMT_DOLLAR:
+ case FMT_PCT:
+ max_d = for_input ? width : width - 2;
+ break;
+
+ case FMT_E:
+ max_d = for_input ? width : width - 7;
+ break;
+
+ case FMT_CCA:
+ case FMT_CCB:
+ case FMT_CCC:
+ case FMT_CCD:
+ case FMT_CCE:
+ assert (!for_input);
+ max_d = width - 1;
+ break;
+
+ case FMT_N:
+ case FMT_Z:
+ max_d = width;
+ break;
+
+ case FMT_P:
+ max_d = width * 2 - 1;
+ break;
+
+ case FMT_PK:
+ max_d = width * 2;
+ break;
+
+ case FMT_IB:
+ case FMT_PIB:
+ max_d = max_digits_for_bytes (width);
+ break;
+
+ case FMT_PIBHEX:
+ max_d = 0;
+ break;
+
+ case FMT_RB:
+ case FMT_RBHEX:
+ max_d = 16;
+ break;
+
+ case FMT_DATE:
+ case FMT_ADATE:
+ case FMT_EDATE:
+ case FMT_JDATE:
+ case FMT_SDATE:
+ case FMT_QYR:
+ case FMT_MOYR:
+ case FMT_WKYR:
+ max_d = 0;
+ break;
+
+ case FMT_DATETIME:
+ max_d = width - 21;
+ break;
+
+ case FMT_TIME:
+ max_d = width - 9;
+ break;
+
+ case FMT_DTIME:
+ max_d = width - 12;
+ break;
+
+ case FMT_WKDAY:
+ case FMT_MONTH:
+ case FMT_A:
+ case FMT_AHEX:
+ max_d = 0;
+ break;
+
+ default:
+ NOT_REACHED ();
+ }
+
+ if (max_d < 0)
+ max_d = 0;
+ else if (max_d > 16)
+ max_d = 16;
+ return max_d;
+}
+