+/* Indicate assertion failure.
+ Arguments: Filename, line number, optional function name. */
+
+void
+as_assert (const char *file, int line, const char *fn)
+{
+ as_show_where ();
+ fprintf (stderr, _("Internal error!\n"));
+ if (fn)
+ fprintf (stderr, _("Assertion failure in %s at %s line %d.\n"),
+ fn, file, line);
+ else
+ fprintf (stderr, _("Assertion failure at %s line %d.\n"), file, line);
+ fprintf (stderr, _("Please report this bug.\n"));
+ xexit (EXIT_FAILURE);
+}
+
+/* as_abort: Print a friendly message saying how totally hosed we are,
+ and exit without producing a core file. */
+
+void
+as_abort (const char *file, int line, const char *fn)
+{
+ as_show_where ();
+ if (fn)
+ fprintf (stderr, _("Internal error, aborting at %s line %d in %s\n"),
+ file, line, fn);
+ else
+ fprintf (stderr, _("Internal error, aborting at %s line %d\n"),
+ file, line);
+ fprintf (stderr, _("Please report this bug.\n"));
+ xexit (EXIT_FAILURE);
+}
+
+/* Support routines. */
+
+void
+sprint_value (char *buf, valueT val)
+{
+ if (sizeof (val) <= sizeof (long))
+ {
+ sprintf (buf, "%ld", (long) val);
+ return;
+ }
+ if (sizeof (val) <= sizeof (bfd_vma))
+ {
+ sprintf_vma (buf, val);
+ return;
+ }
+ abort ();
+}
+
+#define HEX_MAX_THRESHOLD 1024
+#define HEX_MIN_THRESHOLD -(HEX_MAX_THRESHOLD)
+
+static void
+as_internal_value_out_of_range (char * prefix,
+ offsetT val,
+ offsetT min,
+ offsetT max,
+ char * file,
+ unsigned line,
+ int bad)
+{
+ const char * err;
+
+ if (prefix == NULL)
+ prefix = "";
+
+ if (val >= min && val <= max)
+ {
+ addressT right = max & -max;
+
+ if (max <= 1)
+ abort ();
+
+ /* xgettext:c-format */
+ err = _("%s out of domain (%d is not a multiple of %d)");
+ if (bad)
+ as_bad_where (file, line, err,
+ prefix, (int) val, (int) right);
+ else
+ as_warn_where (file, line, err,
+ prefix, (int) val, (int) right);
+ return;
+ }
+
+ if ( val < HEX_MAX_THRESHOLD
+ && min < HEX_MAX_THRESHOLD
+ && max < HEX_MAX_THRESHOLD
+ && val > HEX_MIN_THRESHOLD
+ && min > HEX_MIN_THRESHOLD
+ && max > HEX_MIN_THRESHOLD)
+ {
+ /* xgettext:c-format */
+ err = _("%s out of range (%d is not between %d and %d)");
+
+ if (bad)
+ as_bad_where (file, line, err,
+ prefix, (int) val, (int) min, (int) max);
+ else
+ as_warn_where (file, line, err,
+ prefix, (int) val, (int) min, (int) max);
+ }
+ else
+ {
+ char val_buf [sizeof (val) * 3 + 2];
+ char min_buf [sizeof (val) * 3 + 2];
+ char max_buf [sizeof (val) * 3 + 2];
+
+ if (sizeof (val) > sizeof (bfd_vma))
+ abort ();
+
+ sprintf_vma (val_buf, val);
+ sprintf_vma (min_buf, min);
+ sprintf_vma (max_buf, max);
+
+ /* xgettext:c-format. */
+ err = _("%s out of range (0x%s is not between 0x%s and 0x%s)");
+
+ if (bad)
+ as_bad_where (file, line, err, prefix, val_buf, min_buf, max_buf);
+ else
+ as_warn_where (file, line, err, prefix, val_buf, min_buf, max_buf);
+ }
+}
+
+void
+as_warn_value_out_of_range (char * prefix,
+ offsetT value,
+ offsetT min,
+ offsetT max,
+ char * file,
+ unsigned line)
+{
+ as_internal_value_out_of_range (prefix, value, min, max, file, line, 0);
+}
+
+void
+as_bad_value_out_of_range (char * prefix,
+ offsetT value,
+ offsetT min,
+ offsetT max,
+ char * file,
+ unsigned line)
+{
+ as_internal_value_out_of_range (prefix, value, min, max, file, line, 1);
+}