📄 boolobj.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "simple.h"
#ifdef _BOOL_OBJECT_TEST_
unsigned char* make_mask(uint4 val, uint2 bitnum)
{
static unsigned char _mask_[4];
int i;
memset(_mask_, 0, sizeof(_mask_));
for (i = 0; i < bitnum; i++, val = val >> 1)
{
_mask_[i >> 3] |= (val &1) << (i &7);
}
return _mask_;
}
uint4 make_uint(char* _mask_, uint2 bitnum)
{
uint4 val = 0;
int i;
for (i = 0; i < bitnum; i++)
{
val |= ((_mask_[i >> 3] >> (i &7)) &1) << i;
}
return val;
}
void prnObject(AreaCodeBool* areaCode)
{
MCO_RET rc = 0;
char pstr[10];
uint4 val;
char _tmp_[sizeof(val)];
uint2 sz;
rc = AreaCodeBool_areaCode_size(areaCode, &sz);
if (rc != MCO_S_OK)
{
printf("\n\terror:%d", rc);
}
rc = AreaCodeBool_areaCode_get_range(areaCode, 0, sz, _tmp_);
if (rc != MCO_S_OK)
{
printf("\n\terror:%d", rc);
}
val = make_uint(_tmp_, sz);
rc = AreaCodeBool_strAreaCode_get(areaCode, pstr, 10);
if (rc != MCO_S_OK)
{
printf("\n\terror:%d", rc);
}
printf("<%x,%s>\n", val, pstr);
}
void doListing(mco_db_h db)
{
MCO_RET rc = 0;
mco_cursor_t csr;
mco_trans_h trn;
AreaCodeBool areaCode;
printf("Data listing:\n");
mco_trans_start(db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &trn);
/* initialize cursor */
rc = AreaCodeBool_IareaCode_index_cursor(trn, &csr);
for (rc = mco_cursor_first(trn, &csr); rc == MCO_S_OK; rc = mco_cursor_next(trn, &csr))
{
rc = AreaCodeBool_from_cursor(trn, &csr, &areaCode);
if (rc != MCO_S_OK)
{
printf("\n\terror:%d", rc);
break;
}
prnObject(&areaCode);
}
mco_trans_commit(trn);
return ;
}
int calcBitLen(uint4 val)
{
int i, blen = 31;
i = blen;
while (i)
{
if ((val >> i) &1)
{
break;
}
i--;
}
i = ((i + 3+1) / 4)* 4;
if (!i)
{
return 4;
}
else
{
return i;
}
return 32;
}
int AddRecord(mco_trans_h t, uint4 val, const char* pstr)
{
MCO_RET rc;
AreaCodeBool areaCode;
uint2 sz;
rc = AreaCodeBool_new(t, &areaCode);
if (rc != MCO_S_OK)
{
return rc;
}
rc = AreaCodeBool_strAreaCode_put(&areaCode, pstr, (uint2)(strlen(pstr) + 1));
if (rc != MCO_S_OK)
{
return rc;
}
sz = calcBitLen(val);
rc = AreaCodeBool_areaCode_alloc(&areaCode, sz);
if (rc != MCO_S_OK)
{
return rc;
}
rc = AreaCodeBool_areaCode_put_range(&areaCode, 0, sz, (char*)make_mask(val, sz));
if (rc != MCO_S_OK)
{
return rc;
}
return MCO_S_OK;
}
int createDatabase(mco_db_h db)
{
MCO_RET rc = 0;
mco_trans_h t;
mco_trans_start(db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t);
AddRecord(t, 0x1, "ATT");
AddRecord(t, 0x20, "BCC");
AddRecord(t, 0x25, "TNT");
AddRecord(t, 0x3, "ANC");
AddRecord(t, 0x355, "NCC");
AddRecord(t, 0x355, "UDC");
AddRecord(t, 0x45, "WTC");
AddRecord(t, 0x454, "FCC");
AddRecord(t, 0x5, "ABB");
AddRecord(t, 0x51, "DDA");
AddRecord(t, 0x51, "FIY");
AddRecord(t, 0x513, "ASD");
AddRecord(t, 0x515, "ASH");
AddRecord(t, 0x5183, "ASW");
AddRecord(t, 0x525, "ASY");
AddRecord(t, 0x6, "YUI");
AddRecord(t, 0x64, "KEW");
AddRecord(t, 0x66, "WER");
AddRecord(t, 0x668, "VBR");
AddRecord(t, 0x668, "MPP");
AddRecord(t, 0x668, "FCA");
AddRecord(t, 0x6689, "FCU");
AddRecord(t, 0x699, "FCH");
AddRecord(t, 0x6683, "FCL");
AddRecord(t, 0x6685, "FCD");
AddRecord(t, 0x6687, "FCA");
AddRecord(t, 0x7, "MNM");
AddRecord(t, 0x7, "MGM");
AddRecord(t, 0x79, "MSM");
AddRecord(t, 0x795, "EAE");
AddRecord(t, 0x81, "YUI");
AddRecord(t, 0x84, "WWW");
AddRecord(t, 0x849, "OLA");
AddRecord(t, 0x9, "GEA");
AddRecord(t, 0x99, "YTR");
AddRecord(t, 0x99, "IUI");
AddRecord(t, 0x988, "JHJ");
AddRecord(t, 0x988, "DFD");
rc = mco_trans_commit(t);
if (rc != MCO_S_OK)
{
printf("Commit error %d !\n", rc);
}
return rc;
}
void searchExact(mco_db_h db, uint4 AreaCode)
{
MCO_RET rc = 0;
mco_trans_h trn;
AreaCodeBool areaCode;
mco_cursor_t csr;
uint2 sz;
mco_trans_start(db, MCO_READ_ONLY, MCO_TRANS_FOREGROUND, &trn);
rc = AreaCodeBool_IareaCode_index_cursor(trn, &csr);
sz = calcBitLen(AreaCode);
rc = AreaCodeBool_IareaCode_exact_match(trn, &csr, (char*)make_mask(AreaCode, sz), sz);
if (rc == MCO_S_OK)
{
printf("Found ExactMatch for key %x:\n", AreaCode);
while (rc == MCO_S_OK)
{
rc = AreaCodeBool_from_cursor(trn, &csr, &areaCode);
if (rc != MCO_S_OK)
{
printf("\n\terror:%d", rc);
break;
}
prnObject(&areaCode);
rc = AreaCodeBool_IareaCode_next_match(trn, &csr, (char*)make_mask(AreaCode, sz), sz);
}
}
else
{
printf("Not found ExactMatch for key %x:\n", AreaCode);
}
rc = mco_trans_commit(trn);
if (rc != MCO_S_OK)
{
printf("Commit error %d !\n", rc);
}
}
void searchPrefix(mco_db_h db, uint4 AreaCodePref)
{
MCO_RET rc = 0;
mco_trans_h trn;
AreaCodeBool areaCode;
mco_cursor_t csr;
uint2 sz;
int longestR = 0;
char cycle = 0;
uint4 key = AreaCodePref;
mco_trans_start(db, MCO_READ_ONLY, MCO_TRANS_FOREGROUND, &trn);
rc = AreaCodeBool_IareaCode_index_cursor(trn, &csr);
sz = calcBitLen(AreaCodePref);
rc = AreaCodeBool_IareaCode_prefix_match(trn, &csr, (char*)make_mask(key, sz), sz);
if (rc == MCO_S_OK)
{
int found = 0;
while (rc == MCO_S_OK)
{
if (!found)
{
printf("Found PrefixMatch for key %x:\n", AreaCodePref);
}
found = 1;
rc = AreaCodeBool_from_cursor(trn, &csr, &areaCode);
if (rc != MCO_S_OK)
{
printf("\n\terror:%d", rc);
break;
}
prnObject(&areaCode);
rc = AreaCodeBool_IareaCode_next_match(trn, &csr, (char*)make_mask(key, sz), sz);
}
if (!found)
{
printf("Not found PrefixMatch for key %x:\n", AreaCodePref);
}
}
else
{
printf("Not found PrefixMatch for key %x:\n", AreaCodePref);
}
rc = mco_trans_commit(trn);
if (rc != MCO_S_OK)
{
printf("Commit error %d !\n", rc);
}
}
void searchLongest(mco_db_h db, uint4 AreaCodePref)
{
MCO_RET rc = 0;
mco_trans_h trn;
AreaCodeBool areaCode;
mco_cursor_t csr;
uint2 sz;
int longestR = 0;
char cycle = 0;
uint4 key = AreaCodePref;
mco_trans_start(db, MCO_READ_ONLY, MCO_TRANS_FOREGROUND, &trn);
rc = AreaCodeBool_IareaCode_index_cursor(trn, &csr);
sz = calcBitLen(AreaCodePref);
rc = AreaCodeBool_IareaCode_longest_match(trn, &csr, (char*)make_mask(key, sz), sz);
if (rc == MCO_S_OK)
{
int found = 0;
while (rc == MCO_S_OK)
{
if (!found)
{
printf("Found LongestMatch for key %x:\n", AreaCodePref);
}
found = 1;
rc = AreaCodeBool_from_cursor(trn, &csr, &areaCode);
if (rc != MCO_S_OK)
{
printf("\n\terror:%d", rc);
break;
}
prnObject(&areaCode);
rc = AreaCodeBool_IareaCode_next_match(trn, &csr, (char*)make_mask(key, sz), sz);
}
if (!found)
{
printf("Not found LongestMatch for key %x:\n", AreaCodePref);
}
}
else
{
printf("Not found LongestMatch for key %x:\n", AreaCodePref);
}
rc = mco_trans_commit(trn);
if (rc != MCO_S_OK)
{
printf("Commit error %d !\n", rc);
}
}
void doGoogle(mco_db_h db)
{
//////////////////////////////////////////////////////////////////////////
// Exact search
printf("\n//////////////////////////////////////\n");
printf("ExactMatch function demonstration:\n\n");
searchExact(db, 0x1);
searchExact(db, 0x55);
searchExact(db, 0x5);
searchExact(db, 0x51);
searchExact(db, 0x6);
searchExact(db, 0x7);
//////////////////////////////////////////////////////////////////////////
// prefixSearch
printf("\n//////////////////////////////////////\n");
printf("PrefixMatch function demonstration:\n\n");
searchPrefix(db, 0x190);
searchPrefix(db, 0x55);
searchPrefix(db, 0x589);
searchPrefix(db, 0x51);
searchPrefix(db, 0x511);
searchPrefix(db, 0x5189);
searchPrefix(db, 0x668889);
searchPrefix(db, 0x698889);
searchPrefix(db, 0x71111111);
//////////////////////////////////////////////////////////////////////////
// longestSearch
printf("\n//////////////////////////////////////\n");
printf("LongestMatch function demonstration:\n\n");
searchLongest(db, 0x190);
searchLongest(db, 0x55);
searchLongest(db, 0x589);
searchLongest(db, 0x5189);
searchLongest(db, 0x51);
searchLongest(db, 0x511);
searchLongest(db, 0x668889);
searchLongest(db, 0x698889);
searchLongest(db, 0x71111111);
printf("\n");
}
#endif //_BOOL_OBJECT_TEST_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -