2009年3月27日金曜日

改行タグ(brタグ)挿入プログラム

先の記事を投稿したところ、改行がなされていなかった。
そういえば自分はタグ打ちもするので、改行は無視する設定にしたのだった。
そのため手動で<br>タグを打たなければならないのだが、
どうにも面倒だったので、勉強がてらプログラムを書くことに。
改行コードがCRでもLFでもCRLFでもいいはず。
しかし1バイトずつの処理だから何か不安。
2バイト文字で2バイト目が改行コードと同じとかそんなん無いよね?

#include
#define CR 0x0D
#define LF 0x0A
#define BR "<br>"

int main(int argc, char* argv[])
{
FILE* fp_in;
FILE* fp_out;
fpos_t pos;
char ch;

if(argc != 3) {
printf("Usage: %s [input] [output]\n", argv[0]);
return 1;
}

fp_in = fopen(argv[1], "rb");
if(fp_in == NULL) {
printf("Can't open a file for input, %s.", argv[1]);
return 1;
}

fp_out = fopen(argv[2], "wb");
if(fp_out == NULL) {
printf("Can't open a file for output, %s.", argv[2]);
fclose(fp_in);
return 1;
}

while((ch = fgetc(fp_in)) != EOF)
{
fputc(ch, fp_out);
if(ch == CR || ch == LF) {
/* Add Tag and Original Code */
fseek(fp_out, -1, SEEK_CUR);
fwrite(BR, sizeof(BR) - 1, 1, fp_out);
fputc(ch, fp_out);
/* CR-LF */
if(ch == CR) {
ch = fgetc(fp_in);
if(ch == LF) fputc(LF, fp_out);
else fseek(fp_in, -1, SEEK_CUR);
}
}
}


fclose(fp_in);
fclose(fp_out);

printf("Operation completed.\n");
return 0;
}

当初fseek(fp_in, -1, 0);としていたのだが挙動が妙なことに気づき、時間を費やすとSEEK_CURでなければならないと判った。どおりでシークできなかったわけだ。