changeset 20611:40ed9b46a800

new octave_value::string_value method with optional error message * ov.h (octave_value::string_vector): New method. ov-base.cc, ov-base.h (octave_base_value::string_vector): New default method. ov-str-mat.cc, ov-str-mat.h (octave_char_matrix_str::string_value): New method.
author John W. Eaton <jwe@octave.org>
date Thu, 08 Oct 2015 16:43:22 -0400
parents a61f0d6beb71
children 7374a3a6d594
files libinterp/octave-value/ov-base.cc libinterp/octave-value/ov-base.h libinterp/octave-value/ov-str-mat.cc libinterp/octave-value/ov-str-mat.h libinterp/octave-value/ov.h
diffstat 5 files changed, 71 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ov-base.cc	Thu Oct 08 20:15:19 2015 +0100
+++ b/libinterp/octave-value/ov-base.cc	Thu Oct 08 16:43:22 2015 -0400
@@ -910,6 +910,33 @@
   return retval;
 }
 
+std::string
+octave_base_value::string_value (const char *fmt, va_list args) const
+{
+  // Note that this method does not need to be particularly efficient
+  // since it is already an error to end up here.
+
+  // FIXME: do we want both the wrong-type-argument error and any custom
+  // error message, or just the custom error message, or should that
+  // behavior be optional in some way?
+
+  try
+    {
+      std::string tn = type_name ();
+
+      error ("wrong type argument '%s'\n", tn.c_str ());
+    }
+  catch (const octave_execution_exception&)
+    {
+      if (fmt)
+        verror (fmt, args);
+
+      throw;
+    }
+
+  return std::string ();
+}
+
 Array<std::string>
 octave_base_value::cellstr_value (void) const
 {
--- a/libinterp/octave-value/ov-base.h	Thu Oct 08 20:15:19 2015 +0100
+++ b/libinterp/octave-value/ov-base.h	Thu Oct 08 16:43:22 2015 -0400
@@ -564,6 +564,8 @@
 
   virtual std::string string_value (bool force = false) const;
 
+  virtual std::string string_value (const char *fmt, va_list args) const;
+
   virtual Array<std::string> cellstr_value (void) const;
 
   virtual Range range_value (void) const;
--- a/libinterp/octave-value/ov-str-mat.cc	Thu Oct 08 20:15:19 2015 +0100
+++ b/libinterp/octave-value/ov-str-mat.cc	Thu Oct 08 16:43:22 2015 -0400
@@ -252,6 +252,38 @@
   return retval;
 }
 
+std::string
+octave_char_matrix_str::string_value (const char *fmt, va_list args) const
+{
+  std::string retval;
+
+  if (! fmt)
+    return string_value ();
+
+  bool conversion_error = false;
+
+  if (matrix.ndims () == 2)
+    {
+      charMatrix chm (matrix);
+
+      try
+        {
+          retval = chm.row_as_string (0);  // FIXME?
+        }
+      catch (const octave_execution_exception&)
+        {
+          conversion_error = true;
+        }
+    }
+  else
+    conversion_error = true;
+
+  if (conversion_error)
+    verror (fmt, args);
+
+  return retval;
+}
+
 Array<std::string>
 octave_char_matrix_str::cellstr_value (void) const
 {
--- a/libinterp/octave-value/ov-str-mat.h	Thu Oct 08 20:15:19 2015 +0100
+++ b/libinterp/octave-value/ov-str-mat.h	Thu Oct 08 16:43:22 2015 -0400
@@ -129,6 +129,8 @@
 
   std::string string_value (bool force = false) const;
 
+  std::string string_value (const char *fmt, va_list args) const;
+
   Array<std::string> cellstr_value (void) const;
 
   octave_value sort (octave_idx_type dim = 0, sortmode mode = ASCENDING) const
--- a/libinterp/octave-value/ov.h	Thu Oct 08 20:15:19 2015 +0100
+++ b/libinterp/octave-value/ov.h	Thu Oct 08 16:43:22 2015 -0400
@@ -897,6 +897,14 @@
   std::string string_value (bool force = false) const
   { return rep->string_value (force); }
 
+  std::string string_value (const char *fmt, ...) const
+  {
+    va_list args;
+    va_start (args,fmt);
+    return rep->string_value (fmt, args);
+    va_end (args);
+  }
+
   Array<std::string> cellstr_value (void) const
   { return rep->cellstr_value (); }