#include #include #include "rtv.h" static void dump_version(FILE * in, FILE * out, int * plineno) { unsigned char buf[12]; unsigned char * p; u32 zeros1, version, zeros2; fread(buf, sizeof buf, 1, in); p = buf; zeros1 = rtv_to_u32(&p); version = rtv_to_u32(&p); zeros2 = rtv_to_u32(&p); expect(zeros1 == 0); expect(zeros2 == 0); fprintf(out, "%5d --- Version %d\n", ++*plineno, version); } static int round_up(u32 i) { return ((i+3)/4)*4; } static void dump_data(FILE * out, char * p, int count) { int i; for (i = 0; i < count; i++) { if (p[i]) { fputc(p[i], out); } else { if (i < count-1) { fputc(',', out); fputc(' ', out); } } } } static char * format_time(time_t sec, u16 frac) { static char buf[64]; struct tm * tm; tm = gmtime(&sec); sprintf(buf, "%2d/%02d %2d:%02d:%02d.%0.3u", tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, (frac*1000)/64000); return buf; } static int dump_line(FILE * in, FILE * out, int *plineno) { unsigned char buf[65536]; unsigned char * p; u32 code, time_seconds; u16 time_fraction, data_len; if (fread(buf, 12, 1, in) <= 0) return 0; p = buf; code = rtv_to_u32(&p); time_seconds = rtv_to_u32(&p); time_fraction = rtv_to_u16(&p); data_len = rtv_to_u16(&p); fprintf(out, "%5d %s ", ++*plineno, format_time(time_seconds, time_fraction)); if (code) { fprintf(out, "%8x ", code); } else { fprintf(out, "%8s ", ""); } fread(buf, round_up(data_len), 1, in); dump_data(out, buf, data_len); fprintf(out, "\n"); return 1; } int main(int argc, char ** argv) { int lineno = 0; dump_version(stdin, stdout, &lineno); while (dump_line(stdin, stdout, &lineno)) ; }