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