changeset 21477:4fc04d04dd9c

make printf and scanf format element and list objects private * oct-stream.cc (scanf_format_elt, scanf_format_list, printf_format_elt, printf_format_list): Move class declarations and definitions here. * oct-stream.h: From here.
author John W. Eaton <jwe@octave.org>
date Fri, 18 Mar 2016 13:10:19 -0400
parents 19e952b82819
children 2c9382700a7e
files libinterp/corefcn/oct-stream.cc libinterp/corefcn/oct-stream.h
diffstat 2 files changed, 302 insertions(+), 295 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/oct-stream.cc	Fri Mar 18 12:25:23 2016 -0400
+++ b/libinterp/corefcn/oct-stream.cc	Fri Mar 18 13:10:19 2016 -0400
@@ -169,6 +169,156 @@
     nc = get_size (dnc, who);
 }
 
+class
+scanf_format_elt
+{
+public:
+
+  enum special_conversion
+  {
+    whitespace_conversion = 1,
+    literal_conversion = 2,
+    null = 3
+  };
+
+  scanf_format_elt (const char *txt = 0, int w = 0, bool d = false,
+                    char typ = '\0', char mod = '\0',
+                    const std::string& ch_class = "")
+    : text (strsave (txt)), width (w), discard (d), type (typ),
+      modifier (mod), char_class (ch_class)
+  { }
+
+  scanf_format_elt (const scanf_format_elt& e)
+    : text (strsave (e.text)), width (e.width), discard (e.discard),
+      type (e.type), modifier (e.modifier), char_class (e.char_class)
+  { }
+
+  scanf_format_elt& operator = (const scanf_format_elt& e)
+  {
+    if (this != &e)
+      {
+        text = strsave (e.text);
+        width = e.width;
+        discard = e.discard;
+        type = e.type;
+        modifier = e.modifier;
+        char_class = e.char_class;
+      }
+
+    return *this;
+  }
+
+  ~scanf_format_elt (void) { delete [] text; }
+
+  // The C-style format string.
+  const char *text;
+
+  // The maximum field width.
+  int width;
+
+  // TRUE if we are not storing the result of this conversion.
+  bool discard;
+
+  // Type of conversion -- 'd', 'i', 'o', 'u', 'x', 'e', 'f', 'g',
+  // 'c', 's', 'p', '%', or '['.
+  char type;
+
+  // A length modifier -- 'h', 'l', or 'L'.
+  char modifier;
+
+  // The class of characters in a '[' format.
+  std::string char_class;
+};
+
+class
+scanf_format_list
+{
+public:
+
+  scanf_format_list (const std::string& fmt = "");
+
+  ~scanf_format_list (void);
+
+  octave_idx_type num_conversions (void) { return nconv; }
+
+  // The length can be different than the number of conversions.
+  // For example, "x %d y %d z" has 2 conversions but the length of
+  // the list is 3 because of the characters that appear after the
+  // last conversion.
+
+  size_t length (void) const { return fmt_elts.size (); }
+
+  const scanf_format_elt *first (void)
+  {
+    curr_idx = 0;
+    return current ();
+  }
+
+  const scanf_format_elt *current (void) const
+  {
+    return length () > 0 ? fmt_elts[curr_idx] : 0;
+  }
+
+  const scanf_format_elt *next (bool cycle = true)
+  {
+    static scanf_format_elt dummy
+      (0, 0, false, scanf_format_elt::null, '\0', "");
+
+    curr_idx++;
+
+    if (curr_idx >= length ())
+      {
+        if (cycle)
+          curr_idx = 0;
+        else
+          return &dummy;
+      }
+
+    return current ();
+  }
+
+  void printme (void) const;
+
+  bool ok (void) const { return (nconv >= 0); }
+
+  operator bool () const { return ok (); }
+
+  bool all_character_conversions (void);
+
+  bool all_numeric_conversions (void);
+
+private:
+
+  // Number of conversions specified by this format string, or -1 if
+  // invalid conversions have been found.
+  octave_idx_type nconv;
+
+  // Index to current element;
+  size_t curr_idx;
+
+  // List of format elements.
+  std::deque<scanf_format_elt*> fmt_elts;
+
+  // Temporary buffer.
+  std::ostringstream *buf;
+
+  void add_elt_to_list (int width, bool discard, char type, char modifier,
+                        const std::string& char_class = "");
+
+  void process_conversion (const std::string& s, size_t& i, size_t n,
+                           int& width, bool& discard, char& type,
+                           char& modifier);
+
+  int finish_conversion (const std::string& s, size_t& i, size_t n,
+                         int& width, bool discard, char& type,
+                         char modifier);
+  // No copying!
+
+  scanf_format_list (const scanf_format_list&);
+
+  scanf_format_list& operator = (const scanf_format_list&);
+};
+
 scanf_format_list::scanf_format_list (const std::string& s)
   : nconv (0), curr_idx (0), fmt_elts (), buf (0)
 {
@@ -578,7 +728,143 @@
     return false;
 }
 
