public static CompanionFile CreateCompanionFile(CompanionFileType fileType, int offset, byte[] data) { CompanionFile cf = null; switch (fileType) { case CompanionFileType.FGRP: cf = new FGRP(); break; case CompanionFileType.MGRP: cf = new MGRP(); break; case CompanionFileType.DVIC: cf = new DVIC(); break; case CompanionFileType.XMTR: cf = new XMTR(); break; case CompanionFileType.RCVR: cf = new RCVR(); break; case CompanionFileType.ICMD: cf = new ICMD(); break; case CompanionFileType.PRND: cf = new PRND(); break; case CompanionFileType.EVNT: cf = new EVNT(); break; case CompanionFileType.RESP: cf = new RESP(); break; case CompanionFileType.JOBF: cf = new JOBF(); break; case CompanionFileType.TEXT: cf = new TEXT(); break; case CompanionFileType.DIRC: cf = new DIRC(); break; case CompanionFileType.TELV: cf = new TELV(); break; case CompanionFileType.ZONE: cf = new ZONE(); break; case CompanionFileType.FEMA: cf = new FEMA(); break; case CompanionFileType.DIAL: cf = new DIAL(); break; case CompanionFileType.INPU: cf = new INPU(); break; case CompanionFileType.SCHD: cf = new SCHD(); break; case CompanionFileType.TELL: cf = new TELL(); break; case CompanionFileType.ZNAM: cf = new ZNAM(); break; case CompanionFileType.TRAN: cf = new TRAN(); break; case CompanionFileType.RNAM: cf = new RNAM(); break; case CompanionFileType.JOBX: cf = new JOBX(); break; case CompanionFileType.WORK: cf = new WORK(); break; case CompanionFileType.NOTE: cf = new NOTE(); break; case CompanionFileType.RDAT: cf = new RDAT(); break; case CompanionFileType.CWAP: cf = new CWAP(); break; case CompanionFileType.IPSH: cf = new IPSH(); break; case CompanionFileType.IUSR: cf = new IUSR(); break; case CompanionFileType.PAGR: cf = new PAGR(); break; case CompanionFileType.REMS: cf = new REMS(); break; case CompanionFileType.LTXT: cf = new LTXT(); break; default: cf = null; break; } if (cf != null) { cf.FileType = fileType; cf.FromList(offset, data); } return cf; }
public static string FileFormat(CompanionFileType fileType, bool useAlternate = false) { // The format string defines how a single record appears in human-readable format in a workbench file. // It does not attempt to define the meaning of any given piece of data; it is meant to format a byte // stream as a single record in the Workbench file. // The format is structured as follows: // | (vertical bar) a line-break // r[{n};{format}] repeat {format} {n} times // s{n} double-quoted string of length {n} // z{n} double-quoted string of length {n}, however null characters are emitted as bytes // text.txt: "Some text here ",0," " // b{n} comma-separated list of {n} bytes // , (comma) literal comma separating items on a single line switch (fileType) { case CompanionFileType.FGRP: return "r[8;b12]|s18,b14"; case CompanionFileType.MGRP: return "r[5;b2]|r[4;b4]|r[22;b1]"; case CompanionFileType.DVIC: return "s18,s10,s18,b2"; case CompanionFileType.XMTR: return "b2"; case CompanionFileType.RCVR: return "b1,s10,s10,b3"; case CompanionFileType.ICMD: return "s18,b2"; case CompanionFileType.PRND: return "b224|b22|s10"; case CompanionFileType.EVNT: return "s18,s10,s3,s18,s18,s18,s18,b9"; case CompanionFileType.RESP: return "s30,b2"; case CompanionFileType.JOBF: return "s10|s18|s18|s32|s32|r[27;b1]|s17|b1|b1|b1|b1|b2|b2|b2|s12|s12|s4|b1|b1|b1|b2|r[12;b1]|b2|b1|b2|b1|b1|b1|b1|r[8;b3]|b1|b1|b2|r[10;b1]"; case CompanionFileType.PHON: throw new InvalidOperationException("PHON is not in use."); case CompanionFileType.TEXT: return "z32"; case CompanionFileType.DIRC: return "b2"; case CompanionFileType.ADDR: throw new InvalidOperationException("ADDR is not in use."); case CompanionFileType.TELD: throw new InvalidOperationException("TELD is not in use."); case CompanionFileType.TELV: return "b8"; case CompanionFileType.ZONE: return "s10"; case CompanionFileType.FEMA: return "b2"; case CompanionFileType.DIAL: return "b3"; case CompanionFileType.INPU: return "b2,s16,b10|b1,s16,s16,b13|b17|b5"; case CompanionFileType.SCHD: return "r[8;b4]|s10|b6"; case CompanionFileType.TELL: return "b2"; case CompanionFileType.ZNAM: return "s10,s18"; case CompanionFileType.TRAN: return "b2"; case CompanionFileType.RNAM: return "s18,s18,b6"; case CompanionFileType.JOBX: return "b7|b2|b2|b12|b12|b1|b2|r[8;b1]|b2|b13|r[5;b2]|b1|b2|r[5;b4]|b2|b10|b2|b6,s64|b50|s18|s10"; case CompanionFileType.WORK: return "s10|s10|b4|b2|b2|b1|s8|r[219;b1]"; case CompanionFileType.NOTE: return "s128"; case CompanionFileType.RDAT: return "s8,s8"; case CompanionFileType.CWAP: return "b4,s10,s10"; case CompanionFileType.IPSH: return "s50,s50,s50,b2,s50,s4,b50"; case CompanionFileType.IUSR: return "s50,s50,s50,s50,b56"; case CompanionFileType.PAGR: return "s18,b14"; case CompanionFileType.REMS: return "b7|b3|b7|s160|b2|b4|s20,b5|s10,b4,s10|b24"; case CompanionFileType.LTXT: return useAlternate == false ? "c64" : "b64"; default: return string.Empty; } }
public static int RecordSize(CompanionFileType fileType) { switch (fileType) { case CompanionFileType.FGRP: return 128; case CompanionFileType.MGRP: return 48; case CompanionFileType.DVIC: return 48; case CompanionFileType.XMTR: return 2; case CompanionFileType.RCVR: return 24; case CompanionFileType.ICMD: return 20; case CompanionFileType.PRND: return 256; case CompanionFileType.EVNT: return 112; case CompanionFileType.RESP: return 32; case CompanionFileType.JOBF: return 256; case CompanionFileType.PHON: throw new InvalidOperationException("PHON is not in use."); case CompanionFileType.TEXT: return 32; case CompanionFileType.DIRC: return 2; case CompanionFileType.ADDR: throw new InvalidOperationException("ADDR is not in use."); case CompanionFileType.TELD: throw new InvalidOperationException("TELD is not in use."); case CompanionFileType.TELV: return 8; case CompanionFileType.ZONE: return 10; case CompanionFileType.FEMA: return 2; case CompanionFileType.DIAL: return 3; case CompanionFileType.INPU: return 96; case CompanionFileType.SCHD: return 48; case CompanionFileType.TELL: return 2; case CompanionFileType.ZNAM: return 28; case CompanionFileType.TRAN: return 2; case CompanionFileType.RNAM: return 42; case CompanionFileType.JOBX: return 256; case CompanionFileType.WORK: return 256; case CompanionFileType.NOTE: return 128; case CompanionFileType.RDAT: return 16; case CompanionFileType.CWAP: return 24; case CompanionFileType.IPSH: return 256; case CompanionFileType.IUSR: return 256; case CompanionFileType.PAGR: return 32; case CompanionFileType.REMS: return 256; case CompanionFileType.LTXT: return 64; default: return 0; } }
private byte[] LoadSectionFromReader(StreamReader reader, int expectedSize, CompanionFileType fileType) { List<byte> data = new List<byte>(); int bytesRead = 0; while (bytesRead < expectedSize && !reader.EndOfStream) { string line = reader.ReadLine(); line = line.Replace('é', 'e'); List<byte> lineBytes = ParseLine(line); // Special Handling // RNAM - If the row appears filled with 0x255, make it a blank row. // "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ","ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ",0,0,0,0,0,0 // if (fileType == CompanionFileType.RNAM) { if (lineBytes.Count == 114) { // .net reads as UTF8, so a byte comparison is iffy. The row will be expanded to 114 UTF8 bytes when it is bad. lineBytes = new List<byte> { 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0 }; } } // probably have to add PAGR and REMS as well. data.AddRange(lineBytes); bytesRead += lineBytes.Count; } return data.ToArray(); }