From b5f53c349f5ee455dd221377f8e7a065fe83c858 Mon Sep 17 00:00:00 2001 From: mfranz Date: Wed, 4 Apr 2007 14:42:38 +0000 Subject: [PATCH] setAttribute("archive", 1) sets this attribute to "true", and getAttribute("archive") returns 1 if the attribute is set, and 0 otherwise. Allow to query and to set all properties by not specifying an attribute string: getAttribute() returns all attributes bit coded in an integer, and setAttribute(attr) sets all attributes. No assumptions may be made about the meaning of the bits -- they can be changed in future fgfs releases. The only valid use is to compare or set attribute numbers obtained in the same fgfs run. This is meant for allowing full copies of property branches. Also add getAttribute query strings "children" for the number of children, and "alias". --- src/Scripting/nasal-props.cxx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Scripting/nasal-props.cxx b/src/Scripting/nasal-props.cxx index ea6548ade..77c74a830 100644 --- a/src/Scripting/nasal-props.cxx +++ b/src/Scripting/nasal-props.cxx @@ -77,19 +77,21 @@ static naRef f_getType(naContext c, naRef me, int argc, naRef* args) static naRef f_getAttribute(naContext c, naRef me, int argc, naRef* args) { NODEARG(); + if(naVec_size(argv) == 0) return naNum((*node)->getAttributes()); naRef val = naVec_get(argv, 0); char *a = naStr_data(val); SGPropertyNode::Attribute attr; if(!a) a = ""; - if(!strcmp(a, "read")) attr = SGPropertyNode::READ; + if(!strcmp(a, "children")) return naNum((*node)->nChildren()); + else if(!strcmp(a, "tied")) return naNum((*node)->isTied()); + else if(!strcmp(a, "alias")) return naNum((*node)->isAlias()); + else if(!strcmp(a, "read")) attr = SGPropertyNode::READ; else if(!strcmp(a, "write")) attr = SGPropertyNode::WRITE; else if(!strcmp(a, "archive")) attr = SGPropertyNode::ARCHIVE; else if(!strcmp(a, "trace-read")) attr = SGPropertyNode::TRACE_READ; else if(!strcmp(a, "trace-write")) attr = SGPropertyNode::TRACE_WRITE; else if(!strcmp(a, "userarchive")) attr = SGPropertyNode::USERARCHIVE; - else if(!strcmp(a, "tied")) { - return naNum((*node)->isTied()); - } else { + else { naRuntimeError(c, "props.getAttribute() with invalid attribute"); return naNil(); } @@ -100,8 +102,13 @@ static naRef f_setAttribute(naContext c, naRef me, int argc, naRef* args) { NODEARG(); naRef val = naVec_get(argv, 0); - char *a = naStr_data(val); + if(naVec_size(argv) == 1 && naIsNum(val)) { + naRef ret = naNum((*node)->getAttributes()); + (*node)->setAttributes((int)val.num); + return ret; + } SGPropertyNode::Attribute attr; + char *a = naStr_data(val); if(!a) a = ""; if(!strcmp(a, "read")) attr = SGPropertyNode::READ; else if(!strcmp(a, "write")) attr = SGPropertyNode::WRITE;