Created
May 9, 2022 14:25
-
-
Save tslater2006/8c8dc1d8642e17573a6007ba7f49bd4e to your computer and use it in GitHub Desktop.
Testing Pivet Parser on new Tools Rel
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* Note this requires DMSLib and Parser.cs from Pivet */ | |
| /* Also requires a DMS export of PSPCMPROG and PSPCMNAME */ | |
| using PeopleCodeLib.Decoder; | |
| using System.Diagnostics; | |
| var dmsFile = DMSLib.DMSReader.Read(@"C:\Users\tslat\Downloads\TIM_PT859.DAT"); | |
| Console.WriteLine("Read file. Tables: " + dmsFile.Tables.Count); | |
| var progTable = dmsFile.Tables.Where(t => t.Name == "PSPCMPROG").First(); | |
| var namesTable = dmsFile.Tables.Where(t => t.Name == "PSPCMNAME").First(); | |
| Directory.CreateDirectory("PeopleCode"); | |
| // change prog table to treat PROGTXT as image type | |
| // This forces GetValue() to return byte[] | |
| progTable.Metadata.FieldMetadata[24].FieldType = DMSLib.FieldTypes.IMG_OR_ATTACH; | |
| /* Write out each prog row to Peoplecode\<ProgKeys>\<ProgSeq>.bin" */ | |
| foreach (var r in progTable.Rows) | |
| { | |
| var rowVals = r.GetValuesAsString(); | |
| var z = rowVals[0..14]; | |
| var progSeq = rowVals[14]; | |
| var folder = $"PeopleCode\\{String.Join('_', z).Replace(' ','_').Replace('?','_')}"; | |
| Directory.CreateDirectory(folder); | |
| byte[] progData = (byte[])r.GetValue(24); | |
| File.WriteAllBytes($"{folder}\\{progSeq}.bin", progData ); | |
| } | |
| /* Write out each reference row to Peoplecode\<ProgKeys>\Names\<NameNum>.bin" */ | |
| foreach (var r in namesTable.Rows) | |
| { | |
| var rowVals = r.GetValuesAsString(); | |
| var z = rowVals[0..14]; | |
| var nameNum = rowVals[14]; | |
| var baseFolder = $"PeopleCode\\{String.Join('_', z).Replace(' ', '_').Replace('?', '_')}"; | |
| /* only write it out if its for a PPC program that exists */ | |
| if (Directory.Exists(baseFolder)) | |
| { | |
| var folder = $"{baseFolder}\\Names"; | |
| Directory.CreateDirectory(folder); | |
| var refData = $"{rowVals[15]}.{rowVals[16]}"; | |
| File.WriteAllText($"{folder}\\{nameNum}.bin", refData); | |
| } | |
| } | |
| /* For each progam we wrote out */ | |
| foreach(var progDir in Directory.EnumerateDirectories("PeopleCode", "*", new EnumerationOptions() { RecurseSubdirectories = false })){ | |
| /* sort the prog bin files in seq order */ | |
| List<string> ppcFiles = Directory.EnumerateFiles(progDir, "*.bin", new EnumerationOptions() { RecurseSubdirectories=false } ).ToList(); | |
| List<string> sortedPPC = ppcFiles.OrderBy(x => int.Parse(x.Split('\\').Last().Split('.')[0])).ToList(); | |
| /* concat all prog parts to byte[] */ | |
| MemoryStream ms = new MemoryStream(); | |
| foreach(var ppc in sortedPPC) | |
| { | |
| ms.Write(File.ReadAllBytes(ppc)); | |
| } | |
| byte[] progData = ms.ToArray(); | |
| /* load any references found in Names folder */ | |
| var references = new List<Dictionary<string, string>>(); | |
| foreach(var nameFile in Directory.EnumerateFiles($"{progDir}\\Names")) | |
| { | |
| var nameNum = nameFile.Split("\\").Last().Split('.')[0]; | |
| var fileParts = File.ReadAllText(nameFile).Split('.'); | |
| var recName = fileParts[0]; | |
| var refName = fileParts[1]; | |
| var reference = new Dictionary<string, string>(); | |
| reference.Add("NAMENUM", nameNum); | |
| reference.Add("RECNAME", recName); | |
| reference.Add("REFNAME", refName); | |
| references.Add(reference); | |
| } | |
| /* Execute PPC parser - Be sure to enable Debugger.Break() on the default: case to catch new opcodes */ | |
| var progText = new Parser().ParsePPC(progData, references); | |
| /* Write it out if you want */ | |
| File.WriteAllText($"{progDir}\\peoplecode.txt", progText); | |
| } | |
| Console.WriteLine("All done!"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment