Mercurial > hg > gpsynth
diff third_party/boost/process/detail/windows_helpers.hpp @ 0:add35537fdbb tip
Initial import
author | irh <ian.r.hobson@gmail.com> |
---|---|
date | Thu, 25 Aug 2011 11:05:55 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/third_party/boost/process/detail/windows_helpers.hpp Thu Aug 25 11:05:55 2011 +0100 @@ -0,0 +1,138 @@ +// +// Boost.Process +// ~~~~~~~~~~~~~ +// +// Copyright (c) 2006, 2007 Julio M. Merino Vidal +// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling +// Copyright (c) 2009 Boris Schaeling +// Copyright (c) 2010 Felipe Tanus, Boris Schaeling +// +// Distributed under 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) +// + +/** + * \file boost/process/detail/windows_helpers.hpp + * + * Includes the declaration of helper functions for Windows systems. + */ + +#ifndef BOOST_PROCESS_WINDOWS_HELPERS_HPP +#define BOOST_PROCESS_WINDOWS_HELPERS_HPP + +#include <boost/process/config.hpp> +#include <boost/process/environment.hpp> +#include <boost/shared_array.hpp> +#include <string> +#include <vector> +#include <cstddef> +#include <string.h> +#include <windows.h> + +namespace boost { +namespace process { +namespace detail { + +/** + * Converts an environment to a string used by CreateProcess(). + * + * Converts the environment's contents to the format used by the + * CreateProcess() system call. The returned char* string is + * allocated in dynamic memory; the caller must free it when not + * used any more. This is enforced by the use of a shared pointer. + * + * This operation is only available on Windows systems. + * + * \return A dynamically allocated char* string that represents + * the environment's content. This string is of the form + * var1=value1\\0var2=value2\\0\\0. + */ +inline boost::shared_array<char> environment_to_windows_strings(environment + &env) +{ + boost::shared_array<char> envp; + + if (env.empty()) + { + envp.reset(new char[2]); + ZeroMemory(envp.get(), 2); + } + else + { + std::string s; + for (environment::const_iterator it = env.begin(); it != env.end(); + ++it) + { + s += it->first + "=" + it->second; + s.push_back(0); + } + envp.reset(new char[s.size() + 1]); +#if (BOOST_MSVC >= 1400) + memcpy_s(envp.get(), s.size() + 1, s.c_str(), s.size() + 1); +#else + memcpy(envp.get(), s.c_str(), s.size() + 1); +#endif + } + + return envp; +} + +/** + * Converts the command line to a plain string. + * + * Converts the command line's list of arguments to the format expected by the + * \a lpCommandLine parameter in the CreateProcess() system call. + * + * This operation is only available on Windows systems. + * + * \return A dynamically allocated string holding the command line + * to be passed to the executable. It is returned in a + * shared_array object to ensure its release at some point. + */ +template <class Arguments> +inline boost::shared_array<char> collection_to_windows_cmdline(const Arguments + &args) +{ + typedef std::vector<std::string> arguments_t; + arguments_t args2; + typename Arguments::size_type i = 0; + std::size_t size = 0; + for (typename Arguments::const_iterator it = args.begin(); it != args.end(); + ++it) + { + std::string arg = *it; + + std::string::size_type pos = 0; + while ( (pos = arg.find('"', pos)) != std::string::npos) + { + arg.replace(pos, 1, "\\\""); + pos += 2; + } + + if (arg.find(' ') != std::string::npos) + arg = '\"' + arg + '\"'; + + if (i++ != args.size() - 1) + arg += ' '; + + args2.push_back(arg); + size += arg.size() + 1; + } + + boost::shared_array<char> cmdline(new char[size]); + cmdline.get()[0] = '\0'; + for (arguments_t::size_type i = 0; i < args.size(); ++i) +#if (BOOST_MSVC >= 1400) + strcat_s(cmdline.get(), size, args2[i].c_str()); +#else + strncat(cmdline.get(), args2[i].c_str(), args2[i].size()); +#endif + + return cmdline; +} + +} +} +} + +#endif