aboutsummaryrefslogtreecommitdiff
path: root/pkg/images/tv/tvmark/mkremove.x
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/images/tv/tvmark/mkremove.x')
-rw-r--r--pkg/images/tv/tvmark/mkremove.x98
1 files changed, 98 insertions, 0 deletions
diff --git a/pkg/images/tv/tvmark/mkremove.x b/pkg/images/tv/tvmark/mkremove.x
new file mode 100644
index 00000000..589fc039
--- /dev/null
+++ b/pkg/images/tv/tvmark/mkremove.x
@@ -0,0 +1,98 @@
+# MK_REMOVE -- Check the deletions for uniqueness and delete unwanted objects
+# from the coordinates file.
+
+procedure mk_remove (coords, deletions, cl, dl, ndelete)
+
+char coords[ARB] # coordinate file name
+char deletions[ARB] # deletions file name
+int cl # coordinate file descriptor
+int dl # deletions file descriptor
+int ndelete # number of deletions
+
+int i, ndel, nobj, obj, tcl, tdl, stat
+pointer sp, id, tclname, tdlname, line
+real xval, yval
+int fscan(), nscan(), open(), getline()
+
+begin
+ call smark (sp)
+ call salloc (id, ndelete, TY_INT)
+ call salloc (tclname, SZ_FNAME, TY_CHAR)
+ call salloc (tdlname, SZ_FNAME, TY_CHAR)
+ call salloc (line, SZ_LINE, TY_CHAR)
+
+ # Rewind both files to the beginning.
+ call seek (cl, BOF)
+ call seek (dl, BOF)
+
+ # Read in the ids of objects to be deleted.
+ ndel = 0
+ while (fscan (dl) != EOF) {
+ call gargi (Memi[id+ndel])
+ ndel = ndel + 1
+ }
+
+ # Sort the id numbers.
+ call asrti (Memi[id], Memi[id], ndelete)
+
+ # Remove id numbers that are not unique.
+ ndel = 1
+ do i = 2, ndelete {
+ if (Memi[id+i-1] == Memi[id+i-2])
+ next
+ ndel = ndel + 1
+ Memi[id+ndel-1] = Memi[id+i-1]
+ }
+
+ # Open two temporary files.
+ call mktemp ("tcl", Memc[tclname], SZ_FNAME)
+ call mktemp ("tdl", Memc[tdlname], SZ_FNAME)
+ tcl = open (Memc[tclname], NEW_FILE, TEXT_FILE)
+ tdl = open (Memc[tdlname], NEW_FILE, TEXT_FILE)
+
+ nobj = 0
+ do i = 1, ndel {
+
+ obj = Memi[id+i-1]
+
+ repeat {
+
+ stat = getline (cl, Memc[line])
+ if (stat == EOF)
+ break
+
+ call sscan (Memc[line])
+ call gargr (xval)
+ call gargr (yval)
+ if (nscan () < 2) {
+ call putline (tcl, Memc[line])
+ next
+ }
+
+ nobj = nobj + 1
+ if (nobj < obj)
+ call putline (tcl, Memc[line])
+ else
+ call putline (tdl, Memc[line])
+
+ } until (nobj >= obj)
+ }
+
+ # Copy the remainder of the file.
+ while (getline (cl, Memc[line]) != EOF)
+ call putline (tcl, Memc[line])
+
+ # Cleanup the coords file.
+ call close (cl)
+ call close (tcl)
+ call delete (coords)
+ call rename (Memc[tclname], coords)
+
+ # Cleanup the delete file.
+ call close (dl)
+ call close (tdl)
+ call delete (deletions)
+ call rename (Memc[tdlname], deletions)
+
+ call sfree (sp)
+end