+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include <simgear/nasal/nasal.h>
#include <simgear/props/props.hxx>
naRef child = naVec_get(argv, 0);
if(!naIsString(child)) return naNil();
naRef idx = naNumValue(naVec_get(argv, 1));
+ bool create = naTrue(naVec_get(argv, 2));
SGPropertyNode* n;
- if(naIsNil(idx) || !naIsNum(idx)) {
- n = (*node)->getChild(naStr_data(child));
- } else {
- n = (*node)->getChild(naStr_data(child), (int)idx.num);
+ try {
+ if(naIsNil(idx) || !naIsNum(idx)) {
+ n = (*node)->getChild(naStr_data(child), create);
+ } else {
+ n = (*node)->getChild(naStr_data(child), (int)idx.num, create);
+ }
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ return naNil();
}
if(!n) return naNil();
return propNodeGhostCreate(c, n);
// Get all children of a specified name
naRef name = naVec_get(argv, 0);
if(!naIsString(name)) return naNil();
- vector<SGPropertyNode_ptr> children
- = (*node)->getChildren(naStr_data(name));
- for(unsigned int i=0; i<children.size(); i++)
- naVec_append(result, propNodeGhostCreate(c, children[i]));
+ try {
+ vector<SGPropertyNode_ptr> children
+ = (*node)->getChildren(naStr_data(name));
+ for(unsigned int i=0; i<children.size(); i++)
+ naVec_append(result, propNodeGhostCreate(c, children[i]));
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ return naNil();
+ }
}
return result;
}
naRef child = naVec_get(argv, 0);
naRef index = naVec_get(argv, 1);
if(!naIsString(child) || !naIsNum(index)) return naNil();
- (*node)->removeChild(naStr_data(child), (int)index.num);
+ try {
+ (*node)->removeChild(naStr_data(child), (int)index.num, false);
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ }
return naNil();
}
+static naRef f_removeChildren(naContext c, naRef me, int argc, naRef* args)
+{
+ NODEARG();
+ naRef result = naNewVector(c);
+ if(naIsNil(argv) || naVec_size(argv) == 0) {
+ // Remove all children
+ for(int i = (*node)->nChildren() - 1; i >=0; i--)
+ naVec_append(result, propNodeGhostCreate(c, (*node)->removeChild(i)));
+ } else {
+ // Remove all children of a specified name
+ naRef name = naVec_get(argv, 0);
+ if(!naIsString(name)) return naNil();
+ try {
+ vector<SGPropertyNode_ptr> children
+ = (*node)->removeChildren(naStr_data(name), false);
+ for(unsigned int i=0; i<children.size(); i++)
+ naVec_append(result, propNodeGhostCreate(c, children[i]));
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ return naNil();
+ }
+ }
+ return result;
+}
+
static naRef f_getNode(naContext c, naRef me, int argc, naRef* args)
{
NODEARG();
naRef path = naVec_get(argv, 0);
bool create = naTrue(naVec_get(argv, 1));
if(!naIsString(path)) return naNil();
- SGPropertyNode* n = (*node)->getNode(naStr_data(path), create);
+ SGPropertyNode* n;
+ try {
+ n = (*node)->getNode(naStr_data(path), create);
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ return naNil();
+ }
return propNodeGhostCreate(c, n);
}
{ f_getChild, "_getChild" },
{ f_getChildren, "_getChildren" },
{ f_removeChild, "_removeChild" },
+ { f_removeChildren, "_removeChildren" },
{ f_getNode, "_getNode" },
{ f_new, "_new" },
{ f_globals, "_globals" },