// Returns 0 if we should stop reading the file. static int do_record(deark *c, lctx *d, de_int64 pos, de_int64 *bytesused) { int retval = 0; struct opcode_data op; de_int64 ptsin_size_bytes; de_int64 intin_size_bytes; de_int64 data_size_bytes; const struct opcode_info *opinfo; const char *opcode_name; *bytesused = 0; de_memset(&op, 0, sizeof(struct opcode_data)); de_dbg(c, "record at %d\n", (int)pos); de_dbg_indent(c, 1); op.opcode = de_getui16le(pos); op.ptsin_count = de_getui16le(pos+2); op.intin_count = de_getui16le(pos+4); op.func_id = de_getui16le(pos+6); ptsin_size_bytes = 4*op.ptsin_count; intin_size_bytes = 2*op.intin_count; data_size_bytes = ptsin_size_bytes + intin_size_bytes; op.ptsin_pos = pos + 8; op.intin_pos = pos + 8 + ptsin_size_bytes; opinfo = find_opcode_info(op.opcode); if(opinfo && opinfo->name) opcode_name = opinfo->name; else opcode_name = "?"; de_dbg(c, "opcode=%d (%s), func_id=%d, #pts=%d, #int=%d (dlen=%d)\n", (int)op.opcode, opcode_name, (int)op.func_id, (int)op.ptsin_count, (int)op.intin_count, (int)data_size_bytes); *bytesused = 8 + data_size_bytes; if(opinfo && opinfo->fn) { opinfo->fn(c, d, &op); } if(op.opcode==65535) { goto done; } retval = 1; done: de_dbg_indent(c, -1); return retval; }
void dbuf_write_run(dbuf *f, u8 n, i64 len) { u8 buf[1024]; i64 amt_left; i64 amt_to_write; de_memset(buf, n, (size_t)len<sizeof(buf) ? (size_t)len : sizeof(buf)); amt_left = len; while(amt_left > 0) { if((size_t)amt_left<sizeof(buf)) amt_to_write = amt_left; else amt_to_write = sizeof(buf); dbuf_write(f, buf, amt_to_write); amt_left -= amt_to_write; } }
// Caller supplies dsi. This function will set its fields. static int lookup_ds_info(de_byte recnum, de_byte dsnum, struct ds_info *dsi) { size_t i; de_memset(dsi, 0, sizeof(struct ds_info)); for(i=0; i<DE_ITEMS_IN_ARRAY(ds_info_arr); i++) { if(ds_info_arr[i].recnum==recnum && ds_info_arr[i].dsnum==dsnum) { *dsi = ds_info_arr[i]; // struct copy return 1; } } // Not found dsi->recnum = recnum; dsi->dsnum = dsnum; dsi->dsname = "?"; return 0; }