aboutsummaryrefslogtreecommitdiff
path: root/sys/imfort/imfparse.x
diff options
context:
space:
mode:
Diffstat (limited to 'sys/imfort/imfparse.x')
-rw-r--r--sys/imfort/imfparse.x71
1 files changed, 71 insertions, 0 deletions
diff --git a/sys/imfort/imfparse.x b/sys/imfort/imfparse.x
new file mode 100644
index 00000000..ebcf7484
--- /dev/null
+++ b/sys/imfort/imfparse.x
@@ -0,0 +1,71 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include "oif.h"
+
+# IMF_PARSE -- Parse an image name into the root pathname and filename
+# extension, if any. Only the known image type extensions are recognized
+# as extensions, hence this routine cannot be used to parse general filenames.
+
+procedure imf_parse (image, root, extn)
+
+char image[ARB] # input image name
+char root[SZ_PATHNAME] # output root pathname
+char extn[MAX_LENEXTN] # output extension
+
+int delim, ip, op
+pointer sp, pattern, osfn
+int strmatch(), strlen()
+string ex HDR_EXTENSIONS
+
+begin
+ call smark (sp)
+ call salloc (pattern, SZ_FNAME, TY_CHAR)
+ call salloc (osfn, SZ_PATHNAME, TY_CHAR)
+
+ # Parse the image name into the root and extn fields. The portion
+ # of the filename excluding any directory specification is also
+ # escape sequence encoded.
+
+ call imf_trans (image, root, extn)
+
+ # Search the list of legal imagefile extensions. If the extension
+ # given is not found in the list, tack it back onto the root and
+ # return a null extension. This is necessary if we are to allow
+ # dot delimited fields within image names without requiring the
+ # user to supply the image type extension. For example, "im.c"
+ # and "im.c.imh" must refer to the same image - ".c" is part of
+ # the image name, not an image type extension.
+ #
+ # Note - EX is a string of the form "|imh|hhh|...|". (iki.h).
+
+ if (strlen(extn) == LEN_EXTN) {
+ delim = ex[1]
+ for (ip=2; ex[ip] != EOS; ip=ip+1) {
+ op = pattern
+ while (ex[ip] != delim && ex[ip+1] != EOS) {
+ Memc[op] = ex[ip]
+ op = op + 1
+ ip = ip + 1
+ }
+ Memc[op] = EOS
+ if (strmatch (extn, Memc[pattern]) > 0) {
+ call sfree (sp)
+ return
+ }
+ }
+ }
+
+ # Not a legal image header extension. Restore the extn field to the
+ # root and null the extn. Tacking on the dummy extension .foo and
+ # later discarding it ensures that the root name is properly encoded
+ # for the local host.
+
+ if (strlen(extn) > 0) {
+ call strcpy (image, Memc[osfn], SZ_PATHNAME)
+ call strcat (".foo", Memc[osfn], SZ_PATHNAME)
+ call imf_trans (Memc[osfn], root, extn)
+ extn[1] = EOS
+ }
+
+ call sfree (sp)
+end