using System.Text; namespace Org.BouncyCastle.Asn1.X509 { /** * class for breaking up an X500 Name into it's component tokens, ala * java.util.StringTokenizer. We need this class as some of the * lightweight Java environment don't support classes like * StringTokenizer. */ public class X509NameTokenizer { private string value; private int index; private char separator; private StringBuilder buffer = new StringBuilder(); public X509NameTokenizer( string oid) : this(oid, ',') { } public X509NameTokenizer( string oid, char separator) { this.value = oid; this.index = -1; this.separator = separator; } public bool HasMoreTokens() { return index != value.Length; } public string NextToken() { if (index == value.Length) { return null; } int end = index + 1; bool quoted = false; bool escaped = false; buffer.Remove(0, buffer.Length); while (end != value.Length) { char c = value[end]; if (c == '"') { if (!escaped) { quoted = !quoted; } else { buffer.Append(c); escaped = false; } } else { if (escaped || quoted) { if (c == '#' && buffer[buffer.Length - 1] == '=') { buffer.Append('\\'); } else if (c == '+' && separator != '+') { buffer.Append('\\'); } buffer.Append(c); escaped = false; } else if (c == '\\') { escaped = true; } else if (c == separator) { break; } else { buffer.Append(c); } } end++; } index = end; return buffer.ToString().Trim(); } } }