ExpressionItem *CopyItem(ExpressionItem *citem, int NeedConst) { if (!citem) return NULL; ExpressionItem *item = NULL; if ((NeedConst) && ((citem->type & ITEMTYPE) != IT_CONST)) { // in case of non constant expression - flat it to const RunTree(citem, item, RTO_NEEDCONST | ITC_INT | ITC_STRING | ITC_FLOAT | ITC_ARRAY); if (item) return item; } item = AllocItem(); item->type = citem->type; if ((item->type & (ITEMTYPE | ITEMSUBTYPE)) == (IT_CONST | ITC_STRING)) { item->param1 = (EIPARAM) AllocString(); lstrcpy((LPSTR) item->param1, (LPSTR) citem->param1); } else if (((item->type & (ITEMTYPE | ITEMSUBTYPE)) == (IT_CONST | ITC_ARRAY)) || ((item->type & (ITEMTYPE | ITEMSUBTYPE)) == (IT_VARIABLE | ITV_ARRITEM))) { item->param1 = citem->param1; ArrayDesc *ad = (ArrayDesc*) item->param1; ad->references++; } else item->param1 = citem->param1; item->param2 = citem->param2; item->next = NULL; return item; }
DOMNode* XMLIO::RunTree (DOMNode* node, void* ptr, unsigned int (*fun) (void*, DOMNode*) ) { DOMNode* child; DOMNode* rnode=NULL; if (node) { if (node->getNodeType() == DOMNode::ELEMENT_NODE) { unsigned int code = fun(ptr,node); if (code>0) return node; for (child = node->getFirstChild(); child != 0; child=child->getNextSibling()) { rnode = RunTree(child,ptr,fun); if (rnode!=NULL) break; } } } return rnode; }