120 lines
2.4 KiB
C
120 lines
2.4 KiB
C
|
#include <stdio.h>
|
||
|
#include <errno.h>
|
||
|
#include <string.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <stdint.h>
|
||
|
#include <unistd.h>
|
||
|
#include <time.h>
|
||
|
#include <strings.h>
|
||
|
|
||
|
#include "lint.h"
|
||
|
|
||
|
struct descriptor *
|
||
|
read_descriptor_header(struct epg *epg)
|
||
|
{
|
||
|
static struct descriptor d;
|
||
|
|
||
|
if (epg->binsize - epg->offset < 2)
|
||
|
return NULL;
|
||
|
|
||
|
memcpy(&d, epg->bin + epg->offset, 2);
|
||
|
|
||
|
epg->offset += 2;
|
||
|
|
||
|
return &d;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
read_descriptor(struct epg *epg, struct descriptor *d)
|
||
|
{
|
||
|
switch (d->tag)
|
||
|
{
|
||
|
case 77:
|
||
|
memcpy(d->content.d77.language, epg->bin + epg->offset, 3);
|
||
|
epg->offset += 3;
|
||
|
|
||
|
d->content.d77.namelen = epg->bin[epg->offset++];
|
||
|
d->content.d77.name = read_string_len(epg->bin + epg->offset,
|
||
|
d->content.d77.namelen);
|
||
|
epg->offset += d->content.d77.namelen;
|
||
|
|
||
|
d->content.d77.textlen = epg->bin[epg->offset++];
|
||
|
d->content.d77.text = read_string_len(epg->bin + epg->offset,
|
||
|
d->content.d77.textlen);
|
||
|
epg->offset += d->content.d77.textlen;
|
||
|
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
epg->offset += d->len;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
inline void
|
||
|
skip_descriptor(struct epg *epg, struct descriptor *d)
|
||
|
{
|
||
|
epg->offset += d->len;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
free_descriptor(struct descriptor *d)
|
||
|
{
|
||
|
switch (d->tag)
|
||
|
{
|
||
|
case DS_SHORT_EVENT:
|
||
|
free(d->content.d77.name);
|
||
|
free(d->content.d77.text);
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
char *
|
||
|
descriptor_name(struct descriptor *d)
|
||
|
{
|
||
|
switch (d->tag)
|
||
|
{
|
||
|
case DS_LINKAGE: return "linkage";
|
||
|
case DS_SHORT_EVENT: return "short event";
|
||
|
case DS_COMPONENT: return "component";
|
||
|
case DS_CONTENT: return "content";
|
||
|
case DS_PRIVATE_DATA_SPECIFIER: return "private data spec.";
|
||
|
case DS_CONTENT_IDENTIFIER: return "content id";
|
||
|
case DS_FTA_CONTENT_MGMT: return "content mgmt";
|
||
|
case DS_USER_DEFINED: return "user defined";
|
||
|
default: return "Unknown";
|
||
|
}
|
||
|
return "Unknown";
|
||
|
}
|
||
|
|
||
|
void
|
||
|
dump_descriptor(struct descriptor *d, int content)
|
||
|
{
|
||
|
printf("Descriptor header:\n");
|
||
|
printf(" %30s: %#x [%d] (%s)\n", "descriptor", d->tag, d->tag,
|
||
|
descriptor_name(d));
|
||
|
DUMPINT(d, len);
|
||
|
|
||
|
if (!content)
|
||
|
return;
|
||
|
|
||
|
switch (d->tag)
|
||
|
{
|
||
|
case DS_SHORT_EVENT:
|
||
|
DUMPNSTR(d, content.d77.language, 3);
|
||
|
DUMPINT(d, content.d77.namelen);
|
||
|
//DUMPNSTR(d, content.d77.name, d->content.d77.namelen);
|
||
|
DUMPHEX(d, content.d77.name, d->content.d77.namelen);
|
||
|
DUMPINT(d, content.d77.textlen);
|
||
|
//DUMPNSTR(d, content.d77.text, d->content.d77.textlen);
|
||
|
DUMPHEX(d, content.d77.text, d->content.d77.textlen);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|