(また)Visual Studio 2005 の正規表現置換えが正常に動作しない。
前回に引き続き また見つけちゃいました*1。なんでかなーもう。orz
そして、謎なこと(そして、IDE製作チームにとっては悪夢なこと)に、再現性が100%でないという代物。^^;
というわけで、再現するかどうかわかりませんが………
以下のソースコードは ogg の ogg.h の一部のですが、とりあえずコレを Visual Studio 2005 のエディタに適当に貼り付けます。
typedef struct {
unsigned char *data;
int storage;
int fill;
int returned;
int unsynced;
int headerbytes;
int bodybytes;
} ogg_sync_state;
/* Ogg BITSTREAM PRIMITIVES: bitstream ************************/
extern void oggpack_writeinit(oggpack_buffer *b);
extern void oggpack_writetrunc(oggpack_buffer *b,long bits);
extern void oggpack_writealign(oggpack_buffer *b);
extern void oggpack_writecopy(oggpack_buffer *b,void *source,long bits);
extern void oggpack_reset(oggpack_buffer *b);
extern void oggpack_writeclear(oggpack_buffer *b);
extern void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes);
extern void oggpack_write(oggpack_buffer *b,unsigned long value,int bits);
extern long oggpack_look(oggpack_buffer *b,int bits);
extern long oggpack_look1(oggpack_buffer *b);
extern void oggpack_adv(oggpack_buffer *b,int bits);
extern void oggpack_adv1(oggpack_buffer *b);
extern long oggpack_read(oggpack_buffer *b,int bits);
extern long oggpack_read1(oggpack_buffer *b);
extern long oggpack_bytes(oggpack_buffer *b);
extern long oggpack_bits(oggpack_buffer *b);
extern unsigned char *oggpack_get_buffer(oggpack_buffer *b);
extern void oggpackB_writeinit(oggpack_buffer *b);
extern void oggpackB_writetrunc(oggpack_buffer *b,long bits);
extern void oggpackB_writealign(oggpack_buffer *b);
extern void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits);
extern void oggpackB_reset(oggpack_buffer *b);
extern void oggpackB_writeclear(oggpack_buffer *b);
extern void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes);
extern void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits);
extern long oggpackB_look(oggpack_buffer *b,int bits);
extern long oggpackB_look1(oggpack_buffer *b);
extern void oggpackB_adv(oggpack_buffer *b,int bits);
extern void oggpackB_adv1(oggpack_buffer *b);
extern long oggpackB_read(oggpack_buffer *b,int bits);
extern long oggpackB_read1(oggpack_buffer *b);
extern long oggpackB_bytes(oggpack_buffer *b);
extern long oggpackB_bits(oggpack_buffer *b);
extern unsigned char *oggpackB_get_buffer(oggpack_buffer *b);
さて、関数宣言で「スペース2個以上続いている部分が気にくわない」 とします。(ぉ
- 置換え文字列 = " +"
- 置換え後文字列 = " "
として、関数定義の部分を選択。「選択範囲を置換え(ここ重要)」をすると上手く行く……ハズなのに、一部 extern の "e" が消えてしまったりと誤爆がちらほら………
↑中途半端に置換えしてるのかしらー
ちなみに、この挙動を発見した元のコードはもうちょっと誤爆が激しかったのです…。
冒頭でも触れましたが、私には再現性が解りませんでした。どういう文字列に対して置換えすると誤爆するのかがサッパリ解らず。
んもーなんじゃこりゃー _| ̄|●
*1:もうバグレポ上がってたりするのかしら…