void MoleculeSGroups::findSGroups()

in core/indigo-core/molecule/src/molecule_sgroups.cpp [470:657]


void MoleculeSGroups::findSGroups(int property, const char* str, Array<int>& sgs)
{
    int i;
    if (property == SGroup::SG_CLASS)
    {
        for (i = _sgroups.begin(); i != _sgroups.end(); i = _sgroups.next(i))
        {
            SGroup& sg = *_sgroups.at(i);
            if (sg.sgroup_type == SGroup::SG_TYPE_SUP)
            {
                Superatom& sa = (Superatom&)sg;
                BufferScanner sc(sa.sa_class);
                if (sc.findWordIgnoreCase(str))
                {
                    sgs.push(i);
                }
            }
        }
    }
    else if (property == SGroup::SG_LABEL)
    {
        for (i = _sgroups.begin(); i != _sgroups.end(); i = _sgroups.next(i))
        {
            SGroup& sg = *_sgroups.at(i);
            if (sg.sgroup_type == SGroup::SG_TYPE_SUP)
            {
                Superatom& sa = (Superatom&)sg;
                BufferScanner sc(sa.subscript);
                if (sc.findWordIgnoreCase(str))
                {
                    sgs.push(i);
                }
            }
            else if (sg.sgroup_type == SGroup::SG_TYPE_SRU)
            {
                RepeatingUnit& ru = (RepeatingUnit&)sg;
                BufferScanner sc(ru.subscript);
                if (sc.findWordIgnoreCase(str))
                {
                    sgs.push(i);
                }
            }
        }
    }
    else if (property == SGroup::SG_DATA)
    {
        for (i = _sgroups.begin(); i != _sgroups.end(); i = _sgroups.next(i))
        {
            SGroup& sg = *_sgroups.at(i);
            if (sg.sgroup_type == SGroup::SG_TYPE_DAT)
            {
                DataSGroup& dg = (DataSGroup&)sg;
                BufferScanner sc(dg.data);
                if (sc.findWordIgnoreCase(str))
                {
                    sgs.push(i);
                }
            }
        }
    }
    else if (property == SGroup::SG_DATA_NAME)
    {
        for (i = _sgroups.begin(); i != _sgroups.end(); i = _sgroups.next(i))
        {
            SGroup& sg = *_sgroups.at(i);
            if (sg.sgroup_type == SGroup::SG_TYPE_DAT)
            {
                DataSGroup& dg = (DataSGroup&)sg;
                BufferScanner sc(dg.name);
                if (sc.findWordIgnoreCase(str))
                {
                    sgs.push(i);
                }
            }
        }
    }
    else if (property == SGroup::SG_DATA_TYPE)
    {
        for (i = _sgroups.begin(); i != _sgroups.end(); i = _sgroups.next(i))
        {
            SGroup& sg = *_sgroups.at(i);
            if (sg.sgroup_type == SGroup::SG_TYPE_DAT)
            {
                DataSGroup& dg = (DataSGroup&)sg;
                BufferScanner sc(dg.type);
                if (sc.findWordIgnoreCase(str))
                {
                    sgs.push(i);
                }
            }
        }
    }
    else if (property == SGroup::SG_DATA_DESCRIPTION)
    {
        for (i = _sgroups.begin(); i != _sgroups.end(); i = _sgroups.next(i))
        {
            SGroup& sg = *_sgroups.at(i);
            if (sg.sgroup_type == SGroup::SG_TYPE_DAT)
            {
                DataSGroup& dg = (DataSGroup&)sg;
                BufferScanner sc(dg.description);
                if (sc.findWordIgnoreCase(str))
                {
                    sgs.push(i);
                }
            }
        }
    }
    else if (property == SGroup::SG_DATA_DISPLAY)
    {
        for (i = _sgroups.begin(); i != _sgroups.end(); i = _sgroups.next(i))
        {
            SGroup& sg = *_sgroups.at(i);
            if (sg.sgroup_type == SGroup::SG_TYPE_DAT)
            {
                DataSGroup& dg = (DataSGroup&)sg;
                if (((strcasecmp(str, "detached") == 0) && dg.detached) || ((strcasecmp(str, "attached") == 0) && !dg.detached))
                {
                    sgs.push(i);
                }
            }
        }
    }
    else if (property == SGroup::SG_DATA_LOCATION)
    {
        for (i = _sgroups.begin(); i != _sgroups.end(); i = _sgroups.next(i))
        {
            SGroup& sg = *_sgroups.at(i);
            if (sg.sgroup_type == SGroup::SG_TYPE_DAT)
            {
                DataSGroup& dg = (DataSGroup&)sg;
                if (((strcasecmp(str, "relative") == 0) && dg.relative) || ((strcasecmp(str, "absolute") == 0) && !dg.relative))
                {
                    sgs.push(i);
                }
            }
        }
    }
    else if (property == SGroup::SG_DATA_TAG)
    {
        for (i = _sgroups.begin(); i != _sgroups.end(); i = _sgroups.next(i))
        {
            SGroup& sg = *_sgroups.at(i);
            if (sg.sgroup_type == SGroup::SG_TYPE_DAT)
            {
                DataSGroup& dg = (DataSGroup&)sg;
                if ((strlen(str) == 1) && str[0] == dg.tag)
                {
                    sgs.push(i);
                }
            }
        }
    }
    else if (property == SGroup::SG_QUERY_CODE)
    {
        for (i = _sgroups.begin(); i != _sgroups.end(); i = _sgroups.next(i))
        {
            SGroup& sg = *_sgroups.at(i);
            if (sg.sgroup_type == SGroup::SG_TYPE_DAT)
            {
                DataSGroup& dg = (DataSGroup&)sg;
                BufferScanner sc(dg.querycode);
                if (sc.findWordIgnoreCase(str))
                {
                    sgs.push(i);
                }
            }
        }
    }
    else if (property == SGroup::SG_QUERY_OPER)
    {
        for (i = _sgroups.begin(); i != _sgroups.end(); i = _sgroups.next(i))
        {
            SGroup& sg = *_sgroups.at(i);
            if (sg.sgroup_type == SGroup::SG_TYPE_DAT)
            {
                DataSGroup& dg = (DataSGroup&)sg;
                BufferScanner sc(dg.queryoper);
                if (sc.findWordIgnoreCase(str))
                {
                    sgs.push(i);
                }
            }
        }
    }
    else
        throw Error("Unknown or incomaptible value Sgroup property: %d", property);
}