-// Ugh again.
+class
+printf_format_elt
+{
+public:
+
+  printf_format_elt (const char *txt = 0, int n = 0, int w = -1,
+                     int p = -1, const std::string& f = "",
+                     char typ = '\0', char mod = '\0')
+    : text (strsave (txt)), args (n), fw (w), prec (p), flags (f),
+      type (typ), modifier (mod)
+  { }
+
+  printf_format_elt (const printf_format_elt& e)
+    : text (strsave (e.text)), args (e.args), fw (e.fw), prec (e.prec),
+      flags (e.flags), type (e.type), modifier (e.modifier)
+  { }
+
+  printf_format_elt& operator = (const printf_format_elt& e)
+  {
+    if (this != &e)
+      {
+        text = strsave (e.text);
+        args = e.args;
+        fw = e.fw;
+        prec = e.prec;
+        flags = e.flags;
+        type = e.type;
+        modifier = e.modifier;
+      }
+
+    return *this;
+  }
+
+  ~printf_format_elt (void) { delete [] text; }
+
+  // The C-style format string.
+  const char *text;
+
+  // How many args do we expect to consume?
+  int args;
+
+  // Field width.
+  int fw;
+
+  // Precision.
+  int prec;
+
+  // Flags -- '-', '+', ' ', '0', or '#'.
+  std::string flags;
+
+  // Type of conversion -- 'd', 'i', 'o', 'x', 'X', 'u', 'c', 's',
+  // 'f', 'e', 'E', 'g', 'G', 'p', or '%'
+  char type;
+
+  // A length modifier -- 'h', 'l', or 'L'.
+  char modifier;
+};
+
+class
+printf_format_list
+{
+public:
+
+  printf_format_list (const std::string& fmt = "");
+
+  ~printf_format_list (void);
+
+  octave_idx_type num_conversions (void) { return nconv; }
+
+  const printf_format_elt *first (void)
+  {
+    curr_idx = 0;
+    return current ();
+  }
+
+  const printf_format_elt *current (void) const
+  {
+    return length () > 0 ? fmt_elts[curr_idx] : 0;
+  }
+
+  size_t length (void) const { return fmt_elts.size (); }
+
+  const printf_format_elt *next (bool cycle = true)
+  {
+    curr_idx++;
+
+    if (curr_idx >= length ())
+      {
+        if (cycle)
+          curr_idx = 0;
+        else
+          return 0;
+      }
+
+    return current ();
+  }
+
+  bool last_elt_p (void) { return (curr_idx + 1 == length ()); }
+
+  void printme (void) const;
+
+  bool ok (void) const { return (nconv >= 0); }
+
+  operator bool () const { return ok (); }
+
+private:
+
+  // Number of conversions specified by this format string, or -1 if
+  // invalid conversions have been found.
+  octave_idx_type nconv;
+
+  // Index to current element;
+  size_t curr_idx;
+
+  // List of format elements.
+  std::deque<printf_format_elt*> fmt_elts;
+
+  // Temporary buffer.
+  std::ostringstream *buf;
+
+  void add_elt_to_list (int args, const std::string& flags, int fw,
+                        int prec, char type, char modifier);
+
+  void process_conversion (const std::string& s, size_t& i, size_t n,
+                           int& args, std::string& flags, int& fw,
+                           int& prec, char& modifier, char& type);
+
+  void finish_conversion (const std::string& s, size_t& i, int args,
+                          const std::string& flags, int fw, int prec,
+                          char modifier, char& type);
+
+  // No copying!
+
+  printf_format_list (const printf_format_list&);
+
+  printf_format_list& operator = (const printf_format_list&);
+};
 
 printf_format_list::printf_format_list (const std::string& s)
   : nconv (0), curr_idx (0), fmt_elts (), buf (0)
