summaryrefslogtreecommitdiff
path: root/libbackend-elements/backend-elements/indentation
diff options
context:
space:
mode:
Diffstat (limited to 'libbackend-elements/backend-elements/indentation')
-rw-r--r--libbackend-elements/backend-elements/indentation/buffer.hxx61
-rw-r--r--libbackend-elements/backend-elements/indentation/buffer.txx12
-rw-r--r--libbackend-elements/backend-elements/indentation/clip.hxx173
-rw-r--r--libbackend-elements/backend-elements/indentation/clip.txx12
-rw-r--r--libbackend-elements/backend-elements/indentation/cxx.hxx1016
-rw-r--r--libbackend-elements/backend-elements/indentation/cxx.txx12
-rw-r--r--libbackend-elements/backend-elements/indentation/idl.hxx290
-rw-r--r--libbackend-elements/backend-elements/indentation/idl.txx11
-rw-r--r--libbackend-elements/backend-elements/indentation/sloc.hxx277
9 files changed, 0 insertions, 1864 deletions
diff --git a/libbackend-elements/backend-elements/indentation/buffer.hxx b/libbackend-elements/backend-elements/indentation/buffer.hxx
deleted file mode 100644
index 7058814..0000000
--- a/libbackend-elements/backend-elements/indentation/buffer.hxx
+++ /dev/null
@@ -1,61 +0,0 @@
-// file : backend-elements/indentation/buffer.hxx
-// author : Boris Kolpackov <boris@kolpackov.net>
-// copyright : Copyright (c) 2005-2010 Boris Kolpackov
-// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
-
-#ifndef BACKEND_ELEMENTS_INDENTATION_BUFFER_HXX
-#define BACKEND_ELEMENTS_INDENTATION_BUFFER_HXX
-
-#include <backend-elements/types.hxx>
-
-#include <string>
-
-namespace BackendElements
-{
- namespace Indentation
- {
- template <typename C>
- class Buffer: public NonCopyable
- {
- public:
- struct Write {};
-
- public:
- virtual
- ~Buffer ()
- {
- }
-
- public:
- typedef
- std::char_traits<C>
- Traits;
-
- typedef
- typename Traits::char_type
- AsChar;
-
- typedef
- typename Traits::int_type
- AsInt;
-
- public:
- virtual AsInt
- put (AsChar c) = 0;
-
- // Unbuffer flushes internal formatting buffers (if any).
- // Note that unbuffer is not exactly flushing since it can
- // result in formatting errors and in general can not be
- // called at arbitrary points. Natural use case would be
- // to call unbuffer at the end of the stream when no more
- // data is expected.
- //
- virtual Void
- unbuffer () = 0;
- };
- }
-}
-
-#include <backend-elements/indentation/buffer.txx>
-
-#endif // BACKEND_ELEMENTS_INDENTATION_BUFFER_HXX
diff --git a/libbackend-elements/backend-elements/indentation/buffer.txx b/libbackend-elements/backend-elements/indentation/buffer.txx
deleted file mode 100644
index 57ba7ab..0000000
--- a/libbackend-elements/backend-elements/indentation/buffer.txx
+++ /dev/null
@@ -1,12 +0,0 @@
-// file : backend-elements/indentation/buffer.txx
-// author : Boris Kolpackov <boris@kolpackov.net>
-// copyright : Copyright (c) 2005-2010 Boris Kolpackov
-// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
-
-namespace BackendElements
-{
- namespace Indentation
- {
- }
-}
-
diff --git a/libbackend-elements/backend-elements/indentation/clip.hxx b/libbackend-elements/backend-elements/indentation/clip.hxx
deleted file mode 100644
index 068ed0d..0000000
--- a/libbackend-elements/backend-elements/indentation/clip.hxx
+++ /dev/null
@@ -1,173 +0,0 @@
-// file : backend-elements/indentation/clip.hxx
-// author : Boris Kolpackov <boris@kolpackov.net>
-// copyright : Copyright (c) 2005-2010 Boris Kolpackov
-// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
-
-#ifndef BACKEND_ELEMENTS_INDENTATION_CLIP_HXX
-#define BACKEND_ELEMENTS_INDENTATION_CLIP_HXX
-
-#include <backend-elements/types.hxx>
-
-#include <backend-elements/indentation/buffer.hxx>
-
-#include <ostream>
-
-namespace BackendElements
-{
- namespace Indentation
- {
- template <typename C>
- class ToStreambufAdapter: public std::basic_streambuf<C>,
- public NonCopyable
- {
- public:
- typedef
- typename std::basic_streambuf<C>::traits_type
- Traits;
-
- typedef
- typename std::basic_streambuf<C>::char_type
- AsChar;
-
- typedef
- typename std::basic_streambuf<C>::int_type
- AsInt;
-
- public:
- ToStreambufAdapter (Buffer<C>& buffer)
- : buffer_ (buffer)
- {
- }
-
- virtual AsInt
- overflow (AsInt ch)
- {
- return buffer_.put (Traits::to_char_type (ch));
- }
-
- virtual Int
- sync ()
- {
- return 0;
- }
-
- private:
- Buffer<C>& buffer_;
- };
-
-
- template <typename C>
- class FromStreambufAdapter: public Buffer<C>
- {
- public:
- typedef
- typename Buffer<C>::Traits
- Traits;
-
- typedef
- typename Buffer<C>::AsChar
- AsChar;
-
- typedef
- typename Buffer<C>::AsInt
- AsInt;
-
- typedef
- typename Buffer<C>::Write
- Write;
-
- public:
- FromStreambufAdapter (std::basic_streambuf<C>& b)
- : buffer_ (b)
- {
- }
-
- virtual AsInt
- put (AsChar ch)
- {
- return buffer_.sputc (ch);
- }
-
- virtual Void
- unbuffer ()
- {
- try
- {
- if (buffer_.pubsync () == 0) return;
- }
- catch (std::ios_base::failure const&)
- {
- }
-
- throw Write ();
- }
-
- private:
- std::basic_streambuf<C>& buffer_;
- };
-
-
- template <template <typename> class Buffer, typename C = Char>
- class Clip: public NonCopyable
- {
- public:
- Clip (std::basic_ostream<C>& os)
- : os_ (os),
- prev_ (os_.rdbuf ()),
- from_adapter_ (*prev_),
- buffer_ (from_adapter_),
- to_adapter_ (buffer_)
- {
- os_.rdbuf (&to_adapter_);
- }
-
- /*
- template <typename Arg0>
- Clip (std::basic_ostream<C>& os, Arg0 a0)
- : os_ (os),
- prev_ (os_.rdbuf ()),
- from_adapter_ (*prev_),
- buffer_ (from_adapter_, a0),
- to_adapter_ (buffer_)
- {
- os_.rdbuf (&to_adapter_);
- }
- */
-
- ~Clip ()
- {
- try
- {
- buffer_.unbuffer ();
- }
- catch (...)
- {
- os_.rdbuf (prev_);
- throw;
- }
-
- os_.rdbuf (prev_);
- }
-
- Buffer<C>&
- buffer ()
- {
- return buffer_;
- }
-
- private:
- std::basic_ostream<C>& os_;
- std::basic_streambuf<C>* prev_;
-
- FromStreambufAdapter<C> from_adapter_;
-
- Buffer<C> buffer_;
-
- ToStreambufAdapter<C> to_adapter_;
- };
- }
-}
-
-#include <backend-elements/indentation/clip.txx>
-
-#endif // BACKEND_ELEMENTS_INDENTATION_CLIP_HXX
diff --git a/libbackend-elements/backend-elements/indentation/clip.txx b/libbackend-elements/backend-elements/indentation/clip.txx
deleted file mode 100644
index 58112f1..0000000
--- a/libbackend-elements/backend-elements/indentation/clip.txx
+++ /dev/null
@@ -1,12 +0,0 @@
-// file : backend-elements/indentation/clip.txx
-// author : Boris Kolpackov <boris@kolpackov.net>
-// copyright : Copyright (c) 2005-2010 Boris Kolpackov
-// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
-
-namespace BackendElements
-{
- namespace Indentation
- {
- }
-}
-
diff --git a/libbackend-elements/backend-elements/indentation/cxx.hxx b/libbackend-elements/backend-elements/indentation/cxx.hxx
deleted file mode 100644
index f10341a..0000000
--- a/libbackend-elements/backend-elements/indentation/cxx.hxx
+++ /dev/null
@@ -1,1016 +0,0 @@
-// file : backend-elements/indentation/cxx.hxx
-// author : Boris Kolpackov <boris@kolpackov.net>
-// copyright : Copyright (c) 2005-2010 Boris Kolpackov
-// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
-
-#ifndef BACKEND_ELEMENTS_INDENTATION_CXX_HXX
-#define BACKEND_ELEMENTS_INDENTATION_CXX_HXX
-
-#include <backend-elements/types.hxx>
-#include <backend-elements/indentation/buffer.hxx>
-
-#include <cult/containers/set.hxx>
-#include <cult/containers/stack.hxx>
-#include <cult/containers/deque.hxx>
-
-#include <locale>
-
-// #include <iostream> // @@ tmp
-
-namespace BackendElements
-{
- namespace Indentation
- {
- template <typename C>
- class CXX: public Buffer<C>/*, public NonCopyable*/
- {
- public:
- typedef
- typename Buffer<C>::Traits
- Traits;
-
- typedef
- typename Buffer<C>::AsChar
- AsChar;
-
- typedef
- typename Buffer<C>::AsInt
- AsInt;
-
- typedef
- typename Buffer<C>::Write
- Write;
-
- public:
- CXX (Buffer<C>& out)
- : out_ (out),
- buffering_ (false),
- position_ (0),
- paren_balance_ (0),
- spaces_ (2),
- construct_ (Construct::other),
- lbrace_ ("{"),
- rbrace_ ("}")
- // locale_ ("C")
- {
- indentation_.push (0);
-
- single_line_blocks_.insert ("if");
- single_line_blocks_.insert ("do");
- single_line_blocks_.insert ("for");
- single_line_blocks_.insert ("else");
- single_line_blocks_.insert ("case");
- single_line_blocks_.insert ("while");
-
- follow_blocks_.insert ("else");
- follow_blocks_.insert ("case");
- follow_blocks_.insert ("catch");
- follow_blocks_.insert ("default");
- }
-
- public:
- virtual AsInt
- put (AsChar c)
- {
- AsInt result (Traits::to_int_type (c));
-
- try
- {
- // First determine what kind of construct we are in.
- //
- typename Construct::Value new_construct (construct_);
- typename Construct::Value old_construct (construct_);
-
- switch (c)
- {
- case '\n':
- {
- if (construct_ == Construct::pp_directive ||
- construct_ == Construct::cxx_comment)
- construct_ = new_construct = Construct::other;
-
- break;
- }
- case '#':
- {
- if (construct_ == Construct::other)
- construct_ = new_construct = Construct::pp_directive;
-
- break;
- }
- case '\"':
- {
- if (construct_ != Construct::pp_directive &&
- construct_ != Construct::c_comment &&
- construct_ != Construct::cxx_comment &&
- construct_ != Construct::char_literal)
- {
- // We might be in an escape sequence.
- //
- Boolean es (!hold_.empty () && hold_.back () == '\\');
-
- if (es)
- {
- // Scan the hold sequence backwards to figure out if this
- // backslash is part of this escape sequence or a preceding
- // one.
- //
- for (typename Hold::ReverseIterator i (hold_.rbegin () + 1),
- e (hold_.rend ()); i != e && *i == '\\'; ++i)
- es = !es;
- }
-
- if (!es)
- {
- // Not an escape sequence.
- //
- if (construct_ == Construct::string_literal)
- new_construct = Construct::other;
- else
- construct_ = new_construct = Construct::string_literal;
- }
- }
-
- break;
- }
- case '\'':
- {
- if (construct_ != Construct::pp_directive &&
- construct_ != Construct::c_comment &&
- construct_ != Construct::cxx_comment &&
- construct_ != Construct::string_literal)
- {
- // We might be in an escape sequence.
- //
- Boolean es (!hold_.empty () && hold_.back () == '\\');
-
- if (es)
- {
- // Scan the hold sequence backwards to figure out if this
- // backslash is part of this escape sequence or a preceding
- // one.
- //
- for (typename Hold::ReverseIterator i (hold_.rbegin () + 1),
- e (hold_.rend ()); i != e && *i == '\\'; ++i)
- es = !es;
- }
-
- if (!es)
- {
- if (construct_ == Construct::char_literal)
- new_construct = Construct::other;
- else
- construct_ = new_construct = Construct::char_literal;
- }
- }
-
- break;
- }
- case '/':
- {
- if (construct_ == Construct::other)
- {
- if (!hold_.empty () && hold_.back () == '/')
- construct_ = new_construct = Construct::cxx_comment;
- }
-
- if (construct_ == Construct::c_comment)
- {
- if (!hold_.empty () && hold_.back () == '*')
- construct_ = new_construct = Construct::other;
- }
-
- break;
- }
- case '*':
- {
- if (construct_ == Construct::other)
- {
- if (!hold_.empty () && hold_.back () == '/')
- construct_ = new_construct = Construct::c_comment;
- }
-
- break;
- }
- default:
- {
- break;
- }
- }
-
- // Special handling of CPP directives.
- //
- if (construct_ == Construct::pp_directive)
- {
- result = write (c);
- position_++;
- return result;
- }
-
- //
- //
- tokenize (c, old_construct);
-
-
- // Indentation in parenthesis. We don't need to make sure
- // we are not in a comments, etc. because we make sure we
- // don't hold anything in those states.
- //
- if (!hold_.empty () && hold_.back () == '(')
- {
- unbuffer (); // We don't need to hold it anymore.
-
- if (c == '\n')
- indentation_.push (indentation_.top () + spaces_);
- else
- indentation_.push (position_);
- }
-
-
- //
- //
- Boolean defaulting (false);
-
- switch (c)
- {
- case '\n':
- {
- if (!indent_block_.empty () && construct_ == Construct::other)
- indent_block_.top ().newline_ = true;
-
- hold_.push_back (c);
- position_ = 0; // Starting a new line.
-
- break;
- }
- case '{':
- {
- if (construct_ == Construct::other)
- {
- if (!indent_block_.empty ())
- {
- // Pop all the blocks until the one that was indented.
- //
- while (!indent_block_.top ().indented_)
- indent_block_.pop ();
-
- if (indentation_.size () > 1)
- indentation_.pop ();
-
- indent_block_.pop ();
- }
-
- ensure_new_line ();
- output_indentation ();
- result = write (c);
- ensure_new_line ();
-
- indentation_.push (indentation_.top () + spaces_);
- }
- else
- defaulting = true;
-
- break;
- }
- case '}':
- {
- if (construct_ == Construct::other)
- {
- if (indentation_.size () > 1)
- indentation_.pop ();
-
- // Reduce multiple newlines to one.
- //
- while (hold_.size () > 1)
- {
- typename Hold::ReverseIterator i (hold_.rbegin ());
-
- if (*i == '\n' && *(i + 1) == '\n')
- hold_.pop_back ();
- else
- break;
- }
-
- ensure_new_line ();
- output_indentation ();
-
- hold_.push_back (c);
-
-
- // Add double newline after '}'.
- //
- hold_.push_back ('\n');
- hold_.push_back ('\n');
- position_ = 0;
-
- buffering_ = true;
- }
- else
- defaulting = true;
-
- break;
- }
- case ';':
- {
- if (construct_ == Construct::other)
- {
- // for (;;)
- //
- if (!indent_block_.empty () && paren_balance_ == 0)
- {
- // Pop all the blocks until the one that was indented.
- //
- while (!indent_block_.top ().indented_)
- indent_block_.pop ();
-
- if (indentation_.size () > 1)
- indentation_.pop ();
-
- indent_block_.pop ();
- }
-
- if (paren_balance_ != 0)
- {
- // We are inside for (;;) statement. Nothing to do here.
- //
- defaulting = true;
- }
- else
- {
- // Handling '};' case.
- //
-
- Boolean brace (false);
-
- if (hold_.size () > 1 && hold_.back () == '\n')
- {
- Boolean pop_nl (false);
-
- for (typename Hold::ReverseIterator
- i (hold_.rbegin ()), e (hold_.rend ());
- i != e; ++i)
- {
- if (*i != '\n')
- {
- if (*i == '}')
- brace = pop_nl = true;
-
- break;
- }
- }
-
- if (pop_nl)
- while (hold_.back () == '\n')
- hold_.pop_back ();
- }
-
- output_indentation ();
- result = write (c);
- position_++;
-
- if (brace)
- {
- hold_.push_back ('\n');
- hold_.push_back ('\n');
- }
-
- ensure_new_line ();
- }
- }
- else
- defaulting = true;
-
- break;
- }
- case ' ':
- {
- if (construct_ == Construct::other)
- {
- // Handling '} foo_;' case.
- //
- if (hold_.size () > 1 && hold_.back () == '\n')
- {
- Boolean pop_nl (false);
-
- for (typename Hold::ReverseIterator
- i (hold_.rbegin ()), e (hold_.rend ());
- i != e; ++i)
- {
- if (*i != '\n')
- {
- if (*i == '}')
- pop_nl = true;
-
- break;
- }
- }
-
- if (pop_nl)
- while (hold_.back () == '\n')
- hold_.pop_back ();
- }
- }
-
- defaulting = true;
- break;
- }
- case '\\':
- {
- if (construct_ != Construct::pp_directive &&
- construct_ != Construct::c_comment &&
- construct_ != Construct::cxx_comment)
- {
- output_indentation ();
- hold_.push_back (c);
- position_++;
- }
- else
- defaulting = true;
-
- break;
-
- }
- case '(':
- {
- if (construct_ == 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_ == Construct::other)
- {
- if (indentation_.size () > 1)
- indentation_.pop ();
-
- if (paren_balance_ > 0)
- paren_balance_--;
- }
-
- defaulting = true;
- break;
- }
- case '/':
- {
- if (construct_ == Construct::other)
- {
- output_indentation ();
- hold_.push_back (c);
- position_++;
- }
- else
- defaulting = true;
-
- break;
- }
- case '*':
- {
- if (construct_ == Construct::c_comment)
- {
- output_indentation ();
- hold_.push_back (c);
- position_++;
- }
- else
- defaulting = true;
-
- break;
- }
- default:
- {
- defaulting = true;
- break;
- }
- }
-
-
- if (defaulting)
- {
- output_indentation ();
- result = write (c);
- position_++;
- }
-
- construct_ = new_construct;
- }
- catch (Write const&)
- {
- result = Traits::eof ();
- }
-
- return result;
- }
-
- private:
- typedef Cult::StringTemplate<C> String;
-
- Void
- next_token (String const& old, AsChar c)
- {
- //std::cerr << "next token: " << token_
- // << "; old token: " << old << std::endl;
-
- // Handle one line indentation blocks (if, else, etc).
- //
- if (single_line_blocks_.find (token_) != single_line_blocks_.end ())
- {
- // Only indent sub-blocks if we are on a new line.
- //
- Boolean indent (indent_block_.empty () ||
- indent_block_.top ().newline_);
-
- indent_block_.push (IndentBlockInfo (c == '\n', indent));
-
- if (indent)
- indentation_.push (indentation_.top () + spaces_);
- }
-
- // Keep track of the do ... while construct in order to suppress
- // the newline after } and before while.
- //
- if (old == String ("do") && token_ == lbrace_)
- {
- do_while_state_.push (0);
- }
-
- if (!do_while_state_.empty ())
- {
- if (token_ == lbrace_)
- do_while_state_.top ()++;
-
- if (token_ == rbrace_)
- do_while_state_.top ()--;
- }
-
- // Suppress double newline in the "}else", etc., cases.
- //
- if (old == rbrace_)
- {
- Boolean dw (!do_while_state_.empty () &&
- do_while_state_.top () == 0);
-
- if (follow_blocks_.find (token_) != follow_blocks_.end () || dw)
- {
- if (dw)
- do_while_state_.pop ();
-
- // Reduce double newline after "}" into a single one.
- //
- typename Hold::Iterator i (hold_.end ()), b (hold_.begin ());
-
- for (--i; i != b; --i)
- {
- // See if this is the end of the "}\n\n" sequence.
- //
- if (*i == '\n')
- {
- --i;
- if (i != b && *i == '\n')
- {
- --i;
- if (*i == '}')
- {
- ++i;
- hold_.erase (i);
- break;
- }
- }
- }
- }
- }
- else if (token_ != rbrace_)
- {
- buffering_ = false;
- }
- }
- }
-
- public:
- virtual Void
- unbuffer ()
- {
- AsInt result;
-
- while (!hold_.empty ())
- {
- result = out_.put (hold_.front ());
-
- //@@ failed
- if (result == Traits::eof ())
- throw Write ();
-
- hold_.pop_front ();
- }
- }
-
- private:
- Void
- ensure_new_line ()
- {
- if (hold_.empty () || hold_.back () != '\n')
- {
- hold_.push_back ('\n');
- position_ = 0; // Starting a new line.
- }
- }
-
-
- Void
- output_indentation ()
- {
- if (!hold_.empty () && hold_.back () == '\n')
- {
- for (UnsignedLong i (0); i < indentation_.top (); ++i)
- write (' ');
-
- position_ += indentation_.top ();
- }
- }
-
- AsInt
- write (AsChar c)
- {
- hold_.push_back (c);
-
- if (!buffering_)
- {
- AsInt result (Traits::eof ());
-
- while (!hold_.empty ())
- {
- result = out_.put (hold_.front ());
-
- if (result == Traits::eof ())
- throw Write ();
-
- hold_.pop_front ();
- }
-
- return result;
- }
- else
- return c;
- }
-
- private:
- struct Construct
- {
- enum Value
- {
- other,
- pp_directive,
- c_comment,
- cxx_comment,
- string_literal,
- char_literal
- };
- };
-
- Void
- tokenize (AsChar c, typename Construct::Value old)
- {
- //
- //
- switch (construct_)
- {
- case Construct::pp_directive:
- {
- if (old == Construct::other) // Start PP directive
- retire (c);
-
- return;
- }
- case Construct::c_comment:
- {
- if (old == Construct::other) // Start C comment.
- lexeme_.clear ();
-
- return;
- }
- case Construct::cxx_comment:
- {
- if (old == Construct::other) // Start C++ comment.
- lexeme_.clear ();
-
- return;
- }
- case Construct::string_literal:
- {
- if (old == Construct::other) // Start string literal
- retire (c);
-
- lexeme_ += c;
- return;
- }
- case Construct::char_literal:
- {
- if (old == Construct::other) // Start char literal
- retire (c);
-
- lexeme_ += c;
- return;
- }
- default:
- break;
- }
-
- // construct_ == other
- //
- switch (old)
- {
- case Construct::pp_directive:
- {
- // End PP directive (newline).
- //
- return;
- }
- case Construct::c_comment:
- {
- // End C comment.
- //
- return;
- }
- case Construct::cxx_comment:
- {
- // End C++ comment (newline).
- //
- return;
- }
- case Construct::string_literal:
- {
- // End string literal (").
- //
- lexeme_ += c;
- return;
- }
- case Construct::char_literal:
- {
- // End char literal (').
- //
- lexeme_ += c;
- return;
- }
- default:
- break;
- }
-
-
- // construct_ == old == other
- //
-
- /*
-
- The code below is equivalent to this (simpler) code which is
- unfortunately not fast enough.
-
- using std::isalpha;
- using std::isalnum;
- using std::isdigit;
- using std::isspace;
-
- if (c == '_' || isalpha (c, locale_))
- {
- if (lexeme_.empty () ||
- lexeme_[0] == '_' || isalpha (lexeme_[0], locale_))
- lexeme_ += c;
- else
- {
- retire (c);
- lexeme_ += c;
- }
- }
- else if (isdigit (c, locale_))
- {
- if (lexeme_.empty () ||
- lexeme_[0] == '_' || isalnum (lexeme_[0], locale_))
- lexeme_ += c;
- else
- {
- retire (c);
- lexeme_ += c;
- }
- }
- else // Delimiters
- {
- retire (c);
-
- if (!isspace (c, locale_))
- lexeme_ += c;
- }
- */
-
- switch (char_class (c))
- {
- case CharClass::alpha:
- {
- if (lexeme_.empty () ||
- char_class (lexeme_[0]) == CharClass::alpha)
- lexeme_ += c;
- else
- {
- retire (c);
- lexeme_ += c;
- }
- break;
- }
- case CharClass::digit:
- {
- if (lexeme_.empty ())
- lexeme_ += c;
- else
- {
- typename CharClass::Value cc (char_class (lexeme_[0]));
-
- if (cc == CharClass::alpha || cc == CharClass::digit)
- lexeme_ += c;
- else
- {
- retire (c);
- lexeme_ += c;
- }
- }
- break;
- }
- case CharClass::op_punc:
- {
- retire (c);
- lexeme_ += c;
- break;
- }
- case CharClass::space:
- {
- retire (c);
- break;
- }
- }
- }
-
- struct CharClass
- {
- enum Value
- {
- alpha, // Alpha + '_'.
- digit,
- op_punc, // Operator or punctuation.
- space
- };
-
- };
-
- typename CharClass::Value
- char_class (C c)
- {
- switch (c)
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- return CharClass::digit;
-
- case '!':
- case '%':
- case '^':
- case '&':
- case '*':
- case '(':
- case ')':
- case '-':
- case '+':
- case '=':
- case '{':
- case '}':
- case '|':
- case '~':
- case '[':
- case ']':
- case '\\':
- case ';':
- case '\'':
- case ':':
- case '"':
- case '<':
- case '>':
- case '?':
- case ',':
- case '.':
- case '/':
- return CharClass::op_punc;
-
- case ' ':
- case '\n':
- case '\t':
- case '\f':
- case '\r':
- case '\v':
- return CharClass::space;
-
- default:
- return CharClass::alpha;
- }
- }
-
-
- Void
- retire (AsChar c)
- {
- if (!lexeme_.empty ())
- {
- token_.swap (lexeme_);
- next_token (lexeme_, c);
- lexeme_.clear ();
- }
- }
-
- private:
- Buffer<C>& out_;
- Boolean buffering_; // True if write() should buffer the char.
- UnsignedLong position_; // Current position on the line.
- UnsignedLong paren_balance_; // ( ) balance.
- Cult::Containers::Stack<UnsignedLong> indentation_;
- UnsignedLong spaces_;
-
- Boolean suppress_nl_;
-
- //@@ gcc bug# 18304
- //
- typename Construct::Value construct_;
-
- // Special state stach for the do-while construct. The presence
- // of an element in the stack indicates that we are in a braced
- // do-while construct. The value of the element is the brace
- // balance.
- Cult::Containers::Stack<UnsignedLong> do_while_state_;
-
- typedef
- Cult::Containers::Deque<AsInt>
- Hold;
-
- Hold hold_;
-
- private:
- String token_; // previously fully recognized token
- String lexeme_; // current lexeme (accumulator)
-
- // std::locale locale_;
-
- // Keywords that may be folowed by a single-line block, e.g., if,
- // else, etc.
- //
- Cult::Containers::Set<String> single_line_blocks_;
-
- // Keywords that may follow (and be related) to a previous block,
- // e.g., else, case, catch.
- //
- Cult::Containers::Set<String> follow_blocks_;
-
- String lbrace_;
- String rbrace_;
-
- private:
- // Single-line indented blocks such as if, else, while, etc. The
- // newline flag indicates whether a new line has been seen after
- // the keyword. This is needed to properly distinguish cases such
- // as:
- //
- // else if (...)
- // foo ();
- //
- // else
- // if (...)
- // foo ();
- //
- struct IndentBlockInfo
- {
- IndentBlockInfo (Boolean newline, Boolean indented)
- : newline_ (newline), indented_ (indented)
- {
- }
-
- Boolean newline_;
- Boolean indented_;
- };
-
- Cult::Containers::Stack<IndentBlockInfo> indent_block_;
- };
- }
-}
-
-#include <backend-elements/indentation/cxx.txx>
-
-#endif // BACKEND_ELEMENTS_INDENTATION_CXX_HXX
diff --git a/libbackend-elements/backend-elements/indentation/cxx.txx b/libbackend-elements/backend-elements/indentation/cxx.txx
deleted file mode 100644
index 9acff37..0000000
--- a/libbackend-elements/backend-elements/indentation/cxx.txx
+++ /dev/null
@@ -1,12 +0,0 @@
-// file : backend-elements/indentation/cxx.txx
-// author : Boris Kolpackov <boris@kolpackov.net>
-// copyright : Copyright (c) 2005-2010 Boris Kolpackov
-// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
-
-namespace BackendElements
-{
- namespace Indentation
- {
- }
-}
-
diff --git a/libbackend-elements/backend-elements/indentation/idl.hxx b/libbackend-elements/backend-elements/indentation/idl.hxx
deleted file mode 100644
index e5a234f..0000000
--- a/libbackend-elements/backend-elements/indentation/idl.hxx
+++ /dev/null
@@ -1,290 +0,0 @@
-// file : backend-elements/indentation/idl.hxx
-// author : Boris Kolpackov <boris@kolpackov.net>
-// copyright : Copyright (c) 2005-2010 Boris Kolpackov
-// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
-
-#ifndef BACKEND_ELEMENTS_INDENTATION_IDL_HXX
-#define BACKEND_ELEMENTS_INDENTATION_IDL_HXX
-
-#include <backend-elements/types.hxx>
-#include <backend-elements/indentation/buffer.hxx>
-
-#include <cult/containers/deque.hxx>
-
-namespace BackendElements
-{
- namespace Indentation
- {
- template <typename C>
- class IDL: public Buffer<C>, public NonCopyable
- {
- public:
- typedef
- typename Buffer<C>::Traits
- Traits;
-
- typedef
- typename Buffer<C>::AsChar
- AsChar;
-
- typedef
- typename Buffer<C>::AsInt
- AsInt;
-
- typedef
- typename Buffer<C>::Write
- Write;
-
- public:
- IDL (Buffer<C>& out)
- : out_ (out),
- indentation_ (0),
- spaces_ (2),
- construct_ (Construct::other)
- {
- }
-
- public:
- virtual AsInt
- put (AsChar c)
- {
- AsInt result (Traits::to_int_type (c));
-
- try
- {
- Boolean defaulting (false);
-
- switch (c)
- {
- case '\n':
- {
- hold_.push_back (c);
- break;
- }
- case '{':
- {
- ensure_new_line ();
- output_indentation ();
- result = write (c);
- ensure_new_line ();
- indentation_++;
- break;
- }
- case '}':
- {
- if (indentation_ > 0) indentation_--;
-
- // Reduce multiple newlines to one.
- //
- while (hold_.size () > 1)
- {
- typename Hold::ReverseIterator i (hold_.rbegin ());
-
- if (*i == '\n' && *(i + 1) == '\n')
- hold_.pop_back ();
- else
- break;
- }
-
- ensure_new_line ();
- output_indentation ();
-
- hold_.push_back (c);
-
- // Add double newline after '}'.
- //
- hold_.push_back ('\n');
- hold_.push_back ('\n');
-
-
- break;
- }
- case ';':
- {
- // Handling '};' case.
- //
-
- Boolean brace (false);
-
- if (hold_.size () > 1 && hold_.back () == '\n')
- {
- Boolean pop_nl (false);
-
- for (typename Hold::ReverseIterator
- i (hold_.rbegin ()), e (hold_.rend ()); i != e; ++i)
- {
- if (*i != '\n')
- {
- if (*i == '}')
- brace = pop_nl = true;
-
- break;
- }
- }
-
- if (pop_nl)
- while (hold_.back () == '\n')
- hold_.pop_back ();
- }
-
- output_indentation ();
- result = write (c);
-
- if (brace)
- {
- hold_.push_back ('\n');
- hold_.push_back ('\n');
- }
-
- if (construct_ != Construct::string_literal &&
- construct_ != Construct::char_literal)
- {
- ensure_new_line ();
- }
- break;
- }
- case '\\':
- {
- hold_.push_back (c);
- break;
- }
- case '\"':
- {
- if (hold_.empty () || hold_.back () != '\\')
- {
- // not escape sequence
- if (construct_ == Construct::string_literal)
- {
- construct_ = Construct::other;
- }
- else construct_ = Construct::string_literal;
- }
-
- defaulting = true;
- break;
- }
- case '\'':
- {
- if (hold_.empty () || hold_.back () != '\\')
- {
- // not escape sequence
- if (construct_ == Construct::char_literal)
- {
- construct_ = Construct::other;
- }
- else construct_ = Construct::char_literal;
- }
-
- defaulting = true;
- break;
- }
- default:
- {
- defaulting = true;
- break;
- }
- }
-
- if (defaulting)
- {
- output_indentation ();
- result = write (c);
- }
- }
- catch (Write const&)
- {
- result = Traits::eof ();
- }
-
- return result;
- }
-
- virtual Void
- unbuffer ()
- {
- AsInt result;
-
- while (!hold_.empty ())
- {
- result = out_.put (hold_.front ());
-
- //@@ failed
- if (result == Traits::eof ())
- throw Write ();
-
- hold_.pop_front ();
- }
- }
-
- private:
- Void
- ensure_new_line ()
- {
- if (hold_.empty () || hold_.back () != '\n')
- hold_.push_back ('\n');
- }
-
-
- Void
- output_indentation ()
- {
- if (!hold_.empty () && hold_.back () == '\n')
- for (UnsignedLong i (0); i < indentation_ * spaces_; ++i)
- write (' ');
- }
-
- AsInt
- write (AsChar c)
- {
- hold_.push_back (c);
-
- AsInt result (Traits::eof ());
-
- while (!hold_.empty ())
- {
- result = out_.put (hold_.front ());
-
- if (result == Traits::eof ())
- throw Write ();
-
- hold_.pop_front ();
- }
-
- return result;
- }
-
-
- private:
-
- Buffer<C>& out_;
- UnsignedLong indentation_;
- UnsignedLong spaces_;
-
- Boolean suppress_nl_;
-
- struct Construct
- {
- enum Value
- {
- other,
- string_literal,
- char_literal
- };
- };
-
- //@@ gcc bug# 18304
- //
- typename Construct::Value construct_;
-
- typedef
- Cult::Containers::Deque<AsInt>
- Hold;
-
- Hold hold_;
- };
- }
-}
-
-#include <backend-elements/indentation/idl.txx>
-
-#endif // BACKEND_ELEMENTS_INDENTATION_IDL_HXX
diff --git a/libbackend-elements/backend-elements/indentation/idl.txx b/libbackend-elements/backend-elements/indentation/idl.txx
deleted file mode 100644
index 6ddc63e..0000000
--- a/libbackend-elements/backend-elements/indentation/idl.txx
+++ /dev/null
@@ -1,11 +0,0 @@
-// file : backend-elements/indentation/idl.txx
-// author : Boris Kolpackov <boris@kolpackov.net>
-// copyright : Copyright (c) 2005-2010 Boris Kolpackov
-// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
-
-namespace BackendElements
-{
- namespace Indentation
- {
- }
-}
diff --git a/libbackend-elements/backend-elements/indentation/sloc.hxx b/libbackend-elements/backend-elements/indentation/sloc.hxx
deleted file mode 100644
index 57e6989..0000000
--- a/libbackend-elements/backend-elements/indentation/sloc.hxx
+++ /dev/null
@@ -1,277 +0,0 @@
-// file : backend-elements/indentation/sloc.hxx
-// author : Boris Kolpackov <boris@kolpackov.net>
-// copyright : Copyright (c) 2005-2010 Boris Kolpackov
-// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
-
-#ifndef BACKEND_ELEMENTS_INDENTATION_SLOC_HXX
-#define BACKEND_ELEMENTS_INDENTATION_SLOC_HXX
-
-#include <backend-elements/types.hxx>
-#include <backend-elements/indentation/buffer.hxx>
-
-#include <cctype>
-#include <iostream> //@@ tmp
-
-namespace BackendElements
-{
- namespace Indentation
- {
- template <typename C>
- class SLOC: public Buffer<C>/*, public NonCopyable*/
- {
- public:
- typedef
- typename Buffer<C>::Traits
- Traits;
-
- typedef
- typename Buffer<C>::AsChar
- AsChar;
-
- typedef
- typename Buffer<C>::AsInt
- AsInt;
-
- typedef
- typename Buffer<C>::Write
- Write;
-
- public:
- SLOC (Buffer<C>& out)
- : out_ (out),
- count_ (0),
- prev_ ('\0'),
- code_counted_ (false),
- construct_ (Construct::code)
- {
- }
-
- UnsignedLong
- count () const
- {
- return count_;
- }
-
- public:
- virtual AsInt
- put (AsChar c)
- {
- typename Construct::Value old (construct_);
-
- switch (construct_)
- {
- case Construct::code:
- {
- code (c);
- break;
- }
- case Construct::c_comment:
- {
- c_comment (c);
- break;
- }
- case Construct::cxx_comment:
- {
- cxx_comment (c);
- break;
- }
- case Construct::char_literal:
- {
- char_literal (c);
- break;
- }
- case Construct::string_literal:
- {
- string_literal (c);
- break;
- }
- }
-
- // There are cases when a previous character has been already
- // 'used' and therefore can not be used again. Good example
- // would be '/* *//'. Here, the second slash doesn't start
- // C++ comment since it was already used by C comment.
- //
- // To account for this we are going to set prev_ to '\0' when
- // the mode changes.
- //
-
- prev_ = (old == construct_) ? c : '\0';
-
- return out_.put (c);
- }
-
- virtual Void
- unbuffer ()
- {
- }
-
- private:
- Void
- code (AsChar c)
- {
- bool count (true);
-
- switch (c)
- {
- case '/':
- {
- if (prev_ == '/')
- {
- construct_ = Construct::cxx_comment;
- count = false;
- }
- else
- {
- // This slash can be a beginning of a comment but we
- // yet have no way to know. Will have to examine it later
- // (see below).
- //
- count = false;
- }
-
- break;
- }
- case '*':
- {
- if (prev_ == '/')
- {
- construct_ = Construct::c_comment;
- count = false;
- }
- break;
- }
- case '\'':
- {
- construct_ = Construct::char_literal;
- break;
- }
- case '"':
- {
- construct_ = Construct::string_literal;
- break;
- }
- case '\n':
- {
- code_counted_ = false; // reset for a new line
- count = false;
- break;
- }
- default:
- {
- if (std::isspace (c))
- count = false;
- break;
- }
- }
-
- // The second condition here accounts for the fact that we cannot
- // count '/' right away since it can be a beginning of a comment.
- //
- if (!code_counted_ &&
- (count || (prev_ == '/' && construct_ == Construct::code)))
- {
- //std::wcerr << "detected code @ " << c << std::endl;
- count_++;
- code_counted_ = true;
- }
- }
-
- Void
- c_comment (AsChar c)
- {
- switch (c)
- {
- case '/':
- {
- if (prev_ == '*')
- construct_ = Construct::code;
- break;
- }
- case '\n':
- {
- code_counted_ = false; // reset for a new line
- break;
- }
- }
- }
-
- Void
- cxx_comment (AsChar c)
- {
- switch (c)
- {
- case '\n':
- {
- construct_ = Construct::code;
- code_counted_ = false; // reset for a new line
- break;
- }
- }
- }
-
- Void
- char_literal (AsChar c)
- {
- switch (c)
- {
- case '\'':
- {
- if (prev_ != '\\')
- construct_ = Construct::code;
- break;
- }
- }
- }
-
- Void
- string_literal (AsChar c)
- {
- switch (c)
- {
- case '"':
- {
- if (prev_ != '\\')
- construct_ = Construct::code;
- break;
- }
- case '\n':
- {
- /*@@ Should I count multi-line string literal as multiple SLOC? */
- break;
- }
- }
- }
-
- private:
- Buffer<C>& out_;
- UnsignedLong count_;
-
- AsChar prev_; // previous character or '\0'
-
- struct Construct
- {
- enum Value
- {
- code,
- c_comment,
- cxx_comment,
- char_literal,
- string_literal
- };
- };
-
- // code
- //
- bool code_counted_;
-
- //@@ gcc bug# 18304
- //
- typename Construct::Value construct_;
- };
- }
-}
-
-//#include <backend-elements/indentation/sloc.txx>
-
-#endif // BACKEND_ELEMENTS_INDENTATION_SLOC_HXX