scmno****@osdn*****
scmno****@osdn*****
Thu Jan 11 13:44:27 JST 2018
changeset 02cd7219e401 in quipu/quipu details: http://hg.osdn.jp/view/quipu/quipu?cmd=changeset;node=02cd7219e401 user: Agustina Arzille <avarz****@riseu*****> date: Thu Jan 11 04:44:09 2018 +0000 description: Improve string interpolation diffstat: array.cpp | 6 +- array.h | 3 +- builtins.cpp | 11 ++- bvector.cpp | 7 +- bvector.h | 3 +- compiler.cpp | 28 ++++++++- cons.cpp | 11 +-- cons.h | 3 +- floatp.cpp | 17 ++--- floatp.h | 5 +- function.cpp | 2 +- function.h | 3 +- integer.cpp | 21 +++---- integer.h | 5 +- io.cpp | 21 ++++--- io.h | 13 +++- str.cpp | 176 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- str.h | 5 +- stream.cpp | 8 ++ stream.h | 24 ++++++++ symbol.cpp | 6 +- symbol.h | 5 +- table.cpp | 6 +- table.h | 3 +- tree.cpp | 4 +- tree.h | 3 +- 26 files changed, 316 insertions(+), 83 deletions(-) diffs (truncated from 922 to 300 lines): diff -r 68691aece177 -r 02cd7219e401 array.cpp --- a/array.cpp Wed Jan 10 18:23:01 2018 -0300 +++ b/array.cpp Thu Jan 11 04:44:09 2018 +0000 @@ -196,7 +196,7 @@ qp_return (ret); } -int write_a (interpreter *interp, stream *strm, object obj) +int write_a (interpreter *interp, stream *strm, object obj, io_info& info) { int ret = 0; const array *ap = as_array (obj); @@ -206,14 +206,14 @@ for (int ix = 0; ix < ap->len - 1; ++ix) { *tmp = ap->data[ix]; - ret += xwrite (interp, strm, *tmp); + ret += xwrite (interp, strm, *tmp, info); ret += strm->putb (interp, ' '); } if (ap->len != 0) { *tmp = ap->data[ap->len - 1]; - ret += xwrite (interp, strm, *tmp); + ret += xwrite (interp, strm, *tmp, info); } ret += strm->putb (interp, ']'); diff -r 68691aece177 -r 02cd7219e401 array.h --- a/array.h Wed Jan 10 18:23:01 2018 -0300 +++ b/array.h Thu Jan 11 04:44:09 2018 +0000 @@ -32,6 +32,7 @@ } class stream; +class io_info; // Allocate an array of length NELEM, filling it with FILL. QP_EXPORT object alloc_array (interpreter *__interp, @@ -71,7 +72,7 @@ // Write an array to a stream. QP_EXPORT int write_a (interpreter *__interp, - class stream *__strm, object __obj); + stream *__strm, object __obj, io_info& __info); // Initialize the array subsystem. extern bool init_array (interpreter *__interp); diff -r 68691aece177 -r 02cd7219e401 builtins.cpp --- a/builtins.cpp Wed Jan 10 18:23:01 2018 -0300 +++ b/builtins.cpp Thu Jan 11 04:44:09 2018 +0000 @@ -13,7 +13,8 @@ interp->raise2 ("arg-error", buf); } -int xwrite (interpreter *interp, stream *strm, object obj, uint32_t *lkcnt) +int xwrite (interpreter *interp, stream *strm, + object obj, io_info& info, uint32_t *lkcnt) { int ret = -2; @@ -21,7 +22,7 @@ { #define DISPATCH(type, suffix) \ case typecode::type: \ - ret = write_##suffix (interp, strm, obj); \ + ret = write_##suffix (interp, strm, obj, info); \ break DISPATCH (INT, i); @@ -1025,7 +1026,8 @@ "disasm\0" "%sharpquote\0" "not\0" - "len\0"; + "len\0" + "%fmt-str\0"; // List of builtins. static const native_function::fn_type BUILTINS[] = @@ -1059,7 +1061,8 @@ disasm_fct, p_sharpquote, not_fct, - len_fct + len_fct, + p_fmt_str }; static native_function global_builtins[QP_NELEM (BUILTINS)]; diff -r 68691aece177 -r 02cd7219e401 bvector.cpp --- a/bvector.cpp Wed Jan 10 18:23:01 2018 -0300 +++ b/bvector.cpp Thu Jan 11 04:44:09 2018 +0000 @@ -374,9 +374,12 @@ qp_return (ret); } -int write_b (interpreter *interp, stream *strm, object obj) +int write_b (interpreter *interp, stream *strm, object obj, io_info& info) { - bvector *bp = as_bvector (obj); + const bvector *bp = as_bvector (obj); + if (info.flags & io_info::FLG_RAW) + return (strm->write (interp, (const char *)bp->data, bp->nbytes)); + int ret = 0; ret += strm->write (interp, "#\"", 2); diff -r 68691aece177 -r 02cd7219e401 bvector.h --- a/bvector.h Wed Jan 10 18:23:01 2018 -0300 +++ b/bvector.h Thu Jan 11 04:44:09 2018 +0000 @@ -24,6 +24,7 @@ * a subclass of the former. */ class stream; +class io_info; QP_EXPORT object alloc_bvector (interpreter *__interp, int __nbytes); @@ -48,7 +49,7 @@ QP_EXPORT object copy_b (interpreter *__interp, object __obj, bool __deep); QP_EXPORT int write_b (interpreter *__interp, - class stream *__strm, object __bvector); + stream *__strm, object __bvector, io_info& __info); QP_EXPORT object add_bb (interpreter *__interp, object __bv1, object __bv2); diff -r 68691aece177 -r 02cd7219e401 compiler.cpp --- a/compiler.cpp Wed Jan 10 18:23:01 2018 -0300 +++ b/compiler.cpp Thu Jan 11 04:44:09 2018 +0000 @@ -737,8 +737,26 @@ this->emit (OPX_(LOADI8), expr); else if (expr == NIL) this->emit (OPX_(LOADNIL)); - else if (quoted || !this->compile_seq (env, tail, expr)) - this->emit (OPX_(LOADV), expr); + else + { + if (!quoted) + { + if (str_p (expr)) + { + expr = expand_str (this->interp, expr); + if (!str_p (expr)) + { + this->interp->push (expr); + this->compile_in (env, tail, expr); + return; + } + } + else if (this->compile_seq (env, tail, expr)) + return; + } + + this->emit (OPX_(LOADV), expr); + } } void bc_emitter::compile_sym (object env, bool tail, @@ -2801,6 +2819,12 @@ // These need special handling to resolve local symbols. break; + case typecode::STR: + expr = expand_str (interp, expr); + if (str_p (expr)) + qp_return (expr); + break; + default: qp_return (expr); } diff -r 68691aece177 -r 02cd7219e401 cons.cpp --- a/cons.cpp Wed Jan 10 18:23:01 2018 -0300 +++ b/cons.cpp Thu Jan 11 04:44:09 2018 +0000 @@ -194,13 +194,10 @@ qp_return (*tail); } -int write_L (interpreter *interp, stream *strm, object obj) +int write_L (interpreter *interp, stream *strm, object obj, io_info& info) { if (obj == NIL) - { - strm->write (interp, "nil", 3); - return (strm->err_p () ? -1 : 3); - } + return (strm->write (interp, "nil", 3)); int ret = strm->putb (interp, '('); stackref prev (interp, obj), tmp (interp, NIL); @@ -208,11 +205,11 @@ while (true) { - ret += xwrite (interp, strm, *pt = xcar (*pp)); + ret += xwrite (interp, strm, *pt = xcar (*pp), info); if (!xcons_p (*pp = xcdr (*pp))) { ret += strm->write (interp, " . ", 3); - ret += xwrite (interp, strm, *pp); + ret += xwrite (interp, strm, *pp, info); break; } else if (*pp == NIL) diff -r 68691aece177 -r 02cd7219e401 cons.h --- a/cons.h Wed Jan 10 18:23:01 2018 -0300 +++ b/cons.h Thu Jan 11 04:44:09 2018 +0000 @@ -95,6 +95,7 @@ } class stream; +class io_info; QP_EXPORT object alloc_cons (interpreter *__interp); @@ -117,7 +118,7 @@ QP_EXPORT uint32_t hash_L (interpreter *__interp, object __obj); QP_EXPORT int write_L (interpreter *__interp, - class stream *__strm, object __obj); + stream *__strm, object __obj, io_info& __info); QP_EXPORT object reverse_L (interpreter *__interp, object __obj); diff -r 68691aece177 -r 02cd7219e401 floatp.cpp --- a/floatp.cpp Wed Jan 10 18:23:01 2018 -0300 +++ b/floatp.cpp Thu Jan 11 04:44:09 2018 +0000 @@ -316,7 +316,7 @@ return (sign ? ~ret : ret); } -int write_f (interpreter *interp, stream *strm, object obj) +int write_f (interpreter *interp, stream *strm, object obj, io_info& info) { int sign, cls, size = 0, ret = 0; double v = get_dbl (obj, sign, cls); @@ -331,7 +331,8 @@ else if (cls != FLT_CLASS_NORM) memcpy (buf, "NaN", size = 3); else - size = sprintf (buf, "%g", v); + // TODO: Rewrite to handle localization. + size = sprintf (buf, "%*.*g", info.width, info.prec, v); ret += strm->write (interp, buf, size); return (ret); @@ -1129,18 +1130,16 @@ return (sign ? ~ret :ret); } -// XXX: dynamically bind 'base'. - -int write_F (interpreter *interp, stream *strm, object obj) +int write_F (interpreter *interp, stream *strm, object obj, io_info& info) { const bigfloat *lp = as_bigfloat (obj); - int base = 10, expo = lp->expo, xl = F_ABS (lp->len), ret = 0; - int size = uibsize (base, lp->data[xl - 1], xl); + int expo = lp->expo, xl = F_ABS (lp->len), ret = 0; + int size = uibsize (info.radix, lp->data[xl - 1], xl); char *ptr; QP_TMARK (interp); ptr = (char *)QP_TALLOC (interp, size); - size = lftostr (interp, ptr, &expo, lp->data, xl, size, base); + size = lftostr (interp, ptr, &expo, lp->data, xl, size, info.radix); #ifdef QP_ARCH_WIDE if (obj & SIGN_BIT) @@ -1155,7 +1154,7 @@ ret += strm->write (interp, ptr, size); // Write the exponent. - size = sprintf (ptr, "%c%d", base <= 10 ? 'e' : '@', expo); + size = sprintf (ptr, "%c%d", info.radix <= 10 ? 'e' : '@', expo); ret += strm->write (interp, ptr, size); return (ret); } diff -r 68691aece177 -r 02cd7219e401 floatp.h --- a/floatp.h Wed Jan 10 18:23:01 2018 -0300 +++ b/floatp.h Thu Jan 11 04:44:09 2018 +0000 @@ -137,12 +137,13 @@ // I/O with floats. class stream; +class io_info; QP_EXPORT int write_f (interpreter *__interp, - class stream *__strm, object __obj); + stream *__strm, object __obj, io_info& __info); QP_EXPORT int write_F (interpreter *__interp, - class stream *__strm, object __obj); + stream *__strm, object __obj, io_info& __info); // Global objects. QP_EXPORT object FLT_PINF; // +INF