static void output_indent_if_needed(void) { if (at_line_start) { at_line_start = FALSE; output_indentation(); } }
virtual int_type put (char_type c) { int_type result = traits_type::to_int_type (c); try { bool defaulting = false; if (!hold_.empty () && hold_.back () == '(') { // We don't need to hold it any more. unbuffer (); if (c == '\n') indentation_.push (indentation_.top () + spaces_); else indentation_.push (position_); } switch (c) { case '\n': { hold_.push_back (c); position_ = 0; // Starting a new line. if (construct_ == JAVA_COMMENT) { //std::cerr << "end comment" << endl; construct_ = OTHER; } break; } case '{': { ensure_new_line (); output_indentation (); result = write (c); ensure_new_line (); indentation_.push (indentation_.top () + spaces_); break; } case '}': { if (indentation_.size () > 1) indentation_.pop (); // Reduce multiple newlines to one. while (hold_.size () > 1) { typename Hold::reverse_iterator i = hold_.rbegin (); if (*i == '\n' && *(i + 1) == '\n') hold_.pop_back (); else break; } ensure_new_line (); output_indentation (); hold_.push_back (c); // Add newline after '}'. // ensure_new_line (); break; } case ';': { if (paren_balance_ != 0) { // We are inside for (;;) statement. Nothing to do here. // defaulting = true; } else if (construct_ != STRING_LITERAL && construct_ != CHAR_LITERAL) { output_indentation (); result = write (c); ensure_new_line (); } break; } case '\\': { if (construct_ != JAVA_COMMENT) { output_indentation (); hold_.push_back (c); position_++; } else defaulting = true; break; } case '\"': { if (construct_ != JAVA_COMMENT && (hold_.empty () || hold_.back () != '\\')) { // not escape sequence if (construct_ == STRING_LITERAL) construct_ = OTHER; else construct_ = STRING_LITERAL; } defaulting = true; break; } case '\'': { if (construct_ != JAVA_COMMENT && (hold_.empty () || hold_.back () != '\\')) { // not escape sequence if (construct_ == CHAR_LITERAL) construct_ = OTHER; else { //std::cerr << "char literal" << endl; construct_ = CHAR_LITERAL; } } defaulting = true; break; } case '(': { if (construct_ == OTHER) { // Hold it so that we can see what's coming next. // output_indentation (); hold_.push_back (c); position_++; paren_balance_++; } else defaulting = true; break; } case ')': { if (construct_ == OTHER) { if (indentation_.size () > 1) indentation_.pop (); if (paren_balance_ > 0) paren_balance_--; } defaulting = true; break; } case '/': { if (construct_ == OTHER) { if (!hold_.empty () && hold_.back () == '/') { construct_ = JAVA_COMMENT; //std::cerr << "start comment" << endl; defaulting = true; } else { output_indentation (); hold_.push_back (c); position_++; } } else { defaulting = true; } break; } default: { defaulting = true; break; } } if (defaulting) { output_indentation (); result = write (c); position_++; } } catch (Full const&) { result = traits_type::eof (); } return result; }