Re: Efficient output for integer types

Поиск
Список
Период
Сортировка
Искать
От
Andrew Gierth
Тема
Re: Efficient output for integer types
Дата
Msg-id
87pnjrns08.fsf@news-spur.riddles.org.uk
Ответ на
Список
Дерево обсуждения
Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types Andrew Gierth <andrew@tao11.riddles.org.uk>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types Andrew Gierth <andrew@tao11.riddles.org.uk>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types Andrew Gierth <andrew@tao11.riddles.org.uk>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types Tomas Vondra <tomas.vondra@2ndquadrant.com>
Re: Efficient output for integer types Tels <nospam-pg-abuse@bloodgate.com>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types David Fetter <david@fetter.org>
Re: Efficient output for integer types Andrey Borodin <x4mmm@yandex-team.ru>
Re: Efficient output for integer types David Fetter <david@fetter.org>
>>>>> "David" == David Fetter  writes:

 David> + return pg_ltostr_zeropad(str, (uint32)0 - (uint32)value, minwidth - 1);

No, this is just reintroducing the undefined behavior again. Once the
value has been converted to unsigned you can't cast it back to signed or
pass it to a function expecting a signed value, since it will overflow
in the INT_MIN case. (and in this example would probably output '-'
signs until it ran off the end of memory).

Here's how I would do it:

char *
pg_ltostr_zeropad(char *str, int32 value, int32 minwidth)
{
	int32		len;
	uint32		uvalue = value;

	Assert(minwidth > 0);

	if (value >= 0)
	{
		if (value < 100 && minwidth == 2) /* Short cut for common case */
		{
			memcpy(str, DIGIT_TABLE + value*2, 2);
			return str + 2;
		}
	}
	else
	{
		*str++ = '-';
		minwidth -= 1;
		uvalue = (uint32)0 - uvalue;
	}
			
	len = pg_ultoa_n(uvalue, str);
	if (len >= minwidth)
		return str + len;

	memmove(str + minwidth - len, str, len);
	memset(str, '0', minwidth - len);
	return str + minwidth;
}

 David>  pg_ltostr(char *str, int32 value)
 David> +	int32	len = pg_ultoa_n(value, str);
 David> +	return str + len;

This seems to have lost its handling of negative numbers entirely (which
doesn't say much for the regression test coverage)

-- 
Andrew (irc:RhodiumToad)


В списке pgsql-hackers по дате отправления
От: Tomas Vondra
Дата:
От: Robert Haas
Дата:
FAQ