summaryrefslogtreecommitdiff
path: root/systems/knuth/local/web-sparc/tangext.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /systems/knuth/local/web-sparc/tangext.c
Initial commit
Diffstat (limited to 'systems/knuth/local/web-sparc/tangext.c')
-rw-r--r--systems/knuth/local/web-sparc/tangext.c109
1 files changed, 109 insertions, 0 deletions
diff --git a/systems/knuth/local/web-sparc/tangext.c b/systems/knuth/local/web-sparc/tangext.c
new file mode 100644
index 0000000000..bcbe6e1ffc
--- /dev/null
+++ b/systems/knuth/local/web-sparc/tangext.c
@@ -0,0 +1,109 @@
+/* External procedures for tangle/weave */
+/* Written by: H. Trickey, 11/17/83 */
+/* Modified for 8-bit input by don, 8/31/89 */
+
+/* Note: these procedures aren't necessary; the default input_ln and
+ * flush_buffer routines in tangle/weave work fine on UNIX.
+ * However a very big time improvement is achieved by using these.
+ */
+
+#define BUF_SIZE 100 /* should agree with tangle.web */
+
+#include "h00vars.h" /* defines Pascal I/O structure */
+
+extern short buffer[]; /* 0..BUF_SIZE. Input goes here */
+extern short outbuf[]; /* 0..OUT_BUF_SIZE. Output from here */
+extern short xord[];
+extern char xchr[]; /* character translation arrays */
+extern char limit; /* index into buffer, defined in the range
+ 0..BUF_SIZE (and note that this is a
+ char rather than a short because BUF_SIZE
+ is 100) */
+
+/*
+ * lineread reads from the Pascal text file with iorec pointer filep
+ * into buffer[0], buffer[1],..., buffer[limit-1] (and
+ * setting "limit").
+ * Characters are read until a newline is found (which isn't put in the
+ * buffer) or until the next character would go into buffer[BUF_SIZE].
+ * And trailing blanks are to be ignored, so limit is really set to
+ * one past the last non-blank.
+ * The characters need to be translated, so really xord[c] is put into
+ * the buffer when c is read.
+ * If end-of-file is encountered, the funit field of *filep is set
+ * appropriately.
+ */
+lineread(filep)
+ struct iorec *filep;
+{
+ register int c;
+ register short *cs; /* pointer into buffer where next char goes */
+ register short *cnb; /* last non-blank character input */
+ register FILE *iop; /* stdio-style FILE pointer */
+ register int l; /* how many chars before buffer overflow */
+
+ iop = filep->fbuf;
+ cnb = cs = &buffer[0];
+ l = BUF_SIZE;
+
+ /* overflow when next char would go into buffer[BUF_SIZE] */
+ while ((--l >= 0) && ((c = getc(iop)) != EOF) && (c != '\n')) {
+ if ((*cs++ = xord[c]) != ' ')
+ cnb = cs;
+ }
+
+ if (c == EOF)
+ filep->funit |= EOFF; /* we hit end-of-file */
+
+ limit = (cnb - &buffer[0]);
+}
+
+/*
+ * linewrite writes to the Pascal text file with iorec pointer filep
+ * from outbuf[0], outbuf[1],..., outbuf[cnt-1].
+ * Translation is done, so that xchr[c] is output instead of c.
+ */
+linewrite(filep, cnt)
+ struct iorec *filep;
+ int cnt;
+{
+ register FILE *iop; /* stdio-style FILE pointer */
+ register short *cs; /* pointer to next character to output */
+ register int l; /* how many characters left to output */
+
+ iop = filep->fbuf;
+ cs = &outbuf[0];
+ l = cnt;
+
+ while (--l >= 0)
+ putc(xchr[*cs++], iop);
+}
+
+/*
+ * testeof(filep)
+ *
+ * Test whether or not the Pascal text file with iorec pointer filep
+ * has reached end-of-file (when the only I/O on it is done with
+ * lineread, above).
+ * We may have to read the next character and unget it to see if perhaps
+ * the end-of-file is next.
+ */
+bool
+testeof(filep)
+ register struct iorec *filep;
+{
+ register char c;
+ register FILE *iop; /* stdio-style FILE pointer */
+ if (filep->funit & EOFF)
+ return(TRUE);
+ else { /* check to see if next is EOF */
+ iop = filep->fbuf;
+ c = getc(iop);
+ if (c == EOF)
+ return(TRUE);
+ else {
+ ungetc(c,iop);
+ return(FALSE);
+ }
+ }
+}