예제 #1
0
void HuffmanCodec::generateCodeTable()
{
	heap_.clear();
	for (int i = 0; i < codeTableFill_; ++i)
		heap_.push(SymbolRef(codeTable_ + i));
	while (heap_.fill() > 1)
	{
		SymbolRef leftChild = heap_.pop();
		SymbolRef rightChild = heap_.pop();
		leftChild.symbol->parent = codeTable_ + codeTableFill_;
		rightChild.symbol->parent = codeTable_ + codeTableFill_;
		codeTable_[codeTableFill_].parent = 0;
		codeTable_[codeTableFill_].leftChild = leftChild.symbol;
		codeTable_[codeTableFill_].rightChild = rightChild.symbol;
		codeTable_[codeTableFill_].count = leftChild.symbol->count + rightChild.symbol->count;
		codeTable_[codeTableFill_].value = -1;
		heap_.push(SymbolRef(codeTable_ + codeTableFill_));
		++codeTableFill_;
	}

	if (heap_.fill() > 0)
		codeTableRoot_ = heap_.pop().symbol;
	else
		codeTableRoot_ = 0;
}
예제 #2
0
ObjectFile::symbol_iterator MachOObjectFile::begin_symbols() const {
  // DRI.d.a = segment number; DRI.d.b = symbol index.
  DataRefImpl DRI;
  DRI.d.a = DRI.d.b = 0;
  moveToNextSymbol(DRI);
  return symbol_iterator(SymbolRef(DRI, this));
}
예제 #3
0
ObjectFile::symbol_iterator MachOObjectFile::end_symbols() const {
  DataRefImpl DRI;
  DRI.d.a = MachOObj->getHeader().NumLoadCommands;
  DRI.d.b = 0;
  return symbol_iterator(SymbolRef(DRI, this));
}
예제 #4
0
SymbolRef MachOObjectFile::getSymbolNext(DataRefImpl DRI) const {
  DRI.d.b++;
  moveToNextSymbol(DRI);
  return SymbolRef(DRI, this);
}