Daniel Jacobowitz wrote:
> A standard printf.  We're not trying to print out new things, we're
> trying to print out standard things using different sorts of arguments.
> 
> Here's an example.  You can open up GDB and say this:
> 
> (gdb) printf "%lld\n", 1
> 1

OK, thanks, I see the intent and the cross-compilation issues...

> > How does what you need compare with the register_printf_function /
> > parse_printf_format facility in glibc's public header file <printf.h> ?
> 
> Wow, I knew about register_printf_function, but I'd never noticed
> parse_printf_format before.

But without the other part, which constructs the output string, this
function is useless to gdb, right? So there's no point in gnulib trying
to make a 100% glibc compatible parse_printf_format.

> printf breaks down into three stages: parsing the format string,
> recovering the arguments, and constructing the output string.  We need
> completely normal versions of the first and third, but a non-va_arg
> based version of the second.

Are you sure you can use the parsing stage and the output stage without
modifications?
- In the parsing phase, you need to recognize %lld also if the host environment
  doesn't support long longs (e.g. on MSVC hosts). This means the
  #ifdef HAVE_LONG_LONG_INT
  in printf-args.h needs to be adjusted for your use case.
- In the output stage, when the host has 32-bit 'long's and the target
  environment has 64-bit 'long's, the output routine that converts a
  'long' to decimal needs to be able to produce 20 decimal digits, not
  just 10.
- Also in the output stage, when you encounter a %ls directive with a
  wide string argument, to you perform the wcstombs on the host machine
  or on the target machine?

Bruno


Reply via email to