summaryrefslogtreecommitdiff
path: root/sources.c
diff options
context:
space:
mode:
Diffstat (limited to 'sources.c')
-rw-r--r--sources.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/sources.c b/sources.c
new file mode 100644
index 0000000..fc660a5
--- /dev/null
+++ b/sources.c
@@ -0,0 +1,104 @@
+/*
+ * sources.c: Source handling
+ *
+ * See the main source file 'vdr.c' for copyright information and
+ * how to reach the author.
+ *
+ * $Id: sources.c 1.1 2002/10/06 09:27:10 kls Exp $
+ */
+
+#include "sources.h"
+#include <ctype.h>
+
+// -- cSource ----------------------------------------------------------------
+
+cSource::cSource(void)
+{
+ code = stNone;
+ description = NULL;
+}
+
+cSource::~cSource()
+{
+ free(description);
+}
+
+bool cSource::Parse(const char *s)
+{
+ char *codeBuf = NULL;
+ if (2 == sscanf(s, "%a[^ ] %a[^\n]", &codeBuf, &description))
+ code = FromString(codeBuf);
+ free(codeBuf);
+ return code != stNone && description && *description;
+}
+
+const char *cSource::ToString(int Code)
+{
+ static char buffer[16];
+ char *q = buffer;
+ switch (Code & st_Mask) {
+ case stCable: *q++ = 'C'; break;
+ case stSat: *q++ = 'S';
+ {
+ int pos = Code & ~st_Mask;
+ q += snprintf(q, sizeof(buffer) - 2, "%u.%u", (pos & ~st_Neg) / 10, (pos & ~st_Neg) % 10); // can't simply use "%g" here since the silly 'locale' messes up the decimal point
+ *q++ = (Code & st_Neg) ? 'E' : 'W';
+ }
+ break;
+ case stTerr: *q++ = 'T'; break;
+ default: *q++ = Code + '0'; // backward compatibility
+ }
+ *q = 0;
+ return buffer;
+}
+
+int cSource::FromString(const char *s)
+{
+ int type = stNone;
+ switch (toupper(*s)) {
+ case 'C': type = stCable; break;
+ case 'S': type = stSat; break;
+ case 'T': type = stTerr; break;
+ case '0' ... '9': type = *s - '0'; break; // backward compatibility
+ default: esyslog("ERROR: unknown source key '%c'", *s);
+ return stNone;
+ }
+ int code = type;
+ if (type == stSat) {
+ int pos = 0;
+ bool dot = false;
+ bool neg = false;
+ while (*++s) {
+ switch (toupper(*s)) {
+ case '0' ... '9': pos *= 10;
+ pos += *s - '0';
+ break;
+ case '.': dot = true;
+ break;
+ case 'E': neg = true; // fall through to 'W'
+ case 'W': if (!dot)
+ pos *= 10;
+ break;
+ default: esyslog("ERROR: unknown source character '%c'", *s);
+ return stNone;
+ }
+ }
+ if (neg)
+ pos |= st_Neg;
+ code |= pos;
+ }
+ return code;
+}
+
+// -- cSources ---------------------------------------------------------------
+
+cSources Sources;
+
+cSource *cSources::Get(int Code)
+{
+ for (cSource *p = First(); p; p = Next(p)) {
+ if (p->Code() == Code)
+ return p;
+ }
+ return NULL;
+}