aboutsummaryrefslogtreecommitdiff
path: root/sys/gio/cursor/gtrtrunc.x
diff options
context:
space:
mode:
Diffstat (limited to 'sys/gio/cursor/gtrtrunc.x')
-rw-r--r--sys/gio/cursor/gtrtrunc.x39
1 files changed, 39 insertions, 0 deletions
diff --git a/sys/gio/cursor/gtrtrunc.x b/sys/gio/cursor/gtrtrunc.x
new file mode 100644
index 00000000..6abda3ba
--- /dev/null
+++ b/sys/gio/cursor/gtrtrunc.x
@@ -0,0 +1,39 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <gio.h>
+include <gki.h>
+include "gtr.h"
+
+# GTR_TRUNCATE -- Truncate the frame buffer, which has grown larger than
+# the limit set by the user (or the system default). This is done by moving
+# the metacode data at the end of the buffer (beginning with the word pointed
+# to by gki) to the maximum upper limit of the buffer and adjusting the input
+# and output pointers accordingly.
+
+procedure gtr_truncate (tr, gki)
+
+pointer tr # giotr descriptor
+pointer gki # pointer to first word to be preserved
+pointer top
+int nwords
+
+begin
+ # Find the first instruction preceding the soft upper limit on the
+ # size of the buffer.
+
+ top = TR_FRAMEBUF(tr) + TR_MAXLENFRAMEBUF(tr)
+ while (Mems[top] != BOI && top > TR_FRAMEBUF(tr))
+ top = top - 1
+
+ # Move the partial instruction likely to be at the end of the buffer
+ # to the new "top". Note that we can only truncate (discard)
+ # instructions which have already been executed, hence the partial
+ # instruction at the end of the buffer must be preserved.
+
+ if (gki != top) {
+ nwords = TR_OP(tr) - gki
+ call amovs (Mems[gki], Mems[top], nwords)
+ TR_IP(tr) = top
+ TR_OP(tr) = top + nwords
+ }
+end