mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Modified channel handling; full DiSEqC support
This commit is contained in:
104
sources.c
Normal file
104
sources.c
Normal file
@@ -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;
|
||||
}
|
Reference in New Issue
Block a user