summaryrefslogtreecommitdiff
path: root/block/event.c
diff options
context:
space:
mode:
authorMidas <vdrportal_midas@gmx.de>2010-04-22 01:06:40 +0200
committerMidas <vdrportal_midas@gmx.de>2010-04-22 01:06:40 +0200
commit4921cf32c8bda089a21dc4a14ce191ed477f80ff (patch)
treeff9debb648949a2ad43ee7759fb667fb03a78b73 /block/event.c
downloadvdr-plugin-block-4921cf32c8bda089a21dc4a14ce191ed477f80ff.tar.gz
vdr-plugin-block-4921cf32c8bda089a21dc4a14ce191ed477f80ff.tar.bz2
Initial release. Version 0.0.1b. Fork of the taste plugin 0.0.2d by LordJaxom.
Patches for the taste plugin by tomg and mapovi were added permanently to the source of the block plugin. For more information, feature list und bugfixes read HISTORY and README please.
Diffstat (limited to 'block/event.c')
-rw-r--r--block/event.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/block/event.c b/block/event.c
new file mode 100644
index 0000000..d06040a
--- /dev/null
+++ b/block/event.c
@@ -0,0 +1,127 @@
+/**
+ * based on event.c,v 1.1.1.1 2006/02/26 14:11:02 lordjaxom
+ *
+ * version by Midas
+ *
+ */
+
+#include "event.h"
+
+#include <ctype.h>
+
+static char *duptolower(const char *s) {
+ char *c = strdup(s);
+ char *p = c;
+ for (; *p; ++p)
+ *p = tolower(*p);
+ return c;
+}
+
+cEventsBlock EventsBlock;
+
+cEventBlock::cEventBlock(void):
+ mRegularExp(false),
+ mIgnoreCase(false),
+ mCompiled(false)
+{
+ strncpy(mPattern, tr("New Entry"), sizeof(mPattern));
+}
+
+cEventBlock::cEventBlock(const char *Pattern):
+ mRegularExp(false),
+ mIgnoreCase(false),
+ mCompiled(false)
+{
+ strncpy(mPattern, Pattern, sizeof(mPattern));
+}
+
+cEventBlock::cEventBlock(const cEventBlock &Src)
+{
+ operator=(Src);
+}
+
+cEventBlock &cEventBlock::operator=(const cEventBlock &Src)
+{
+ printf("copy construct\n");
+ strcpy(mPattern, Src.mPattern);
+ mRegularExp = Src.mRegularExp;
+ mIgnoreCase = Src.mIgnoreCase;
+ mCompiled = false;
+ Compile();
+ return *this;
+}
+
+cEventBlock::~cEventBlock()
+{
+ if (mRegularExp)
+ regfree(&mExpression);
+}
+
+bool cEventBlock::Acceptable(const char *Event) const
+{
+ if (mRegularExp)
+ return regexec(&mExpression, Event, 0, NULL, 0) != 0;
+ else if (mIgnoreCase) {
+ char *ev = duptolower(Event);
+ char *pa = duptolower(mPattern);
+ printf("check for %s in %s\n", pa, ev);
+ bool res = strstr(ev, pa) == NULL;
+ free(ev); free(pa);
+ return res;
+ } else
+ return strstr(Event, mPattern) == NULL;
+}
+
+bool cEventBlock::Parse(char *s) {
+ char *patternbuf = NULL;
+ int fields = sscanf(s, "%d:%d:%a[^\n]", &mRegularExp, &mIgnoreCase, &patternbuf);
+
+ if (fields == 3) {
+ strncpy(mPattern, skipspace(stripspace(patternbuf)), sizeof(mPattern));
+ free(patternbuf);
+ } else { // backward compatibility
+ strncpy(mPattern, skipspace(stripspace(s)), sizeof(mPattern));
+ mRegularExp = false;
+ mIgnoreCase = false;
+ }
+
+ return Compile();
+}
+
+bool cEventBlock::Compile(void) {
+ mCompiled = false;
+ if (mRegularExp) {
+ if (regcomp(&mExpression, mPattern, REG_EXTENDED | (mIgnoreCase ? REG_ICASE : 0)) != 0) {
+ esyslog("ERROR: malformed regular expression: %s", mPattern);
+ return false;
+ } else
+ mCompiled = true;
+ }
+ return true;
+}
+
+bool cEventBlock::Save(FILE *f) {
+ return fprintf(f, "%d:%d:%s\n", mRegularExp, mIgnoreCase, mPattern) > 0;
+}
+
+bool cEventsBlock::Acceptable(const char *Event) {
+ const cEventBlock *event = First();
+ while (event != NULL) {
+ if (!event->Acceptable(Event))
+ return false;
+ event = Next(event);
+ }
+ return true;
+}
+
+cEventsBlock &cEventsBlock::operator=(const cEventsBlock &Source) {
+ cList<cEventBlock>::Clear();
+
+ const cEventBlock *event = Source.First();
+ while (event != NULL) {
+ printf("transfering %p\n", event);
+ Add(new cEventBlock(*event));
+ event = Source.Next(event);
+ }
+ return *this;
+}