useless tips

「考えてみると、文字列の後ろに タブや スペースがある 状況というのは よく わからない」 なんて 書いたけど、そんなケースに 即 遭遇してしまった。
http://nobelprize.org/literature/laureates/2005/pinter-lecture-e.html
上の page を テキストブラウザで 保存。 ファイルを 開くと、1行ごとに 空白行が はさまってしまい、とても 読みやすいとは いえない。

$ w3m -dump nobelprize.org/literature/laureates/2005/pinter-lecture-e.html > file.txt
$ less file.txt
理由は、まず 1行の幅が 100 近くあり、しかも 文章の後ろから 改行コードまでが すべて スペース ' ' で 埋まってるから。
どうも、page 右側の 空きの部分に 記事 (ここでは リンク先) を 埋め込むための 処置らしい ← 余計なことを ...
で、ちょっと インチキだけど、ファイル整形 プログラムを つくってみた、
/* rmposblank.c */
#include
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define MAX_SIZE (100 + 1 + 1)
#define SLICE_SIZE 65
#define ISBLANK(c) ((c) == ' ' || (c) == '\t')

void carte();
void remove_pos_blank();
void cant();

main(int argc, char **argv)
{
FILE *fp;

--argc;
++argv;

if (argc == 0)
carte(stdin);
else {
while (argc--) {
if )((fp = fopen(*argv, "r"))( == NULL)
cant(*argv);
carte(fp);
fclose(fp);
argv++;
}
}

return 0;
}

void carte(FILE *fp)
{
char buf[MAX_SIZE];

while (fgets(buf, MAX_SIZE, fp) != NULL) {
remove_pos_blank(buf);
fputs(buf, stdout);
}
}

void remove_pos_blank(char *buf)
{
char *q;

if (*buf == '\0')
return;
q = buf + SLICE_SIZE;
while (ISBLANK(*q))
--q;
*(q + 1) = '\n';
*(q + 2) = '\0';
}

void cant(char *name)
{
fprintf(stderr, "can't open %s\n", name);
exit(1);
}

コンパイルして、さっそく 使ってみる、
$ ./rmposblank file.txt > pinter-lecture.txt
$ less pinter-lecture.txt
なんとか うまく いったみたい ...

(追記) angle bracket の件、はてなで 早速 調整してもらえました、感謝。
それと、上の プログラム、なんだか ヘッダファイルが 多すぎるような ...
(さらに 追記) 上の 印刷用ページ、余分な スペースを 削除したようです。