#include "hexbin.h" #include "mu.h" #ifdef MU #include "globals.h" #include "readline.h" #include "../util/masks.h" #include "../util/util.h" #include "../util/transname.h" #include "../fileio/machdr.h" #include "../fileio/wrfile.h" #include "buffer.h" #include "printhdr.h" #include static void do_mu_fork(void); static int mu_comp_to_bin(void); static int mu_convert(char *ibuf, char *obuf); /* mu format -- process .mu files */ void mu (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, (uint32_t)mh.m_datalen); put4(info + I_RLENOFF, (uint32_t)mh.m_rsrclen); put4(info + I_CTIMOFF, (uint32_t)mh.m_createtime); put4(info + I_MTIMOFF, (uint32_t)mh.m_modifytime); print_header2(0); end_put(); } static void do_mu_fork (void) { int32_t 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 (void) { 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 (char *ibuf, char *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 */