/* * * dvbrc2vdr.c: Converts 'xtvrc' files to 'vdr' channel format * * * * Copyright (C) 2000 Plamen Ganev * * * * 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 2 * * 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, write to the Free Software * * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Or, point your browser to http://www.gnu.org/copyleft/gpl.html * * * * The author can be reached at pganev@comm.it * * * */ #include #include #include #include #define MAX_LINE_LEN 1024 #define MAX_NAME 100 #define TOKS ": \n\r" #define NAMETOKS ":\n\r" typedef struct { char Name[MAX_NAME+1]; int freq; int color, hue, bright, saturation ; int nitv, input ; int pol, srate, fec, vpid, apid, lnbnum, type; int sid, pcrpid ; } CHANNEL_DATA ; void strupr( char *s ){ while ( s && *s ){ *s = toupper(*s); s++; } } /* Warning: This function uses the last strtol string! */ int GetTpInfo( CHANNEL_DATA *channel ) { // s is: ID x SATID x TYPE x FREQ x POL H/V SRATE x FEC x char *p ; p = strtok( NULL, TOKS ) ; /* Skip ID */ p = strtok( NULL, TOKS ) ; /* Skip x */ p = strtok( NULL, TOKS ) ; /* Skip SatId */ p = strtok( NULL, TOKS ) ; /* Skip x */ p = strtok( NULL, TOKS ) ; /* Skip Type */ p = strtok( NULL, TOKS ) ; /* Skip x */ p = strtok( NULL, TOKS ) ; /* Skip Freq */ p = strtok( NULL, TOKS ) ; /* Get Freq */ channel->freq = atol( p ) / 1000 ; p = strtok( NULL, TOKS ) ; /* Skip Pol */ p = strtok( NULL, TOKS ) ; /* Get H/V */ channel->pol = (*p=='V') ? 1 : 0 ; p = strtok( NULL, TOKS ) ; /* Skip SRATE */ p = strtok( NULL, TOKS ) ; /* Get srate */ channel->srate = atol(p) / 1000 ; /* Convert SRATE */ return 0; } /* Warning: This function uses the last strtol string! */ int GetChInfo( CHANNEL_DATA *channel ) { /* s is: ID x NAME "name" SATID x TPID x SID x TYPE x VPID x APID x */ char *p, *q ; p = strtok( NULL, TOKS ) ; while ( p ) { if ( !strcmp( p, "ID" )) { p = strtok( NULL, TOKS ) ; } else if ( !strcmp( p, "NAME")) { while ( *p++ ); /* Jump to end of "NAME" */ p++ ; /* One More */ while ( *p == '"' ) p++ ; /* Skip the " */ q = channel->Name ; while ( *p != '"' ) if ( *p == ':' ) *q++ = '|', p++ ; else *q++ = *p++ ; /* Copy the name */ *q = 0 ; p++ ; p = strtok( p, TOKS ) ; channel->apid = 8190; channel->vpid = 8190; channel->pcrpid = 0 ; channel->sid = 0; } else if ( !strcmp( p, "VPID")) { p = strtok( NULL, TOKS ) ; channel->vpid = strtol( p, NULL, 16 ) ; p = strtok( NULL, TOKS ) ; } else if ( !strcmp( p, "APID")) { p = strtok( NULL, TOKS ) ; channel->apid = strtol( p, NULL, 16 ) ; p = strtok( NULL, TOKS ) ; } else if ( !strcmp( p, "SID")) { p = strtok( NULL, TOKS ) ; channel->sid = strtol( p, NULL, 16 ) ; p = strtok( NULL, TOKS ) ; } else if ( !strcmp( p, "PCRPID")) { p = strtok( NULL, TOKS ) ; channel->pcrpid = strtol( p, NULL, 16 ) ; p = strtok( NULL, TOKS ) ; } else { p = strtok( NULL, TOKS ) ; } } return 1; } int ReadChannel( FILE *f, CHANNEL_DATA *channel ) { static char s[MAX_LINE_LEN+1]; char *p; while (fgets( s, MAX_LINE_LEN, f )){ p = strtok( s, TOKS ) ; strupr( p ) ; if ( !strcmp( p, "TRANSPONDER" )){ GetTpInfo( channel ) ; } else if ( !strcmp( p, "CHANNEL" ) ) { GetChInfo( channel ) ; return 1 ; } } return 0 ; } int main ( int argc, char *argv[] ){ FILE *f, *fo ; int cnt = 0; CHANNEL_DATA channel ; if ( argc != 3 ){ printf("USAGE: %s \n\n", argv[0] ) ; return 0; } if ( !(f=fopen(argv[1], "rt"))){ printf("Can't open %s for reading\n\n", argv[1]); return 0; } if ( !(fo=fopen(argv[2], "wt"))){ printf("Can't open %s for writing\n\n", argv[2]); return 0; } while ( ReadChannel( f, &channel ) ) { cnt++; fprintf(fo, "%s:%d:%c:%d:%d:%d:%d:%d:%d\n", channel.Name , channel.freq , channel.pol ? 'v' : 'h' , 1, //channel.lnbnum , channel.srate , channel.vpid , channel.apid , 0, //channel.type , channel.sid ) ; } printf( "%d channels read.\n\n", cnt ) ; fclose(f); fclose(fo); return 1; }