From: E.Smith <31170571+azlm8t@users.noreply.github.com>
Date: Tue, 5 Sep 2017 11:38:46 +0000 (+0100)
Subject: eit: Move opentv pattern list functions to separate file. (#4287).
X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c5d2f7d15943923b962074fd07b95963f765ed96;p=thirdparty%2Ftvheadend.git
eit: Move opentv pattern list functions to separate file. (#4287).
The pattern list functions are used for regular expression matching.
We move them to a separate file and rename them to have an
eit prefix instead of opentv prefix so they can be shared with
other eit modules.
Issue: #4287
---
diff --git a/Makefile b/Makefile
index 531f5e265..a46a64d62 100644
--- a/Makefile
+++ b/Makefile
@@ -390,6 +390,7 @@ I18N-C += $(SRCS-MPEGTS-DVB)
SRCS-MPEGTS-EPG = \
src/epggrab/otamux.c\
src/epggrab/module/eit.c \
+ src/epggrab/module/eitpatternlist.c \
src/epggrab/module/psip.c \
src/epggrab/support/freesat_huffman.c \
src/epggrab/module/opentv.c
diff --git a/src/epggrab/module/eitpatternlist.c b/src/epggrab/module/eitpatternlist.c
new file mode 100644
index 000000000..31c9249de
--- /dev/null
+++ b/src/epggrab/module/eitpatternlist.c
@@ -0,0 +1,82 @@
+/*
+ * Electronic Program Guide - Regular Expression Pattern Functions
+ * Copyright (C) 2012-2017 Adam Sutton
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include
+#include "tvheadend.h"
+#include "eitpatternlist.h"
+#include "htsmsg.h"
+
+void eit_pattern_compile_list ( eit_pattern_list_t *list, htsmsg_t *l )
+{
+ eit_pattern_t *pattern;
+ htsmsg_field_t *f;
+ const char *s;
+
+ TAILQ_INIT(list);
+ if (!l) return;
+ HTSMSG_FOREACH(f, l) {
+ s = htsmsg_field_get_str(f);
+ if (s == NULL) continue;
+ pattern = calloc(1, sizeof(eit_pattern_t));
+ pattern->text = strdup(s);
+ if (regcomp(&pattern->compiled, pattern->text, REG_EXTENDED)) {
+ tvhwarn(LS_EPGGRAB, "error compiling pattern \"%s\"", pattern->text);
+ free(pattern->text);
+ free(pattern);
+ } else {
+ tvhtrace(LS_EPGGRAB, "compiled pattern \"%s\"", pattern->text);
+ TAILQ_INSERT_TAIL(list, pattern, p_links);
+ }
+ }
+}
+
+void *eit_pattern_apply_list(char *buf, size_t size_buf, const char *text, eit_pattern_list_t *l)
+{
+ regmatch_t match[2];
+ eit_pattern_t *p;
+ int size;
+
+ if (!l) return NULL;
+ /* search and report the first match */
+ TAILQ_FOREACH(p, l, p_links)
+ if (!regexec(&p->compiled, text, 2, match, 0) && match[1].rm_so != -1) {
+ size = MIN(match[1].rm_eo - match[1].rm_so, size_buf - 1);
+ while (size > 0 && isspace(text[match[1].rm_so + size - 1]))
+ size--;
+ memcpy(buf, text + match[1].rm_so, size);
+ buf[size] = '\0';
+ if (size) {
+ tvhtrace(LS_EPGGRAB," pattern \"%s\" matches with '%s'", p->text, buf);
+ return buf;
+ }
+ }
+ return NULL;
+}
+
+void eit_pattern_free_list ( eit_pattern_list_t *l )
+{
+ eit_pattern_t *p;
+
+ if (!l) return;
+ while ((p = TAILQ_FIRST(l)) != NULL) {
+ TAILQ_REMOVE(l, p, p_links);
+ free(p->text);
+ regfree(&p->compiled);
+ free(p);
+ }
+}
diff --git a/src/epggrab/module/eitpatternlist.h b/src/epggrab/module/eitpatternlist.h
new file mode 100644
index 000000000..a2e863d44
--- /dev/null
+++ b/src/epggrab/module/eitpatternlist.h
@@ -0,0 +1,42 @@
+/*
+ * Electronic Program Guide - Regular Expression Pattern Functions
+ * Copyright (C) 2012-2017 Adam Sutton
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef __EITPATTERN_LIST__
+#define __EITPATTERN_LIST__
+
+#include
+#include "queue.h"
+
+typedef struct eit_pattern
+{
+ char *text;
+ regex_t compiled;
+ TAILQ_ENTRY(eit_pattern) p_links;
+} eit_pattern_t;
+TAILQ_HEAD(eit_pattern_list, eit_pattern);
+typedef struct eit_pattern_list eit_pattern_list_t;
+
+/* Compile a regular expression pattern from a message */
+void eit_pattern_compile_list ( eit_pattern_list_t *list, htsmsg_t *l );
+/* Apply the compiled pattern to text. If it matches then return the
+ * match in buf which is of size size_buf.
+ * Return the buf or NULL if no match.
+ */
+void *eit_pattern_apply_list(char *buf, size_t size_buf, const char *text, eit_pattern_list_t *l);
+void eit_pattern_free_list ( eit_pattern_list_t *l );
+#endif
diff --git a/src/epggrab/module/opentv.c b/src/epggrab/module/opentv.c
index 8674bae23..3740ebd25 100644
--- a/src/epggrab/module/opentv.c
+++ b/src/epggrab/module/opentv.c
@@ -19,7 +19,6 @@
#include
#include
#include
-#include
#include
#include "tvheadend.h"
#include "channels.h"
@@ -27,6 +26,7 @@
#include "epg.h"
#include "epggrab.h"
#include "epggrab/private.h"
+#include "eitpatternlist.h"
#include "subscriptions.h"
#include "streaming.h"
#include "service.h"
@@ -57,14 +57,6 @@ typedef struct opentv_genre
RB_ENTRY(opentv_genre) h_link;
} opentv_genre_t;
-typedef struct opentv_pattern
-{
- char *text;
- regex_t compiled;
- TAILQ_ENTRY(opentv_pattern) p_links;
-} opentv_pattern_t;
-TAILQ_HEAD(opentv_pattern_list, opentv_pattern);
-typedef struct opentv_pattern_list opentv_pattern_list_t;
/* Provider configuration */
typedef struct opentv_module_t
@@ -83,11 +75,11 @@ typedef struct opentv_module_t
opentv_genre_t *genre;
int titles_time;
int summaries_time;
- opentv_pattern_list_t p_snum;
- opentv_pattern_list_t p_enum;
- opentv_pattern_list_t p_pnum;
- opentv_pattern_list_t p_subt;
- opentv_pattern_list_t p_cleanup_title;
+ eit_pattern_list_t p_snum;
+ eit_pattern_list_t p_enum;
+ eit_pattern_list_t p_pnum;
+ eit_pattern_list_t p_subt;
+ eit_pattern_list_t p_cleanup_title;
} opentv_module_t;
/*
@@ -284,29 +276,6 @@ static int _opentv_parse_event
return slen+4;
}
-static void *_opentv_apply_pattern_list(char *buf, size_t size_buf, const char *text, opentv_pattern_list_t *l)
-{
- regmatch_t match[2];
- opentv_pattern_t *p;
- int size;
-
- if (!l) return NULL;
- /* search and report the first match */
- TAILQ_FOREACH(p, l, p_links)
- if (!regexec(&p->compiled, text, 2, match, 0) && match[1].rm_so != -1) {
- size = MIN(match[1].rm_eo - match[1].rm_so, size_buf - 1);
- while (size > 0 && isspace(text[match[1].rm_so + size - 1]))
- size--;
- memcpy(buf, text + match[1].rm_so, size);
- buf[size] = '\0';
- if (size) {
- tvhtrace(LS_OPENTV," pattern \"%s\" matches with '%s'", p->text, buf);
- return buf;
- }
- }
- return NULL;
-}
-
/* Parse an event section */
static int
opentv_parse_event_section_one
@@ -396,7 +365,7 @@ opentv_parse_event_section_one
tvhdebug(LS_OPENTV, " title '%s'", ev.title);
/* try to cleanup the title */
- if (_opentv_apply_pattern_list(buffer, sizeof(buffer), ev.title, &mod->p_cleanup_title)) {
+ if (eit_pattern_apply_list(buffer, sizeof(buffer), ev.title, &mod->p_cleanup_title)) {
tvhtrace(LS_OPENTV, " clean title '%s'", buffer);
s = buffer;
} else {
@@ -417,15 +386,15 @@ opentv_parse_event_section_one
memset(&en, 0, sizeof(en));
/* search for season number */
- if (_opentv_apply_pattern_list(buffer, sizeof(buffer), ev.summary, &mod->p_snum))
+ if (eit_pattern_apply_list(buffer, sizeof(buffer), ev.summary, &mod->p_snum))
if ((en.s_num = atoi(buffer)))
tvhtrace(LS_OPENTV," extract season number %d", en.s_num);
/* ...for episode number */
- if (_opentv_apply_pattern_list(buffer, sizeof(buffer), ev.summary, &mod->p_enum))
+ if (eit_pattern_apply_list(buffer, sizeof(buffer), ev.summary, &mod->p_enum))
if ((en.e_num = atoi(buffer)))
tvhtrace(LS_OPENTV," extract episode number %d", en.e_num);
/* ...for part number */
- if (_opentv_apply_pattern_list(buffer, sizeof(buffer), ev.summary, &mod->p_pnum)) {
+ if (eit_pattern_apply_list(buffer, sizeof(buffer), ev.summary, &mod->p_pnum)) {
if (buffer[0] >= 'a' && buffer[0] <= 'z')
en.p_num = buffer[0] - 'a' + 1;
else
@@ -439,7 +408,7 @@ opentv_parse_event_section_one
save |= epg_episode_set_epnum(ee, &en, &changes3);
/* ...for subtitle */
- if (_opentv_apply_pattern_list(buffer, sizeof(buffer), ev.summary, &mod->p_subt)) {
+ if (eit_pattern_apply_list(buffer, sizeof(buffer), ev.summary, &mod->p_subt)) {
tvhtrace(LS_OPENTV, " extract subtitle '%s'", buffer);
ls = lang_str_create2(buffer, lang);
save |= epg_episode_set_subtitle(ee, ls, &changes3);
@@ -797,30 +766,6 @@ static int* _pid_list_to_array ( htsmsg_t *m )
return ret;
}
-static void _opentv_compile_pattern_list ( opentv_pattern_list_t *list, htsmsg_t *l )
-{
- opentv_pattern_t *pattern;
- htsmsg_field_t *f;
- const char *s;
-
- TAILQ_INIT(list);
- if (!l) return;
- HTSMSG_FOREACH(f, l) {
- s = htsmsg_field_get_str(f);
- if (s == NULL) continue;
- pattern = calloc(1, sizeof(opentv_pattern_t));
- pattern->text = strdup(s);
- if (regcomp(&pattern->compiled, pattern->text, REG_EXTENDED)) {
- tvhwarn(LS_OPENTV, "error compiling pattern \"%s\"", pattern->text);
- free(pattern->text);
- free(pattern);
- } else {
- tvhtrace(LS_OPENTV, "compiled pattern \"%s\"", pattern->text);
- TAILQ_INSERT_TAIL(list, pattern, p_links);
- }
- }
-}
-
static int _opentv_genre_load_one ( const char *id, htsmsg_t *m )
{
htsmsg_field_t *f;
@@ -898,18 +843,6 @@ static void _opentv_dict_load ( htsmsg_t *m )
htsmsg_destroy(m);
}
-static void _opentv_free_pattern_list ( opentv_pattern_list_t *l )
-{
- opentv_pattern_t *p;
-
- if (!l) return;
- while ((p = TAILQ_FIRST(l)) != NULL) {
- TAILQ_REMOVE(l, p, p_links);
- free(p->text);
- regfree(&p->compiled);
- free(p);
- }
-}
static void _opentv_done( void *m )
{
@@ -919,11 +852,11 @@ static void _opentv_done( void *m )
free(mod->title);
free(mod->summary);
- _opentv_free_pattern_list(&mod->p_snum);
- _opentv_free_pattern_list(&mod->p_enum);
- _opentv_free_pattern_list(&mod->p_pnum);
- _opentv_free_pattern_list(&mod->p_subt);
- _opentv_free_pattern_list(&mod->p_cleanup_title);
+ eit_pattern_free_list(&mod->p_snum);
+ eit_pattern_free_list(&mod->p_enum);
+ eit_pattern_free_list(&mod->p_pnum);
+ eit_pattern_free_list(&mod->p_subt);
+ eit_pattern_free_list(&mod->p_cleanup_title);
}
static int _opentv_tune
@@ -1000,11 +933,11 @@ static int _opentv_prov_load_one ( const char *id, htsmsg_t *m )
mod->channel = _pid_list_to_array(cl);
mod->title = _pid_list_to_array(tl);
mod->summary = _pid_list_to_array(sl);
- _opentv_compile_pattern_list(&mod->p_snum, htsmsg_get_list(m, "season_num"));
- _opentv_compile_pattern_list(&mod->p_enum, htsmsg_get_list(m, "episode_num"));
- _opentv_compile_pattern_list(&mod->p_pnum, htsmsg_get_list(m, "part_num"));
- _opentv_compile_pattern_list(&mod->p_subt, htsmsg_get_list(m, "subtitle"));
- _opentv_compile_pattern_list(&mod->p_cleanup_title, htsmsg_get_list(m, "cleanup_title"));
+ eit_pattern_compile_list(&mod->p_snum, htsmsg_get_list(m, "season_num"));
+ eit_pattern_compile_list(&mod->p_enum, htsmsg_get_list(m, "episode_num"));
+ eit_pattern_compile_list(&mod->p_pnum, htsmsg_get_list(m, "part_num"));
+ eit_pattern_compile_list(&mod->p_subt, htsmsg_get_list(m, "subtitle"));
+ eit_pattern_compile_list(&mod->p_cleanup_title, htsmsg_get_list(m, "cleanup_title"));
return 1;
}