FSF::sprintf/sscanf/snprintf

Разработка Far.
2useven10
Posts: 4225
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 6 times
Been thanked: 209 times

Re: FSF::sprintf/sscanf/snprintf

Post by 2useven10 »

Latest post of the previous page:

x3 - с плагином у меня результат аналогичный...
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 158 times
Contact:

Re: FSF::sprintf/sscanf/snprintf

Post by zg »

вот фар. пробовал w2k3, w2k8 — результат один:
Image
2useven10
Posts: 4225
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 6 times
Been thanked: 209 times

Re: FSF::sprintf/sscanf/snprintf

Post by 2useven10 »

4.5.2 - нормально, 4.6.1 - уже плохо (сборка tdm gcc)
upd: результат аналогичный == тоже только 't'
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 158 times
Contact:

Re: FSF::sprintf/sscanf/snprintf

Post by zg »

ну и что со всем этим делать?
собственный принтф в mingw64-crt уже 14 месяцев. вряд ли что-то измениться.
есть виндовый wsprintf который с xp даже __int64 поддерживает. т.е. есть всё кроме float. что там с __int64 на w2k — вопрос конечно.
есть опять же crt-ый printf который хоть и [sarcasm]раздувает плагин неимоверно[/sarcasm], но даёт хоть какую-то гарантию.
sscanf — этим кто-то пользуется?
в общем жду аргументов против выкидывания.
2useven10
Posts: 4225
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 6 times
Been thanked: 209 times

Re: FSF::sprintf/sscanf/snprintf

Post by 2useven10 »

сразу не выкидывай. хочу понять, почему в консольном тесте всё работает, а через фар нет...
2useven10
Posts: 4225
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 6 times
Been thanked: 209 times

Re: FSF::sprintf/sscanf/snprintf

Post by 2useven10 »

FSF.snprintf работает нормально, его выкидывать не надо.
думаю это пляски с _GLIBCXX_HAVE_BROKEN_VSWPRINTF ...
upd: FSF.sprintf в силу его проблемности и отсутствия проверки на размер буфера, пожалуй надо выкинуть
User avatar
Centaur
Posts: 1083
Joined: Tue 05 Apr, 2005 20:09
Location: Novosibirsk, Russia
Been thanked: 2 times

Re: FSF::sprintf/sscanf/snprintf

Post by Centaur »

В Священном стандарте ISO/IEC 9899:1999 (E), глава 7.24.2.1, стих 8:
8 The conversion specifiers and their meanings are:
[…]
s

If no l length modifier is present, the argument shall be a pointer to the initial element of a character array containing a multibyte character sequence beginning in the initial shift state. Characters from the array are converted as if by repeated calls to the mbrtowc function, with the conversion state described by an mbstate_t object initialized to zero before the first multibyte character is converted, and written up to (but not including) the terminating null wide character. If the precision is specified, no more than that many wide characters are written. If the precision is not specified or is greater than the size of the converted array, the converted array shall contain a null wide character.

If an l length modifier is present, the argument shall be a pointer to the initial element of an array of wchar_t type. Wide characters from the array are written up to (but not including) a terminating null wide character. If the precision is specified, no more than that many wide characters are written. If the precision is not specified or is greater than the size of the array, the array shall contain a null wide character.
Таким образом, интерпретация %s как широкой строки в wprintf — это Microsoft-specific расширение, а по стандарту нужно использовать формат %ls. Если верить MSDN Library, рантайм Visual C поддерживает такое использование как минимум с 2003.
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 158 times
Contact:

Re: FSF::sprintf/sscanf/snprintf

Post by zg »

Centaur wrote:Таким образом, интерпретация %s как широкой строки в wprintf — это Microsoft-specific расширение
очевидно это сделано чтобы работало _T("%s") в зависимости определено UNICODE или нет. по хорошему — не докопаться, о людях думали.
а по стандарту нужно использовать формат %ls. Если верить MSDN Library, рантайм Visual C поддерживает такое использование как минимум с 2003.
если речь про %ls, то понятно, но что толку? если про %s — то непонятно.
User avatar
Centaur
Posts: 1083
Joined: Tue 05 Apr, 2005 20:09
Location: Novosibirsk, Russia
Been thanked: 2 times

Re: FSF::sprintf/sscanf/snprintf

Post by Centaur »

Думание о людях ведёт к икоте.

Что до толку — все плагины должны использовать %ls, а %s прекратить и перестать. О портабельности между ANSI и Unicode всё равно уже давно можно забыть, а портабельность между компиляторами и рантаймами вещь хорошая.
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 158 times
Contact:

Re: FSF::sprintf/sscanf/snprintf

Post by zg »

Centaur wrote:все плагины должны использовать %ls, а %s прекратить и перестать.
ну это сферические плагины в вакууме. в реальности проще выкинуть.
2useven10
Posts: 4225
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 6 times
Been thanked: 209 times

Re: FSF::sprintf/sscanf/snprintf

Post by 2useven10 »

FSF.snprintf() - сафе, %s и %ls дают нормальный юникод. и любители c++ стандарта и апологеты ms счастливы.
Post Reply

Return to “Development”