Boost logo

Boost-Commit :

From: eric_at_[hidden]
Date: 2007-12-11 17:00:09


Author: eric_niebler
Date: 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
New Revision: 41984
URL: http://svn.boost.org/trac/boost/changeset/41984

Log:
Merged revisions 41954-41983 via svnmerge from
https://svn.boost.org/svn/boost/trunk

........
  r41955 | schoepflin | 2007-12-10 05:40:56 -0800 (Mon, 10 Dec 2007) | 1 line
  
  Treated Rogue Wave library concept check failure on Tru64/CXX.
........
  r41956 | dave | 2007-12-10 07:19:21 -0800 (Mon, 10 Dec 2007) | 2 lines
  
  SunPro 5.9 can't detect lvalue returns
........
  r41957 | t_schwinger | 2007-12-10 10:26:38 -0800 (Mon, 10 Dec 2007) | 3 lines
  
  changes msvc-7.1 to msvc-7.1*
........
  r41966 | johnmaddock | 2007-12-11 08:37:22 -0800 (Tue, 11 Dec 2007) | 1 line
  
  Fixes #1454.
........
  r41968 | johnmaddock | 2007-12-11 09:16:21 -0800 (Tue, 11 Dec 2007) | 1 line
  
  Fixes #1504.
........
  r41970 | johnmaddock | 2007-12-11 09:19:03 -0800 (Tue, 11 Dec 2007) | 1 line
  
  Fixes #1455.
........
  r41973 | johnmaddock | 2007-12-11 09:28:15 -0800 (Tue, 11 Dec 2007) | 1 line
  
  Fixes #1471.
........
  r41976 | johnmaddock | 2007-12-11 10:51:57 -0800 (Tue, 11 Dec 2007) | 1 line
  
  Fixes #1474.
........
  r41979 | vladimir_prus | 2007-12-11 11:41:47 -0800 (Tue, 11 Dec 2007) | 1 line
  
  Put add-usage-requirements back
........
  r41980 | vladimir_prus | 2007-12-11 11:45:37 -0800 (Tue, 11 Dec 2007) | 1 line
  
  Implement ISFILE for real
........
  r41981 | vladimir_prus | 2007-12-11 11:46:19 -0800 (Tue, 11 Dec 2007) | 2 lines
  
  When searching for headers, ignore directories, just like gcc does.
........
  r41983 | bgubenko | 2007-12-11 12:43:11 -0800 (Tue, 11 Dec 2007) | 1 line
  
  remove conditionalization for aCC: this header works with gcc on HP-UX also
........

Properties modified:
   branches/proto/v3/ (props changed)
Text files modified:
   branches/proto/v3/boost/iterator/detail/config_def.hpp | 4 +++-
   branches/proto/v3/boost/math/tools/traits.hpp | 4 ++--
   branches/proto/v3/boost/numeric/interval/detail/ia64_rounding_control.hpp | 6 +++---
   branches/proto/v3/boost/regex/v4/cpp_regex_traits.hpp | 2 +-
   branches/proto/v3/boost/regex/v4/regex_workaround.hpp | 9 ++++++---
   branches/proto/v3/boost/tr1/detail/config.hpp | 12 ++++++++++++
   branches/proto/v3/boost/type_traits/alignment_of.hpp | 2 +-
   branches/proto/v3/libs/concept_check/stl_concept_check.cpp | 3 ++-
   branches/proto/v3/libs/math/test/compile_test/sf_digamma_incl_test.cpp | 2 +-
   branches/proto/v3/libs/math/test/test_policy_sf.cpp | 2 +-
   branches/proto/v3/libs/regex/example/snippets/regex_match_example.cpp | 2 +-
   branches/proto/v3/libs/regex/example/snippets/regex_split_example_1.cpp | 2 +-
   branches/proto/v3/libs/regex/example/snippets/regex_token_iterator_eg_1.cpp | 2 +-
   branches/proto/v3/status/explicit-failures-markup.xml | 12 +++++++++++-
   branches/proto/v3/tools/build/v2/build/generators.jam | 22 +++++++++++++++++++++-
   branches/proto/v3/tools/build/v2/build/scanner.jam | 1 +
   branches/proto/v3/tools/build/v2/tools/builtin.jam | 2 ++
   branches/proto/v3/tools/jam/src/compile.c | 5 +++--
   branches/proto/v3/tools/jam/src/filesys.h | 5 +++++
   branches/proto/v3/tools/jam/src/hcache.c | 8 +++++---
   branches/proto/v3/tools/jam/src/make.c | 3 ++-
   branches/proto/v3/tools/jam/src/make1.c | 3 ++-
   branches/proto/v3/tools/jam/src/rules.c | 2 +-
   branches/proto/v3/tools/jam/src/search.c | 15 +++++++++++----
   branches/proto/v3/tools/jam/src/search.h | 2 +-
   25 files changed, 100 insertions(+), 32 deletions(-)

