/// <summary> /// Read the GEDCOM Tag identifier /// </summary> private void ScanTag() { _reader.MarkLexemeStart(); for (; ; _reader.ReadChar()) { // switch on the acceptable characters to find switch (_reader.CurrChar()) { case ' ': case '\r': case '\n': case '\0': // End of tag _reader.MarkLexemeEnd(); return; default: if (GedcomCharType.IsTagChar(_reader.CurrChar()) == false) { throw new GedcomException("BAD TAG CHAR", _reader.CurrChar(), _reader.CurrColumn(), _lineNum); } break; } } }
/// <summary> /// Read a GEDCOM XREF - a string delineated by '@' symbols /// </summary> private void ScanXref() { // Advance past the first @ _reader.ReadChar(); _reader.MarkLexemeStart(); for (; ; _reader.ReadChar()) { switch (_reader.CurrChar()) { case ' ': case '\r': case '\n': case '\0': return; case '@': _reader.MarkLexemeEnd(); _reader.ReadChar(); // End of tag return; default: if (!GedcomCharType.IsXrefChar(_reader.CurrChar())) { throw new GedcomException("BAD XREF CHAR", _reader.CurrChar(), _reader.CurrColumn(), _lineNum); } break; } } }
/// <summary> /// Read the GEDCOM Level identifier /// </summary> private void ScanLevel() { _reader.MarkLexemeStart(); while (true) { switch (_reader.CurrChar()) { case ' ': // Maximum of 2 digits allowed if (_reader.MarkedLength() > 2) { throw new GedcomException("BAD LEVEL", _reader.CurrChar(), _reader.CurrColumn(), _lineNum); } _reader.MarkLexemeEnd(); return; default: if (!GedcomCharType.IsLevelChar(_reader.CurrChar())) { throw new GedcomException("BAD LEVEL CHAR", _reader.CurrChar(), _reader.CurrColumn(), _lineNum); } _reader.ReadChar(); break; } } }
/// <summary> /// Read the 'Value' of the GEDCOM line /// </summary> private void ScanText() { // Good candidate for performance improvements _reader.MarkLexemeStart(); for (; ; _reader.ReadChar()) { switch (_reader.CurrChar()) { case '\r': case '\n': case '\0': // End of tag _reader.MarkLexemeEnd(); return; case '@': _reader.ReadChar(); switch (_reader.CurrChar()) { case '#': // found an escape return; case '@': // OK break; default: if (_strict) { throw new GedcomException("BAD ESCAPE CHAR", _reader.CurrChar(), _reader.CurrColumn() - 1, _lineNum); } break; } break; default: if (!GedcomCharType.IsLineValueChar(_reader.CurrChar())) { throw new GedcomException("BAD LINE VALUE CHAR", _reader.CurrChar(), _reader.CurrColumn(), _lineNum); } break; } } }