100_scan_ops/
100_scan_ops.rs

1use libperl_rs::Perl;
2use libperl_sys::{op, PL_op_name};
3
4use std::env;
5use std::ffi::CStr;
6
7fn scan_ops(mut op: *const op) {
8    while !op.is_null() {
9        let ty = unsafe {(*op).op_type()};
10        // let op_name = unsafe {
11        //     slice::from_raw_parts(
12        //         c_perl::PL_op_name as *const c_char,
13        //         c_perl::PL_maxo as usize
14        //     );
15        // };
16        print!("{:#?} {}\t{:?}\n",
17               op, 
18               // op_name[ty]
19               unsafe {
20                   CStr::from_ptr(PL_op_name[ty as usize])
21               }
22               .to_str().unwrap(),
23               unsafe {*op},
24        );
25        op = unsafe {(*op).op_next as *const op};
26    }
27}
28
29#[cfg(perl_useithreads)]
30fn my_test() {
31    let mut perl = Perl::new();
32    perl.parse_env_args(env::args(), env::vars());
33    scan_ops(unsafe {*perl.my_perl}.Imain_start);
34}
35
36#[cfg(not(perl_useithreads))]
37fn my_test() {
38    let mut perl = Perl::new();
39    perl.parse_env_args(env::args(), env::vars());
40    scan_ops(unsafe {libperl_sys::PL_main_start});
41}
42
43// cargo run --example 100_scan_ops -- -le 'print "FOO"'
44
45fn main() {
46    my_test();
47}