Last Update: May.15,2001

C Source Library

「LSI C-86 Ver.3.30c 試食版」、「Borland C++ 5.5」、「Microsoft Visual C++ 6.0」でコンパイル出来ます。

■ 「MacBinary II」のファイルからデータフォークを取り出すサンプル

/*
 *  demb2.c : 「MacBinary II」のファイルから
 *             データフォークを取り出すサンプル
 *
 *  Copyright (c) 2000,2001 AOK. 
 *
 *      2000.4. 5 - 初版
 *      2001.5.15 - コメント追加
 *
 *      使い方: DEMB2 入力ファイル名
 *
 */

#include <stdio.h>
#include <string.h>

#define chk_hdr()   (hdr[0]==0 && hdr[74]==0 && hdr[82]==0)

typedef unsigned char BYTE;

const char *err_no  = " MacBinary II のファイルでないかも…. (^-^;)";
const char *err_in  = " 入力ファイルをオープン出来ません.";
const char *err_out = " 出力ファイルをオープン出来ません.";
const char *mes_ok  = " データフォークを取り出しました.";
const char *copyr   = 
    "\n--- DEMB2.EXE - Copyright (c) 2000,2001 AOK. ---\n";
const char *usage   = 
    " パラメータが足りません.\n\n 使い方: DEMB2 入力ファイル名";

BYTE hdr[128];
/*
 *  FILENAME_MAX の値は、
 *    BCC55  では 260
 *    LSIC86 では  65 
 *  いずれも stdio.h で定義 
 */
char f1[FILENAME_MAX+1];
char f2[FILENAME_MAX+1];
unsigned long size = 0;

/* ヘッダから情報取得 */
void read_hdr()
{
    int n, i;
    char type[5], crtr[5], buf[64], *p;
    
    n = hdr[1];
    for (i=0; i<n; i++)
        buf[i] = hdr[2+i];
    buf[n] = '\0';
    for (i=0; i<4; i++)
    {
        type[i] = hdr[65+i];
        crtr[i] = hdr[69+i];
        size |= hdr[83+i] << (8*(3-i));
    }

    type[4] = '\0';
    crtr[4] = '\0';
    
    if ((p = strrchr(f2, '\\')) != NULL)
        strcpy(p+1, buf);
    else
        strcpy(f2, buf); 
    printf(" ファイル名 : %s\n", f2);
    printf(" タイプ   : %s\n", type);
    printf(" クリエータ : %s\n", crtr);
    printf(" データサイズ: %ld バイト\n\n", size);
}

/* データフォークの抽出 */
void extract(FILE *fp)
{
    FILE *fpo;
    unsigned long i;
    if ((fpo = fopen(f2, "wb")) != NULL)
    {
        /* 本当は、size バイト読み出せない場合のエラー処理が必要 */
        for (i=0; i<size; i++)
            putc((char)getc(fp), fpo);
        fclose(fpo);
        puts(mes_ok);
    }
    else
        puts(err_out);
}

/* プログラムのメイン */
int main(int argc, char *argv[])
{
    FILE *fp;
    int len;
    
    /* コマンドライン引き数のチェック */
    if (argc == 2)
    {
        strncpy(f1, argv[1], FILENAME_MAX);
        strncpy(f2, argv[1], FILENAME_MAX);
    }
    else
    {
        puts(usage);
        return 1;
    }
    
    puts(copyr);
    
    if ((fp = fopen(f1, "rb")) != NULL)
    {
        len = fread(hdr, sizeof(BYTE), 128, fp);
        if (len == 128)
        {
            if (chk_hdr())
            {
                read_hdr();
                extract(fp);
            }
            else
                puts(err_no);
        }
        else
            puts(err_no);
        
        fclose(fp);
    }
    else
        puts(err_in);
            
    return 0;
}