Patch #6441. Reviewed by John Darrington.
authorBen Pfaff <blp@gnu.org>
Wed, 5 Mar 2008 05:53:46 +0000 (05:53 +0000)
committerBen Pfaff <blp@gnu.org>
Wed, 5 Mar 2008 05:53:46 +0000 (05:53 +0000)
(fmt_fix): New function.
(fmt_fix_input): New function.
(fmt_fix_output): New function.

src/data/ChangeLog
src/data/format.c
src/data/format.h

index 9c68bb3b9bf8d46cd9872d75e13bb124a29c1e48..bb4d7414c7ee089a76e4fb8ec2492c1b08cf4a0c 100644 (file)
@@ -1,3 +1,11 @@
+2008-03-04  Ben Pfaff  <blp@gnu.org>
+
+       Patch #6441.  Reviewed by John Darrington.
+
+       * format.c (fmt_fix): New function.
+       (fmt_fix_input): New function.
+       (fmt_fix_output): New function.
+
 2008-02-18  Ben Pfaff  <blp@gnu.org>
 
        Patch #6426.  Reviewed by John Darrington.
index a319a182ccf7fb14ef3dba0abe94ea03a56910b7..ecf4148752a49368f001def194604d8796389d89 100644 (file)
@@ -408,6 +408,61 @@ fmt_resize (struct fmt_spec *fmt, int width)
       /* Still numeric. */
     }
 }
+
+/* Adjusts FMT's width and decimal places to be valid for an
+   input format (if FOR_INPUT) or an output format (if
+   !FOR_INPUT).  */
+void
+fmt_fix (struct fmt_spec *fmt, bool for_input)
+{
+  int min_w, max_w;
+  int max_d;
+
+  /* Clamp width to those allowed by format. */
+  min_w = fmt_min_width (fmt->type, for_input);
+  max_w = fmt_max_width (fmt->type, for_input);
+  if (fmt->w < min_w)
+    fmt->w = min_w;
+  else if (fmt->w > max_w)
+    fmt->w = max_w;
+
+  /* First, 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, for_input))
+    {
+      int w;
+      for (w = fmt->w; w <= max_w; w++)
+        if (fmt_max_decimals (fmt->type, w, for_input) >= fmt->d)
+          {
+            fmt->w = w;
+            break;
+          }
+    }
+
+  /* Clamp decimals to those allowed by format and width. */
+  max_d = fmt_max_decimals (fmt->type, fmt->w, for_input);
+  if (fmt->d < 0)
+    fmt->d = 0;
+  else if (fmt->d > max_d)
+    fmt->d = max_d;
+}
+
+/* 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, true);
+}
+
+/* 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, false);
+}
 \f
 /* Describes a display format. */
 struct fmt_desc
index 0bb8a60be00c9bad0ee9dedb2f7ee3de66029317..15d13ef958d4e2c42b3a12c443bada7b0a946cf8 100644 (file)
@@ -110,6 +110,10 @@ char *fmt_to_string (const struct fmt_spec *, char s[FMT_STRING_LEN_MAX + 1]);
 bool fmt_equal (const struct fmt_spec *, const struct fmt_spec *);
 void fmt_resize (struct fmt_spec *, int new_width);
 
+void fmt_fix (struct fmt_spec *, bool for_input);
+void fmt_fix_input (struct fmt_spec *);
+void fmt_fix_output (struct fmt_spec *);
+
 /* Format types. */
 const char *fmt_name (enum fmt_type) PURE_FUNCTION;
 bool fmt_from_name (const char *name, enum fmt_type *);