Modified: branches/proto/v3/boost/iterator/detail/config_def.hpp
==============================================================================
--- branches/proto/v3/boost/iterator/detail/config_def.hpp (original)
+++ branches/proto/v3/boost/iterator/detail/config_def.hpp 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -49,7 +49,9 @@
 #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
     || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x531)) \
     || (BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 700) && defined(_MSC_VER)) \
- || BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042))
+ || BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) \
+ || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
+
 # define BOOST_NO_LVALUE_RETURN_DETECTION
 
 # if 0 // test code

Modified: branches/proto/v3/boost/math/tools/traits.hpp
==============================================================================
--- branches/proto/v3/boost/math/tools/traits.hpp (original)
+++ branches/proto/v3/boost/math/tools/traits.hpp 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -29,8 +29,8 @@
 
 namespace detail{
 
-BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_value_type, value_type, true);
-BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_policy_type, policy_type, true);
+BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_value_type, value_type, true)
+BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_policy_type, policy_type, true)
 
 template<class D>
 char cdf(const D& ...);

Modified: branches/proto/v3/boost/numeric/interval/detail/ia64_rounding_control.hpp
==============================================================================
--- branches/proto/v3/boost/numeric/interval/detail/ia64_rounding_control.hpp (original)
+++ branches/proto/v3/boost/numeric/interval/detail/ia64_rounding_control.hpp 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -1,6 +1,6 @@
 /* Boost interval/detail/ia64_rounding_control.hpp file
  *
- * Copyright 2006 Boris Gubenko
+ * Copyright 2006-2007 Boris Gubenko
  *
  * Distributed under the Boost Software License, Version 1.0.
  * (See accompanying file LICENSE_1_0.txt or
@@ -14,7 +14,7 @@
 #error This header only works on ia64 CPUs.
 #endif
 
-#if defined(__HP_aCC)
+#if defined(__hpux)
 
 # include <fenv.h>
 
@@ -77,7 +77,7 @@
 
 #undef BOOST_NUMERIC_INTERVAL_NO_HARDWARE
 
-#endif /* __HP_aCC */
+#endif /* __hpux */
 
 #endif /* BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP */
 

Modified: branches/proto/v3/boost/regex/v4/cpp_regex_traits.hpp
==============================================================================
--- branches/proto/v3/boost/regex/v4/cpp_regex_traits.hpp (original)
+++ branches/proto/v3/boost/regex/v4/cpp_regex_traits.hpp 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -128,7 +128,7 @@
       break;
    case ::std::ios_base::cur:
    {
- std::ptrdiff_t newpos = pos + off;
+ std::ptrdiff_t newpos = static_cast<std::ptrdiff_t>(pos + off);
       if((newpos < 0) || (newpos > size))
          return pos_type(off_type(-1));
       else

Modified: branches/proto/v3/boost/regex/v4/regex_workaround.hpp
==============================================================================
--- branches/proto/v3/boost/regex/v4/regex_workaround.hpp (original)
+++ branches/proto/v3/boost/regex/v4/regex_workaround.hpp 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -150,13 +150,16 @@
       return stdext::unchecked_equal(first, last, with);
    }
 
+#else
+ using std::copy;
+ using std::equal;
+#endif
+#if BOOST_WORKAROUND(BOOST_MSVC,>=1400) && defined(__STDC_WANT_SECURE_LIB__) && __STDC_WANT_SECURE_LIB__
+
    // use safe versions of strcpy etc:
    using ::strcpy_s;
    using ::strcat_s;
 #else
