diff options
author | Johann Friedrichs <johann.friedrichs@web.de> | 2018-03-21 12:14:55 +0100 |
---|---|---|
committer | Johann Friedrichs <johann.friedrichs@web.de> | 2018-03-21 12:14:55 +0100 |
commit | e8a0e569152c50d6084f252d12854b8fd4e74466 (patch) | |
tree | 5a90ef7ea08ff2096df157ca109c5268cdc04903 /epgsearchtools.c | |
parent | 9c7d95ff8d6ba965cb23147507a859b1fd0491d6 (diff) | |
download | vdr-plugin-epgsearch-e8a0e569152c50d6084f252d12854b8fd4e74466.tar.gz vdr-plugin-epgsearch-e8a0e569152c50d6084f252d12854b8fd4e74466.tar.bz2 |
unified indentation
Diffstat (limited to 'epgsearchtools.c')
-rw-r--r-- | epgsearchtools.c | 1436 |
1 files changed, 691 insertions, 745 deletions
diff --git a/epgsearchtools.c b/epgsearchtools.c index 76b1b9a..614248a 100644 --- a/epgsearchtools.c +++ b/epgsearchtools.c @@ -56,492 +56,456 @@ extern bool isUTF8; int CompareEventTime(const void *p1, const void *p2) { - time_t time1 = (*(cSearchResult **)p1)->event->StartTime(); - time_t time2 = (*(cSearchResult **)p2)->event->StartTime(); - if (time1 == time2) - return (int)(ChannelNrFromEvent((*(cSearchResult **)p1)->event) - - ChannelNrFromEvent((*(cSearchResult **)p2)->event)); - else - return (int)(time1 - time2); + time_t time1 = (*(cSearchResult **)p1)->event->StartTime(); + time_t time2 = (*(cSearchResult **)p2)->event->StartTime(); + if (time1 == time2) + return (int)(ChannelNrFromEvent((*(cSearchResult **)p1)->event) - + ChannelNrFromEvent((*(cSearchResult **)p2)->event)); + else + return (int)(time1 - time2); } int CompareEventChannel(const void *p1, const void *p2) { - int ch1 = ChannelNrFromEvent((*(cSearchResult **)p1)->event); - int ch2 = ChannelNrFromEvent((*(cSearchResult **)p2)->event); - if (ch1 == ch2) - return (int)((*(cSearchResult **)p1)->event->StartTime() - - (*(cSearchResult **)p2)->event->StartTime()); - else - return ch1 - ch2; + int ch1 = ChannelNrFromEvent((*(cSearchResult **)p1)->event); + int ch2 = ChannelNrFromEvent((*(cSearchResult **)p2)->event); + if (ch1 == ch2) + return (int)((*(cSearchResult **)p1)->event->StartTime() - + (*(cSearchResult **)p2)->event->StartTime()); + else + return ch1 - ch2; } int CompareSearchExtPrioDescTerm(const void *p1, const void *p2) { - int prio1 = (*(cSearchExt **)p1)->Priority; - int prio2 = (*(cSearchExt **)p2)->Priority; - if (prio2 != prio1) - return prio2 - prio1; - else - return strcmp((*(cSearchExt **)p1)->search, (*(cSearchExt **)p2)->search); + int prio1 = (*(cSearchExt **)p1)->Priority; + int prio2 = (*(cSearchExt **)p2)->Priority; + if (prio2 != prio1) + return prio2 - prio1; + else + return strcmp((*(cSearchExt **)p1)->search, (*(cSearchExt **)p2)->search); } cString IndentMenuItem(const char* szString, int indentions) { - char* szIndented = NULL; - msprintf(&szIndented, "%*s", strlen(szString)+indentions*2, szString); - cString szIndentedStr(szIndented, true /*take pointer*/); - return szIndentedStr; + char* szIndented = NULL; + msprintf(&szIndented, "%*s", strlen(szString) + indentions * 2, szString); + cString szIndentedStr(szIndented, true /*take pointer*/); + return szIndentedStr; } bool MatchesSearchMode(const char* szTest, const char* searchText, int mode, const char* delim, int tolerance) { - if (szTest && *szTest) - { - if (mode == 0) // substring - return (strstr(szTest, searchText) != NULL); - else if (mode == 1 || mode == 2) // AND or OR - { - bool bTesting = false; - char *pstrSearchToken, *pptr; - bool bFirst=true; - char *pstrSearch=strdup(searchText); - pstrSearchToken=strtok_r(pstrSearch, delim, &pptr); - while(pstrSearchToken) - { - if(szTest && strstr(szTest, skipspace(pstrSearchToken))) - { - if(mode==1) - { // means AND - if(bFirst) - { - bTesting=true; - bFirst=false; - } - else - bTesting&=true; - } - else - bTesting|=true; + if (szTest && *szTest) { + if (mode == 0) // substring + return (strstr(szTest, searchText) != NULL); + else if (mode == 1 || mode == 2) { // AND or OR + bool bTesting = false; + char *pstrSearchToken, *pptr; + bool bFirst = true; + char *pstrSearch = strdup(searchText); + pstrSearchToken = strtok_r(pstrSearch, delim, &pptr); + while (pstrSearchToken) { + if (szTest && strstr(szTest, skipspace(pstrSearchToken))) { + if (mode == 1) { + // means AND + if (bFirst) { + bTesting = true; + bFirst = false; + } else + bTesting &= true; + } else + bTesting |= true; + } else { + // not found!! + if (mode == 1) { + // means AND + bTesting = false; + bFirst = false; + } + } + pstrSearchToken = strtok_r(NULL, delim, &pptr); } + free(pstrSearch); + return bTesting; + } else if (mode == 3) { // match exactly + if (strcmp(szTest, searchText) == 0) + return true; else - {// not found!! - if(mode==1) - { // means AND - bTesting=false; - bFirst=false; - } + return false; + } else if (mode == 4) { // regexp + regex_t re; + + if (0 == regcomp(&re, searchText, REG_EXTENDED | REG_NOSUB)) { + int status = regexec(&re, szTest, 0, NULL, 0); + regfree(&re); + return (status == 0); } - pstrSearchToken=strtok_r(NULL, delim, &pptr); - } - free(pstrSearch); - return bTesting; - } - else if (mode == 3) // match exactly - { - if (strcmp(szTest, searchText) == 0) - return true; - else return false; - } - else if (mode == 4) // regexp - { - regex_t re; - - if ( 0 == regcomp(&re, searchText, REG_EXTENDED | REG_NOSUB) ) - { - int status = regexec( &re, szTest, 0, NULL, 0); - regfree(&re); - return (status == 0); - } - return false; - } - else if (mode == 5) // fuzzy - { - AFUZZY af = { NULL, NULL, NULL, NULL, NULL, NULL, { 0 }, { 0 }, 0, 0, 0, 0, 0, 0 }; - string query = searchText?searchText:""; - if (query.size() > 32) query = query.substr(0, 32); - afuzzy_init(query.c_str(), tolerance, 0, &af); - /* Checking substring */ - int res = afuzzy_checkSUB(szTest, &af); - afuzzy_free(&af); - return (res > 0); - } - else if (mode >= 10 && mode <= 15) - { - int testvalue = atoi(szTest); - int value = atoi(searchText); - if (value == 0) return true; - - if (mode == 10) // less - return testvalue < value; - else if (mode == 11) // less or equal - return testvalue <= value; - else if (mode == 12) // greater - return testvalue > value; - else if (mode == 13) // greater or equal - return testvalue >= value; - else if (mode == 14) // equal - return testvalue == value; - else if (mode == 15) // not equal - return testvalue != value; - } - } - return false; + } else if (mode == 5) { // fuzzy + AFUZZY af = { NULL, NULL, NULL, NULL, NULL, NULL, { 0 }, { 0 }, 0, 0, 0, 0, 0, 0 }; + string query = searchText ? searchText : ""; + if (query.size() > 32) query = query.substr(0, 32); + afuzzy_init(query.c_str(), tolerance, 0, &af); + /* Checking substring */ + int res = afuzzy_checkSUB(szTest, &af); + afuzzy_free(&af); + return (res > 0); + } else if (mode >= 10 && mode <= 15) { + int testvalue = atoi(szTest); + int value = atoi(searchText); + if (value == 0) return true; + + if (mode == 10) // less + return testvalue < value; + else if (mode == 11) // less or equal + return testvalue <= value; + else if (mode == 12) // greater + return testvalue > value; + else if (mode == 13) // greater or equal + return testvalue >= value; + else if (mode == 14) // equal + return testvalue == value; + else if (mode == 15) // not equal + return testvalue != value; + } + } + return false; } void ToLower(char* szText) { - if (!szText) - return; - - if (!isUTF8) - { - for (int loop = 0; szText[loop] !=0; loop++) - szText[loop] = tolower(szText[loop]); - return; - } - else - { - int length = strlen(szText)+1; - uint* valueUtf8 = new uint[length]; - int lengthUtf8 = Utf8ToArray(szText, valueUtf8, length); - for(int i=0; i<lengthUtf8; i++) - valueUtf8[i] = Utf8to(lower, valueUtf8[i]); - Utf8FromArray(valueUtf8, szText, length); - delete [] valueUtf8; - } + if (!szText) + return; + + if (!isUTF8) { + for (int loop = 0; szText[loop] != 0; loop++) + szText[loop] = tolower(szText[loop]); + return; + } else { + int length = strlen(szText) + 1; + uint* valueUtf8 = new uint[length]; + int lengthUtf8 = Utf8ToArray(szText, valueUtf8, length); + for (int i = 0; i < lengthUtf8; i++) + valueUtf8[i] = Utf8to(lower, valueUtf8[i]); + Utf8FromArray(valueUtf8, szText, length); + delete [] valueUtf8; + } } char* GetExtEPGValue(const cEvent* e, cSearchExtCat* SearchExtCat) { - if (!e || !SearchExtCat) - return NULL; - return GetExtEPGValue(e->Description(), SearchExtCat->name, SearchExtCat->format); + if (!e || !SearchExtCat) + return NULL; + return GetExtEPGValue(e->Description(), SearchExtCat->name, SearchExtCat->format); } char* GetExtEPGValue(const char* description, const char* catname, const char *format) { - if (isempty(description)) - return NULL; - char* tmp1 = NULL; - char* tmp2 = NULL; - - // search the category, must be the first line or at the beginning of a line - if (msprintf(&tmp1, "\n%s: ", catname)==-1 || - msprintf(&tmp2, "%s: ", catname)==-1) - return NULL; - char* descr = strdup(description); - char* cat = NULL; - int valueOffset = 0; - if ((cat = strstr(descr, tmp1)) != NULL) - { - cat++; // skip linefeed - valueOffset = strlen(tmp1); - } - else if (strstr(descr, tmp2) == descr) // in first line - { - cat = descr; - valueOffset = strlen(tmp2)+1; - } - else - { - free(descr); - free(tmp1); - free(tmp2); - return NULL; - } - - // search the value to appear before the next line feed or end - char* end = strchr(cat, '\n'); - int endpos = strlen(cat); - if (end) - endpos = end - cat; - cat[endpos] = 0; - - char* value = NULL; - msprintf(&value, "%s", cat + valueOffset - 1); - if (format) - { - int ivalue; - if (sscanf(value,"%8i",&ivalue)==1) - { - free(value); - value = NULL; - msprintf(&value, format, ivalue); - } - } - free(descr); - free(tmp1); - free(tmp2); - - return value; + if (isempty(description)) + return NULL; + char* tmp1 = NULL; + char* tmp2 = NULL; + + // search the category, must be the first line or at the beginning of a line + if (msprintf(&tmp1, "\n%s: ", catname) == -1 || + msprintf(&tmp2, "%s: ", catname) == -1) + return NULL; + char* descr = strdup(description); + char* cat = NULL; + int valueOffset = 0; + if ((cat = strstr(descr, tmp1)) != NULL) { + cat++; // skip linefeed + valueOffset = strlen(tmp1); + } else if (strstr(descr, tmp2) == descr) { // in first line + cat = descr; + valueOffset = strlen(tmp2) + 1; + } else { + free(descr); + free(tmp1); + free(tmp2); + return NULL; + } + + // search the value to appear before the next line feed or end + char* end = strchr(cat, '\n'); + int endpos = strlen(cat); + if (end) + endpos = end - cat; + cat[endpos] = 0; + + char* value = NULL; + msprintf(&value, "%s", cat + valueOffset - 1); + if (format) { + int ivalue; + if (sscanf(value, "%8i", &ivalue) == 1) { + free(value); + value = NULL; + msprintf(&value, format, ivalue); + } + } + free(descr); + free(tmp1); + free(tmp2); + + return value; } char* GetAuxValue(const char* aux, const char* name) { - if (isempty(aux)) - return NULL; - - char* descr = strdup(aux); - char* beginaux = strstr(descr, "<epgsearch>"); - char* endaux = strstr(descr, "</epgsearch>"); - if (!beginaux || !endaux) { - free(descr); - 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; - char* end = strstr(cat, "</"); - if (!end) { - free(descr); - return NULL; - } - end[0] = 0; - - int catlen = end - cat + 1; - char* value = (char *) malloc(catlen); - memcpy(value, cat, catlen); - - free(descr); - return value; + if (isempty(aux)) + return NULL; + + char* descr = strdup(aux); + char* beginaux = strstr(descr, "<epgsearch>"); + char* endaux = strstr(descr, "</epgsearch>"); + if (!beginaux || !endaux) { + free(descr); + 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; + char* end = strstr(cat, "</"); + if (!end) { + free(descr); + return NULL; + } + end[0] = 0; + + int catlen = end - cat + 1; + char* value = (char *) malloc(catlen); + memcpy(value, cat, catlen); + + free(descr); + return value; } char* GetAuxValue(const cRecording *recording, const char* name) { - if (!recording || !recording->Info()) return NULL; - return GetAuxValue(recording->Info()->Aux(), name); + if (!recording || !recording->Info()) return NULL; + return GetAuxValue(recording->Info()->Aux(), name); } char* GetAuxValue(const cTimer *timer, const char* name) { - if (!timer || !timer->Aux()) return NULL; - return GetAuxValue(timer->Aux(), name); + if (!timer || !timer->Aux()) return NULL; + return GetAuxValue(timer->Aux(), name); } string UpdateAuxValue(string aux, string section, long num) { - return UpdateAuxValue(aux, section, NumToString(num)); + return UpdateAuxValue(aux, section, NumToString(num)); } string UpdateAuxValue(string aux, string section, string value) { - string secStart = "<" + section + ">"; - string secEnd = "</" + section + ">"; - int valueStartPos = aux.find(secStart); - int valueEndPos = aux.find(secEnd); - if (valueStartPos >= 0 && valueEndPos >= 0) - aux.replace(valueStartPos + secStart.size(), valueEndPos - valueStartPos - secStart.size(), value); - else - aux += secStart + value + secEnd; - return aux; + string secStart = "<" + section + ">"; + string secEnd = "</" + section + ">"; + int valueStartPos = aux.find(secStart); + int valueEndPos = aux.find(secEnd); + if (valueStartPos >= 0 && valueEndPos >= 0) + aux.replace(valueStartPos + secStart.size(), valueEndPos - valueStartPos - secStart.size(), value); + else + aux += secStart + value + secEnd; + return aux; } // replace s1 with s2 in s ignoring the case of s1 char *strreplacei(char *s, const char *s1, const char *s2) { - char *p = strcasestr(s, s1); - if (p) { - int of = p - s; - int l = strlen(s); - int l1 = strlen(s1); - int l2 = 0; - if (s2) - l2 = strlen(s2); - if (l2 > l1) - s = (char *)realloc(s, l + l2 - l1 + 1); - if (l2 != l1) - memmove(s + of + l2, s + of + l1, l - of - l1 + 1); - memcpy(s + of, s2, l2); - } - return s; + char *p = strcasestr(s, s1); + if (p) { + int of = p - s; + int l = strlen(s); + int l1 = strlen(s1); + int l2 = 0; + if (s2) + l2 = strlen(s2); + if (l2 > l1) + s = (char *)realloc(s, l + l2 - l1 + 1); + if (l2 != l1) + memmove(s + of + l2, s + of + l1, l - of - l1 + 1); + memcpy(s + of, s2, l2); + } + return s; } std::string strreplace( - std::string& result, - const std::string& replaceWhat, - const std::string& replaceWithWhat) -{ - while(1) - { - const int pos = result.find(replaceWhat); - if (pos==-1) break; - result.replace(pos,replaceWhat.size(),replaceWithWhat); - } - return result; + std::string& result, + const std::string& replaceWhat, + const std::string& replaceWithWhat) +{ + while (1) { + const int pos = result.find(replaceWhat); + if (pos == -1) break; + result.replace(pos, replaceWhat.size(), replaceWithWhat); + } + return result; } void sleepMSec(long ms) { - cCondWait::SleepMs(ms); + cCondWait::SleepMs(ms); } void sleepSec(long s) { - sleepMSec(s * 1000); + sleepMSec(s * 1000); } bool SendViaSVDRP(cString SVDRPcmd) { - bool bSuccess = true; - cString cmdbuf; - if (EPGSearchConfig.useExternalSVDRP) - { - cmdbuf = cString::sprintf("%s -p %d \"%s\"", - epgsSVDRP::cSVDRPClient::SVDRPSendCmd, - EPGSearchConfig.SVDRPPort, - *SVDRPcmd); - - FILE *p = popen(cmdbuf, "r"); - if (p) - pclose(p); - else - { - LogFile.eSysLog("can't open pipe for command '%s'", *cmdbuf); - bSuccess = false; - } - } - else - { - cmdbuf = SVDRPcmd; - epgsSVDRP::cSVDRPClient client; - if (!client.SendCmd(*cmdbuf)) - { - LogFile.eSysLog("command '%s' failed", *cmdbuf); - bSuccess = false; - } - } - - return bSuccess; + bool bSuccess = true; + cString cmdbuf; + if (EPGSearchConfig.useExternalSVDRP) { + cmdbuf = cString::sprintf("%s -p %d \"%s\"", + epgsSVDRP::cSVDRPClient::SVDRPSendCmd, + EPGSearchConfig.SVDRPPort, + *SVDRPcmd); + + FILE *p = popen(cmdbuf, "r"); + if (p) + pclose(p); + else { + LogFile.eSysLog("can't open pipe for command '%s'", *cmdbuf); + bSuccess = false; + } + } else { + cmdbuf = SVDRPcmd; + epgsSVDRP::cSVDRPClient client; + if (!client.SendCmd(*cmdbuf)) { + LogFile.eSysLog("command '%s' failed", *cmdbuf); + bSuccess = false; + } + } + + return bSuccess; } int SendMsg(cString Message, bool confirm, int seconds, eMessageType messageType) { - int Keys = Skins.QueueMessage(messageType, Message, seconds, confirm?seconds+2:0); - return Keys; + int Keys = Skins.QueueMessage(messageType, Message, seconds, confirm ? seconds + 2 : 0); + return Keys; } bool InEditMode(const char* ItemText, const char* ItemName, const char* ItemValue) { - bool bEditMode = true; - // ugly solution to detect, if in edit mode - char* value = strdup(ItemText); - strreplace(value, ItemName, ""); - strreplace(value, ":\t", ""); - // for bigpatch - strreplace(value, "\t", ""); - if (strlen(value) == strlen(ItemValue)) - bEditMode = false; - free(value); - return bEditMode; + bool bEditMode = true; + // ugly solution to detect, if in edit mode + char* value = strdup(ItemText); + strreplace(value, ItemName, ""); + strreplace(value, ":\t", ""); + // for bigpatch + strreplace(value, "\t", ""); + if (strlen(value) == strlen(ItemValue)) + bEditMode = false; + free(value); + return bEditMode; } // checks if the timer was triggered from a search timer and return a pointer to the search cSearchExt* TriggeredFromSearchTimer(const cTimer* timer) { - char* searchID = GetAuxValue(timer, "s-id"); - if (!searchID) - return NULL; + char* searchID = GetAuxValue(timer, "s-id"); + if (!searchID) + return NULL; - cSearchExt* search = SearchExts.GetSearchFromID(atoi(searchID)); - free(searchID); - return search; + cSearchExt* search = SearchExts.GetSearchFromID(atoi(searchID)); + free(searchID); + return search; } int TriggeredFromSearchTimerID(const cTimer* timer) { - cSearchExt* trigger = TriggeredFromSearchTimer(timer); - if (trigger) - return trigger->ID; - else - return -1; + cSearchExt* trigger = TriggeredFromSearchTimer(timer); + if (trigger) + return trigger->ID; + else + return -1; } double FuzzyMatch(const char* s1, const char* s2, int maxLength) { - Distance D; - int dist = D.LD (s1, s2, maxLength); - double fMaxLength = std::max(strlen(s1), strlen(s2)); - return (fMaxLength - dist)/fMaxLength; + Distance D; + int dist = D.LD(s1, s2, maxLength); + double fMaxLength = std::max(strlen(s1), strlen(s2)); + return (fMaxLength - dist) / fMaxLength; } bool DescriptionMatches(const char* eDescr, const char* rDescr, int matchLimit) { - if (eDescr == NULL && rDescr == NULL) return true; - if (eDescr == NULL && rDescr != NULL) return false; - if (eDescr != NULL && rDescr == NULL) return false; - int l_eDescr = strlen(eDescr); - int l_rDescr = strlen(rDescr); - if (l_eDescr == l_rDescr && strcmp(eDescr, rDescr) == 0) return true; - - // partial match: - // first check the length, should only be different at match limit - int minLength = std::min(l_eDescr, l_rDescr); - int maxLength = std::max(l_eDescr, l_rDescr); - if (100*double(minLength)/double(maxLength) < matchLimit) - return false; - - // last try with Levenshtein Distance, only compare the first 1000 chars - double fMatch = FuzzyMatch(eDescr, rDescr, 1000); - double tmp_matchlimit = matchLimit/100.0; - if(maxLength - minLength < 5 && matchLimit < 95) - { - tmp_matchlimit = 0.95; - LogFile.Log(2,"difference between both descriptions is < 5 setting matchlimit to: %.2f %%", tmp_matchlimit*100); - } - if (fMatch > tmp_matchlimit) - { - LogFile.Log(2,"match is: %.2f %%", fMatch*100); - return true; - } - return false; + if (eDescr == NULL && rDescr == NULL) return true; + if (eDescr == NULL && rDescr != NULL) return false; + if (eDescr != NULL && rDescr == NULL) return false; + int l_eDescr = strlen(eDescr); + int l_rDescr = strlen(rDescr); + if (l_eDescr == l_rDescr && strcmp(eDescr, rDescr) == 0) return true; + + // partial match: + // first check the length, should only be different at match limit + int minLength = std::min(l_eDescr, l_rDescr); + int maxLength = std::max(l_eDescr, l_rDescr); + if (100 * double(minLength) / double(maxLength) < matchLimit) + return false; + + // last try with Levenshtein Distance, only compare the first 1000 chars + double fMatch = FuzzyMatch(eDescr, rDescr, 1000); + double tmp_matchlimit = matchLimit / 100.0; + if (maxLength - minLength < 5 && matchLimit < 95) { + tmp_matchlimit = 0.95; + LogFile.Log(2, "difference between both descriptions is < 5 setting matchlimit to: %.2f %%", tmp_matchlimit * 100); + } + if (fMatch > tmp_matchlimit) { + LogFile.Log(2, "match is: %.2f %%", fMatch * 100); + return true; + } + return false; } const cEvent* GetEvent(const cTimer* timer) { - const cEvent* event = NULL; - const cChannel *channel = timer->Channel(); - time_t Time = timer->StartTime() + (timer->StopTime() - timer->StartTime()) / 2; - for (int seconds = 0; seconds <= 3; seconds++) - { - { - LOCK_SCHEDULES_READ; - if (Schedules) { - const cSchedule *Schedule = Schedules->GetSchedule(channel->GetChannelID()); - if (Schedule) { - event = Schedule->GetEventAround(Time); - if (event) return event; + const cEvent* event = NULL; + const cChannel *channel = timer->Channel(); + time_t Time = timer->StartTime() + (timer->StopTime() - timer->StartTime()) / 2; + for (int seconds = 0; seconds <= 3; seconds++) { + { + LOCK_SCHEDULES_READ; + if (Schedules) { + const cSchedule *Schedule = Schedules->GetSchedule(channel->GetChannelID()); + if (Schedule) { + event = Schedule->GetEventAround(Time); + if (event) return event; + } } - } - } - if (seconds == 0) - LogFile.Log(2,"waiting for EPG info..."); - sleepSec(1); - } - LogFile.Log(1,"no EPG info available"); - return NULL; + } + if (seconds == 0) + LogFile.Log(2, "waiting for EPG info..."); + sleepSec(1); + } + LogFile.Log(1, "no EPG info available"); + return NULL; } // this extracts the real description from a given epg entry cutting all that looks like a category line @@ -553,383 +517,368 @@ const cEvent* GetEvent(const cTimer* timer) char* GetRawDescription(const char* descr) { - if (!descr || !*descr) return NULL; - - char* rawDescr = (char*) calloc(strlen(descr)+1, sizeof(char)); - - const char* tmp = descr; - while(tmp) - { - // extract a single line - const char* lf = strchr(tmp, '\n'); - char* line = NULL; - if (lf) - line = strndup(tmp, lf-tmp); - else - line = strdup(tmp); - // if (lf) *lf = 0; - // check for category - char* delim = strstr(line, ": "); - if (!delim || - (delim && (delim - line > MAXCATNAMELENGTH || strlen(line) - (delim - line) + 2 > MAXCATVALUELENGTH))) - if (*line) - strcat(rawDescr, line); - - if (lf) tmp += strlen(line)+1; else tmp = NULL; - free(line); - } - return rawDescr; + if (!descr || !*descr) return NULL; + + char* rawDescr = (char*) calloc(strlen(descr) + 1, sizeof(char)); + + const char* tmp = descr; + while (tmp) { + // extract a single line + const char* lf = strchr(tmp, '\n'); + char* line = NULL; + if (lf) + line = strndup(tmp, lf - tmp); + else + line = strdup(tmp); + // if (lf) *lf = 0; + // check for category + char* delim = strstr(line, ": "); + if (!delim || + (delim && (delim - line > MAXCATNAMELENGTH || strlen(line) - (delim - line) + 2 > MAXCATVALUELENGTH))) + if (*line) + strcat(rawDescr, line); + + if (lf) tmp += strlen(line) + 1; + else tmp = NULL; + free(line); + } + return rawDescr; } void PrepareTimerFile(const cEvent* event, cTimer* timer) { - if (!event) return; - if (EPGSearchConfig.addSubtitleToTimer == addSubtitleNever && strlen(EPGSearchConfig.defrecdir) == 0) // nothing to do - return; - if (!isempty(event->ShortText())) // add subtitle if present - { - bool addSubtitle = (EPGSearchConfig.addSubtitleToTimer != addSubtitleNever); - if (EPGSearchConfig.addSubtitleToTimer == addSubtitleSmart) - if (event->Duration() > 80*60) - addSubtitle = false; - - if (addSubtitle) - { - char tmp[MaxFileName] = ""; - snprintf(tmp, MaxFileName, "%s~%s", event->Title(), event->ShortText()); - timer->SetFile(tmp); - } - } - if (strlen(EPGSearchConfig.defrecdir) > 0) - { - char directory[MaxFileName] = ""; - strn0cpy(directory, EPGSearchConfig.defrecdir,sizeof(directory)); - cVarExpr varExprDir(directory); - if (!varExprDir.DependsOnVar("%title%", event)) - { - strcat(directory, "~"); - strcat(directory, timer->File()); - } - // parse the epxression and evaluate it - cVarExpr varExpr(directory); - strcpy(directory, varExpr.Evaluate(event).c_str()); - if (strchr(directory, '%') == NULL) // only set directory to new value if all categories could have been replaced - timer->SetFile(directory); - } + if (!event) return; + if (EPGSearchConfig.addSubtitleToTimer == addSubtitleNever && strlen(EPGSearchConfig.defrecdir) == 0) // nothing to do + return; + if (!isempty(event->ShortText())) { // add subtitle if present + bool addSubtitle = (EPGSearchConfig.addSubtitleToTimer != addSubtitleNever); + if (EPGSearchConfig.addSubtitleToTimer == addSubtitleSmart) + if (event->Duration() > 80 * 60) + addSubtitle = false; + + if (addSubtitle) { + char tmp[MaxFileName] = ""; + snprintf(tmp, MaxFileName, "%s~%s", event->Title(), event->ShortText()); + timer->SetFile(tmp); + } + } + if (strlen(EPGSearchConfig.defrecdir) > 0) { + char directory[MaxFileName] = ""; + strn0cpy(directory, EPGSearchConfig.defrecdir, sizeof(directory)); + cVarExpr varExprDir(directory); + if (!varExprDir.DependsOnVar("%title%", event)) { + strcat(directory, "~"); + strcat(directory, timer->File()); + } + // parse the epxression and evaluate it + cVarExpr varExpr(directory); + strcpy(directory, varExpr.Evaluate(event).c_str()); + if (strchr(directory, '%') == NULL) // only set directory to new value if all categories could have been replaced + timer->SetFile(directory); + } } bool EventsMatch(const cEvent* event1, const cEvent* event2, bool compareTitle, int compareSubtitle, bool compareSummary, int compareDate, unsigned long catvaluesAvoidRepeat, int matchLimit) { - if (!event1 || !event2) return false; - if (event1 == event2) return true; - - // only compare the alphanumeric portions - string Title1 = ""; - string Title2 = ""; - if (compareTitle) - { - string s1 = event1->Title()?event1->Title():""; - string s2 = event2->Title()?event2->Title():""; - Title1 = GetAlNum(s1); - Title2 = GetAlNum(s2); - std::transform(Title1.begin(), Title1.end(), Title1.begin(), tolower); - std::transform(Title2.begin(), Title2.end(), Title2.begin(), tolower); - } - string Subtitle1 = ""; - string Subtitle2 = ""; - if (compareSubtitle) - { - string s1 = event1->ShortText()?event1->ShortText():""; - string s2 = event2->ShortText()?event2->ShortText():""; - Subtitle1 = GetAlNum(s1); - Subtitle2 = GetAlNum(s2); - std::transform(Subtitle1.begin(), Subtitle1.end(), Subtitle1.begin(), tolower); - std::transform(Subtitle2.begin(), Subtitle2.end(), Subtitle2.begin(), tolower); - } - string compareExpression = ""; - if (compareDate == 1) compareExpression = "%date%"; - if (compareDate == 2) compareExpression = "%year%-%week%"; - if (compareDate == 3) compareExpression = "%year%-%month%"; - - bool match = false; - if ((!compareTitle || Title1 == Title2) && - (!compareSubtitle || (Subtitle1 == Subtitle2 && Subtitle1!=""))) - { - const char* Descr1 = event1->Description(); - const char* Descr2 = event2->Description(); - if (compareSummary) - { - char* rawDescr1 = GetRawDescription(Descr1); - char* rawDescr2 = GetRawDescription(Descr2); - match = DescriptionMatches(rawDescr1, rawDescr2, matchLimit); - free(rawDescr1); - free(rawDescr2); - if (!match) return false; - } - if (compareExpression.size() > 0) - { - cVarExpr varExpr(compareExpression); - string resEvent1 = varExpr.Evaluate(event1); - string resEvent2 = varExpr.Evaluate(event2); - if (resEvent1 != resEvent2) - return false; - } - if (catvaluesAvoidRepeat != 0) // check categories - { - bool bCatMatch = ((Descr1 && Descr2) || (!Descr1 && !Descr2)); - cSearchExtCat *SearchExtCat = SearchExtCats.First(); - int index = 0; - while (catvaluesAvoidRepeat > 0 && SearchExtCat && bCatMatch) - { - if (catvaluesAvoidRepeat & (1<<index)) - { - char* CatValue1 = GetExtEPGValue(Descr1, SearchExtCat->name, SearchExtCat->format); - char* CatValue2 = GetExtEPGValue(Descr2, SearchExtCat->name, SearchExtCat->format); - if ((!CatValue1 && CatValue2) || - (!CatValue2 && CatValue1) || - (CatValue1 && CatValue2 && strcmp(CatValue1, CatValue2) != 0)) - bCatMatch = false; - free(CatValue1); - free(CatValue2); + if (!event1 || !event2) return false; + if (event1 == event2) return true; + + // only compare the alphanumeric portions + string Title1 = ""; + string Title2 = ""; + if (compareTitle) { + string s1 = event1->Title() ? event1->Title() : ""; + string s2 = event2->Title() ? event2->Title() : ""; + Title1 = GetAlNum(s1); + Title2 = GetAlNum(s2); + std::transform(Title1.begin(), Title1.end(), Title1.begin(), tolower); + std::transform(Title2.begin(), Title2.end(), Title2.begin(), tolower); + } + string Subtitle1 = ""; + string Subtitle2 = ""; + if (compareSubtitle) { + string s1 = event1->ShortText() ? event1->ShortText() : ""; + string s2 = event2->ShortText() ? event2->ShortText() : ""; + Subtitle1 = GetAlNum(s1); + Subtitle2 = GetAlNum(s2); + std::transform(Subtitle1.begin(), Subtitle1.end(), Subtitle1.begin(), tolower); + std::transform(Subtitle2.begin(), Subtitle2.end(), Subtitle2.begin(), tolower); + } + string compareExpression = ""; + if (compareDate == 1) compareExpression = "%date%"; + if (compareDate == 2) compareExpression = "%year%-%week%"; + if (compareDate == 3) compareExpression = "%year%-%month%"; + + bool match = false; + if ((!compareTitle || Title1 == Title2) && + (!compareSubtitle || (Subtitle1 == Subtitle2 && Subtitle1 != ""))) { + const char* Descr1 = event1->Description(); + const char* Descr2 = event2->Description(); + if (compareSummary) { + char* rawDescr1 = GetRawDescription(Descr1); + char* rawDescr2 = GetRawDescription(Descr2); + match = DescriptionMatches(rawDescr1, rawDescr2, matchLimit); + free(rawDescr1); + free(rawDescr2); + if (!match) return false; + } + if (compareExpression.size() > 0) { + cVarExpr varExpr(compareExpression); + string resEvent1 = varExpr.Evaluate(event1); + string resEvent2 = varExpr.Evaluate(event2); + if (resEvent1 != resEvent2) + return false; + } + if (catvaluesAvoidRepeat != 0) { // check categories + bool bCatMatch = ((Descr1 && Descr2) || (!Descr1 && !Descr2)); + cSearchExtCat *SearchExtCat = SearchExtCats.First(); + int index = 0; + while (catvaluesAvoidRepeat > 0 && SearchExtCat && bCatMatch) { + if (catvaluesAvoidRepeat & (1 << index)) { + char* CatValue1 = GetExtEPGValue(Descr1, SearchExtCat->name, SearchExtCat->format); + char* CatValue2 = GetExtEPGValue(Descr2, SearchExtCat->name, SearchExtCat->format); + if ((!CatValue1 && CatValue2) || + (!CatValue2 && CatValue1) || + (CatValue1 && CatValue2 && strcmp(CatValue1, CatValue2) != 0)) + bCatMatch = false; + free(CatValue1); + free(CatValue2); + } + SearchExtCat = SearchExtCats.Next(SearchExtCat); + index++; } - SearchExtCat = SearchExtCats.Next(SearchExtCat); - index++; - } - if (bCatMatch) + if (bCatMatch) + match = true; + } else match = true; - } - else - match = true; - } - return match; + } + return match; } int ChannelNrFromEvent(const cEvent* pEvent) { - if (!pEvent) - return -1; - LOCK_CHANNELS_READ; - const cChannel* channel = Channels->GetByChannelID(pEvent->ChannelID(), true, true); - if (!channel) - return -1; - else - return channel->Number(); + if (!pEvent) + return -1; + LOCK_CHANNELS_READ; + const cChannel* channel = Channels->GetByChannelID(pEvent->ChannelID(), true, true); + if (!channel) + return -1; + else + return channel->Number(); } void DelTimer(int index) { - cString cmdbuf = cString::sprintf("DELT %d", index); - LogFile.Log(2, "delete timer %d", index); - SendViaSVDRP(cmdbuf); - gl_timerStatusMonitor->SetConflictCheckAdvised(); + cString cmdbuf = cString::sprintf("DELT %d", index); + LogFile.Log(2, "delete timer %d", index); + SendViaSVDRP(cmdbuf); + gl_timerStatusMonitor->SetConflictCheckAdvised(); } char* FixSeparators(char* buffer, char sep) { - int l = strlen(buffer); - char *dest = buffer; - for (int i = 0; i < l; i ++) { - char c = buffer[i]; - int j = i; - if (c == sep) { - for (j = i + 1; (j < l) & (buffer[j] == ' '); j++) - ; - - if ((j <= l) | (i + 1 < j)) { - switch (buffer[j]) { - case '\t': - i = j; - c = '\t'; - break; - case 0: - i = j; - c = 0; - break; - default: - break; - } - } - } - if (c == '\t') { - for (; (j < l) & (buffer[j] == ' '); j++) - ; - if (j < l && buffer[j] == sep) { - buffer[j] = '\t'; - i = j - 1; - continue; - } + int l = strlen(buffer); + char *dest = buffer; + for (int i = 0; i < l; i ++) { + char c = buffer[i]; + int j = i; + if (c == sep) { + for (j = i + 1; (j < l) & (buffer[j] == ' '); j++) + ; + + if ((j <= l) | (i + 1 < j)) { + switch (buffer[j]) { + case '\t': + i = j; + c = '\t'; + break; + case 0: + i = j; + c = 0; + break; + default: + break; + } + } + } + if (c == '\t') { + for (; (j < l) & (buffer[j] == ' '); j++) + ; + if (j < l && buffer[j] == sep) { + buffer[j] = '\t'; + i = j - 1; + continue; + } + } + *dest++ = c; } - *dest++ = c; - } - *dest = 0; - return buffer; + *dest = 0; + return buffer; } cString DateTime(time_t t) { - char buffer[32]; - if (t == 0) - time(&t); - struct tm tm_r; - tm *tm = localtime_r(&t, &tm_r); - snprintf(buffer, sizeof(buffer), "%02d.%02d. %02d:%02d", tm->tm_mday, tm->tm_mon + 1, tm->tm_hour, tm->tm_min); - return buffer; + char buffer[32]; + if (t == 0) + time(&t); + struct tm tm_r; + tm *tm = localtime_r(&t, &tm_r); + snprintf(buffer, sizeof(buffer), "%02d.%02d. %02d:%02d", tm->tm_mday, tm->tm_mon + 1, tm->tm_hour, tm->tm_min); + return buffer; } string NumToString(long num) { - ostringstream os; - os << num; - return os.str(); + ostringstream os; + os << num; + return os.str(); } int FindIgnoreCase(const string& expr, const string& query) { - const char *p = expr.c_str(); - const char *r = strcasestr(p, query.c_str()); + const char *p = expr.c_str(); + const char *r = strcasestr(p, query.c_str()); - if (!r) - return -1; - return r - p; + if (!r) + return -1; + return r - p; } bool EqualsNoCase(const string& a, const string& b) { - return strcasecmp(a.c_str(), b.c_str()) == 0; + return strcasecmp(a.c_str(), b.c_str()) == 0; } string Strip(const string& input) { - string str = input; - string::size_type pos = str.find_last_not_of(' '); - if(pos != string::npos) { - str.erase(pos + 1); - pos = str.find_first_not_of(' '); - if(pos != string::npos) str.erase(0, pos); - } - else str.erase(str.begin(), str.end()); - return str; + string str = input; + string::size_type pos = str.find_last_not_of(' '); + if (pos != string::npos) { + str.erase(pos + 1); + pos = str.find_first_not_of(' '); + if (pos != string::npos) str.erase(0, pos); + } else str.erase(str.begin(), str.end()); + return str; } string GetAlNum(const string& s) { - string res; - for(unsigned int i=0; i<s.size(); i++) - if (isalnum(s[i])) - res += s[i]; - return res; + string res; + for (unsigned int i = 0; i < s.size(); i++) + if (isalnum(s[i])) + res += s[i]; + return res; } string ReplaceAll(const string& input, const string& what, const string& with) { - string result = input; - int pos = 0; + string result = input; + int pos = 0; - while((pos = FindIgnoreCase(result, what)) >= 0) - result.replace(pos, what.size(), with); - return result; + while ((pos = FindIgnoreCase(result, what)) >= 0) + result.replace(pos, what.size(), with); + return result; } string EscapeString(const string& S) { - string tmp = S; - int apostrophPos = 0; - int apostrophTempPos = 0; - while((apostrophPos = tmp.find("'", apostrophTempPos)) >= apostrophTempPos) { - tmp.replace(apostrophPos, 1, "'\"'\"'"); - apostrophTempPos = apostrophPos + 5; - } - return tmp; + string tmp = S; + int apostrophPos = 0; + int apostrophTempPos = 0; + while ((apostrophPos = tmp.find("'", apostrophTempPos)) >= apostrophTempPos) { + tmp.replace(apostrophPos, 1, "'\"'\"'"); + apostrophTempPos = apostrophPos + 5; + } + return tmp; } string QuoteApostroph(const string& S) { - string tmp = S; - int apostrophPos = 0; - int apostrophTempPos = 0; - while((apostrophPos = tmp.find("\"", apostrophTempPos)) >= apostrophTempPos) { - tmp.replace(apostrophPos, 1, "\\\""); - apostrophTempPos = apostrophPos + 2; - } - return tmp; + string tmp = S; + int apostrophPos = 0; + int apostrophTempPos = 0; + while ((apostrophPos = tmp.find("\"", apostrophTempPos)) >= apostrophTempPos) { + tmp.replace(apostrophPos, 1, "\\\""); + apostrophTempPos = apostrophPos + 2; + } + return tmp; } string MD5(const string& input) { - char* szInput = strdup(input.c_str()); - if (!szInput) return ""; - char* szRes = MD5String(szInput); - string res = szRes; - free(szRes); - return res; + char* szInput = strdup(input.c_str()); + if (!szInput) return ""; + char* szRes = MD5String(szInput); + string res = szRes; + free(szRes); + return res; } void SetAux(cTimer* timer, string aux) { - if (!timer) return; - string timerText = *timer->ToText(); - string::size_type auxPos = string::npos; - for(int i=0; i<=7; i++) // get aux value - auxPos = timerText.find(":", auxPos == string::npos?0:auxPos+1); - if (auxPos == string::npos) return; - timerText.replace(auxPos+1, timerText.size()-auxPos+1, aux); - timer->Parse(timerText.c_str()); + if (!timer) return; + string timerText = *timer->ToText(); + string::size_type auxPos = string::npos; + for (int i = 0; i <= 7; i++) // get aux value + auxPos = timerText.find(":", auxPos == string::npos ? 0 : auxPos + 1); + if (auxPos == string::npos) return; + timerText.replace(auxPos + 1, timerText.size() - auxPos + 1, aux); + timer->Parse(timerText.c_str()); } int msprintf(char **strp, const char *fmt, ...) { - va_list ap; - va_start (ap, fmt); - int res=vasprintf (strp, fmt, ap); - va_end (ap); - return res; + va_list ap; + va_start(ap, fmt); + int res = vasprintf(strp, fmt, ap); + va_end(ap); + return res; } std::string GetCodeset() { - // Taken from VDR's vdr.c - char *CodeSet = NULL; - if (setlocale(LC_CTYPE, "")) - CodeSet = nl_langinfo(CODESET); - else { - char *LangEnv = getenv("LANG"); // last resort in case locale stuff isn't installed - if (LangEnv) { - CodeSet = strchr(LangEnv, '.'); - if (CodeSet) - CodeSet++; // skip the dot - } - } - if (CodeSet) - return std::string(CodeSet); - else - return "ISO-8859-15"; + // Taken from VDR's vdr.c + char *CodeSet = NULL; + if (setlocale(LC_CTYPE, "")) + CodeSet = nl_langinfo(CODESET); + else { + char *LangEnv = getenv("LANG"); // last resort in case locale stuff isn't installed + if (LangEnv) { + CodeSet = strchr(LangEnv, '.'); + if (CodeSet) + CodeSet++; // skip the dot + } + } + if (CodeSet) + return std::string(CodeSet); + else + return "ISO-8859-15"; } /* Read a line from a socket */ -ssize_t Readline(int sockd, char *vptr, size_t maxlen) { +ssize_t Readline(int sockd, char *vptr, size_t maxlen) +{ size_t n, rc; char c, *buffer; buffer = vptr; - for ( n = 1; n < maxlen; n++ ) { - - if ( (rc = read(sockd, &c, 1)) == 1 ) { - if ( c == '\n' ) - break; - *buffer++ = c; - } - else if ( rc == 0 ) { - if ( n == 1 ) - return 0; - else - break; - } - else { - if ( errno == EINTR ) - continue; - return -1; - } + for (n = 1; n < maxlen; n++) { + + if ((rc = read(sockd, &c, 1)) == 1) { + if (c == '\n') + break; + *buffer++ = c; + } else if (rc == 0) { + if (n == 1) + return 0; + else + break; + } else { + if (errno == EINTR) + continue; + return -1; + } } *buffer = 0; @@ -937,7 +886,8 @@ ssize_t Readline(int sockd, char *vptr, size_t maxlen) { } /* Write a line to a socket */ -ssize_t Writeline(int sockd, const char *vptr, ssize_t n) { +ssize_t Writeline(int sockd, const char *vptr, ssize_t n) +{ ssize_t nleft; ssize_t nwritten; const char *buffer; @@ -945,15 +895,15 @@ ssize_t Writeline(int sockd, const char *vptr, ssize_t n) { buffer = vptr; nleft = n; - while ( nleft > 0 ) { - if ( (nwritten = write(sockd, buffer, nleft)) <= 0 ) { - if ( errno == EINTR ) - nwritten = 0; - else - return -1; - } - nleft -= nwritten; - buffer += nwritten; + while (nleft > 0) { + if ((nwritten = write(sockd, buffer, nleft)) <= 0) { + if (errno == EINTR) + nwritten = 0; + else + return -1; + } + nleft -= nwritten; + buffer += nwritten; } return n; @@ -961,28 +911,25 @@ ssize_t Writeline(int sockd, const char *vptr, ssize_t n) { long getAddrFromString(const char* hostnameOrIp, struct sockaddr_in* addr) { - unsigned long ip; + unsigned long ip; - struct hostent * he; + struct hostent * he; - if(hostnameOrIp==NULL || addr==NULL) - return -1; + if (hostnameOrIp == NULL || addr == NULL) + return -1; - ip=inet_addr(hostnameOrIp); + ip = inet_addr(hostnameOrIp); - if(ip!=INADDR_NONE) - { - addr->sin_addr.s_addr=ip; - return 0; - } - else - { - he=gethostbyname(hostnameOrIp); - if(he==NULL) - return -1; - else - memcpy(&(addr->sin_addr),he->h_addr_list[0],4); - return 0; + if (ip != INADDR_NONE) { + addr->sin_addr.s_addr = ip; + return 0; + } else { + he = gethostbyname(hostnameOrIp); + if (he == NULL) + return -1; + else + memcpy(&(addr->sin_addr), he->h_addr_list[0], 4); + return 0; } } @@ -990,61 +937,60 @@ char *cCommand::result = NULL; cCommand::cCommand(void) { - title = command = NULL; - confirm = false; + title = command = NULL; + confirm = false; } cCommand::~cCommand() { - free(title); - free(command); + free(title); + free(command); } bool cCommand::Parse(const char *s) { - const char *p = strchr(s, ':'); - if (p) { - int l = p - s; - if (l > 0) { - title = MALLOC(char, l + 1); - stripspace(strn0cpy(title, s, l + 1)); - if (!isempty(title)) { - int l = strlen(title); - if (l > 1 && title[l - 1] == '?') { - confirm = true; - title[l - 1] = 0; - } - command = stripspace(strdup(skipspace(p + 1))); - return !isempty(command); - } + const char *p = strchr(s, ':'); + if (p) { + int l = p - s; + if (l > 0) { + title = MALLOC(char, l + 1); + stripspace(strn0cpy(title, s, l + 1)); + if (!isempty(title)) { + int l = strlen(title); + if (l > 1 && title[l - 1] == '?') { + confirm = true; + title[l - 1] = 0; + } + command = stripspace(strdup(skipspace(p + 1))); + return !isempty(command); + } } - } - return false; + } + return false; } const char *cCommand::Execute(const char *Parameters) { - free(result); - result = NULL; - cString cmdbuf; - if (Parameters) - cmdbuf = cString::sprintf("%s %s", command, Parameters); - const char *cmd = *cmdbuf ? *cmdbuf : command; - dsyslog("executing command '%s'", cmd); - cPipe p; - if (p.Open(cmd, "r")) { - int l = 0; - int c; - while ((c = fgetc(p)) != EOF) { - if (l % 20 == 0) - result = (char *)realloc(result, l + 21); - result[l++] = char(c); - } - if (result) - result[l] = 0; - p.Close(); - } - else - esyslog("ERROR: can't open pipe for command '%s'", cmd); - return result; + free(result); + result = NULL; + cString cmdbuf; + if (Parameters) + cmdbuf = cString::sprintf("%s %s", command, Parameters); + const char *cmd = *cmdbuf ? *cmdbuf : command; + dsyslog("executing command '%s'", cmd); + cPipe p; + if (p.Open(cmd, "r")) { + int l = 0; + int c; + while ((c = fgetc(p)) != EOF) { + if (l % 20 == 0) + result = (char *)realloc(result, l + 21); + result[l++] = char(c); + } + if (result) + result[l] = 0; + p.Close(); + } else + esyslog("ERROR: can't open pipe for command '%s'", cmd); + return result; } |