ref: 909b91ffccf636de9cd6f8d65544bd0268c97a92
parent: e4488bb065f2f4f82f25b6f4d3ab9fb1b6150fa9
author: JeffBezanson <jeff.bezanson@gmail.com>
date: Wed Apr 22 20:22:03 EDT 2009
fixing printing of invalid UTF-8
--- a/femtolisp/flisp.c
+++ b/femtolisp/flisp.c
@@ -1358,23 +1358,11 @@
function_t *fn = value2c(function_t*,v);
outs("#function(", f);
char *data = cvalue_data(fn->bcode);
- size_t sz = cvalue_len(fn->bcode);
- outc('"', f);
- size_t i; uint8_t c;
- for(i=0; i < sz; i++) {
- c = data[i]+48;
- if (c == '\\')
- outsn("\\\\", f, 2);
- else if (c == '"')
- outsn("\\\"", f, 2);
- else if (c >= 32 && c < 0x7f)
- outc(c, f);
- else
- ios_printf(f, "\\x%02x", c);
- }
- outsn("\" ", f, 2);
- //fl_print_child(f, fn->bcode, 0);
- //outc(' ', f);
+ size_t i, sz = cvalue_len(fn->bcode);
+ for(i=0; i < sz; i++) data[i] += 48;
+ fl_print_child(f, fn->bcode, 0);
+ for(i=0; i < sz; i++) data[i] -= 48;
+ outc(' ', f);
fl_print_child(f, fn->vals, 0);
if (fn->env != NIL) {
outc(' ', f);
@@ -1404,6 +1392,8 @@
{
if (nargs != 3)
argcount("function", nargs, 2);
+ if (!isstring(args[0]))
+ type_error("function", "string", args[0]);
if (!isvector(args[1]))
type_error("function", "vector", args[1]);
cvalue_t *arr = (cvalue_t*)ptr(args[0]);
--- a/femtolisp/print.c
+++ b/femtolisp/print.c
@@ -436,11 +436,28 @@
{
char buf[512];
size_t i = 0;
+ uint8_t c;
outc('"', f);
- while (i < sz) {
- size_t n = u8_escape(buf, sizeof(buf), str, &i, sz, 1, 0);
- outsn(buf, f, n-1);
+ if (!u8_isvalid(str, sz)) {
+ // alternate print algorithm that preserves data if it's not UTF-8
+ for(i=0; i < sz; i++) {
+ c = str[i];
+ if (c == '\\')
+ outsn("\\\\", f, 2);
+ else if (c == '"')
+ outsn("\\\"", f, 2);
+ else if (c >= 32 && c < 0x7f)
+ outc(c, f);
+ else
+ HPOS += ios_printf(f, "\\x%02x", c);
+ }
+ }
+ else {
+ while (i < sz) {
+ size_t n = u8_escape(buf, sizeof(buf), str, &i, sz, 1, 0);
+ outsn(buf, f, n-1);
+ }
}
outc('"', f);
}
--- a/femtolisp/todo
+++ b/femtolisp/todo
@@ -1027,6 +1027,7 @@
- maxstack calculation, replace Stack with C stack, alloca
- stack traces and better debugging support
- lambda lifting
-- let optimization
-- have macroexpand use its own global syntax table
-- be able to create/load an image file
+* let optimization
+* have macroexpand use its own global syntax table
+* be able to create/load an image file
+- opcodes NEG, ADD2