| Source file setfields.icn |
#
# $Id: setfields.icn,v 1.1 2004-02-12 17:07:57 rparlett Exp $
#
package util
import lang
class SetFields()
method test_flag(attr, val)
if ::map(val[1]) == ("y" | "yes" | "t" | "true") then
return
if ::map(val[1]) == ("n" | "no" | "f" | "false") then
fail
field_error("Attribute " || attr || " needs a single boolean parameter")
end
method as_attrib(attr, val)
local s, e
s := ""
every e := !val do {
if *s > 0 then
s ||:= ","
s ||:= e
}
return attr || "=" || s
end
method int_val(attr, val)
return /val[1] | ::integer(val[1]) | field_error("Attribute " || attr || " needs a single integer parameter")
end
method int_vals(attr, val, n)
local i
if *val < \n then
field_error("Attribute " || attr || " needs " || n || " parameters")
every i := 1 to *val do {
val[i] := /val[i] | ::integer(val[i]) | field_error("Attribute " || attr || " needs integer parameters")
}
return val
end
method numeric_val(attr, val)
return /val[1] | ::numeric(val[1]) | field_error("Attribute " || attr || " needs a single numeric parameter")
end
method numeric_vals(attr, val, n)
local i
if *val < \n then
field_error("Attribute " || attr || " needs " || n || " parameters")
every i := 1 to *val do {
val[i] := /val[i] | ::numeric(val[i]) | field_error("Attribute " || attr || " needs numeric parameters")
}
return val
end
method cset_val(attr, val)
return /val[1] | ::cset(val[1]) | field_error("Attribute " || attr || " needs a single cset parameter")
end
method string_val(attr, val)
return val[1] | field_error("Attribute " || attr || " needs a single string parameter")
end
method string_vals(attr, val, n)
if *val < \n then
field_error("Attribute " || attr || " needs " || n || " parameters")
return val
end
method attrib(a[])
set_fields(a)
end
method set_fields(l)
local s, t, attr, val, vals
every s := !l do {
s ? {
if attr := ::tab(::find("=")) then {
="="
vals := []
tab(0) ? {
while t := ::tab(::find(",")) do {
if *t = 0 then
::put(vals, &null)
else
::put(vals,t )
::move(1)
}
t := ::tab(0)
if *t = 0 then
::put(vals, &null)
else
::put(vals,t )
}
} else {
attr := s
vals := []
}
}
self.set_one(attr, vals)
}
end
#
# This must be implemented to set a single field.
# @param attr the field
# @param val the value
#
abstract method set_one(attr, val)
#
# Invoked on a field setup error: stop with an error. This is
# always a fatal error.
# @param s the error message
#
method field_error(s)
::stop("setfields : error in " || lang::get_class_name(self) || " : " || s)
end
end