/*=============================================================================
    Copyright (c) 2002 2004 Joel de Guzman
    Copyright (c) 2004 Eric Niebler
    http://spirit.sourceforge.net/

    Use, modification and distribution is subject to the Boost Software
    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
    http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#if !defined(BOOST_SPIRIT_QUICKBOOK_UTILS_HPP)
#define BOOST_SPIRIT_QUICKBOOK_UTILS_HPP

#include <string>
#include <iostream>
#include <cctype>
#include <boost/ref.hpp>
#include <boost/assert.hpp>

namespace quickbook { namespace detail
{
    void
    print_char(char ch, std::ostream& out);

    void
    print_string(std::basic_string<char> const& str, std::ostream& out);

    void
    print_space(char ch, std::ostream& out);

    void
    convert_nbsp(std::basic_string<char>& str);

    char
    filter_identifier_char(char ch);

    template <typename Iterator>
    inline std::string
    make_identifier(Iterator const& first, Iterator const& last)
    {
        std::string out_name;
        for (Iterator i = first; i != last; ++i)
            out_name += filter_identifier_char(*i);
        return out_name;
    }

    template <typename T>
    struct var_wrapper
        : public ::boost::reference_wrapper<T>
    {
        typedef ::boost::reference_wrapper<T> parent;

        explicit inline var_wrapper(T& t) : parent(t) {}

        inline T& operator()() const { return parent::get(); }
    };

    template <typename T>
    inline var_wrapper<T>
    var(T& t)
    {
        return var_wrapper<T>(t);
    }

    // un-indent a code segment
    void unindent(std::string& program);

    // remove the extension from a filename
    std::string
    remove_extension(std::string const& filename);
    
    std::string escape_uri(std::string uri);
    
    // Preformats an error/warning message so that it can be parsed by
    // common IDEs. Uses the ms_errors global to determine if VS format
    // or GCC format. Returns the stream to continue ouput of the verbose
    // error message.
    std::ostream & outerr(const std::string & file, int line);
    std::ostream & outwarn(const std::string & file, int line);
}}

#endif // BOOST_SPIRIT_QUICKBOOK_UTILS_HPP