-void
-strcat_longest (format, use_local, val_long, buf, buflen)
- int format;
- int use_local;
- LONGEST val_long;
- char *buf;
- int buflen; /* ignored, for now */
-{
-#if defined (CC_HAS_LONG_LONG) && !defined (PRINTF_HAS_LONG_LONG)
- long vtop, vbot;
-
- vtop = val_long >> (sizeof (long) * HOST_CHAR_BIT);
- vbot = (long) val_long;
-
- if ((format == 'd' && (val_long < INT_MIN || val_long > INT_MAX))
- || ((format == 'u' || format == 'x') && (unsigned long long)val_long > UINT_MAX))
- {
- sprintf (buf, "0x%lx%08lx", vtop, vbot);
- return;
- }
-#endif
-
-#ifdef PRINTF_HAS_LONG_LONG
- switch (format)
- {
- case 'd':
- sprintf (buf,
- (use_local ? local_decimal_format_custom ("ll") : "%lld"),
- val_long);
- break;
- case 'u':
- sprintf (buf, "%llu", val_long);
- break;
- case 'x':
- sprintf (buf,
- (use_local ? local_hex_format_custom ("ll") : "%llx"),
-
- val_long);
- break;
- case 'o':
- sprintf (buf,
- (use_local ? local_octal_format_custom ("ll") : "%llo"),
- val_long);
- break;
- case 'b':
- sprintf (buf, local_hex_format_custom ("02ll"), val_long);
- break;
- case 'h':
- sprintf (buf, local_hex_format_custom ("04ll"), val_long);
- break;
- case 'w':
- sprintf (buf, local_hex_format_custom ("08ll"), val_long);
- break;
- case 'g':
- sprintf (buf, local_hex_format_custom ("016ll"), val_long);
- break;
- default:
- abort ();
- }
-#else /* !PRINTF_HAS_LONG_LONG */
- /* In the following it is important to coerce (val_long) to a long. It does
- nothing if !LONG_LONG, but it will chop off the top half (which we know
- we can ignore) if the host supports long longs. */
-
- switch (format)
- {
- case 'd':
- sprintf (buf, (use_local ? local_decimal_format_custom ("l") : "%ld"),
- ((long) val_long));
- break;
- case 'u':
- sprintf (buf, "%lu", ((unsigned long) val_long));
- break;
- case 'x':
- sprintf (buf, (use_local ? local_hex_format_custom ("l") : "%lx"),
- ((long) val_long));
- break;
- case 'o':
- sprintf (buf, (use_local ? local_octal_format_custom ("l") : "%lo"),
- ((long) val_long));
- break;
- case 'b':
- sprintf (buf, local_hex_format_custom ("02l"),
- ((long) val_long));
- break;
- case 'h':
- sprintf (buf, local_hex_format_custom ("04l"),
- ((long) val_long));
- break;
- case 'w':
- sprintf (buf, local_hex_format_custom ("08l"),
- ((long) val_long));
- break;
- case 'g':
- sprintf (buf, local_hex_format_custom ("016l"),
- ((long) val_long));
- break;
- default:
- abort ();
- }
-
-#endif /* !PRINTF_HAS_LONG_LONG */
-}
-