大文字と小文字2005年10月24日 08時31分59秒

libnmz には isalpha, isalnum 等のローケルに依存して動作が異なる関数が使われています。
これは、ローケルによって動作が異なるため、注意が必要です。
(ASCII 7bit 文字を引数に渡す場合は問題ありません。)

strcasecmp, strncasecmp もローケル依存のため、注意が必要です。

toupper, tolower は撲滅したはずです。もし、toupper, tolower が使われている箇所があれば、それはバグです。

strcasecmp, strncasecmp がないシステムのために strcasecmp.c, strncasecmp.c は nmz/ に含まれますが、ここでは tolower が使われる可能性があるので、注意が必要です。

ワイド文字のAPI2005年10月24日 19時45分07秒

Perl のドキュメントを調べていると、「Windows プラットホームにおいては, -C コマンドラインスイッチが使われているか, ${^WIDE_SYSTEM_CALLS} グローバルフラグが 1 に設定されているのなら, すべてのシステムコールは対応するワイド文字の API を使います.」と書かれていました。

この機能を Windows で使うと、ワイド文字のAPIが使われるため、ファイル名の処理に直接ワイド文字が使えることになります。
FAT32,NTFS 共 ロングファイル名は Unicode で記録されますから、ANSI 文字でファイルのアクセスをするよりも直接ワイド文字でアクセスする方が安全です。
ANSI文字、日本語の場合 CP932 なら '\' 0x5c がいろいろと厄介な問題*1を起こしますが、ワイド文字で扱うならばそのような厄介な問題は避けられます。

*1 例えば、CP932 の 2バイト目が 0x5c の文字で終わるディレクトリ名の場合、パス区切りと誤認します。

Perl 5.6 以降で有効か?

Re: ワイド文字のAPI2005年10月24日 19時57分40秒

Perl + Win32 環境で

${^WIDE_SYSTEM_CALLS} = 1;

とすると、ワイド文字の API (Unicode 版 Win32 API)を使います。

File::Find でも CP932の第二バイトが 0x5c の文字で終わるディレクトリも扱えますし、-f や -d も問題なく動作します。 (こっちは確認済み)

Win32 の $CodingSystem は全世界共通で UTF-8 として扱えば良いということになります。

この時、ディレクトリ名、ファイル名は UTF-8 になるという点だけは気にしなければなりません。
UTF-8 版 Namazu との親和性は高いと思います。