- using std::copy;
- using std::equal;
-
    inline std::size_t strcpy_s(
       char *strDestination,
       std::size_t sizeInBytes,

Modified: branches/proto/v3/boost/tr1/detail/config.hpp
==============================================================================
--- branches/proto/v3/boost/tr1/detail/config.hpp (original)
+++ branches/proto/v3/boost/tr1/detail/config.hpp 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -109,6 +109,18 @@
 
 #endif
 
+#if defined(_MSC_VER) && (_MSC_VER >= 1500) \
+ && defined(_MSC_FULL_VER) && \
+ !defined(__SGI_STL_PORT) && \
+ !defined(_STLPORT_VERSION)
+//
+// MSVC-9.0 defines a not-quite TR1 conforming hash
+// function object in <functional>, so we must define
+// this here:
+//
+# define BOOST_HAS_TR1_HASH
+#endif
+
 #include <boost/config.hpp>
 
 #endif

Modified: branches/proto/v3/boost/type_traits/alignment_of.hpp
==============================================================================
--- branches/proto/v3/boost/type_traits/alignment_of.hpp (original)
+++ branches/proto/v3/boost/type_traits/alignment_of.hpp 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -17,7 +17,7 @@
 
 #ifdef BOOST_MSVC
 # pragma warning(push)
-# pragma warning(disable: 4121) // alignment is sensitive to packing
+# pragma warning(disable: 4121 4512) // alignment is sensitive to packing
 #endif
 #if defined(__BORLANDC__) && (__BORLANDC__ < 0x600)
 #pragma option push -Vx- -Ve-

Modified: branches/proto/v3/libs/concept_check/stl_concept_check.cpp
==============================================================================
--- branches/proto/v3/libs/concept_check/stl_concept_check.cpp (original)
+++ branches/proto/v3/libs/concept_check/stl_concept_check.cpp 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -47,7 +47,8 @@
   function_requires< BackInsertionSequence<Vector> >();
 
 #if !(defined(__GNUC__) && defined(BOOST_HIDE_EXPECTED_ERRORS))
-#if !(defined(__sgi) && defined(BOOST_HIDE_EXPECTED_ERRORS))
+#if !((defined(__sgi) || (defined(__DECCXX) && defined(_RWSTD_VER) && _RWSTD_VER <= 0x0203)) \
+ && defined(BOOST_HIDE_EXPECTED_ERRORS))
   // old deque iterator missing n + iter operation
   function_requires< Mutable_RandomAccessContainer<Deque> >();
 #endif

Modified: branches/proto/v3/libs/math/test/compile_test/sf_digamma_incl_test.cpp
==============================================================================
--- branches/proto/v3/libs/math/test/compile_test/sf_digamma_incl_test.cpp (original)
+++ branches/proto/v3/libs/math/test/compile_test/sf_digamma_incl_test.cpp 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -20,4 +20,4 @@
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
    check_result<long double>(boost::math::digamma<long double>(l));
 #endif
-}
\ No newline at end of file
+}

Modified: branches/proto/v3/libs/math/test/test_policy_sf.cpp
==============================================================================
--- branches/proto/v3/libs/math/test/test_policy_sf.cpp (original)
+++ branches/proto/v3/libs/math/test/test_policy_sf.cpp 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -21,7 +21,7 @@
 
    typedef boost::math::policies::policy<> policy;
 
- BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS(policy);
+ BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS(policy)
 
 }
 

Modified: branches/proto/v3/libs/regex/example/snippets/regex_match_example.cpp
==============================================================================
--- branches/proto/v3/libs/regex/example/snippets/regex_match_example.cpp (original)
+++ branches/proto/v3/libs/regex/example/snippets/regex_match_example.cpp 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -65,7 +65,7 @@
 }
 #endif
 
