- case 'c':
- output_add_character (buffer, va_arg (*text->args_ptr, int));
- break;
-
- case 'd':
- case 'i':
- if (long_integer)
- output_long_decimal (buffer, va_arg (*text->args_ptr, long int));
- else
- output_decimal (buffer, va_arg (*text->args_ptr, int));
- break;
-
- case 'o':
- if (long_integer)
- output_long_octal (buffer,
- va_arg (*text->args_ptr, unsigned long int));
- else
- output_octal (buffer, va_arg (*text->args_ptr, unsigned int));
- break;
-
- case 's':
- output_add_string (buffer, va_arg (*text->args_ptr, const char *));
- break;
-
- case 'u':
- if (long_integer)
- output_long_unsigned_decimal
- (buffer, va_arg (*text->args_ptr, long unsigned int));
- else
- output_unsigned_decimal
- (buffer, va_arg (*text->args_ptr, unsigned int));
- break;
-
- case 'x':
- if (long_integer)
- output_long_hexadecimal
- (buffer, va_arg (*text->args_ptr, unsigned long int));
- else
- output_hexadecimal
- (buffer, va_arg (*text->args_ptr, unsigned int));
- break;
-
- case '%':
- output_add_character (buffer, '%');
- break;
-
- case 'H':
- {
- const location_t *locus = va_arg (*text->args_ptr, location_t *);
- output_add_string (buffer, "file '");
- output_add_string (buffer, locus->file);
- output_add_string (buffer, "', line ");
- output_decimal (buffer, locus->line);
- }
- break;
-
- case '.':
- {
- int n;
- const char *s;
- /* We handle no precision specifier but `%.*s'. */
- if (*++text->format_spec != '*')
- abort ();
- else if (*++text->format_spec != 's')
- abort ();
- n = va_arg (*text->args_ptr, int);
- s = va_arg (*text->args_ptr, const char *);
- output_append (buffer, s, s + n);
- }
- break;
-
- default:
- if (!buffer->format_decoder
- || !(*buffer->format_decoder) (buffer, text))