diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-07-23 15:21:29 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-07-23 15:21:29 +0200 |
commit | bada6666c70977a058755ccf232e7d67b24adeed (patch) | |
tree | 1e92d50cebce96abaf9bce19e36026c47f77b9ba /libbackend-elements/backend-elements/indentation/sloc.hxx | |
parent | eaf34adcbd8095bc6d1f3371b1227f654c7b19fc (diff) |
New upstream release
Diffstat (limited to 'libbackend-elements/backend-elements/indentation/sloc.hxx')
-rw-r--r-- | libbackend-elements/backend-elements/indentation/sloc.hxx | 277 |
1 files changed, 0 insertions, 277 deletions
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 |