diff --git a/include/chibi/features.h b/include/chibi/features.h index c280fe84..349c9e50 100644 --- a/include/chibi/features.h +++ b/include/chibi/features.h @@ -568,6 +568,11 @@ #define SEXP_USE_BYTEVECTOR_LITERALS ! SEXP_USE_NO_FEATURES #endif +#ifndef SEXP_BYTEVECTOR_HEX_LITERALS +#define SEXP_BYTEVECTOR_HEX_LITERALS SEXP_USE_BYTEVECTOR_LITERALS +#endif + + #ifndef SEXP_USE_SELF_PARAMETER #define SEXP_USE_SELF_PARAMETER 1 #endif diff --git a/sexp.c b/sexp.c index d4d2b998..21b705a8 100644 --- a/sexp.c +++ b/sexp.c @@ -1884,6 +1884,9 @@ sexp sexp_write_one (sexp ctx, sexp obj, sexp out) { sexp_sint_t i=0; #if SEXP_USE_FLONUMS double f, ftmp; +#endif +#if SEXP_USE_BYTEVECTOR_LITERALS && SEXP_BYTEVECTOR_HEX_LITERALS + char buf[5]; #endif sexp x, *elts; char *str=NULL, numbuf[NUMBUF_LEN]; @@ -2065,7 +2068,12 @@ sexp sexp_write_one (sexp ctx, sexp obj, sexp out) { len = sexp_bytes_length(obj); for (i=0; i<(sexp_sint_t)len; i++) { if (i!=0) sexp_write_char(ctx, ' ', out); +#if SEXP_BYTEVECTOR_HEX_LITERALS + sprintf(buf, "#x%02hhX", ((unsigned char*) str)[i]); + sexp_write_string(ctx, buf, out); +#else sexp_write(ctx, sexp_make_fixnum(((unsigned char*)str)[i]), out); +#endif } sexp_write_char(ctx, ')', out); break; @@ -2254,7 +2262,7 @@ sexp sexp_read_string (sexp ctx, sexp in, int sentinel) { case 'a': c = '\a'; break; case 'b': c = '\b'; break; case 'n': c = '\n'; break; - case 'r': c = '\r'; break; + case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'x': case 'X': res = sexp_read_number(ctx, in, 16, 0);