第44回
仕様設計からコーディングまで~タブ/スペース変換プログラムを作る(4)

ヘッダファイルと記号定数の定義

取り込むヘッダファイル、記号定数、構造体の定義にも変更があります。

ヘッダファイル

関数の宣言などを記述したヘッダファイルは、リスト1の3つを取り込みます。前回は、構造体のメンバfnameをchar型の配列として、そこに入力ファイル名をstrcpy関数でコピーしたため、strcpyなどの文字列処理関数を宣言しているstring.hを取り込みました。

しかし今回は、コマンドライン・パラメータをchar型配列のポインタにしたargvから入力ファイル名を指すポインタをそのまま構造体のメンバにコピーするため、strcpy関数は使いません。そのため、string.hを取り込む必要もなくなります。

リスト1:取り込むヘッダファイル
#include    <stdio.h>
#include    <stdlib.h>
#include    <jctype.h>  ← 日本語2バイトコードの処理用

記号定数

記号定数の定義は前回と変わりません。

各記号定数の役割は、リストに記述したコメントを参照してください。

リスト2:記号定数の定義
#define     ARGMIN          2        /* オプションの最小数 */
#define     ARGMAX          8        /* オプションの最大数 */
                                     /* これ以下はエラーとする */
#define     BUFSIZE         1024     /* 文字列バッファのバイト数 */
#define     DEFAULT_TAB     8        /* 標準のタブストップ */
#define     MIN_TAB         2        /* 最小のタブストップ */
#define     MAX_TAB         16       /* 最大のタブストップ */

#define     SPACE           0x20     /* スペースコード */
#define     TAB             0x09     /* タブコード */
#define     _FF             0x0c     /* 改ページコード */

#define     TRUE            1        /* 論理値--真 */
#define     FALSE           0        /* 論理値--偽 */

構造体の定義

入力ファイルの情報を保存する構造体は、以下の3点が前回のものから変更されています。
  1. 変換方向を示す“sw”が追加された。
  2. 入力ファイル名を保持する“fname”がchar型ポインタとなった。
  3. 次の構造体を示すメンバ“next”は削除。
1.の「変換方向」とは「タブ→スペース」か「スペース→タブ」かの識別です。swはint型で、0のとき「タブ→スペース」、1のとき「スペース→タブ」の変換方向を表します。それ以外の値は保持しません。

2.の“fname”がポインタであることに注意してください。単純に、argvで示されているchar型配列のポインタを保持するだけとしています。

3.の“next”は前回のプログラムで構造体をポインタでリンクするために用いたメンバです。今回は構造体を配列とするため定義していません。

また、これはプログラムの本質とは関係ありませんが、プログラム名を“stconv”に変更したため、構造体の名前も“STCONV”としています。

リスト3:入力ファイルの情報を保存する構造体“STCONV”の定義
typedef struct {
  int     sw;     ← 0:タブ→スペース/1:スペース→タブ (1)
  int     tab;    ← タブストップ幅
  char    *fname; ← 入力ファイル名へのポインタ (2)
  FILE    *fp;    ← ファイルポインタ
} STCONV;