[Mew-dist 1807] xv modoki
Takuya HORIKE
holy at example.com
1997年 8月 30日 (土) 03:35:31 JST
ほりけ@DTIです。
Mew on Win32 Projectのページで、北口さんが
> image/Gif 等は Windows の関連付けが使えそうですが、
> 私の Emacs Lisp の力(なきに等しい)ではちょっと難しそうです。
> テンポラリファイルに拡張子が付けば、
> mew-mime.el を変更するだけで(こっちは簡単) ok なんですけどね...
> と思っていたんですけど、よく考えたら先頭数バイトを見るプログラムを
> 作ればいいだけですよね。
> そのうちに作りますんで、Windows の関連付けが使えるようになるでしょう。
と書かれているのに触発されて、これに近いものを作ってみました。
bmp, gif, jpg の三種類を自動判別することができます。
ただし、正式なファイルフォーマットの仕様を見たわけではありませんので、
判別の方法が適切ではないかもしれません。
一応、手元でいくつか調べた限りでは大丈夫でした。
処理の流れは以下のようになります。
1, ファイルの先頭16バイトを見て、ファイルタイプを判別する
2, 拡張子をつけてファイルをコピーする
3, コピーしたファイルを引数にしてグラフィックビューアを起動する
ビューアには gv を使うようにしていますが、
お好みに応じて変えていただければよいです。
関連づけの利用は見送りました。
以下、インストール方法です。
Cygnus の開発環境がインストールされていることを前提としています。
1, gcc でコンパイルする
2, できあがった xv.exe と gv.exe (別途入手のこと) を
PATH の通ったディレクトリに置く
3, mew-mime.el 中の "xv" を "xv.exe" に変更して byte-compile し直す
4, mule を再起動する
稚拙なコードで恥ずかしい限りですが、もしよかったら試してみてください。
-------------- next part --------------
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define VIEWER "gv"
#define HEADSIZE 16
#define PATHSIZE 255
#define POS_BMP 0
#define LEN_BMP 2
#define VAL_BMP "BM"
#define EXT_BMP ".bmp"
#define POS_GIF 0
#define LEN_GIF 3
#define VAL_GIF "GIF"
#define EXT_GIF ".gif"
#define POS_JPG 6
#define LEN_JPG 4
#define VAL_JPG "JFIF"
#define EXT_JPG ".jpg"
int
main(int argc,
char *argv[])
{
FILE *fp;
int i;
char header[HEADSIZE + 1];
char commandline[PATHSIZE];
char imagefile[PATHSIZE];
char *imagefile_tmp;
char *token;
size_t size;
/*
* すべての引数について処理を行なう
*/
for (i = 1; i < argc; i++) {
/*
* ファイルの存在チェック
*/
if (access(argv[i], F_OK) != 0) {
fprintf(stderr, "%s not found.\n", argv[i]);
continue;
}
/*
* 変数初期化
*/
memset(header, (int) '\0', HEADSIZE + 1);
/*
* 画像ファイルのヘッダを読み込む
*/
fp = fopen(argv[i], "r");
if (fp == NULL) {
fprintf(stderr, "%s cannot open.\n", argv[i]);
continue;
}
size = fread(header, sizeof(char), HEADSIZE, fp);
fclose(fp);
/*
* ファイルタイプ判別
*/
if (strstr(header, VAL_BMP) != NULL) {
strcpy(imagefile, argv[i]);
strcat(imagefile, EXT_BMP);
} else if (strstr(header, VAL_GIF) != NULL) {
strcpy(imagefile, argv[i]);
strcat(imagefile, EXT_GIF);
} else {
memset(header, 0x30, POS_JPG);
if (strstr(header, VAL_JPG) != NULL) {
strcpy(imagefile, argv[i]);
strcat(imagefile, EXT_JPG);
} else {
fprintf(stderr, "\"%s\" is not BMP/GIF/JPG file.\n", argv[i]);
continue;
}
}
/*
* 拡張子をつけてファイルをコピーする
*/
if (access(imagefile, F_OK) != 0) {
sprintf(commandline, "cp %s %s", argv[i], imagefile);
system(commandline);
} else {
fprintf(stderr, "%s already exists.\n", imagefile);
continue;
}
/*
* パス区切り記号の変換 "/" → "\\" を行なう
*/
imagefile_tmp = strdup(imagefile);
token = strtok(imagefile_tmp, "/");
strcpy(imagefile, token);
token = strtok(NULL, "/");
if (token != NULL) {
while (token != NULL) {
strcat(imagefile, "\\\\");
strcat(imagefile, token);
token = strtok(NULL, "/");
}
}
free(imagefile_tmp);
/*
* 画像ビューアを起動する
*/
sprintf(commandline, "%s %s", VIEWER, imagefile);
system(commandline);
}
exit(0);
}
-------------- next part --------------
ほりけ たくや
holy at example.com
http://www.ceres.dti.ne.jp/~holy/index.html
Mew-dist メーリングリストの案内