public void ShouldAddIntToTable() { var hashTable = new IntHashTable(); hashTable.Add(1); Assert.True(hashTable.Contains(1)); }
static IntHashTable LoadNameStream(BitAccess bits) { IntHashTable ht = new IntHashTable(); uint sig; int ver; bits.ReadUInt32(out sig); // 0..3 Signature bits.ReadInt32(out ver); // 4..7 Version // Read (or skip) string buffer. int buf; bits.ReadInt32(out buf); // 8..11 Bytes of Strings if (sig != 0xeffeeffe || ver != 1) { throw new PdbDebugException("Unsupported Name Stream version. " + "(sig={0:x8}, ver={1})", sig, ver); } int beg = bits.Position; int nxt = bits.Position + buf; bits.Position = nxt; // Read hash table. int siz; bits.ReadInt32(out siz); // n+0..3 Number of hash buckets. nxt = bits.Position; for (int i = 0; i < siz; i++) { int ni; string name; bits.ReadInt32(out ni); if (ni != 0) { int saved = bits.Position; bits.Position = beg + ni; bits.ReadCString(out name); bits.Position = saved; ht.Add(ni, name); } } bits.Position = nxt; return(ht); }
private static IntHashTable LoadNameStream(BitAccess bits) { IntHashTable ht = new IntHashTable(); uint sig; int ver; bits.ReadUInt32(out sig); // 0..3 Signature bits.ReadInt32(out ver); // 4..7 Version // Read (or skip) string buffer. int buf; bits.ReadInt32(out buf); // 8..11 Bytes of Strings if (sig != 0xeffeeffe || ver != 1) { throw new Exception(string.Format("Unsupported Name Stream version. (sig={0:x8}, ver={1})", sig, ver)); } int beg = bits.Position; int nxt = bits.Position + buf; bits.Position = nxt; // Read hash table. int siz; bits.ReadInt32(out siz); // n+0..3 Number of hash buckets. nxt = bits.Position; for (int i = 0; i < siz; i++) { int ni; string name; bits.ReadInt32(out ni); if (ni != 0) { int saved = bits.Position; bits.Position = beg + ni; bits.ReadCString(out name); bits.Position = saved; ht.Add(ni, name); } } bits.Position = nxt; return ht; }
private static IntHashTable ReadSourceFileInfo( BitAccess bits, uint limit, IntHashTable names, MsfDirectory dir, Dictionary<string, int> nameIndex, PdbReader reader) { IntHashTable checks = new IntHashTable(); int begin = bits.Position; while (bits.Position < limit) { int sig; int siz; bits.ReadInt32(out sig); bits.ReadInt32(out siz); int place = bits.Position; int endSym = bits.Position + siz; switch ((DEBUG_S_SUBSECTION)sig) { case DEBUG_S_SUBSECTION.FILECHKSMS: while (bits.Position < endSym) { CV_FileCheckSum chk; int ni = bits.Position - place; bits.ReadUInt32(out chk.name); bits.ReadUInt8(out chk.len); bits.ReadUInt8(out chk.type); PdbSource src = new PdbSource(/*(uint)ni,*/ (string)names[(int)chk.name], SymDocumentType.Text, Guid.Empty, Guid.Empty); checks.Add(ni, src); bits.Position += chk.len; bits.Align(4); } bits.Position = endSym; break; default: bits.Position = endSym; break; } } return checks; }
private void RepairPropTypes() { int propID = GetPropId("ID"); int propName = GetPropId("Name"); int propDataType = GetPropId("DataType"); int propFlags = GetPropId("Flags"); int typePropType = GetResourceTypeId("PropType"); bool needRebuildIndexes = false; if (_propTypes.PeekNextID() > 65536) { needRebuildIndexes = true; } using (IResultSet rs = _propTypes.CreateResultSet(0)) { foreach (IRecord rec in rs) { int typeId = rec.GetIntValue(0); string name = rec.GetStringValue(1); int dataType = rec.GetIntValue(2); int flags = rec.GetIntValue(3); if (typeId < 0 || typeId > 65536) { ReportError("Invalid property type ID " + typeId); if (_fixErrors) { rec.Delete(); _fixCount++; needRebuildIndexes = true; continue; } } if (_propTypeMap.Contains(typeId)) { ReportError("Duplicate property ID " + typeId); } if (_propTypeNames.Contains(name)) { ReportError("Duplicate property name " + name); } _propTypeMap.Add(typeId, name); _propTypeNames.Add(name); _propDataTypes [typeId] = dataType; if (_dumpStructure) { ShowProgress("Property type {0}, name {1}, dataType {2}, flags {3}", typeId, name, dataType, (PropTypeFlags)flags); } int resID; try { resID = FindResource(typePropType, _stringProps, propName, name); } catch (Exception e) { ReportError("Property " + name + ": " + e.Message); continue; } if (resID == -1) { ReportError("Could not find matching resource for property name " + name); if (_fixErrors) { try { int resourceId = CreateResource(typePropType); CreatePropValue(_stringProps, resourceId, propName, name); CreatePropValue(_intProps, resourceId, propID, typeId); CreatePropValue(_intProps, resourceId, propDataType, dataType); CreatePropValue(_intProps, resourceId, propFlags, flags); _fixCount++; } catch (Exception e) { ReportError("Failed to create property type resource: " + e.Message); } } continue; } object idValue = GetPropValueSafe(_intProps, resID, propID); if (idValue == null) { ReportError("ID property not found for property " + name); } else if ((int)idValue != typeId) { ReportError("ID property for property " + name + " does not match ID value"); if (_fixErrors) { Trace.WriteLine("Set ID property of PropType resource " + name + " to " + typeId); UpdatePropValue(_intProps, resID, propID, typeId); _fixCount++; } } object dataTypeValue = GetPropValueSafe(_intProps, resID, propDataType); if (dataTypeValue == null) { ReportError("DataType property not found for property " + name); } else if ((int)dataTypeValue != dataType) { ReportError("DataType property for property " + name + " does not match Type value"); } object flagsValue = GetPropValueSafe(_intProps, resID, propFlags); if (flagsValue == null) { ReportError("Flags property not found for property " + name); } else if ((int)flagsValue != flags) { ReportError("Flags property for property " + name + " does not match Flags value. Fixing..."); UpdatePropValue(_intProps, resID, propFlags, flags); _fixCount++; } } } if (needRebuildIndexes) { _propTypes.RebuildIndexes(true); } }
public static int Main() { Console.WriteLine("Lab №4, Ozierski Vital, group 052004"); IntHashTable ih = new IntHashTable(50); StringHashTable sh = new StringHashTable(16); string cmd, command, mode; bool found; while (true) { Console.WriteLine(); Console.WriteLine("Commands: add, find, print"); Console.WriteLine("Format: <command> <int|string> or exit"); Console.Write("? "); cmd = Console.ReadLine(); if (cmd == "exit") break; if (cmd.Split(' ').Length != 2) Console.WriteLine("Incorrect command format"); else { command = cmd.Split(' ')[0]; mode = cmd.Split(' ')[1]; if (mode != "string" && mode != "int") Console.WriteLine("Incorrect mode"); else { if (command == "add") { Console.Write("Value: "); cmd = Console.ReadLine(); if (mode == "string") sh.Add(cmd); else if (mode == "int") ih.Add(Int32.Parse(cmd)); } else if (command == "find") { Console.Write("Value: "); cmd = Console.ReadLine(); found = false; if (mode == "string") found = sh.Find(cmd); else if (mode == "int") found = ih.Find(Int32.Parse(cmd)); Console.WriteLine(found ? "Found" : "No found"); } else if (command == "print") { if (mode == "string") sh.Print(); else if (mode == "int") ih.Print(); } else Console.WriteLine("Incorrect Command"); } Console.WriteLine(); } } return 0; }
static void LoadManagedLines(PdbFunction[] funcs, IntHashTable names, BitAccess bits, uint limit) { Array.Sort(funcs, PdbFunction.byAddress); checks.Clear(); // Read the files first int begin = bits.Position; while (bits.Position < limit) { int sig; int siz; bits.ReadInt32(out sig); bits.ReadInt32(out siz); int place = bits.Position; int endSym = bits.Position + siz; switch ((DEBUG_S_SUBSECTION)sig) { case DEBUG_S_SUBSECTION.FILECHKSMS: while (bits.Position < endSym) { CV_FileCheckSum chk; int ni = bits.Position - place; bits.ReadUInt32(out chk.name); bits.ReadUInt8(out chk.len); bits.ReadUInt8(out chk.type); string name = (string)names[(int)chk.name]; PdbSource src = new PdbSource((uint)ni, name); checks.Add(ni, src); bits.Position += chk.len; bits.Align(4); } bits.Position = endSym; break; default: bits.Position = endSym; break; } } // Read the lines next. bits.Position = begin; while (bits.Position < limit) { int sig; int siz; bits.ReadInt32(out sig); bits.ReadInt32(out siz); int endSym = bits.Position + siz; switch ((DEBUG_S_SUBSECTION)sig) { case DEBUG_S_SUBSECTION.LINES: { CV_LineSection sec; bits.ReadUInt32(out sec.off); bits.ReadUInt16(out sec.sec); bits.ReadUInt16(out sec.flags); bits.ReadUInt32(out sec.cod); PdbFunction func = FindFunction(funcs, sec.sec, sec.off); // Count the line blocks. int begSym = bits.Position; int blocks = 0; while (bits.Position < endSym) { CV_SourceFile file; bits.ReadUInt32(out file.index); bits.ReadUInt32(out file.count); bits.ReadUInt32(out file.linsiz); // Size of payload. int linsiz = (int)file.count * (8 + ((sec.flags & 1) != 0 ? 4 : 0)); bits.Position += linsiz; blocks++; } func.lines = new PdbLines[blocks]; int block = 0; bits.Position = begSym; while (bits.Position < endSym) { CV_SourceFile file; bits.ReadUInt32(out file.index); bits.ReadUInt32(out file.count); bits.ReadUInt32(out file.linsiz); // Size of payload. PdbSource src = (PdbSource)checks[(int)file.index]; PdbLines tmp = new PdbLines(src, file.count); func.lines[block++] = tmp; PdbLine[] lines = tmp.lines; int plin = bits.Position; int pcol = bits.Position + 8 * (int)file.count; for (int i = 0; i < file.count; i++) { CV_Line line; CV_Column column = new CV_Column(); bits.Position = plin + 8 * i; bits.ReadUInt32(out line.offset); bits.ReadUInt32(out line.flags); uint delta = (line.flags & 0x7f000000) >> 24; bool statement = ((line.flags & 0x80000000) == 0); if ((sec.flags & 1) != 0) { bits.Position = pcol + 4 * i; bits.ReadUInt16(out column.offColumnStart); bits.ReadUInt16(out column.offColumnEnd); } lines[i] = new PdbLine(line.offset, line.flags & 0xffffff, column.offColumnStart, column.offColumnEnd); } } break; } } bits.Position = endSym; } }