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