//获取子文件信息 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; }
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; }
//获取子文件信息 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; }
//从包中解出某个文件 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; }
/* ------------------------------------------------------- Рекурсивная функция поиска элемента. 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; }
//删除打包文件中的一个子文件 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; }
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; }
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: }
//扫描整个包文件集合,对于每个子文件给出进行一次回调函数操作 //参数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; }
//往打包文件中添加一个子文件(已经压缩好的) //传入参数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; }