NAME=wen 3
FILE=malloc://100
CMDS=<<EOF
r
wen 3
r
EOF
EXPECT=<<EOF
100
103
EOF
RUN

NAME=wen 3 writable bin
FILE=--
CMDS=<<EOF
mkdir .tmp
cp bins/mach0/mac-ls2 .tmp/ls-wen
o .tmp/ls-wen
r
wen 3
r
oo+
r
wen 3
r
rm .tmp/ls-wen
EOF
EXPECT=<<EOF
38704
38704
38704
38707
EOF
RUN

NAME=wen 3 in readonly bin
FILE=bins/mach0/mac-ls2
CMDS=<<EOF
# cannot resize in va and non-write mode
r
wen 3
r
EOF
EXPECT=<<EOF
38704
38704
EOF
RUN

NAME=quoted comments bug
FILE=malloc://1024
CMDS=<<EOF
"w hello # world"
ps
EOF
EXPECT=<<EOF
hello # world
EOF
RUN

NAME=labels replacements (common prefix)
FILE=malloc://1024
BROKEN=1
CMDS=<<EOF
e asm.arch=x86
e asm.bits=32
waf bins/other/asm/multiline_prefix.asm
p8 7@0
EOF
EXPECT=<<EOF
9090e8fbffffff
EOF
RUN


NAME=wa
FILE=malloc://1024
ARGS=-a x86 -b 32
CMDS=<<EOF
"wa nop;mov eax,33"
e asm.profile=simple
pi 2
EOF
EXPECT=<<EOF
nop
mov eax, 0x21
EOF
RUN

NAME=wa je 0x33
FILE=malloc://1024
ARGS=-a x86 -b 32
CMDS=<<EOF
wa je 0x33 @ 0x10
pi 1 @ 0x10
EOF
EXPECT=<<EOF
je 0x33
EOF
RUN

# wao : modify operation of current opcode
NAME=wao nop (x86)
FILE=malloc://1024
ARGS=-a x86 -b 64 -e io.cache=1
CMDS=<<EOF
wx 31ed4989d15e4889e24883e4f0
pi 5
wao nop
pi 3
EOF
EXPECT=<<EOF
xor ebp, ebp
mov r9, rdx
pop rsi
mov rdx, rsp
and rsp, 0xfffffffffffffff0
nop
nop
mov r9, rdx
EOF
RUN

# wao : modify operation of current opcode
NAME=wao trap (x86)
FILE=malloc://1024
ARGS=-a x86 -b 64 -e io.cache=1
CMDS=<<EOF
wx 31ed4989d15e4889e24883e4f0
pi 5
wao trap
pi 3
EOF
EXPECT=<<EOF
xor ebp, ebp
mov r9, rdx
pop rsi
mov rdx, rsp
and rsp, 0xfffffffffffffff0
int3
in eax, dx
mov r9, rdx
EOF
RUN

# wao : modify operation of current opcode, on ARM
NAME=wao nop (arm)
FILE=malloc://1024
ARGS=-a arm -b 32 -e io.cache=1
CMDS=<<EOF
wx 24c09fe500b0a0e304109de40d20a0e1
pi 4
wao nop
pi 3
EOF
EXPECT=<<EOF
ldr ip, [0x0000002c]
mov fp, 0
pop {r1}
mov r2, sp
mov r0, r0
mov fp, 0
pop {r1}
EOF
RUN

# wao : modify operation of current opcode, on ARM
NAME=wao trap (arm)
FILE=malloc://1024
ARGS=-a arm -b 32 -e io.cache=1
CMDS=<<EOF
wx 24c09fe500b0a0e304109de40d20a0e1
pi 4
wao trap
pi 3
EOF
EXPECT=<<EOF
ldr ip, [0x0000002c]
mov fp, 0
pop {r1}
mov r2, sp
trap
mov fp, 0
pop {r1}
EOF
RUN


## "wx" - write hex value

