+ for (char const *cp = s.ch_C (); *cp; cp++)
+ switch (*cp)
+ {
+ case '{':
+ case '[':
+ case '(': indent_level_i_ += INDTAB;
+ *os_l_ << *cp;
+ break;
+
+ case ')':
+ case ']':
+ case '}':
+ indent_level_i_ -= INDTAB;
+ *os_l_ << *cp ;
+
+ assert (indent_level_i_>=0) ;
+ break;
+
+ case '\n':
+ *os_l_ << '\n' << to_str (' ', indent_level_i_) << flush;
+ break;
+ default:
+ *os_l_ << *cp;
+ break;
+ }
+ return ;
+}
+
+
+Dstream::Dstream (ostream *r, char const * cfg_nm)
+{
+ os_l_ = r;
+ silent_assoc_p_ = new Assoc<String,bool>;
+ default_silence_b_ = false;
+ indent_level_i_ = 0;
+ if (!os_l_)
+ return;
+
+ char const * fn =cfg_nm ? cfg_nm : ".dstreamrc";
+ {
+ ifstream ifs (fn); // can 't open
+ if (!ifs)
+ return;
+ }
+
+ Text_db cfg (fn);
+ while (!cfg.eof_b ()){
+ Text_record r (cfg++);
+ if (r.size() != 2)
+ {
+ r.message (_ ("Not enough fields in Dstream init."));
+ continue;
+ }
+ (*silent_assoc_p_)[r[0]] = (bool)(int)(Scalar (r[1]));
+ }
+
+ if ((*silent_assoc_p_).elem_b ("Dstream_default_silence"))
+ default_silence_b_ = (*silent_assoc_p_)["Dstream_default_silence"];
+}
+
+
+Dstream::~Dstream()
+{
+ delete silent_assoc_p_;
+ assert (!indent_level_i_) ;
+}
+
+void
+Dstream::clear_silence()
+{
+ for (Assoc_iter<String, bool> i (*silent_assoc_p_); i.ok(); i++)
+ {
+ i.val() = false;
+ }
+}