Last Update: Jan.10,2001

C Source Library

「LSI C-86 Ver.3.30c 試食版」を使用しています。

■ 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;
}