NAME=rz-diff empty first file
FILE==
CMDS=!rz-diff -C -t bytes "" bins/other/rz-diff/rz-diff_c_2
EXPECT_ERR=<<EOF
ERROR: rz-diff: error, cannot open a file without a name.
EOF
RUN

NAME=rz-diff empty second file
FILE==
CMDS=!rz-diff -C -t bytes bins/other/rz-diff/rz-diff_c_1 ""
EXPECT_ERR=<<EOF
ERROR: rz-diff: error, cannot open a file without a name.
EOF
RUN

NAME=rz-diff -v~commit?"
FILE==
CMDS=!!rz-diff -C -v~commit?
EXPECT=<<EOF
1
EOF
RUN

NAME=rz-diff -h~Usage?"
FILE==
CMDS=!!rz-diff -C -h~Usage?
EXPECT=<<EOF
1
EOF
RUN


NAME=rz-diff distance comparison (leven)
FILE==
CMDS=!rz-diff -C -d leven bins/java/Main.java.1.7.class bins/java/Main.java.15.class
EXPECT=<<EOF
similarity: 0.637
distance: 529
EOF
RUN

NAME=rz-diff distance comparison (leven) JSON
FILE==
CMDS=!rz-diff -C -jd leven bins/java/Main.java.1.7.class bins/java/Main.java.15.class
EXPECT=<<EOF
{"similarity":0.636676,"distance":529}
EOF
RUN

NAME=rz-diff distance comparison (leven) QUIET
FILE==
CMDS=!rz-diff -C -qd leven bins/java/Main.java.1.7.class bins/java/Main.java.15.class
EXPECT=<<EOF
0.637
529
EOF
RUN


NAME=rz-diff distance comparison (myers)
FILE==
CMDS=!rz-diff -C -d myers bins/java/Main.java.1.7.class bins/java/Main.java.15.class
EXPECT=<<EOF
similarity: 0.769
distance: 602
EOF
RUN

NAME=rz-diff distance comparison (myers) JSON
FILE==
CMDS=!rz-diff -C -jd myers bins/java/Main.java.1.7.class bins/java/Main.java.15.class
EXPECT=<<EOF
{"similarity":0.768995,"distance":602}
EOF
RUN

NAME=rz-diff distance comparison (myers) QUIET
FILE==
CMDS=!rz-diff -C -qd myers bins/java/Main.java.1.7.class bins/java/Main.java.15.class
EXPECT=<<EOF
0.769
602
EOF
RUN


NAME=rz-diff bytes comparison
FILE==
CMDS=!rz-diff -C -t bytes bins/other/rz-diff/rz-diff_c_1 bins/other/rz-diff/rz-diff_c_2
EXPECT=<<EOF
--- bins/other/rz-diff/rz-diff_c_1
+++ bins/other/rz-diff/rz-diff_c_2
@@ -1,1 +1,1 @@
-91
+90

EOF
RUN

NAME=rz-diff bytes comparison JSON
FILE==
CMDS=!rz-diff -C -jt bytes bins/other/rz-diff/rz-diff_c_1 bins/other/rz-diff/rz-diff_c_2
EXPECT=<<EOF
{"from":"bins/other/rz-diff/rz-diff_c_1","to":"bins/other/rz-diff/rz-diff_c_2","diff":[{"from":[1,1],"to":[1,1],"ops":[{"op":"delete","value":"91"},{"op":"insert","value":"90"}]}]}
EOF
RUN


NAME=rz-diff strings comparison
FILE==
CMDS=!rz-diff -C -t strings bins/elf/elf_one_symbol_shdr bins/elf/elf_one_symbol_shdr1
EXPECT=<<EOF
--- bins/elf/elf_one_symbol_shdr
+++ bins/elf/elf_one_symbol_shdr1
@@ -1,1 +1,1 @@
-Hello world!
+AAAAo world!

EOF
RUN

NAME=rz-diff strings comparison JSON
FILE==
CMDS=!rz-diff -C -jt strings bins/elf/elf_one_symbol_shdr bins/elf/elf_one_symbol_shdr1
EXPECT=<<EOF
{"from":"bins/elf/elf_one_symbol_shdr","to":"bins/elf/elf_one_symbol_shdr1","diff":[{"from":[1,1],"to":[1,1],"ops":[{"op":"delete","value":"Hello world!\n"},{"op":"insert","value":"AAAAo world!\n"}]}]}
EOF
RUN

NAME=rz-diff strings comparison with addresses
FILE==
CMDS=!rz-diff -C -At strings bins/elf/elf_one_symbol_shdr bins/elf/elf_one_symbol_shdr1
EXPECT=<<EOF
--- bins/elf/elf_one_symbol_shdr
+++ bins/elf/elf_one_symbol_shdr1
@@ -1,1 +1,1 @@
-virt: 0x00000000080484b0 phys: 0x00000000000004b0 Hello world!
+virt: 0x00000000080484b0 phys: 0x00000000000004b0 AAAAo world!

EOF
RUN

NAME=rz-diff strings comparison with addresses JSON
FILE==
CMDS=!rz-diff -C -Ajt strings bins/elf/elf_one_symbol_shdr bins/elf/elf_one_symbol_shdr1
EXPECT=<<EOF
{"from":"bins/elf/elf_one_symbol_shdr","to":"bins/elf/elf_one_symbol_shdr1","diff":[{"from":[1,1],"to":[1,1],"ops":[{"op":"delete","value":"virt: 0x00000000080484b0 phys: 0x00000000000004b0 Hello world!\n"},{"op":"insert","value":"virt: 0x00000000080484b0 phys: 0x00000000000004b0 AAAAo world!\n"}]}]}
EOF
RUN


NAME=rz-diff functions comparison
FILE==
CMDS=!rz-diff -C -t functions bins/other/rz-diff/true bins/other/rz-diff/false
EXPECT=<<EOF
                  fcn.00401050   26 0x0000000000401050 | MATCH   (1.000000) | 0x0000000000401050    26 fcn.00401050
               sym.imp.__uflow    6 0x0000000000401080 | MATCH   (1.000000) | 0x0000000000401080     6 sym.imp.__uflow
                sym.imp.getenv    6 0x0000000000401090 | MATCH   (1.000000) | 0x0000000000401090     6 sym.imp.getenv
                  sym.imp.free    6 0x00000000004010a0 | MATCH   (1.000000) | 0x00000000004010a0     6 sym.imp.free
                 sym.imp.abort    6 0x00000000004010b0 | MATCH   (1.000000) | 0x00000000004010b0     6 sym.imp.abort
      sym.imp.__errno_location    6 0x00000000004010c0 | MATCH   (1.000000) | 0x00000000004010c0     6 sym.imp.__errno_location
               sym.imp.strncmp    6 0x00000000004010d0 | MATCH   (1.000000) | 0x00000000004010d0     6 sym.imp.strncmp
                 sym.imp._exit    6 0x00000000004010e0 | MATCH   (1.000000) | 0x00000000004010e0     6 sym.imp._exit
                sym.imp.strcpy    6 0x00000000004010f0 | MATCH   (1.000000) | 0x00000000004010f0     6 sym.imp.strcpy
            sym.imp.__fpending    6 0x0000000000401100 | MATCH   (1.000000) | 0x0000000000401100     6 sym.imp.__fpending
            sym.imp.textdomain    6 0x0000000000401110 | MATCH   (1.000000) | 0x0000000000401110     6 sym.imp.textdomain
                sym.imp.fclose    6 0x0000000000401120 | MATCH   (1.000000) | 0x0000000000401120     6 sym.imp.fclose
        sym.imp.bindtextdomain    6 0x0000000000401130 | MATCH   (1.000000) | 0x0000000000401130     6 sym.imp.bindtextdomain
             sym.imp.dcgettext    6 0x0000000000401140 | MATCH   (1.000000) | 0x0000000000401140     6 sym.imp.dcgettext
sym.imp.__ctype_get_mb_cur_max    6 0x0000000000401150 | MATCH   (1.000000) | 0x0000000000401150     6 sym.imp.__ctype_get_mb_cur_max
                sym.imp.strlen    6 0x0000000000401160 | MATCH   (1.000000) | 0x0000000000401160     6 sym.imp.strlen
      sym.imp.__stack_chk_fail    6 0x0000000000401170 | MATCH   (1.000000) | 0x0000000000401170     6 sym.imp.__stack_chk_fail
               sym.imp.strrchr    6 0x0000000000401190 | MATCH   (1.000000) | 0x0000000000401190     6 sym.imp.strrchr
                 sym.imp.lseek    6 0x00000000004011a0 | MATCH   (1.000000) | 0x00000000004011a0     6 sym.imp.lseek
                sym.imp.memset    6 0x00000000004011b0 | MATCH   (1.000000) | 0x00000000004011b0     6 sym.imp.memset
                sym.imp.fscanf    6 0x00000000004011c0 | MATCH   (1.000000) | 0x00000000004011c0     6 sym.imp.fscanf
                 sym.imp.close    6 0x00000000004011d0 | MATCH   (1.000000) | 0x00000000004011d0     6 sym.imp.close
     sym.imp.__libc_start_main    6 0x00000000004011e0 | MATCH   (1.000000) | 0x00000000004011e0     6 sym.imp.__libc_start_main
                sym.imp.memcmp    6 0x00000000004011f0 | MATCH   (1.000000) | 0x00000000004011f0     6 sym.imp.memcmp
        sym.imp.fputs_unlocked    6 0x0000000000401200 | MATCH   (1.000000) | 0x0000000000401200     6 sym.imp.fputs_unlocked
                sym.imp.calloc    6 0x0000000000401210 | MATCH   (1.000000) | 0x0000000000401210     6 sym.imp.calloc
                sym.imp.strcmp    6 0x0000000000401220 | MATCH   (1.000000) | 0x0000000000401220     6 sym.imp.strcmp
          loc.imp.__gmon_start    6 0x0000000000401230 | MATCH   (1.000000) | 0x0000000000401230     6 loc.imp.__gmon_start
                sym.imp.memcpy    6 0x0000000000401240 | MATCH   (1.000000) | 0x0000000000401240     6 sym.imp.memcpy
                sym.imp.fileno    6 0x0000000000401250 | MATCH   (1.000000) | 0x0000000000401250     6 sym.imp.fileno
                sym.imp.malloc    6 0x0000000000401260 | MATCH   (1.000000) | 0x0000000000401260     6 sym.imp.malloc
           sym.imp.nl_langinfo    6 0x0000000000401280 | MATCH   (1.000000) | 0x0000000000401280     6 sym.imp.nl_langinfo
                sym.imp.ungetc    6 0x0000000000401290 | MATCH   (1.000000) | 0x0000000000401290     6 sym.imp.ungetc
            sym.imp.__freading    6 0x00000000004012a0 | MATCH   (1.000000) | 0x00000000004012a0     6 sym.imp.__freading
               sym.imp.realloc    6 0x00000000004012b0 | MATCH   (1.000000) | 0x00000000004012b0     6 sym.imp.realloc
                sym.imp.fdopen    6 0x00000000004012c0 | MATCH   (1.000000) | 0x00000000004012c0     6 sym.imp.fdopen
             sym.imp.setlocale    6 0x00000000004012d0 | MATCH   (1.000000) | 0x00000000004012d0     6 sym.imp.setlocale
          sym.imp.__printf_chk    6 0x00000000004012e0 | MATCH   (1.000000) | 0x00000000004012e0     6 sym.imp.__printf_chk
                 sym.imp.error    6 0x00000000004012f0 | MATCH   (1.000000) | 0x00000000004012f0     6 sym.imp.error
                  sym.imp.open    6 0x0000000000401300 | MATCH   (1.000000) | 0x0000000000401300     6 sym.imp.open
                  sym.imp.exit    6 0x0000000000401330 | MATCH   (1.000000) | 0x0000000000401330     6 sym.imp.exit
                sym.imp.fwrite    6 0x0000000000401340 | MATCH   (1.000000) | 0x0000000000401340     6 sym.imp.fwrite
         sym.imp.__fprintf_chk    6 0x0000000000401350 | MATCH   (1.000000) | 0x0000000000401350     6 sym.imp.__fprintf_chk
               sym.imp.mbsinit    6 0x0000000000401360 | MATCH   (1.000000) | 0x0000000000401360     6 sym.imp.mbsinit
              sym.imp.iswprint    6 0x0000000000401370 | MATCH   (1.000000) | 0x0000000000401370     6 sym.imp.iswprint
         sym.imp.__ctype_b_loc    6 0x0000000000401380 | MATCH   (1.000000) | 0x0000000000401380     6 sym.imp.__ctype_b_loc
                  fcn.00401460   41 0x0000000000401460 | MATCH   (1.000000) | 0x0000000000401470    41 fcn.00401470
                  fcn.00401530  745 0x0000000000401530 | SIMILAR (0.879195) | 0x0000000000401540   745 fcn.00401540
                  fcn.004018f0  147 0x00000000004018f0 | SIMILAR (0.931973) | 0x0000000000401900   147 fcn.00401900
                  fcn.00401990  137 0x0000000000401990 | SIMILAR (0.985401) | 0x00000000004019a0   137 fcn.004019a0
                  fcn.00401a20  162 0x0000000000401a20 | MATCH   (1.000000) | 0x0000000000401a30   162 fcn.00401a30
                  fcn.00401ae0  228 0x0000000000401ae0 | SIMILAR (0.964912) | 0x0000000000401af0   228 fcn.00401af0
                  fcn.00401be0 2728 0x0000000000401be0 | SIMILAR (0.991569) | 0x0000000000401bf0  2728 fcn.00401bf0
                  fcn.00402730  425 0x0000000000402730 | SIMILAR (0.971765) | 0x0000000000402740   425 fcn.00402740
                  fcn.004029a0   50 0x00000000004029a0 | SIMILAR (0.980000) | 0x00000000004029b0    50 fcn.004029b0
                  fcn.00402e20  204 0x0000000000402e20 | SIMILAR (0.960784) | 0x0000000000402e30   204 fcn.00402e30
                  fcn.00402fc0  944 0x0000000000402fc0 | SIMILAR (0.952331) | 0x0000000000402fd0   944 fcn.00402fd0
                  fcn.004033d0  131 0x00000000004033d0 | SIMILAR (0.992366) | 0x00000000004033e0   131 fcn.004033e0
                  fcn.00403460  167 0x0000000000403460 | SIMILAR (0.994012) | 0x0000000000403470   167 fcn.00403470
                  fcn.00403590   26 0x0000000000403590 | SIMILAR (0.961538) | 0x00000000004035a0    26 fcn.004035a0
                  fcn.004035e0   48 0x00000000004035e0 | SIMILAR (0.958333) | 0x00000000004035f0    48 fcn.004035f0
                  fcn.00403750   40 0x0000000000403750 | SIMILAR (0.975000) | 0x0000000000403760    40 fcn.00403760
                  fcn.004037a0   49 0x00000000004037a0 | SIMILAR (0.857143) | 0x00000000004037b0    49 fcn.004037b0
                  fcn.004037e0   35 0x00000000004037e0 | SIMILAR (0.914286) | 0x00000000004037f0    35 fcn.004037f0
                  fcn.00403810   67 0x0000000000403810 | MATCH   (1.000000) | 0x0000000000403820    67 fcn.00403820
                  fcn.00403860  108 0x0000000000403860 | SIMILAR (0.972222) | 0x0000000000403870   108 fcn.00403870
                  fcn.004038e0 1015 0x00000000004038e0 | SIMILAR (0.958621) | 0x00000000004038f0  1015 fcn.004038f0
                  fcn.00403cf0  118 0x0000000000403cf0 | SIMILAR (0.932203) | 0x0000000000403d00   118 fcn.00403d00
                  fcn.00403d70   59 0x0000000000403d70 | SIMILAR (0.949153) | 0x0000000000403d80    59 fcn.00403d80
                  fcn.00403db0   86 0x0000000000403db0 | SIMILAR (0.965116) | 0x0000000000403dc0    86 fcn.00403dc0
                  fcn.00403e90   26 0x0000000000403e90 | SIMILAR (0.923077) | 0x0000000000403ea0    26 fcn.00403ea0
