diff options
Diffstat (limited to 'pkg/proto/t_mkglbhdr.x')
-rw-r--r-- | pkg/proto/t_mkglbhdr.x | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/pkg/proto/t_mkglbhdr.x b/pkg/proto/t_mkglbhdr.x new file mode 100644 index 00000000..7840403b --- /dev/null +++ b/pkg/proto/t_mkglbhdr.x @@ -0,0 +1,167 @@ +include <error.h> +include <imhdr.h> + +# T_MKGLBHDR -- Make a global header from common image and reference keywords. + +procedure t_mkglbhdr () + +pointer input # Input image list +char oname[SZ_FNAME] # Output global image +char rname[SZ_FNAME] # Reference image +pointer exclude # Exclusion keyword list + +int i +char iname[SZ_FNAME], key[8] +pointer im, refim, recs, ptr, ptr1 + +bool matchcard() +int clpopnu(), clgfil(), imtgetim(), strncmp(), nowhite() +pointer imtopenp(), immap() + +errchk immap + +begin + # Get parameters. + input = imtopenp ("input") + call clgstr ("output", oname, SZ_FNAME) + call clgstr ("reference", rname, SZ_FNAME) + exclude = clpopnu ("exclude") + + # Use the first image in the input list if no reference is specified. + if (nowhite (rname, rname, SZ_FNAME) == 0) + i = imtgetim (input, rname, SZ_FNAME) + + iferr { + im = NULL; refim = NULL; recs = NULL + + # Make list of reference cards. + ptr = immap (rname, READ_ONLY, 0); refim = ptr + ptr = IM_USERAREA(refim) + do i = 0, ARB { + if (Memc[ptr] == EOS) + break + if (i == 0) + call malloc (recs, 1000, TY_POINTER) + else if (mod (i, 1000) == 0) + call realloc (recs, i+1000, TY_POINTER) + #Memc[ptr+80] = EOS + Memi[recs+i] = ptr + ptr = ptr + 81 + } + Memi[recs+i] = EOF + + # Exclude specified keywords. + while (clgfil (exclude, iname, SZ_FNAME) != EOF) { + call sprintf (key, 8, "%-8.8s") + call pargstr (iname) + call strupr (key) + for (i=0; Memi[recs+i]!=EOF; i=i+1) { + ptr = Memi[recs+i] + if (ptr == NULL) + next + if (Memc[ptr] == ' ') + next + if (strncmp (key, Memc[ptr], 8) == 0) + Memi[recs+i] = NULL + } + } + + # Loop through input images eliminating reference cards. + while (imtgetim (input, iname, SZ_FNAME) != EOF) { + ptr = immap (iname, READ_ONLY, 0); im = ptr + ptr = IM_USERAREA(im) + for (i=0; Memi[recs+i]!=EOF; i=i+1) { + ptr = Memi[recs+i] + if (ptr == NULL) + next + if (Memc[ptr] == ' ') + next + if (!matchcard (Memc[IM_USERAREA(im)], Memc[ptr])) + Memi[recs+i] = NULL + } + call imunmap (im) + } + + # Eliminate multiple blank lines. + for (i=0; Memi[recs+i]!=EOF; i=i+1) { + ptr1 = Memi[recs+i] + if (ptr == NULL) + next + if (Memc[ptr] != ' ') + break + Memi[recs+i] = NULL + } + ptr1 = ptr + for (; Memi[recs+i]!=EOF; i=i+1) { + ptr = Memi[recs+i] + if (ptr == NULL) + next + if (Memc[ptr] == ' ' && Memc[ptr1] == ' ') + Memi[recs+i] = NULL + else + ptr1 = ptr + } + + # Write the output global header. + ptr = immap (oname, NEW_COPY, refim); im = ptr + IM_PIXTYPE(im) = TY_SHORT + IM_NDIM(im) = 0 + ptr1 = IM_USERAREA(im) + for (i=0; Memi[recs+i]!=EOF; i=i+1) { + ptr = Memi[recs+i] + if (ptr == NULL) + next + call strcpy (Memc[ptr], Memc[ptr1], 81) + ptr1 = ptr1 + 81 + } + Memc[ptr1] = EOS + call imunmap (im) + + } then + call erract (EA_WARN) + + + # Finish up. + if (im != NULL) + call imunmap (im) + if (refim != NULL) + call imunmap (refim) + call mfree (recs, TY_POINTER) + + call clpcls (exclude) + call imtclose (input) +end + + +# MATCHCARD -- Match a card given by pat to a string which is a user area. +# This is a simple version of gstrmatch. + +bool procedure matchcard (str, pat) + +char str[ARB] # String to search +char pat[ARB] # String to match +char ch, pch +int i, ip, pp + +begin + do ip = 1, ARB { + if (str[ip] == EOS) + break + + i = ip + for (pp=1; pp < 81; pp=pp+1) { + pch = pat[pp] + ch = str[i] + i = i + 1 + if (pch != ch) + break + } + + if (pp == 81) + return (true) + else if (str[i] == EOS) + break + } + + return (false) +end |