public List <SearchVariable> parseVariables(PcmFile PCM) { List <SearchVariable> searchVariables = new List <SearchVariable>(); string[] varlist = Variables.Split(','); for (int v = 0; v < varlist.Length; v++) { string[] varParts = varlist[v].Split('='); if (varParts.Length < 2) { Debug.WriteLine("Unknown variable: " + varlist[v]); } else { if (varParts[1].StartsWith("@")) { SearchVariable SV = new SearchVariable(); SV.Name = varParts[0].Trim(); uint location; int bytes; string[] svDataParts = varParts[1].Split(':'); if (!HexToUint(svDataParts[0].Replace("@", ""), out location)) { throw new Exception("Can't decode variable location: " + varlist[v]); } if (!HexToInt(svDataParts[1].Replace("@", ""), out bytes)) { throw new Exception("Can't decode variable size: " + varlist[v]); } for (int i = 0; i < bytes; i++) { SV.Data += PCM.buf[location + i].ToString("X2") + " "; } SV.Data = SV.Data.Trim(); searchVariables.Add(SV); Debug.WriteLine("New variable: " + SV.Name + "=" + SV.Data); } else { string[] svDataParts = varParts[1].Split(';'); foreach (string svDataPart in svDataParts) { SearchVariable SV = new SearchVariable(); SV.Name = varParts[0].Trim();; SV.Data = svDataPart.Trim(); searchVariables.Add(SV); Debug.WriteLine("New variable: " + SV.Name + "=" + SV.Data); } } } } return(searchVariables); }
private TableSearchResult parseMatch(PcmFile PCM, TableSearchConfig.ParsedTableSearchConfig parsedConfig, TableSearchConfig tableSearchConfig, uint addr) { TableSearchResult tsr = new TableSearchResult(); tsr.OS = PCM.OS; tsr.File = PCM.FileName; tsr.Search = parsedConfig.searchString; tsr.Name = tableSearchConfig.Name; tsr.Found = addr.ToString("X8") + ":"; for (uint t = 0; t < parsedConfig.searchParts.Count; t++) { if (t > 0) { tsr.Found += " "; } tsr.Found += PCM.buf[addr + t].ToString("X2"); } if (tableSearchConfig.Items.Length > 0) { string[] items = tableSearchConfig.Items.Split(','); for (int p = 0; p < items.Length; p++) { string[] itemParts = items[p].Split(':'); uint location = (uint)(addr + int.Parse(itemParts[1])); if (itemParts.Length == 3) { SearchVariable SV = new SearchVariable(); SV.Name = itemParts[0]; if (itemParts[2].ToLower() == "e") { location += (uint)parsedConfig.searchParts.Count; } tsr.AddressInt = location; tsr.Data = SV.Name; SV.Data = ((location & 0xFF000000) >> 24).ToString("X2") + " " + ((location & 0xFF0000) >> 16).ToString("X2") + " " + ((location & 0xFF00) >> 8).ToString("X2") + " " + (location & 0xFF).ToString("X2"); searchVariables.Add(SV); } else { if (itemParts.Length != 4) { throw new Exception("item needs 4 parts: name:location:bytes:type, for example: rows:1:2:int"); } if (itemParts[0].StartsWith("@")) { tsr.AddressInt = BEToUint32(PCM.buf, location); } if (tsr.Data != null && tsr.Data.Length > 1) { tsr.Data += "; "; } tsr.Data += itemParts[0] + ":"; //Item name string formatString = ""; if (itemParts[3].ToLower() == "hex") { formatString = "X"; } if (itemParts[2] == "1") { tsr.Data += PCM.buf[location].ToString(formatString); } if (itemParts[2] == "2") { tsr.Data += BEToUint16(PCM.buf, location).ToString(formatString); } if (itemParts[2] == "4") { tsr.Data += BEToUint32(PCM.buf, location).ToString(formatString); } if (itemParts[2] == "8") { tsr.Data += BEToUint16(PCM.buf, location).ToString(formatString); } } for (int seg = 0; seg < Segments.Count; seg++) { for (int b = 0; b < PCM.binfile[seg].SegmentBlocks.Count; b++) { if (tsr.AddressInt >= PCM.binfile[seg].SegmentBlocks[b].Start && tsr.AddressInt <= PCM.binfile[seg].SegmentBlocks[b].End) { tsr.Segment = PCM.segmentinfos[seg].Name; } } } } } if (parsedConfig.searchString.Contains(":")) { int k = 0; while (k < parsedConfig.searchParts.Count) { if (parsedConfig.searchParts[k].Contains(":")) { string[] varParts = parsedConfig.searchParts[k].Split(':'); if (varParts.Length == 2) { //Set variable SearchVariable SV = new SearchVariable(); SV.Name = varParts[0]; tsr.Data += SV.Name; int bytes = int.Parse(varParts[1]); uint location = (uint)(addr + k); tsr.AddressInt = location; for (uint l = 0; l < bytes; l++) { SV.Data += PCM.buf[location + l].ToString("X2") + " "; } SV.Data = SV.Data.Trim(); searchVariables.Add(SV); } else { //Its's item, show it. uint location = (uint)(addr + k); if (varParts[0].ToLower().StartsWith("@")) { tsr.AddressInt = BEToUint32(PCM.buf, location); } if (varParts[0].ToLower().StartsWith("row")) { tsr.Rows = PCM.buf[location]; } if (tsr.Data != null && tsr.Data.Length > 1) { tsr.Data += "; "; } tsr.Data += varParts[0] + ":"; string formatString = ""; if (varParts[2].ToLower() == "hex") { formatString = "X"; } if (varParts[1] == "1") { tsr.Data += PCM.buf[location].ToString(formatString); } if (varParts[1] == "2") { tsr.Data += BEToUint16(PCM.buf, location).ToString(formatString); } if (varParts[1] == "4") { tsr.Data += BEToUint32(PCM.buf, location).ToString(formatString); } if (varParts[1] == "8") { tsr.Data += BEToUint64(PCM.buf, location).ToString(formatString); } } for (int seg = 0; seg < Segments.Count; seg++) { for (int b = 0; b < PCM.binfile[seg].SegmentBlocks.Count; b++) { if (tsr.AddressInt >= PCM.binfile[seg].SegmentBlocks[b].Start && tsr.AddressInt <= PCM.binfile[seg].SegmentBlocks[b].End) { tsr.Segment = PCM.segmentinfos[seg].Name; } } } k += int.Parse(varParts[1]) - 1; } k++; } } for (int o = 0; o < PCM.osaAddressList.Count; o++) { if (PCM.osaAddressList[o].address == tsr.AddressInt) { tsr.Category = PCM.osaAddressList[o].category; tsr.Label = PCM.osaAddressList[o].label; tsr.Size = PCM.osaAddressList[o].size; break; } } TableSearchResult tsrNoFilter = new TableSearchResult(); tsrNoFilter.AddressInt = tsr.AddressInt; tsrNoFilter.Address = tsr.AddressInt.ToString("X8"); tsrNoFilter.Data = tsr.Data; tsrNoFilter.File = tsr.File; tsrNoFilter.Found = tsr.Found; tsrNoFilter.hitCount = 1; tsrNoFilter.Name = tsr.Name; tsrNoFilter.OS = tsr.OS; tsrNoFilter.Search = tsr.Search; tsrNoFilter.Segment = tsr.Segment; tableSearchResultNoFilters.Add(tsrNoFilter); return(tsr); }