mirror of
https://github.com/wnayes/macutils.git
synced 2025-01-02 11:31:19 +00:00
226 lines
4.8 KiB
C
226 lines
4.8 KiB
C
#include "hexbin.h"
|
|
#ifdef MU
|
|
#include "globals.h"
|
|
#include "readline.h"
|
|
#include "../util/masks.h"
|
|
#include "../util/util.h"
|
|
#include "../fileio/machdr.h"
|
|
#include "../fileio/wrfile.h"
|
|
#include "buffer.h"
|
|
#include "printhdr.h"
|
|
|
|
extern void exit();
|
|
|
|
static void do_mu_fork();
|
|
static int mu_comp_to_bin();
|
|
static int mu_convert();
|
|
|
|
/* mu format -- process .mu files */
|
|
void mu(macname)
|
|
char *macname;
|
|
{
|
|
int n;
|
|
|
|
for(n = 0; n < INFOBYTES; n++) {
|
|
info[n] = 0;
|
|
}
|
|
|
|
/* set up name for output files */
|
|
if(macname[0] == '\0') {
|
|
n = 0;
|
|
while(line[n] != '"') {
|
|
n++;
|
|
}
|
|
macname = line + n + 1;
|
|
line[strlen(line) - 1] = 0;
|
|
}
|
|
n = strlen(macname);
|
|
if(n > F_NAMELEN) {
|
|
n = F_NAMELEN;
|
|
}
|
|
(void)strncpy(mh.m_name, macname, n);
|
|
mh.m_name[n] = '\0';
|
|
info[I_NAMEOFF] = n;
|
|
(void)strncpy(info + I_NAMEOFF + 1, mh.m_name, n);
|
|
|
|
if(listmode) {
|
|
(void)fprintf(stderr, "This file is in \"mu\" format.\n");
|
|
}
|
|
transname(mh.m_name, trname, n);
|
|
define_name(trname);
|
|
print_header0(0);
|
|
set_put(0);
|
|
set_put(1);
|
|
do_mu_fork();
|
|
mh.m_datalen = data_size;
|
|
if(!readline()) {
|
|
(void)fprintf(stderr, "Premature EOF\n");
|
|
#ifdef SCAN
|
|
do_error("hexbin: Premature EOF");
|
|
#endif /* SCAN */
|
|
exit(1);
|
|
}
|
|
if(strncmp(line, "begin ", 6)) {
|
|
(void)fprintf(stderr, "No UU header found.\n");
|
|
#ifdef SCAN
|
|
do_error("hexbin: No UU header found");
|
|
#endif /* SCAN */
|
|
exit(1);
|
|
}
|
|
if(!strncmp(line + 10, " .rsrc", 6)) {
|
|
set_put(0);
|
|
do_mu_fork();
|
|
mh.m_rsrclen = rsrc_size;
|
|
if(!readline()) {
|
|
(void)fprintf(stderr, "Premature EOF\n");
|
|
#ifdef SCAN
|
|
do_error("hexbin: Premature EOF");
|
|
#endif /* SCAN */
|
|
exit(1);
|
|
}
|
|
if(strncmp(line, "begin ", 6)) {
|
|
(void)fprintf(stderr, "No UU header found.\n");
|
|
#ifdef SCAN
|
|
do_error("hexbin: No UU header found");
|
|
#endif /* SCAN */
|
|
exit(1);
|
|
}
|
|
} else {
|
|
mh.m_rsrclen = 0;
|
|
}
|
|
if(strncmp(line + 10, " .finfo", 7)) {
|
|
(void)fprintf(stderr, "No finder info found.\n");
|
|
#ifdef SCAN
|
|
do_error("hexbin: No finder info found");
|
|
#endif /* SCAN */
|
|
exit(1);
|
|
}
|
|
if(!readline()) {
|
|
(void)fprintf(stderr, "Premature EOF\n");
|
|
#ifdef SCAN
|
|
do_error("hexbin: Premature EOF");
|
|
#endif /* SCAN */
|
|
exit(1);
|
|
}
|
|
(void)mu_convert(line, info + I_TYPEOFF);
|
|
if(!readline()) {
|
|
(void)fprintf(stderr, "Premature EOF\n");
|
|
#ifdef SCAN
|
|
do_error("hexbin: Premature EOF");
|
|
#endif /* SCAN */
|
|
exit(1);
|
|
}
|
|
if(mu_convert(line, line)) {
|
|
(void)fprintf(stderr, "Long finderinfo.\n");
|
|
#ifdef SCAN
|
|
do_error("hexbin: Long finderinfo");
|
|
#endif /* SCAN */
|
|
exit(1);
|
|
}
|
|
if(!readline()) {
|
|
(void)fprintf(stderr, "Premature EOF\n");
|
|
#ifdef SCAN
|
|
do_error("hexbin: Premature EOF");
|
|
#endif /* SCAN */
|
|
exit(1);
|
|
}
|
|
if(strncmp(line, "end", 3)) {
|
|
(void)fprintf(stderr, "\"end\" line missing.\n");
|
|
#ifdef SCAN
|
|
do_error("hexbin: \"end\" line missing");
|
|
#endif /* SCAN */
|
|
exit(1);
|
|
}
|
|
|
|
(void)strncpy(mh.m_type, info + I_TYPEOFF, 4);
|
|
(void)strncpy(mh.m_author, info + I_AUTHOFF, 4);
|
|
print_header1(0, 0);
|
|
put4(info + I_DLENOFF, (unsigned long)mh.m_datalen);
|
|
put4(info + I_RLENOFF, (unsigned long)mh.m_rsrclen);
|
|
put4(info + I_CTIMOFF, (unsigned long)mh.m_createtime);
|
|
put4(info + I_MTIMOFF, (unsigned long)mh.m_modifytime);
|
|
print_header2(0);
|
|
end_put();
|
|
}
|
|
|
|
static void do_mu_fork()
|
|
{
|
|
long newbytes;
|
|
|
|
while(readline()) {
|
|
if(line[0] == 0) {
|
|
continue;
|
|
}
|
|
newbytes = mu_comp_to_bin();
|
|
if(newbytes != 0) {
|
|
continue;
|
|
}
|
|
if(!readline()) {
|
|
(void)fprintf(stderr, "Premature EOF\n");
|
|
#ifdef SCAN
|
|
do_error("hexbin: Premature EOF");
|
|
#endif /* SCAN */
|
|
exit(1);
|
|
}
|
|
if(strncmp(line, "end", 3)) {
|
|
(void)fprintf(stderr, "\"end\" line missing.\n");
|
|
#ifdef SCAN
|
|
do_error("hexbin: \"end\" line missing");
|
|
#endif /* SCAN */
|
|
exit(1);
|
|
}
|
|
return;
|
|
}
|
|
(void)fprintf(stderr, "Premature EOF\n");
|
|
#ifdef SCAN
|
|
do_error("hexbin: Premature EOF");
|
|
#endif /* SCAN */
|
|
exit(1);
|
|
/*NOTREACHED*/
|
|
}
|
|
|
|
static int mu_comp_to_bin()
|
|
{
|
|
char obuf[BUFSIZ];
|
|
int outcount, n;
|
|
|
|
outcount = mu_convert(line, obuf);
|
|
for(n = 0; n < outcount; n++) {
|
|
put_byte(obuf[n]);
|
|
}
|
|
return outcount;
|
|
}
|
|
|
|
#define SIXB(c) (((c)-0x20) & 0x3f)
|
|
|
|
static int mu_convert(ibuf, obuf)
|
|
char *ibuf, *obuf;
|
|
{
|
|
register char *ip = ibuf;
|
|
register char *op = obuf;
|
|
register int n, outcount;
|
|
int numread, incount;
|
|
|
|
numread = strlen(ip);
|
|
outcount = SIXB(ip[0]);
|
|
incount = ((outcount / 3) + 1) * 4;
|
|
for(n = numread; n < incount; n++) { /* restore lost spaces */
|
|
ip[n] = ' ';
|
|
}
|
|
ip++;
|
|
|
|
n = 0;
|
|
while(n <= outcount) {
|
|
*op++ = SIXB(ip[0]) << 2 | SIXB(ip[1]) >> 4;
|
|
*op++ = SIXB(ip[1]) << 4 | SIXB(ip[2]) >> 2;
|
|
*op++ = SIXB(ip[2]) << 6 | SIXB(ip[3]);
|
|
ip += 4;
|
|
n += 3;
|
|
}
|
|
return outcount;
|
|
}
|
|
#else /* MU */
|
|
int mu; /* keep lint and some compilers happy */
|
|
#endif /* MU */
|
|
|