| 1 | //  unnamed_namespace_check -----------------------------------------// | 
|---|
| 2 |  | 
|---|
| 3 | //  Copyright Gennaro Prota 2006. | 
|---|
| 4 | // | 
|---|
| 5 | //  Distributed under the Boost Software License, Version 1.0. | 
|---|
| 6 | //  (See accompanying file LICENSE_1_0.txt or copy at | 
|---|
| 7 | //  http://www.boost.org/LICENSE_1_0.txt) | 
|---|
| 8 |  | 
|---|
| 9 | #include "boost/regex.hpp" | 
|---|
| 10 | #include "boost/lexical_cast.hpp" | 
|---|
| 11 | #include "unnamed_namespace_check.hpp" | 
|---|
| 12 |  | 
|---|
| 13 |  | 
|---|
| 14 | namespace | 
|---|
| 15 | { | 
|---|
| 16 |  | 
|---|
| 17 |   boost::regex unnamed_namespace_regex( | 
|---|
| 18 |      "namespace\\s(\\?\\?<|\\{)" // trigraph ??< or { | 
|---|
| 19 |   ); | 
|---|
| 20 |  | 
|---|
| 21 | } // unnamed namespace (ironical? :-) | 
|---|
| 22 |  | 
|---|
| 23 |  | 
|---|
| 24 |  | 
|---|
| 25 | namespace boost | 
|---|
| 26 | { | 
|---|
| 27 |   namespace inspect | 
|---|
| 28 |   { | 
|---|
| 29 |    unnamed_namespace_check::unnamed_namespace_check() : m_errors(0) | 
|---|
| 30 |    { | 
|---|
| 31 |      register_signature( ".h" ); | 
|---|
| 32 |      register_signature( ".hh" ); // just in case | 
|---|
| 33 |      register_signature( ".hpp" ); | 
|---|
| 34 |      register_signature( ".hxx" ); // just in case | 
|---|
| 35 |      register_signature( ".inc" ); | 
|---|
| 36 |      register_signature( ".ipp" ); | 
|---|
| 37 |      register_signature( ".inl" ); | 
|---|
| 38 |    } | 
|---|
| 39 |  | 
|---|
| 40 |    void unnamed_namespace_check::inspect( | 
|---|
| 41 |       const string & library_name, | 
|---|
| 42 |       const path & full_path,   // example: c:/foo/boost/filesystem/path.hpp | 
|---|
| 43 |       const string & contents )     // contents of file to be inspected | 
|---|
| 44 |     { | 
|---|
| 45 |       if (contents.find( "boostinspect:" "nounnamed" ) != string::npos) return; | 
|---|
| 46 |  | 
|---|
| 47 |  | 
|---|
| 48 |       boost::sregex_iterator cur(contents.begin(), contents.end(), unnamed_namespace_regex), end; | 
|---|
| 49 |       for( ; cur != end; ++cur, ++m_errors ) | 
|---|
| 50 |       { | 
|---|
| 51 |         const string::size_type | 
|---|
| 52 |          ln = std::count( contents.begin(), (*cur)[0].first, '\n' ) + 1; | 
|---|
| 53 |  | 
|---|
| 54 |         error( library_name, full_path, string(name()) + " unnamed namespace at line " | 
|---|
| 55 |             + lexical_cast<string>(ln) ); | 
|---|
| 56 |       } | 
|---|
| 57 |  | 
|---|
| 58 |  | 
|---|
| 59 |     } | 
|---|
| 60 |   } // namespace inspect | 
|---|
| 61 | } // namespace boost | 
|---|
| 62 |  | 
|---|
| 63 |  | 
|---|