Skip to content

Instantly share code, notes, and snippets.

@tslater2006
Created May 9, 2022 14:25
Show Gist options
  • Select an option

  • Save tslater2006/8c8dc1d8642e17573a6007ba7f49bd4e to your computer and use it in GitHub Desktop.

Select an option

Save tslater2006/8c8dc1d8642e17573a6007ba7f49bd4e to your computer and use it in GitHub Desktop.
Testing Pivet Parser on new Tools Rel
/* 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