public void CopyEntry(CgtWriter writer) { if (writer == null) { throw new ArgumentNullException("writer"); } switch (ReadEntryType()) { case CgtEntryType.Boolean: writer.WriteBoolEntry(reader.ReadBoolean()); break; case CgtEntryType.Byte: writer.WriteByteEntry(reader.ReadByte()); break; case CgtEntryType.Empty: writer.WriteEmptyEntry(); break; case CgtEntryType.Integer: writer.WriteIntegerEntry(reader.ReadUInt16()); break; case CgtEntryType.String: writer.WriteStringEntry(ReadString()); break; default: throw new InvalidOperationException("Unknown entry type"); } }
public static void Pack(BinaryReader input, BinaryWriter output) { if (input == null) { throw new ArgumentNullException("input"); } if (output == null) { throw new ArgumentNullException("output"); } CgtReader reader = new CgtReader(input); CgtWriter writer = new CgtWriter(output); string header = reader.ReadHeaderString(); Match headerMatch = FileHeader.Match(header); if (headerMatch.Groups["version"].Value != "1.0") { throw new FileLoadException("The File Header is invalid or of an unsupported version for packing, only uncompressed V1.0 Compiled Grammar Files are supported"); } writer.WriteHeaderString(header); while (reader.HasMoreData()) { CgtRecordType recordType = reader.ReadNextRecord(); switch (recordType) { case CgtRecordType.Charsets: int index = reader.ReadIntegerEntry(); string chars = reader.ReadStringEntry(); DfaCharset charset = new DfaCharset(null, index, chars); if (charset.SequenceLength >= 4) { writer.WriteNextRecord(CgtRecordType.PackedCharsets, 4); writer.WriteIntegerEntry(index); writer.WriteIntegerEntry(charset.SequenceStart); writer.WriteIntegerEntry(charset.SequenceEnd); writer.WriteStringEntry(new string(charset.CharactersExcludingSequence)); } else { writer.WriteNextRecord(CgtRecordType.Charsets, 2); writer.WriteIntegerEntry(index); writer.WriteStringEntry(chars); } break; default: writer.WriteNextRecord(recordType, reader.EntryCount); while (reader.EntryCount > 0) { reader.CopyEntry(writer); } break; } } output.Flush(); }