103_scan_op_tree/
103_scan_op_tree.rs1
2use 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}