aboutsummaryrefslogtreecommitdiff
path: root/sys/imio/imt.x
diff options
context:
space:
mode:
Diffstat (limited to 'sys/imio/imt.x')
-rw-r--r--sys/imio/imt.x305
1 files changed, 305 insertions, 0 deletions
diff --git a/sys/imio/imt.x b/sys/imio/imt.x
new file mode 100644
index 00000000..b508b0ae
--- /dev/null
+++ b/sys/imio/imt.x
@@ -0,0 +1,305 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+.help imt
+.nf ___________________________________________________________________________
+IMT -- Image template package.
+
+The image template package is based upon the filename template package, the
+main difference being that the IMT package knows about the use of [] in image
+names, e.g., for image sections or cluster indices.
+
+ list = imtopenp (clparam)
+
+ list = imtopen (template)
+ imtclose (list)
+ nchars|eof = imtgetim (list, image, maxch)
+ nchars|eof = imtrgetim (list, index, image, maxch)
+ len = imtlen (list)
+ imtrew (list)
+
+An image template consists of a comma delimited list of one or more patterns.
+Each pattern consists of a filename template optionally followed by a cluster
+index or image section.
+
+ filename_template [image stuff] , ...
+
+In the simplest case a simple alphanumeric image or file name may be given.
+Template expansion is carried out by parsing off the [] image stuff, calling
+FNTOPNB to expand the filename template, and then appending the [] string to
+each output filename returned by FNTGFNB. Multiple adjacent [] sequences are
+permitted and are treated as one long string.
+
+The [ must be escaped to be included in the filename template. The escape
+will be passed on, causing the [ to be passed through into the file output
+filename. This prevents use of the [chars] character class notation in image
+templates; the [] are either interpreted as part of the image specification,
+or as part of the filename.
+.endhelp _____________________________________________________________________
+
+define SZ_FNT 16384
+define CH_DELIM 20B # used to flag image section
+
+
+# IMTOPENP -- Open an image template obtained as the string value of a CL
+# parameter.
+
+pointer procedure imtopenp (param)
+
+char param[ARB] # CL parameter with string value template
+pointer sp, template, imt
+pointer imtopen()
+errchk clgstr
+
+begin
+ call smark (sp)
+ call salloc (template, SZ_FNT, TY_CHAR)
+
+ call clgstr (param, Memc[template], SZ_FNT)
+ imt = imtopen (Memc[template])
+
+ call sfree (sp)
+ return (imt)
+end
+
+
+# IMTOPEN -- Open an image template. The filename template package is
+# sophisticated enough to do all the necessary filename editing, etc., so all
+# we need do is recast the image notation into a FNT edit operation, e.g.,
+# `*.imh[*,-*]' becomes `*.hhh%%?\[\*\,-\*]%', with the ? (CH_DELIM, actually
+# an unprintable ascii code) being included to make it easy to locate the
+# section string in the filenames returned by FNT. We then open the resultant
+# template and perform the inverse mapping upon the filenames returned by FNT.
+
+pointer procedure imtopen (template)
+
+char template[ARB] # image template
+
+int sort, level, ip, ch
+pointer sp, listp, fnt, op
+define output {Memc[op]=$1;op=op+1}
+int fntopnb(), strlen()
+
+begin
+ call smark (sp)
+ call salloc (fnt, max(strlen(template)*2, SZ_FNT), TY_CHAR)
+
+ # Sorting is disabled as input and output templates, derived from the
+ # same database but with string editing used to modify the output list,
+ # may be sorted differently as sorting is performed upon the edited
+ # output list.
+
+ sort = NO
+
+ op = fnt
+ for (ip=1; template[ip] != EOS; ip=ip+1) {
+ ch = template[ip]
+
+ if (ch == '[') {
+ if (ip > 1 && template[ip-1] == '!') {
+ # ![ -- Pass a [ to FNT (character class notation).
+ Memc[op-1] = '['
+
+ } else if (ip > 1 && template[ip-1] == '\\') {
+ # \[ -- The [ is part of the filename. Pass it on as an
+ # escape sequence to get by the FNT.
+
+ output ('[')
+
+ } else {
+ # [ -- Unescaped [. This marks the beginning of an image
+ # section sequence. Output `%%[...]%' and escape all
+ # pattern matching metacharacters until a comma template
+ # delimiter is encountered. Note that a comma within []
+ # is not a template delimiter.
+
+ output ('%')
+ output ('%')
+ output (CH_DELIM)
+
+ level = 0
+ for (; template[ip] != EOS; ip=ip+1) {
+ ch = template[ip]
+ if (ch == ',') { # ,
+ if (level <= 0)
+ break # exit loop
+ else {
+ output ('\\')
+ output (ch)
+ }
+ } else if (ch == '[') { # [
+ output ('\\')
+ output (ch)
+ level = level + 1
+ } else if (ch == ']') { # ]
+ output (ch)
+ level = level - 1
+ } else if (ch == '*') { # *
+ output ('\\')
+ output (ch)
+ } else # normal chars
+ output (ch)
+ }
+ output ('%')
+ ip = ip - 1
+ }
+
+ } else if (ch == '@') {
+ # List file reference. Output the CH_DELIM code before the @
+ # to prevent further translations on the image section names
+ # returned from the list file, e.g., "CH_DELIM // @listfile".
+
+ output (CH_DELIM)
+ output ('/')
+ output ('/')
+ output (ch)
+
+ } else
+ output (ch)
+ }
+
+ Memc[op] = EOS
+ listp = fntopnb (Memc[fnt], sort)
+
+ call sfree (sp)
+ return (listp)
+end
+
+
+# IMTGETIM -- Get the next image name from the image template. FNT returns a
+# filename with optional appended image section (preceded by the CH_DELIM
+# character). Our job is to escape any [ in the filename part of the image
+# name to avoid interpretation of these chars as image section characters by
+# IMIO. The CH_DELIM is deleted and everything following is simply copied
+# to the output.
+
+int procedure imtgetim (imt, outstr, maxch)
+
+pointer imt # image template descriptor
+char outstr[ARB] # output string
+int maxch # max chars out
+
+int nchars
+pointer sp, buf
+int fntgfnb(), imt_mapname()
+errchk fntgfnb
+
+begin
+ call smark (sp)
+ call salloc (buf, SZ_PATHNAME, TY_CHAR)
+
+ if (fntgfnb (imt, Memc[buf], SZ_PATHNAME) == EOF) {
+ outstr[1] = EOS
+ call sfree (sp)
+ return (EOF)
+ }
+
+ nchars = imt_mapname (Memc[buf], outstr, maxch)
+ call sfree (sp)
+ return (nchars)
+end
+
+
+# IMTRGETIM -- Like imt_getim, but may be used to randomly access the image
+# list.
+
+int procedure imtrgetim (imt, index, outstr, maxch)
+
+pointer imt # image template descriptor
+int index # list element to be returned
+char outstr[ARB] # output string
+int maxch # max chars out
+
+int nchars
+pointer sp, buf
+int fntrfnb(), imt_mapname()
+errchk fntrfnb
+
+begin
+ call smark (sp)
+ call salloc (buf, SZ_PATHNAME, TY_CHAR)
+
+ if (fntrfnb (imt, index, Memc[buf], SZ_PATHNAME) == EOF) {
+ outstr[1] = EOS
+ call sfree (sp)
+ return (EOF)
+ }
+
+ nchars = imt_mapname (Memc[buf], outstr, maxch)
+ call sfree (sp)
+ return (nchars)
+end
+
+
+# IMTLEN -- Return the number of image names in the expanded list.
+
+int procedure imtlen (imt)
+
+pointer imt # image template descriptor
+int fntlenb()
+
+begin
+ return (fntlenb (imt))
+end
+
+
+# IMTREW -- Rewind the expanded image list.
+
+procedure imtrew (imt)
+
+pointer imt # image template descriptor
+
+begin
+ call fntrewb (imt)
+end
+
+
+# IMTCLOSE -- Close an image template.
+
+procedure imtclose (imt)
+
+pointer imt # image template descriptor
+
+begin
+ call fntclsb (imt)
+end
+
+
+# IMT_MAPNAME -- Translate the string returned by FNT into an image
+# specification suitable for input to IMIO.
+
+int procedure imt_mapname (fnt, outstr, maxch)
+
+char fnt[ARB] # FNT string
+char outstr[ARB] # output string
+int maxch
+
+int ip, op
+
+begin
+ op = 1
+ for (ip=1; fnt[ip] != EOS; ip=ip+1)
+ if (fnt[ip] == '[') {
+ outstr[op] = '\\'
+ op = op + 1
+ outstr[op] = '['
+ op = op + 1
+
+ } else if (fnt[ip] == CH_DELIM) {
+ for (ip=ip+1; fnt[ip] != EOS; ip=ip+1) {
+ outstr[op] = fnt[ip]
+ op = op + 1
+ if (op > maxch)
+ break
+ }
+ break
+
+ } else {
+ outstr[op] = fnt[ip]
+ op = op + 1
+ if (op > maxch)
+ break
+ }
+
+ outstr[op] = EOS
+ return (op - 1)
+end