bool FrTextSpans::insertMetaData(FrSymbol *key, FrObject *value, bool copy) { FrStructField *field = m_metadata.getField(key) ; if (!field) return setMetaData(key,value,copy) ; FrObject *oldvalue = field->get() ; if (oldvalue) { if (!oldvalue->consp()) { oldvalue = new FrList(oldvalue) ; field->set(oldvalue) ; } FrList *list = (FrList*)oldvalue ; if (!list->member(value,::equal)) { pushlist(value&©?value->deepcopy():value,list) ; field->set(list) ; } } else if (value && value->consp()) field->set(copy?value->deepcopy():value) ; else field->set(new FrList((value&©)?value->deepcopy():value)) ; return true ; }
bool FrTextSpans::addMetaData(FrSymbol *key, const FrObject *value) { FrStructField *field = m_metadata.getField(key) ; if (!field) return setMetaData(key,value) ; FrObject *oldvalue = field->get() ; if (oldvalue) { if (oldvalue->consp()) { FrList *list = (FrList*)oldvalue ; if (value && value->consp()) { FrList *newvalue = ((FrList*)value)->difference(list) ; list = newvalue->nconc(list) ; } else if (!list->member(value,::equal)) pushlist(value?value->deepcopy():0,list) ; field->set(list) ; } else return false ; } else if (value && value->consp()) field->set(value->deepcopy()) ; else field->set(new FrList(value?value->deepcopy():0)) ; return true ; }
bool FrTextSpan::addMetaData(FrSymbol *key, const FrObject *value) { if (!metaData()) { setMetaData(new FrStruct(FrSymbolTable::add(METADATA_TYPENAME))) ; if (!metaData()) return false ; } FrObject *oldvalue = m_metadata->get(key) ; if (oldvalue) { if (oldvalue->consp()) { FrList *list = (FrList*)oldvalue->deepcopy() ; if (value && value->consp()) { FrList *newvalue = ((FrList*)value)->difference(list) ; list = newvalue->nconc(list) ; m_metadata->put(key,list,false) ; } else if (!list->member(value,::equal)) { pushlist(value?value->deepcopy():0,list) ; m_metadata->put(key,list,false) ; } else free_object(list) ; } else return false ; } else if (value && value->consp()) m_metadata->put(key,value->deepcopy(),false) ; else m_metadata->put(key,new FrList(value?value->deepcopy():0),false) ; return true ; }