44//! Rust.
55
66use super :: * ;
7+ use c2rust_ast_builder:: CaptureBy ;
78use failure:: format_err;
89use proc_macro2:: { TokenStream , TokenTree } ;
910
@@ -53,40 +54,105 @@ impl<'c> Translation<'c> {
5354 if n >= 2 {
5455 // `argv` and `argc`
5556
57+ // let mut args_strings: Vec<Vec<u8>> = (::std::env::args())
58+ // .map(|arg| {
59+ // (::std::ffi::CString::new(arg))
60+ // .expect("Failed to convert argument into CString.")
61+ // .into_bytes_with_nul()
62+ // })
63+ // .collect();
5664 stmts. push ( mk ( ) . local_stmt ( Box :: new ( mk ( ) . local (
57- mk ( ) . mutbl ( ) . ident_pat ( "args" ) ,
65+ mk ( ) . mutbl ( ) . ident_pat ( "args_strings" ) ,
66+ Some ( mk ( ) . path_ty ( vec ! [ mk( ) . path_segment_with_args(
67+ "Vec" ,
68+ mk( ) . angle_bracketed_args( vec![ mk( ) . path_ty( vec![
69+ mk( ) . path_segment_with_args(
70+ "Vec" ,
71+ mk( ) . angle_bracketed_args( vec![ mk( ) . ident_ty( "u8" ) ] ) ,
72+ ) ,
73+ ] ) ] ) ,
74+ ) ] ) ) ,
75+ Some ( mk ( ) . method_call_expr (
76+ mk ( ) . method_call_expr (
77+ mk ( ) . call_expr ( args_fn, vec ! [ ] ) ,
78+ "map" ,
79+ vec ! [ mk( ) . closure_expr(
80+ CaptureBy :: Ref ,
81+ Movability :: Movable ,
82+ vec![ mk( ) . ident_pat( "arg" ) ] ,
83+ ReturnType :: Default ,
84+ mk( ) . method_call_expr(
85+ mk( ) . method_call_expr(
86+ mk( ) . call_expr(
87+ mk( ) . abs_path_expr( vec![
88+ "std" , "ffi" , "CString" , "new" ,
89+ ] ) ,
90+ vec![ mk( ) . path_expr( vec![ "arg" ] ) ] ,
91+ ) ,
92+ "expect" ,
93+ vec![
94+ mk( ) . lit_expr(
95+ "Failed to convert argument into CString." ,
96+ ) ,
97+ ] ,
98+ ) ,
99+ "into_bytes_with_nul" ,
100+ vec![ ] ,
101+ ) ,
102+ ) ] ,
103+ ) ,
104+ "collect" ,
105+ vec ! [ ] ,
106+ ) ) ,
107+ ) ) ) ) ;
108+
109+ // let mut args_ptrs: Vec<*mut ::core::ffi::c_char> = args_strings
110+ // .iter_mut()
111+ // .map(|arg| arg.as_mut_ptr() as *mut ::core::ffi::c_char)
112+ // .collect();
113+ stmts. push ( mk ( ) . local_stmt ( Box :: new ( mk ( ) . local (
114+ mk ( ) . mutbl ( ) . ident_pat ( "args_ptrs" ) ,
58115 Some ( mk ( ) . path_ty ( vec ! [ mk( ) . path_segment_with_args(
59116 "Vec" ,
60117 mk( ) . angle_bracketed_args( vec![
61118 mk( ) . mutbl( ) . ptr_ty( mk( ) . abs_path_ty( vec![ "core" , "ffi" , "c_char" ] ) ) ,
62119 ] ) ,
63120 ) ] ) ) ,
64- Some ( mk ( ) . call_expr ( mk ( ) . path_expr ( vec ! [ "Vec" , "new" ] ) , vec ! [ ] ) ) ,
65- ) ) ) ) ;
66- stmts. push ( mk ( ) . semi_stmt ( mk ( ) . for_expr (
67- mk ( ) . ident_pat ( "arg" ) ,
68- mk ( ) . call_expr ( args_fn, vec ! [ ] ) ,
69- mk ( ) . block ( vec ! [ mk( ) . semi_stmt( mk( ) . method_call_expr(
70- mk( ) . path_expr( vec![ "args" ] ) ,
71- "push" ,
72- vec![ mk( ) . method_call_expr(
121+ Some ( mk ( ) . method_call_expr (
122+ mk ( ) . method_call_expr (
73123 mk ( ) . method_call_expr (
74- mk( ) . call_expr(
75- // TODO(kkysen) change `"std"` to `"alloc"` after `#![feature(alloc_c_string)]` is stabilized in `1.63.0`
76- mk( ) . abs_path_expr( vec![ "std" , "ffi" , "CString" , "new" ] ) ,
77- vec![ mk( ) . path_expr( vec![ "arg" ] ) ] ,
78- ) ,
79- "expect" ,
80- vec![ mk( ) . lit_expr( "Failed to convert argument into CString." ) ] ,
124+ mk ( ) . ident_expr ( "args_strings" ) ,
125+ "iter_mut" ,
126+ vec ! [ ] ,
81127 ) ,
82- "into_raw" ,
83- vec![ ] ,
84- ) ] ,
85- ) ) ] ) ,
86- None :: < Ident > ,
87- ) ) ) ;
128+ "map" ,
129+ vec ! [
130+ mk( ) . closure_expr(
131+ CaptureBy :: Ref ,
132+ Movability :: Movable ,
133+ vec![ mk( ) . ident_pat( "arg" ) ] ,
134+ ReturnType :: Default ,
135+ mk( ) . cast_expr(
136+ mk( ) . method_call_expr(
137+ mk( ) . ident_expr( "arg" ) ,
138+ "as_mut_ptr" ,
139+ vec![ ] ,
140+ ) ,
141+ mk( ) . mutbl( ) . ptr_ty(
142+ mk( ) . abs_path_ty( vec![ "core" , "ffi" , "c_char" ] ) ,
143+ ) ,
144+ ) ,
145+ ) ,
146+ ] ,
147+ ) ,
148+ "collect" ,
149+ vec ! [ ] ,
150+ ) ) ,
151+ ) ) ) ) ;
152+
153+ // args_ptrs.push(::core::ptr::null_mut());
88154 stmts. push ( mk ( ) . semi_stmt ( mk ( ) . method_call_expr (
89- mk ( ) . path_expr ( vec ! [ "args " ] ) ,
155+ mk ( ) . path_expr ( vec ! [ "args_ptrs " ] ) ,
90156 "push" ,
91157 vec ! [
92158 mk( ) . call_expr( mk( ) . abs_path_expr( vec![ "core" , "ptr" , "null_mut" ] ) , vec![ ] ) ,
@@ -105,8 +171,7 @@ impl<'c> Translation<'c> {
105171 "Cannot find type of 'argv' argument in main function" ,
106172 ) ) ,
107173 } ?;
108-
109- let args = mk ( ) . ident_expr ( "args" ) ;
174+ let args = mk ( ) . ident_expr ( "args_ptrs" ) ;
110175 let argc = mk ( ) . binary_expr (
111176 BinOp :: Sub ( Default :: default ( ) ) ,
112177 mk ( ) . method_call_expr ( args. clone ( ) , "len" , no_args. clone ( ) ) ,
0 commit comments