internal void ConsumeSubString(DTSubString sub) { Contract.Assert(sub.index == Index, "sub.index == Index"); Contract.Assert(sub.index + sub.length <= len, "sub.index + sub.length <= len"); Index = sub.index + sub.length; if (Index < len) { m_current = Value[Index]; } }
internal DTSubString GetSubString() { DTSubString sub = new DTSubString(); sub.index = Index; sub.s = Value; while (Index + sub.length < len) { DTSubStringType currentType; Char ch = Value[Index + sub.length]; if (ch >= '0' && ch <= '9') { currentType = DTSubStringType.Number; } else { currentType = DTSubStringType.Other; } if (sub.length == 0) { sub.type = currentType; } else { if (sub.type != currentType) { break; } } sub.length++; if (currentType == DTSubStringType.Number) { // Incorporate the number into the value // Limit the digits to prevent overflow if (sub.length > DateTimeParse.MaxDateTimeNumberDigits) { sub.type = DTSubStringType.Invalid; return sub; } int number = ch - '0'; Contract.Assert(number >= 0 && number <= 9, "number >= 0 && number <= 9"); sub.value = sub.value * 10 + number; } else { // For non numbers, just return this length 1 token. This should be expanded // to more types of thing if this parsing approach is used for things other // than numbers and single characters break; } } if (sub.length == 0) { sub.type = DTSubStringType.End; return sub; } return sub; }