mirror of
https://github.com/wnayes/macutils.git
synced 2025-01-03 02:31:25 +00:00
122 lines
2.6 KiB
C
122 lines
2.6 KiB
C
#include "globals.h"
|
|
#include "../fileio/machdr.h"
|
|
#include "../fileio/kind.h"
|
|
#include "../util/util.h"
|
|
|
|
extern void dir();
|
|
extern void mcb();
|
|
extern void do_indent();
|
|
|
|
static void skip_file();
|
|
#ifdef SCAN
|
|
static void get_idf();
|
|
#endif /* SCAN */
|
|
|
|
void macbinary()
|
|
{
|
|
char header[INFOBYTES];
|
|
int c;
|
|
|
|
while(1) {
|
|
if((c = fgetc(infp)) == EOF) {
|
|
break;
|
|
}
|
|
(void)ungetc(c, infp);
|
|
if(fread(header, 1, INFOBYTES, infp) != INFOBYTES) {
|
|
(void)fprintf(stderr, "Can't read MacBinary header.\n");
|
|
exit(1);
|
|
}
|
|
if(header[I_NAMEOFF] & 0x80) {
|
|
dir(header);
|
|
continue;
|
|
}
|
|
in_data_size = get4(header + I_DLENOFF);
|
|
in_rsrc_size = get4(header + I_RLENOFF);
|
|
in_ds = (((in_data_size + 127) >> 7) << 7);
|
|
in_rs = (((in_rsrc_size + 127) >> 7) << 7);
|
|
ds_skip = in_ds - in_data_size;
|
|
rs_skip = in_rs - in_rsrc_size;
|
|
if(dir_skip != 0) {
|
|
skip_file(in_ds + in_rs);
|
|
continue;
|
|
}
|
|
#ifdef SCAN
|
|
if(header[I_NAMEOFF] == 0) {
|
|
get_idf((int)header[I_NAMEOFF + 1]);
|
|
skip_file(ds_skip + in_rs);
|
|
continue;
|
|
}
|
|
#endif /* SCAN */
|
|
if(header[0] == 0 /* MORE CHECKS HERE! */) {
|
|
mcb(header, (unsigned long)in_rsrc_size,
|
|
(unsigned long)in_data_size, in_ds + in_rs);
|
|
continue;
|
|
} else {
|
|
(void)fprintf(stderr, "Unrecognized header.\n");
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
static void skip_file(skip)
|
|
int skip;
|
|
{
|
|
char buff[1024];
|
|
int n;
|
|
|
|
while(skip > 0) {
|
|
n = (skip < 1024 ? skip : 1024);
|
|
if(fread(buff, 1, n, infp) != n) {
|
|
(void)fprintf(stderr, "Incomplete file.\n");
|
|
exit(1);
|
|
}
|
|
skip -= n;
|
|
}
|
|
}
|
|
|
|
#ifdef SCAN
|
|
static void get_idf(kind)
|
|
int kind;
|
|
{
|
|
char filename[1024], filename1[255];
|
|
|
|
if(fread(filename, 1, in_data_size, infp) != in_data_size) {
|
|
(void)fprintf(stderr, "Incomplete file.\n");
|
|
exit(1);
|
|
}
|
|
filename[in_data_size] = 0;
|
|
if(list) {
|
|
do_indent(indent);
|
|
switch(kind) {
|
|
case UNIX_NAME:
|
|
(void)fprintf(stderr, "Unix filename: \"%s\"\n", filename);
|
|
break;
|
|
case PACK_NAME:
|
|
transname(filename, filename1, in_data_size);
|
|
(void)fprintf(stderr, "Packed filename: \"%s\"\n", filename1);
|
|
break;
|
|
case ARCH_NAME:
|
|
transname(filename, filename1, in_data_size);
|
|
(void)fprintf(stderr, "Archive name: \"%s\"\n", filename1);
|
|
break;
|
|
case UNKNOWN:
|
|
(void)fprintf(stderr, "Unknown method detected\n");
|
|
break;
|
|
case ERROR:
|
|
(void)fprintf(stderr, "Error detected\n");
|
|
break;
|
|
case PROTECTED:
|
|
(void)fprintf(stderr, "Protected file detected\n");
|
|
break;
|
|
case COPY:
|
|
(void)fprintf(stderr, "Copied file found\n");
|
|
break;
|
|
default:
|
|
(void)fprintf(stderr, "Do not understand this identification\n");
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|
|
#endif /* SCAN */
|
|
|