/// <summary> /// Process atom labels from extended SMILES in a char iter. /// </summary> /// <param name="iter">char iteration</param> /// <param name="dest">destination of labels (atomidx->label)</param> /// <returns>parse success/failure</returns> private static bool ProcessAtomLabels(CharIter iter, SortedDictionary <int, string> dest) { int atomIdx = 0; while (iter.HasNext()) { // fast forward through empty labels while (iter.NextIf(';')) { atomIdx++; } char c = iter.Next(); if (c == '$') { iter.NextIf(','); // optional // end of atom label return(true); } else { iter.pos--; // push back var beg = iter.pos; var rollback = beg; while (iter.HasNext()) { if (iter.pos == beg && iter.Curr() == '_' && iter.Peek() == 'R') { ++beg; } // correct step over of escaped label if (iter.Curr() == '&') { rollback = iter.pos; if (iter.NextIf('&') && iter.NextIf('#') && iter.NextIfDigit()) { while (iter.NextIfDigit()) { } // more digits if (!iter.NextIf(';')) { iter.pos = rollback; } else { } } else { iter.pos = rollback; } } else if (iter.Curr() == ';') { break; } else if (iter.Curr() == '$') { break; } else { iter.Next(); } } dest.Add(atomIdx, Unescape(iter.Substr(beg, iter.pos))); atomIdx++; if (iter.NextIf('$')) { iter.NextIf(','); // optional return(true); } if (!iter.NextIf(';')) { return(false); } } } return(false); }