-int main(int argc)
+int main(int argc, const char*[])
 {
    std::string in, out;
    do

Modified: branches/proto/v3/libs/regex/example/snippets/regex_split_example_1.cpp
==============================================================================
--- branches/proto/v3/libs/regex/example/snippets/regex_split_example_1.cpp (original)
+++ branches/proto/v3/libs/regex/example/snippets/regex_split_example_1.cpp 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -47,7 +47,7 @@
 #endif
 
 
-int main(int argc)
+int main(int argc, const char*[])
 {
    string s;
    list<string> l;

Modified: branches/proto/v3/libs/regex/example/snippets/regex_token_iterator_eg_1.cpp
==============================================================================
--- branches/proto/v3/libs/regex/example/snippets/regex_token_iterator_eg_1.cpp (original)
+++ branches/proto/v3/libs/regex/example/snippets/regex_token_iterator_eg_1.cpp 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -40,7 +40,7 @@
 #endif
 
 
-int main(int argc)
+int main(int argc, const char*[])
 {
    string s;
    do{

Modified: branches/proto/v3/status/explicit-failures-markup.xml
==============================================================================
--- branches/proto/v3/status/explicit-failures-markup.xml (original)
+++ branches/proto/v3/status/explicit-failures-markup.xml 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -443,6 +443,16 @@
                 <note author="Jeremy Siek" refid="1"/>
             </mark-failure>
         </test>
+ <test name="stl_concept_check">
+ <mark-failure>
+ <toolset name="hp_cxx*"/>
+ <note author="Markus Schoepflin" date="09 Dec 2007">
+ This version of the Rogue Wave library fails to provide all
+ needed addition operators for the iterator type and the
+ difference type of std::deque.
+ </note>
+ </mark-failure>
+ </test>
     </library>
 
     <!-- config -->
@@ -1521,7 +1531,7 @@
         </mark-expected-failures>
         <mark-expected-failures>
             <test name="interfaces_example"/>
- <toolset name="msvc-7.1"/>
+ <toolset name="msvc-7.1*"/>
             <note author="Tobias Schwinger">
               Overload selection does not work in some assignment contexts with this compiler.
             </note>

Modified: branches/proto/v3/tools/build/v2/build/generators.jam
==============================================================================
--- branches/proto/v3/tools/build/v2/build/generators.jam (original)
+++ branches/proto/v3/tools/build/v2/build/generators.jam 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -1186,6 +1186,26 @@
     decrease-indent ;
         
     .construct-stack = $(.construct-stack[2-]) ;
-
+
     return $(result) ;
 }
+
+# Given 'result', obtained from some generator or
+# generators.construct, adds 'raw-properties' as usage requirements
+# to it. If result already contains usage requirements -- that is
+# the first element of result of an instance of the property-set class,
+# the existing usage requirements and 'raw-properties' are combined.
+rule add-usage-requirements ( result * : raw-properties * )
+{
+ if $(result)
+ {
+ if [ class.is-a $(result[1]) : property-set ]
+ {
+ return [ $(result[1]).add-raw $(raw-properties) ] $(result[2-]) ;
+ }
+ else
+ {
+ return [ property-set.create $(raw-properties) ] $(result) ;
+ }
+ }
+}

Modified: branches/proto/v3/tools/build/v2/build/scanner.jam
==============================================================================
--- branches/proto/v3/tools/build/v2/build/scanner.jam (original)
+++ branches/proto/v3/tools/build/v2/build/scanner.jam 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -79,6 +79,7 @@
         NOCARE $(matches) ;
         INCLUDES $(target) : $(matches) ;
         SEARCH on $(matches) = $(target_path) $(self.includes:G=) ;
+ ISFILE $(matches) ;
     
         scanner.propagate $(__name__) : $(matches) : $(target) ;
     }

Modified: branches/proto/v3/tools/build/v2/tools/builtin.jam
==============================================================================
--- branches/proto/v3/tools/build/v2/tools/builtin.jam (original)
+++ branches/proto/v3/tools/build/v2/tools/builtin.jam 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -431,6 +431,8 @@
         # Just propagate current scanner to includes, in a hope
         # that includes do not change scanners.
         scanner.propagate $(__name__) : $(angle) $(quoted) : $(target) ;
+
+ ISFILE $(angle) $(quoted) ;
     }
 }
 

Modified: branches/proto/v3/tools/jam/src/compile.c
==============================================================================
--- branches/proto/v3/tools/jam/src/compile.c (original)
+++ branches/proto/v3/tools/jam/src/compile.c 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -372,8 +372,9 @@
 
         pushsettings( t->settings );
         /* We don't expect that file to be included is generated by some
- action. Therefore, pass 0 as third argument. */
- t->boundname = search( t->name, &t->time, 0 );
+ action. Therefore, pass 0 as third argument.
+ If the name resolves to directory, let it error out. */
+ t->boundname = search( t->name, &t->time, 0, 0 );
         popsettings( t->settings );
 
         parse_file( t->boundname, frame );

Modified: branches/proto/v3/tools/jam/src/filesys.h
==============================================================================
--- branches/proto/v3/tools/jam/src/filesys.h (original)
+++ branches/proto/v3/tools/jam/src/filesys.h 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -41,8 +41,13 @@
 } ;
 typedef struct file_info_t file_info_t ;
 
+/* Creates a pointer to information about file
+ 'filename', creating it as necessary. If
+ created, the structure will be default initialized. */
 file_info_t * file_info(char * filename);
 
+/* Returns information about a file, queries the OS
+ if needed. */
 file_info_t * file_query(char * filename);
 
 void file_done();

