home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / macutils.lzh / MACUTILS / HEXBIN / mu.c < prev    next >
C/C++ Source or Header  |  1996-02-01  |  5KB  |  226 lines

  1. #include "hexbin.h"
  2. #ifdef MU
  3. #include "globals.h"
  4. #include "readline.h"
  5. #include "../util/masks.h"
  6. #include "../util/util.h"
  7. #include "../fileio/machdr.h"
  8. #include "../fileio/wrfile.h"
  9. #include "buffer.h"
  10. #include "printhdr.h"
  11.  
  12. extern void exit();
  13.  
  14. static void do_mu_fork();
  15. static int mu_comp_to_bin();
  16. static int mu_convert();
  17.  
  18. /* mu format -- process .mu files */
  19. void mu(macname)
  20. char *macname;
  21. {
  22.     int n;
  23.  
  24.     for(n = 0; n < INFOBYTES; n++) {
  25.     info[n] = 0;
  26.     }
  27.  
  28.     /* set up name for output files */
  29.     if(macname[0] == '\0') {
  30.     n = 0;
  31.     while(line[n] != '"') {
  32.         n++;
  33.     }
  34.     macname = line + n + 1;
  35.     line[strlen(line) - 1] = 0;
  36.     }
  37.     n = strlen(macname);
  38.     if(n > F_NAMELEN) {
  39.     n = F_NAMELEN;
  40.     }
  41.     (void)strncpy(mh.m_name, macname, n);
  42.     mh.m_name[n] = '\0';
  43.     info[I_NAMEOFF] = n;
  44.     (void)strncpy(info + I_NAMEOFF + 1, mh.m_name, n);
  45.  
  46.     if(listmode) {
  47.     (void)fprintf(stderr, "This file is in \"mu\" format.\n");
  48.     }
  49.     transname(mh.m_name, trname, n);
  50.     define_name(trname);
  51.     print_header0(0);
  52.     set_put(0);
  53.     set_put(1);
  54.     do_mu_fork();
  55.     mh.m_datalen = data_size;
  56.     if(!readline()) {
  57.     (void)fprintf(stderr, "Premature EOF\n");
  58. #ifdef SCAN
  59.     do_error("hexbin: Premature EOF");
  60. #endif /* SCAN */
  61.     exit(1);
  62.     }
  63.     if(strncmp(line, "begin ", 6)) {
  64.     (void)fprintf(stderr, "No UU header found.\n");
  65. #ifdef SCAN
  66.     do_error("hexbin: No UU header found");
  67. #endif /* SCAN */
  68.     exit(1);
  69.     }
  70.     if(!strncmp(line + 10, " .rsrc", 6)) {
  71.     set_put(0);
  72.     do_mu_fork();
  73.     mh.m_rsrclen = rsrc_size;
  74.     if(!readline()) {
  75.         (void)fprintf(stderr, "Premature EOF\n");
  76. #ifdef SCAN
  77.         do_error("hexbin: Premature EOF");
  78. #endif /* SCAN */
  79.         exit(1);
  80.     }
  81.     if(strncmp(line, "begin ", 6)) {
  82.         (void)fprintf(stderr, "No UU header found.\n");
  83. #ifdef SCAN
  84.         do_error("hexbin: No UU header found");
  85. #endif /* SCAN */
  86.         exit(1);
  87.     }
  88.     } else {
  89.     mh.m_rsrclen = 0;
  90.     }
  91.     if(strncmp(line + 10, " .finfo", 7)) {
  92.     (void)fprintf(stderr, "No finder info found.\n");
  93. #ifdef SCAN
  94.     do_error("hexbin: No finder info found");
  95. #endif /* SCAN */
  96.     exit(1);
  97.     }
  98.     if(!readline()) {
  99.     (void)fprintf(stderr, "Premature EOF\n");
  100. #ifdef SCAN
  101.     do_error("hexbin: Premature EOF");
  102. #endif /* SCAN */
  103.     exit(1);
  104.     }
  105.     (void)mu_convert(line, info + I_TYPEOFF);
  106.     if(!readline()) {
  107.     (void)fprintf(stderr, "Premature EOF\n");
  108. #ifdef SCAN
  109.     do_error("hexbin: Premature EOF");
  110. #endif /* SCAN */
  111.     exit(1);
  112.     }
  113.     if(mu_convert(line, line)) {
  114.     (void)fprintf(stderr, "Long finderinfo.\n");
  115. #ifdef SCAN
  116.     do_error("hexbin: Long finderinfo");
  117. #endif /* SCAN */
  118.     exit(1);
  119.     }
  120.     if(!readline()) {
  121.     (void)fprintf(stderr, "Premature EOF\n");
  122. #ifdef SCAN
  123.     do_error("hexbin: Premature EOF");
  124. #endif /* SCAN */
  125.     exit(1);
  126.     }
  127.     if(strncmp(line, "end", 3)) {
  128.     (void)fprintf(stderr, "\"end\" line missing.\n");
  129. #ifdef SCAN
  130.     do_error("hexbin: \"end\" line missing");
  131. #endif /* SCAN */
  132.     exit(1);
  133.     }
  134.  
  135.     (void)strncpy(mh.m_type, info + I_TYPEOFF, 4);
  136.     (void)strncpy(mh.m_author, info + I_AUTHOFF, 4);
  137.     print_header1(0, 0);
  138.     put4(info + I_DLENOFF, (unsigned long)mh.m_datalen);
  139.     put4(info + I_RLENOFF, (unsigned long)mh.m_rsrclen);
  140.     put4(info + I_CTIMOFF, (unsigned long)mh.m_createtime);
  141.     put4(info + I_MTIMOFF, (unsigned long)mh.m_modifytime);
  142.     print_header2(0);
  143.     end_put();
  144. }
  145.  
  146. static void do_mu_fork()
  147. {
  148.     long newbytes;
  149.  
  150.     while(readline()) {
  151.     if(line[0] == 0) {
  152.         continue;
  153.     }
  154.     newbytes = mu_comp_to_bin();
  155.     if(newbytes != 0) {
  156.         continue;
  157.     }
  158.     if(!readline()) {
  159.         (void)fprintf(stderr, "Premature EOF\n");
  160. #ifdef SCAN
  161.         do_error("hexbin: Premature EOF");
  162. #endif /* SCAN */
  163.         exit(1);
  164.     }
  165.     if(strncmp(line, "end", 3)) {
  166.         (void)fprintf(stderr, "\"end\" line missing.\n");
  167. #ifdef SCAN
  168.         do_error("hexbin: \"end\" line missing");
  169. #endif /* SCAN */
  170.         exit(1);
  171.     }
  172.     return;
  173.     }
  174.     (void)fprintf(stderr, "Premature EOF\n");
  175. #ifdef SCAN
  176.     do_error("hexbin: Premature EOF");
  177. #endif /* SCAN */
  178.     exit(1);
  179.     /*NOTREACHED*/
  180. }
  181.  
  182. static int mu_comp_to_bin()
  183. {
  184.     char obuf[BUFSIZ];
  185.     int outcount, n;
  186.  
  187.     outcount = mu_convert(line, obuf);
  188.     for(n = 0; n < outcount; n++) {
  189.     put_byte(obuf[n]);
  190.     }
  191.     return outcount;
  192. }
  193.  
  194. #define SIXB(c) (((c)-0x20) & 0x3f)
  195.  
  196. static int mu_convert(ibuf, obuf)
  197. char *ibuf, *obuf;
  198. {
  199.     register char *ip = ibuf;
  200.     register char *op = obuf;
  201.     register int n, outcount;
  202.     int numread, incount;
  203.  
  204.     numread = strlen(ip);
  205.     outcount = SIXB(ip[0]);
  206.     incount = ((outcount / 3) + 1) * 4;
  207.     for(n = numread; n < incount; n++) {  /* restore lost spaces */
  208.     ip[n] = ' ';
  209.     }
  210.     ip++;
  211.  
  212.     n = 0;
  213.     while(n <= outcount) {
  214.     *op++ = SIXB(ip[0]) << 2 | SIXB(ip[1]) >> 4;
  215.     *op++ = SIXB(ip[1]) << 4 | SIXB(ip[2]) >> 2;
  216.     *op++ = SIXB(ip[2]) << 6 | SIXB(ip[3]);
  217.     ip += 4;
  218.     n += 3;
  219.     }
  220.     return outcount;
  221. }
  222. #else /* MU */
  223. int mu; /* keep lint and some compilers happy */
  224. #endif /* MU */
  225.  
  226.