changeset 33590:976638dd9021

Show ellipsis at end of long arrays for short_disp (bug #65637). * ov-base.h (octave_base_value::short_disp): Print dimensions and class. * ov-base-diag.cc (octave_base_diag<DMT, MT>::short_disp), ov-base-mat.cc (octave_base_matrix<MT>::short_disp), ov-cell.cc (octave_cell::short_disp), ov-perm.cc (octave_perm_matrix::short_disp), ov-str-mat.cc (octave_char_matrix_str::short_disp): Append ellipsis if number of displayed elements is truncated. * ov-classdef.cc (octave_classdef::print_raw): Use `short_print` for any type of classdef property.
author John W. Eaton <jwe@octave.org>
date Wed, 24 Apr 2024 15:24:33 -0400
parents f07a7fe7bd51
children d26bc20bac10
files libinterp/octave-value/ov-base-diag.cc libinterp/octave-value/ov-base-mat.cc libinterp/octave-value/ov-base.h libinterp/octave-value/ov-cell.cc libinterp/octave-value/ov-classdef.cc libinterp/octave-value/ov-perm.cc libinterp/octave-value/ov-str-mat.cc
diffstat 7 files changed, 84 insertions(+), 47 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ov-base-diag.cc	Thu May 16 08:32:01 2024 -0700
+++ b/libinterp/octave-value/ov-base-diag.cc	Wed Apr 24 15:24:33 2024 -0400
@@ -598,8 +598,6 @@
       octave_idx_type max_elts = 10;
       octave_idx_type elts = 0;
 
-      octave_idx_type nel = m_matrix.numel ();
-
       octave_idx_type nr = m_matrix.rows ();
       octave_idx_type nc = m_matrix.columns ();
 
@@ -617,25 +615,37 @@
                 os << tmp.substr (pos);
               else if (! tmp.empty ())
                 os << tmp[0];
-
-              if (++elts >= max_elts)
-                goto done;
+              elts++;
 
               if (j < nc - 1)
-                os << ", ";
+                {
+                  os << ", ";
+
+                  if (elts >= max_elts)
+                    {
+                      os << "...";
+                      goto done;
+                    }
+                }
             }
 
-          if (i < nr - 1 && elts < max_elts)
-            os << "; ";
+          if (i < nr - 1)
+            {
+              os << "; ";
+
+              if (elts >= max_elts)
+                {
+                  os << "...";
+                  goto done;
+                }
+            }
         }
 
     done:
-
-      if (nel <= max_elts)
-        os << ']';
+      os << ']';
     }
   else
-    os << "...";
+    octave_base_value::short_disp (os);
 }
 
 template <typename DMT, typename MT>
--- a/libinterp/octave-value/ov-base-mat.cc	Thu May 16 08:32:01 2024 -0700
+++ b/libinterp/octave-value/ov-base-mat.cc	Wed Apr 24 15:24:33 2024 -0400
@@ -511,8 +511,6 @@
       octave_idx_type max_elts = 10;
       octave_idx_type elts = 0;
 
-      octave_idx_type nel = m_matrix.numel ();
-
       octave_idx_type nr = m_matrix.rows ();
       octave_idx_type nc = m_matrix.columns ();
 
@@ -530,25 +528,37 @@
                 os << tmp.substr (pos);
               else if (! tmp.empty ())
                 os << tmp[0];
-
-              if (++elts >= max_elts)
-                goto done;
+              elts++;
 
               if (j < nc - 1)
-                os << ", ";
+                {
+                  os << ", ";
+
+                  if (elts >= max_elts)
+                    {
+                      os << "...";
+                      goto done;
+                    }
+                }
             }
 
-          if (i < nr - 1 && elts < max_elts)
-            os << "; ";
+          if (i < nr - 1)
+            {
+              os << "; ";
+
+              if (elts >= max_elts)
+                {
+                  os << "...";
+                  goto done;
+                }
+            }
         }
 
     done:
-
-      if (nel <= max_elts)
-        os << ']';
+      os << ']';
     }
   else
-    os << "...";
+    octave_base_value::short_disp (os);
 }
 
 template <typename MT>
