home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume4 / tenex < prev    next >
Text File  |  1989-02-03  |  6KB  |  310 lines

  1. Path: xanth!mcnc!rutgers!tut.cis.ohio-state.edu!bloom-beacon!bu-cs!mirror!necntc!ncoast!allbery
  2. From: dan@rna.UUCP (Dan Ts'o)
  3. Newsgroups: comp.sources.misc
  4. Subject: v04i082: TENEX - pgm to convert DEC10 data to 8bit bytes
  5. Message-ID: <8809071745.AA08524@rna>
  6. Date: 20 Sep 88 01:11:18 GMT
  7. Sender: allbery@ncoast.UUCP
  8. Reply-To: dan@rna.UUCP (Dan Ts'o)
  9. Lines: 298
  10. Approved: allbery@ncoast.UUCP
  11.  
  12. Posting-number: Volume 4, Issue 82
  13. Submitted-by: "Dan Ts'o" <dan@rna.UUCP>
  14. Archive-name: tenex
  15.  
  16.     I had just spent a few hours uploading MSDOS stuff from SIMTEL20.
  17. Back on my PC, I realized that while I had remembered to transfer everything
  18. in binary mode (in FTP), that I had neglected to account for (is it called ?)
  19. TENEX mode (since SIMTEL20 is a 36-bit machine). I decided it would be faster
  20. to write a C program to convert the 36-bit data into good ol' 8-bit bytes,
  21. than re-upload every. So here is the program. I used MSC 5.0. The program will
  22. convert both binary (-b, default, from each 36-bit word, generate 4x8-bit bytes
  23. and discard the remaining 4bits) and text (-t, from each 36-bit word, generate
  24. 5x7bit (with zero parity bit) ASCII bytes and discard the last bit).
  25. The program has been tested on both MSDOS 3.1 and 4.3BSD UNIX. If anyone needs
  26. a binary copy for MSDOS, I'll mail them one. I hope this wheel hasn't been
  27. reinvented too many times...
  28.  
  29.                     Cheers,
  30.                     Dan Ts'o
  31.                     tso@rockefeller.edu
  32.                     dan@rna.rockefeller.edu
  33.                     ...cmcl2!rna!dan
  34.                     212-570-7671
  35.                     Dept Neurbiology
  36.                     The Rockefeller University
  37.                     1230 York Ave.
  38.                     NY, NY  10021
  39. wc tenex.c:
  40. 266     752    4787
  41. sum tenex.c: (VAX)
  42. 32982     5
  43. tenex.c:
  44. /*
  45.  * TENEX convert - convert tenex 36-bit files into standard 8-bit
  46.  *    byte stream by discarding every 9th nibble (hopefully its zero).
  47.  *    Also convert TENEX 7-bit ASCII to standard 8-bit byte ASCII by
  48.  *    discarding every 36th bit.
  49.  *
  50.  *    Written by Daniel Ts'o, dan@rna.rockefeller.edu, 9/7/88
  51.  *
  52.  *    Usage: tenex [-[t|b]] [-[v|q]] [files...]
  53.  *
  54.  *    -t    Convert 5x7bit ASCII (35+1bit packing) into 8-bit byte stream
  55.  *    -b    Convert 4*8bit binary (32+4bit packing) into 8-bit byte stream
  56.             (Default is -b)
  57.  *    -v    Print progress on stderr
  58.  *    -q    Quietly delete nonzero bits
  59.  *
  60.  *    If file arguments are given, they are converted "in place", using
  61.  *        temporary file "tenex.tmp".
  62.  *    If file arguments are missing, convert stdin to stdout (filter mode).
  63.  *
  64.  *    Compile with MSC 5.0 on MSDOS:
  65.  *
  66.  *        cl tenex.c \lib\setargv.obj /link /NOE
  67.  *
  68.  *    to permit wildcard expansion.
  69.  */
  70.  
  71. #include <stdio.h>
  72.  
  73. #define    TEMPFILE    "tenex.tmp"
  74.  
  75. /*#define    RENAME            /* Some UNIX's don't have rename() */
  76.  
  77. #ifdef    MSDOS
  78. #define    READMODE    "rb"
  79. #define    WRITEMODE    "wb"
  80. #include <fcntl.h>
  81. #include <io.h>
  82. #else
  83. #define    READMODE    "r"
  84. #define    WRITEMODE    "w"
  85. #endif
  86.  
  87. char *nodename;
  88. int vflag = 0;
  89. int qflag = 0;
  90. int tflag = 0;
  91.  
  92. main(c,v)
  93. char **v;
  94. {
  95.     register int i,f;
  96.     FILE *ifd, *ofd;
  97.     char ibuf[BUFSIZ];
  98.     char obuf[BUFSIZ];
  99.  
  100.     f = 0;
  101.     nodename = *v;
  102.     setbuf(stdin, ibuf);
  103.     setbuf(stdout, obuf);
  104.     while (c > 1 && v[1][0] == '-') {
  105.         c--;
  106.         v++;
  107.         switch (v[0][1]) {
  108.         case 'v':
  109.             vflag++;
  110.             break;
  111.         case 'q':
  112.             qflag++;
  113.             break;
  114.         case 't':
  115.             tflag++;
  116.             break;
  117.         case 'b':
  118.             tflag = 0;
  119.             break;
  120.         default:
  121.             fprintf(stderr, "%s:%s: Bad option\n", nodename, *v);
  122.             exit(-1);
  123.         }
  124.     }
  125.  
  126. #ifdef    MSDOS
  127.     if (setmode(fileno(stdin), O_BINARY) == -1
  128.         || setmode(fileno(stdout), O_BINARY) == -1) {
  129.         fprintf(stderr, "%s: Cannot setmode on stdio\n", nodename);
  130.         exit(1);
  131.     }
  132. #endif
  133.  
  134.     if (--c <= 0)
  135.         exit(xfer(stdin, stdout, "(stdin)"));
  136.     else {
  137.         while (c--) {
  138.             v++;
  139.             if (**v == '-' && v[0][1] == 0) {
  140.                 xfer(stdin, stdout, "(stdin)");
  141.                 clearerr(stdin);
  142.             }
  143.             else {
  144.                 unlink(TEMPFILE);
  145.                 if ((ifd = fopen(*v, READMODE)) == NULL) {
  146.                     fprintf(stderr, "%s: %s: Can't open\n",
  147.                         nodename, *v);
  148.                     f++;
  149.                     break;
  150.                 }
  151.                 else if ((ofd = fopen(TEMPFILE, WRITEMODE))
  152.                     == NULL) {
  153.                     fprintf(stderr, "%s: %s: Can't open\n",
  154.                         nodename, TEMPFILE);
  155.                     f++;
  156.                     break;
  157.                 }
  158.                 else if (xfer(ifd, ofd, *v) == 0) {
  159.                     fclose(ifd);
  160.                     fclose(ofd);
  161.                     if (unlink(*v)) {
  162.                         fprintf(stderr,
  163.                         "%s: %s: Can't unlink\n",
  164.                         nodename, *v);
  165.                         f++;
  166.                         break;
  167.                     }
  168.                     if (rename(TEMPFILE, *v)) {
  169.                         fprintf(stderr,
  170.                         "%s: %s: Can't rename\n",
  171.                         nodename, *v);
  172.                         f++;
  173.                         break;
  174.                     }
  175.                 }
  176.             }
  177.         }
  178.     }
  179.     exit(f ? -1 : 0);
  180. }
  181.  
  182. xfer(ifd, ofd, name)
  183. FILE *ifd;
  184. FILE *ofd;
  185. char *name;
  186. {
  187.     if (vflag) {
  188.         fprintf(stderr, "%s: %s", nodename, name);
  189.         if (tflag)
  190.             fprintf(stderr, " (text mode)\n");
  191.         else
  192.             fprintf(stderr, " (binary mode)\n");
  193.     }
  194.     if (tflag)
  195.         return txfer(ifd, ofd, name);
  196.     else
  197.         return bxfer(ifd, ofd, name);
  198. }
  199.  
  200. bxfer(ifd, ofd, name)
  201. FILE *ifd;
  202. FILE *ofd;
  203. char *name;
  204. {
  205.     register int icnt, ocnt, ncnt, ci, co, c;
  206.  
  207.     icnt = 0;
  208.     ocnt = 0;
  209.     ncnt = 0;
  210.     co = ci = c = 0;
  211.     for (;;) {
  212.         if (icnt <= 0) {
  213.             if ((ci = getc(ifd)) == EOF) {
  214.                 if (ocnt > 0) {
  215.                     fprintf(stderr, "%s: 0x%x: Warning, unpaired ending nibble in file %s\n", nodename, co, name);
  216.                     putc(co, ofd);
  217.                 }
  218.                 break;
  219.             }
  220.             else {
  221.                 icnt = 1;
  222.                 c = ci>>4;
  223.             }
  224.         }
  225.         else {
  226.             icnt = 0;
  227.             c = ci&017;
  228.         }
  229.         if (++ncnt >= 9) {
  230.             ncnt = 0;
  231.             if (c != 0 && !qflag)
  232.                 fprintf(stderr, "%s: 0x%x: Warning, nonzero nibble discarded from file %s\n", nodename, c, name);
  233.             continue;
  234.         }
  235.         if (++ocnt >= 2) {
  236.             co |= c;
  237.             putc(co, ofd);
  238.             if (ferror(ofd))
  239.                 break;
  240.             co = 0;
  241.             ocnt = 0;
  242.         }
  243.         else
  244.             co |= c<<4;
  245.     }
  246.     fflush(ofd);
  247. }
  248.  
  249. txfer(ifd, ofd, name)
  250. FILE *ifd;
  251. FILE *ofd;
  252. char *name;
  253. {
  254.     register int icnt, ocnt, ncnt, ci, co, c;
  255.  
  256.     icnt = 0;
  257.     ocnt = 0;
  258.     ncnt = 0;
  259.     co = ci = c = 0;
  260.     for (;;) {
  261.         if (icnt <= 0) {
  262.             if ((ci = getc(ifd)) == EOF) {
  263.                 if (ocnt > 0) {
  264.                     fprintf(stderr, "%s: 0x%x: Warning, incomplete ending byte in file %s\n", nodename, co, name);
  265.                     putc(co, ofd);
  266.                 }
  267.                 break;
  268.             }
  269.             else {
  270.                 ci &= 0377;
  271.                 icnt = 7;
  272.                 c = ci>>7;
  273.             }
  274.         }
  275.         else {
  276.             icnt--;
  277.             c = (ci>>icnt)&1;
  278.         }
  279.         if (++ncnt >= 36) {
  280.             ncnt = 0;
  281.             if (c != 0 && !qflag)
  282.                 fprintf(stderr, "%s: Warning, nonzero bit discarded from file %s\n", nodename, name);
  283.             continue;
  284.         }
  285.         if (++ocnt >= 7) {
  286.             co |= c;
  287.             putc(co, ofd);
  288.             if (ferror(ofd))
  289.                 break;
  290.             co = 0;
  291.             ocnt = 0;
  292.         }
  293.         else
  294.             co |= c<<(7-ocnt);
  295.     }
  296.     fflush(ofd);
  297. }
  298.  
  299. #ifdef    RENAME
  300. rename(a, b)
  301. char *a, *b;
  302. {
  303.     register int f;
  304.  
  305.     if (f = link(a, b))
  306.         return f;
  307.     return unlink(a);
  308. }
  309. #endif
  310.