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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
include <evexpr.h>
include "keyselect.h"
#* HISTORY *
#* B.Simon 12-Mar-1992 Original
#* Phil Hodge 4-Mar-2002 Free memory allocated by evexpr.
# EVAL_EXPR -- Evaluate a boolean expression using image header keywords
bool procedure eval_expr (im, expr)
pointer im # i: image descriptor
char expr[ARB] # i: boolean expression
#--
include "keyselect.com"
pointer op, sp, errmsg
string badtype "Expression is not of boolean type"
#string badname "Warning: header keyword %s not found in %s\n"
int errget()
pointer evexpr(), locpr()
extern fun_expr, var_expr
begin
call smark (sp)
call salloc (errmsg, SZ_LINE, TY_CHAR)
img = im
iferr {
op = evexpr (expr, locpr(var_expr), locpr (fun_expr))
} then {
if (errget(Memc[errmsg], SZ_LINE) == ERR_SYNTAX) {
call xer_reset
call error (ERR_SYNTAX, Memc[errmsg])
} else {
call xer_reset
call eprintf ("Warning: %s\n")
call pargstr (Memc[errmsg])
call mfree (op, TY_STRUCT)
return (false)
}
}
if (O_TYPE(op) != TY_BOOL)
call error (ERR_SYNTAX, badtype)
call xev_freeop (op)
call mfree (op, TY_STRUCT)
call sfree (sp)
return (O_VALB(op))
end
# FMT_EXPR -- Format an expression to make it easier to parse
procedure fmt_expr (expr)
char expr[ARB] # i: expression
#--
int ic, jc
begin
# Find first non-white character
for (ic = 1; expr[ic] != EOS; ic = ic + 1) {
if (expr[ic] > ' ')
break
}
# Copy remaining characters, replacing newlines with blanks
jc = 1
for ( ; expr[ic] != EOS; ic = ic + 1) {
if (expr[ic] == '\n') {
expr[jc] = ' '
} else if (jc < ic) {
expr[jc] = expr[ic]
}
jc = jc + 1
}
expr[jc] = EOS
end
# FUN_EXPR -- Evaluate non-standard functions used in expression
procedure fun_expr (func, argptr, nargs, op)
char func[ARB] # i: function name
pointer argptr[ARB] # i: pointers to function arguments
int nargs # i: number of function arguments
pointer op # o: structure containing function value
#--
include "keyselect.com"
int arg
pointer sp, errmsg
string flist "find"
string badfun "Unknown function name (%s)"
string badtyp "Invalid argument type for %s"
int word_match(), imaccf()
begin
call smark (sp)
call salloc (errmsg, SZ_LINE, TY_CHAR)
switch (word_match (func, flist)) {
case 0: # unrecognized function name
call sprintf (Memc[errmsg], SZ_LINE, badfun)
call pargstr (func)
call error (ERR_SYNTAX, Memc[errmsg])
case 1: # find keyword in header ?
call xev_initop (op, 0, TY_BOOL)
O_VALB(op) = true
do arg = 1, nargs {
if (O_TYPE(argptr[arg]) != TY_CHAR) {
call sprintf (Memc[errmsg], SZ_LINE, badtyp)
call pargstr (func)
call error (ERR_SYNTAX, Memc[errmsg])
}
if (imaccf (img, O_VALC(argptr[arg])) == NO)
O_VALB(op) = false
}
}
call sfree (sp)
end
# VAR_EXPR -- Retrieve keyword used in expression
procedure var_expr (name, op)
char name[ARB] # i: keyword name
pointer op # o: structure containing value of variable
#--
include "keyselect.com"
int ic, dtype, type, length, junk
pointer sp, value
string badname "Expression cannot be evaluated because keyword not found"
bool streq()
int ctoi(), ctor()
begin
call smark(sp)
call salloc (value, SZ_BIGCOL, TY_CHAR)
# Retrieve keyword value from image header
call get_keyword (img, name, dtype, Memc[value], SZ_BIGCOL)
# Allocate structure to hold value
if (dtype == 0) {
call error (ERR_NOFIND, badname)
} else if (dtype < 0) {
type = TY_CHAR
length = - dtype
} else {
type = dtype
length = 0
}
call xev_initop (op, length, type)
# Copy value to structure
switch (type) {
case TY_BOOL:
O_VALB(op) = streq (Memc[value], "yes")
case TY_CHAR:
call strcpy (Memc[value], O_VALC(op), length)
case TY_SHORT,TY_INT,TY_LONG:
ic = 1
junk = ctoi (Memc[value], ic, O_VALI(op))
case TY_REAL,TY_DOUBLE:
ic = 1
junk = ctor (Memc[value], ic, O_VALR(op))
}
call sfree(sp)
end
|