/*! * \param sel Selection to append (can be NULL, in which * case nothing is done). * \param last Last selection, or NULL if not present or not known. * \param scanner Scanner data structure. * \returns The last selection after the append. * * Appends \p sel after the last root element, and returns either \p sel * (if it was non-NULL) or the last element (if \p sel was NULL). */ SelectionTreeElementPointer _gmx_sel_append_selection(const gmx::SelectionTreeElementPointer &sel, gmx::SelectionTreeElementPointer last, yyscan_t scanner) { gmx_ana_selcollection_t *sc = _gmx_sel_lexer_selcollection(scanner); /* Append sel after last, or the last element of sc if last is NULL */ if (last) { last->next = sel; } else { if (sc->root) { last = sc->root; while (last->next) { last = last->next; } last->next = sel; } else { sc->root = sel; } } /* Initialize a selection object if necessary */ if (sel) { last = sel; /* Add the new selection to the collection if it is not a variable. */ if (sel->child->type != SEL_SUBEXPR) { gmx::SelectionDataPointer selPtr( new gmx::internal::SelectionData( sel.get(), _gmx_sel_lexer_pselstr(scanner))); sc->sel.push_back(gmx::move(selPtr)); } } /* Clear the selection string now that we've saved it */ _gmx_sel_lexer_clear_pselstr(scanner); return last; }