private char?PeekNextChar(CharEnumerator charSequence) { var clone = (CharEnumerator)charSequence.Clone(); var canMove = clone.MoveNext(); return(canMove ? (char?)clone.Current : null); }
private int CountFormat(CharEnumerator format, int endchar) { format = (CharEnumerator)format.Clone(); int count = 0; int level = 0; while (level > 0 || format.Current != endchar) { switch (format.Current) { case '\0': /* Premature end */ throw new ApplicationException( "Unmatched paren in format"); case '(': case '[': case '{': if (level == 0) { count++; } level++; break; case ')': case ']': case '}': level--; break; case '#': case '&': case ',': case ':': case ' ': case '\t': break; default: if (level == 0) { count++; } break; } format.MoveNext(); } return(count); }
//生成Token表并返回 public List <Token> TokenHandle() { source += '\n'; CharEnumerator pr = source.GetEnumerator(); char c; Token token; Token temp; pr.MoveNext(); while (true) { c = pr.Current; while (c == ' ' || c == '\n' || c == '\t') { if (pr.MoveNext()) { c = pr.Current; } else { return(tokenList); } } token = new Token(); foreach (var getToken in typeHandleList) { temp = getToken((CharEnumerator)pr.Clone()); if (temp.Length > token.Length) { token = temp; } } if (token.Length > 0) { pr = token.p; if (token.isLast) { tokenList.Add(token); return(tokenList); } } else { token.type = "Illegal Character"; token.value = pr.Current.ToString(); pr.MoveNext(); } tokenList.Add(token); } }
private void ConvertTuple(CharEnumerator format, int flags) { int level = 0; int n = 0; var formatsave = format; format = (CharEnumerator)format.Clone(); for (;;) { var c = PopChar(format); if (c == '(') { if (level == 0) { n++; } level++; } else if (c == ')') { if (level == 0) { break; } level--; } else if (c == ':' || c == ';' || c == '\0') { break; } else if (level == 0 && char.IsLetter(c)) { n++; } } format = formatsave; for (int i = 0; i < n; i++) { ConvertItem(format, flags); } }
private static bool Like(CharEnumerator inputEnumerator, CharEnumerator maskEnumerator) { while (maskEnumerator.MoveNext()) { switch (maskEnumerator.Current) { case '?': if (!inputEnumerator.MoveNext()) { return(false); } break; case '*': do { var inputTryAhead = (CharEnumerator)inputEnumerator.Clone(); var maskTryAhead = (CharEnumerator)maskEnumerator.Clone(); if (Like(inputTryAhead, maskTryAhead)) { return(true); } } while (inputEnumerator.MoveNext()); return(false); case '\\': // escape maskEnumerator.MoveNext(); goto default; default: if (!inputEnumerator.MoveNext() || inputEnumerator.Current != maskEnumerator.Current) { return(false); } break; } } return(!inputEnumerator.MoveNext()); }
/// <summary> /// This method strips hex encoded characters from the session /// name stored in the registry /// Based on the unmungestr() method in WINDOWS\WINSTORE.c /// from the PuTTY v0.60 src tree /// Support for different codepages has been added to attempt to /// match the PuTTY encoding /// </summary> /// <param name="key">The registry key name to convert</param> /// <returns>The display formatted session name</returns> private String convertSessionKeyToDisplay(string key) { CharEnumerator ce = key.GetEnumerator(); StringBuilder sb = new StringBuilder(key.Length); while (ce.MoveNext()) { if (ce.Current == '%') { CharEnumerator clone = (CharEnumerator)ce.Clone(); StringBuilder hexVal = new StringBuilder(2); if (clone.MoveNext()) { hexVal.Append(clone.Current); } if (clone.MoveNext()) { hexVal.Append(clone.Current); } if (hexVal.Length == 2) { Byte byteVal = Byte.Parse(hexVal.ToString(), System.Globalization.NumberStyles.HexNumber); sb.Append(systemEncoding.GetString(new byte[] { byteVal })); ce.MoveNext(); ce.MoveNext(); } else { sb.Append(ce.Current); } } else { sb.Append(ce.Current); } } return(sb.ToString()); }