⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xml2vdr.c

📁 DVBtune is a simple tuning application for DVB cards supported by the Linux DVB driver
💻 C
字号:
/*  xml2vdr - a conversion utility to convert XML DVB-SI files into a     channel list for VDR.    It uses the SAX functions of libxml (version 2) - see www.xmlsoft.org    (C) Dave Chapman, May 2001    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., 675 Mass Ave, Cambridge, MA 02139, USA.    */#include <string.h>#include <stdlib.h>#include <stdio.h>#include <libxml/parser.h>#include <libxml/parserInternals.h>/* This structure isn't used - it could be used to check the validity of the   file. */typedef enum {  PARSER_START,  PARSER_IN_SATELLITE,  PARSER_IN_TRANSPONDER,  PARSER_IN_SERVICE,  PARSER_IN_STREAM,  PARSER_END} ParserState;char service_name[256];char provider_name[256];int freq;char pol;char diseqc[]="S28.2E";int srate;int vpid;int apid[256];char ca_systems[256][256];int n_ca;int is_ac3[256];int n_apids=0;char lang[256][4];char tmp[32];int tpid;int ca;int pnr;int type;int ignore_service=0;int canal_radio_id;int in_audio_stream=0;int fta=0;/* A hack to clean text strings - it breaks on non-UK character sets */void my_strcpy(unsigned char* dest, unsigned char* source) {  int i=0;  int j=0;  while (source[j]!=0) {    if (source[j]==':') {      dest[i++]='|';    } else if ((source[j]>31) && (source[j]<128)) {      dest[i++]=source[j];    }    j++;  }  dest[i]=0;}static xmlEntityPtr xmlsat_GetEntity(void *user_data, const char *name) {  return xmlGetPredefinedEntity(name);}typedef struct _xmlsatParseState {  ParserState state;} xmlsatParseState;static void xmlsat_StartDocument(xmlsatParseState *state) {  state->state = PARSER_START;}static void xmlsat_EndDocument(xmlsatParseState *state) {  state->state = PARSER_END;}static void xmlsat_StartElement(xmlsatParseState *state, const char *name,                               const char **attrs) {  int i;  static int streamtype;  static int pid;    if (strcmp(name,"satellite")==0) {       state->state=PARSER_IN_SATELLITE;    } else if (strcmp(name,"transponder")==0) {        state->state=PARSER_IN_TRANSPONDER;        freq=0;        pol='V';        srate=27500;        if (attrs!=NULL) {           for (i=0;attrs[i]!=NULL;i+=2) {              if (strcmp(attrs[i],"freq")==0) {                freq=atoi(attrs[i+1])/1000;              } else if (strcmp(attrs[i],"srate")==0) {                srate=atoi(attrs[i+1])/1000;              } else if (strcmp(attrs[i],"polarity")==0) {                pol=attrs[i+1][0];              }           }        }    } else if (strcmp(name,"service")==0) {        if (attrs!=NULL) {           pnr=0;           ca=0;           for (i=0;attrs[i]!=NULL;i+=2) {              if (strcmp(attrs[i],"id")==0) {                pnr=atoi(attrs[i+1]);              }           }        }    } else if (strcmp(name,"stream")==0) {        if (attrs!=NULL) {           streamtype=0;           pid=0;           for (i=0;attrs[i]!=NULL;i+=2) {              if (strcmp(attrs[i],"type")==0) {                streamtype=atoi(attrs[i+1]);              } else if (strcmp(attrs[i],"pid")==0) {                pid=atoi(attrs[i+1]);              }           }           if ((streamtype==1) || (streamtype==2)) {             vpid=pid;           } else if ((streamtype==3) || (streamtype==4)) {             in_audio_stream=1;             apid[n_apids]=pid;             is_ac3[n_apids]=0;             lang[n_apids][0]=0;             n_apids++;           } else if (streamtype==6) {//             tpid=pid;           }        }    } else if (strcmp(name,"ac3_descriptor")==0) {      if (streamtype==6) {        is_ac3[n_apids]=1;        apid[n_apids]=pid;        lang[n_apids][0]=0;        n_apids++;        in_audio_stream=1;      }    } else if (strcmp(name,"ca_system_descriptor")==0) {      ca=1;      for (i=0;attrs[i]!=NULL;i+=2) {         if (strcmp(attrs[i],"system_id")==0) {           if (strlen(attrs[i+1])>0) {             strcpy(ca_systems[n_ca++],attrs[i+1]);           }         }      }    } else if (strcmp(name,"iso_639")==0) {      if (in_audio_stream) {        if (attrs!=NULL) {           canal_radio_id=0;           for (i=0;attrs[i]!=NULL;i+=2) {              if (strcmp(attrs[i],"language")==0) {                if (strlen(attrs[i+1])>0) {                  strcpy(lang[n_apids-1],attrs[i+1]);                }              }           }        }      }    } else if (strcmp(name,"canal_radio")==0) {        ignore_service=1;        if (attrs!=NULL) {           canal_radio_id=0;           for (i=0;attrs[i]!=NULL;i+=2) {              if (strcmp(attrs[i],"id")==0) {                canal_radio_id=atoi(attrs[i+1]);              } else if (strcmp(attrs[i],"name")==0) {                my_strcpy((unsigned char*)service_name,(unsigned char*)attrs[i+1]);              }           }        }    } else if (strcmp(name,"description")==0) {        if (attrs!=NULL) {           type=0;           service_name[0]=0;           provider_name[0]=0;           for (i=0;attrs[i]!=NULL;i+=2) {              if (strcmp(attrs[i],"service_name")==0) {                my_strcpy((unsigned char*)service_name,(unsigned char*)attrs[i+1]);              } else if (strcmp(attrs[i],"provider_name")==0) {                my_strcpy((unsigned char*)provider_name,(unsigned char*)attrs[i+1]);              } else if (strcmp(attrs[i],"type")==0) {                type=atoi(attrs[i+1]);              }           }       }   }}static void xmlsat_EndElement(xmlsatParseState *state, const char *name) {  int i,x;  if (strcmp(name,"stream")==0) {    in_audio_stream=0;  } else if (strcmp(name,"canal_radio")==0) {//     if (ca==0) printf("%s:RADIO:%s:%d:%c:%d:%d:%d:%d:%d:%d:%d\n",provider_name,service_name,freq,pol,diseqc,srate,vpid,apid[0],tpid,ca,pnr);    if ((ca==0) || (fta==0)) printf("%s (RADIO):%d:%c:%s:%d:%d:%d:%d:%d:%d\n",service_name,freq,pol,diseqc,srate,vpid,apid[0],tpid,ca,pnr);     n_apids=0;     n_ca=0;  } else if (strcmp(name,"service")==0) {     if (service_name[0]==0) strcpy(service_name,"no name");     if ((ignore_service==0) && ((type==1) || (type==2) || (type==155))) {  // TV or Radio or DishNetwork TV       /* Only print service if at least 1 PID is non-zero */       if (((ca==0) || (fta==0)) && (((vpid!=0) || (n_apids>0) || (tpid!=0)))) {//         printf("%s:%s:%s:%d:%c:%s:%d:%d:",provider_name,((vpid==0) ? "RADIO" : "TV"),service_name,freq,pol,diseqc,srate,vpid);         printf("%s (%s):%d:%c:%s:%d:%d:",service_name,((vpid==0) ? "RADIO" : "TV"),freq,pol,diseqc,srate,vpid);         x=0;         for (i=0;i<n_apids;i++) {           if (!is_ac3[i]) { 	     if (x) printf(",");             x=1;             printf("%d",apid[i]);           }         }         x=0;         for (i=0;i<n_apids;i++) x+=is_ac3[i];         if (x) {           printf(";");           for (i=0;i<n_apids;i++) {             x=0;             if (is_ac3[i]) {                if (x) printf(",");               x=1;               printf("%d",apid[i]);             }           }         }         printf(":%d",tpid);         if (ca==0) {           printf(":0");         } else {           printf(":1");//           for (i=0;i<n_ca;i++) {//             if (i>0) printf(",");//             printf("%s",ca_systems[i]);//           }         }         printf(":%d\n",pnr);       }     }     service_name[0]=0;     n_apids=0;     n_ca=0;     vpid=0;     tpid=0;     pnr=0;     ca=0;     type=0;     ignore_service=0;  } else if (strcmp(name,"transponder")==0) {    freq=0;    pol=0;    srate=0;  }}static void xmlsat_Characters(xmlsatParseState *state, const char *chars,int len) {// This is copied from a libxml example - it's not used in this application.// xmlsat files don't have any text elements - all data is stored as // attributes.  /*  switch (state->state) {  case PARSER_IN_NAME:    for (i = 0; i < len; i++)      g_string_append_c(state->nameData, chars[i]);    break;  case PARSER_IN_SUMMARY:    for (i = 0; i < len; i++)      g_string_append_c(state->summaryData, chars[i]);    break;  default:    break;  }  */}static xmlSAXHandler xmlsatSAXParser = {   0, /* internalSubset */   0, /* isStandalone */   0, /* hasInternalSubset */   0, /* hasExternalSubset */   0, /* resolveEntity */   (getEntitySAXFunc)xmlsat_GetEntity, /* getEntity */   0, /* entityDecl */   0, /* notationDecl */   0, /* attributeDecl */   0, /* elementDecl */   0, /* unparsedEntityDecl */   0, /* setDocumentLocator */   (startDocumentSAXFunc)xmlsat_StartDocument, /* startDocument */   (endDocumentSAXFunc)xmlsat_EndDocument, /* endDocument */   (startElementSAXFunc)xmlsat_StartElement, /* startElement */   (endElementSAXFunc)xmlsat_EndElement, /* endElement */   0, /* reference */   (charactersSAXFunc)xmlsat_Characters, /* characters */   0, /* ignorableWhitespace */   0, /* processingInstruction */   0, /* comment */   0, /* warning */   0, /* error */   0 /* fatalError */};int main(int argc, char **argv) {  xmlParserCtxtPtr ctxt;  xmlsatParseState state;  if (argc<2) {    printf("Usage: %s [-fta] filename.xmlsat\n",argv[0]);  } else {    if (argc==2) {      ctxt = (xmlParserCtxtPtr)xmlCreateFileParserCtxt(argv[1]);    } else if (argc==3) {      if (strcmp(argv[1],"-fta")==0) {        fta=1;      }      ctxt = (xmlParserCtxtPtr)xmlCreateFileParserCtxt(argv[2]);    }    if (ctxt == NULL) {      fprintf(stderr,"ERROR: can not open file\n");    }    ctxt->sax = &xmlsatSAXParser;    ctxt->userData = &state;    xmlParseDocument(ctxt);    ctxt->sax = NULL;    xmlFreeParserCtxt(ctxt);  }  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -