ヘッダファイルと記号定数の定義
取り込むヘッダファイル、記号定数、構造体の定義にも変更があります。
ヘッダファイル
関数の宣言などを記述したヘッダファイルは、リスト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点が前回のものから変更されています。
- 変換方向を示す“sw”が追加された。
- 入力ファイル名を保持する“fname”がchar型ポインタとなった。
- 次の構造体を示すメンバ“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;
|