Ticket #9428: po_environ_dirty_fix.patch

File po_environ_dirty_fix.patch, 2.7 KB (added by abel@…, 9 years ago)

quick & dirty fix for program_options

  • boost/program_options/environment_iterator.hpp

    diff -Naur a/boost/program_options/environment_iterator.hpp b/boost/program_options/environment_iterator.hpp
    a b  
    1212#include <string>
    1313#include <cassert>
    1414
     15#if defined(_WIN32)
     16#include <windows.h>
     17#endif
     18
     19#if defined(_WIN32) && defined(__MINGW32__)
     20#define ENVIRON_IT_TYPE LPTCH
     21#else
     22#define ENVIRON_IT_TYPE char**
     23#endif
     24
    1525namespace boost {
    1626
    1727    class environment_iterator
     
    1929                              std::pair<std::string, std::string> >
    2030    {
    2131    public:
    22         environment_iterator(char** environment)
     32        environment_iterator(ENVIRON_IT_TYPE environment)
    2333        : m_environment(environment)
    2434        {
    2535            get();
     
    3545            if (*m_environment == 0)
    3646                found_eof();
    3747            else {
     48#if defined(_WIN32) && defined(__MINGW32__)
     49                std::string s(m_environment);
     50#else
    3851                std::string s(*m_environment);
     52#endif
    3953                std::string::size_type n = s.find('=');
    4054                assert(n != s.npos);
    4155                value().first = s.substr(0, n);
    4256                value().second = s.substr(n+1);
    43             }           
    44             ++m_environment;
     57#if defined(_WIN32) && defined(__MINGW32__)
     58                                m_environment += s.length() + 1;
     59#else
     60                                ++m_environment;
     61#endif
     62            }
    4563        }
    4664       
    4765    private:
    48         char** m_environment;
     66        ENVIRON_IT_TYPE m_environment;
    4967    };
    5068}
     69
     70#undef ENVIRON_IT_TYPE
     71
    5172#endif
  • libs/program_options/src/parsers.cpp

    diff -Naur a/libs/program_options/src/parsers.cpp b/libs/program_options/src/parsers.cpp
    a b  
    3030
    3131#ifdef _WIN32
    3232#include <stdlib.h>
     33#include <windows.h>
    3334#else
    3435#include <unistd.h>
    3536#endif
     
    190191                      const function1<std::string, std::string>& name_mapper)
    191192    {
    192193        parsed_options result(&desc);
     194
     195#if defined(_WIN32) && defined(__MINGW32__)             
     196                LPTCH environ = GetEnvironmentStrings();
     197#endif
    193198       
    194199        for(environment_iterator i(environ), e; i != e; ++i) {
    195200            string option_name = name_mapper(i->first);
     
    201206                result.options.push_back(n);
    202207            }               
    203208        }
     209               
     210#if defined(_WIN32) && defined(__MINGW32__)
     211                FreeEnvironmentStrings(environ);
     212#endif
    204213
    205214        return result;
    206215    }