aboutsummaryrefslogtreecommitdiff
path: root/sys/qpoe/gen/qprlmerged.x
diff options
context:
space:
mode:
Diffstat (limited to 'sys/qpoe/gen/qprlmerged.x')
-rw-r--r--sys/qpoe/gen/qprlmerged.x134
1 files changed, 134 insertions, 0 deletions
diff --git a/sys/qpoe/gen/qprlmerged.x b/sys/qpoe/gen/qprlmerged.x
new file mode 100644
index 00000000..d08f4e5f
--- /dev/null
+++ b/sys/qpoe/gen/qprlmerged.x
@@ -0,0 +1,134 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <mach.h>
+include "../qpex.h"
+
+# QP_RLMERGE -- Merge (AND) two range lists. Only ranges which are
+# common to both range lists are output. The number of ranges in the
+# output range list is returned as the function value.
+
+int procedure qp_rlmerged (os,oe,olen, xs,xe,nx, ys,ye,ny)
+
+pointer os, oe #U output range list
+int olen #U allocated length of OS, OE arrays
+
+double xs[ARB], xe[ARB] #I range list to be merged with
+int nx #I number of ranges in X list
+double ys[ARB], ye[ARB] #I range list to be merged with X
+int ny #I number of ranges in Y list
+
+double o1, o2
+int nx_out, xi, yi, i
+double qp_minvald(), qp_maxvald()
+bool qp_lessthand()
+errchk realloc
+
+begin
+ nx_out = 0
+ if (nx <= 0 || ny <= 0)
+ return (0)
+
+ xi = 1
+ yi = 1
+
+ do i = 1, ARB {
+ # Find a pair of ranges which intersect.
+ repeat {
+ if (qp_lessthand (xe[xi], ys[yi])) {
+ if (xi >= nx)
+ return (nx_out)
+ else
+ xi = xi + 1
+ } else if (qp_lessthand (ye[yi], xs[xi])) {
+ if (yi >= ny)
+ return (nx_out)
+ else
+ yi = yi + 1
+ } else
+ break
+ }
+
+ # Compute the intersection.
+ o1 = qp_maxvald (xs[xi], ys[yi])
+ o2 = qp_minvald (xe[xi], ye[yi])
+
+ # Output the range.
+ if (nx_out + 1 > olen) {
+ olen = max (DEF_XLEN, olen * 2)
+ call realloc (os, olen, TY_DOUBLE)
+ call realloc (oe, olen, TY_DOUBLE)
+ }
+
+ Memd[os+nx_out] = o1
+ Memd[oe+nx_out] = o2
+ nx_out = nx_out + 1
+
+ # Advance to the next range.
+ if (xi < nx && qp_lessthand (xe[xi], ye[yi]))
+ xi = xi + 1
+ else if (yi < ny)
+ yi = yi + 1
+ else
+ break
+ }
+
+ return (nx_out)
+end
+
+
+# QP_MINVAL -- Return the lesser of two values, where either value can
+# be an open range.
+
+double procedure qp_minvald (x, y)
+
+double x #I first value
+double y #I second value
+
+bool qp_lessthand()
+
+begin
+ if (qp_lessthand (x, y))
+ return (x)
+ else
+ return (y)
+end
+
+
+# QP_MAXVAL -- Return the greater of two values, where either value can
+# be an open range.
+
+double procedure qp_maxvald (x, y)
+
+double x #I first value
+double y #I second value
+
+bool qp_lessthand()
+
+begin
+ if (qp_lessthand (x, y))
+ return (y)
+ else
+ return (x)
+end
+
+
+# QP_LESSTHAN -- Test if X is less than Y, where X and Y can be open
+# range values.
+
+bool procedure qp_lessthand (x, y)
+
+double x #I first value
+double y #I second value
+
+begin
+ if (IS_LEFTD(x))
+ return (!IS_LEFTD(y))
+ else if (IS_RIGHTD(x))
+ return (false)
+ else if (IS_LEFTD(y))
+ return (false)
+ else if (IS_RIGHTD(y))
+ return (true)
+ else
+ return (x < y)
+end