44//! [`read_solt`] wraps `readsolt`, and [`write_sol`] wraps `outsolheads` and
55//! `outsols` from `solution.c`.
66
7- use crate :: { ppk:: SolOpt , GpsTime , Llh , SolStatus } ;
7+ use crate :: { ppk:: SolOpt , util :: CStringArray , GpsTime , Llh , SolStatus } ;
88use num_enum:: TryFromPrimitive ;
99use rtklib_sys:: rtklib as ffi;
1010use std:: {
11- ffi:: CString ,
1211 fs:: File ,
1312 io:: { Error as IoError , Write } ,
1413} ;
@@ -195,20 +194,12 @@ fn validate_coord_types(buf: SolBuf) -> Result<SolBuf, SolError> {
195194 Ok ( buf)
196195}
197196
198- fn build_cstring_ptrs ( paths : & [ & str ] ) -> Result < ( Vec < CString > , Vec < * const i8 > ) , SolError > {
199- let cstrings = paths
200- . iter ( )
201- . map ( |p| CString :: new ( * p) . map_err ( |_| SolError :: NulByte ( p. to_string ( ) ) ) )
202- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
203- let ptrs = cstrings. iter ( ) . map ( |s| s. as_ptr ( ) ) . collect ( ) ;
204- Ok ( ( cstrings, ptrs) )
205- }
206-
207197/// Read solution records from one or more `.pos` files.
208198pub fn read_sol ( paths : & [ & str ] ) -> Result < SolBuf , SolError > {
209- let ( _cstrings, mut ptrs) = build_cstring_ptrs ( paths) ?;
199+ let mut arr = CStringArray :: try_new ( paths)
200+ . map_err ( |e| SolError :: NulByte ( e. to_string_lossy ( ) . into_owned ( ) ) ) ?;
210201 let mut buf = unsafe { std:: mem:: zeroed :: < ffi:: solbuf_t > ( ) } ;
211- let ret = unsafe { ffi:: readsol ( ptrs . as_mut_ptr ( ) , ptrs . len ( ) as i32 , & mut buf) } ;
202+ let ret = unsafe { ffi:: readsol ( arr . as_mut_ptr ( ) , arr . len ( ) as i32 , & mut buf) } ;
212203 if ret == 0 {
213204 return Err ( SolError :: ReadFailed ) ;
214205 }
@@ -224,12 +215,13 @@ pub fn read_solt(
224215 qflag : i32 ,
225216 mean : bool ,
226217) -> Result < SolBuf , SolError > {
227- let ( _cstrings, mut ptrs) = build_cstring_ptrs ( paths) ?;
218+ let mut arr = CStringArray :: try_new ( paths)
219+ . map_err ( |e| SolError :: NulByte ( e. to_string_lossy ( ) . into_owned ( ) ) ) ?;
228220 let mut buf = unsafe { std:: mem:: zeroed :: < ffi:: solbuf_t > ( ) } ;
229221 let ret = unsafe {
230222 ffi:: readsolt (
231- ptrs . as_mut_ptr ( ) ,
232- ptrs . len ( ) as i32 ,
223+ arr . as_mut_ptr ( ) ,
224+ arr . len ( ) as i32 ,
233225 ts. 0 ,
234226 te. 0 ,
235227 tint,
0 commit comments