# Writing of bytes.
NAME=wx
FILE=malloc://1024
CMDS=<<EOF
wx 010203
p8 3
EOF
EXPECT=<<EOF
010203
EOF
RUN

## "wxf" - write hex pairs from file

NAME=wxf
FILE=malloc://1024
CMDS=<<EOF
wxf bins/other/hexpairs
p8 4
EOF
EXPECT=<<EOF
de4db33f
EOF
RUN

## "wo" - write in block with operation

# Batch adding to bytes works (bug report #59).
NAME=wo
FILE=malloc://8
ARGS=-w
CMDS=<<EOF
wx 0001020304050607
woa 01 @ 0!8
p8 8
woa 01 @ 0!8
p8 8
EOF
EXPECT=<<EOF
0102030405060708
0203040506070809
EOF
RUN

## "wt" - write to file

# see bug #503
NAME=wt
FILE=-
#bins/pe/b.exe
CMDS=<<EOF
wt a_piece_of_ls_saved_to_PWD 0x400
ls -l a_piece_of_ls_saved_to_PWD~[3]
rm a_piece_of_ls_saved_to_PWD
EOF
EXPECT=<<EOF
1024
EOF
EXPECT_ERR=<<EOF
INFO: Dumped 1024 bytes from 0x00000000 into a_piece_of_ls_saved_to_PWD
EOF
RUN

NAME=endian tests: wv
FILE=-
CMDS=<<EOF
e cfg.bigendian=false
e asm.bits=32
wv4 3
p8 4
e cfg.bigendian=true
wv4 3
p8 4
EOF
EXPECT=<<EOF
03000000
00000003
EOF
RUN

NAME=wv endian
FILE=malloc://1024
CMDS=<<EOF
e cfg.bigendian=false
wv4 0x1234
p8 2
wv4 0x12345678
p8 4
EOF
EXPECT=<<EOF
3412
78563412
EOF
RUN

NAME=wx 0x should behave like wv? imho nope
FILE=malloc://1024
BROKEN=1
CMDS=<<EOF
e cfg.bigendian=false
wx 0x1234
p8 2
wx 0x12345678
p8 4
EOF
EXPECT=<<EOF
3412
78563412
EOF
RUN

NAME=wci should commit the changes to the file
FILE=malloc://1024
BROKEN=1
CMDS=<<EOF
!rm -rf .tmp
mkdir .tmp
cp -f bins/pe/b.exe .tmp/.b.exe.orig
cp -f bins/pe/b.exe .tmp/.b.exe.new
e io.cache=true
o+ .tmp/.b.exe.new
wx ff
wci
e.src.null=true
!!radiff2 .tmp/.b.exe.orig .tmp/.b.exe.new
EOF
EXPECT=<<EOF
File size
EOF
RUN

NAME=wci should commit all the changes
FILE=malloc://512
CMDS=<<EOF
e io.cache=true
(wxseek ;  wx 909090;  s+ 3)
3.(wxseek)
wci
wc
EOF
EXPECT=<<EOF
idx=0 addr=0x00000000 size=3 000000 -> 909090 (written)
idx=1 addr=0x00000003 size=3 000000 -> 909090 (written)
idx=2 addr=0x00000006 size=3 000000 -> 909090 (written)
EOF
RUN

NAME=wcu should undo last change
FILE=malloc://512
CMDS=<<EOF
e io.cache=true
wx 11
s+ 1
wx 22
s+ 1
wx 33
wcu
wc
EOF
EXPECT=<<EOF
idx=0 addr=0x00000000 size=1 00 -> 11 (not written)
idx=1 addr=0x00000001 size=1 00 -> 22 (not written)
EOF
RUN

NAME=wcf should commit all the changes to a file
FILE=bins/lua/hello.lua
CMDS=<<EOF
e io.cache=true
rm .tmp_file
s 0x0000002B
wx 7272
wcf .tmp_file
cat .tmp_file
rm .tmp_file
EOF
EXPECT=<<EOF
local c = 0

