|
|
1.1 root 1: /* atob: version 4.0
2: * stream filter to change printable ascii from "btoa" back into 8 bit bytes
3: * if bad chars, or Csums do not match: exit(1) [and NO output]
4: *
5: * Paul Rutter Joe Orost
6: * philabs!per petsd!joe
7: */
8:
9: #include <stdio.h>
10:
11: #define reg register
12:
13: #define streq(s0, s1) strcmp(s0, s1) == 0
14:
15: #define times85(x) ((((((x<<2)+x)<<2)+x)<<2)+x)
16:
17: long int Ceor = 0;
18: long int Csum = 0;
19: long int Crot = 0;
20: long int word = 0;
21: long int bcount = 0;
22:
23: fatal() {
24: fprintf(stderr, "bad format or Csum to atob\n");
25: exit(1);
26: }
27:
28: #define DE(c) ((c) - '!')
29:
30: decode(c)
31: reg c;
32: {
33: if (c == 'z') {
34: if (bcount != 0) {
35: fatal();
36: } else {
37: byteout(0);
38: byteout(0);
39: byteout(0);
40: byteout(0);
41: }
42: } else if ((c >= '!') && (c < ('!' + 85))) {
43: if (bcount == 0) {
44: word = DE(c);
45: ++bcount;
46: } else if (bcount < 4) {
47: word = times85(word);
48: word += DE(c);
49: ++bcount;
50: } else {
51: word = times85(word) + DE(c);
52: byteout((int)((word >> 24) & 255));
53: byteout((int)((word >> 16) & 255));
54: byteout((int)((word >> 8) & 255));
55: byteout((int)(word & 255));
56: word = 0;
57: bcount = 0;
58: }
59: } else {
60: fatal();
61: }
62: }
63:
64: FILE *tmp_file;
65:
66: byteout(c)
67: reg c;
68: {
69: Ceor ^= c;
70: Csum += c;
71: Csum += 1;
72: if ((Crot & 0x80000000)) {
73: Crot <<= 1;
74: Crot += 1;
75: } else {
76: Crot <<= 1;
77: }
78: Crot += c;
79: putc(c, tmp_file);
80: }
81:
82: main(argc, argv)
83: char **argv;
84: {
85: reg c;
86: reg long int i;
87: char tmp_name[100];
88: char buf[100];
89: long int n1, n2, oeor, osum, orot;
90:
91: if (argc != 1) {
92: fprintf(stderr,"bad args to %s\n", argv[0]);
93: exit(2);
94: }
95: sprintf(tmp_name, "/usr/tmp/atob.%x", getpid());
96: tmp_file = fopen(tmp_name, "w+");
97: if (tmp_file == NULL) {
98: fatal();
99: }
100: unlink(tmp_name); /* Make file disappear */
101: /*search for header line*/
102: for (;;) {
103: if (fgets(buf, sizeof buf, stdin) == NULL) {
104: fatal();
105: }
106: if (streq(buf, "xbtoa Begin\n")) {
107: break;
108: }
109: }
110:
111: while ((c = getchar()) != EOF) {
112: if (c == '\n') {
113: continue;
114: } else if (c == 'x') {
115: break;
116: } else {
117: decode(c);
118: }
119: }
120: if(scanf("btoa End N %ld %lx E %lx S %lx R %lx\n",
121: &n1, &n2, &oeor, &osum, &orot) != 5) {
122: fatal();
123: }
124: if ((n1 != n2) || (oeor != Ceor) || (osum != Csum) || (orot != Crot)) {
125: fatal();
126: } else {
127: /*copy OK tmp file to stdout*/;
128: fseek(tmp_file, 0L, 0);
129: for (i = n1; --i >= 0;) {
130: putchar(getc(tmp_file));
131: }
132: }
133: exit(0);
134: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.