1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
include "template.h"
# TP_COUNT -- Count the number of groups in an image
#
# B.Simon 02-Oct-98 Original
# B.Simon 26-Apr-99 Check value of NEXTEND before using
int procedure tp_count (root)
char root[ARB] # i: image name minus any sections
#--
int imtype, count, lo, hi, mid
pointer sp, image, im
int imgeti(), imaccf(), tp_imtype(), tp_hasgroup()
pointer immap()
begin
# If the image is not a geis or fits file it can only have one group
imtype = tp_imtype (root)
if (imtype != TP_GEIS && imtype != TP_FITS)
return (1)
# Open the image to read the number of groups or extensions
# as recorded in the appropriate header keyword
call smark (sp)
call salloc (image, SZ_FNAME, TY_CHAR)
call strcpy (root, Memc[image], SZ_FNAME)
call strcat ("[0]", Memc[image], SZ_FNAME)
iferr (im = immap (Memc[image], READ_ONLY, NULL)) {
# If image can't be opened, report an error condition
count = ERR
} else if (imtype == TP_GEIS) {
# Number of groups is trustworthy, report it to user
count = imgeti (im, "GCOUNT")
call imunmap (im)
} else {
# Number of extensions is not, it must be checked
lo = 1
hi = 0
# Check number of extensions
if (imaccf (im, "NEXTEND") == YES) {
mid = imgeti (im, "NEXTEND")
if (mid > 0) {
if (tp_hasgroup (root, mid) == NO) {
hi = mid
} else {
lo = mid
mid = mid + 1
if (tp_hasgroup (root, mid) == NO) {
hi = mid
} else {
lo = mid
}
}
}
}
# Find bracket for number of extensions
while (hi < lo) {
mid = 2 * lo
if (tp_hasgroup (root, mid) == NO) {
hi = mid
} else {
lo = mid
}
}
# Use binary search to find actual number of extensions
while (hi - lo > 1) {
mid = (hi + lo) / 2
if (tp_hasgroup (root, mid) == NO) {
hi = mid
} else {
lo = mid
}
}
count = lo
call imunmap (im)
}
call sfree (sp)
return (count)
end
# TP_HASGROUP -- Determine if group is preent in image
int procedure tp_hasgroup (root, index)
char root[ARB] # i: image name
int index # i: index of group to check
#--
int has
pointer sp, image, im
pointer immap()
begin
call smark (sp)
call salloc (image, SZ_FNAME, TY_CHAR)
call sprintf (Memc[image], SZ_FNAME, "%s[%d]")
call pargstr (root)
call pargi (index)
iferr (im = immap (Memc[image], READ_ONLY, NULL)) {
has = NO
} else {
call imunmap (im)
has = YES
}
call sfree (sp)
return (has)
end
|