Listing 11: Shims returning NULL strings

/* /////////////////////////////////////////////////////////////
 * Extract from stlsoft_string_access.h, atlstl_string_access.h,
 *              mfcstl_string_access.h
 *
 * www:    http://stlsoft.org/, http://atlstl.org/
 *         http://mfcstl.org/
 *
 * Copyright (C) 2002, Synesis Software Pty Ltd.
 * (Licensed under the Synesis Software Standard Source License:
 *  http://www.synesis.com.au/licenses/ssssl.html)
 * ////////////////////////////////////////////////////////// */

namespace stlsoft
{
  /* C-style ANSI string */
  inline char const *c_str_ptr_null(char const *s)
  {
    return s;
  }
  /* std::basic_string */
  template <class C>
  inline C const *c_str_ptr_null(std::basic_string<C> const &s)
  {
    return (s.length() == 0) ? 0 : s.c_str();
  }
} // namespace stlsoft

namespace atlstl
{
  /* CComBSTR */
  inline LPCOLESTR c_str_ptr_null(CComBSTR const &s)
  {
    /* NULL is a valid BSTR value, so may return that */
    return s.m_str;
  }

} // namespace atlstl

namespace mfcstl
{
  /* CString */
  inline LPCTSTR c_str_ptr_null(CString const &s)
  {
    /* CString always points to valid memory, whether its own 
     * CStringData or afxEmptyString.m_pchData
     */
    return s.IsEmpty() ? NULL : (LPCTSTR)s;
  }

} // namespace mfcstl