Em ter., 9 de jun. de 2020 às 15:53, Andrew Gierth < and...@tao11.riddles.org.uk> escreveu:
> >>>>> "Ranier" == Ranier Vilela <ranier...@gmail.com> writes: > > Ranier> Where " ends up with two copies of pg_ultoa_n inlined into it", > Ranier> in this simplified example? > > The two references to sprintf are both inlined copies of your pg_utoa. > > Ranier> (b) I call this tail cut, I believe it saves time, for sure. > > You seem to have missed the point that the pg_ultoa_n / pg_ulltoa_n > functions DO NOT ADD A TRAILING NUL. Which means that pg_ltoa / pg_lltoa > can't just tail call them, since they must add the NUL after. > > Ranier> Regarding bugs: > > Ranier> (c) your version don't check size of a var, when pg_ulltoa_n > Ranier> warning about "least MAXINT8LEN bytes." > > Ranier> So in theory, I could blow it up, by calling pg_lltoa. > > No. Callers of pg_lltoa are required to provide a buffer of at least > MAXINT8LEN+1 bytes. > Thanks for explanations. So I would change, just the initialization (var uvalue), even though it is irrelevant. int pg_lltoa(int64 value, char *a) { int len = 0; uint64 uvalue; if (value < 0) { uvalue = (uint64) 0 - uvalue; a[len++] = '-'; } else uvalue = value; len += pg_ulltoa_n(uvalue, a + len); a[len] = '\0'; return len; } regards, Ranier Vilela