PUBLIC EjsArray *ejsCloneArray(Ejs *ejs, EjsArray *ap, bool deep) { EjsArray *newArray; EjsObj **dest, **src; int i; if ((newArray = ejsClonePot(ejs, ap, deep)) == 0) { ejsThrowMemoryError(ejs); return 0; } if (ap->length > 0) { if (growArray(ejs, newArray, ap->length) < 0) { ejsThrowMemoryError(ejs); return 0; } src = ap->data; dest = newArray->data; if (deep) { for (i = 0; i < ap->length; i++) { dest[i] = ejsClone(ejs, src[i], deep); } } else { memcpy(dest, src, ap->length * sizeof(EjsObj*)); } } return newArray; }
PUBLIC EjsAny *cloneXml(Ejs *ejs, EjsXML *xml, bool deep) { EjsXML *root, *elt; int next; if (xml == 0) { return 0; } if (xml->kind == EJS_XML_LIST) { root = ejsCreateXMLList(ejs, xml->targetObject, xml->targetProperty); } else { root = ejsCreateXML(ejs, xml->kind, xml->qname, NULL, xml->value); } if (root == 0) { return 0; } // TODO - must copy inScopeNamespaces? if (xml->attributes) { root->attributes = mprCreateList(-1, 0); for (next = 0; (elt = (EjsXML*) mprGetNextItem(xml->attributes, &next)) != 0; ) { elt = ejsClone(ejs, elt, 1); if (elt) { elt->parent = root; mprAddItem(root->attributes, elt); } } } if (xml->elements) { root->elements = mprCreateList(-1, 0); for (next = 0; (elt = mprGetNextItem(xml->elements, &next)) != 0; ) { assert(ejsIsXML(ejs, elt)); elt = ejsClone(ejs, elt, 1); if (elt) { elt->parent = root; mprAddItem(root->elements, elt); } } } if (mprHasMemError(ejs)) { return 0; } return root; }