[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 メーリングリストの案内