#include #include "rtv.h" #define expect(x) do { \ if (!(x)) { \ fprintf(stderr, "Unexpected %s %d\n", #x, __LINE__); \ fprintf(stdout, "Unexpected %s %d\n", #x, __LINE__); \ } \ } while(0) u16 rtv_to_u16(unsigned char ** pp) { unsigned char * p; u16 r; p = *pp; r = *p++; r <<= 8; r |= *p++; *pp = p; return r; } u32 rtv_to_u32(unsigned char ** pp) { unsigned char * p; u32 r; p = *pp; r = rtv_to_u16(&p); r <<= 16; r |= rtv_to_u16(&p); *pp = p; return r; } u64 rtv_to_u64(unsigned char ** pp) { unsigned char * p; u64 r; p = *pp; r = rtv_to_u32(&p); r <<= 32; r |= rtv_to_u32(&p); *pp = p; return r; } static void clearstring(unsigned char * p) { while (*p) *p++ = 0; } static char * variant_name(unsigned char c) { static char * variants[26] = { "A Lineup", "B Lineup", "C", "Rebuild Lineup", "E", "F", "Non-Addressable Converter", "Hamlin", "Jerrold Impulse", "Jerrold", "K", "Digital Rebuild", "Multiple Converters", "Pioneer", "Oak", "Premium", "Q", "Cable-ready-TV", "Converter Switch", "Tocom", "A Lineup Cable-ready-TV", "B Lineup Cable-ready-TV", "Scientific-Atlanta", "Digital", "Y", "Zenith" }; static char buffer[32]; if (c == 0) { return "Standard"; } if (c >= 'A' && c <= 'Z') { return variants[c - 'A']; } sprintf(buffer, "Unknown '%c'", c); return buffer; } static char * tier_name(unsigned char tier) { static char buffer[32]; switch(tier) { case 1: return "Basic"; case 2: return "Extended"; case 3: return "Premium"; case 4: return "PPV"; case 5: return "Music"; default: sprintf(buffer, "Unknown %d", buffer); return buffer; } } static void dump_header(unsigned char * buf) { static unsigned char zeros[36]; unsigned char * p; u32 variants, type; u8 byte28; int i; p = buf; variants = rtv_to_u32(&p); type = rtv_to_u32(&p); byte28 = buf[28]; printf("Type: "); switch(type) { case 0x4000000: printf("Cable\n"); expect(byte28 == 5); break; case 0x5000000: printf("Satellite\n"); break; case 0: printf("Antenna\n"); break; default: printf("Unknown %lx\n", type); break; } memset(buf, 0, 8); buf[28] = 0; expect(memcmp(buf, zeros, 36) == 0); printf("Expected variants:\n"); for (i = 0; i < 27; i++) { if (variants & (1 << i)) { printf(" %s\n", variant_name(i ? 'A' + i - 1 : 0)); } } } static void dump_record(unsigned char * buf) { static unsigned char zeros[56]; unsigned char * p; u32 tmsid; u16 channel; unsigned char variant, tier; char name[8]; char description[32]; p = buf; tmsid = rtv_to_u32(&p); channel = rtv_to_u16(&p); variant = *p++; tier = *p++; memcpy(name, p, 8); clearstring(p); p += 16; memcpy(description, p, 32); clearstring(p); p += 32; expect(p - buf == 56); memset(buf, 0, 8); expect(memcmp(buf, zeros, 56) == 0); printf("%-16s %3d %-8s %5d %-8.8s %s\n", variant_name(variant), channel, tier_name(tier), tmsid, name, description ); } int main(int argc, char ** argv) { unsigned char buffer[56]; fread(buffer, 36, 1, stdin); dump_header(buffer); while (fread(buffer, 56, 1, stdin)) dump_record(buffer); }