function hello(msg)
	print("Herro "..msg)
	c = c + 1
end

hello("World")
hello(c)
hello(c)
EOF
RUN

NAME=wx pcache
FILE=bins/pe/b.exe

CMDS=<<EOF

e io.va=0
e io.pcache=true
s 0
ps 2
wx 9090
p8 2
e io.pcache=0
s +1
s 0
ps 2
EOF
EXPECT=<<EOF
MZ
9090
MZ
EOF
RUN

NAME=w octal esc
FILE=malloc://16
CMDS=<<EOF
w 0123456789abcde
w a\57b\0
w 1\0532\0 @ 0x4
w 0\1741\0 @ 0x8
ps
ps @ 0x4
ps @ 0x8
EOF
EXPECT=<<EOF
a/b
1+2
0|1
EOF
RUN

## "wen" - insert null bytes

NAME=wen
FILE=malloc://4
CMDS=<<EOF
omt 1
wx 01020304
wen 2 @ 1
wen 1 @ 6
p8 7
EOF
EXPECT=<<EOF
01000002030400
EOF
RUN

NAME=wen should insert X null bytes even if io.cache=false
FILE=--
CMDS=<<EOF
cp bins/pe/b.exe .b.exe
o+ .b.exe
r
s 0x200
wen 1
r
rm .b.exe
EOF
EXPECT=<<EOF
216607
216608
EOF
RUN

## wx+: write hex and seek

FILE=malloc://1024
NAME=data written after multiple wx+
CMDS=<<EOF
2 wx+ 9090 @ 8
x 16 @ 0
EOF
EXPECT=<<EOF
- offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF
0x00000000  0000 0000 0000 0000 9090 9090 0000 0000  ................
EOF
RUN

FILE=malloc://1024
NAME=address after wx+ at tmpseek
CMDS=<<EOF
2 wx+ 9090 @ 8
?vi $$
EOF
EXPECT=<<EOF
0
EOF
RUN

NAME=wz esc seqs
FILE=-
CMDS=<<EOF
e str.escbslash=true
wz \a\b\t\n\v\f\r\e\\\x40\7\15\176
izz~0x0
px 16~0x0
EOF
EXPECT=<<EOF
0   0x00000000 0x00000000 13  14           ascii \a\b\t\n\v\f\r\e\\@\a\r~
0x00000000  0708 090a 0b0c 0d1b 5c40 070d 7e00 0000  ........\@..~...
EOF
RUN

NAME=wao recj on arm64
FILE=-
ARGS=-a arm -b64
CMDS=<<EOF
e io.cache=true
wx+e01c0034
wx+4c000054
s 0
pd 2
wao recj @ 0
wao recj @ 4
?e --
pd 2
EOF
EXPECT=<<EOF
        ,=< 0x00000000      e01c0034       cbz w0, 0x39c
       ,==< 0x00000004      4c000054       b.gt 0xc
--
        ,=< 0x00000000      e01c0035       cbnz w0, 0x39c
       ,==< 0x00000004      4d000054       b.le 0xc
EOF
RUN

NAME=wao+
FILE=-
ARGS=-a x86 -b 32
CMDS=<<EOF
3wao+nop
s 0
pi 3@0
EOF
EXPECT=<<EOF
nop
nop
nop
EOF
RUN

NAME=wao+2
# BROKEN=1
FILE=-
ARGS=-a x86 -b 32
CMDS=<<EOF
3(;wao+nop)()
pi 3@0
EOF
EXPECT=<<EOF
nop
nop
nop
EOF
RUN

NAME=wao+3
BROKEN=1
FILE=-
ARGS=-a x86 -b 32
CMDS=<<EOF
3wao+nop@0
pi 3@0
EOF
EXPECT=<<EOF
nop
nop
nop
EOF
RUN
