━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Cソースコードチェックサム ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ for FM-7,77,AV,8,11,16,R-30/50/60/70/80,TOWNS+Cコンパイラ Cのライブラリをペーパーメディアで提供した場合,タイプミスが発生する可能性 がかなりあり,タイプミスをチェックするなんらかの仕組みが必要となります。オブ ジェクトをダンプで掲載する場合はマシン語のチェックサムがそのままそれに使えま すが,ソースの場合は別途何かを用意しなければなりません。Oh!FM掲載Cのソ ースプログラムの場合は,リストの脇に必ず「Cソースコードチェックサム」が用意 されています。C関連の記事を活用するさいにで必ず使うものですので,この機会に 使い方を覚えておいてください。 動作概要はOh!FM掲載のBASICプログラムでおなじみのBASICチェッ クサムと同じで,リスト上の1行中の文字をASCIIコードに勘算して演算し,そ の結果の16進下2桁をチェックサムとして使うものです。ただ,Cの特徴に合わせて たため,BASICチェックサムとは一部仕様が異なっていますので注意してくださ い。 ●仕様 このCソースコードチェックサムは,以下のような仕様に基づきチェックサムを算 出します。   1.ASCII形式のテキストファイルを取り扱い,改行記号から改行記号までの     間を1行として,1行ごとにサムを算出する  2.テキスト先頭を1010番とし,以降10番ずつ増える行番号で行位置を示すが,     テキストファイル自体は,通常MS-DOSテキストでも, 行番号+「'」のF-BA SICのREM文形式でもどちらでもよく, サムの計算自体には行番号は含めな い(行の先頭に数字がある場合,その数字を行番号の始まりと見なして,「'」 が現われるの間を行番号として計算に含めないので,REM文形式しないとき は数字から始めないこと) 3.各行のサムは,計算対象の各文字のASCIIコードと文字位置(行先頭から の文字数)の排他的論理和(XOR)の値を順に加算していき, その結果の16進 下2桁をとることで算出する(そのため「ABC」と「CBA」は違う値になる) 4.注釈は,前後の 「/*」「*/」 を含めて読み飛ばので,とくに入力する必要はな いが,行数がずれるとサムが狂うので,最低限空の行は入れること 5.「″」または「′」によって囲まれている部分以外の空白は読み飛ばすので,ス ペースの数がリストどおりになっていなくてもサムは同じになる 6.インラインアセンブラのソース部分では,行末の注釈部分と「*」で始まる行 は加算しない 注1)注釈部分の先頭には1つ以上の空白と「;」がなくてはならない 注2)オペランド部分の文字列定数は「″」か「/」で前後を囲まなくてはならな ず,また,その前に1つ以上の空白がなければならない。 7.インラインアセンブラの開始/終了は,プリプロセッサ命令#asm /#endasm による(大文字は使用できない) 8.各行のサムは算出結果の16進の下2桁をとるものとする 9.表示は1列10個,10列で1ブロックとする 10.計算の対象となる文字がない行(注釈行,空行)の値は「--」で表わし,計算し た結果「00」になった行とは区別する。 11.表示したサムの縦と横の和をとって16進下2桁をブロックの下と右横に表示 し,さらにその和を右下に表示する 12.チェックサムの右側には,チェックするときの目安として,チェックサム列 の先頭の行の前から16文字が表示される ●使い方 MS-DOSのコマンドライン(ORICON等のコンソ−ルでも可)から, chk [-オプション] <ファイル名> として利用ください。ファイル名を指定しなかった場合には,標準入力から読み込み ますから,パイプにつないで使用することもできます。 チェックサムの出力は,オプションを指定しない場合は,標準出力に行われます。 リダイレクトを使って, chk A:File1 >PRN のように,該当するデバイスやファイルに出力することができます。 オプションを付けた場合は,以下のようなかたちで出力されます。 -p:プリンタにチェックサムが印字される(OS-9では標準エラー出力にチェック サムが送られる) -l:ソースに行番号が付いている場合,行番号を外してリストを出力する -n:行番号を付けてリスト出力する -c:行番号と,その直後にその行のサム(「'0xx '」のように,「'」のあとに識別 用の0とサムの値を続ける)を付けてリストを出力する。 -f:-f=file nameの形式で指定ファイルに出力し,既に同じ名前のファイル が存在するときは古いファイルの上の上書きする(DracoC用の対策)。 これらのオプションのうち,-l,-n,-cは同時に指定できず, また-pと-lも同時 には使えませんが,それを除けば chk -pn file2 のように組み合わせて指定できます。 さて,こうして得られたチェックサムを雑誌掲載のものと比べて,タイプミスした 行がないかどうか捜すのはBASICチェックサムと同じ要領ですが,オプション-l, -n,-cを活用すると 便利です。そのやり方は……。 まず,ソースを打ち込みます(Draco Cでは行番号+「'」のREM文形式で,それ以 外は行番号ヌキで)。次にオプションなしでchkを使い,本誌掲載のものとチェッ クサムを比べます。間違いがあったら,今度は-cf=file nameでchkを起動して, 行番号/チェックサム付きのファイルを作ります。そのファイルをエディタに吸い上 げて,チェックサムの異なっている行を修正します。修正作業が終わったら,またオ プションなしでチェックサムをとり,間違いがあったらもう一度-cf付き でリスト を作り……と修正作業を繰り返します。間違いがなくなったなら, -lオプションで 行番号を外したファイルを作ります(DracoCでは-nオプションで行番号だけを付け たファイルを作ります)。 * * * * * BASICチェックサムをお使いの方はわかると思いますが,このCソースコード チェックサムは全能ではないにしても,かなりのケアレスミスをチェックできます。 このツールを活用して,ライブラリに蓄積に役立ててください。 最後に,Draco/MW/MSの3種類のコンパイラ上で共通に走るようにした ために, ソ−スに必要以上に冗長なところのあるプログラムですが、気にしないでく ださいね(単にプログラミングの才能がないだけだったりする……)。 このプログラムの著作権はOh!FM編集部が保持しておりますが,著作権法 の定める「個人的な利用」の範疇であれば自由に利用してくださってけっこうで す。また,転載・配布についても事前の許諾なしに自由に行ってくださってかま いません。ただし配布時に, 1. Oh!FM掲載プログラムであること 2. 自由転載許可に基づいて転載・配布したものであること の旨を,説明用のテキストに明記してください。