|
|
1.1 root 1: /* btoa: version 4.0
2: * stream filter to change 8 bit bytes into printable ascii
3: * computes the number of bytes, and three kinds of simple checksums
4: * incoming bytes are collected into 32-bit words, then printed in base 85
5: * exp(85,5) > exp(2,32)
6: * the ASCII characters used are between '!' and 'u'
7: * 'z' encodes 32-bit zero; 'x' is used to mark the end of encoded data.
8: *
9: * Paul Rutter Joe Orost
10: * philabs!per petsd!joe
11: *
12: * WARNING: this version is not compatible with the original as sent out
13: * on the net. The original encoded from ' ' to 't'; which cause problems
14: * with some mailers (stripping off trailing blanks).
15: */
16:
17: #include <stdio.h>
18:
19: #define reg register
20:
21: #define MAXPERLINE 78
22:
23: long int Ceor = 0;
24: long int Csum = 0;
25: long int Crot = 0;
26:
27: long int ccount = 0;
28: long int bcount = 0;
29: long int word;
30:
31: #define EN(c) (int) ((c) + '!')
32:
33: encode(c)
34: reg c;
35: {
36: Ceor ^= c;
37: Csum += c;
38: Csum += 1;
39: if ((Crot & 0x80000000)) {
40: Crot <<= 1;
41: Crot += 1;
42: } else {
43: Crot <<= 1;
44: }
45: Crot += c;
46:
47: word <<= 8;
48: word |= c;
49: if (bcount == 3) {
50: wordout(word);
51: bcount = 0;
52: } else {
53: bcount += 1;
54: }
55: }
56:
57: wordout(word)
58: reg long int word;
59: {
60: if (word == 0) {
61: charout('z');
62: } else {
63: reg int tmp = 0;
64:
65: if(word < 0) { /* Because some don't support unsigned long */
66: tmp = 32;
67: word = word - (long)(85 * 85 * 85 * 85 * 32);
68: }
69: if(word < 0) {
70: tmp = 64;
71: word = word - (long)(85 * 85 * 85 * 85 * 32);
72: }
73: charout(EN((word / (long)(85 * 85 * 85 * 85)) + tmp));
74: word %= (long)(85 * 85 * 85 * 85);
75: charout(EN(word / (85 * 85 * 85)));
76: word %= (85 * 85 * 85);
77: charout(EN(word / (85 * 85)));
78: word %= (85 * 85);
79: charout(EN(word / 85));
80: word %= 85;
81: charout(EN(word));
82: }
83: }
84:
85: charout(c) {
86: putchar(c);
87: ccount += 1;
88: if (ccount == MAXPERLINE) {
89: putchar('\n');
90: ccount = 0;
91: }
92: }
93:
94: main(argc,argv)
95: char **argv;
96: {
97: reg c;
98: reg long int n;
99:
100: if (argc != 1) {
101: fprintf(stderr,"bad args to %s\n", argv[0]);
102: exit(2);
103: }
104: printf("xbtoa Begin\n");
105: n = 0;
106: while ((c = getchar()) != EOF) {
107: encode(c);
108: n += 1;
109: }
110: while (bcount != 0) {
111: encode(0);
112: }
113: /* n is written twice as crude cross check*/
114: printf("\nxbtoa End N %ld %lx E %lx S %lx R %lx\n", n, n, Ceor, Csum, Crot);
115: exit(0);
116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.