/* 基础类实现. */
#ifdef WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif
#include <assert.h>
#include "languagebase.h"
/*
* Hash管理类
*/
/* 构造 */
CHashPool::CHashPool()
{
int nItm;
m_pQueue = (LanguageInfo **)malloc(sizeof(LanguageInfo *) * HASH_BASE_COUNT);
assert(m_pQueue != NULL);
for (nItm = 0; nItm < HASH_BASE_COUNT; nItm++) {
m_pQueue[nItm] = NULL;
}
m_nCount = 0;
}
/* 析构 */
CHashPool::~CHashPool()
{
LanguageInfo *pNode;
int nItm;
if (m_pQueue != NULL) {
for (nItm = 0; nItm < HASH_BASE_COUNT; nItm++) {
for (pNode = m_pQueue[nItm]; pNode != NULL;) {
m_pQueue[nItm] = pNode->pNext;
free(pNode);
pNode = m_pQueue[nItm];
}
}
}
m_nCount = 0;
}
/*
* 添加相对应的数据.
*/
int CHashPool::LanguageInfoAdd(const char *pszSection, const char *pszKey, char *pData)
{
LanguageInfo *pNode;
unsigned long nIdx;
char szString[256];
if (strlen(pszSection) >= sizeof(szString)) {
strncpy(szString, pszSection, sizeof(szString) - 1);
szString[sizeof(szString) - 1] = '\0';
}
else {
strcpy(szString, pszSection);
}
if (strlen(pszKey) >= (sizeof(szString) - strlen(szString))) {
strncat(szString, pszSection, sizeof(szString) - strlen(szString) - 1);
szString[sizeof(szString) - strlen(szString) - 1] = '\0';
}
else {
strncat(szString, pszKey, strlen(pszKey));
}
nIdx = Hash(StringToID(szString, strlen(szString)));
pNode = (LanguageInfo *)malloc(sizeof(LanguageInfo));
assert(pNode != NULL);
if (pNode == NULL) {
return LANGUAGE_NO_MEMORY;
}
pNode->pszSection = (char *)pszSection;
pNode->pszKey = (char *)pszKey;
pNode->pszValue = pData;
pNode->pNext = NULL;
if (m_pQueue[nIdx] == NULL) {
m_pQueue[nIdx] = pNode;
}
else {
pNode->pNext = m_pQueue[nIdx];
m_pQueue[nIdx] = pNode;
}
m_nCount++;
return WAVETOP_BACKUP_OK;
}
/*
* 获取相对应的数据.
*/
int CHashPool::LanguageInfoGet(const char *pszSection, const char *pszKey, char **pData)
{
LanguageInfo *pNode;
unsigned long nItm;
char szString[256];
if (strlen(pszSection) >= sizeof(szString)) {
strncpy(szString, pszSection, sizeof(szString) - 1);
szString[sizeof(szString) - 1] = '\0';
}
else {
strcpy(szString, pszSection);
}
if (strlen(pszKey) >= (sizeof(szString) - strlen(szString))) {
strncat(szString, pszSection, sizeof(szString) - strlen(szString) - 1);
szString[sizeof(szString) - strlen(szString) - 1] = '\0';
}
else {
strncat(szString, pszKey, strlen(pszKey));
}
nItm = Hash(StringToID(szString, strlen(szString)));
pNode = m_pQueue[nItm];
for (; pNode != NULL; pNode = pNode->pNext) {
if (!strcmp(pNode->pszSection, pszSection)
&& !strcmp(pNode->pszKey, pszKey))
break;
}
*pData = (pNode != NULL ? pNode->pszValue : NULL);
return (pNode != NULL ? WAVETOP_BACKUP_OK : LANGUAGE_OBJ_OPEN_FAILED);
}
/* 获取当前关键字数量 */
unsigned long CHashPool::GetCount()
{
return m_nCount;
}
/* Hash方法 */
unsigned long CHashPool::Hash(unsigned long nID)
{
unsigned long nIdx;
nIdx = nID % HASH_BASE_COUNT;
return nIdx;
}
/*
* 获取ini文件中所有的section
*/
LanguageST *CHashPool::GetLanguageInfo(char *pszConfPath)
{
int i;
int iPos = 0;
int iMaxCount;
int nIndex = 0;
/* 总的提取出来的字符串 */
char szSectionNames[MAX_ALLSECTIONS] = {0};
/* 存放一个段名 */
char szSection[MAX_SECTION] = {0};
LanguageST *LanguageConf;
LanguageST *LanguageHeadST;
LanguageST *LanguageTailST;
LanguageHeadST = LanguageTailST = NULL;
GetPrivateProfileSectionNames(szSectionNames, MAX_ALLSECTIONS, pszConfPath);
/* 以下循环,截断到两个连续的0 */
for(i = 0; i< MAX_ALLSECTIONS; i++) {
if (szSectionNames[i] == 0)
if (szSectionNames[i] == szSectionNames[i+1])
break;
}
/* 要多一个0号元素,即找出整个字符串的结束部分 */
iMaxCount = i + 1;
for( i= 0; i < iMaxCount; i++) {
szSection[iPos++] = szSectionNames[i];
if(szSectionNames[i] == 0) {
LanguageConf = GetKeyValues(szSection, pszConfPath);
if(LanguageHeadST == NULL) {
LanguageHeadST = LanguageConf;
for(; LanguageConf->pNext != NULL;
LanguageConf = LanguageConf->pNext);
LanguageTailST = LanguageConf;
}
else {
LanguageTailST->pNext = LanguageConf;
for(; LanguageConf->pNext != NULL;
LanguageConf = LanguageConf->pNext);
LanguageTailST = LanguageConf;
}
memset(szSection, 0, MAX_SECTION);
iPos = 0;
}
}
return LanguageHeadST;
}
LanguageST *CHashPool::GetKeyValues(char *pszSection, char *pszConfPath)
{
int i;
int iPos;
int iMaxCount;
int iIndex = 0;
/* 总的提取出来的字符串 */
char szKeyNames[MAX_ALLKEYS]={0};
/* 提取出来的一个键名 */
char szKey[MAX_KEY]={0};
char *pszPos;
LanguageST *LanguageHeadST;
LanguageST *LanguageTailST;
LanguageST *LanguageConf;
LanguageHeadST = LanguageTailST = NULL;
GetPrivateProfileSection(pszSection, szKeyNames, MAX_ALLKEYS, pszConfPath);
for(i = 0; i < MAX_ALLKEYS; i++) {
if (szKeyNames[i] == 0)
if (szKeyNames[i] == szKeyNames[i+1])
break;
}
/* 要多一个0号元素,即找出整个字符串的结束部分 */
iMaxCount = i + 1;
for(i = 0; i < iMaxCount; i++) {
szKey[iIndex++] = szKeyNames[i];
if(szKeyNames[i] == 0) {
LanguageConf = (LanguageST *)malloc(sizeof(LanguageST));
memset(LanguageConf, 0, sizeof(LanguageST));
pszPos = strstr(szKey, "=");
if (NULL != pszPos) {
iPos = strlen(szKey) - strlen(pszPos);
szKey[iPos] = '\0';
strncpy(LanguageConf->szSection, pszSection, strlen(pszSection));
strncpy(LanguageConf->szKey, szKey, sizeof(szKey));
*pszPos++;
strncpy(LanguageConf->szValue, pszPos, strlen(pszPos));
if(LanguageHeadST == NULL) {
LanguageHeadST = LanguageTailST = LanguageConf;
}
else {
LanguageTailST->pNext = LanguageConf;
LanguageTailST = LanguageConf;
}
}
memset(szKey, 0, MAX_KEY);
iIndex = 0;
}
}
return LanguageHeadST;
}
/*
* 字符串关键字转换为 ID
* Hash function from Chris Torek.
*/
unsigned long CHashPool::StringToID(const char *keyarg, int len)
{
register const unsigned char *key;
register unsigned long loop;
register unsigned long h;
#define HASH4a h = (h << 5) - h + *key++;
#define HASH4b h = (h << 5) + h + *key++;
#define HASH4 HASH4b
h = 0;
key = (const unsigned char *)keyarg;
if (len > 0) {
loop = (len + 8 - 1) >> 3;
switch (len & (8 - 1)) {
case 0:
do {
HASH4;
/* FALLTHROUGH */
case 7:
HASH4;
/* FALLTHROUGH */
case 6:
HASH4;
/* FALLTHROUGH */
case 5:
HASH4;
/* FALLTHROUGH */
case
一个ini文件里查找值得哈希算法
需积分: 9 141 浏览量
2008-10-18
23:51:57
上传
评论 1
收藏 20KB RAR 举报
baoyeye
- 粉丝: 0
- 资源: 1
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