続 std::basic_ostringstream

id:fifth_moon:20061106:1162823847 に id:nevil さんからコメントいただいたので追試してみました。
まず簡単なソースをでっちあげて gdb にかけてみます。

typedef unsigned short unishort;
typedef std::basic_string unistring;
typedef std::basic_ostringstream ounistringstream;

ounistringstream ounistrm;
ounistrm << unishort(0x4230);
std::cout << ounistrm.str().size() << std::endl;

すると、std::basic_ostream >::operator<< 中で std::ios_base::failbit が立ちます。ounistrm << (unistring() += unishort(0x4243)) は期待通りに動くので ounistrm << unishort(0x4243) の問題らしい。そこで

ounistringstream& operator<<(ounistringstream& ostrm, const unishort us) {
  return ostrm;
}

とすると std::ios_base::failbit が立ちません。そうゆうことか。

ounistringstream& operator<<(ounistringstream& ostrm, const unishort us) {
  ostrm.str(ostrm.str() += us);
  return ostrm;
}

これで期待通りに動くようになりました。

std::basic_ostringstream

typedef unsigned short ushort;
std::basic_ostringstream obuf;
obuf << ushort(1111);
obuf.str().size();

こんなコードを g++*1コンパイルすると、obuf.str().size() が 0 を返す。なんでだ・・・
VC8 でコンパイルすると 4 を返す。1 じゃないのが微妙にアレだが char_traits をちゃんと定義すればよさそうな予感。
0 を返す g++(stdc++ か?)はどうしてくれよう。

*1:3.4, 4.0 4.1 4.2 で確認

std::ostream_iterator

GCC の stdc++ の ostream_iterator には value_type が定義されてない*1。継承元の iterator には void が渡っているので value_type を参照すると void になる。なので

template 
void func(Iter iter) {
  std::iterator_traits::value_type hoge;
  ...
}

なコードに GCC の ostream_iterator を渡すとコンパイルエラーになる。

Microsoft Platform SDK for Windows Server 2003 R2 には value_type が定義されている*2

規格でどうなってるかは調べてない。

*1:bits/stream_iterator.h

*2:Include\crt\iterator

System.Windows.Forms in mono on SUSE 10.1

 Unhandled Exception: System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.XplatUI ---> System.DllNotFoundException: libX11.so

って出て動かなくて嵌る。原因はそのまま libX11.so ってシンボリックリンクがないから。リンクを作ったら動いた。

cd /usr/X11R6/lib
ln -sf libX11.so.6 libX11.so

OSSP JavaScript

OSSPSpiderMonkey というものがあるのを知る。オリジナルと違うところは autotools 化してあるところと、JS-1.6 のコードを使っているところ*1。スタティックライブラリも作ってくれるのがいい感じ。

とゆうわけで ossp-js って Ports をでっちあげてみる。send pr はどうしよっかな。

*1:オリジナルの正式リリースは JS-1.5

spam block

いいかげん Hiki掲示プラグイン(bbs)へのスパムが鬱陶しいので対策。本文に http:// が入っていたら弾くという単純仕様。これでしばらく様子を見ることにする。

--- misc/plugin/bbs.rb.orig     Thu Sep 14 14:11:02 2006
+++ misc/plugin/bbs.rb  Thu Sep 14 15:33:44 2006
@@ -37,6 +37,7 @@
   msg        = params['msg'][0]

   return '' if msg.strip.size == 0
+  return '' if msg.strip.include?('http://')

   lines = @db.load( @page )
   md5hex = @db.md5hex( @page )