|
|
1.1 root 1: /*
2: * seal - prepare a package for shipment
3: */
4:
5: #include "asd.h"
6: #include "seal.h"
7: #include <ctype.h>
8: #include <string.h>
9:
10: static long length;
11: static unsigned long checksum;
12:
13: /*
14: * convert the characters in the range (in,inend] to
15: * storage starting at "out" -- return the number of
16: * output characters.
17: */
18:
19: static int
20: hrform (char *in, char *inend, char *out)
21: {
22: register char *r = out;
23:
24: /* special handling for the first character(s) */
25: if (in < inend) {
26: if (*in == '.' || *in == '!' ||
27: (*in == 'F' && strncmp (in, "From", 4) == 0))
28: *r++ = '\\';
29:
30: do {
31: register int ch = (unsigned char) *in++;
32:
33: if (isprint (ch)) {
34: if (ch == '\\')
35: *r++ = '\\';
36: *r++ = ch;
37: } else {
38: if (ch == ' ' || ch == '\t' || ch == '\n')
39: *r++ = ch;
40: else {
41: *r++ = '\\';
42: *r++ = hextab[(ch >> 4) & 0xf];
43: *r++ = hextab[ch & 0xf];
44: }
45: }
46: } while (in < inend);
47:
48: if (r[-1] != '\n') {
49: *r++ = '\\';
50: *r++ = '\n';
51: }
52: }
53:
54: return r - out;
55: }
56:
57: static int
58: mrform (char *in, char *inend, char *out)
59: {
60: char *r;
61: register int len;
62:
63: len = inend - in;
64: if (len <= 0)
65: return 0;
66:
67: r = out;
68:
69: *r++ = '.';
70:
71: do {
72: register unsigned long bits;
73: register int n, outn;
74: register char *rr;
75:
76: n = len;
77: if (n > INCPW)
78: n = INCPW;
79: len -= n;
80: outn = n + OUTCPW - INCPW;
81:
82: bits = 0;
83: do bits = (bits << BPC) | (*in++ & BYTEMASK);
84: while (--n > 0);
85:
86: rr = r = r + outn;
87: do {
88: *--rr = RADBASE + bits % RADIX;
89: bits /= RADIX;
90: } while (--outn > 0);
91: } while (len > 0);
92:
93: *r++ = '\n';
94:
95: return r - out;
96: }
97:
98:
99: static int
100: seal (FILE *f, char *fname)
101: {
102: static int first = 1;
103:
104: if (first) {
105: first = 0;
106: printf ("!<seal>\n");
107: }
108:
109: do {
110: char line[MAXLINE];
111: char outline[MAXLINE*3+10];
112: register char *p, *endl;
113: register int ch;
114:
115: /* read a line, possibly short */
116: p = line;
117: endl = line + MAXLINE;
118:
119: do {
120: ch = getc (f);
121: if (ch == EOF)
122: break;
123: *p++ = ch;
124: } while (ch != '\n' && p < endl);
125:
126: endl = p;
127:
128: /*
129: * endl now points one past the last char
130: * in the line we have read. If we didn't
131: * get any characters at all, we're done.
132: */
133:
134: if (line == endl)
135: return ferror (f) != 0;
136:
137: length += endl - line;
138:
139: /* now convert the line to external form */
140: ch = hrform (line, endl, outline);
141: if (ch > (endl - line + INCPW - 1) / INCPW * OUTCPW + 2)
142: ch = mrform (line, endl, outline);
143: p = outline;
144:
145: /* if encrypting, do so */
146: if (kflag || Kflag)
147: mangle (line, endl);
148:
149: /* accumulate the (possibly encrypted) checksum */
150: checksum = mkcsum (checksum, line, endl);
151:
152: while (--ch >= 0)
153: putchar (*p++);
154: } while (!feof (f) && !ferror (f));
155:
156: return ferror (f) != 0;
157: }
158:
159: int
160: main (int argc, char **argv)
161: {
162: int rc = 0;
163: static char stdbuf[BUFSIZ];
164:
165: setbuf (stdout, stdbuf);
166:
167: length = 0;
168: checksum = 0;
169:
170: rc = getargs (argc, argv, "kK:", seal);
171:
172: printf ("!end %ld %lu\n", length, checksum);
173:
174: return rc;
175: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.