int OOBase::File::open(const char* filename, bool writeable) { if (!filename) return EINVAL; #if defined(_WIN32) ScopedArrayPtr<wchar_t> wname; int err = Win32::utf8_to_wchar_t(filename,wname); if (err) return err; DWORD dwAccess = GENERIC_READ; DWORD dwDisp = OPEN_EXISTING; if (writeable) { dwAccess |= GENERIC_WRITE; dwDisp = OPEN_ALWAYS; } m_fd = ::CreateFileW(wname.get(),dwAccess,FILE_SHARE_READ,NULL,dwDisp,FILE_ATTRIBUTE_NORMAL,NULL); if (!m_fd.valid()) return ::GetLastError(); #elif defined(HAVE_UNISTD_H) int flags = O_RDONLY; if (writeable) flags = O_RDWR | O_CREAT; m_fd = POSIX::open(filename,flags,0664); if (!m_fd.valid()) return errno; #endif return 0; }
bool OOBase::Environment::getenv(const char* envvar, String& strValue) { ScopedArrayPtr<wchar_t> wenvvar; ScopedArrayPtr<wchar_t> wenv; int err = Win32::utf8_to_wchar_t(envvar,wenvvar); for (DWORD dwLen = 128;!err;) { if (!wenv.resize(dwLen)) return false; DWORD dwActualLen = GetEnvironmentVariableW(wenvvar.get(),wenv.get(),dwLen); if (dwActualLen < dwLen) { if (dwActualLen == 0) { err = GetLastError(); if (err == ERROR_ENVVAR_NOT_FOUND) err = 0; } else if (dwActualLen > 1) err = strValue.wchar_t_to_utf8(wenv.get()); break; } dwLen = dwActualLen; } return err == 0; }
int OOBase::CmdArgs::parse(options_t& options, arguments_t& args, int skip) const { int argc = 0; UniquePtr<LPWSTR,Win32::LocalAllocator> argvw(CommandLineToArgvW(GetCommandLineW(),&argc)); if (!argvw) return GetLastError(); ScopedArrayPtr<const char*> argv; Vector<SharedString<ThreadLocalAllocator>,ThreadLocalAllocator> arg_strings; if (!argv.resize(argc) || !arg_strings.resize(argc)) return system_error(); for (int i=0;i<argc;++i) { int err = arg_strings[i].wchar_t_to_utf8(argvw.get()[i]); if (err) return err; argv[i] = arg_strings[i].c_str(); } return parse(argc,argv.get(),options,args,skip); }
int OOBase::Environment::get_block(const env_table_t& tabEnv, ScopedArrayPtr<wchar_t>& ptr) { if (tabEnv.empty()) return 0; // Copy and widen to UNICODE typedef SharedPtr<wchar_t> temp_wchar_t; // Sort environment block - UNICODE, no-locale, case-insensitive (from MSDN) struct env_sort { bool operator ()(const OOBase::SharedPtr<wchar_t>& s1, const OOBase::SharedPtr<wchar_t>& s2) const { return (_wcsicmp(s1.get(),s2.get()) < 0); } }; StackAllocator<1024> allocator; Table<temp_wchar_t,temp_wchar_t,env_sort,AllocatorInstance> wenv(env_sort(),allocator); size_t total_size = 0; for (env_table_t::const_iterator i=tabEnv.begin();i;++i) { int err = Win32::utf8_to_wchar_t(i->first.c_str(),ptr); if (!err) { // Include \0 and optionally '=' length size_t len = wcslen(ptr.get()); total_size += len + 1; temp_wchar_t key = make_shared(static_cast<wchar_t*>(allocator.allocate(len+1,alignment_of<wchar_t>::value)),allocator); if (!key) return ERROR_OUTOFMEMORY; wcscpy(key.get(),ptr.get()); err = Win32::utf8_to_wchar_t(i->second.c_str(),ptr); if (!err) { temp_wchar_t value; len = wcslen(ptr.get()); if (len) { total_size += len + 1; value = make_shared(static_cast<wchar_t*>(allocator.allocate(len+1,alignment_of<wchar_t>::value)),allocator); if (!value) return ERROR_OUTOFMEMORY; wcscpy(value.get(),ptr.get()); } if (!wenv.insert(key,value)) return ERROR_OUTOFMEMORY; } } if (err) return err; } // And now copy into one giant block if (!ptr.resize(total_size + 2)) return ERROR_OUTOFMEMORY; wchar_t* pout = ptr.get(); for (Table<temp_wchar_t,temp_wchar_t,env_sort,AllocatorInstance>::iterator i=wenv.begin();i;++i) { const wchar_t* p = i->first.get(); while (*p != L'\0') *pout++ = *p++; p = i->second.get(); if (p && *p != L'\0') { *pout++ = L'='; while (*p != L'\0') *pout++ = *p++; } *pout++ = L'\0'; } // Terminate with \0 *pout++ = L'\0'; *pout++ = L'\0'; return 0; }