■オリジナル版
・Softwares
　http://www.hakusan.tsg.ne.jp/tjkawa/software/paranoia/sha1sum/index.jsp

　オリジナル版のsha1sum.cppの配布元です。


■コマンド名
コマンド名は下のようにしました。
・"md5sumu.exe"
・"sha1sumu.exe"


■Unicodeパス対応
ファイルパスをUnicode文字列であつかうようにしました。
入力としてUnicode文字列を想定し、Unicode文字列を出力します。

入力がUTF16-LEであると想定して本コマンドは動作しますから、他の文字コードの場合の動作は保証されません。入力の先頭にBOMは、あってもなくてもかまいません。
出力はUnicode文字列です。リダイレクトで、テキストファイルに書き出した場合は、ファイル先頭にBOMを出力した（オプションで変更可能）、UTF16-LEのファイルとなります。

オリジナル版では、下のような利用法を想定したオプションとして"-l"が加えられています。
--------
% dir /b /s /a-d D:\ | sha1sum -l > checksum.sha1
--------

Unicodeパス対応版では下のようにしてください。
（"/U"スイッチは、内部コマンドがリダイレクトやパイプにおいて、Unicodeでデータを出力するように指定する。）
--------
% cmd /U /c dir /b /s /a-d D:\ | sha1sumu -l > checksum.sha1
--------

システムデフォルトの文字コード(日本語版 Windows なら Shift JIS)を使うなら下のようにしてください。
（"/U"スイッチは要らない。もちろん、Unicodeでなければ表現できない文字は扱えない。）
--------
% cmd /c dir /b /s /a-d D:\ | sha1sumu --encoding ANSI -l > checksum.sha1
--------

"--encoding"オプションと、指定できる文字コードに関しては後述します。


＞Cygwin 環境
コマンドプロンプトではなく、Cygwin + mintty といった環境で利用する場合(扱う文字コードはUTF-8と設定していると仮定)は、alias を使って、以下のようにしておくといいでしょう。
--------
$ alias 'md5sumu8=md5sumu --encoding UTF-8'
$ alias 'sha1sumu8=sha1sumu --encoding UTF-8'
--------

Cygwin には md5sum、sha1sum がありますから、本コマンドをわざわざ使わなくてもいいとは思います。


■追加オプション
・BOM 出力
-wbom  : パイプ、リダイレクト時にbomを出力する。-wbom/-wbom-をどちらも指定しない場合は、-wbomを指定したのと同じである。
-wbom- : パイプ、リダイレクト時にbomを出力しない。

-b、-c、-lなどよりさきに指定してください。
出力はUTF16-LEですが、BOMを出力するかどうかを指定します。デフォルトではBOMを出力します。
ただし、BOMを出力するのはパイプやリダイレクトを利用するときだけです。
-wbom- は出力時にBOMが邪魔になる場合に指定するといいかと思います。">>"を使う場合には、BOMを出力すると途中にBOMが含まれることになり、都合が悪いかと思います。


・文字コード指定
--encoding : 入出力の文字コードを指定する。UTF-16, UTF-8, ANSI を続けて与える。ANSI は日本語 Windows の場合は、Shift JIS(正確にはコードページ932)を示す。
             --encoding をオプションとして指定しない場合は、 --encoding UTF-16 を指定したのと同じである。

本オプションよりは一番最初に与える必要があります。他のオプションのあとに与えた場合はエラーとなりコマンドは終了します。
例) sha1sumu --encoding ANSI -l ...

また、',' で区切って文字コードを複数与えることができます（','の前後には空白など余分な文字を入れるとエラーになります）。
標準入力、標準出力、標準エラー出力の文字コードを別々に指定できます。

詳述すると、以下のようになります。

1)
--------
% sha1sumu --encoding CODE1 ...
--------
標準入力,標準出力,標準エラー出力を CODE1 にする。

2)
--------
% sha1sumu --encoding CODE1,CODE2 ...
--------
標準入力を CODE1 にする。
標準出力,標準エラー出力を CODE2 にする。

3)
--------
% sha1sumu --encoding CODE1,CODE2,CODE3 ...
--------
標準入力を CODE1 にする。
標準出力を CODE2 にする。
標準エラー出力を CODE3 にする。


',' で区切って4つ以上指定した場合、4つ目からは無視します。


■ビルド環境
・Visual Studio 2005 Professional Edition SP1

or

・Visual Studio 2005 Express Edition SP1
・Windows SDK 7.1

VC8のnmake用にMakefileを修正してあります（VC10用にMakefile.10）。
Windows SDK 7.0、7.1同梱のC/C++ビルドツール（それぞれVC9、VC10）でもビルドできましたから、
Visual Studio 2008/2010 の Express Edition でも問題ないでしょう。

ただし、Visual Studio 2010 からはマニフェストの埋め込みがなくなったため、
mt.exe を利用しない Makefile.10 を使ってください。

（"/Wp64"に対して警告が出ることがありますが、あまりに気にしないでください。）


■注意 - 行末
オリジナル版は、下のようになっていました。

・行末はデフォルトで CRLF だが，出力が stdout でない場合は行末が LF になる

Unicodeパス対応版では、出力が stdout でなくてもCRLFとなります。


■注意 - Long UNC
Unicode文字列のパスだと、Long UNC（"\\?\c:\dir\hogehoge.txt"みたいに書く）によって、
長いパス（PATH_MAXの制限を超える）を使うことが可能ですが、そういった形式のパスのあつかいを、きちんと考えていません。
Unicode文字列によるパスを、内部でとくに加工せずに扱っていますから、
"\\?\c:\dir\hogehoge.txt"、"\\?\UNC\localhost\c:\dir\hogehoge.txt"のようなLong UNCのパス文字列を受け付けはしますし、結果も得られます。
ですが、Long UNCのパスを正しくあつかえるよう考えて実装をしたわけではありません。そのむねご注意ください。
Explorerも長いパスはまともに扱えませんし、Microsoftが力を入れている .NET Framework も長いパスを扱えないので、
Long UNCでの動作確認などはいまのところ考えてません。


■履歴
・2012/01/22
　・文字コード指定機能追加。
　・バグ修正。
　　・引数の扱いを修正した。
　　・存在しないファイルを指定したときのエラー処理が不十分だったのを修正した。
　　・エラー時の情報表示のしかたが不統一だったのを修正した。
　・"--help" で表示される情報を修正した。
　・Makefile 修正。
　　・不要なオプションを削除した。
　　・MSVC ランタイムライブラリを、DLLとではなく、スタティックリンクライブラリとリンクしていた。
　　　DLL をリンクするようにした。


・2010/09/03
　・Unicode文字列対応。
　・Makefile 修正。




(以上)
