+
+static char partab[0200];
+static int bits8;
+
+/*
+ * Do a write to the remote machine with the correct parity.
+ * We are doing 8 bit wide output, so we just generate a character
+ * with the right parity and output it.
+ */
+pwrite(fd, buf, n)
+ int fd;
+ char *buf;
+ register int n;
+{
+ register int i;
+ register char *bp;
+ extern int errno;
+
+ bp = buf;
+ if (bits8 == 0)
+ for (i = 0; i < n; i++) {
+ *bp = partab[(*bp) & 0177];
+ bp++;
+ }
+ if (write(fd, buf, n) < 0) {
+ if (errno == EIO)
+ abort("Lost carrier.");
+ /* this is questionable */
+ perror("write");
+ }
+}
+
+/*
+ * Build a parity table with appropriate high-order bit.
+ */
+setparity(defparity)
+ char *defparity;
+{
+ register int i;
+ char *parity;
+ extern char evenpartab[];
+
+ if (value(PARITY) == NOSTR)
+ value(PARITY) = defparity;
+ parity = value(PARITY);
+ if (equal(parity, "none")) {
+ bits8 = 1;
+ return;
+ } else
+ bits8 = 0;
+ for (i = 0; i < 0200; i++)
+ partab[i] = evenpartab[i];
+ if (equal(parity, "even"))
+ return;
+ if (equal(parity, "odd")) {
+ for (i = 0; i < 0200; i++)
+ partab[i] ^= 0200; /* reverse bit 7 */
+ return;
+ }
+ if (equal(parity, "zero")) {
+ for (i = 0; i < 0200; i++)
+ partab[i] &= ~0200; /* turn off bit 7 */
+ return;
+ }
+ if (equal(parity, "one")) {
+ for (i = 0; i < 0200; i++)
+ partab[i] |= 0200; /* turn on bit 7 */
+ return;
+ }
+ fprintf(stderr, "%s: unknown parity value\n", PA);
+ fflush(stderr);
+}