%hookf(FILE *, "fopen", const char *path, const char *mode) {
NSLog(@"Hey, we're hooking fopen to deny relative paths!");
if (path[0] != '/') {
return NULL;
}
return %orig; // Call the original implementation of this function
}
./lexis.pl tests/hookf.xm --outputFormat=json
"%"
"hookf"
(
"FILE"
"*"
","
"""
"fopen"
"""
","
"const"
"char"
"*"
"path"
","
"const"
"char"
"*"
"mode"
)
{
"NSLog"
(
"@"
"""
"Hey"
","
"we"
"'"
"re"
"hooking"
"fopen"
"to"
"deny"
"relative"
"paths"
"!"
"""
)
";"
"if"
(
"path"
[
"0"
]
"!"
"="
"'"
"/"
"'"
)
{
"return"
"NULL"
";"
}
"return"
"%"
"orig"
";"
"/"
"/"
"Call"
"the"
"original"
"implementation"
"of"
"this"
"function"
}
./lexis.pl tests/hookf.xm --outputFormat=xml
<Core::Node=HASH(0x7f85541b1348) position(O:L:C)=�[34m0000:0000:0000�[m type=�[33mmod �[m text="%">
<Core::Node=HASH(0x7f85541b1360) position(O:L:C)=�[34m0001:0000:0001�[m type=�[33mlabel�[m text="hookf">
<Core::Node=HASH(0x7f85541bd748) position(O:L:C)=�[34m0006:0000:0006�[m type=�[33mcontainer�[m nodes=(
<Core::Node=HASH(0x7f85541bfb08) position(O:L:C)=�[34m0007:0000:0007�[m type=�[33mlabel�[m text="FILE">
<Core::Node=HASH(0x7f85541b7fb0) position(O:L:C)=�[34m0011:0000:0011�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541b7fc8) position(O:L:C)=�[34m0012:0000:0012�[m type=�[33mprod �[m text="*">
<Core::Node=HASH(0x7f85541b80e8) position(O:L:C)=�[34m0013:0000:0013�[m type=�[33mdel �[m text=",">
<Core::Node=HASH(0x7f85541b81c0) position(O:L:C)=�[34m0014:0000:0014�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541b8220) position(O:L:C)=�[34m0015:0000:0015�[m type=�[33mstring�[m text=""">
<Core::Node=HASH(0x7f85541b82c8) position(O:L:C)=�[34m0016:0000:0016�[m type=�[33mlabel�[m text="fopen">
<Core::Node=HASH(0x7f85541bfbb0) position(O:L:C)=�[34m0021:0000:0021�[m type=�[33mstring�[m text=""">
<Core::Node=HASH(0x7f85541b8508) position(O:L:C)=�[34m0022:0000:0022�[m type=�[33mdel �[m text=",">
<Core::Node=HASH(0x7f85541bfc10) position(O:L:C)=�[34m0023:0000:0023�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541bfc40) position(O:L:C)=�[34m0024:0000:0024�[m type=�[33mlabel�[m text="const">
<Core::Node=HASH(0x7f85541b8a60) position(O:L:C)=�[34m0029:0000:0029�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541b8b08) position(O:L:C)=�[34m0030:0000:0030�[m type=�[33mlabel�[m text="char">
<Core::Node=HASH(0x7f85541b8be0) position(O:L:C)=�[34m0034:0000:0034�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541b8c40) position(O:L:C)=�[34m0035:0000:0035�[m type=�[33mprod �[m text="*">
<Core::Node=HASH(0x7f85541b8ce8) position(O:L:C)=�[34m0036:0000:0036�[m type=�[33mlabel�[m text="path">
<Core::Node=HASH(0x7f85541b9f68) position(O:L:C)=�[34m0040:0000:0040�[m type=�[33mdel �[m text=",">
<Core::Node=HASH(0x7f85541b9fc8) position(O:L:C)=�[34m0041:0000:0041�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541ba070) position(O:L:C)=�[34m0042:0000:0042�[m type=�[33mlabel�[m text="const">
<Core::Node=HASH(0x7f85541bfe68) position(O:L:C)=�[34m0047:0000:0047�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541ba4a8) position(O:L:C)=�[34m0048:0000:0048�[m type=�[33mlabel�[m text="char">
<Core::Node=HASH(0x7f85541ba550) position(O:L:C)=�[34m0052:0000:0052�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541ba6e8) position(O:L:C)=�[34m0053:0000:0053�[m type=�[33mprod �[m text="*">
<Core::Node=HASH(0x7f85541ba790) position(O:L:C)=�[34m0054:0000:0054�[m type=�[33mlabel�[m text="mode">
)>
<Core::Node=HASH(0x7f85541b3cd8) position(O:L:C)=�[34m0059:0000:0059�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541b3fc0) position(O:L:C)=�[34m0060:0000:0060�[m type=�[33mcontainer�[m nodes={
<Core::Node=HASH(0x7f85541c0798) position(O:L:C)=�[34m0061:0000:0061�[m type=�[33mcr �[m text=\n>
<Core::Node=HASH(0x7f85541c08d0) position(O:L:C)=�[34m0062:0001:0000�[m type=�[33mspace�[m text=\t>
<Core::Node=HASH(0x7f85541c0960) position(O:L:C)=�[34m0063:0001:0001�[m type=�[33mlabel�[m text="NSLog">
<Core::Node=HASH(0x7f85541c0978) position(O:L:C)=�[34m0068:0001:0006�[m type=�[33mcontainer�[m nodes=(
<Core::Node=HASH(0x7f85541c8b08) position(O:L:C)=�[34m0069:0001:0007�[m type=�[33melse �[m text="@">
<Core::Node=HASH(0x7f85541c8b20) position(O:L:C)=�[34m0070:0001:0008�[m type=�[33mstring�[m text=""">
<Core::Node=HASH(0x7f85541c8b38) position(O:L:C)=�[34m0071:0001:0009�[m type=�[33mlabel�[m text="Hey">
<Core::Node=HASH(0x7f85541c8be0) position(O:L:C)=�[34m0074:0001:0012�[m type=�[33mdel �[m text=",">
<Core::Node=HASH(0x7f85541c8c88) position(O:L:C)=�[34m0075:0001:0013�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c8d30) position(O:L:C)=�[34m0076:0001:0014�[m type=�[33mlabel�[m text="we">
<Core::Node=HASH(0x7f85541c8dd8) position(O:L:C)=�[34m0078:0001:0016�[m type=�[33mchar �[m text="'">
<Core::Node=HASH(0x7f85541c8e80) position(O:L:C)=�[34m0079:0001:0017�[m type=�[33mlabel�[m text="re">
<Core::Node=HASH(0x7f85541c8f28) position(O:L:C)=�[34m0081:0001:0019�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c8fd0) position(O:L:C)=�[34m0082:0001:0020�[m type=�[33mlabel�[m text="hooking">
<Core::Node=HASH(0x7f85541c9078) position(O:L:C)=�[34m0089:0001:0027�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c9120) position(O:L:C)=�[34m0090:0001:0028�[m type=�[33mlabel�[m text="fopen">
<Core::Node=HASH(0x7f85541c91c8) position(O:L:C)=�[34m0095:0001:0033�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c9270) position(O:L:C)=�[34m0096:0001:0034�[m type=�[33mlabel�[m text="to">
<Core::Node=HASH(0x7f85541c9318) position(O:L:C)=�[34m0098:0001:0036�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c93c0) position(O:L:C)=�[34m0099:0001:0037�[m type=�[33mlabel�[m text="deny">
<Core::Node=HASH(0x7f85541c9468) position(O:L:C)=�[34m0103:0001:0041�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c9510) position(O:L:C)=�[34m0104:0001:0042�[m type=�[33mlabel�[m text="relative">
<Core::Node=HASH(0x7f85541c95b8) position(O:L:C)=�[34m0112:0001:0050�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c9660) position(O:L:C)=�[34m0113:0001:0051�[m type=�[33mlabel�[m text="paths">
<Core::Node=HASH(0x7f85541c9708) position(O:L:C)=�[34m0118:0001:0056�[m type=�[33mexcl �[m text="!">
<Core::Node=HASH(0x7f85541c97b0) position(O:L:C)=�[34m0119:0001:0057�[m type=�[33mstring�[m text=""">
)>
<Core::Node=HASH(0x7f85541c6360) position(O:L:C)=�[34m0121:0001:0059�[m type=�[33mdel �[m text=";">
<Core::Node=HASH(0x7f85541c6510) position(O:L:C)=�[34m0122:0001:0060�[m type=�[33mcr �[m text=\n>
<Core::Node=HASH(0x7f85541c6540) position(O:L:C)=�[34m0123:0002:0000�[m type=�[33mspace�[m text=\t>
<Core::Node=HASH(0x7f85541c6570) position(O:L:C)=�[34m0124:0002:0001�[m type=�[33mlabel�[m text="if">
<Core::Node=HASH(0x7f85541c6948) position(O:L:C)=�[34m0126:0002:0003�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c8a18) position(O:L:C)=�[34m0127:0002:0004�[m type=�[33mcontainer�[m nodes=(
<Core::Node=HASH(0x7f85541c60a8) position(O:L:C)=�[34m0128:0002:0005�[m type=�[33mlabel�[m text="path">
<Core::Node=HASH(0x7f85541c6048) position(O:L:C)=�[34m0132:0002:0009�[m type=�[33mcontainer�[m nodes=[
<Core::Node=HASH(0x7f85541c9bc8) position(O:L:C)=�[34m0133:0002:0010�[m type=�[33mnum �[m text="0">
]>
<Core::Node=HASH(0x7f85541c6138) position(O:L:C)=�[34m0135:0002:0012�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c6168) position(O:L:C)=�[34m0136:0002:0013�[m type=�[33mexcl �[m text="!">
<Core::Node=HASH(0x7f85541c6348) position(O:L:C)=�[34m0137:0002:0014�[m type=�[33midem �[m text="=">
<Core::Node=HASH(0x7f85541c6330) position(O:L:C)=�[34m0138:0002:0015�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c6300) position(O:L:C)=�[34m0139:0002:0016�[m type=�[33mchar �[m text="'">
<Core::Node=HASH(0x7f85541c9d00) position(O:L:C)=�[34m0140:0002:0017�[m type=�[33m �[m text="/">
<Core::Node=HASH(0x7f85541c9da8) position(O:L:C)=�[34m0141:0002:0018�[m type=�[33mchar �[m text="'">
)>
<Core::Node=HASH(0x7f85541c5d60) position(O:L:C)=�[34m0143:0002:0020�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c5fb8) position(O:L:C)=�[34m0144:0002:0021�[m type=�[33mcontainer�[m nodes={
<Core::Node=HASH(0x7f85541c5d00) position(O:L:C)=�[34m0145:0002:0022�[m type=�[33mcr �[m text=\n>
<Core::Node=HASH(0x7f85541c5e38) position(O:L:C)=�[34m0146:0003:0000�[m type=�[33mspace�[m text=\t >
<Core::Node=HASH(0x7f85541c5cb8) position(O:L:C)=�[34m0148:0003:0002�[m type=�[33mlabel�[m text="return">
<Core::Node=HASH(0x7f85541c6198) position(O:L:C)=�[34m0154:0003:0008�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c9f88) position(O:L:C)=�[34m0155:0003:0009�[m type=�[33mlabel�[m text="NULL">
<Core::Node=HASH(0x7f85541ca0d8) position(O:L:C)=�[34m0159:0003:0013�[m type=�[33mdel �[m text=";">
<Core::Node=HASH(0x7f85541ca180) position(O:L:C)=�[34m0160:0003:0014�[m type=�[33mcr �[m text=\n>
<Core::Node=HASH(0x7f85541ca228) position(O:L:C)=�[34m0161:0004:0000�[m type=�[33mspace�[m text=\t>
}>
<Core::Node=HASH(0x7f85541c5bc8) position(O:L:C)=�[34m0163:0004:0002�[m type=�[33mcr �[m text=\n>
<Core::Node=HASH(0x7f85541c5bb0) position(O:L:C)=�[34m0164:0005:0000�[m type=�[33mspace�[m text=\t>
<Core::Node=HASH(0x7f85541c5b68) position(O:L:C)=�[34m0165:0005:0001�[m type=�[33mlabel�[m text="return">
<Core::Node=HASH(0x7f85541c5d30) position(O:L:C)=�[34m0171:0005:0007�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c5dd8) position(O:L:C)=�[34m0172:0005:0008�[m type=�[33mmod �[m text="%">
<Core::Node=HASH(0x7f85541c5f88) position(O:L:C)=�[34m0173:0005:0009�[m type=�[33mlabel�[m text="orig">
<Core::Node=HASH(0x7f85541c2240) position(O:L:C)=�[34m0177:0005:0013�[m type=�[33mdel �[m text=";">
<Core::Node=HASH(0x7f85541c23f0) position(O:L:C)=�[34m0178:0005:0014�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c2e88) position(O:L:C)=�[34m0179:0005:0015�[m type=�[33m �[m text="/">
<Core::Node=HASH(0x7f85541c2f30) position(O:L:C)=�[34m0180:0005:0016�[m type=�[33m �[m text="/">
<Core::Node=HASH(0x7f85541c2fd8) position(O:L:C)=�[34m0181:0005:0017�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541c5aa8) position(O:L:C)=�[34m0182:0005:0018�[m type=�[33mlabel�[m text="Call">
<Core::Node=HASH(0x7f85541c5b50) position(O:L:C)=�[34m0186:0005:0022�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541ca360) position(O:L:C)=�[34m0187:0005:0023�[m type=�[33mlabel�[m text="the">
<Core::Node=HASH(0x7f85541ca528) position(O:L:C)=�[34m0190:0005:0026�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541ca5d0) position(O:L:C)=�[34m0191:0005:0027�[m type=�[33mlabel�[m text="original">
<Core::Node=HASH(0x7f85541ca678) position(O:L:C)=�[34m0199:0005:0035�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541ca720) position(O:L:C)=�[34m0200:0005:0036�[m type=�[33mlabel�[m text="implementation">
<Core::Node=HASH(0x7f85541ca7c8) position(O:L:C)=�[34m0214:0005:0050�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541ca870) position(O:L:C)=�[34m0215:0005:0051�[m type=�[33mlabel�[m text="of">
<Core::Node=HASH(0x7f85541ca918) position(O:L:C)=�[34m0217:0005:0053�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541ca9c0) position(O:L:C)=�[34m0218:0005:0054�[m type=�[33mlabel�[m text="this">
<Core::Node=HASH(0x7f85541cba90) position(O:L:C)=�[34m0222:0005:0058�[m type=�[33mspace�[m text=" ">
<Core::Node=HASH(0x7f85541cbb38) position(O:L:C)=�[34m0223:0005:0059�[m type=�[33mlabel�[m text="function">
<Core::Node=HASH(0x7f85541cbbe0) position(O:L:C)=�[34m0231:0005:0067�[m type=�[33mcr �[m text=\n>
}>
<Core::Node=HASH(0x7f85541ba6d0) position(O:L:C)=�[34m0233:0006:0001�[m type=�[33mcr �[m text=\n>