[mew-dist 19180] Re: mew-mime-content-type
Tak Ota
Takaaki.Ota at example.com
2001年 10月 5日 (金) 14:55:05 JST
-----Original Message-----
From: Kazu Yamamoto (山本和彦) <kazu at example.com>
Date: Fri, 05 Oct 2001 12:46:16 +0900 (JST)
Subject: [mew-dist 19178] Re: mew-mime-content-type
> From: Shun-ichi TAHARA (田原 俊一) <jado at example.com>
> Subject: [mew-dist 19177] Re: mew-mime-content-type
>
> > デザインとしてはスッキリしているのは確かですが、ユーザにMIMEについての
> > 知識を要求するような実装には賛成できません。
>
> ふふふ。解決しました。
>
> 所詮、Text/Plain か Applicatin/Octet-Stream かで悩んでいるので、知らな
> い拡張子の場合、直接ファイルを検査してテキストかバイナリか判断するよう
> にしました。
>
> Elisp で書いてもよかったんですが、mewencode に組み込みました。
>
> アルゴリズム:
> 先頭 1024 バイト中に、0 or 128 or 255 があればバイナリだと思う。
> # 他にぐっとくる値はありますか?
>
> というわけで、mew-content-type はなくなりました。
>
> --かず
「ぐっとくる」かどうか分りませんが以下同様の必要から以前に書いたコード
からの抜粋です。何かの参考になれば幸いです。ファイルの先頭と末尾の両方
で検査します。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#define DEFAULT_BINARY_CHECK_SIZE 128
#define IS_BINARY_CHAR(c) ((c) == 0x00 || (c) >= 0x80 || (c) <= 0x1f && (c) >= 0x1c)
static int binary_ckeck_size = DEFAULT_BINARY_CHECK_SIZE;
/* Return non-zero value when the FILE is determined as binary file. */
static int is_binary_file(char *file)
{
struct stat status;
FILE *fp;
off_t size;
enum {
first, last, end
} area;
if(stat(file, &status) ||
(fp = fopen(file, "r")) == NULL) {
perror(file);
return 1;
}
for(area = first; area < end; area++) {
int i;
if(area == first) {
if((size = binary_check_size) > status.st_size)
size = status.st_size;
} else {
off_t rest = status.st_size - size;
if(size > rest) {
size = rest;
}
if(size)
fseek(fp, -size, SEEK_END);
}
for(i = 0; i < size; i++) {
int c = fgetc(fp);
if(IS_BINARY_CHAR(c)) {
fclose(fp);
return 1;
}
}
}
fclose(fp);
return 0;
}
Mew-dist メーリングリストの案内