home *** CD-ROM | disk | FTP | other *** search
- /* $Header: /u/rhg/src/shar/uushar.c,v 3.49 90/09/12 15:15:26 rhg Exp $ */
-
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
-
- #ifdef MSDOS
- extern void encode (FILE *in, FILE *out);
- static void outdec (char *p, FILE *f);
- static int fr (FILE *fp, char *buf, int cnt);
- #endif /* MSDOS */
-
- /* ENC is the basic 1 character encoding function to make a char printing */
- #if 1 /* Richard H. Gumpertz (RHG@CPS.COM), 24 April 1990 */
- #define ENC(c) ((((c) + 077) & 077) + 041)
- #else /* RHG */
- #define ENC(c) ((((c) & 077) + ' ') | ((c & 077) == 0 ? 0100 : 0))
- #endif /* RHG */
-
- #ifdef MSDOS
- void
- #endif
- encode (in, out)
- FILE *in;
- FILE *out;
- {
- char buf[80];
- int i, n;
-
- for (;;)
- {
- /* 1 (up to) 45 character line */
- n = fr (in, buf, 45);
- putc (ENC (n), out);
-
- for (i = 0; i < n; i += 3)
- outdec (&buf[i], out);
-
- putc ('\n', out);
- if (n <= 0)
- break;
- }
- }
-
- /*
- * output one group of 3 bytes, pointed at by p, on file f.
- */
- #ifdef MSDOS
- void
- #endif
- outdec (p, f)
- char *p;
- FILE *f;
- {
- int c1, c2, c3, c4;
-
- c1 = *p >> 2;
- c2 = (*p << 4) & 060 | (p[1] >> 4) & 017;
- c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 03;
- c4 = p[2] & 077;
- putc (ENC (c1), f);
- putc (ENC (c2), f);
- putc (ENC (c3), f);
- putc (ENC (c4), f);
- }
-
- /* fr: like read but stdio */
- int
- fr (fp, buf, cnt)
- FILE *fp;
- char *buf;
- int cnt;
- {
- int c, i;
-
- for (i = 0; i < cnt; i++)
- {
- c = getc (fp);
- if (c == EOF)
- return (i);
- buf[i] = c;
- }
- return (cnt);
- }
- /* vi: set tabstop=4 shiftwidth=4: */
-