/*@null@*/ void *zlst_pop(/*@out@*/ /*@null@*/ void *PHEAD) { struct znode *head; struct znode *tail; if(!PHEAD) { RPTERR("pop: NOT a list"); return NULL; } head = *(struct znode **)PHEAD; if(!head) { RPTINF("pop: from empty list"); return NULL; } tail = head->tail; if(!(head->next)) { RPTINF("pop: from one node list"); *(struct znode **)PHEAD = NULL; return head; } if(!(tail->prev)) { RPTERR("pop: bad list"); return NULL; } RPTINF("pop: ok"); tail->prev->next = NULL; head->tail = tail->prev; return tail; }
/* to tail */ void zlst_push(void *PHEAD, void *ZNODE) { struct znode *head; struct znode *znode; if(!ZNODE) { RPTERR("push: bad node"); return; } znode = (struct znode *)ZNODE; if(!PHEAD) { RPTERR("push: NOT a list"); return; } head = *(struct znode **)PHEAD; if(!head) { RPTINF("push: into empty list"); znode->tail = znode; znode->next = NULL; znode->prev = NULL; *(struct znode **)PHEAD = znode; return; } RPTINF("push: ok"); znode->next = NULL; znode->prev = head->tail; head->tail->next = znode; /* head->tail is ok! */ head->tail = znode; return; }
/* to head */ void zlst_unshift(void *PHEAD, void *ZNODE) { struct znode *head; struct znode *znode; if(!ZNODE) { RPTERR("unshift: bad node"); return; } znode = (struct znode *)ZNODE; if(!PHEAD) { RPTERR("unshift: NOT a list"); return; } head = *(struct znode **)PHEAD; if(!head) { RPTINF("unshift: into empty list"); znode->tail = znode; znode->next = NULL; znode->prev = NULL; *(struct znode **)PHEAD = znode; return; } RPTINF("unshift: ok"); znode->tail = head->tail; znode->next = head; znode->prev = NULL; head->prev = znode; *(struct znode **)PHEAD = znode; return; }
/* if not return 0, it's up to the caller to free the uninserted node! */ int zlst_insert(void *PHEAD, void *ZNODE) { struct znode *head; struct znode *znode; struct znode *x; if(!ZNODE) { RPTERR("insert: bad node"); return -1; } znode = (struct znode *)ZNODE; if(!PHEAD) { RPTERR("insert: NOT a list"); return -1; } head = *(struct znode **)PHEAD; if(!head) { RPTINF("insert: into empty list"); znode->tail = znode; znode->next = NULL; znode->prev = NULL; *(struct znode **)PHEAD = znode; return 0; } if(head->key > znode->key) { RPTINF("insert: %d as head before %d", znode->key, head->key); znode->tail = head->tail; znode->next = head; znode->prev = NULL; head->prev = znode; *(struct znode **)PHEAD = znode; return 0; } for(x = head; x; x = x->next) { if(x->key == znode->key) { RPTINF("insert: %d in list already", znode->key); return -1; } if(x->key > znode->key) { RPTINF("insert: %d before %d", znode->key, x->key); znode->next = x; znode->prev = x->prev; x->prev->next = znode; x->prev = znode; return 0; } } RPTINF("insert: %d as tail after %d", znode->key, head->tail->key); znode->next = NULL; znode->prev = head->tail; head->tail->next = znode; head->tail = znode; return 0; }
static int parse_header() { int cnt; cnt = fread(&hdr, 1, 16, fd_i); /* file header has 16-byte */ if(cnt != 16) { RPTERR("read header of \"%s\" failed, cnt == %d != 16", file_i, cnt); return -1; } if(DTSDI_MAGIC_CODE1 != hdr.magic_code1 || DTSDI_MAGIC_CODE2 != hdr.magic_code2 || DTSDI_MAGIC_CODE3 != hdr.magic_code3) { RPTERR("magic_code1(0x%08X) : 0x%08X", DTSDI_MAGIC_CODE1, hdr.magic_code1); RPTERR("magic_code2(0x%08X) : 0x%08X", DTSDI_MAGIC_CODE2, hdr.magic_code2); RPTERR("magic_code3(0x%08X) : 0x%08X", DTSDI_MAGIC_CODE3, hdr.magic_code3); return -1; } if(DTSDI_TYPE_SDI_625 == hdr.type) { hbi_cnt_per_line = 280; total_line_cnt = 625; } else { hbi_cnt_per_line = 268; total_line_cnt = 525; } /* header_ext of version 1 */ if(DTSDI_FMT_VERSION != hdr.version) { cnt = fread(&hdr_ext, 1, 8, fd_i); /* header of version 1 has additional 8-byte */ if(cnt != 8) { RPTERR("read header_ext of \"%s\" failed, cnt == %d != 8", file_i, cnt); return -1; } } if(DAT_INFO == mode_inf) { fprintf(stdout, "DTSDI: version %d", hdr.version); fprintf(stdout, ", frame: %u", total_line_cnt); fprintf(stdout, ", %s", (DTSDI_SDI_FULL & hdr.flag) ? "full SDI data" : "active video only"); fprintf(stdout, ", %s", (DTSDI_SDI_10B & hdr.flag) ? "10-bit style" : "8-bit style"); fprintf(stdout, ", %s", (DTSDI_SDI_HUFFMAN & hdr.flag) ? "huffman compressed" : "uncompressed"); if(DTSDI_FMT_VERSION != hdr.version) { int i; fprintf(stdout, ", header_ext:"); for(i = 0; i < sizeof(hdr_ext); i++) { fprintf(stdout, " %02X", hdr_ext.ext[i]); } } fprintf(stdout, "\r\n"); } return 0; }
/*@null@*/ void *zlst_delete(void *PHEAD, /*@dependent@*/ void *ZNODE) { struct znode *head; struct znode *znode; if(!ZNODE) { RPTERR("delete: bad node"); return NULL; } znode = (struct znode *)ZNODE; if(!PHEAD) { RPTERR("delete: NOT a list"); return NULL; } head = *(struct znode **)PHEAD; if(!head) { RPTERR("delete: from an empty list"); return znode; } if(!(znode->prev) && !(znode->next)) { RPTINF("delete: from one node list"); *(struct znode **)PHEAD = NULL; return znode; } if(!(znode->prev) && (NULL != znode->next)) { RPTINF("delete: head node"); znode->next->tail = znode->tail; znode->next->prev = NULL; *(struct znode **)PHEAD = znode->next; return znode; } if((NULL != znode->prev) && !(znode->next)) { RPTINF("delete: tail node"); head->tail = znode->prev; znode->prev->next = NULL; return znode; } /* (znode->prev) && (znode->next) */ RPTINF("delete: ok"); znode->prev->next = znode->next; znode->next->prev = znode->prev; return znode; }
static int deal_with_parameter(int argc, char *argv[]) { int i; if(1 == argc) { /* no parameter */ fprintf(stderr, "No binary file to write...\n\n"); show_help(); return -1; } for(i = 1; i < argc; i++) { if('-' == argv[i][0]) { if( 0 == strcmp(argv[i], "-h") || 0 == strcmp(argv[i], "--help")) { show_help(); return -1; } else if(0 == strcmp(argv[i], "-v") || 0 == strcmp(argv[i], "--version")) { show_version(); return -1; } else { RPTERR("wrong parameter: %s", argv[i]); return -1; } } else { strcpy(file_o, argv[i]); } } return 0; }
/*@temp@*/ void *zlst_search(void *PHEAD, int key) { struct znode *head; struct znode *znode; if(!PHEAD) { RPTERR("search: NOT a list"); return NULL; } head = *(struct znode **)PHEAD; if(!head) { RPTINF("search: in an empty list"); return NULL; } for(znode = head; znode; znode = znode->next) { if(znode->key == key) { RPTINF("search: got %d", key); return znode; } } RPTINF("search: no %d", key); return NULL; }
/*@null@*/ void *zlst_shift(void *PHEAD) { struct znode *head; if(!PHEAD) { RPTERR("shift: NOT a list"); return NULL; } head = *(struct znode **)PHEAD; if(!head) { RPTINF("shift: from empty list"); return NULL; } if(!(head->next)) { RPTINF("shift: from one node list"); *(struct znode **)PHEAD = NULL; return head; } RPTINF("shift: ok"); head->next->prev = NULL; head->next->tail = head->tail; *(struct znode **)PHEAD = head->next; return head; }
int main(int argc, char *argv[]) { unsigned char bbuf[ 204 + 10]; /* bin data buffer */ char tbuf[1024 + 10]; /* txt data buffer */ if(0 != deal_with_parameter(argc, argv)) { return -1; } fd_i = url_open(file_i, "rb"); if(NULL == fd_i) { RPTERR("open \"%s\" failed", file_i); return -1; } pkt_addr = 0; while(1 == url_read(bbuf, (size_t)npline, 1, fd_i)) { fprintf(stdout, "*ts, "); b2t(tbuf, bbuf, 188); fprintf(stdout, "%s", tbuf); fprintf(stdout, "*addr, %"PRIX64", \n", pkt_addr); pkt_addr += npline; } url_close(fd_i); return 0; }
void zlst_set_name(void *ZNODE, const char *name) { struct znode *znode; if(!ZNODE) { RPTERR("set name: bad node"); return; } znode = (struct znode *)ZNODE; RPTINF("set name: %s", name); znode->name = name; /* the string should be const */ return; }
void zlst_set_key(void *ZNODE, int key) { struct znode *znode; if(!ZNODE) { RPTERR("set key: bad node"); return; } znode = (struct znode *)ZNODE; RPTINF("set key: %d", key); znode->key = key; return; }
int main(int argc, char *argv[]) { if(0 != deal_with_parameter(argc, argv)) { return -1; } fd_i = fopen(file_i, "rb"); if(NULL == fd_i) { RPTERR("open \"%s\" failed", file_i); return -1; } if(0 != parse_header()) { return -1; } parse_frame(); fclose(fd_i); return 0; }
int main(int argc, char *argv[]) { int cnt; char tbuf[LINE_LENGTH_MAX + 10]; /* txt data buffer */ uint8_t bbuf[LINE_LENGTH_MAX / 3 + 10]; /* bin data buffer */ char *tag; char *pt; if(0 != deal_with_parameter(argc, argv)) { return -1; } fd_o = fopen(file_o, "wb"); if(NULL == fd_o) { RPTERR("open \"%s\" failed", file_o); return -1; } while(NULL != fgets(tbuf, LINE_LENGTH_MAX, stdin)) { pt = tbuf; while(0 == next_tag(&tag, &pt)) { if(0 == strcmp(tag, "*ts") || 0 == strcmp(tag, "*rs") || 0 == strcmp(tag, "*data") || 0 == strcmp(tag, "*pes") || 0 == strcmp(tag, "*es")) { cnt = next_nbyte_hex(bbuf, &pt, LINE_LENGTH_MAX / 3); (void)fwrite(bbuf, (size_t)cnt, 1, fd_o); } } } fclose(fd_o); return 0; }
static int parse_frame() { int line_num; int frame_num; uint16_t EAV; uint16_t SAV; frame_num = 1; line_num = 1; while(1) { int line; /* line head */ line = line_num; if(525 == total_line_cnt) { line += 3; line -= ((line > 525) ? 525 : 0); } if(DAT_DATA == mode_lin) { fprintf(stdout, "%4u, %4u, ", frame_num, line); } /* EAV */ if(0 != get_data(sdi, 4)) { return -1; } if(!((0x3FF == sdi[0]) && (0x000 == sdi[1]) && (0x000 == sdi[2]) && ((1<<6) & sdi[3]))) { /* H == 1 */ RPTERR("bad EAV"); return -1; } EAV = sdi[3]; if(DAT_DATA == mode_eav) { fprintf(stdout, "%03X(%02X), ", EAV, EAV >> 2); } /* h-blank data */ if(0 != get_data(sdi, hbi_cnt_per_line)) { return -1; } if(DAT_DATA == mode_hbk) { show_blk(sdi, hbi_cnt_per_line); } if(DAT_INFO == mode_hbk) { show_anc(sdi, hbi_cnt_per_line); } /* SAV */ if(0 != get_data(sdi, 4)) { return -1; } if(!((0x3FF == sdi[0]) && (0x000 == sdi[1]) && (0x000 == sdi[2]) && !((1<<6) & sdi[3]))) { /* H == 0 */ RPTERR("bad SAV"); return -1; } SAV = sdi[3]; if(DAT_DATA == mode_sav) { fprintf(stdout, "%03X(%02X), ", SAV, SAV >> 2); }
static int deal_with_parameter(int argc, char *argv[]) { int i; if(1 == argc) { /* no parameter */ fprintf(stderr, "No binary file to process...\n\n"); show_help(); return -1; } for(i = 1; i < argc; i++) { if('-' == argv[i][0]) { if(0 == strcmp(argv[i], "-h") || 0 == strcmp(argv[i], "--help")) { show_help(); return -1; } else if(0 == strcmp(argv[i], "-v") || 0 == strcmp(argv[i], "--version")) { show_version(); return -1; } else if(0 == strcmp(argv[i], "-i") || 0 == strcmp(argv[i], "--inf")) { mode_inf = DAT_INFO; } else if(0 == strcmp(argv[i], "--lin")) { mode_lin = DAT_DATA; } else if(0 == strcmp(argv[i], "--eav")) { mode_eav = DAT_DATA; } else if(0 == strcmp(argv[i], "--sav")) { mode_sav = DAT_DATA; } else if(0 == strcmp(argv[i], "--hbd")) { mode_hbk = DAT_DATA; } else if(0 == strcmp(argv[i], "--hbi")) { mode_hbk = DAT_INFO; } else if(0 == strcmp(argv[i], "--vbd")) { mode_vbk = DAT_DATA; } else if(0 == strcmp(argv[i], "--vbi")) { mode_vbk = DAT_INFO; } else if(0 == strcmp(argv[i], "-a") || 0 == strcmp(argv[i], "--act")) { mode_act = DAT_DATA; } else if(0 == strcmp(argv[i], "-8")) { is_8_bit = 1; } else if(0 == strcmp(argv[i], "-d")) { is_dec = 1; } else { RPTERR("Wrong parameter: %s", argv[i]); return -1; } } else { strcpy(file_i, argv[i]); } } return 0; }