--- a/libinterp/octave-value/ov-base.h	Thu May 16 08:32:01 2024 -0700
+++ b/libinterp/octave-value/ov-base.h	Wed Apr 24 15:24:33 2024 -0400
@@ -758,7 +758,11 @@
   print_with_name (std::ostream& output_buf, const std::string& name,
                    bool print_padding = true);
 
-  virtual void short_disp (std::ostream& os) const { os << "..."; }
+  virtual void short_disp (std::ostream& os) const
+  {
+    dim_vector dv = dims ();
+    os << "[" << dv.str () << " " << class_name () << "]";
+  }
 
   virtual OCTINTERP_API float_display_format get_edit_display_format () const;
 
--- a/libinterp/octave-value/ov-cell.cc	Thu May 16 08:32:01 2024 -0700
+++ b/libinterp/octave-value/ov-cell.cc	Wed Apr 24 15:24:33 2024 -0400
@@ -699,7 +699,10 @@
 void
 octave_cell::short_disp (std::ostream& os) const
 {
-  os << (m_matrix.isempty () ? "{}" : "...");
+  // octave_base_matrix<octave_value>::short_disp is not appropriate for
+  // cell arrays.
+
+  octave_base_value::short_disp (os);
 }
 
 #define CELL_ELT_TAG "<cell-element>"
--- a/libinterp/octave-value/ov-classdef.cc	Thu May 16 08:32:01 2024 -0700
+++ b/libinterp/octave-value/ov-classdef.cc	Wed Apr 24 15:24:33 2024 -0400
@@ -399,13 +399,7 @@
 
               octave_value val = prop.get_value (m_object, false);
 
-              if (val.ndims () == 2 && val.rows () == 1 && (val.isnumeric () || val.islogical () || val.is_string ()))
-                val.short_disp (os);
-              else
-                {
-                  dim_vector dims = val.dims ();
-                  os << "[" << dims.str () << " " << val.class_name () << "]";
-                }
+              val.short_disp (os);
             }
 
           newline (os);
--- a/libinterp/octave-value/ov-perm.cc	Thu May 16 08:32:01 2024 -0700
+++ b/libinterp/octave-value/ov-perm.cc	Wed Apr 24 15:24:33 2024 -0400
@@ -510,8 +510,6 @@
       octave_idx_type max_elts = 10;
       octave_idx_type elts = 0;
 
-      octave_idx_type nel = m_matrix.numel ();
-
       octave_idx_type nr = m_matrix.rows ();
       octave_idx_type nc = m_matrix.columns ();
 
@@ -530,25 +528,37 @@
                 os << tmp.substr (pos);
               else if (! tmp.empty ())
                 os << tmp[0];
-
-              if (++elts >= max_elts)
-                goto done;
+              elts++;
 
               if (j < nc - 1)
-                os << ", ";
+                {
+                  os << ", ";
+
+                  if (elts >= max_elts)
+                    {
+                      os << "...";
+                      goto done;
+                    }
+                }
             }
 
-          if (i < nr - 1 && elts < max_elts)
-            os << "; ";
+          if (i < nr - 1)
+            {
+              os << "; ";
+
+              if (elts >= max_elts)
+                {
+                  os << "...";
+                  goto done;
+                }
+            }
         }
 
     done:
-
-      if (nel <= max_elts)
-        os << ']';
+      os << ']';
     }
   else
-    os << "...";
+    octave_base_value::short_disp (os);
 }
 
 octave_base_value *
--- a/libinterp/octave-value/ov-str-mat.cc	Thu May 16 08:32:01 2024 -0700
+++ b/libinterp/octave-value/ov-str-mat.cc	Wed Apr 24 15:24:33 2024 -0400
@@ -285,9 +285,15 @@
       std::string tmp = chm.row_as_string (0);
 
       // FIXME: should this be configurable?
-      std::size_t max_len = 100;
+      std::size_t max_len = 50;
+
+      char quote_char = is_sq_string () ? '\'' : '"';
 
-      os << (tmp.length () > max_len ? tmp.substr (0, 100) : tmp);
+      os << quote_char;
+      if (tmp.length () > max_len)
+        os << tmp.substr (0, 50) << quote_char << " (truncated)";
+      else
+        os << tmp << quote_char;
     }
 }