[Quipu-dev] quipu/quipu: Improve string interpolation

Back to archive index

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




More information about the Quipu-dev mailing list
Back to archive index