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