--- a/libinterp/corefcn/oct-stream.h	Fri Mar 18 12:25:23 2016 -0400
+++ b/libinterp/corefcn/oct-stream.h	Fri Mar 18 13:10:19 2016 -0400
@@ -25,11 +25,6 @@
 
 #include "octave-config.h"
 
-class Matrix;
-class string_vector;
-class octave_value;
-class octave_value_list;
-
 #include <deque>
 #include <iosfwd>
 #include <list>
@@ -37,299 +32,25 @@
 #include <sstream>
 #include <string>
 
-#include "Array.h"
+// These are only needed as arguments to private functions, so they
+// are also treated as private.
+
+class scanf_format_elt;
+class scanf_format_list;
+class printf_format_elt;
+class printf_format_list;
+
+// These only appear as reference arguments or return values.
+
+template <typename T> class Array;
+class string_vector;
+class octave_value;
+class octave_value_list;
+
 #include "data-conv.h"
-#include "lo-utils.h"
 #include "mach-info.h"
 #include "oct-refcount.h"
 
-class
-OCTINTERP_API
-scanf_format_elt
-{
-public:
-
-  enum special_conversion
-  {
-    whitespace_conversion = 1,
-    literal_conversion = 2,
-    null = 3
-  };
-
-  scanf_format_elt (const char *txt = 0, int w = 0, bool d = false,
-                    char typ = '\0', char mod = '\0',
-                    const std::string& ch_class = "")
-    : text (strsave (txt)), width (w), discard (d), type (typ),
-      modifier (mod), char_class (ch_class) { }
-
-  scanf_format_elt (const scanf_format_elt& e)
-    : text (strsave (e.text)), width (e.width), discard (e.discard),
-      type (e.type), modifier (e.modifier), char_class (e.char_class) { }
-
-  scanf_format_elt& operator = (const scanf_format_elt& e)
-  {
-    if (this != &e)
-      {
-        text = strsave (e.text);
-        width = e.width;
-        discard = e.discard;
-        type = e.type;
-        modifier = e.modifier;
-        char_class = e.char_class;
-      }
-
-    return *this;
-  }
-
-  ~scanf_format_elt (void) { delete [] text; }
-
-  // The C-style format string.
-  const char *text;
-
-  // The maximum field width.
-  int width;
-
-  // TRUE if we are not storing the result of this conversion.
-  bool discard;
-
-  // Type of conversion -- 'd', 'i', 'o', 'u', 'x', 'e', 'f', 'g',
-  // 'c', 's', 'p', '%', or '['.
-  char type;
-
-  // A length modifier -- 'h', 'l', or 'L'.
-  char modifier;
-
-  // The class of characters in a '[' format.
-  std::string char_class;
-};
-
-class
-OCTINTERP_API
-scanf_format_list
-{
-public:
-
-  scanf_format_list (const std::string& fmt = "");
-
-  ~scanf_format_list (void);
-
-  octave_idx_type num_conversions (void) { return nconv; }
-
-  // The length can be different than the number of conversions.
-  // For example, "x %d y %d z" has 2 conversions but the length of
-  // the list is 3 because of the characters that appear after the
-  // last conversion.
-
-  size_t length (void) const { return fmt_elts.size (); }
-
-  const scanf_format_elt *first (void)
-  {
-    curr_idx = 0;
-    return current ();
-  }
-
-  const scanf_format_elt *current (void) const
-  {
-    return length () > 0 ? fmt_elts[curr_idx] : 0;
-  }
-
-  const scanf_format_elt *next (bool cycle = true)
-  {
-    static scanf_format_elt dummy
-      (0, 0, false, scanf_format_elt::null, '\0', "");
-
-    curr_idx++;
-
-    if (curr_idx >= length ())
-      {
-        if (cycle)
-          curr_idx = 0;
-        else
-          return &dummy;
-      }
-
-    return current ();
-  }
-
-  void printme (void) const;
-
-  bool ok (void) const { return (nconv >= 0); }
-
-  operator bool () const { return ok (); }
-
-  bool all_character_conversions (void);
-
-  bool all_numeric_conversions (void);
-
-private:
-
-  // Number of conversions specified by this format string, or -1 if
-  // invalid conversions have been found.
-  octave_idx_type nconv;
-
-  // Index to current element;
-  size_t curr_idx;
-
-  // List of format elements.
-  std::deque<scanf_format_elt*> fmt_elts;
-
-  // Temporary buffer.
-  std::ostringstream *buf;
-
-  void add_elt_to_list (int width, bool discard, char type, char modifier,
-                        const std::string& char_class = "");
-
-  void process_conversion (const std::string& s, size_t& i, size_t n,
-                           int& width, bool& discard, char& type,
-                           char& modifier);
-
-  int finish_conversion (const std::string& s, size_t& i, size_t n,
-                         int& width, bool discard, char& type,
-                         char modifier);
-  // No copying!
-
-  scanf_format_list (const scanf_format_list&);
-
-  scanf_format_list& operator = (const scanf_format_list&);
-};
-
-class
-printf_format_elt
-{
-public:
-
-  printf_format_elt (const char *txt = 0, int n = 0, int w = -1,
-                     int p = -1, const std::string& f = "",
-                     char typ = '\0', char mod = '\0')
-    : text (strsave (txt)), args (n), fw (w), prec (p), flags (f),
-      type (typ), modifier (mod) { }
-
-  printf_format_elt (const printf_format_elt& e)
-    : text (strsave (e.text)), args (e.args), fw (e.fw), prec (e.prec),
-      flags (e.flags), type (e.type), modifier (e.modifier) { }
-
-  printf_format_elt& operator = (const printf_format_elt& e)
-  {
-    if (this != &e)
-      {
-        text = strsave (e.text);
-        args = e.args;
-        fw = e.fw;
-        prec = e.prec;
-        flags = e.flags;
-        type = e.type;
-        modifier = e.modifier;
-      }
-
-    return *this;
-  }
-
-  ~printf_format_elt (void) { delete [] text; }
-
-  // The C-style format string.
-  const char *text;
-
-  // How many args do we expect to consume?
-  int args;
-
-  // Field width.
-  int fw;
-
-  // Precision.
-  int prec;
-
-  // Flags -- '-', '+', ' ', '0', or '#'.
-  std::string flags;
-
-  // Type of conversion -- 'd', 'i', 'o', 'x', 'X', 'u', 'c', 's',
-  // 'f', 'e', 'E', 'g', 'G', 'p', or '%'
-  char type;
-
-  // A length modifier -- 'h', 'l', or 'L'.
-  char modifier;
-};
-
-class
-OCTINTERP_API
-printf_format_list
-{
-public:
-
-  printf_format_list (const std::string& fmt = "");
-
-  ~printf_format_list (void);
-
-  octave_idx_type num_conversions (void) { return nconv; }
-
-  const printf_format_elt *first (void)
-  {
-    curr_idx = 0;
-    return current ();
-  }
-
-  const printf_format_elt *current (void) const
-  {
-    return length () > 0 ? fmt_elts[curr_idx] : 0;
-  }
-
-  size_t length (void) const { return fmt_elts.size (); }
-
-  const printf_format_elt *next (bool cycle = true)
-  {
-    curr_idx++;
-
-    if (curr_idx >= length ())
-      {
-        if (cycle)
-          curr_idx = 0;
-        else
-          return 0;
-      }
-
-    return current ();
-  }
-
-  bool last_elt_p (void) { return (curr_idx + 1 == length ()); }
-
-  void printme (void) const;
-
-  bool ok (void) const { return (nconv >= 0); }
-
-  operator bool () const { return ok (); }
-
-private:
-
-  // Number of conversions specified by this format string, or -1 if
-  // invalid conversions have been found.
-  octave_idx_type nconv;
-
-  // Index to current element;
-  size_t curr_idx;
-
-  // List of format elements.
-  std::deque<printf_format_elt*> fmt_elts;
-
-  // Temporary buffer.
-  std::ostringstream *buf;
-
-  void add_elt_to_list (int args, const std::string& flags, int fw,
-                        int prec, char type, char modifier);
-
-  void process_conversion (const std::string& s, size_t& i, size_t n,
-                           int& args, std::string& flags, int& fw,
-                           int& prec, char& modifier, char& type);
-
-  void finish_conversion (const std::string& s, size_t& i, int args,
-                          const std::string& flags, int fw, int prec,
-                          char modifier, char& type);
-
-  // No copying!
-
-  printf_format_list (const printf_format_list&);
-
-  printf_format_list& operator = (const printf_format_list&);
-};
-
 // Provide an interface for Octave streams.
 
 class