docs: @Nonnull
    @ReturnsMutableCopy
    public ICommonsMap <String, String> parse (@Nullable final String sStr, final char cSeparator)
    {
      final ICommonsMap <String, String> ret = new CommonsHashMap <> ();
      if (sStr != null)
      {
        final char [] aChars = sStr.toCharArray ();
        m_aChars = aChars;
        m_nPos = 0;
        m_nLen = sStr.length ();
  
        while (_hasChar ())
        {
          String sParamName = _parseToken ('=', cSeparator);
          String sParamValue = null;
          if (_hasChar () && aChars[m_nPos] == '=')
          {
            // skip '='
            m_nPos++;
            sParamValue = _parseQuotedToken (cSeparator);
          }
          if (_hasChar () && aChars[m_nPos] == cSeparator)
          {
            // skip separator
            m_nPos++;
          }
          if (StringHelper.hasText (sParamName))
          {
            if (m_bLowerCaseNames)
              sParamName = sParamName.toLowerCase (Locale.US);
            ret.put (sParamName, sParamValue);
          }
        }
      }
      return ret;
    }