@@ -79,7 +79,10 @@ pub fn obj2str(sc: *mut s7_scheme, obj: *mut s7_cell) -> String {
7979 let expr = s7_string ( s7_object_to_string ( sc, obj, false ) ) ;
8080 let cstr = CStr :: from_ptr ( expr) ;
8181 let result = match cstr. to_str ( ) {
82- Ok ( expr) => expr. to_owned ( ) ,
82+ Ok ( rust_str) => match s7_is_string ( obj) {
83+ true => format ! ( "\" {}\" " , rust_str) ,
84+ false => format ! ( "{}" , rust_str. to_owned( ) ) ,
85+ } ,
8386 Err ( _) => format ! ( "(error 'encoding-error \" Failed to encode string\" )" ) ,
8487 } ;
8588 result
@@ -120,19 +123,19 @@ pub fn scheme2json(expression: &str) -> Result<Value, String> {
120123}
121124
122125pub fn json2scheme ( expression : Value ) -> Result < String , String > {
123- unsafe {
124- let sc: * mut s7_scheme = s7_init ( ) ;
125- match json_to_s7_obj ( sc, & expression) {
126- Ok ( s7_obj) => {
127- let result = obj2str ( sc, s7_obj) ;
128- s7_free ( sc) ;
129- Ok ( result)
130- }
131- Err ( err) => {
132- s7_free ( sc) ;
133- Err ( err)
134- }
126+ unsafe {
127+ let sc: * mut s7_scheme = s7_init ( ) ;
128+ match json_to_s7_obj ( sc, & expression) {
129+ Ok ( s7_obj) => {
130+ let result = obj2str ( sc, s7_obj) ;
131+ s7_free ( sc) ;
132+ Ok ( result)
135133 }
134+ Err ( err) => {
135+ s7_free ( sc) ;
136+ Err ( err)
137+ }
138+ }
136139 }
137140}
138141
@@ -155,52 +158,52 @@ impl Evaluator {
155158
156159 primitives_. extend ( primitives) ;
157160
158- unsafe {
159- let sc: * mut s7_scheme = s7_init ( ) ;
160-
161- // remove insecure primitives
162- for primitive in REMOVE {
163- s7_define (
164- sc,
165- s7_rootlet ( sc) ,
166- s7_make_symbol ( sc, primitive. as_ptr ( ) ) ,
167- s7_make_symbol ( sc, c"*removed*" . as_ptr ( ) ) ,
168- ) ;
169- }
161+ unsafe {
162+ let sc: * mut s7_scheme = s7_init ( ) ;
170163
171- // add new types
172- for ( & tag_ , type_ ) in types . iter ( ) {
173- let tag = s7_make_c_type ( sc , type_ . name . as_ptr ( ) ) ;
174- assert ! ( tag == tag_ , "Type tag was not properly set" ) ;
175- s7_c_type_set_gc_free ( sc, tag , Some ( type_ . free ) ) ;
176- s7_c_type_set_gc_mark ( sc, tag , Some ( type_ . mark ) ) ;
177- s7_c_type_set_is_equal ( sc, tag , Some ( type_ . is_equal ) ) ;
178- s7_c_type_set_to_string ( sc , tag , Some ( type_ . to_string ) ) ;
179- }
164+ // remove insecure primitives
165+ for primitive in REMOVE {
166+ s7_define (
167+ sc ,
168+ s7_rootlet ( sc) ,
169+ s7_make_symbol ( sc, primitive . as_ptr ( ) ) ,
170+ s7_make_symbol ( sc, c"*removed*" . as_ptr ( ) ) ,
171+ ) ;
172+ }
180173
181- // add new primitives
182- for primitive in primitives_. iter ( ) {
183- s7_define_function (
184- sc,
185- primitive. name . as_ptr ( ) ,
186- Some ( primitive. code ) ,
187- primitive
188- . args_required
189- . try_into ( )
190- . expect ( "args_required conversion failed" ) ,
191- primitive
192- . args_optional
193- . try_into ( )
194- . expect ( "args_optional conversion failed" ) ,
195- primitive. args_rest ,
196- primitive. description . as_ptr ( ) ,
197- ) ;
198- }
174+ // add new types
175+ for ( & tag_, type_) in types. iter ( ) {
176+ let tag = s7_make_c_type ( sc, type_. name . as_ptr ( ) ) ;
177+ assert ! ( tag == tag_, "Type tag was not properly set" ) ;
178+ s7_c_type_set_gc_free ( sc, tag, Some ( type_. free ) ) ;
179+ s7_c_type_set_gc_mark ( sc, tag, Some ( type_. mark ) ) ;
180+ s7_c_type_set_is_equal ( sc, tag, Some ( type_. is_equal ) ) ;
181+ s7_c_type_set_to_string ( sc, tag, Some ( type_. to_string ) ) ;
182+ }
199183
200- Self {
184+ // add new primitives
185+ for primitive in primitives_. iter ( ) {
186+ s7_define_function (
201187 sc,
202- primitives : primitives_,
203- }
188+ primitive. name . as_ptr ( ) ,
189+ Some ( primitive. code ) ,
190+ primitive
191+ . args_required
192+ . try_into ( )
193+ . expect ( "args_required conversion failed" ) ,
194+ primitive
195+ . args_optional
196+ . try_into ( )
197+ . expect ( "args_optional conversion failed" ) ,
198+ primitive. args_rest ,
199+ primitive. description . as_ptr ( ) ,
200+ ) ;
201+ }
202+
203+ Self {
204+ sc,
205+ primitives : primitives_,
206+ }
204207 }
205208 }
206209
@@ -223,26 +226,22 @@ impl Evaluator {
223226
224227impl Drop for Evaluator {
225228 fn drop ( & mut self ) {
226- unsafe {
227- s7_free ( self . sc ) ;
228- }
229+ unsafe {
230+ s7_free ( self . sc ) ;
231+ }
229232 }
230233}
231234
232235fn primitive_expression_to_byte_vector ( ) -> Primitive {
233236 unsafe extern "C" fn code ( sc : * mut s7_scheme , args : s7_pointer ) -> s7_pointer {
234237 let arg = s7_car ( args) ;
235238
236- let s7_c_str = s7_string ( s7_object_to_string ( sc, arg, false ) ) ;
237- let c_string = CStr :: from_ptr ( s7_c_str) ;
238-
239- let bv = s7_make_byte_vector (
240- sc,
241- c_string. to_bytes ( ) . len ( ) as i64 ,
242- 1 as i64 ,
243- std:: ptr:: null_mut ( ) ,
244- ) ;
245- for ( i, b) in c_string. to_bytes ( ) . iter ( ) . enumerate ( ) {
239+ // let s7_c_str = s7_string(s7_object_to_string(sc, arg, false));
240+ // let c_string = CStr::from_ptr(s7_c_str);
241+ let bytes = obj2str ( sc, arg) . into_bytes ( ) ;
242+
243+ let bv = s7_make_byte_vector ( sc, bytes. len ( ) as i64 , 1 as i64 , std:: ptr:: null_mut ( ) ) ;
244+ for ( i, b) in bytes. iter ( ) . enumerate ( ) {
246245 s7_byte_vector_set ( bv, i as i64 , * b) ;
247246 }
248247 bv
@@ -321,7 +320,7 @@ fn primitive_hex_string_to_byte_vector() -> Primitive {
321320 . to_str ( )
322321 . expect ( "Failed to convert C string to hex string" ) ;
323322
324- let result: Result < Vec < u8 > , ParseIntError > = ( 1 ..hex_string. len ( ) - 1 )
323+ let result: Result < Vec < u8 > , ParseIntError > = ( 0 ..hex_string. len ( ) )
325324 . step_by ( 2 )
326325 . map ( |i| u8:: from_str_radix ( & hex_string[ i..i + 2 ] , 16 ) )
327326 . collect ( ) ;
@@ -513,14 +512,15 @@ unsafe fn s7_obj_to_json(sc: *mut s7_scheme, obj: s7_pointer) -> Result<Value, S
513512 Err ( "Invalid floating point number - cannot convert to JSON" . to_string ( ) )
514513 }
515514 } else if s7_is_string ( obj) {
516- let c_str = s7_string ( obj) ;
517- let rust_str = CStr :: from_ptr ( c_str) . to_string_lossy ( ) ;
515+ // let c_str = s7_string(obj);
516+ // let rust_str = CStr::from_ptr(c_str).to_string_lossy();
517+ let rust_str = obj2str ( sc, obj) ;
518518
519519 // Check if it's a special type marker
520520 let mut special_type = Map :: new ( ) ;
521521 special_type. insert (
522522 "*type/string*" . to_string ( ) ,
523- Value :: String ( rust_str. to_string ( ) ) ,
523+ Value :: String ( String :: from ( & rust_str[ 1 .. ( rust_str . len ( ) - 1 ) ] ) ) ,
524524 ) ;
525525 Ok ( Value :: Object ( special_type) )
526526 } else if s7_is_symbol ( obj) {
0 commit comments