#include #include #include #include #include #include #include int pass; char *type; struct strtab { const char *v1; const char *v2; }; static struct strtab fectab[] = { { "NONE", "FEC_NONE" }, { "1/1", "FEC_AUTO" }, { "1/2", "FEC_1_2" }, { "2/3", "FEC_2_3" }, { "3/4", "FEC_3_4" }, { "4/5", "FEC_4_5" }, { "5/6", "FEC_5_6" }, { "6/7", "FEC_6_7" }, { "7/8", "FEC_7_8" }, { "8/9", "FEC_8_9" }, { "AUTO", "FEC_AUTO" } }; static struct strtab qamtab[] = { { "QPSK", "QPSK" }, { "QAM16", "QAM_16" }, { "QAM32", "QAM_32" }, { "QAM64", "QAM_64" }, { "QAM128", "QAM_128" }, { "QAM256", "QAM_256" }, { "AUTO", "QAM_AUTO" }, { "8VSB", "VSB_8" }, { "16VSB", "VSB_16" } }; static struct strtab bwtab[] = { { "8MHz", "BANDWIDTH_8_MHZ" }, { "7MHz", "BANDWIDTH_7_MHZ" }, { "6MHz", "BANDWIDTH_6_MHZ" }, { "AUTO", "BANDWIDTH_AUTO" } }; static struct strtab modetab[] = { { "2k", "TRANSMISSION_MODE_2K" }, { "8k", "TRANSMISSION_MODE_8K" }, { "AUTO", "TRANSMISSION_MODE_AUTO" } }; static struct strtab guardtab[] = { { "1/32", "GUARD_INTERVAL_1_32" }, { "1/16", "GUARD_INTERVAL_1_16" }, { "1/8", "GUARD_INTERVAL_1_8" }, { "1/4", "GUARD_INTERVAL_1_4" }, { "AUTO", "GUARD_INTERVAL_AUTO" }, }; static struct strtab hiertab[] = { { "NONE", "HIERARCHY_NONE" }, { "1", "HIERARCHY_1" }, { "2", "HIERARCHY_2" }, { "4", "HIERARCHY_4" }, { "AUTO", "HIERARCHY_AUTO" } }; static const char * str2str0(const char *str, struct strtab tab[], int l) { int i; for(i = 0; i < l; i++) if(!strcasecmp(str, tab[i].v1)) return tab[i].v2; fprintf(stderr, "Warning, cannot translate %s\n", str); return "#error"; } #define str2str(str, tab) str2str0(str, tab, sizeof(tab) / sizeof(tab[0])) static void dvb_t_config(const char *l) { unsigned long freq; char bw[20], fec[20], fec2[20], qam[20], mode[20], guard[20], hier[20]; int r; r = sscanf(l, "%lu %10s %10s %10s %10s %10s %10s %10s", &freq, bw, fec, fec2, qam, mode, guard, hier); if(r != 8) return; printf("\t{.freq = %lu, " ".bw = %s, " ".constellation = %s, " ".fechp = %s, " ".feclp = %s, " ".tmode = %s, " ".guard = %s, " ".hierarchy = %s},\n " , freq, str2str(bw, bwtab), str2str(qam, qamtab), str2str(fec, fectab), str2str(fec2, fectab), str2str(mode, modetab), str2str(guard, guardtab), str2str(hier, hiertab)); } static void dvb_s_config(const char *l) { unsigned long freq, symrate; char fec[20], polarisation; int r; r = sscanf(l, "%lu %c %lu %s", &freq, &polarisation, &symrate, fec); if(r != 4) return; printf("\t{" ".freq = %lu, .symrate = %lu, .fec = %s, .polarisation = '%c'},\n", freq, symrate, str2str(fec, fectab), polarisation); } static void dvb_c_config(const char *l) { unsigned long freq, symrate; char fec[20], qam[20]; int r; r = sscanf(l, "%lu %lu %s %s", &freq, &symrate, fec, qam); if(r != 4) return; printf("\t{ " ".freq = %lu, .symrate = %lu, .fec = %s, .constellation = %s},\n", freq, symrate, str2str(fec, fectab), str2str(qam, qamtab)); } static void convert_file(char *fname) { FILE *fp; char line[200]; int l; char c, *s; char smartname[200]; const char *bn; int gotcomment = 0; fp = fopen(fname, "r"); if(fp == NULL) { fprintf(stderr, "Unable to open file %s -- %s", fname, strerror(errno)); return; } l = 0; bn = basename(fname); while(*bn) { c = *bn++; smartname[l++] = isalnum(c) ? c : '_'; } smartname[l] = 0; if(pass == 1) { printf("struct mux muxlist_%s_%s[] = {\n", type, smartname); } if(pass == 2) { printf("{\n"); printf("\t.type = %s,\n", type); printf("\t.name = \"%s\",\n", basename(fname)); printf("\t.muxes = muxlist_%s_%s,\n", type, smartname); printf("\t.nmuxes = sizeof(muxlist_%s_%s) / sizeof(struct mux),\n", type, smartname); printf("\t.comment = "); } while(!feof(fp)) { memset(line, 0, sizeof(line)); if(fgets(line, sizeof(line) - 1, fp) == NULL) break; l = strlen(line); while(l > 0 && line[l - 1] < 32) line[--l] = 0; switch(line[0]) { case '#': if(gotcomment) break; if(pass != 2) break; s = line + 2; if(strstr(s, " freq ")) break; printf("\"%s\"\n", s); gotcomment = 1; break; case 'C': if(pass == 1) dvb_c_config(line + 1); break; case 'T': if(pass == 1) dvb_t_config(line + 1); break; case 'S': if(pass == 1) dvb_s_config(line + 1); break; default: break; } } if(pass == 2) { if(gotcomment == 0) printf("\"\"\n"); printf("},\n"); } if(pass == 1) { printf("};\n\n"); } fclose(fp); } int main(int argc, char **argv) { int i; if(argc < 3) return 1; pass = atoi(argv[1]); if(pass < 1 || pass > 2) return 2; type = argv[2]; for(i = 3; i < argc; i++) { convert_file(argv[i]); } return 0; }