Beispiel #1
0
//获取子文件信息
bool KPackFileManager::GetElemInfo(unsigned int uElemId, ELEM_FILE_INFO& info)
{
	memset(&info, 0, sizeof(info));
	info.uId = uElemId;
	for (info.nPakIndex = 0; info.nPakIndex < PACK_FILE_SHELL_MAX_SUPPORT_PAK_NUM; info.nPakIndex++)
	{
		unsigned int uElemIndex;
		if (!FindElem(info.uId, info.nPakIndex, uElemIndex))
			continue;
		KPackFilePartner::PACKPARTNER_ELEM_INFO	PartnerInfo;
		info.nElemIndex = uElemIndex;

		XPackIndexInfo&		IndexInfo = (m_PackItemList[info.nPakIndex].pIndexList[uElemIndex]);
		info.uCompressFlag	= (IndexInfo.uCompressSizeFlag & (~XPACK_COMPRESS_SIZE_FILTER));
		info.uStoreSize		= (IndexInfo.uCompressSizeFlag & XPACK_COMPRESS_SIZE_FILTER);
		info.uSize			= IndexInfo.uSize;
		if (m_PackPartnerList[info.nPakIndex].GetElemInfo(info.uId, PartnerInfo))
		{
			assert(info.nElemIndex == PartnerInfo.nElemIndex);
			info.uCRC = PartnerInfo.uCRC;
			info.uTime = PartnerInfo.uTime;
			strcpy(info.szFileName, PartnerInfo.szFileName);
		}
		return true;
	}
	info.nPakIndex = -1;
	return false;
}
Beispiel #2
0
bool KPackFileManager::GenerateElemIndexAndHashId(unsigned int & uElemIndex, unsigned int & uHashId)
{
    PACK_ITEM & item = m_PackItemList[m_nCurrentPakIndex];

	if (m_PackItemList[m_nCurrentPakIndex].Header.uCount == PACK_FILE_SHELL_MAX_SUPPORT_ELEM_FILE_NUM)
	{
		printf("Error: The elem file count in a single pak has reach %d!\n", PACK_FILE_SHELL_MAX_SUPPORT_ELEM_FILE_NUM);
		return false;
	}

	uHashId = g_FileNameHash(m_FullFolderFileName + m_nElemFileRootPathNotEnderLen);

	if (item.bExcludeOfCheckId == false)
	{	//==检查是否已经在其他包中有同名id==
		for (unsigned int i = 0; i < PACK_FILE_SHELL_MAX_SUPPORT_PAK_NUM; i++)
		{
			if (m_PackItemList[i].pIOFile == NULL)
				continue;
			if (i != m_nCurrentPakIndex && m_PackItemList[i].bExcludeOfCheckId)
				continue;
			unsigned int uIndex;
			if (FindElem(uHashId, i, uIndex))
			{
				printf("Error: %s has the same id %X!\n", m_FullFolderFileName + m_nElemFileRootPathNotEnderLen, uHashId);
				return false;
			}
			if (i == m_nCurrentPakIndex)
				uElemIndex = uIndex;
		}
	}
    return true;
}
Beispiel #3
0
//获取子文件信息
bool KPackFilePartner::GetElemInfo(unsigned int uElemId, PACKPARTNER_ELEM_INFO& info)
{
    unsigned int uIndex;
    if (!FindElem(uElemId, uIndex))
		return false;
	info = m_pElemInfoList[uIndex];
	return true;
}
Beispiel #4
0
//从包中解出某个文件
bool KPackFileManager::UnpackElemByID(int nPakIndex, unsigned int uElemId, const char* pDestName)
{
	if (nPakIndex < 0 || nPakIndex >= PACK_FILE_SHELL_MAX_SUPPORT_PAK_NUM || !m_PackItemList[nPakIndex].pIOFile)
		return false;
	unsigned int	uElemIndex;
	if (FindElem(uElemId, nPakIndex, uElemIndex))
		return UnpackElemByIndex(nPakIndex, uElemIndex, pDestName);
	return false;
}
Beispiel #5
0
/* -------------------------------------------------------
   Рекурсивная функция поиска элемента.
   Root - указатель на корень дерева или поддерева.
   Value - информация (целое число), которая ищется в дереве.
*/
int FindElem (int Value, struct Tree *Root)
{
/* Подсказка алгоритма:
1. ЕСЛИ поиск закончен безуспешно, т.е. обошли поддеревья,
   но элемент не нашли (т.е. Root == NULL),
   ТО возращаем ложь (в СИ - целое - 0).*/
   if (Root == NULL) return 0;

/*2. ЕСЛИ текущий узел содержит искомый элемент,
   ТО возращаем истину (в СИ # 0).*/
   if (Root->Info == Value) return 1;

/*3. ЕСЛИ элемент необходимо искать в левом поддереве,
   ТО возращаем значение, которое выдает рекурсивная функция
      поиска для левого поддерева (ищем элемент в левом поддереве),
   ИНАЧЕ возращаем значение, которое выдает рекурсивная функция
         поиска для правого поддерева (ищем элемент в правом поддереве).*/
    if (Root->Info > Value)
      return FindElem(Value, Root->LeftNext);
    else 
      return FindElem(Value, Root->RightNext);
}
/**
******************************************************************************
* Name: CIccTagStruct::GetElemNumberValue
* 
* Purpose: Returns the number value associated with the first entry of a
*  CIccTagNumberArray based tag with the given signature. 
* 
* Args: 
*  sig - subtag signature to find
*  defaultValue - value to use if the tag cannot be found, or is not a number tag
* 
* Return: 
*  The tags value or defaultValue if unable to find subtag in the struct or if the
*  subtag is not a CIccTagNumberArray based tag.
*******************************************************************************
*/
icFloatNumber CIccTagStruct::GetElemNumberValue(icSignature sig, icFloatNumber defaultValue/* =0 */)
{
  CIccTag *pTag = FindElem(sig);

  if (!pTag || !pTag->IsNumArrayType())
    return defaultValue;

  CIccTagNumArray *pNumArray = (CIccTagNumArray*)pTag;
  icFloatNumber rv = defaultValue;

  pNumArray->GetValues(&rv, 0, 1);

  return rv;
}
Beispiel #7
0
//删除打包文件中的一个子文件
bool KPackFilePartner::DeleteElemInPak(unsigned int uElemID)
{
	unsigned int uIndex;
	if (!FindElem(uElemID, uIndex))
		return false;

	--m_nElemCount;
	for (uIndex; uIndex < (unsigned int)m_nElemCount ; ++uIndex)
	{
		m_pElemInfoList[uIndex] = m_pElemInfoList[uIndex + 1];
	}

	return true;
}
Beispiel #8
0
bool CMarkupSTL::FindChildElem( const char * szName )
{
	// Change current child position only if found
	//
	// Shorthand: call this with no current main position
	// means find child under root element
	if ( ! m_iPos )
		FindElem();

	int iPosChild = x_FindElem( m_iPos, m_iPosChild, szName );
	if ( iPosChild )
	{
		// Assign new position
		int iPos = m_aPos[iPosChild].iElemParent;
		x_SetPos( m_aPos[iPos].iElemParent, iPos, iPosChild );
		return true;
	}

	return false;
}
Beispiel #9
0
int hashing(const char* buffer, int* CountOfHashing, func hashFunc)
{

	int i = 0, k = 0, j = 0;
	unsigned int hash = 0;
	char tmpStr[SIZEOFWORD] = "";
	int Firstly = 0;
	Table* table = new Table;
	List* Listy = new List[SIZEOFTABLE];
	table->f = hashFunc;
	table->list = Listy;
	//printf("----------------------\n");
	while (buffer[j] != '\0' && buffer[j] > 0)
	{
		if (!(takeWord(buffer, &j, tmpStr))) { Nerror = PTRERR; PrintError(__LINE__); }
		
		addToTable(table, tmpStr, CountOfHashing);

		//hash = f(tmpStr) % SIZEOFTABLE;
		//hash = hash % SIZEOFTABLE;
		//printf("hash = %d \n", hash);//debug
		//if (!(table->list[hash].addTail(tmpStr))) return BAD;// goto breakpoint;
		//table[hash].show();//debug
		
		memset(tmpStr, '\0', SIZEOFTABLE);

		while (buffer[j] == ' ' || buffer[j] == '\r' || buffer[j] == '\n')
			j++;
		tmpStr[0] = '\0';
	}
	
	char* ShowFind = "wei";
	if (!ShowElem(FindElem(table, ShowFind)))
		return BAD;// goto breakpoint;
	
	return OK;
//breakpoint:
}
Beispiel #10
0
//扫描整个包文件集合,对于每个子文件给出进行一次回调函数操作
//参数pFileNamePrefix表示遍历到的子文件名的前缀必须与此给定的字符串完全一致(不区分大小写),前缀不符的子文件将被略过,传入空指针表示无前缀限制。
bool	KPackFileManager::ScanAllPack(fnScanPackCallback pCallback, void* pCallbackParam, int& nCount, const char* pFileNamePrefix)
{
	nCount = 0;
	if (pFileNamePrefix == NULL)
		pFileNamePrefix = "";
	ELEM_FILE_INFO	info;
	for (info.nPakIndex = 0; info.nPakIndex < PACK_FILE_SHELL_MAX_SUPPORT_PAK_NUM; info.nPakIndex++)
	{
		PACK_ITEM& item = m_PackItemList[info.nPakIndex];
		for (info.nElemIndex = 0; info.nElemIndex < (int)item.Header.uCount; info.nElemIndex++)
		{
			XPackIndexInfo& IndexInfo = item.pIndexList[info.nElemIndex];
			info.uId = IndexInfo.uId;
			//排除已经出现过同ID的文件
			{
				int nPrePak = 0;
				for (nPrePak = 0; nPrePak < info.nPakIndex; nPrePak++)
				{
					unsigned int uPreElemIndex;                                        
					if (FindElem(info.uId, nPrePak, uPreElemIndex))
						break;
				}
				if (nPrePak < info.nPakIndex)
					continue;
			}

			KPackFilePartner::PACKPARTNER_ELEM_INFO	PartnerInfo;
			if (m_PackPartnerList[info.nPakIndex].GetElemInfo(info.uId, PartnerInfo))
			{
				if (pFileNamePrefix[0])
				{
					if (strstr(PartnerInfo.szFileName, pFileNamePrefix) != PartnerInfo.szFileName)
						continue;	//排除前缀不符合的文件
				}
				strcpy(info.szFileName, PartnerInfo.szFileName);
				info.uCRC = PartnerInfo.uCRC;
				info.uTime = PartnerInfo.uTime;
			}
			else
			{///这一块是为了什么?没看懂
				if (pFileNamePrefix[0])
					continue;
				info.szFileName[0] = 0;
				info.uCRC = 0;
				info.uTime = 0;
			}
			info.uCompressFlag = (IndexInfo.uCompressSizeFlag & (~XPACK_COMPRESS_SIZE_FILTER));
			info.uSize = IndexInfo.uSize;
			info.uStoreSize = (IndexInfo.uCompressSizeFlag & XPACK_COMPRESS_SIZE_FILTER);
			nCount++;
			if (pCallback)
			{
				if (!pCallback(info, pCallbackParam))	//返回值为0则终止扫描
				{
					return false;
				}
			}
		}
	}
	return true;
}
Beispiel #11
0
//往打包文件中添加一个子文件(已经压缩好的)
//传入参数ElemInfo::nPakIndex表示要加入哪个Pak文件
//传入参数ElemInfo::nElemIndex无意义被忽略
bool KPackFileManager::AddElemToPak(ELEM_FILE_INFO& ElemInfo, void* pBuffer)
{
	if (pBuffer == NULL || ElemInfo.nPakIndex < 0 || ElemInfo.nPakIndex >= PACK_FILE_SHELL_MAX_SUPPORT_PAK_NUM ||
		ElemInfo.uId == 0 || ElemInfo.uSize == 0 || ElemInfo.uStoreSize == 0)
	{
		return false;
	}

	PACK_ITEM& item = m_PackItemList[ElemInfo.nPakIndex];
	unsigned int uElemIndex;
	bool bExist = FindElem(ElemInfo.uId, ElemInfo.nPakIndex, uElemIndex);

	//如果原来存在同id文件,原存储大小大于等于新存储大小,则新内容存在原字文件的存储位置。
	//原存储大小小于心存储大小,则新内容存在打包文件末尾。
	long	lOffset = item.nDataEndOffset;
	bool	bAppend = true;
	if (bExist && (item.pIndexList[uElemIndex].uCompressSizeFlag & XPACK_COMPRESS_SIZE_FILTER) >= ElemInfo.uStoreSize)
	{
		lOffset = item.pIndexList[uElemIndex].uOffset;
		bAppend = false;
	}

	unsigned int uType;
	item.pIOFile->Seek(lOffset, SEEK_SET);
	m_nCurrentPakIndex = ElemInfo.nPakIndex;
	if (AddBufferToFile((unsigned char*)pBuffer, ElemInfo.uStoreSize, XPACK_METHOD_NONE, ElemInfo.uStoreSize, uType))
	{
		KPackFilePartner::PACKPARTNER_ELEM_INFO	info;
		if (!bExist)
		{
			for (unsigned int i = item.Header.uCount; i > uElemIndex; i--)
				item.pIndexList[i] = item.pIndexList[i - 1];
			item.Header.uCount++;
		}
		else
		{
			m_PackPartnerList[m_nCurrentPakIndex].GetElemInfo(ElemInfo.uId, info);
			if (stricmp(ElemInfo.szFileName, info.szFileName))
			{
				m_PackPartnerList[m_nCurrentPakIndex].GetElemInfo(ElemInfo.uId, info);
				printf("WARNING : Elem file [%s]of ID [%x] has been replace with [%s].\n",
					ElemInfo.szFileName, ElemInfo.uId, info.szFileName);
			}
		}

		item.pIndexList[uElemIndex].uCompressSizeFlag = ElemInfo.uStoreSize | ElemInfo.uCompressFlag;
		item.pIndexList[uElemIndex].uSize = ElemInfo.uSize;
		item.pIndexList[uElemIndex].uId = ElemInfo.uId;
		if (bAppend)
		{
			item.pIndexList[uElemIndex].uOffset = item.nDataEndOffset;
			item.nDataEndOffset += ElemInfo.uStoreSize;
		}
		item.bModified = true;

		info.nElemIndex = uElemIndex;
		strcpy(info.szFileName, ElemInfo.szFileName);
		info.uCRC = ElemInfo.uCRC;
		info.uId = ElemInfo.uId;
		info.uSize = ElemInfo.uSize;
		info.uStoreSizeAndCompressFlag = ElemInfo.uStoreSize | ElemInfo.uCompressFlag;
		info.uTime = ElemInfo.uTime;
		m_PackPartnerList[m_nCurrentPakIndex].AddElem(info);
	}
	return true;
}