Problémek s fwide() a swprintf()

Michal Dobes dobes na tes.eu
Neděle Říjen 28 22:06:50 CET 2007


	Zdravím,

	tak trošku zápasím s používáním wchar_t a narazil jsem
na dvě věci:
a) Funkce fwide(stdout, 1) pro přepnutí výstupu do wide režimu
mi vrací errno=29 (illegal seek)a je jedno, zda to je první věc
v programu nebo až setlocale(). Nicméně to vypadá, že to funguje.
b) Funkce swprintf() nevkládá závěrečný znak \0, pokud udaná velikost
výstupního bafru není dostačující. Dle specifikace by to tam měla vždy
dát (pokud velikost bafru není dána jako 0). Dá ho tam jen v případě,
že výstupní bafr má nastavenu dostatečnou velikost nebo je velikost
výstupního bafru nastavena na 1. Takže chování dosti odlišné od
charové verze snprintf().

Stejné chování pozoruji na linuxu od historičtějších kousků typu
RedHat7.3 (glibc 2.2.5) až po CentOS 5.0 (glibc-2.5).
Pokud to zkusím třeba na solarisu, tak se vše chová dle specifikací
a očekávání.
Narazil jste na to někdo nebo zase něco dělám totálně blbě?

M.

Co mi z toho swprintf() vypadává na linuxu:

wbuf=L"aaaaaaaaaaaaaaaaaaa0"
wbufs=L"xxxxxxxxxxxxxxx"
len=swprintf(wbuf, 0, L"%ls", wbufs)
          len=-1 errno=0 wbuf='aaaaaaaaaaaaaaaaaaa0'
len=swprintf(wbuf, 1, L"%ls", wbufs)
          len=-1 errno=0 wbuf='0aaaaaaaaaaaaaaaaaa0'
len=swprintf(wbuf, 5, L"%ls", wbufs)
          len=-1 errno=0 wbuf='xxxxaaaaaaaaaaaaaaa0'
len=swprintf(wbuf, 10, L"%ls", wbufs)
          len=-1 errno=0 wbuf='xxxxxxxxxaaaaaaaaaa0'
len=swprintf(wbuf, 15, L"%ls", wbufs)
          len=-1 errno=0 wbuf='xxxxxxxxxxxxxxaaaaa0'
len=swprintf(wbuf, 18, L"%ls", wbufs)
          len=15 errno=0 wbuf='xxxxxxxxxxxxxxx0aaa0'

A jak to vypadá ve slunečním prostředí:

wbuf=L"aaaaaaaaaaaaaaaaaaa0"
wbufs=L"xxxxxxxxxxxxxxx"
len=swprintf(wbuf, 0, L"%ls", wbufs)
          len=-1 errno=0 wbuf='aaaaaaaaaaaaaaaaaaa0'
len=swprintf(wbuf, 1, L"%ls", wbufs)
          len=-1 errno=0 wbuf='0aaaaaaaaaaaaaaaaaa0'
len=swprintf(wbuf, 5, L"%ls", wbufs)
          len=-1 errno=0 wbuf='xxxx0aaaaaaaaaaaaaa0'
len=swprintf(wbuf, 10, L"%ls", wbufs)
          len=-1 errno=0 wbuf='xxxxxxxxx0aaaaaaaaa0'
len=swprintf(wbuf, 15, L"%ls", wbufs)
          len=-1 errno=0 wbuf='xxxxxxxxxxxxxx0aaaa0'
len=swprintf(wbuf, 18, L"%ls", wbufs)
          len=15 errno=0 wbuf='xxxxxxxxxxxxxxx0aaa0'



Další informace o konferenci Linux