EOF
RUN

NAME=rz-diff functions comparison JSON
FILE==
CMDS=!rz-diff -C -jt functions bins/other/rz-diff/true bins/other/rz-diff/false
EXPECT=<<EOF
[{"distance":1.000000,"type":"MATCH","original":{"name":"fcn.00401050","addr":4198480,"size":26},"modified":{"name":"fcn.00401050","addr":4198480,"size":26}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.__uflow","addr":4198528,"size":6},"modified":{"name":"sym.imp.__uflow","addr":4198528,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.getenv","addr":4198544,"size":6},"modified":{"name":"sym.imp.getenv","addr":4198544,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.free","addr":4198560,"size":6},"modified":{"name":"sym.imp.free","addr":4198560,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.abort","addr":4198576,"size":6},"modified":{"name":"sym.imp.abort","addr":4198576,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.__errno_location","addr":4198592,"size":6},"modified":{"name":"sym.imp.__errno_location","addr":4198592,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.strncmp","addr":4198608,"size":6},"modified":{"name":"sym.imp.strncmp","addr":4198608,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp._exit","addr":4198624,"size":6},"modified":{"name":"sym.imp._exit","addr":4198624,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.strcpy","addr":4198640,"size":6},"modified":{"name":"sym.imp.strcpy","addr":4198640,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.__fpending","addr":4198656,"size":6},"modified":{"name":"sym.imp.__fpending","addr":4198656,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.textdomain","addr":4198672,"size":6},"modified":{"name":"sym.imp.textdomain","addr":4198672,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.fclose","addr":4198688,"size":6},"modified":{"name":"sym.imp.fclose","addr":4198688,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.bindtextdomain","addr":4198704,"size":6},"modified":{"name":"sym.imp.bindtextdomain","addr":4198704,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.dcgettext","addr":4198720,"size":6},"modified":{"name":"sym.imp.dcgettext","addr":4198720,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.__ctype_get_mb_cur_max","addr":4198736,"size":6},"modified":{"name":"sym.imp.__ctype_get_mb_cur_max","addr":4198736,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.strlen","addr":4198752,"size":6},"modified":{"name":"sym.imp.strlen","addr":4198752,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.__stack_chk_fail","addr":4198768,"size":6},"modified":{"name":"sym.imp.__stack_chk_fail","addr":4198768,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.strrchr","addr":4198800,"size":6},"modified":{"name":"sym.imp.strrchr","addr":4198800,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.lseek","addr":4198816,"size":6},"modified":{"name":"sym.imp.lseek","addr":4198816,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.memset","addr":4198832,"size":6},"modified":{"name":"sym.imp.memset","addr":4198832,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.fscanf","addr":4198848,"size":6},"modified":{"name":"sym.imp.fscanf","addr":4198848,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.close","addr":4198864,"size":6},"modified":{"name":"sym.imp.close","addr":4198864,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.__libc_start_main","addr":4198880,"size":6},"modified":{"name":"sym.imp.__libc_start_main","addr":4198880,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.memcmp","addr":4198896,"size":6},"modified":{"name":"sym.imp.memcmp","addr":4198896,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.fputs_unlocked","addr":4198912,"size":6},"modified":{"name":"sym.imp.fputs_unlocked","addr":4198912,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.calloc","addr":4198928,"size":6},"modified":{"name":"sym.imp.calloc","addr":4198928,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.strcmp","addr":4198944,"size":6},"modified":{"name":"sym.imp.strcmp","addr":4198944,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"loc.imp.__gmon_start","addr":4198960,"size":6},"modified":{"name":"loc.imp.__gmon_start","addr":4198960,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.memcpy","addr":4198976,"size":6},"modified":{"name":"sym.imp.memcpy","addr":4198976,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.fileno","addr":4198992,"size":6},"modified":{"name":"sym.imp.fileno","addr":4198992,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.malloc","addr":4199008,"size":6},"modified":{"name":"sym.imp.malloc","addr":4199008,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.nl_langinfo","addr":4199040,"size":6},"modified":{"name":"sym.imp.nl_langinfo","addr":4199040,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.ungetc","addr":4199056,"size":6},"modified":{"name":"sym.imp.ungetc","addr":4199056,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.__freading","addr":4199072,"size":6},"modified":{"name":"sym.imp.__freading","addr":4199072,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.realloc","addr":4199088,"size":6},"modified":{"name":"sym.imp.realloc","addr":4199088,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.fdopen","addr":4199104,"size":6},"modified":{"name":"sym.imp.fdopen","addr":4199104,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.setlocale","addr":4199120,"size":6},"modified":{"name":"sym.imp.setlocale","addr":4199120,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.__printf_chk","addr":4199136,"size":6},"modified":{"name":"sym.imp.__printf_chk","addr":4199136,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.error","addr":4199152,"size":6},"modified":{"name":"sym.imp.error","addr":4199152,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.open","addr":4199168,"size":6},"modified":{"name":"sym.imp.open","addr":4199168,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.exit","addr":4199216,"size":6},"modified":{"name":"sym.imp.exit","addr":4199216,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.fwrite","addr":4199232,"size":6},"modified":{"name":"sym.imp.fwrite","addr":4199232,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.__fprintf_chk","addr":4199248,"size":6},"modified":{"name":"sym.imp.__fprintf_chk","addr":4199248,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.mbsinit","addr":4199264,"size":6},"modified":{"name":"sym.imp.mbsinit","addr":4199264,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.iswprint","addr":4199280,"size":6},"modified":{"name":"sym.imp.iswprint","addr":4199280,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"sym.imp.__ctype_b_loc","addr":4199296,"size":6},"modified":{"name":"sym.imp.__ctype_b_loc","addr":4199296,"size":6}},{"distance":1.000000,"type":"MATCH","original":{"name":"fcn.00401460","addr":4199520,"size":41},"modified":{"name":"fcn.00401470","addr":4199536,"size":41}},{"distance":0.879195,"type":"SIMILAR","original":{"name":"fcn.00401530","addr":4199728,"size":745},"modified":{"name":"fcn.00401540","addr":4199744,"size":745}},{"distance":0.931973,"type":"SIMILAR","original":{"name":"fcn.004018f0","addr":4200688,"size":147},"modified":{"name":"fcn.00401900","addr":4200704,"size":147}},{"distance":0.985401,"type":"SIMILAR","original":{"name":"fcn.00401990","addr":4200848,"size":137},"modified":{"name":"fcn.004019a0","addr":4200864,"size":137}},{"distance":1.000000,"type":"MATCH","original":{"name":"fcn.00401a20","addr":4200992,"size":162},"modified":{"name":"fcn.00401a30","addr":4201008,"size":162}},{"distance":0.964912,"type":"SIMILAR","original":{"name":"fcn.00401ae0","addr":4201184,"size":228},"modified":{"name":"fcn.00401af0","addr":4201200,"size":228}},{"distance":0.991569,"type":"SIMILAR","original":{"name":"fcn.00401be0","addr":4201440,"size":2728},"modified":{"name":"fcn.00401bf0","addr":4201456,"size":2728}},{"distance":0.971765,"type":"SIMILAR","original":{"name":"fcn.00402730","addr":4204336,"size":425},"modified":{"name":"fcn.00402740","addr":4204352,"size":425}},{"distance":0.980000,"type":"SIMILAR","original":{"name":"fcn.004029a0","addr":4204960,"size":50},"modified":{"name":"fcn.004029b0","addr":4204976,"size":50}},{"distance":0.960784,"type":"SIMILAR","original":{"name":"fcn.00402e20","addr":4206112,"size":204},"modified":{"name":"fcn.00402e30","addr":4206128,"size":204}},{"distance":0.952331,"type":"SIMILAR","original":{"name":"fcn.00402fc0","addr":4206528,"size":944},"modified":{"name":"fcn.00402fd0","addr":4206544,"size":944}},{"distance":0.992366,"type":"SIMILAR","original":{"name":"fcn.004033d0","addr":4207568,"size":131},"modified":{"name":"fcn.004033e0","addr":4207584,"size":131}},{"distance":0.994012,"type":"SIMILAR","original":{"name":"fcn.00403460","addr":4207712,"size":167},"modified":{"name":"fcn.00403470","addr":4207728,"size":167}},{"distance":0.961538,"type":"SIMILAR","original":{"name":"fcn.00403590","addr":4208016,"size":26},"modified":{"name":"fcn.004035a0","addr":4208032,"size":26}},{"distance":0.958333,"type":"SIMILAR","original":{"name":"fcn.004035e0","addr":4208096,"size":48},"modified":{"name":"fcn.004035f0","addr":4208112,"size":48}},{"distance":0.975000,"type":"SIMILAR","original":{"name":"fcn.00403750","addr":4208464,"size":40},"modified":{"name":"fcn.00403760","addr":4208480,"size":40}},{"distance":0.857143,"type":"SIMILAR","original":{"name":"fcn.004037a0","addr":4208544,"size":49},"modified":{"name":"fcn.004037b0","addr":4208560,"size":49}},{"distance":0.914286,"type":"SIMILAR","original":{"name":"fcn.004037e0","addr":4208608,"size":35},"modified":{"name":"fcn.004037f0","addr":4208624,"size":35}},{"distance":1.000000,"type":"MATCH","original":{"name":"fcn.00403810","addr":4208656,"size":67},"modified":{"name":"fcn.00403820","addr":4208672,"size":67}},{"distance":0.972222,"type":"SIMILAR","original":{"name":"fcn.00403860","addr":4208736,"size":108},"modified":{"name":"fcn.00403870","addr":4208752,"size":108}},{"distance":0.958621,"type":"SIMILAR","original":{"name":"fcn.004038e0","addr":4208864,"size":1015},"modified":{"name":"fcn.004038f0","addr":4208880,"size":1015}},{"distance":0.932203,"type":"SIMILAR","original":{"name":"fcn.00403cf0","addr":4209904,"size":118},"modified":{"name":"fcn.00403d00","addr":4209920,"size":118}},{"distance":0.949153,"type":"SIMILAR","original":{"name":"fcn.00403d70","addr":4210032,"size":59},"modified":{"name":"fcn.00403d80","addr":4210048,"size":59}},{"distance":0.965116,"type":"SIMILAR","original":{"name":"fcn.00403db0","addr":4210096,"size":86},"modified":{"name":"fcn.00403dc0","addr":4210112,"size":86}},{"distance":0.923077,"type":"SIMILAR","original":{"name":"fcn.00403e90","addr":4210320,"size":26},"modified":{"name":"fcn.00403ea0","addr":4210336,"size":26}}]
EOF
RUN

NAME=rz-diff graphs comparison with addresses
FILE==
CMDS=!rz-diff -C -t graphs -0 0x401ae0 -1 0x401af0 bins/other/rz-diff/true bins/other/rz-diff/false
EXPECT=<<EOF
digraph code {
	graph [bgcolor=azure fontsize=8 fontname="Courier" splines="ortho"];
	node [fillcolor=gray style=filled shape=box];
	edge [arrowhead="normal"];
	"0x00401ae0" [fillcolor="yellow",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ -1,4 +1,4 @@\l-fcn.00401ae0 (int64_t arg1, int64_t arg2);\l+fcn.00401af0 (int64_t arg1, int64_t arg2);\l      ; arg int64_t arg1 @ rdi\l      ; arg int64_t arg2 @ rsi\l      push  r12\l@@ -12,4 +12,4 @@\l      call  sym.imp.dcgettext\l      cmp   rax, rbp\l      mov   rbx, rax\l-     je    0x401b10\l+     je    0x401b20\l", URL="fcn.00401ae0/0x00401ae0"]
	"0x00401b10" [fillcolor="lightgray",color="black", fontname="Courier", label="     call  fcn.004038e0\l     movzx edx, byte [rax]\l     and   edx, 0xffffffdf\l     cmp   dl, 0x55\l     jne   0x401b78\l", URL="fcn.00401ae0/0x00401b10"]
	"0x00401b78" [fillcolor="lightgray",color="black", fontname="Courier", label="     cmp   dl, 0x47\l     jne   0x401b60\l", URL="fcn.00401ae0/0x00401b78"]
	"0x00401b60" [fillcolor="yellow",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ --1,7 +-1,7 @@\l      cmp   r12d, 7\l-     mov   ebx, 0x40424b\l-     mov   eax, 0x40424d\l+     mov   ebx, 0x40428b\l+     mov   eax, 0x40428d\l      cmove rbx, rax\l-     jmp   0x401b01\l+     jmp   0x401b11\l", URL="fcn.00401ae0/0x00401b60"]
	"0x00401b7d" [fillcolor="lightgray",color="black", fontname="Courier", label="     movzx edx, byte [rax + 1]\l     and   edx, 0xffffffdf\l     cmp   dl, 0x42\l     jne   0x401b60\l", URL="fcn.00401ae0/0x00401b7d"]
	"0x00401b89" [fillcolor="lightgray",color="black", fontname="Courier", label="     cmp   byte [rax + 2], 0x31\l     jne   0x401b60\l", URL="fcn.00401ae0/0x00401b89"]
	"0x00401b8f" [fillcolor="lightgray",color="black", fontname="Courier", label="     cmp   byte [rax + 3], 0x38\l     jne   0x401b60\l", URL="fcn.00401ae0/0x00401b8f"]
	"0x00401b95" [fillcolor="lightgray",color="black", fontname="Courier", label="     cmp   byte [rax + 4], 0x30\l     jne   0x401b60\l", URL="fcn.00401ae0/0x00401b95"]
	"0x00401b9b" [fillcolor="lightgray",color="black", fontname="Courier", label="     cmp   byte [rax + 5], 0x33\l     jne   0x401b60\l", URL="fcn.00401ae0/0x00401b9b"]
	"0x00401ba1" [fillcolor="yellow",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ -3,6 +3,6 @@\l      mov   edx, 0x30\l      mov   esi, str.GB18030\l      mov   rdi, rax\l-     call  fcn.00401a20\l+     call  fcn.00401a30\l      test  eax, eax\l-     je    0x401b60\l+     je    0x401b70\l", URL="fcn.00401ae0/0x00401ba1"]
	"0x00401bbc" [fillcolor="yellow",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ --1,7 +-1,7 @@\l      cmp   byte [rbx], 0x60\l-     mov   eax, 0x40424f\l-     mov   ebx, 0x404244\l+     mov   eax, 0x40428f\l+     mov   ebx, 0x404284\l      cmove rbx, rax\l-     jmp   0x401b01\l+     jmp   0x401b11\l", URL="fcn.00401ae0/0x00401bbc"]
	"0x00401b20" [fillcolor="lightgray",color="black", fontname="Courier", label="     movzx edx, byte [rax + 1]\l     and   edx, 0xffffffdf\l     cmp   dl, 0x54\l     jne   0x401b60\l", URL="fcn.00401ae0/0x00401b20"]
	"0x00401b2c" [fillcolor="lightgray",color="black", fontname="Courier", label="     movzx edx, byte [rax + 2]\l     and   edx, 0xffffffdf\l     cmp   dl, 0x46\l     jne   0x401b60\l", URL="fcn.00401ae0/0x00401b2c"]
	"0x00401b38" [fillcolor="lightgray",color="black", fontname="Courier", label="     cmp   byte [rax + 3], 0x2d\l     jne   0x401b60\l", URL="fcn.00401ae0/0x00401b38"]
	"0x00401b3e" [fillcolor="lightgray",color="black", fontname="Courier", label="     cmp   byte [rax + 4], 0x38\l     jne   0x401b60\l", URL="fcn.00401ae0/0x00401b3e"]
	"0x00401b44" [fillcolor="lightgray",color="black", fontname="Courier", label="     cmp   byte [rax + 5], 0\l     jne   0x401b60\l", URL="fcn.00401ae0/0x00401b44"]
	"0x00401b4a" [fillcolor="yellow",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ --1,7 +-1,7 @@\l      cmp   byte [rbx], 0x60\l-     mov   eax, 0x404253\l-     mov   ebx, 0x404247\l+     mov   eax, 0x404293\l+     mov   ebx, 0x404287\l      cmove rbx, rax\l-     jmp   0x401b01\l+     jmp   0x401b11\l", URL="fcn.00401ae0/0x00401b4a"]
	"0x00401b01" [fillcolor="lightgray",color="black", fontname="Courier", label="     mov   rax, rbx\l     pop   rbx\l     pop   rbp\l     pop   r12\l     ret\l", URL="fcn.00401ae0/0x00401b01"]
	"0x00401ae0" -> "0x00401b10" [color="#13a10e"];
	"0x00401ae0" -> "0x00401b01" [color="#c50f1f"];
	"0x00401b10" -> "0x00401b78" [color="#13a10e"];
	"0x00401b10" -> "0x00401b20" [color="#c50f1f"];
	"0x00401b78" -> "0x00401b60" [color="#13a10e"];
	"0x00401b78" -> "0x00401b7d" [color="#c50f1f"];
	"0x00401b60" -> "0x00401b01" [color="#0037da"];
	"0x00401b7d" -> "0x00401b60" [color="#13a10e"];
	"0x00401b7d" -> "0x00401b89" [color="#c50f1f"];
	"0x00401b89" -> "0x00401b60" [color="#13a10e"];
	"0x00401b89" -> "0x00401b8f" [color="#c50f1f"];
	"0x00401b8f" -> "0x00401b60" [color="#13a10e"];
	"0x00401b8f" -> "0x00401b95" [color="#c50f1f"];
	"0x00401b95" -> "0x00401b60" [color="#13a10e"];
	"0x00401b95" -> "0x00401b9b" [color="#c50f1f"];
	"0x00401b9b" -> "0x00401b60" [color="#13a10e"];
	"0x00401b9b" -> "0x00401ba1" [color="#c50f1f"];
	"0x00401ba1" -> "0x00401b60" [color="#13a10e"];
	"0x00401ba1" -> "0x00401bbc" [color="#c50f1f"];
	"0x00401bbc" -> "0x00401b01" [color="#0037da"];
	"0x00401b20" -> "0x00401b60" [color="#13a10e"];
	"0x00401b20" -> "0x00401b2c" [color="#c50f1f"];
	"0x00401b2c" -> "0x00401b60" [color="#13a10e"];
	"0x00401b2c" -> "0x00401b38" [color="#c50f1f"];
	"0x00401b38" -> "0x00401b60" [color="#13a10e"];
	"0x00401b38" -> "0x00401b3e" [color="#c50f1f"];
	"0x00401b3e" -> "0x00401b60" [color="#13a10e"];
	"0x00401b3e" -> "0x00401b44" [color="#c50f1f"];
	"0x00401b44" -> "0x00401b60" [color="#13a10e"];
	"0x00401b44" -> "0x00401b4a" [color="#c50f1f"];
	"0x00401b4a" -> "0x00401b01" [color="#0037da"];
}
EOF
RUN

NAME=rz-diff graphs comparison with addresses JSON
FILE==
CMDS=!rz-diff -e analysis.jmp.cref=true -C -j -t graphs -0 0x401ae0 -1 0x401af0 bins/other/rz-diff/true bins/other/rz-diff/false
EXPECT=<<EOF
[{"name":"fcn.00401ae0","offset":4201184,"ninstr":73,"nargs":2,"nlocals":0,"size":242,"stack":24,"type":"fcn","blocks":[{"offset":4201184,"size":33,"jump":4201232,"fail":4201217,"colorize":0,"ops":[{"offset":4201184,"esil":"r12,8,rsp,-,=[8],8,rsp,-=","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"push r12","disasm":"push r12","bytes":"4154","family":"cpu","type":"rpush","reloc":false,"type_num":268435468,"type2_num":0,"flags":["fcn.00401ae0"]},{"offset":4201186,"esil":"rbp,8,rsp,-,=[8],8,rsp,-=","refptr":false,"fcn_addr":4201184,"fcn_last":4201425,"size":1,"opcode":"push rbp","disasm":"push rbp","bytes":"55","family":"cpu","type":"rpush","reloc":false,"type_num":268435468,"type2_num":0},{"offset":4201187,"esil":"esi,r12,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"mov r12d, esi","disasm":"mov r12d, esi","bytes":"4189f4","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0},{"offset":4201190,"esil":"rbx,8,rsp,-,=[8],8,rsp,-=","refptr":false,"fcn_addr":4201184,"fcn_last":4201425,"size":1,"opcode":"push rbx","disasm":"push rbx","bytes":"53","family":"cpu","type":"rpush","reloc":false,"type_num":268435468,"type2_num":0},{"offset":4201191,"esil":"rdi,rbp,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"mov rbp, rdi","disasm":"mov rbp, rdi","bytes":"4889fd","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0},{"offset":4201194,"esil":"rdi,rsi,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"mov rsi, rdi","disasm":"mov rsi, rdi","bytes":"4889fe","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0},{"offset":4201197,"val":5,"esil":"5,rdx,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201421,"size":5,"opcode":"mov edx, 5","disasm":"mov edx, 5","bytes":"ba05000000","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0},{"offset":4201202,"esil":"edi,rdi,^,0xffffffff,&,rdi,=,$z,zf,:=,$p,pf,:=,31,$s,sf,:=,0,cf,:=,0,of,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"xor edi, edi","disasm":"xor edi, edi","bytes":"31ff","family":"cpu","type":"xor","reloc":false,"type_num":28,"type2_num":0},{"offset":4201204,"esil":"4198720,rip,8,rsp,-=,rsp,=[],rip,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201421,"size":5,"opcode":"call 0x401140","disasm":"call sym.imp.dcgettext","bytes":"e847f6ffff","family":"cpu","type":"call","reloc":false,"type_num":3,"type2_num":0,"jump":4198720,"fail":4201209,"xrefs_from":[{"addr":4198720,"type":"CALL"}]},{"offset":4201209,"esil":"rbp,rax,==,$z,zf,:=,64,$b,cf,:=,$p,pf,:=,63,$s,sf,:=,rbp,0x8000000000000000,-,!,63,$o,^,of,:=,3,$b,af,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"cmp rax, rbp","disasm":"cmp rax, rbp","bytes":"4839e8","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201212,"esil":"rax,rbx,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"mov rbx, rax","disasm":"mov rbx, rax","bytes":"4889c3","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0},{"offset":4201215,"esil":"zf,?{,4201232,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"je 0x401b10","disasm":"je 0x401b10","bytes":"740f","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201232,"fail":4201217,"xrefs_from":[{"addr":4201232,"type":"CODE"}]}]},{"offset":4201232,"size":16,"jump":4201336,"fail":4201248,"colorize":0,"ops":[{"offset":4201232,"esil":"4208864,rip,8,rsp,-=,rsp,=[],rip,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201421,"size":5,"opcode":"call 0x4038e0","disasm":"call fcn.004038e0","bytes":"e8cb1d0000","family":"cpu","type":"call","reloc":false,"type_num":3,"type2_num":0,"jump":4208864,"fail":4201237,"xrefs_from":[{"addr":4208864,"type":"CALL"}],"xrefs_to":[{"addr":4201215,"type":"CODE"}]},{"offset":4201237,"esil":"rax,[1],rdx,=","refptr":true,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"movzx edx, byte [rax]","disasm":"movzx edx, byte [rax]","bytes":"0fb610","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0},{"offset":4201240,"ptr":4294967263,"val":4294967263,"esil":"4294967263,rdx,&,0xffffffff,&,rdx,=,$z,zf,:=,$p,pf,:=,31,$s,sf,:=,0,cf,:=,0,of,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"and edx, 0xffffffdf","disasm":"and edx, 0xffffffdf","bytes":"83e2df","family":"cpu","type":"and","reloc":false,"type_num":27,"type2_num":0},{"offset":4201243,"ptr":85,"val":85,"esil":"85,dl,==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,85,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"cmp dl, 0x55","disasm":"cmp dl, 0x55","bytes":"80fa55","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201246,"esil":"zf,!,?{,4201336,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jne 0x401b78","disasm":"jne 0x401b78","bytes":"7558","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201336,"fail":4201248,"xrefs_from":[{"addr":4201336,"type":"CODE"}]}]},{"offset":4201336,"size":5,"jump":4201312,"fail":4201341,"colorize":0,"ops":[{"offset":4201336,"ptr":71,"val":71,"esil":"71,dl,==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,71,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"cmp dl, 0x47","disasm":"cmp dl, 0x47","bytes":"80fa47","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0,"xrefs_to":[{"addr":4201246,"type":"CODE"}]},{"offset":4201339,"esil":"zf,!,?{,4201312,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jne 0x401b60","disasm":"jne 0x401b60","bytes":"75e3","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201312,"fail":4201341,"xrefs_from":[{"addr":4201312,"type":"CODE"}]}]},{"offset":4201312,"size":20,"jump":4201217,"colorize":0,"ops":[{"offset":4201312,"ptr":7,"val":7,"esil":"7,r12d,==,$z,zf,:=,32,$b,cf,:=,$p,pf,:=,31,$s,sf,:=,7,0x80000000,-,!,31,$o,^,of,:=,3,$b,af,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"cmp r12d, 7","disasm":"cmp r12d, 7","bytes":"4183fc07","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0,"xrefs_to":[{"addr":4201258,"type":"CODE"},{"addr":4201270,"type":"CODE"},{"addr":4201276,"type":"CODE"},{"addr":4201282,"type":"CODE"},{"addr":4201288,"type":"CODE"},{"addr":4201339,"type":"CODE"},{"addr":4201351,"type":"CODE"},{"addr":4201357,"type":"CODE"},{"addr":4201363,"type":"CODE"},{"addr":4201369,"type":"CODE"},{"addr":4201375,"type":"CODE"},{"addr":4201402,"type":"CODE"}]},{"offset":4201316,"ptr":4211275,"val":4211275,"esil":"4211275,rbx,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201421,"size":5,"opcode":"mov ebx, 0x40424b","disasm":"mov ebx, 0x40424b","bytes":"bb4b424000","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0,"xrefs_from":[{"addr":4211275,"type":"DATA"}]},{"offset":4201321,"ptr":4211277,"val":4211277,"esil":"4211277,rax,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201421,"size":5,"opcode":"mov eax, 0x40424d","disasm":"mov eax, 0x40424d","bytes":"b84d424000","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0,"xrefs_from":[{"addr":4211277,"type":"DATA"}]},{"offset":4201326,"esil":"zf,?{,rax,rbx,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"cmove rbx, rax","disasm":"cmove rbx, rax","bytes":"480f44d8","family":"cpu","type":"cmov","reloc":false,"type_num":2147483657,"type2_num":0},{"offset":4201330,"esil":"0x401b01,rip,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jmp 0x401b01","disasm":"jmp 0x401b01","bytes":"eb8d","family":"cpu","type":"jmp","reloc":false,"type_num":1,"type2_num":0,"jump":4201217,"xrefs_from":[{"addr":4201217,"type":"CODE"}]}]},{"offset":4201341,"size":12,"jump":4201312,"fail":4201353,"colorize":0,"ops":[{"offset":4201341,"esil":"0x1,rax,+,[1],rdx,=","refptr":true,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"movzx edx, byte [rax + 1]","disasm":"movzx edx, byte [rax + 1]","bytes":"0fb65001","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0},{"offset":4201345,"ptr":4294967263,"val":4294967263,"esil":"4294967263,rdx,&,0xffffffff,&,rdx,=,$z,zf,:=,$p,pf,:=,31,$s,sf,:=,0,cf,:=,0,of,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"and edx, 0xffffffdf","disasm":"and edx, 0xffffffdf","bytes":"83e2df","family":"cpu","type":"and","reloc":false,"type_num":27,"type2_num":0},{"offset":4201348,"ptr":66,"val":66,"esil":"66,dl,==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,66,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"cmp dl, 0x42","disasm":"cmp dl, 0x42","bytes":"80fa42","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201351,"esil":"zf,!,?{,4201312,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jne 0x401b60","disasm":"jne 0x401b60","bytes":"75d7","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201312,"fail":4201353,"xrefs_from":[{"addr":4201312,"type":"CODE"}]}]},{"offset":4201353,"size":6,"jump":4201312,"fail":4201359,"colorize":0,"ops":[{"offset":4201353,"val":49,"esil":"49,0x2,rax,+,[1],==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,49,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":true,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"cmp byte [rax + 2], 0x31","disasm":"cmp byte [rax + 2], 0x31","bytes":"80780231","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201357,"esil":"zf,!,?{,4201312,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jne 0x401b60","disasm":"jne 0x401b60","bytes":"75d1","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201312,"fail":4201359,"xrefs_from":[{"addr":4201312,"type":"CODE"}]}]},{"offset":4201359,"size":6,"jump":4201312,"fail":4201365,"colorize":0,"ops":[{"offset":4201359,"val":56,"esil":"56,0x3,rax,+,[1],==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,56,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":true,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"cmp byte [rax + 3], 0x38","disasm":"cmp byte [rax + 3], 0x38","bytes":"80780338","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201363,"esil":"zf,!,?{,4201312,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jne 0x401b60","disasm":"jne 0x401b60","bytes":"75cb","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201312,"fail":4201365,"xrefs_from":[{"addr":4201312,"type":"CODE"}]}]},{"offset":4201365,"size":6,"jump":4201312,"fail":4201371,"colorize":0,"ops":[{"offset":4201365,"val":48,"esil":"48,0x4,rax,+,[1],==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,48,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":true,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"cmp byte [rax + 4], 0x30","disasm":"cmp byte [rax + 4], 0x30","bytes":"80780430","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201369,"esil":"zf,!,?{,4201312,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jne 0x401b60","disasm":"jne 0x401b60","bytes":"75c5","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201312,"fail":4201371,"xrefs_from":[{"addr":4201312,"type":"CODE"}]}]},{"offset":4201371,"size":6,"jump":4201312,"fail":4201377,"colorize":0,"ops":[{"offset":4201371,"val":51,"esil":"51,0x5,rax,+,[1],==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,51,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":true,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"cmp byte [rax + 5], 0x33","disasm":"cmp byte [rax + 5], 0x33","bytes":"80780533","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201375,"esil":"zf,!,?{,4201312,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jne 0x401b60","disasm":"jne 0x401b60","bytes":"75bf","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201312,"fail":4201377,"xrefs_from":[{"addr":4201312,"type":"CODE"}]}]},{"offset":4201377,"size":27,"jump":4201312,"fail":4201404,"colorize":0,"ops":[{"offset":4201377,"esil":"r8d,r8,^,0xffffffff,&,r8,=,$z,zf,:=,$p,pf,:=,31,$s,sf,:=,0,cf,:=,0,of,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"xor r8d, r8d","disasm":"xor r8d, r8d","bytes":"4531c0","family":"cpu","type":"xor","reloc":false,"type_num":28,"type2_num":0},{"offset":4201380,"esil":"ecx,rcx,^,0xffffffff,&,rcx,=,$z,zf,:=,$p,pf,:=,31,$s,sf,:=,0,cf,:=,0,of,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"xor ecx, ecx","disasm":"xor ecx, ecx","bytes":"31c9","family":"cpu","type":"xor","reloc":false,"type_num":28,"type2_num":0},{"offset":4201382,"ptr":48,"val":48,"esil":"48,rdx,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201421,"size":5,"opcode":"mov edx, 0x30","disasm":"mov edx, 0x30","bytes":"ba30000000","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0},{"offset":4201387,"ptr":4211287,"val":4211287,"esil":"4211287,rsi,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201421,"size":5,"opcode":"mov esi, 0x404257","disasm":"mov esi, str.GB18030","bytes":"be57424000","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0,"xrefs_from":[{"addr":4211287,"type":"DATA"}]},{"offset":4201392,"esil":"rax,rdi,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"mov rdi, rax","disasm":"mov rdi, rax","bytes":"4889c7","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0},{"offset":4201395,"esil":"4200992,rip,8,rsp,-=,rsp,=[],rip,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201421,"size":5,"opcode":"call 0x401a20","disasm":"call fcn.00401a20","bytes":"e868feffff","family":"cpu","type":"call","reloc":false,"type_num":3,"type2_num":0,"jump":4200992,"fail":4201400,"xrefs_from":[{"addr":4200992,"type":"CALL"}]},{"offset":4201400,"esil":"0,eax,eax,&,==,$z,zf,:=,$p,pf,:=,31,$s,sf,:=,0,cf,:=,0,of,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"test eax, eax","disasm":"test eax, eax","bytes":"85c0","family":"cpu","type":"acmp","reloc":false,"type_num":16,"type2_num":0},{"offset":4201402,"esil":"zf,?{,4201312,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"je 0x401b60","disasm":"je 0x401b60","bytes":"74a4","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201312,"fail":4201404,"xrefs_from":[{"addr":4201312,"type":"CODE"}]}]},{"offset":4201404,"size":22,"jump":4201217,"colorize":0,"ops":[{"offset":4201404,"val":96,"esil":"96,rbx,[1],==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,96,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":true,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"cmp byte [rbx], 0x60","disasm":"cmp byte [rbx], 0x60","bytes":"803b60","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201407,"ptr":4211279,"val":4211279,"esil":"4211279,rax,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201421,"size":5,"opcode":"mov eax, 0x40424f","disasm":"mov eax, 0x40424f","bytes":"b84f424000","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0,"xrefs_from":[{"addr":4211279,"type":"DATA"}]},{"offset":4201412,"ptr":4211268,"val":4211268,"esil":"4211268,rbx,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201421,"size":5,"opcode":"mov ebx, 0x404244","disasm":"mov ebx, 0x404244","bytes":"bb44424000","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0,"xrefs_from":[{"addr":4211268,"type":"DATA"}]},{"offset":4201417,"esil":"zf,?{,rax,rbx,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"cmove rbx, rax","disasm":"cmove rbx, rax","bytes":"480f44d8","family":"cpu","type":"cmov","reloc":false,"type_num":2147483657,"type2_num":0},{"offset":4201421,"esil":"0x401b01,rip,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201421,"size":5,"opcode":"jmp 0x401b01","disasm":"jmp 0x401b01","bytes":"e92fffffff","family":"cpu","type":"jmp","reloc":false,"type_num":1,"type2_num":0,"jump":4201217,"xrefs_from":[{"addr":4201217,"type":"CODE"}]}]},{"offset":4201248,"size":12,"jump":4201312,"fail":4201260,"colorize":0,"ops":[{"offset":4201248,"esil":"0x1,rax,+,[1],rdx,=","refptr":true,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"movzx edx, byte [rax + 1]","disasm":"movzx edx, byte [rax + 1]","bytes":"0fb65001","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0},{"offset":4201252,"ptr":4294967263,"val":4294967263,"esil":"4294967263,rdx,&,0xffffffff,&,rdx,=,$z,zf,:=,$p,pf,:=,31,$s,sf,:=,0,cf,:=,0,of,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"and edx, 0xffffffdf","disasm":"and edx, 0xffffffdf","bytes":"83e2df","family":"cpu","type":"and","reloc":false,"type_num":27,"type2_num":0},{"offset":4201255,"ptr":84,"val":84,"esil":"84,dl,==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,84,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"cmp dl, 0x54","disasm":"cmp dl, 0x54","bytes":"80fa54","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201258,"esil":"zf,!,?{,4201312,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jne 0x401b60","disasm":"jne 0x401b60","bytes":"7534","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201312,"fail":4201260,"xrefs_from":[{"addr":4201312,"type":"CODE"}]}]},{"offset":4201260,"size":12,"jump":4201312,"fail":4201272,"colorize":0,"ops":[{"offset":4201260,"esil":"0x2,rax,+,[1],rdx,=","refptr":true,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"movzx edx, byte [rax + 2]","disasm":"movzx edx, byte [rax + 2]","bytes":"0fb65002","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0},{"offset":4201264,"ptr":4294967263,"val":4294967263,"esil":"4294967263,rdx,&,0xffffffff,&,rdx,=,$z,zf,:=,$p,pf,:=,31,$s,sf,:=,0,cf,:=,0,of,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"and edx, 0xffffffdf","disasm":"and edx, 0xffffffdf","bytes":"83e2df","family":"cpu","type":"and","reloc":false,"type_num":27,"type2_num":0},{"offset":4201267,"ptr":70,"val":70,"esil":"70,dl,==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,70,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"cmp dl, 0x46","disasm":"cmp dl, 0x46","bytes":"80fa46","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201270,"esil":"zf,!,?{,4201312,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jne 0x401b60","disasm":"jne 0x401b60","bytes":"7528","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201312,"fail":4201272,"xrefs_from":[{"addr":4201312,"type":"CODE"}]}]},{"offset":4201272,"size":6,"jump":4201312,"fail":4201278,"colorize":0,"ops":[{"offset":4201272,"val":45,"esil":"45,0x3,rax,+,[1],==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,45,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":true,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"cmp byte [rax + 3], 0x2d","disasm":"cmp byte [rax + 3], 0x2d","bytes":"8078032d","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201276,"esil":"zf,!,?{,4201312,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jne 0x401b60","disasm":"jne 0x401b60","bytes":"7522","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201312,"fail":4201278,"xrefs_from":[{"addr":4201312,"type":"CODE"}]}]},{"offset":4201278,"size":6,"jump":4201312,"fail":4201284,"colorize":0,"ops":[{"offset":4201278,"val":56,"esil":"56,0x4,rax,+,[1],==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,56,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":true,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"cmp byte [rax + 4], 0x38","disasm":"cmp byte [rax + 4], 0x38","bytes":"80780438","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201282,"esil":"zf,!,?{,4201312,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jne 0x401b60","disasm":"jne 0x401b60","bytes":"751c","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201312,"fail":4201284,"xrefs_from":[{"addr":4201312,"type":"CODE"}]}]},{"offset":4201284,"size":6,"jump":4201312,"fail":4201290,"colorize":0,"ops":[{"offset":4201284,"val":0,"esil":"0,0x5,rax,+,[1],==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,0,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":true,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"cmp byte [rax + 5], 0","disasm":"cmp byte [rax + 5], 0","bytes":"80780500","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201288,"esil":"zf,!,?{,4201312,rip,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jne 0x401b60","disasm":"jne 0x401b60","bytes":"7516","family":"cpu","type":"cjmp","reloc":false,"type_num":2147483649,"type2_num":0,"jump":4201312,"fail":4201290,"xrefs_from":[{"addr":4201312,"type":"CODE"}]}]},{"offset":4201290,"size":19,"jump":4201217,"colorize":0,"ops":[{"offset":4201290,"val":96,"esil":"96,rbx,[1],==,$z,zf,:=,8,$b,cf,:=,$p,pf,:=,7,$s,sf,:=,96,0x80,-,!,7,$o,^,of,:=,3,$b,af,:=","refptr":true,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"cmp byte [rbx], 0x60","disasm":"cmp byte [rbx], 0x60","bytes":"803b60","family":"cpu","type":"cmp","reloc":false,"type_num":15,"type2_num":0},{"offset":4201293,"ptr":4211283,"val":4211283,"esil":"4211283,rax,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201421,"size":5,"opcode":"mov eax, 0x404253","disasm":"mov eax, 0x404253","bytes":"b853424000","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0,"xrefs_from":[{"addr":4211283,"type":"DATA"}]},{"offset":4201298,"ptr":4211271,"val":4211271,"esil":"4211271,rbx,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201421,"size":5,"opcode":"mov ebx, 0x404247","disasm":"mov ebx, 0x404247","bytes":"bb47424000","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0,"xrefs_from":[{"addr":4211271,"type":"DATA"}]},{"offset":4201303,"esil":"zf,?{,rax,rbx,=,}","refptr":false,"fcn_addr":4201184,"fcn_last":4201422,"size":4,"opcode":"cmove rbx, rax","disasm":"cmove rbx, rax","bytes":"480f44d8","family":"cpu","type":"cmov","reloc":false,"type_num":2147483657,"type2_num":0},{"offset":4201307,"esil":"0x401b01,rip,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"jmp 0x401b01","disasm":"jmp 0x401b01","bytes":"eba4","family":"cpu","type":"jmp","reloc":false,"type_num":1,"type2_num":0,"jump":4201217,"xrefs_from":[{"addr":4201217,"type":"CODE"}]}]},{"offset":4201217,"size":8,"colorize":0,"ops":[{"offset":4201217,"esil":"rbx,rax,=","refptr":false,"fcn_addr":4201184,"fcn_last":4201423,"size":3,"opcode":"mov rax, rbx","disasm":"mov rax, rbx","bytes":"4889d8","family":"cpu","type":"mov","reloc":false,"type_num":9,"type2_num":0,"xrefs_to":[{"addr":4201307,"type":"CODE"},{"addr":4201330,"type":"CODE"},{"addr":4201421,"type":"CODE"}]},{"offset":4201220,"esil":"rsp,[8],rbx,=,8,rsp,+=","refptr":false,"fcn_addr":4201184,"fcn_last":4201425,"size":1,"opcode":"pop rbx","disasm":"pop rbx","bytes":"5b","family":"cpu","type":"pop","reloc":false,"type_num":14,"type2_num":0},{"offset":4201221,"esil":"rsp,[8],rbp,=,8,rsp,+=","refptr":false,"fcn_addr":4201184,"fcn_last":4201425,"size":1,"opcode":"pop rbp","disasm":"pop rbp","bytes":"5d","family":"cpu","type":"pop","reloc":false,"type_num":14,"type2_num":0},{"offset":4201222,"esil":"rsp,[8],r12,=,8,rsp,+=","refptr":false,"fcn_addr":4201184,"fcn_last":4201424,"size":2,"opcode":"pop r12","disasm":"pop r12","bytes":"415c","family":"cpu","type":"pop","reloc":false,"type_num":14,"type2_num":0},{"offset":4201224,"esil":"rsp,[8],rip,=,8,rsp,+=","refptr":false,"fcn_addr":4201184,"fcn_last":4201425,"size":1,"opcode":"ret","disasm":"ret","bytes":"c3","family":"cpu","type":"ret","reloc":false,"type_num":5,"type2_num":0}]}]}]
EOF
RUN


NAME=rz-diff entries comparison
FILE==
CMDS=!rz-diff -C -t entries bins/elf/hello_world bins/elf/hello_world32
EXPECT=<<EOF
--- bins/elf/hello_world
+++ bins/elf/hello_world32
@@ -1,3 +1,3 @@
-virt: 0x00000000000007a0 phys: 0x00000000000007a0 entry init
-virt: 0x0000000000000760 phys: 0x0000000000000760 entry fini
-virt: 0x00000000000006a0 phys: 0x00000000000006a0 entry program
+virt: 0x0000000000000600 phys: 0x0000000000000600 entry init
+virt: 0x00000000000005b0 phys: 0x00000000000005b0 entry fini
+virt: 0x00000000000004d0 phys: 0x00000000000004d0 entry program

EOF
RUN

NAME=rz-diff entries comparison JSON
FILE==
CMDS=!rz-diff -C -jt entries bins/elf/hello_world bins/elf/hello_world32
EXPECT=<<EOF
{"from":"bins/elf/hello_world","to":"bins/elf/hello_world32","diff":[{"from":[1,3],"to":[1,3],"ops":[{"op":"delete","value":"virt: 0x00000000000007a0 phys: 0x00000000000007a0 entry init\n"},{"op":"delete","value":"virt: 0x0000000000000760 phys: 0x0000000000000760 entry fini\n"},{"op":"delete","value":"virt: 0x00000000000006a0 phys: 0x00000000000006a0 entry program\n"},{"op":"insert","value":"virt: 0x0000000000000600 phys: 0x0000000000000600 entry init\n"},{"op":"insert","value":"virt: 0x00000000000005b0 phys: 0x00000000000005b0 entry fini\n"},{"op":"insert","value":"virt: 0x00000000000004d0 phys: 0x00000000000004d0 entry program\n"}]}]}
EOF
RUN


NAME=rz-diff imports comparison
FILE==
CMDS=!rz-diff -C -t imports bins/elf/hello_world bins/other/rz-diff/true
EXPECT=<<EOF
--- bins/elf/hello_world
+++ bins/other/rz-diff/true
@@ -1,11 +1,49 @@
-WEAK    NOTYPE  _ITM_deregisterTMCloneTable
-WEAK    NOTYPE  _ITM_registerTMCloneTable
-WEAK    FUNC    __cxa_finalize
+GLOBAL  FUNC    __ctype_b_loc
+GLOBAL  FUNC    __ctype_get_mb_cur_max
+GLOBAL  FUNC    __cxa_atexit
+GLOBAL  FUNC    __errno_location
+GLOBAL  FUNC    __fpending
+GLOBAL  FUNC    __fprintf_chk
+GLOBAL  FUNC    __freading
 WEAK    NOTYPE  __gmon_start__
 GLOBAL  FUNC    __libc_start_main
+GLOBAL  FUNC    __printf_chk
+GLOBAL  FUNC    __stack_chk_fail
+GLOBAL  FUNC    __uflow
+GLOBAL  FUNC    _exit
+GLOBAL  FUNC    abort
+GLOBAL  FUNC    bindtextdomain
+GLOBAL  FUNC    calloc
+GLOBAL  FUNC    close
+GLOBAL  FUNC    dcgettext
+GLOBAL  FUNC    error
+GLOBAL  FUNC    exit
+GLOBAL  FUNC    fclose
+GLOBAL  FUNC    fdopen
+GLOBAL  FUNC    fflush
+GLOBAL  FUNC    fileno
+GLOBAL  FUNC    fputs_unlocked
 GLOBAL  FUNC    free
+GLOBAL  FUNC    fscanf
+GLOBAL  FUNC    fseeko
+GLOBAL  FUNC    fwrite
+GLOBAL  FUNC    getenv
+GLOBAL  FUNC    iswprint
+GLOBAL  FUNC    lseek
 GLOBAL  FUNC    malloc
-GLOBAL  FUNC    puts
-GLOBAL  FUNC    strcat
+GLOBAL  FUNC    mbrtowc
+GLOBAL  FUNC    mbsinit
+GLOBAL  FUNC    memcmp
+GLOBAL  FUNC    memcpy
+GLOBAL  FUNC    memset
+GLOBAL  FUNC    nl_langinfo
+GLOBAL  FUNC    open
+GLOBAL  FUNC    realloc
+GLOBAL  FUNC    setlocale
+GLOBAL  FUNC    strcmp
 GLOBAL  FUNC    strcpy
 GLOBAL  FUNC    strlen
+GLOBAL  FUNC    strncmp
+GLOBAL  FUNC    strrchr
+GLOBAL  FUNC    textdomain
+GLOBAL  FUNC    ungetc

EOF
RUN

NAME=rz-diff imports comparison JSON
FILE==
CMDS=!rz-diff -C -jt imports bins/elf/hello_world bins/other/rz-diff/true
EXPECT=<<EOF
{"from":"bins/elf/hello_world","to":"bins/other/rz-diff/true","diff":[{"from":[1,11],"to":[1,49],"ops":[{"op":"delete","value":"WEAK    NOTYPE  _ITM_deregisterTMCloneTable\n"},{"op":"delete","value":"WEAK    NOTYPE  _ITM_registerTMCloneTable\n"},{"op":"delete","value":"WEAK    FUNC    __cxa_finalize\n"},{"op":"insert","value":"GLOBAL  FUNC    __ctype_b_loc\n"},{"op":"insert","value":"GLOBAL  FUNC    __ctype_get_mb_cur_max\n"},{"op":"insert","value":"GLOBAL  FUNC    __cxa_atexit\n"},{"op":"insert","value":"GLOBAL  FUNC    __errno_location\n"},{"op":"insert","value":"GLOBAL  FUNC    __fpending\n"},{"op":"insert","value":"GLOBAL  FUNC    __fprintf_chk\n"},{"op":"insert","value":"GLOBAL  FUNC    __freading\n"},{"op":"equal","value":"WEAK    NOTYPE  __gmon_start__\n"},{"op":"equal","value":"GLOBAL  FUNC    __libc_start_main\n"},{"op":"insert","value":"GLOBAL  FUNC    __printf_chk\n"},{"op":"insert","value":"GLOBAL  FUNC    __stack_chk_fail\n"},{"op":"insert","value":"GLOBAL  FUNC    __uflow\n"},{"op":"insert","value":"GLOBAL  FUNC    _exit\n"},{"op":"insert","value":"GLOBAL  FUNC    abort\n"},{"op":"insert","value":"GLOBAL  FUNC    bindtextdomain\n"},{"op":"insert","value":"GLOBAL  FUNC    calloc\n"},{"op":"insert","value":"GLOBAL  FUNC    close\n"},{"op":"insert","value":"GLOBAL  FUNC    dcgettext\n"},{"op":"insert","value":"GLOBAL  FUNC    error\n"},{"op":"insert","value":"GLOBAL  FUNC    exit\n"},{"op":"insert","value":"GLOBAL  FUNC    fclose\n"},{"op":"insert","value":"GLOBAL  FUNC    fdopen\n"},{"op":"insert","value":"GLOBAL  FUNC    fflush\n"},{"op":"insert","value":"GLOBAL  FUNC    fileno\n"},{"op":"insert","value":"GLOBAL  FUNC    fputs_unlocked\n"},{"op":"equal","value":"GLOBAL  FUNC    free\n"},{"op":"insert","value":"GLOBAL  FUNC    fscanf\n"},{"op":"insert","value":"GLOBAL  FUNC    fseeko\n"},{"op":"insert","value":"GLOBAL  FUNC    fwrite\n"},{"op":"insert","value":"GLOBAL  FUNC    getenv\n"},{"op":"insert","value":"GLOBAL  FUNC    iswprint\n"},{"op":"insert","value":"GLOBAL  FUNC    lseek\n"},{"op":"equal","value":"GLOBAL  FUNC    malloc\n"},{"op":"delete","value":"GLOBAL  FUNC    puts\n"},{"op":"delete","value":"GLOBAL  FUNC    strcat\n"},{"op":"insert","value":"GLOBAL  FUNC    mbrtowc\n"},{"op":"insert","value":"GLOBAL  FUNC    mbsinit\n"},{"op":"insert","value":"GLOBAL  FUNC    memcmp\n"},{"op":"insert","value":"GLOBAL  FUNC    memcpy\n"},{"op":"insert","value":"GLOBAL  FUNC    memset\n"},{"op":"insert","value":"GLOBAL  FUNC    nl_langinfo\n"},{"op":"insert","value":"GLOBAL  FUNC    open\n"},{"op":"insert","value":"GLOBAL  FUNC    realloc\n"},{"op":"insert","value":"GLOBAL  FUNC    setlocale\n"},{"op":"insert","value":"GLOBAL  FUNC    strcmp\n"},{"op":"equal","value":"GLOBAL  FUNC    strcpy\n"},{"op":"equal","value":"GLOBAL  FUNC    strlen\n"},{"op":"insert","value":"GLOBAL  FUNC    strncmp\n"},{"op":"insert","value":"GLOBAL  FUNC    strrchr\n"},{"op":"insert","value":"GLOBAL  FUNC    textdomain\n"},{"op":"insert","value":"GLOBAL  FUNC    ungetc\n"}]}]}
EOF
RUN


NAME=rz-diff fields comparison
FILE==
CMDS=!rz-diff -C -t fields bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Hello.class
@@ -1,0 +1,1 @@
+Ljava/lang/String; who

EOF
RUN

NAME=rz-diff fields comparison JSON
FILE==
CMDS=!rz-diff -C -jt fields bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Hello.class","diff":[{"from":[1,0],"to":[1,1],"ops":[{"op":"insert","value":"Ljava/lang/String; who\n"}]}]}
EOF
RUN

NAME=rz-diff fields comparison with addresses
FILE==
CMDS=!rz-diff -C -At fields bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Hello.class
@@ -1,0 +1,1 @@
+virt: 0x000000000000020b phys: 0x000000000000020b Ljava/lang/String; who

EOF
RUN

NAME=rz-diff fields comparison with addresses JSON
FILE==
CMDS=!rz-diff -C -Ajt fields bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Hello.class","diff":[{"from":[1,0],"to":[1,1],"ops":[{"op":"insert","value":"virt: 0x000000000000020b phys: 0x000000000000020b Ljava/lang/String; who\n"}]}]}
EOF
RUN


NAME=rz-diff libraries comparison
FILE==
CMDS=!rz-diff -C -t libraries bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Hello.class
@@ -1,12 +1,5 @@
-Main
-[Ljava/lang/String;
-java/io/BufferedReader
-java/io/FileReader
+Hello
 java/io/PrintStream
-java/lang/Exception
 java/lang/Object
-java/lang/String
+java/lang/StringBuilder
 java/lang/System
-java/lang/invoke/MethodHandles
-java/lang/invoke/MethodHandles$Lookup
-java/lang/invoke/StringConcatFactory

EOF
RUN

NAME=rz-diff libraries comparison JSON
FILE==
CMDS=!rz-diff -C -jt libraries bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Hello.class","diff":[{"from":[1,12],"to":[1,5],"ops":[{"op":"delete","value":"Main\n"},{"op":"delete","value":"[Ljava/lang/String;\n"},{"op":"delete","value":"java/io/BufferedReader\n"},{"op":"delete","value":"java/io/FileReader\n"},{"op":"insert","value":"Hello\n"},{"op":"equal","value":"java/io/PrintStream\n"},{"op":"delete","value":"java/lang/Exception\n"},{"op":"equal","value":"java/lang/Object\n"},{"op":"delete","value":"java/lang/String\n"},{"op":"insert","value":"java/lang/StringBuilder\n"},{"op":"equal","value":"java/lang/System\n"},{"op":"delete","value":"java/lang/invoke/MethodHandles\n"},{"op":"delete","value":"java/lang/invoke/MethodHandles$Lookup\n"},{"op":"delete","value":"java/lang/invoke/StringConcatFactory\n"}]}]}
EOF
RUN


NAME=rz-diff sections comparison
FILE==
CMDS=!rz-diff -C -t sections bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Hello.class
@@ -0,8 +0,12 @@
 align: 0x00000000 -r-- class.attr
 align: 0x00000000 -r-- class.constant_pool
+align: 0x00000000 -r-- class.fields
+align: 0x00000000 -r-- class.fields.who.attr
 align: 0x00000000 -r-- class.methods
 align: 0x00000000 -r-- class.methods.<init>.attr
 align: 0x00000000 -r-x class.methods.<init>.attr.0.code
 align: 0x00000000 -r-- class.methods.main.attr
 align: 0x00000000 -r-x class.methods.main.attr.0.code
+align: 0x00000000 -r-- class.methods.say.attr
+align: 0x00000000 -r-x class.methods.say.attr.0.code

EOF
RUN

NAME=rz-diff sections comparison JSON
FILE==
CMDS=!rz-diff -C -jt sections bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Hello.class","diff":[{"from":[0,8],"to":[0,12],"ops":[{"op":"equal","value":"align: 0x00000000 -r-- class.attr\n"},{"op":"equal","value":"align: 0x00000000 -r-- class.constant_pool\n"},{"op":"insert","value":"align: 0x00000000 -r-- class.fields\n"},{"op":"insert","value":"align: 0x00000000 -r-- class.fields.who.attr\n"},{"op":"equal","value":"align: 0x00000000 -r-- class.methods\n"},{"op":"equal","value":"align: 0x00000000 -r-- class.methods.<init>.attr\n"},{"op":"equal","value":"align: 0x00000000 -r-x class.methods.<init>.attr.0.code\n"},{"op":"equal","value":"align: 0x00000000 -r-- class.methods.main.attr\n"},{"op":"equal","value":"align: 0x00000000 -r-x class.methods.main.attr.0.code\n"},{"op":"insert","value":"align: 0x00000000 -r-- class.methods.say.attr\n"},{"op":"insert","value":"align: 0x00000000 -r-x class.methods.say.attr.0.code\n"}]}]}
EOF
RUN

NAME=rz-diff sections comparison with addresses
FILE==
CMDS=!rz-diff -C -At sections bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Hello.class
@@ -1,7 +1,11 @@
-virt: 0x000000000000058a:0x0026 phys: 0x000000000000058a:0x0026 align: 0x00000000 -r-- class.attr
-virt: 0x000000000000000a:0x0480 phys: 0x000000000000000a:0x0480 align: 0x00000000 -r-- class.constant_pool
-virt: 0x000000000000048e:0x00fc phys: 0x000000000000048e:0x00fc align: 0x00000000 -r-- class.methods
-virt: 0x000000000000048e:0x002b phys: 0x000000000000048e:0x002b align: 0x00000000 -r-- class.methods.<init>.attr
-virt: 0x00000000000004a4:0x001d phys: 0x00000000000004a4:0x001d align: 0x00000000 -r-x class.methods.<init>.attr.0.code
-virt: 0x00000000000004b9:0x00d1 phys: 0x00000000000004b9:0x00d1 align: 0x00000000 -r-- class.methods.main.attr
-virt: 0x00000000000004cf:0x00c1 phys: 0x00000000000004cf:0x00c1 align: 0x00000000 -r-x class.methods.main.attr.0.code
+virt: 0x00000000000002cd:0x0008 phys: 0x00000000000002cd:0x0008 align: 0x00000000 -r-- class.attr
+virt: 0x000000000000000a:0x01ff phys: 0x000000000000000a:0x01ff align: 0x00000000 -r-- class.constant_pool
+virt: 0x000000000000020b:0x000a phys: 0x000000000000020b:0x000a align: 0x00000000 -r-- class.fields
+virt: 0x000000000000020b:0x000a phys: 0x000000000000020b:0x000a align: 0x00000000 -r-- class.fields.who.attr
+virt: 0x0000000000000215:0x00b8 phys: 0x0000000000000215:0x00b8 align: 0x00000000 -r-- class.methods
+virt: 0x0000000000000215:0x0038 phys: 0x0000000000000215:0x0038 align: 0x00000000 -r-- class.methods.<init>.attr
+virt: 0x000000000000022b:0x002a phys: 0x000000000000022b:0x002a align: 0x00000000 -r-x class.methods.<init>.attr.0.code
+virt: 0x0000000000000294:0x0039 phys: 0x0000000000000294:0x0039 align: 0x00000000 -r-- class.methods.main.attr
+virt: 0x00000000000002aa:0x0029 phys: 0x00000000000002aa:0x0029 align: 0x00000000 -r-x class.methods.main.attr.0.code
+virt: 0x000000000000024d:0x0047 phys: 0x000000000000024d:0x0047 align: 0x00000000 -r-- class.methods.say.attr
+virt: 0x0000000000000263:0x0039 phys: 0x0000000000000263:0x0039 align: 0x00000000 -r-x class.methods.say.attr.0.code

EOF
RUN

NAME=rz-diff sections comparison with addresses JSON
FILE==
CMDS=!rz-diff -C -Ajt sections bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Hello.class","diff":[{"from":[1,7],"to":[1,11],"ops":[{"op":"delete","value":"virt: 0x000000000000058a:0x0026 phys: 0x000000000000058a:0x0026 align: 0x00000000 -r-- class.attr\n"},{"op":"delete","value":"virt: 0x000000000000000a:0x0480 phys: 0x000000000000000a:0x0480 align: 0x00000000 -r-- class.constant_pool\n"},{"op":"delete","value":"virt: 0x000000000000048e:0x00fc phys: 0x000000000000048e:0x00fc align: 0x00000000 -r-- class.methods\n"},{"op":"delete","value":"virt: 0x000000000000048e:0x002b phys: 0x000000000000048e:0x002b align: 0x00000000 -r-- class.methods.<init>.attr\n"},{"op":"delete","value":"virt: 0x00000000000004a4:0x001d phys: 0x00000000000004a4:0x001d align: 0x00000000 -r-x class.methods.<init>.attr.0.code\n"},{"op":"delete","value":"virt: 0x00000000000004b9:0x00d1 phys: 0x00000000000004b9:0x00d1 align: 0x00000000 -r-- class.methods.main.attr\n"},{"op":"delete","value":"virt: 0x00000000000004cf:0x00c1 phys: 0x00000000000004cf:0x00c1 align: 0x00000000 -r-x class.methods.main.attr.0.code\n"},{"op":"insert","value":"virt: 0x00000000000002cd:0x0008 phys: 0x00000000000002cd:0x0008 align: 0x00000000 -r-- class.attr\n"},{"op":"insert","value":"virt: 0x000000000000000a:0x01ff phys: 0x000000000000000a:0x01ff align: 0x00000000 -r-- class.constant_pool\n"},{"op":"insert","value":"virt: 0x000000000000020b:0x000a phys: 0x000000000000020b:0x000a align: 0x00000000 -r-- class.fields\n"},{"op":"insert","value":"virt: 0x000000000000020b:0x000a phys: 0x000000000000020b:0x000a align: 0x00000000 -r-- class.fields.who.attr\n"},{"op":"insert","value":"virt: 0x0000000000000215:0x00b8 phys: 0x0000000000000215:0x00b8 align: 0x00000000 -r-- class.methods\n"},{"op":"insert","value":"virt: 0x0000000000000215:0x0038 phys: 0x0000000000000215:0x0038 align: 0x00000000 -r-- class.methods.<init>.attr\n"},{"op":"insert","value":"virt: 0x000000000000022b:0x002a phys: 0x000000000000022b:0x002a align: 0x00000000 -r-x class.methods.<init>.attr.0.code\n"},{"op":"insert","value":"virt: 0x0000000000000294:0x0039 phys: 0x0000000000000294:0x0039 align: 0x00000000 -r-- class.methods.main.attr\n"},{"op":"insert","value":"virt: 0x00000000000002aa:0x0029 phys: 0x00000000000002aa:0x0029 align: 0x00000000 -r-x class.methods.main.attr.0.code\n"},{"op":"insert","value":"virt: 0x000000000000024d:0x0047 phys: 0x000000000000024d:0x0047 align: 0x00000000 -r-- class.methods.say.attr\n"},{"op":"insert","value":"virt: 0x0000000000000263:0x0039 phys: 0x0000000000000263:0x0039 align: 0x00000000 -r-x class.methods.say.attr.0.code\n"}]}]}
EOF
RUN


NAME=rz-diff symbols comparison
FILE==
CMDS=!rz-diff -C -t symbols bins/java/Main.java.11.class bins/java/Main.java.1.7.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Main.java.1.7.class
@@ -1,13 +1,15 @@
+java.lang.Object Ljava/lang/Object; <init>
 java.lang.Object Ljava/lang/Object; <init>
 java.io.FileReader Ljava/io/FileReader; <init>
 java.io.BufferedReader Ljava/io/BufferedReader; <init>
 Main LMain; LMain;.<init>
 Main LMain; LMain;.main
+java.lang.StringBuilder Ljava/lang/StringBuilder; append
 java.io.BufferedReader Ljava/io/BufferedReader; close
 java.lang.System Ljava/lang/System; err
 java.io.PrintStream Ljava/io/PrintStream; format
-java.lang.invoke.StringConcatFactory Ljava/lang/invoke/StringConcatFactory; makeConcatWithConstants
 java.lang.System Ljava/lang/System; out
 java.lang.Exception Ljava/lang/Exception; printStackTrace
 java.io.PrintStream Ljava/io/PrintStream; println
 java.io.BufferedReader Ljava/io/BufferedReader; readLine
+java.lang.StringBuilder Ljava/lang/StringBuilder; toString

EOF
RUN

NAME=rz-diff symbols comparison JSON
FILE==
CMDS=!rz-diff -C -jt symbols bins/java/Main.java.11.class bins/java/Main.java.1.7.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Main.java.1.7.class","diff":[{"from":[1,13],"to":[1,15],"ops":[{"op":"insert","value":"java.lang.Object Ljava/lang/Object; <init>\n"},{"op":"equal","value":"java.lang.Object Ljava/lang/Object; <init>\n"},{"op":"equal","value":"java.io.FileReader Ljava/io/FileReader; <init>\n"},{"op":"equal","value":"java.io.BufferedReader Ljava/io/BufferedReader; <init>\n"},{"op":"equal","value":"Main LMain; LMain;.<init>\n"},{"op":"equal","value":"Main LMain; LMain;.main\n"},{"op":"insert","value":"java.lang.StringBuilder Ljava/lang/StringBuilder; append\n"},{"op":"equal","value":"java.io.BufferedReader Ljava/io/BufferedReader; close\n"},{"op":"equal","value":"java.lang.System Ljava/lang/System; err\n"},{"op":"equal","value":"java.io.PrintStream Ljava/io/PrintStream; format\n"},{"op":"delete","value":"java.lang.invoke.StringConcatFactory Ljava/lang/invoke/StringConcatFactory; makeConcatWithConstants\n"},{"op":"equal","value":"java.lang.System Ljava/lang/System; out\n"},{"op":"equal","value":"java.lang.Exception Ljava/lang/Exception; printStackTrace\n"},{"op":"equal","value":"java.io.PrintStream Ljava/io/PrintStream; println\n"},{"op":"equal","value":"java.io.BufferedReader Ljava/io/BufferedReader; readLine\n"},{"op":"insert","value":"java.lang.StringBuilder Ljava/lang/StringBuilder; toString\n"}]}]}
EOF
RUN

NAME=rz-diff symbols comparison with addresses
FILE==
CMDS=!rz-diff -C -At symbols bins/java/Main.java.11.class bins/java/Main.java.1.7.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Main.java.1.7.class
@@ -1,13 +1,15 @@
 virt: 0x000000000000000a phys: 0x000000000000000a java.lang.Object Ljava/lang/Object; <init>
 virt: 0x0000000000000114 phys: 0x0000000000000114 java.io.FileReader Ljava/io/FileReader; <init>
 virt: 0x000000000000011e phys: 0x000000000000011e java.io.BufferedReader Ljava/io/BufferedReader; <init>
-virt: 0x00000000000004a4 phys: 0x00000000000004a4 Main LMain; LMain;.<init>
-virt: 0x00000000000004cf phys: 0x00000000000004cf Main LMain; LMain;.main
-virt: 0x00000000000001b7 phys: 0x00000000000001b7 java.io.BufferedReader Ljava/io/BufferedReader; close
-virt: 0x00000000000001e2 phys: 0x00000000000001e2 java.lang.System Ljava/lang/System; err
-virt: 0x000000000000021f phys: 0x000000000000021f java.io.PrintStream Ljava/io/PrintStream; format
-virt: 0x000000000000033f phys: 0x000000000000033f java.lang.invoke.StringConcatFactory Ljava/lang/invoke/StringConcatFactory; makeConcatWithConstants
+virt: 0x0000000000000187 phys: 0x0000000000000187 java.lang.StringBuilder Ljava/lang/StringBuilder; <init>
+virt: 0x0000000000000383 phys: 0x0000000000000383 Main LMain; LMain;.<init>
+virt: 0x00000000000003ae phys: 0x00000000000003ae Main LMain; LMain;.main
+virt: 0x0000000000000198 phys: 0x0000000000000198 java.lang.StringBuilder Ljava/lang/StringBuilder; append
+virt: 0x00000000000001f0 phys: 0x00000000000001f0 java.io.BufferedReader Ljava/io/BufferedReader; close
+virt: 0x000000000000021b phys: 0x000000000000021b java.lang.System Ljava/lang/System; err
+virt: 0x0000000000000258 phys: 0x0000000000000258 java.io.PrintStream Ljava/io/PrintStream; format
 virt: 0x0000000000000039 phys: 0x0000000000000039 java.lang.System Ljava/lang/System; out
-virt: 0x0000000000000271 phys: 0x0000000000000271 java.lang.Exception Ljava/lang/Exception; printStackTrace
+virt: 0x00000000000002aa phys: 0x00000000000002aa java.lang.Exception Ljava/lang/Exception; printStackTrace
 virt: 0x0000000000000088 phys: 0x0000000000000088 java.io.PrintStream Ljava/io/PrintStream; println
 virt: 0x000000000000013e phys: 0x000000000000013e java.io.BufferedReader Ljava/io/BufferedReader; readLine
+virt: 0x00000000000001db phys: 0x00000000000001db java.lang.StringBuilder Ljava/lang/StringBuilder; toString

EOF
RUN

NAME=rz-diff symbols comparison with addresses JSON
FILE==
CMDS=!rz-diff -C -Ajt symbols bins/java/Main.java.11.class bins/java/Main.java.1.7.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Main.java.1.7.class","diff":[{"from":[1,13],"to":[1,15],"ops":[{"op":"equal","value":"virt: 0x000000000000000a phys: 0x000000000000000a java.lang.Object Ljava/lang/Object; <init>\n"},{"op":"equal","value":"virt: 0x0000000000000114 phys: 0x0000000000000114 java.io.FileReader Ljava/io/FileReader; <init>\n"},{"op":"equal","value":"virt: 0x000000000000011e phys: 0x000000000000011e java.io.BufferedReader Ljava/io/BufferedReader; <init>\n"},{"op":"delete","value":"virt: 0x00000000000004a4 phys: 0x00000000000004a4 Main LMain; LMain;.<init>\n"},{"op":"delete","value":"virt: 0x00000000000004cf phys: 0x00000000000004cf Main LMain; LMain;.main\n"},{"op":"delete","value":"virt: 0x00000000000001b7 phys: 0x00000000000001b7 java.io.BufferedReader Ljava/io/BufferedReader; close\n"},{"op":"delete","value":"virt: 0x00000000000001e2 phys: 0x00000000000001e2 java.lang.System Ljava/lang/System; err\n"},{"op":"delete","value":"virt: 0x000000000000021f phys: 0x000000000000021f java.io.PrintStream Ljava/io/PrintStream; format\n"},{"op":"delete","value":"virt: 0x000000000000033f phys: 0x000000000000033f java.lang.invoke.StringConcatFactory Ljava/lang/invoke/StringConcatFactory; makeConcatWithConstants\n"},{"op":"insert","value":"virt: 0x0000000000000187 phys: 0x0000000000000187 java.lang.StringBuilder Ljava/lang/StringBuilder; <init>\n"},{"op":"insert","value":"virt: 0x0000000000000383 phys: 0x0000000000000383 Main LMain; LMain;.<init>\n"},{"op":"insert","value":"virt: 0x00000000000003ae phys: 0x00000000000003ae Main LMain; LMain;.main\n"},{"op":"insert","value":"virt: 0x0000000000000198 phys: 0x0000000000000198 java.lang.StringBuilder Ljava/lang/StringBuilder; append\n"},{"op":"insert","value":"virt: 0x00000000000001f0 phys: 0x00000000000001f0 java.io.BufferedReader Ljava/io/BufferedReader; close\n"},{"op":"insert","value":"virt: 0x000000000000021b phys: 0x000000000000021b java.lang.System Ljava/lang/System; err\n"},{"op":"insert","value":"virt: 0x0000000000000258 phys: 0x0000000000000258 java.io.PrintStream Ljava/io/PrintStream; format\n"},{"op":"equal","value":"virt: 0x0000000000000039 phys: 0x0000000000000039 java.lang.System Ljava/lang/System; out\n"},{"op":"delete","value":"virt: 0x0000000000000271 phys: 0x0000000000000271 java.lang.Exception Ljava/lang/Exception; printStackTrace\n"},{"op":"insert","value":"virt: 0x00000000000002aa phys: 0x00000000000002aa java.lang.Exception Ljava/lang/Exception; printStackTrace\n"},{"op":"equal","value":"virt: 0x0000000000000088 phys: 0x0000000000000088 java.io.PrintStream Ljava/io/PrintStream; println\n"},{"op":"equal","value":"virt: 0x000000000000013e phys: 0x000000000000013e java.io.BufferedReader Ljava/io/BufferedReader; readLine\n"},{"op":"insert","value":"virt: 0x00000000000001db phys: 0x00000000000001db java.lang.StringBuilder Ljava/lang/StringBuilder; toString\n"}]}]}
EOF
RUN


NAME=rz-diff command with zero argument
FILE==
CMDS=!rz-diff -C -t command bins/java/Main.java.11.class bins/java/Hello.class
EXPECT_ERR=<<EOF
ERROR: rz-diff: error, option -t 'command' requires -0 <command>.
EOF
RUN

NAME=rz-diff command with one argument
FILE==
CMDS=!rz-diff -C -0 javac -t command bins/java/Main.java.11.class bins/java/Main.java.15.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Main.java.15.class
@@ -1,4 +1,4 @@
-Version: (55.0) Java SE 11
+Version: (59.0) Java SE 15
 Flags: (0x0021) public super
 Class: (#57) LMain;
 Super: (#2) java/lang/Object

EOF
RUN

NAME=rz-diff command with one argument JSON
FILE==
CMDS=!rz-diff -C -j -0 javac -t command bins/java/Main.java.11.class bins/java/Main.java.15.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Main.java.15.class","diff":[{"from":[1,4],"to":[1,4],"ops":[{"op":"delete","value":"Version: (55.0) Java SE 11\n"},{"op":"insert","value":"Version: (59.0) Java SE 15\n"},{"op":"equal","value":"Flags: (0x0021) public super\n"},{"op":"equal","value":"Class: (#57) LMain;\n"},{"op":"equal","value":"Super: (#2) java/lang/Object\n"}]}]}
EOF
RUN

NAME=rz-diff command with two arguments
FILE==
CMDS=!rz-diff -C -0 "pi 20 @ main" -1 "pi 20 @ sym.main"  -t command bins/elf/hello_world bins/elf/hello_world32
EXPECT=<<EOF
--- bins/elf/hello_world
+++ bins/elf/hello_world32
@@ -1,20 +1,20 @@
-push rbp
-mov rbp, rsp
-sub rsp, 0x20
-lea rax, str.Hello
-mov qword [rbp - 0x18], rax
-lea rax, str.r2_folks
-mov qword [rbp - 0x10], rax
-mov rax, qword [rbp - 0x18]
-mov rdi, rax
+lea ecx, [esp + 4]
+and esp, 0xfffffff0
+push dword [ecx - 4]
+push ebp
+mov ebp, esp
+push ebx
+push ecx
+sub esp, 0x20
+call sym.__x86.get_pc_thunk.bx
+add ebx, 0x19a0
+lea eax, [ebx - 0x1874]
+mov dword [ebp - 0x1c], eax
+lea eax, [ebx - 0x186e]
+mov dword [ebp - 0x18], eax
+sub esp, 0xc
+push dword [ebp - 0x1c]
 call sym.imp.strlen
-mov dword [rbp - 0x20], eax
-mov rax, qword [rbp - 0x10]
-mov rdi, rax
-call sym.imp.strlen
-mov dword [rbp - 0x1c], eax
-mov edx, dword [rbp - 0x20]
-mov eax, dword [rbp - 0x1c]
-add eax, edx
-add eax, 1
-cdqe
+add esp, 0x10
+mov dword [ebp - 0x14], eax
+sub esp, 0xc

EOF
RUN

NAME=rz-diff command with two arguments JSON
FILE==
CMDS=!rz-diff -C -j -0 "pi 20 @ main" -1 "pi 20 @ sym.main"  -t command bins/elf/hello_world bins/elf/hello_world32
EXPECT=<<EOF
{"from":"bins/elf/hello_world","to":"bins/elf/hello_world32","diff":[{"from":[1,20],"to":[1,20],"ops":[{"op":"delete","value":"push rbp\n"},{"op":"delete","value":"mov rbp, rsp\n"},{"op":"delete","value":"sub rsp, 0x20\n"},{"op":"delete","value":"lea rax, str.Hello\n"},{"op":"delete","value":"mov qword [rbp - 0x18], rax\n"},{"op":"delete","value":"lea rax, str.r2_folks\n"},{"op":"delete","value":"mov qword [rbp - 0x10], rax\n"},{"op":"delete","value":"mov rax, qword [rbp - 0x18]\n"},{"op":"delete","value":"mov rdi, rax\n"},{"op":"insert","value":"lea ecx, [esp + 4]\n"},{"op":"insert","value":"and esp, 0xfffffff0\n"},{"op":"insert","value":"push dword [ecx - 4]\n"},{"op":"insert","value":"push ebp\n"},{"op":"insert","value":"mov ebp, esp\n"},{"op":"insert","value":"push ebx\n"},{"op":"insert","value":"push ecx\n"},{"op":"insert","value":"sub esp, 0x20\n"},{"op":"insert","value":"call sym.__x86.get_pc_thunk.bx\n"},{"op":"insert","value":"add ebx, 0x19a0\n"},{"op":"insert","value":"lea eax, [ebx - 0x1874]\n"},{"op":"insert","value":"mov dword [ebp - 0x1c], eax\n"},{"op":"insert","value":"lea eax, [ebx - 0x186e]\n"},{"op":"insert","value":"mov dword [ebp - 0x18], eax\n"},{"op":"insert","value":"sub esp, 0xc\n"},{"op":"insert","value":"push dword [ebp - 0x1c]\n"},{"op":"equal","value":"call sym.imp.strlen\n"},{"op":"delete","value":"mov dword [rbp - 0x20], eax\n"},{"op":"delete","value":"mov rax, qword [rbp - 0x10]\n"},{"op":"delete","value":"mov rdi, rax\n"},{"op":"delete","value":"call sym.imp.strlen\n"},{"op":"delete","value":"mov dword [rbp - 0x1c], eax\n"},{"op":"delete","value":"mov edx, dword [rbp - 0x20]\n"},{"op":"delete","value":"mov eax, dword [rbp - 0x1c]\n"},{"op":"delete","value":"add eax, edx\n"},{"op":"delete","value":"add eax, 1\n"},{"op":"delete","value":"cdqe\n"},{"op":"insert","value":"add esp, 0x10\n"},{"op":"insert","value":"mov dword [ebp - 0x14], eax\n"},{"op":"insert","value":"sub esp, 0xc\n"}]}]}
EOF
RUN

NAME=rz-diff text lines comparison
FILE=--
CMDS=!rz-diff -Ct lines bins/other/rz-diff/incorrect_cmd_i.txt bins/other/rz-diff/correct_cmd_i.txt
EXPECT=<<EOF
--- bins/other/rz-diff/incorrect_cmd_i.txt
+++ bins/other/rz-diff/correct_cmd_i.txt
@@ -3,40 +3,39 @@
 vaddr      name
 ---------------
 0x00000000 
+0x00600910 .bss
 0x006006e0 .init_array
-ax006006e8 .fini_arrar
-0x006006f0 .jct
-ax006008c8 .got
+0x006006e8 .fini_array
+0x006006f0 .jcr
+0x006008c8 .got
 0x0040031e .gnu.version
 0x004005b4 .fini
-0x00600910 .bss
-000600900 .data
-004005c0 .rodata
+0x00600900 .data
+0x004005c0 .rodata
 0x00400348 .rela.dyn
-0x004003a8 .ini
-x00400260 .gnu.hash
-0x00400200 .interpj
-10x0040021c .note.ABI-tag
+0x004003a8 .init
+0x00400260 .gnu.hash
+0x00400200 .interp
+0x0040021c .note.ABI-tag
 0x00400328 .gnu.version_r
 0x00000000 .comment
 0x0040023c .note.gnu.build-id
 0x006008d0 .got.plt
-0abc4005d0 .eh_frame_hdr
-004002e0 .dynstr
-0d004003d0 .plt
+0x004005d0 .eh_frame_hdr
+0x004002e0 .dynstr
+0x004003d0 .plt
 0x00400360 .rela.plt
 0x00400280 .dynsym
 0x00000000 .debug_abbrev
 0x00000000 .debug_ranges
 0x00000000 .debug_str
-0x00600910 .bss
 0x00000000 .debug_aranges
 0x00400608 .eh_frame
-0x000000000 .debug_line
-0x00000000000 .shstrtab
-000000000 .debug_info
+0x00000000 .debug_line
+0x00000000 .shstrtab
+0x00000000 .debug_info
 0x00400410 .text
 0x006006f8 .dynamic
-0x00000 .strtab
-0x0000000 .symtab
+0x00000000 .strtab
+0x00000000 .symtab
 

EOF
RUN

NAME=rz-diff text lines comparison COLOR
FILE=--
CMDS=!rz-diff -t lines bins/other/rz-diff/incorrect_cmd_i.txt bins/other/rz-diff/correct_cmd_i.txt
EXPECT=<<EOF
--- bins/other/rz-diff/incorrect_cmd_i.txt
+++ bins/other/rz-diff/correct_cmd_i.txt
[94m@@ -3,40 +3,39 @@[0m
 vaddr      name[0m
 ---------------[0m
 0x00000000 [0m
[92m+0x00600910 .bss[0m
 0x006006e0 .init_array[0m
[91m-ax006006e8 .fini_arrar[0m
[91m-0x006006f0 .jc[48;5;52mt[49m[0m
[91m-[48;5;52ma[49mx006008c8 .got[0m
[92m+0x006006e8 .fini_array[0m
[92m+0x006006f0 .jc[48;5;22mr[49m[0m
[92m+[48;5;22m0[49mx006008c8 .got[0m
 0x0040031e .gnu.version[0m
 0x004005b4 .fini[0m
[91m-0x00600910 .bss[0m
[91m-000600900 .data[0m
[91m-004005c0 .rodata[0m
[92m+0x00600900 .data[0m
[92m+0x004005c0 .rodata[0m
 0x00400348 .rela.dyn[0m
[91m-0x004003a8 .ini[48;5;52m[49m[0m
[91m-[48;5;52m[49mx00400260 .gnu.hash[0m
[91m-0x00400200 .interp[48;5;52mj[49m[0m
[91m-[48;5;52m1[49m0x0040021c .note.ABI-tag[0m
[92m+0x004003a8 .ini[48;5;22mt[49m[0m
[92m+[48;5;22m0[49mx00400260 .gnu.hash[0m
[92m+0x00400200 .interp[48;5;22m[49m[0m
[92m+[48;5;22m[49m0x0040021c .note.ABI-tag[0m
 0x00400328 .gnu.version_r[0m
 0x00000000 .comment[0m
 0x0040023c .note.gnu.build-id[0m
 0x006008d0 .got.plt[0m
[91m-0[48;5;52mabc[49m4005d0 .eh_frame_hdr[0m
[91m-0[48;5;52m[49m04002e0 .dynstr[0m
[91m-0[48;5;52md[49m004003d0 .plt[0m
[92m+0[48;5;22mx00[49m4005d0 .eh_frame_hdr[0m
[92m+0[48;5;22mx0[49m04002e0 .dynstr[0m
[92m+0[48;5;22mx[49m004003d0 .plt[0m
 0x00400360 .rela.plt[0m
 0x00400280 .dynsym[0m
 0x00000000 .debug_abbrev[0m
 0x00000000 .debug_ranges[0m
 0x00000000 .debug_str[0m
[91m-0x00600910 .bss[0m
 0x00000000 .debug_aranges[0m
 0x00400608 .eh_frame[0m
[91m-0x00000000[48;5;52m0[49m .debug_line[0m
[91m-0x00000000[48;5;52m000[49m .shstrtab[0m
[91m-0[48;5;52m[49m00000000 .debug_info[0m
[92m+0x00000000[48;5;22m[49m .debug_line[0m
[92m+0x00000000[48;5;22m[49m .shstrtab[0m
[92m+0[48;5;22mx[49m00000000 .debug_info[0m
 0x00400410 .text[0m
 0x006006f8 .dynamic[0m
[91m-0x00000[48;5;52m[49m .strtab[0m
[91m-0x0000000[48;5;52m[49m .symtab[0m
[92m+0x00000[48;5;22m000[49m .strtab[0m
[92m+0x0000000[48;5;22m0[49m .symtab[0m
 [0m

EOF
RUN

NAME=rz-diff functions comparison
FILE==
CMDS=!rz-diff -e 'analysis.fcnprefix=test' -e 'analysis.limits=true' -e 'analysis.from=0x401460' -e 'analysis.to=0x4033d0' -C -t functions bins/other/rz-diff/true bins/other/rz-diff/false
EXPECT=<<EOF
test.00401460   41 0x0000000000401460 | MATCH   (1.000000) | 0x0000000000401470    41 test.00401470
test.00401990  137 0x0000000000401990 | SIMILAR (0.985401) | 0x00000000004019a0   137 test.004019a0
test.00401a20  162 0x0000000000401a20 | MATCH   (1.000000) | 0x0000000000401a30   162 test.00401a30
test.00401ae0  228 0x0000000000401ae0 | SIMILAR (0.964912) | 0x0000000000401af0   228 test.00401af0
test.00401be0 2728 0x0000000000401be0 | SIMILAR (0.991569) | 0x0000000000401bf0  2728 test.00401bf0
test.00402730  425 0x0000000000402730 | SIMILAR (0.971765) | 0x0000000000402740   425 test.00402740
test.004029a0   50 0x00000000004029a0 | SIMILAR (0.980000) | 0x00000000004029b0    50 test.004029b0
test.00402e20  204 0x0000000000402e20 | SIMILAR (0.960784) | 0x0000000000402e30   204 test.00402e30
EOF
RUN
