■ x-mac-typeから添付ファイルの拡張子を推定
/*
* mac_ext.c :
*
* Macintosh から送信された電子メールの x-mac-type(8桁の数字)
* から添付ファイルの拡張子を推定する。x-mac-type は、電子メール
* をメモ帳などで直接開いて探して下さい。
*
* --【例】----------------------------------------------------
* Content-Disposition: attachment; name="attachfile"
* Content-Transfer-Encoding: base64
* Content-Type: application/octet-stream; name="attachfile";
* x-mac-type="38425053"; x-mac-creator="3842494D"
* Date: Wed, 21 Jun 2000 00:58:25 +0900
* ------------------------------------------------------------
*
* 初版:2000/06/27
*
* Copyright (c) 2000 AOK.
*
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NUM_OF_ARR(x) (sizeof(x)/sizeof(x[0]))
#define MAXCMD 128
#define HABA 58
typedef struct {
char *type;
char *ext;
char *app;
} MACEXT;
/*
* ここのデータを増やせば識別できるデータが増えるよ。
* ネットで集めた情報なので検証してません。適宜修正してね。
*/
const MACEXT data[] = {
{ "PUBF", ".pub", "Adobe PageMaker 2.0" },
{ "ALB3", ".pm3", "Adobe PageMaker 3.0" },
{ "ALT3", ".pt3", "Adobe PageMaker 3.0" },
{ "ALB4", ".pm4", "Adobe PageMaker 4.0" },
{ "ALT4", ".pt4", "Adobe PageMaker 4.0" },
{ "ALB5", ".pm5", "Adobe PageMaker 5.0" },
{ "ALT5", ".pt5", "Adobe PageMaker 5.0" },
{ "ALB6", ".pm6", "Adobe PageMaker 6.0" },
{ "ALT6", ".pt6", "Adobe PageMaker 6.0" },
{ "AB65", ".p65", "Adobe PageMaker 6.5" },
{ "AT65", ".t65", "Adobe PageMaker 6.5" },
{ "EPSF", ".eps", "Adobe Illustrator" },
{ "8BPS", ".psd", "Adobe Photoshop" },
{ "EggP", ".aep", "Adobe After Effects" },
{ "AD3F", ".dim", "Adobe Dimensions" },
{ "PROJ", ".ppj", "Adobe Premiere" },
{ "TIFF", ".tif", "TIFF画像" },
{ "PICT", ".pct", "PICT画像" },
{ "BMP ", ".bmp", "Windows ビットマップ画像" },
{ "BMPp", ".bmp", "Windows ビットマップ画像" },
{ "GIFf", ".gif", "GIF画像" },
{ "ILBM", ".iff", "Amiga画像" },
{ "JPEG", ".jpg", "JPEG画像" },
{ "PCDI", ".pcd", "Kodak Photo CD" },
{ "..CT", ".sct", "サイテックスCT画像" },
{ "TPIC", ".tga", "TGA画像" },
{ "CWCM", ".cwk", "ClarisWorks" },
{ "CWDB", ".cwk", "ClarisWorks" },
{ "CWGR", ".cwk", "ClarisWorks" },
{ "CWSS", ".cwk", "ClarisWorks" },
{ "CWWP", ".cwk", "ClarisWorks" },
{ "MooV", ".mov", "QuickTimeムービー" },
{ "Film", ".flm", "Film Strip形式" },
{ "MV97", ".dir", "Macromedia Director 6.0J" },
{ "MC97", ".cst", "Macromedia Director 6.0J" },
{ "SPA ", ".fla", "Macromedia Flash 2J" },
{ "AGD2", ".fh7", "Macromedia FreeHand 7.0J" },
{ "AGD3", ".fh8", "Macromedia FreeHand 8.0J" },
{ "XLS ", ".xls", "Microsoft Excel" },
{ "LINK", ".url", "Microsoft Internet Explorer" },
{ "OBd4", ".brc", "Metacreation Bryce 2" },
{ "pzr2", ".pzr", "Metacreation Poser 20J" },
{ "XPRF", ".xpr", "Metacreation Expressions" },
{ "RIFF", ".rif", "Metacreation Painter 5.0J" },
{ "ULAW", ".au", "オーディオファイル" },
{ "WAVE", ".wav", "オーディオファイル" },
{ "AIFF", ".aif", "AIFFサウンド" },
{ "XPRa", ".qxd", "QuarkXPress" },
{ "SMED", ".ec2", "SMI EDICOLOR 2.2J" },
{ "TEXT", ".txt", "テキスト文書" },
{ "MPG ", ".mpg", "MPEGファイル" },
{ "Midi", ".mid", "MIDI形式" },
{ "RTF ", ".rtf", "リッチテキスト形式" },
{ "pDAT", ".ppd", "ポストペット" },
{ "LHA\0", ".lzh", "MacLHa圧縮形式" },
{ "????", "", "タイプ不明" },
};
/* ストリームから文字列を得る */
void input(char *s, int size)
{
char temp[MAXCMD+1];
if (*gets(temp) != '\0')
{
strncpy(s, temp, size);
s[size] = '\0';
}
}
/* n 個の文字を吐き出す */
void putnchar(char c, int n)
{
while (n-- > 0)
putchar(c);
putchar('\n');
}
/* ファイルタイプから拡張子を求めて表示 */
void type_to_ext(char *t)
{
int i;
printf("\nタイプ:%s\n", t);
for (i = 0; i < NUM_OF_ARR(data); i++)
if (strcmp(t, data[i].type)==0)
printf("拡張子:%s [%s]\n", data[i].ext, data[i].app);
}
/* メインルーチン */
int main()
{
char s[9], buf[3], type[5];
int i;
putnchar('*', HABA);
puts("* MAC_EXT Copyright (c) 2000 AOK. All Rights Reserved. *");
putnchar('*', HABA);
puts("電子メールの x-mac-type(8桁の数字)から拡張子を求めます.");
puts(" (4文字のファイルタイプからでも可)");
while (1)
{
s[0] = '\0';
putnchar('-', HABA);
printf("入力してください.>");
input(s, 8);
if (s[0] == '\0')
{
putnchar('-', HABA);
puts("終了.");
return 0;
}
switch (strlen(s))
{
case 3:
case 4:
strcpy(type, s);
type_to_ext(type);
break;
case 8:
for (i=0; i<4; i++)
{
strncpy(buf, s+(i*2), 2);
buf[2] = '\0';
type[i] = (char)strtol(buf, NULL, 16);
}
type[4] = '\0';
type_to_ext(type);
break;
default:
fprintf(stderr, "\n数字の数は8個でなければいけません.[%s]", s);
fprintf(stderr, "\nファイルタイプは4文字でなければいけません.[%s]\n", s);
break;
}
}
return 0;
}