mirror of
https://projects.vdr-developer.org/git/vdr-plugin-tvguide.git
synced 2023-10-05 15:01:48 +02:00
Some cosmetic changes
This commit is contained in:
parent
a8ca6f19da
commit
f7e5ac3208
@ -22,18 +22,6 @@ cSwitchTimer::cSwitchTimer(const cEvent* Event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if VDRVERSNUM >= 20305
|
|
||||||
cSwitchTimer& cSwitchTimer::operator= (const cSwitchTimer &SwitchTimer)
|
|
||||||
{
|
|
||||||
this->eventID = SwitchTimer.eventID;
|
|
||||||
this->startTime = SwitchTimer.startTime;
|
|
||||||
this->channelID = SwitchTimer.channelID;
|
|
||||||
this->switchMinsBefore = SwitchTimer.switchMinsBefore;
|
|
||||||
this->announceOnly = SwitchTimer.announceOnly;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
bool cSwitchTimer::Parse(const char *s) {
|
bool cSwitchTimer::Parse(const char *s) {
|
||||||
char *line;
|
char *line;
|
||||||
char *pos;
|
char *pos;
|
||||||
|
@ -12,7 +12,15 @@ public:
|
|||||||
int announceOnly;
|
int announceOnly;
|
||||||
#if VDRVERSNUM >= 20305
|
#if VDRVERSNUM >= 20305
|
||||||
cSwitchTimer(const cSwitchTimer &SwitchTimer) { *this = SwitchTimer; };
|
cSwitchTimer(const cSwitchTimer &SwitchTimer) { *this = SwitchTimer; };
|
||||||
cSwitchTimer& operator= (const cSwitchTimer &SwitchTimer);
|
cSwitchTimer& operator= (const cSwitchTimer &SwitchTimer)
|
||||||
|
{
|
||||||
|
this->eventID = SwitchTimer.eventID;
|
||||||
|
this->startTime = SwitchTimer.startTime;
|
||||||
|
this->channelID = SwitchTimer.channelID;
|
||||||
|
this->switchMinsBefore = SwitchTimer.switchMinsBefore;
|
||||||
|
this->announceOnly = SwitchTimer.announceOnly;
|
||||||
|
return *this;
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
cSwitchTimer(void);
|
cSwitchTimer(void);
|
||||||
cSwitchTimer(const cEvent* Event);
|
cSwitchTimer(const cEvent* Event);
|
||||||
|
@ -71,7 +71,7 @@ void cTVGuideTimerConflicts::AddConflict(std::string epgSearchConflictLine) {
|
|||||||
splitstring s3(flds2[2].c_str());
|
splitstring s3(flds2[2].c_str());
|
||||||
std::vector<std::string> flds3 = s3.split('#');
|
std::vector<std::string> flds3 = s3.split('#');
|
||||||
std::vector<int> timerIDs;
|
std::vector<int> timerIDs;
|
||||||
for (int k = 0; k < flds3.size(); k++) {
|
for (int k = 0; k < (int)flds3.size(); k++) {
|
||||||
timerIDs.push_back(atoi(flds3[k].c_str()) - 1);
|
timerIDs.push_back(atoi(flds3[k].c_str()) - 1);
|
||||||
}
|
}
|
||||||
conflict->timerIDs = timerIDs;
|
conflict->timerIDs = timerIDs;
|
||||||
@ -80,18 +80,17 @@ void cTVGuideTimerConflicts::AddConflict(std::string epgSearchConflictLine) {
|
|||||||
|
|
||||||
void cTVGuideTimerConflicts::CalculateConflicts(void) {
|
void cTVGuideTimerConflicts::CalculateConflicts(void) {
|
||||||
numConflicts = conflicts.size();
|
numConflicts = conflicts.size();
|
||||||
// time_t startTime = 0;
|
|
||||||
// time_t endTime = 0;
|
|
||||||
for (int i=0; i < numConflicts; i++) {
|
for (int i=0; i < numConflicts; i++) {
|
||||||
cTimeInterval *unionSet = NULL;
|
cTimeInterval *unionSet = NULL;
|
||||||
int numTimers = conflicts[i]->timerIDs.size();
|
int numTimers = conflicts[i]->timerIDs.size();
|
||||||
for (int j=0; j < numTimers; j++) {
|
|
||||||
#if VDRVERSNUM >= 20301
|
#if VDRVERSNUM >= 20301
|
||||||
LOCK_TIMERS_READ;
|
LOCK_TIMERS_READ;
|
||||||
const cTimer *timer = Timers->Get(conflicts[i]->timerIDs[j]);
|
const cTimers* timers = Timers;
|
||||||
#else
|
#else
|
||||||
const cTimer *timer = Timers.Get(conflicts[i]->timerIDs[j]);
|
const cTimers* timers = &Timers;
|
||||||
#endif
|
#endif
|
||||||
|
for (int j=0; j < numTimers; j++) {
|
||||||
|
const cTimer *timer = timers->Get(conflicts[i]->timerIDs[j]);
|
||||||
if (timer) {
|
if (timer) {
|
||||||
if (!unionSet) {
|
if (!unionSet) {
|
||||||
unionSet = new cTimeInterval(timer->StartTime(), timer->StopTime());
|
unionSet = new cTimeInterval(timer->StartTime(), timer->StopTime());
|
||||||
@ -110,12 +109,7 @@ void cTVGuideTimerConflicts::CalculateConflicts(void) {
|
|||||||
|
|
||||||
cTimeInterval *intersect = NULL;
|
cTimeInterval *intersect = NULL;
|
||||||
for (int j=0; j < numTimers; j++) {
|
for (int j=0; j < numTimers; j++) {
|
||||||
#if VDRVERSNUM >= 20301
|
const cTimer *timer = timers->Get(conflicts[i]->timerIDs[j]);
|
||||||
LOCK_TIMERS_READ;
|
|
||||||
const cTimer *timer = Timers->Get(conflicts[i]->timerIDs[j]);
|
|
||||||
#else
|
|
||||||
const cTimer *timer = Timers.Get(conflicts[i]->timerIDs[j]);
|
|
||||||
#endif
|
|
||||||
if (timer) {
|
if (timer) {
|
||||||
if (!intersect) {
|
if (!intersect) {
|
||||||
intersect = new cTimeInterval(timer->StartTime(), timer->StopTime());
|
intersect = new cTimeInterval(timer->StartTime(), timer->StopTime());
|
||||||
|
428
tools.c
428
tools.c
@ -144,7 +144,7 @@ std::vector<std::string>& splitstring::split(char delim, int rep) {
|
|||||||
std::string work = data();
|
std::string work = data();
|
||||||
std::string buf = "";
|
std::string buf = "";
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (i < work.length()) {
|
while (i < (int)work.length()) {
|
||||||
if (work[i] != delim)
|
if (work[i] != delim)
|
||||||
buf += work[i];
|
buf += work[i];
|
||||||
else if (rep == 1) {
|
else if (rep == 1) {
|
||||||
@ -179,61 +179,61 @@ int FindIgnoreCase(const std::string& expr, const std::string& query)
|
|||||||
* GetAuxValue
|
* GetAuxValue
|
||||||
****************************************************************************************/
|
****************************************************************************************/
|
||||||
char* GetAuxValue(const char* aux, const char* name) {
|
char* GetAuxValue(const char* aux, const char* name) {
|
||||||
if (isempty(aux))
|
if (isempty(aux))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
char* descr = strdup(aux);
|
char* descr = strdup(aux);
|
||||||
char* beginaux = strstr(descr, "<epgsearch>");
|
char* beginaux = strstr(descr, "<epgsearch>");
|
||||||
char* endaux = strstr(descr, "</epgsearch>");
|
char* endaux = strstr(descr, "</epgsearch>");
|
||||||
if (!beginaux || !endaux) {
|
if (!beginaux || !endaux) {
|
||||||
free(descr);
|
free(descr);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
beginaux += 11; // strlen("<epgsearch>");
|
|
||||||
endaux[0] = 0;
|
|
||||||
memmove(descr, beginaux, endaux - beginaux + 1);
|
|
||||||
|
|
||||||
if (strcmp(name, "epgsearch") == 0)
|
|
||||||
return descr; // full aux
|
|
||||||
|
|
||||||
int namelen = strlen(name);
|
|
||||||
char catname[100] = "";
|
|
||||||
catname[0] = '<';
|
|
||||||
memcpy(catname + 1, name, namelen);
|
|
||||||
catname[1 + namelen] = '>';
|
|
||||||
catname[2 + namelen] = 0;
|
|
||||||
|
|
||||||
char* cat = strcasestr(descr, catname);
|
|
||||||
if (!cat) {
|
|
||||||
free(descr);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cat += namelen + 2;
|
beginaux += 11; // strlen("<epgsearch>");
|
||||||
char* end = strstr(cat, "</");
|
endaux[0] = 0;
|
||||||
if (!end) {
|
memmove(descr, beginaux, endaux - beginaux + 1);
|
||||||
free(descr);
|
|
||||||
return NULL;
|
if (strcmp(name, "epgsearch") == 0)
|
||||||
|
return descr; // full aux
|
||||||
|
|
||||||
|
int namelen = strlen(name);
|
||||||
|
char catname[100] = "";
|
||||||
|
catname[0] = '<';
|
||||||
|
memcpy(catname + 1, name, namelen);
|
||||||
|
catname[1 + namelen] = '>';
|
||||||
|
catname[2 + namelen] = 0;
|
||||||
|
|
||||||
|
char* cat = strcasestr(descr, catname);
|
||||||
|
if (!cat) {
|
||||||
|
free(descr);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
end[0] = 0;
|
|
||||||
|
|
||||||
int catlen = end - cat + 1;
|
cat += namelen + 2;
|
||||||
char* value = (char *) malloc(catlen);
|
char* end = strstr(cat, "</");
|
||||||
memcpy(value, cat, catlen);
|
if (!end) {
|
||||||
|
free(descr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
end[0] = 0;
|
||||||
|
|
||||||
free(descr);
|
int catlen = end - cat + 1;
|
||||||
return value;
|
char* value = (char *) malloc(catlen);
|
||||||
|
memcpy(value, cat, catlen);
|
||||||
|
|
||||||
|
free(descr);
|
||||||
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* GetAuxValue(const cRecording *recording, const char* name) {
|
char* GetAuxValue(const cRecording *recording, const char* name) {
|
||||||
if (!recording || !recording->Info())
|
if (!recording || !recording->Info())
|
||||||
return NULL;
|
return NULL;
|
||||||
return GetAuxValue(recording->Info()->Aux(), name);
|
return GetAuxValue(recording->Info()->Aux(), name);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* GetAuxValue(const cTimer *timer, const char* name) {
|
char* GetAuxValue(const cTimer *timer, const char* name) {
|
||||||
if (!timer || !timer->Aux())
|
if (!timer || !timer->Aux())
|
||||||
return NULL;
|
return NULL;
|
||||||
return GetAuxValue(timer->Aux(), name);
|
return GetAuxValue(timer->Aux(), name);
|
||||||
}
|
}
|
||||||
@ -244,239 +244,239 @@ char* GetAuxValue(const cTimer *timer, const char* name) {
|
|||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
FUNCTION afuzzy_init()
|
FUNCTION afuzzy_init()
|
||||||
Initialization of the fuzzy search routine. This applies to the consequent
|
Initialization of the fuzzy search routine. This applies to the consequent
|
||||||
calls of the afuzzy_CheckRTR (whole string matching) and afuzzy_CheckSUB
|
calls of the afuzzy_CheckRTR (whole string matching) and afuzzy_CheckSUB
|
||||||
(substring match) routines. afuzzy_init() should be called for each
|
(substring match) routines. afuzzy_init() should be called for each
|
||||||
new pattern or error length. The search is case sensitive
|
new pattern or error length. The search is case sensitive
|
||||||
|
|
||||||
ARGUMENTS:
|
ARGUMENTS:
|
||||||
p Pattern
|
p Pattern
|
||||||
kerr Number of possible errors. Shouldn't exceed pattern length
|
kerr Number of possible errors. Shouldn't exceed pattern length
|
||||||
UseFilter Use agrep filter algorithm that speeds up search.
|
UseFilter Use agrep filter algorithm that speeds up search.
|
||||||
fuzzy pointer to the structure that will be later passes to Check*
|
fuzzy pointer to the structure that will be later passes to Check*
|
||||||
(the first 6 elements should be NULLs for the first call)
|
(the first 6 elements should be NULLs for the first call)
|
||||||
|
|
||||||
RETURN VALUE:
|
RETURN VALUE:
|
||||||
none
|
none
|
||||||
|
|
||||||
ALGORITHM
|
ALGORITHM
|
||||||
see. the article on agrep algorithms.
|
see. the article on agrep algorithms.
|
||||||
The only change is accounting transpositions as one edit operation .
|
The only change is accounting transpositions as one edit operation .
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
void afuzzy_init(const char *p, int kerr, int UseFilter, AFUZZY *fuzzy)
|
void afuzzy_init(const char *p, int kerr, int UseFilter, AFUZZY *fuzzy)
|
||||||
{
|
{
|
||||||
int cnt, p_len, i, j, l, d, m, dd;
|
int cnt, p_len, i, j, l, d, m, dd;
|
||||||
char PatFilter[sizeof(Uint)*8 + 1];
|
char PatFilter[sizeof(Uint)*8 + 1];
|
||||||
|
|
||||||
fuzzy->k = kerr;
|
fuzzy->k = kerr;
|
||||||
m = strlen(p);
|
m = strlen(p);
|
||||||
fuzzy->FilterSet = 0;
|
fuzzy->FilterSet = 0;
|
||||||
memset(fuzzy->Map, 0 , sizeof(fuzzy->Map) );
|
memset(fuzzy->Map, 0 , sizeof(fuzzy->Map) );
|
||||||
|
|
||||||
if (fuzzy->S)
|
if (fuzzy->S)
|
||||||
free(fuzzy->S);
|
free(fuzzy->S);
|
||||||
if (fuzzy->R)
|
if (fuzzy->R)
|
||||||
free(fuzzy->R);
|
free(fuzzy->R);
|
||||||
if (fuzzy->R1)
|
if (fuzzy->R1)
|
||||||
free(fuzzy->R1);
|
free(fuzzy->R1);
|
||||||
if (fuzzy->RP)
|
if (fuzzy->RP)
|
||||||
free(fuzzy->RP);
|
free(fuzzy->RP);
|
||||||
if (fuzzy->RI)
|
if (fuzzy->RI)
|
||||||
free(fuzzy->RI);
|
free(fuzzy->RI);
|
||||||
if (fuzzy->FilterS)
|
if (fuzzy->FilterS)
|
||||||
free(fuzzy->FilterS);
|
free(fuzzy->FilterS);
|
||||||
|
|
||||||
fuzzy->FilterS = NULL;
|
fuzzy->FilterS = NULL;
|
||||||
fuzzy->S = (Uint *)calloc(m + 1, sizeof(Uint));
|
fuzzy->S = (Uint *)calloc(m + 1, sizeof(Uint));
|
||||||
fuzzy->R = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint));
|
fuzzy->R = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint));
|
||||||
fuzzy->R1 = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint));
|
fuzzy->R1 = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint));
|
||||||
fuzzy->RI = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint));
|
fuzzy->RI = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint));
|
||||||
fuzzy->RP = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint));
|
fuzzy->RP = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint));
|
||||||
|
|
||||||
for (i = 0, cnt = 0; i < m; i++)
|
for (i = 0, cnt = 0; i < m; i++)
|
||||||
{
|
{
|
||||||
l = fuzzy->Map[(unsigned char)p[i]];
|
l = fuzzy->Map[(unsigned char)p[i]];
|
||||||
if (!l)
|
if (!l)
|
||||||
{
|
{
|
||||||
l = fuzzy->Map[(unsigned char)p[i]] = ++cnt;
|
l = fuzzy->Map[(unsigned char)p[i]] = ++cnt;
|
||||||
fuzzy->S[l] = 0;
|
fuzzy->S[l] = 0;
|
||||||
}
|
}
|
||||||
fuzzy->S[l] |= 1 << i;
|
fuzzy->S[l] |= 1 << i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (d = 0; d <= fuzzy->k; d++)
|
for (d = 0; d <= fuzzy->k; d++)
|
||||||
fuzzy->RI[d] = (1 << d) - 1;
|
fuzzy->RI[d] = (1 << d) - 1;
|
||||||
|
|
||||||
fuzzy->mask_ok = (1 << (m - 1));
|
fuzzy->mask_ok = (1 << (m - 1));
|
||||||
fuzzy->r_size = sizeof(Uint) * (fuzzy->k + 1);
|
fuzzy->r_size = sizeof(Uint) * (fuzzy->k + 1);
|
||||||
p_len = m;
|
p_len = m;
|
||||||
|
|
||||||
if (p_len > (int) sizeof(Uint)*8)
|
if (p_len > (int) sizeof(Uint)*8)
|
||||||
p_len = (int) sizeof(Uint)*8;
|
p_len = (int) sizeof(Uint)*8;
|
||||||
|
|
||||||
/* If k is zero then no filter is needed! */
|
/* If k is zero then no filter is needed! */
|
||||||
if (fuzzy->k && (p_len >= 2*(fuzzy->k + 1)) )
|
if (fuzzy->k && (p_len >= 2*(fuzzy->k + 1)) )
|
||||||
{
|
{
|
||||||
if (UseFilter)
|
if (UseFilter)
|
||||||
{
|
{
|
||||||
fuzzy->FilterSet = 1;
|
fuzzy->FilterSet = 1;
|
||||||
memset(fuzzy->FilterMap, 0 , sizeof(fuzzy->FilterMap) );
|
memset(fuzzy->FilterMap, 0 , sizeof(fuzzy->FilterMap) );
|
||||||
fuzzy->FilterS = (Uint *)calloc(m + 1, sizeof(Uint));
|
fuzzy->FilterS = (Uint *)calloc(m + 1, sizeof(Uint));
|
||||||
|
|
||||||
/* Not let's fill the interleaved pattern */
|
/* Not let's fill the interleaved pattern */
|
||||||
dd = p_len / (fuzzy->k + 1);
|
dd = p_len / (fuzzy->k + 1);
|
||||||
p_len = dd * (fuzzy->k + 1);
|
p_len = dd * (fuzzy->k + 1);
|
||||||
|
|
||||||
for (i = 0, cnt = 0; i < dd; i++)
|
for (i = 0, cnt = 0; i < dd; i++)
|
||||||
for (j = 0; j < fuzzy->k + 1; j++, cnt++)
|
for (j = 0; j < fuzzy->k + 1; j++, cnt++)
|
||||||
PatFilter[cnt] = (unsigned char)p[j*dd + i];
|
PatFilter[cnt] = (unsigned char)p[j*dd + i];
|
||||||
PatFilter[p_len] = 0;
|
PatFilter[p_len] = 0;
|
||||||
|
|
||||||
for (i = 0, cnt = 0; i < p_len; i++)
|
for (i = 0, cnt = 0; i < p_len; i++)
|
||||||
{
|
{
|
||||||
l = fuzzy->FilterMap[(unsigned char)PatFilter[i]];
|
l = fuzzy->FilterMap[(unsigned char)PatFilter[i]];
|
||||||
if (!l)
|
if (!l)
|
||||||
{
|
{
|
||||||
l = fuzzy->FilterMap[(unsigned char)PatFilter[i]] = ++cnt;
|
l = fuzzy->FilterMap[(unsigned char)PatFilter[i]] = ++cnt;
|
||||||
fuzzy->FilterS[l] = 0;
|
fuzzy->FilterS[l] = 0;
|
||||||
}
|
}
|
||||||
fuzzy->FilterS[l] |= 1 << i;
|
fuzzy->FilterS[l] |= 1 << i;
|
||||||
}
|
}
|
||||||
fuzzy->filter_ok = 0;
|
fuzzy->filter_ok = 0;
|
||||||
for (i = p_len - fuzzy->k - 1; i <= p_len - 1; i++) /* k+1 times */
|
for (i = p_len - fuzzy->k - 1; i <= p_len - 1; i++) /* k+1 times */
|
||||||
fuzzy->filter_ok |= 1 << i;
|
fuzzy->filter_ok |= 1 << i;
|
||||||
|
|
||||||
/* k+1 first bits set to 1 */
|
/* k+1 first bits set to 1 */
|
||||||
fuzzy->filter_shift = (1 << (fuzzy->k + 2)) - 1;
|
fuzzy->filter_shift = (1 << (fuzzy->k + 2)) - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
FUNCTION afuzzy_free()
|
FUNCTION afuzzy_free()
|
||||||
Cleaning up after previous afuzzy_init() call.
|
Cleaning up after previous afuzzy_init() call.
|
||||||
|
|
||||||
ARGUMENTS:
|
ARGUMENTS:
|
||||||
fuzzy pointer to the afuzzy parameters structure
|
fuzzy pointer to the afuzzy parameters structure
|
||||||
|
|
||||||
RETURN VALUE:
|
RETURN VALUE:
|
||||||
none
|
none
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
void afuzzy_free(AFUZZY *fuzzy)
|
void afuzzy_free(AFUZZY *fuzzy)
|
||||||
{
|
{
|
||||||
if (fuzzy->S)
|
if (fuzzy->S)
|
||||||
{
|
{
|
||||||
free(fuzzy->S);
|
free(fuzzy->S);
|
||||||
fuzzy->S = NULL;
|
fuzzy->S = NULL;
|
||||||
}
|
}
|
||||||
if (fuzzy->R)
|
if (fuzzy->R)
|
||||||
{
|
{
|
||||||
free(fuzzy->R);
|
free(fuzzy->R);
|
||||||
fuzzy->R = NULL;
|
fuzzy->R = NULL;
|
||||||
}
|
}
|
||||||
if (fuzzy->R1)
|
if (fuzzy->R1)
|
||||||
{
|
{
|
||||||
free(fuzzy->R1);
|
free(fuzzy->R1);
|
||||||
fuzzy->R1 = NULL;
|
fuzzy->R1 = NULL;
|
||||||
}
|
}
|
||||||
if (fuzzy->RP)
|
if (fuzzy->RP)
|
||||||
{
|
{
|
||||||
free(fuzzy->RP);
|
free(fuzzy->RP);
|
||||||
fuzzy->RP = NULL;
|
fuzzy->RP = NULL;
|
||||||
}
|
}
|
||||||
if (fuzzy->RI)
|
if (fuzzy->RI)
|
||||||
{
|
{
|
||||||
free(fuzzy->RI);
|
free(fuzzy->RI);
|
||||||
fuzzy->RI = NULL;
|
fuzzy->RI = NULL;
|
||||||
}
|
}
|
||||||
if (fuzzy->FilterS)
|
if (fuzzy->FilterS)
|
||||||
{
|
{
|
||||||
free(fuzzy->FilterS);
|
free(fuzzy->FilterS);
|
||||||
fuzzy->FilterS = NULL;
|
fuzzy->FilterS = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
FUNCTION afuzzy_CheckSUB()
|
FUNCTION afuzzy_CheckSUB()
|
||||||
Perform a fuzzy pattern substring matching. afuzzy_init() should be
|
Perform a fuzzy pattern substring matching. afuzzy_init() should be
|
||||||
called previously to initialize the pattern and error length.
|
called previously to initialize the pattern and error length.
|
||||||
Positive result means that some part of the string given matches the
|
Positive result means that some part of the string given matches the
|
||||||
pattern with no more than afuzzy->k errors (1 error = 1 letter
|
pattern with no more than afuzzy->k errors (1 error = 1 letter
|
||||||
replacement or transposition)
|
replacement or transposition)
|
||||||
|
|
||||||
ARGUMENTS:
|
ARGUMENTS:
|
||||||
t the string to test
|
t the string to test
|
||||||
fuzzy pointer to the afuzzy parameters structure
|
fuzzy pointer to the afuzzy parameters structure
|
||||||
|
|
||||||
RETURN VALUE:
|
RETURN VALUE:
|
||||||
0 - no match
|
0 - no match
|
||||||
> 0 - strings match
|
> 0 - strings match
|
||||||
|
|
||||||
ALGORITHM
|
ALGORITHM
|
||||||
????????????????
|
????????????????
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int afuzzy_checkSUB(const char *t, AFUZZY *fuzzy)
|
int afuzzy_checkSUB(const char *t, AFUZZY *fuzzy)
|
||||||
{
|
{
|
||||||
register char c;
|
register char c;
|
||||||
register int j, d;
|
register int j, d;
|
||||||
|
|
||||||
/* For eficciency this case should be little bit optimized */
|
/* For eficciency this case should be little bit optimized */
|
||||||
if (!fuzzy->k)
|
if (!fuzzy->k)
|
||||||
{
|
{
|
||||||
Uint R = 0, R1;
|
Uint R = 0, R1;
|
||||||
|
|
||||||
for (j = 0; (c = t[j]) != '\0'; j++)
|
for (j = 0; (c = t[j]) != '\0'; j++)
|
||||||
{
|
{
|
||||||
R1 = ( ((R<<1) | 1) & fuzzy->S[fuzzy->Map[(unsigned char)c]]);
|
R1 = ( ((R<<1) | 1) & fuzzy->S[fuzzy->Map[(unsigned char)c]]);
|
||||||
R = R1;
|
R = R1;
|
||||||
|
|
||||||
if (R1 & fuzzy->mask_ok)
|
if (R1 & fuzzy->mask_ok)
|
||||||
return 1;
|
return 1;
|
||||||
} /* end for (register int j = 0 ... */
|
} /* end for (register int j = 0 ... */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fuzzy->FilterSet && !afuzzy_checkFLT(t, fuzzy))
|
if (fuzzy->FilterSet && !afuzzy_checkFLT(t, fuzzy))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
memcpy(fuzzy->R, fuzzy->RI, fuzzy->r_size); /* R = RI */
|
memcpy(fuzzy->R, fuzzy->RI, fuzzy->r_size); /* R = RI */
|
||||||
|
|
||||||
for (j = 0; (c = t[j]); j++)
|
for (j = 0; (c = t[j]); j++)
|
||||||
{
|
{
|
||||||
for (d = 0; d <= fuzzy->k; d++)
|
for (d = 0; d <= fuzzy->k; d++)
|
||||||
{
|
{
|
||||||
fuzzy->R1[d] = (((fuzzy->R[d]<<1) | 1) &
|
fuzzy->R1[d] = (((fuzzy->R[d]<<1) | 1) &
|
||||||
fuzzy->S[fuzzy->Map[(unsigned char)c]]);
|
fuzzy->S[fuzzy->Map[(unsigned char)c]]);
|
||||||
if (d > 0)
|
if (d > 0)
|
||||||
fuzzy->R1[d] |= ((fuzzy->R[d-1] | fuzzy->R1[d-1])<<1) | 1 |
|
fuzzy->R1[d] |= ((fuzzy->R[d-1] | fuzzy->R1[d-1])<<1) | 1 |
|
||||||
fuzzy->R[d-1];
|
fuzzy->R[d-1];
|
||||||
}
|
}
|
||||||
if (fuzzy->R1[fuzzy->k] & fuzzy->mask_ok)
|
if (fuzzy->R1[fuzzy->k] & fuzzy->mask_ok)
|
||||||
return j;
|
return j;
|
||||||
|
|
||||||
memcpy(fuzzy->R, fuzzy->R1, fuzzy->r_size);
|
memcpy(fuzzy->R, fuzzy->R1, fuzzy->r_size);
|
||||||
|
|
||||||
} /* end for (register int j = 0 ... */
|
} /* end for (register int j = 0 ... */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int afuzzy_checkFLT(const char *t, AFUZZY *fuzzy)
|
int afuzzy_checkFLT(const char *t, AFUZZY *fuzzy)
|
||||||
{
|
{
|
||||||
register Uint FilterR = 0;
|
register Uint FilterR = 0;
|
||||||
register Uint FilterR1;
|
register Uint FilterR1;
|
||||||
register int j;
|
register int j;
|
||||||
|
|
||||||
for (j = 0; t[j] != '\0'; j++)
|
for (j = 0; t[j] != '\0'; j++)
|
||||||
{
|
{
|
||||||
FilterR1 = ( ((FilterR<<(fuzzy->k+1)) | fuzzy->filter_shift) &
|
FilterR1 = ( ((FilterR<<(fuzzy->k+1)) | fuzzy->filter_shift) &
|
||||||
fuzzy->FilterS[fuzzy->FilterMap[(unsigned char)t[j]]]);
|
fuzzy->FilterS[fuzzy->FilterMap[(unsigned char)t[j]]]);
|
||||||
if (FilterR1 & fuzzy->filter_ok)
|
if (FilterR1 & fuzzy->filter_ok)
|
||||||
return 1;
|
return 1;
|
||||||
FilterR = FilterR1;
|
FilterR = FilterR1;
|
||||||
} /* end for (register int j = 0 ... */
|
} /* end for (register int j = 0 ... */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
28
tools.h
28
tools.h
@ -45,21 +45,21 @@ typedef unsigned int Uint;
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
Uint *R,
|
Uint *R,
|
||||||
*R1,
|
*R1,
|
||||||
*RP,
|
*RP,
|
||||||
*S,
|
*S,
|
||||||
*RI;
|
*RI;
|
||||||
Uint *FilterS;
|
Uint *FilterS;
|
||||||
|
|
||||||
int Map[256];
|
int Map[256];
|
||||||
int FilterMap[256];
|
int FilterMap[256];
|
||||||
int k;
|
int k;
|
||||||
Uint mask_ok;
|
Uint mask_ok;
|
||||||
Uint filter_ok;
|
Uint filter_ok;
|
||||||
Uint filter_shift;
|
Uint filter_shift;
|
||||||
int r_size;
|
int r_size;
|
||||||
int FilterSet;
|
int FilterSet;
|
||||||
} AFUZZY;
|
} AFUZZY;
|
||||||
|
|
||||||
void afuzzy_init(const char *p, int kerr, int UseFilter, AFUZZY *fuzzy);
|
void afuzzy_init(const char *p, int kerr, int UseFilter, AFUZZY *fuzzy);
|
||||||
|
Loading…
Reference in New Issue
Block a user