// XXX: temporary files are R_API int r_diff_buffers_unified(RDiff *d, const ut8 *a, int la, const ut8 *b, int lb) { if (r_mem_is_printable (a, R_MIN (5, la))) { r_file_dump (".a", a, la, 0); r_file_dump (".b", b, lb, 0); } else { r_file_hexdump (".a", a, la, 0); r_file_hexdump (".b", b, lb, 0); } r_sys_cmd ("diff -ru .a .b"); r_file_rm (".a"); r_file_rm (".b"); return 0; }
// XXX: temporary files are R_API char *r_diff_buffers_unified(RDiff *d, const ut8 *a, int la, const ut8 *b, int lb) { r_file_dump (".a", a, la, 0); r_file_dump (".b", b, lb, 0); #if 0 if (r_mem_is_printable (a, R_MIN (5, la))) { r_file_dump (".a", a, la, 0); r_file_dump (".b", b, lb, 0); } else { r_file_hexdump (".a", a, la, 0); r_file_hexdump (".b", b, lb, 0); } #endif char* err = NULL; char* out = NULL; int out_len; (void)r_sys_cmd_str_full ("/usr/bin/diff -u .a .b", NULL, &out, &out_len, &err); r_file_rm (".a"); r_file_rm (".b"); free (err); return out; }
static int cb(RDiff *d, void *user, RDiffOp *op) { int i; //, diffmode = (int)(size_t)user; char s[256]; if (showcount) { count++; return 1; } switch (diffmode) { case 'U': // 'U' in theory never handled here case 'u': if (op->a_len > 0) { readstr (s, sizeof (s), op->a_buf, op->a_len); if (*s) { if (!quiet) printf (Color_RED); if (r_mem_is_printable ((const ut8*)s, R_MIN (strlen (s), 5))) { printf ("- %s\n", s); } else { printf ("-:"); int len = op->a_len; //R_MIN (op->a_len, strlen (op->a_buf)); for (i = 0; i < len; i++) { printf ("%02x", op->a_buf[i]); } printf (" \"%s\"\n", op->a_buf); } if (!quiet) printf (Color_RESET); } } if (op->b_len > 0) { readstr (s, sizeof (s), op->b_buf, op->b_len); if (*s) { if (!quiet) printf (Color_GREEN); if (r_mem_is_printable ((const ut8*)s, R_MIN (strlen (s), 5))) { printf ("+ %s\n", s); } else { printf ("+:"); for (i = 0; i < op->b_len; i++) { printf ("%02x", op->b_buf[i]); } printf (" \"%s\"\n", op->b_buf); } if (!quiet) printf (Color_RESET); } } break; case 'r': if (disasm) { eprintf ("r2cmds (-r) + disasm (-D) not yet implemented\n"); } if (op->a_len == op->b_len) { printf ("wx "); for (i = 0; i < op->b_len; i++) { printf ("%02x", op->b_buf[i]); } printf (" @ 0x%08"PFMT64x"\n", op->b_off); } else { if (op->a_len > 0) { printf ("r-%d @ 0x%08"PFMT64x"\n", op->a_len, op->a_off + delta); } if (op->b_len > 0) { printf ("r+%d @ 0x%08"PFMT64x"\n", op->b_len, op->b_off + delta); printf ("wx "); for (i = 0; i < op->b_len; i++) { printf ("%02x", op->b_buf[i]); } printf (" @ 0x%08"PFMT64x"\n", op->b_off+delta); } delta += (op->b_off - op->a_off); } return 1; case 'j': if (disasm) { eprintf ("JSON (-j) + disasm (-D) not yet implemented\n"); } if (json_started) { printf (",\n"); } json_started = 1; printf ("{\"offset\":%"PFMT64d",", op->a_off); printf("\"from\":\""); for (i = 0; i < op->a_len; i++) { printf ("%02x", op->a_buf[i]); } printf ("\", \"to\":\""); for (i = 0; i < op->b_len; i++) { printf ("%02x", op->b_buf[i]); } printf ("\"}"); //,\n"); return 1; case 0: default: if (disasm) { printf ("--- 0x%08"PFMT64x"\n", op->a_off); if (!core) { core = opencore (file); if (arch) { r_config_set (core->config, "asm.arch", arch); } if (bits) { r_config_set_i (core->config, "asm.bits", bits); } } if (core) { RAsmCode *ac = r_asm_mdisassemble (core->assembler, op->a_buf, op->a_len); printf ("%s\n", ac->buf_asm); //r_asm_code_free (ac); } } else { printf ("0x%08"PFMT64x" ", op->a_off); for (i = 0; i < op->a_len; i++) { printf ("%02x", op->a_buf[i]); } } if (disasm) { printf ("+++ 0x%08"PFMT64x"\n", op->b_off); if (!core) { core = opencore (NULL); } if (core) { RAsmCode *ac = r_asm_mdisassemble (core->assembler, op->b_buf, op->b_len); printf ("%s\n", ac->buf_asm); //r_asm_code_free (ac); } } else { printf (" => "); for (i = 0; i < op->b_len; i++) { printf ("%02x", op->b_buf[i]); } printf (" 0x%08"PFMT64x"\n", op->b_off); } return 1; } return 0; }