aboutsummaryrefslogtreecommitdiff
path: root/pkg/images/tv/tvmark/mkgmarks.x
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/images/tv/tvmark/mkgmarks.x')
-rw-r--r--pkg/images/tv/tvmark/mkgmarks.x214
1 files changed, 214 insertions, 0 deletions
diff --git a/pkg/images/tv/tvmark/mkgmarks.x b/pkg/images/tv/tvmark/mkgmarks.x
new file mode 100644
index 00000000..46e9bf05
--- /dev/null
+++ b/pkg/images/tv/tvmark/mkgmarks.x
@@ -0,0 +1,214 @@
+include <lexnum.h>
+include <ctype.h>
+
+# MK_GMARKS -- Procedure to extract mark values from a string
+
+int procedure mk_gmarks (str, marks, max_nmarks)
+
+char str[ARB] # string
+real marks[ARB] # number of marks
+int max_nmarks # maximum number of marks
+
+int fd, nmarks
+int open(), mk_rdmarks(), mk_decmarks()
+errchk open(), close()
+
+begin
+ nmarks = 0
+
+ iferr {
+ fd = open (str, READ_ONLY, TEXT_FILE)
+ nmarks = mk_rdmarks (fd, marks, max_nmarks)
+ call close (fd)
+ } then {
+ nmarks = mk_decmarks (str, marks, max_nmarks)
+ }
+
+ return (nmarks)
+end
+
+
+# MK_RDMARKS -- Procedure to read out the marks listed one per line
+# from a file.
+
+int procedure mk_rdmarks (fd, marks, max_nmarks)
+
+int fd # aperture list file descriptor
+real marks[ARB] # list of marks
+int max_nmarks # maximum number of apertures
+
+int nmarks
+pointer sp, line
+int getline(), mk_decmarks()
+
+begin
+ call smark (sp)
+ call salloc (line, SZ_LINE, TY_CHAR)
+
+ nmarks = 0
+ while (getline (fd, Memc[line]) != EOF && nmarks < max_nmarks) {
+ nmarks = nmarks + mk_decmarks (Memc[line], marks[1+nmarks],
+ max_nmarks - nmarks)
+ }
+
+ call sfree (sp)
+
+ return (nmarks)
+end
+
+
+# MK_DECAPERTS -- Procedure to decode the mark string.
+
+int procedure mk_decmarks (str, marks, max_nmarks)
+
+char str[ARB] # aperture string
+real marks[ARB] # aperture array
+int max_nmarks # maximum number of apertures
+
+char outstr[SZ_LINE]
+int nmarks, ip, op, ndecode, nmk
+real mkstart, mkend, mkstep
+bool fp_equalr()
+int gctor()
+
+begin
+ nmarks = 0
+
+ for (ip = 1; str[ip] != EOS && nmarks < max_nmarks;) {
+
+ mkstart = 0.0
+ mkend = 0.0
+ mkstep = 0.0
+ ndecode = 0
+
+ # Skip past white space and commas.
+ while (IS_WHITE(str[ip]))
+ ip = ip + 1
+ if (str[ip] == ',')
+ ip = ip + 1
+
+ # Get the number.
+ op = 1
+ while (IS_DIGIT(str[ip]) || str[ip] == '.') {
+ outstr[op] = str[ip]
+ ip = ip + 1
+ op = op + 1
+ }
+ outstr[op] = EOS
+
+ # Decode the starting aperture.
+ op = 1
+ if (gctor (outstr, op, mkstart) > 0) {
+ mkend = mkstart
+ ndecode = 1
+ } else
+ mkstart = 0.0
+
+ # Skip past white space and commas.
+ while (IS_WHITE(str[ip]))
+ ip = ip + 1
+ if (str[ip] == ',')
+ ip = ip + 1
+
+ # Get the ending aperture
+ if (str[ip] == ':') {
+ ip = ip + 1
+
+ # Get the ending aperture.
+ op = 1
+ while (IS_DIGIT(str[ip]) || str[ip] == '.') {
+ outstr[op] = str[ip]
+ ip = ip + 1
+ op = op + 1
+ }
+ outstr[op] = EOS
+
+ # Decode the ending aperture.
+ op = 1
+ if (gctor (outstr, op, mkend) > 0) {
+ ndecode = 2
+ mkstep = mkend - mkstart
+ }
+ }
+
+ # Skip past white space and commas.
+ while (IS_WHITE(str[ip]))
+ ip = ip + 1
+ if (str[ip] == ',')
+ ip = ip + 1
+
+ # Get the step size.
+ if (str[ip] == ':') {
+ ip = ip + 1
+
+ # Get the step size.
+ op = 1
+ while (IS_DIGIT(str[ip]) || str[ip] == '.') {
+ outstr[op] = str[ip]
+ ip = ip + 1
+ op = op + 1
+ }
+ outstr[op] = EOS
+
+ # Decode the step size.
+ op = 1
+ if (gctor (outstr, op, mkstep) > 0) {
+ if (fp_equalr (mkstep, 0.0))
+ mkstep = mkend - mkstart
+ else
+ ndecode = (mkend - mkstart) / mkstep + 1
+ if (ndecode < 0) {
+ ndecode = -ndecode
+ mkstep = - mkstep
+ }
+ }
+ }
+
+ # Negative apertures are not permitted.
+ if (mkstart <= 0.0 || mkend <= 0.0)
+ break
+
+ # Fill in the apertures.
+ if (ndecode == 0) {
+ ;
+ } else if (ndecode == 1) {
+ nmarks = nmarks + 1
+ marks[nmarks] = mkstart
+ } else if (ndecode == 2) {
+ nmarks = nmarks + 1
+ marks[nmarks] = mkstart
+ if (nmarks >= max_nmarks)
+ break
+ nmarks = nmarks + 1
+ marks[nmarks] = mkend
+ } else {
+ for (nmk = 1; nmk <= ndecode && nmarks < max_nmarks;
+ nmk = nmk + 1) {
+ nmarks = nmarks + 1
+ marks[nmarks] = mkstart + (nmk - 1) * mkstep
+ }
+ }
+ }
+
+ return (nmarks)
+end
+
+
+# GCTOR -- Procedure to convert a character variable to a real number.
+# This routine is just an interface routine to the IRAF procedure gctod.
+
+int procedure gctor (str, ip, rval)
+
+char str[ARB] # string to be converted
+int ip # pointer to the string
+real rval # real value
+
+double dval
+int nchars
+int gctod()
+
+begin
+ nchars = gctod (str, ip, dval)
+ rval = dval
+ return (nchars)
+end