Modified: branches/proto/v3/tools/jam/src/hcache.c
==============================================================================
--- branches/proto/v3/tools/jam/src/hcache.c (original)
+++ branches/proto/v3/tools/jam/src/hcache.c 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -80,9 +80,11 @@
             TARGET *t = bindtarget( hcachevar->string );
 
             pushsettings( t->settings );
- /* Don't expect cache file to be generated, so pass 0
- as third argument to search. */
- t->boundname = search( t->name, &t->time, 0 );
+ /* Don't expect cache file to be generated, so pass 0
+ as third argument to search.
+ Expect the location to be specified via LOCATE,
+ so pass 0 as fourth arugment. */
+ t->boundname = search( t->name, &t->time, 0, 0 );
             popsettings( t->settings );
 
             if (hcachevar) {

Modified: branches/proto/v3/tools/jam/src/make.c
==============================================================================
--- branches/proto/v3/tools/jam/src/make.c (original)
+++ branches/proto/v3/tools/jam/src/make.c 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -289,7 +289,8 @@
         if( t->binding == T_BIND_UNBOUND && !( t->flags & T_FLAG_NOTFILE ) )
         {
             char* another_target;
- t->boundname = search( t->name, &t->time, &another_target );
+ t->boundname = search( t->name, &t->time, &another_target,
+ (t->flags & T_FLAG_ISFILE));
             /* If it was detected that this target refers to an already
                existing and bound one, we add include dependency, so that
                every target which depends on us will depend on that other

Modified: branches/proto/v3/tools/jam/src/make1.c
==============================================================================
--- branches/proto/v3/tools/jam/src/make1.c (original)
+++ branches/proto/v3/tools/jam/src/make1.c 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -1145,7 +1145,8 @@
             return;
 
         pushsettings( t->settings );
- t->boundname = search( t->name, &t->time, 0 );
+ t->boundname = search( t->name, &t->time, 0,
+ (t->flags & T_FLAG_ISFILE) );
         t->binding = t->time ? T_BIND_EXISTS : T_BIND_MISSING;
         popsettings( t->settings );
 }

Modified: branches/proto/v3/tools/jam/src/rules.c
==============================================================================
--- branches/proto/v3/tools/jam/src/rules.c (original)
+++ branches/proto/v3/tools/jam/src/rules.c 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -165,7 +165,7 @@
                 /* We're binding a target with explicit LOCATE. So
                    third argument is of now use: nothing will be returned
                    through it. */
- t->boundname = search( t->name, &t->time, 0 );
+ t->boundname = search( t->name, &t->time, 0, 0 );
                 popsettings(t->settings);
                 break;
             }

Modified: branches/proto/v3/tools/jam/src/search.c
==============================================================================
--- branches/proto/v3/tools/jam/src/search.c (original)
+++ branches/proto/v3/tools/jam/src/search.c 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -20,6 +20,7 @@
 # include "compile.h"
 # include "strings.h"
 # include "hash.h"
+# include "filesys.h"
 # include <string.h>
 
 typedef struct _binding {
@@ -89,7 +90,8 @@
 search(
     char *target,
     time_t *time,
- char **another_target
+ char **another_target,
+ int file
 )
 {
         PATHNAME f[1];
@@ -135,6 +137,7 @@
         while( varlist )
         {
             BINDING b, *ba = &b;
+ file_info_t *ff;
 
             f->f_root.ptr = varlist->string;
             f->f_root.len = strlen( varlist->string );
@@ -145,6 +148,7 @@
             if( DEBUG_SEARCH )
                 printf( "search %s: %s\n", target, buf->value );
 
+ ff = file_query(buf->value);
             timestamp( buf->value, time );
 
             b.binding = buf->value;
@@ -159,10 +163,13 @@
                 found = 1;
                 break;
             }
- else if( *time )
+ else if( ff && ff->time )
             {
- found = 1;
- break;
+ if (!file || ff->is_file)
+ {
+ found = 1;
+ break;
+ }
             }
 
             varlist = list_next( varlist );

Modified: branches/proto/v3/tools/jam/src/search.h
==============================================================================
--- branches/proto/v3/tools/jam/src/search.h (original)
+++ branches/proto/v3/tools/jam/src/search.h 2007-12-11 17:00:07 EST (Tue, 11 Dec 2007)
@@ -8,4 +8,4 @@
  * search.h - find a target along $(SEARCH) or $(LOCATE)
  */
 
-char *search( char *target, time_t *time, char **another_target );
+char *search( char *target, time_t *time, char **another_target, int file );


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk