Skip to content

Commit ab15cbe

Browse files
committed
make tests work
1 parent 8ac430d commit ab15cbe

File tree

1 file changed

+72
-72
lines changed

1 file changed

+72
-72
lines changed

src/evaluator.rs

Lines changed: 72 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -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

122125
pub 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

224227
impl 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

232235
fn 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

Comments
 (0)