NAME=Print bytes as C/C++ byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pc @! 30
EXPECT=<<EOF
#define ARRAY_SIZE 30
const uint8_t array[ARRAY_SIZE] = {
  0x80, 0x40, 0x2d, 0xe9, 0x00, 0x70, 0x8d, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x01, 0x00, 0x40, 0xe3,
  0xf1, 0xff, 0xff, 0xeb, 0x00, 0x30, 0xb0, 0xe3, 0x03, 0x00, 0xa0, 0xe1, 0xf1, 0xff
};
EOF
RUN

NAME=Print bytes as C/C++ byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pc
EXPECT=<<EOF
#define ARRAY_SIZE 256
const uint8_t array[ARRAY_SIZE] = {
  0x80, 0x40, 0x2d, 0xe9, 0x00, 0x70, 0x8d, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x01, 0x00, 0x40, 0xe3,
  0xf1, 0xff, 0xff, 0xeb, 0x00, 0x30, 0xb0, 0xe3, 0x03, 0x00, 0xa0, 0xe1, 0xf1, 0xff, 0xff, 0xeb,
  0x80, 0x80, 0xbd, 0xe8, 0x00, 0xf0, 0x20, 0xe3, 0x00, 0xf0, 0x20, 0xe3, 0x00, 0xf0, 0x20, 0xe3,
  0xf2, 0xff, 0xff, 0xeb, 0x00, 0xf0, 0x20, 0xe3, 0x00, 0xf0, 0x20, 0xe3, 0x00, 0xf0, 0x20, 0xe3,
  0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
EOF
RUN

NAME=Print bytes as C/C++ half-word (2 bytes value) array.
FILE=bins/elf/analysis/hello-arm32
CMDS=<<EOF
pch @! 30
pch
pch @! 1
EOF
EXPECT=<<EOF
#define ARRAY_SIZE 15
const uint16_t array[ARRAY_SIZE] = {
  0x4080, 0xe92d, 0x7000, 0xe28d, 0x0200, 0xe300, 0x0001, 0xe340,
  0xfff1, 0xebff, 0x3000, 0xe3b0, 0x0003, 0xe1a0, 0xfff1
};
#define ARRAY_SIZE 128
const uint16_t array[ARRAY_SIZE] = {
  0x4080, 0xe92d, 0x7000, 0xe28d, 0x0200, 0xe300, 0x0001, 0xe340,
  0xfff1, 0xebff, 0x3000, 0xe3b0, 0x0003, 0xe1a0, 0xfff1, 0xebff,
  0x8080, 0xe8bd, 0xf000, 0xe320, 0xf000, 0xe320, 0xf000, 0xe320,
  0xfff2, 0xebff, 0xf000, 0xe320, 0xf000, 0xe320, 0xf000, 0xe320,
  0x6548, 0x6c6c, 0x206f, 0x6f57, 0x6c72, 0x0064, 0x0000, 0x0000,
  0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
  0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
  0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
  0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
  0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
  0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
  0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
  0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
  0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
  0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
  0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
};
// Warning: the number of available bytes is less than 2
EOF
RUN

NAME=Print bytes as C/C++ half-word (2 bytes value) array (big endian).
FILE=bins/elf/analysis/hello-arm32
CMDS=pch @! 30 @e:cfg.bigendian=true
EXPECT=<<EOF
#define ARRAY_SIZE 15
const uint16_t array[ARRAY_SIZE] = {
  0x8040, 0x2de9, 0x0070, 0x8de2, 0x0002, 0x00e3, 0x0100, 0x40e3,
  0xf1ff, 0xffeb, 0x0030, 0xb0e3, 0x0300, 0xa0e1, 0xf1ff
};
EOF
RUN

NAME=Print bytes as C/C++ word (4 bytes value) array.
FILE=bins/elf/analysis/hello-arm32
CMDS=<<EOF
pcw @! 30
pcw @! 3
EOF
EXPECT=<<EOF
#define ARRAY_SIZE 7
const uint32_t array[ARRAY_SIZE] = {
  0xe92d4080u, 0xe28d7000u, 0xe3000200u, 0xe3400001u,
  0xebfffff1u, 0xe3b03000u, 0xe1a00003u
};
// Warning: the number of available bytes is less than 4
EOF
RUN

NAME=Print bytes as C/C++ word (4 bytes value) array (big endian).
FILE=bins/elf/analysis/hello-arm32
CMDS=pcw @! 30 @e:cfg.bigendian=true
EXPECT=<<EOF
#define ARRAY_SIZE 7
const uint32_t array[ARRAY_SIZE] = {
  0x80402de9u, 0x00708de2u, 0x000200e3u, 0x010040e3u,
  0xf1ffffebu, 0x0030b0e3u, 0x0300a0e1u
};
EOF
RUN

NAME=Print bytes as C/C++ double-word (8 bytes value) array.
FILE=bins/elf/analysis/hello-arm32
CMDS=<<EOF
pcd @! 30
pcd @! 7
EOF
EXPECT=<<EOF
#define ARRAY_SIZE 3
const uint64_t array[ARRAY_SIZE] = {
  0xe28d7000e92d4080ull, 0xe3400001e3000200ull,
  0xe3b03000ebfffff1ull
};
// Warning: the number of available bytes is less than 8
EOF
RUN

NAME=Print bytes as C/C++ double-word (8 bytes value) array (big endian).
FILE=bins/elf/analysis/hello-arm32
CMDS=pcd @! 30 @e:cfg.bigendian=true
EXPECT=<<EOF
#define ARRAY_SIZE 3
const uint64_t array[ARRAY_SIZE] = {
  0x80402de900708de2ull, 0x000200e3010040e3ull,
  0xf1ffffeb0030b0e3ull
};
EOF
RUN

NAME=Print bytes as rizin command.
FILE=bins/elf/analysis/hello-arm32
CMDS=pc* @! 30
EXPECT=<<EOF
wx 80402de900708de2000200e3010040e3 ; sd +16
wx f1ffffeb0030b0e30300a0e1f1ff ; sd -30
EOF
RUN

NAME=Print bytes as assembly.
FILE=bins/elf/analysis/hello-arm32
CMDS=pca @! 30
EXPECT=<<EOF
byte_array:
.byte 0x80, 0x40, 0x2d, 0xe9, 0x00, 0x70, 0x8d, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x01, 0x00, 0x40, 0xe3
.byte 0xf1, 0xff, 0xff, 0xeb, 0x00, 0x30, 0xb0, 0xe3, 0x03, 0x00, 0xa0, 0xe1, 0xf1, 0xff
.equ byte_array_len, 30
EOF
RUN

NAME=Print bytes as assembly with instructions in comments.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcA @! 30
EXPECT=<<EOF
sub_0x000101c0:
 .byte 0x80, 0x40, 0x2d, 0xe9  // push {r7, lr}
 .byte 0x00, 0x70, 0x8d, 0xe2  // add r7, sp, 0
 .byte 0x00, 0x02, 0x00, 0xe3  // movw r0, 0x200
 .byte 0x01, 0x00, 0x40, 0xe3  // movt r0, 1
 .byte 0xf1, 0xff, 0xff, 0xeb  // bl 0xffffffcc
 .byte 0x00, 0x30, 0xb0, 0xe3  // movs r3, 0
 .byte 0x03, 0x00, 0xa0, 0xe1  // mov r0, r3
 .byte 0xf1, 0xff  // invalid
.equ shellcode_len, 30
EOF
RUN

NAME=Print bytes as a bash command.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcb @! 30
EXPECT=<<EOF
printf "\200\100\055\351\000\160\215\342\000\002\000\343\001\000\100\343" > data.bin
printf "\361\377\377\353\000\060\260\343\003\000\240\341\361\377" >> data.bin
EOF
RUN

NAME=Print bytes as golang byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcg @! 30
EXPECT=<<EOF
byteArray := []byte{
  0x80, 0x40, 0x2d, 0xe9, 0x00, 0x70, 0x8d, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x01, 0x00, 0x40, 0xe3,
  0xf1, 0xff, 0xff, 0xeb, 0x00, 0x30, 0xb0, 0xe3, 0x03, 0x00, 0xa0, 0xe1, 0xf1, 0xff,
}
EOF
RUN

NAME=Print bytes as Java byte array (uses signed bytes).
FILE=bins/elf/analysis/hello-arm32
CMDS=pcJ @! 30
EXPECT=<<EOF
byte[] byteArray = new byte[] {
  -128,   64,   45,  -23,    0,  112, -115,  -30,    0,    2,    0,  -29,    1,    0,   64,  -29,
   -15,   -1,   -1,  -21,    0,   48,  -80,  -29,    3,    0,  -96,  -31,  -15,   -1,
};
EOF
RUN

NAME=Print bytes as json byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcj @! 30
EXPECT=<<EOF
[128,64,45,233,0,112,141,226,0,2,0,227,1,0,64,227,241,255,255,235,0,48,176,227,3,0,160,225,241,255]
EOF
RUN

NAME=Print bytes as Kotlin byte array (uses signed bytes).
FILE=bins/elf/analysis/hello-arm32
CMDS=pck @! 30
EXPECT=<<EOF
val byteArray = byteArrayOf(
  -128,   64,   45,  -23,    0,  112, -115,  -30,    0,    2,    0,  -29,    1,    0,   64,  -29,
   -15,   -1,   -1,  -21,    0,   48,  -80,  -29,    3,    0,  -96,  -31,  -15,   -1,
);
EOF
RUN

NAME=Print bytes as NodeJS buffer.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcn @! 30
EXPECT=<<EOF
var byteArray = new Buffer('gEAt6QBwjeIAAgDjAQBA4/H//+sAMLDjAwCg4fH/', 'base64');
EOF
RUN

NAME=Print bytes as Objective-C/C++ byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pco @! 30
EXPECT=<<EOF
NSData *byteArray = [[NSData alloc] initWithBytes:{
  0x80, 0x40, 0x2d, 0xe9, 0x00, 0x70, 0x8d, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x01, 0x00, 0x40, 0xe3,
  0xf1, 0xff, 0xff, 0xeb, 0x00, 0x30, 0xb0, 0xe3, 0x03, 0x00, 0xa0, 0xe1, 0xf1, 0xff
}];
EOF
RUN

NAME=Print bytes as Python byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcp @! 30
EXPECT=<<EOF
byteArray = b'\x80\x40\x2d\xe9\x00\x70\x8d\xe2\x00\x02\x00\xe3\x01\x00\x40\xe3'
byteArray += b'\xf1\xff\xff\xeb\x00\x30\xb0\xe3\x03\x00\xa0\xe1\xf1\xff'
EOF
RUN

NAME=Print bytes as Rust byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcr @! 30
EXPECT=<<EOF
let _: [u8; 30] = [
  0x80, 0x40, 0x2d, 0xe9, 0x00, 0x70, 0x8d, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x01, 0x00, 0x40, 0xe3,
  0xf1, 0xff, 0xff, 0xeb, 0x00, 0x30, 0xb0, 0xe3, 0x03, 0x00, 0xa0, 0xe1, 0xf1, 0xff
];
EOF
RUN

NAME=Print bytes as Swift byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcs @! 30
EXPECT=<<EOF
let byteArray : [UInt8] = [
  0x80, 0x40, 0x2d, 0xe9, 0x00, 0x70, 0x8d, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x01, 0x00, 0x40, 0xe3,
  0xf1, 0xff, 0xff, 0xeb, 0x00, 0x30, 0xb0, 0xe3, 0x03, 0x00, 0xa0, 0xe1, 0xf1, 0xff
];
EOF
RUN

NAME=Print bytes as Yara byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcy @! 30
EXPECT=<<EOF
$byteArray = {
  80 40 2d e9 00 70 8d e2 00 02 00 e3 01 00 40 e3
  f1 ff ff eb 00 30 b0 e3 03 00 a0 e1 f1 ff
};
EOF
RUN

NAME=Print bytes as n-size C/C++ byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pc 30
EXPECT=<<EOF
#define ARRAY_SIZE 30
const uint8_t array[ARRAY_SIZE] = {
  0x80, 0x40, 0x2d, 0xe9, 0x00, 0x70, 0x8d, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x01, 0x00, 0x40, 0xe3,
  0xf1, 0xff, 0xff, 0xeb, 0x00, 0x30, 0xb0, 0xe3, 0x03, 0x00, 0xa0, 0xe1, 0xf1, 0xff
};
EOF
RUN

NAME=Print bytes as rizin command.
FILE=bins/elf/analysis/hello-arm32
CMDS=pc* 30
EXPECT=<<EOF
wx 80402de900708de2000200e3010040e3 ; sd +16
wx f1ffffeb0030b0e30300a0e1f1ff ; sd -30
EOF
RUN

NAME=Print bytes as assembly.
FILE=bins/elf/analysis/hello-arm32
CMDS=pca 30
EXPECT=<<EOF
byte_array:
.byte 0x80, 0x40, 0x2d, 0xe9, 0x00, 0x70, 0x8d, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x01, 0x00, 0x40, 0xe3
.byte 0xf1, 0xff, 0xff, 0xeb, 0x00, 0x30, 0xb0, 0xe3, 0x03, 0x00, 0xa0, 0xe1, 0xf1, 0xff
.equ byte_array_len, 30
EOF
RUN

NAME=Print bytes as assembly with instructions in comments.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcA 30
EXPECT=<<EOF
sub_0x000101c0:
 .byte 0x80, 0x40, 0x2d, 0xe9  // push {r7, lr}
 .byte 0x00, 0x70, 0x8d, 0xe2  // add r7, sp, 0
 .byte 0x00, 0x02, 0x00, 0xe3  // movw r0, 0x200
 .byte 0x01, 0x00, 0x40, 0xe3  // movt r0, 1
 .byte 0xf1, 0xff, 0xff, 0xeb  // bl 0xffffffcc
 .byte 0x00, 0x30, 0xb0, 0xe3  // movs r3, 0
 .byte 0x03, 0x00, 0xa0, 0xe1  // mov r0, r3
 .byte 0xf1, 0xff  // invalid
.equ shellcode_len, 30
EOF
RUN

NAME=Print bytes as a bash command.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcb 30
EXPECT=<<EOF
printf "\200\100\055\351\000\160\215\342\000\002\000\343\001\000\100\343" > data.bin
printf "\361\377\377\353\000\060\260\343\003\000\240\341\361\377" >> data.bin
EOF
RUN

NAME=Print bytes as golang byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcg 30
EXPECT=<<EOF
byteArray := []byte{
  0x80, 0x40, 0x2d, 0xe9, 0x00, 0x70, 0x8d, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x01, 0x00, 0x40, 0xe3,
  0xf1, 0xff, 0xff, 0xeb, 0x00, 0x30, 0xb0, 0xe3, 0x03, 0x00, 0xa0, 0xe1, 0xf1, 0xff,
}
EOF
RUN

NAME=Print bytes as Java byte array (uses signed bytes).
FILE=bins/elf/analysis/hello-arm32
CMDS=pcJ 30
EXPECT=<<EOF
byte[] byteArray = new byte[] {
  -128,   64,   45,  -23,    0,  112, -115,  -30,    0,    2,    0,  -29,    1,    0,   64,  -29,
   -15,   -1,   -1,  -21,    0,   48,  -80,  -29,    3,    0,  -96,  -31,  -15,   -1,
};
EOF
RUN

NAME=Print bytes as json byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcj 30
EXPECT=<<EOF
[128,64,45,233,0,112,141,226,0,2,0,227,1,0,64,227,241,255,255,235,0,48,176,227,3,0,160,225,241,255]
EOF
RUN

NAME=Print bytes as Kotlin byte array (uses signed bytes).
FILE=bins/elf/analysis/hello-arm32
CMDS=pck 30
EXPECT=<<EOF
val byteArray = byteArrayOf(
  -128,   64,   45,  -23,    0,  112, -115,  -30,    0,    2,    0,  -29,    1,    0,   64,  -29,
   -15,   -1,   -1,  -21,    0,   48,  -80,  -29,    3,    0,  -96,  -31,  -15,   -1,
);
EOF
RUN

NAME=Print bytes as NodeJS buffer.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcn 30
EXPECT=<<EOF
var byteArray = new Buffer('gEAt6QBwjeIAAgDjAQBA4/H//+sAMLDjAwCg4fH/', 'base64');
EOF
RUN

NAME=Print bytes as Objective-C/C++ byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pco 30
EXPECT=<<EOF
NSData *byteArray = [[NSData alloc] initWithBytes:{
  0x80, 0x40, 0x2d, 0xe9, 0x00, 0x70, 0x8d, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x01, 0x00, 0x40, 0xe3,
  0xf1, 0xff, 0xff, 0xeb, 0x00, 0x30, 0xb0, 0xe3, 0x03, 0x00, 0xa0, 0xe1, 0xf1, 0xff
}];
EOF
RUN

NAME=Print bytes as Python byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcp 30
EXPECT=<<EOF
byteArray = b'\x80\x40\x2d\xe9\x00\x70\x8d\xe2\x00\x02\x00\xe3\x01\x00\x40\xe3'
byteArray += b'\xf1\xff\xff\xeb\x00\x30\xb0\xe3\x03\x00\xa0\xe1\xf1\xff'
EOF
RUN

NAME=Print bytes as Rust byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcr 30
EXPECT=<<EOF
let _: [u8; 30] = [
  0x80, 0x40, 0x2d, 0xe9, 0x00, 0x70, 0x8d, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x01, 0x00, 0x40, 0xe3,
  0xf1, 0xff, 0xff, 0xeb, 0x00, 0x30, 0xb0, 0xe3, 0x03, 0x00, 0xa0, 0xe1, 0xf1, 0xff
];
EOF
RUN

NAME=Print bytes as Swift byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcs 30
EXPECT=<<EOF
let byteArray : [UInt8] = [
  0x80, 0x40, 0x2d, 0xe9, 0x00, 0x70, 0x8d, 0xe2, 0x00, 0x02, 0x00, 0xe3, 0x01, 0x00, 0x40, 0xe3,
  0xf1, 0xff, 0xff, 0xeb, 0x00, 0x30, 0xb0, 0xe3, 0x03, 0x00, 0xa0, 0xe1, 0xf1, 0xff
];
EOF
RUN

NAME=Print bytes as Yara byte array.
FILE=bins/elf/analysis/hello-arm32
CMDS=pcy 30
EXPECT=<<EOF
$byteArray = {
  80 40 2d e9 00 70 8d e2 00 02 00 e3 01 00 40 e3
  f1 ff ff eb 00 30 b0 e3 03 00 a0 e1 f1 ff
};
EOF
RUN

