home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / shar349.zip / src / uushar.c < prev    next >
C/C++ Source or Header  |  1992-02-22  |  2KB  |  86 lines

  1. /* $Header: /u/rhg/src/shar/uushar.c,v 3.49 90/09/12 15:15:26 rhg Exp $ */
  2.  
  3. #include <stdio.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6.   
  7. #ifdef MSDOS
  8. extern void encode (FILE *in, FILE *out);
  9. static void outdec (char *p, FILE *f);
  10. static int fr (FILE *fp, char *buf, int cnt);
  11. #endif /* MSDOS */
  12.  
  13. /* ENC is the basic 1 character encoding function to make a char printing */
  14. #if 1 /* Richard H. Gumpertz (RHG@CPS.COM), 24 April 1990 */
  15. #define ENC(c) ((((c) + 077) & 077) + 041)
  16. #else /* RHG */
  17. #define ENC(c) ((((c) & 077) + ' ') | ((c & 077) == 0 ? 0100 : 0))
  18. #endif /* RHG */
  19.  
  20. #ifdef MSDOS
  21. void
  22. #endif
  23. encode (in, out)
  24.     FILE *in;
  25.     FILE *out;
  26. {
  27.     char  buf[80];
  28.     int  i, n;
  29.  
  30.     for (;;)
  31.     {
  32.     /* 1 (up to) 45 character line */
  33.     n = fr (in, buf, 45);
  34.     putc (ENC (n), out);
  35.  
  36.     for (i = 0; i < n; i += 3)
  37.         outdec (&buf[i], out);
  38.  
  39.     putc ('\n', out);
  40.     if (n <= 0)
  41.         break;
  42.     }
  43. }
  44.  
  45. /*
  46.  * output one group of 3 bytes, pointed at by p, on file f.
  47.  */
  48. #ifdef MSDOS
  49. void
  50. #endif
  51. outdec (p, f)
  52.     char *p;
  53.     FILE *f;
  54. {
  55.     int  c1, c2, c3, c4;
  56.  
  57.     c1 = *p >> 2;
  58.     c2 = (*p << 4) & 060 | (p[1] >> 4) & 017;
  59.     c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 03;
  60.     c4 = p[2] & 077;
  61.     putc (ENC (c1), f);
  62.     putc (ENC (c2), f);
  63.     putc (ENC (c3), f);
  64.     putc (ENC (c4), f);
  65. }
  66.  
  67. /* fr: like read but stdio */
  68. int
  69. fr (fp, buf, cnt)
  70.     FILE *fp;
  71.     char *buf;
  72.     int  cnt;
  73. {
  74.     int  c, i;
  75.  
  76.     for (i = 0; i < cnt; i++)
  77.     {
  78.     c = getc (fp);
  79.     if (c == EOF)
  80.         return (i);
  81.     buf[i] = c;
  82.     }
  83.     return (cnt);
  84. }
  85. /* vi: set tabstop=4 shiftwidth=4: */
  86.