103_scan_op_tree/
103_scan_op_tree.rs

1
2// cargo run --example 103_scan_op_tree -- -le 'print "FOO"'
3
4use std::env;
5use std::ffi::CStr;
6
7use libperl_rs::Perl;
8use libperl_sys::*;
9
10mod eg;
11
12fn tree(op: *const op, level: isize) {
13    if !op.is_null() && (unsafe {*op}.op_flags & OPf_KIDS as u8) != 0 {
14        let op = op as *const unop;
15        let mut kid = unsafe {*op}.op_first as *const unop;
16        while ! kid.is_null() {
17            tree(kid as *const op, level+1);
18            kid = eg::op0::op_sibling(kid) as *const unop;
19        }
20    }
21    let ty = unsafe {*op}.op_type();
22    print!("{}", "  ".repeat(level as usize));
23    println!("{} {:#?} {}", level, op
24             , unsafe {
25                 CStr::from_ptr(PL_op_name[ty as usize])
26             }.to_str().unwrap());
27}
28
29fn my_test() {
30    let mut perl = Perl::new();
31    
32    perl.parse_env_args(env::args(), env::vars());
33    
34    let op = perl.get_main_root();
35    tree(op, 0);
36}
37
38fn main() {
39    my_test()
40}