NAME=ps+ libc++ 32bit
FILE=bins/elf/stdstring32-libc++.LOAD1
ARGS=-n -m 0x08049ee8
CMDS=<<EOF
on bins/elf/stdstring32-libc++.heap 0x09eb8000 > /dev/null
f obj.empty_str 12 @ 0x0804a064
f obj.long_str1 12 @ 0x0804a04c
f obj.short_str1 12 @ 0x0804a034
f obj.long_str2 12 @ 0x0804a058
f obj.short_str2 12 @ 0x0804a040
e asm.bits=32
e str.encoding=utf8
ps+ @ obj.short_str1
ps+ @ obj.short_str2
ps+ @ obj.empty_str
ps+ @ obj.long_str1
ps+ @ obj.long_str2
EOF
EXPECT=<<EOF
a
abcdefghij
abcdefghijk
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
EOF
RUN

NAME=ps+ libc++ 64bit
FILE=bins/elf/stdstring64-libc++.LOAD1
ARGS=-n -m 0x00600dc8
CMDS=<<EOF
on bins/elf/stdstring64-libc++.heap 0x0128b000 > /dev/null
f obj.empty_str 24 @ 0x006010b8
f obj.long_str1 24 @ 0x00601088
f obj.short_str1 24 @ 0x00601058
f obj.long_str2 24 @ 0x006010a0
f obj.short_str2 24 @ 0x00601070
e asm.bits=64
e str.encoding=utf8
ps+ @ obj.short_str1
ps+ @ obj.short_str2
ps+ @ obj.empty_str
ps+ @ obj.long_str1
ps+ @ obj.long_str2
EOF
EXPECT=<<EOF
a
abcdefghijklmnopqrstuv
abcdefghijklmnopqrstuvw
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
EOF
RUN

NAME=psn escapes newlines (#10037)
FILE==
CMDS=<<EOF
wz abc\n123\n
psn @! 9
EOF
EXPECT=<<EOF
abc\x0a123\x0a\x00
EOF
RUN

NAME=ps N and initial nulls (#10037)
FILE==
CMDS=<<EOF
ps guess block @! 1
ps guess block @! 2
ps guess block @! 3
ps guess block @! 4
ps guess block @! 8
EOF
EXPECT=<<EOF
\x00
\x00\x00
\x00\x00\x00
\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00
EOF
RUN

NAME=ps+ libc++ 16bit error
FILE==
CMDS=<<EOF
e asm.arch=x86
e asm.bits=16
f obj.empty_str 12 @ 0x0804a064
ps+ @ obj.empty_str
EOF
EXPECT_ERR=<<EOF
ERROR: core: 16 bits are not supported by ps+
EOF
RUN

NAME=psc define C C++ string
FILE==
CMDS=<<EOF
wx 90919241424322
psc @! 7
EOF
EXPECT=<<EOF
#define STRING_SIZE 7
const char s[STRING_SIZE] = "\x90\x91\x92\x41\x42\x43\x22";
EOF
RUN

NAME=psc define C C++ multiline string
FILE==
CMDS=<<EOF
wx 909192414243229091924142432290919241424322
psc @! 21
EOF
EXPECT=<<EOF
#define STRING_SIZE 21
const char s[STRING_SIZE] = "\x90\x91\x92\x41\x42\x43\x22\x90\x91\x92\x41\x42\x43\x22\x90\x91"
                            "\x92\x41\x42\x43\x22";
EOF
RUN

NAME=ps ascii detection with block/zero-terminated
FILE==
CMDS=<<EOF
o malloc://512
wx 4a757374206c696b652070696e656170 ; sd +16
wx 706c65206f6e2070697a7a612c207468 ; sd +16
wx 6973207461736b2f7468726561642070 ; sd +16
wx 6f727420646f65736e27742062656c6f ; sd +16
wx 6e6720686572652e204025733a256400 ; sd +16
wx 636f6d2e6170706c652e707269766174 ; sd +16
wx 652e7461736b5f706f6c696379007374 ; sd +16
wx 72616e6765207461736b20666c61766f ; sd +16
wx 72204025733a25640075736572737061 ; sd +16
wx 63652068617320636f6e74726f6c2061 ; sd +16
wx 636365737320746f2061206b65726e65 ; sd +16
wx 6c206d6170202570207468726f756768 ; sd +16
wx 207461736b202570204025733a256400 ; sd +16
wx 737472616e6765207468726561642066 ; sd +16
wx 6c61766f72204025733a256400736861 ; sd +16
wx 7265642e00646174612e007368617265 ; sd -256

ps guess block
echo \n
ps guess null
EOF
EXPECT=<<EOF
Just like pineapple on pizza, this task/thread port doesn't belong here. @%s:%d\x00com.apple.private.task_policy\x00strange task flavor @%s:%d\x00userspace has control access to a kernel map %p through task %p @%s:%d\x00strange thread flavor @%s:%d\x00shared.\x00data.\x00share


Just like pineapple on pizza, this task/thread port doesn't belong here. @%s:%d
EOF
RUN

NAME=Error case str.encoding
FILE==
CMDS=<<EOF
e str.encoding=settings
EOF
EXPECT_ERR=<<EOF
ERROR: Invalid value for str.encoding (settings).
EOF
RUN

NAME=str.encoding
FILE=bins/cmd/search/string_encodings/Japanese-Katakana-Lipsum.ibm290
CMDS=<<EOF
e str.encoding=ibm290
ps
ps settings
EOF
EXPECT=<<EOF
 。「」、・ヲァィゥ£.<(+|&ェォャュョッー!¥*);¬アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフ¯ヘホマミムメモヤユヨラリルレロワン゛゜゜
 。「」、・ヲァィゥ£.<(+|&ェォャュョッー!¥*);¬アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフ¯ヘホマミムメモヤユヨラリルレロワン゛゜゜
EOF
EXPECT_ERR=
RUN

NAME=ps select encoding
FILE=bins/cmd/search/string_encodings/Latin-Lipsum.ebcdic_es
CMDS=<<EOF
b 0x1000
ps ebcdices unprintable
EOF
EXPECT=<<EOF
Lorem ipsum dolor sit amet, at eligendi adipisci ius, ex natum appetere officiis has, nibh quas torquatos pro te. Quo at deleniti repudiandae, et oratio pertinacia ullamcorper quo. Per ut stet assum augue, brute pertinacia pri id. Sed omnium oblique placerat ut, eu etiam vitae nam. Per invenire expetenda dissentiet id, ea alia nostrud detraxit est, est eros intellegebat et.
EOF
RUN

NAME=Issue #4697 and Unicode update
FILE==
CMDS=<<EOF
wx f09f9faaf09f9faa
ps
EOF
EXPECT=<<EOF
🟪🟪
EOF
RUN
