readelf sprintf optimisation

This replaces sprintf and strcat calls with stpcpy, and makes use of
sprintf return value rather than using strlen, for get_machine_flags.

decode_NDS32_machine_flags made use of snprintf, which is arguably the
"correct" way to do things if there can be a buffer overflow.  In this
case I don't think there can be, the buffer is 1k in size which is at
least 5 times more than needed.  What's more, snprintf returns the
count of chars that would be output given no buffer limit, which means
code like
  r += snprintf (buf + r, size - r, ...);
  r += snprintf (buf + r, size - r, ...);
is just wrong.  There needs to be a check on the return value in order
to prevent buf + r being out of bounds for the second snprintf call.

BTW, if you look closely you'll see the return value of the decode
functions is unused.  I admit to getting a little carried away with
writing "out = stpcpy (out, ...):" in each of the decode functions and
didn't notice that until get_machine_flags was trimmed down to a much
smaller size.  When I did notice, I decided it's not such a bad thing.

	* readelf.c (decode_ARC_machine_flags, decode_ARM_machine_flags),
	(decode_AVR_machine_flags, decode_NDS32_machine_flags),
	(decode_AMDGPU_machine_flags): Use stpcpy and sprintf return
	value.  Return end of string.
	(decode_BLACKFIN_machine_flags, decode_FRV_machine_flags),
	(decode_IA64_machine_flags, decode_LOONGARCH_machine_flags),
	(decode_M68K_machine_flags, decode_MeP_machine_flags),
	(decode_MIPS_machine_flags, decode_MSP430_machine_flags),
	(decode_PARISC_machine_flags, decode_RISCV_machine_flags),
	(decode_RL78_machine_flags, decode_RX_machine_flags),
	(decode_SH_machine_flags, decode_SPARC_machine_flags),
	(decode_V800_machine_flags, decode_V850_machine_flags),
	(decode_Z80_machine_flags): New functions, split out from..
	(get_machine_flags): ..here.  Similarly use stpcpy.
1 file changed