1*5c90c05cSAndroid Build Coastguard Worker // Formatting library for C++ - test utilities 2*5c90c05cSAndroid Build Coastguard Worker // 3*5c90c05cSAndroid Build Coastguard Worker // Copyright (c) 2012 - present, Victor Zverovich 4*5c90c05cSAndroid Build Coastguard Worker // All rights reserved. 5*5c90c05cSAndroid Build Coastguard Worker // 6*5c90c05cSAndroid Build Coastguard Worker // For the license information refer to format.h. 7*5c90c05cSAndroid Build Coastguard Worker 8*5c90c05cSAndroid Build Coastguard Worker #include "util.h" 9*5c90c05cSAndroid Build Coastguard Worker 10*5c90c05cSAndroid Build Coastguard Worker #include <cstring> 11*5c90c05cSAndroid Build Coastguard Worker 12*5c90c05cSAndroid Build Coastguard Worker const char* const file_content = "Don't panic!"; 13*5c90c05cSAndroid Build Coastguard Worker open_buffered_file(FILE ** fp)14*5c90c05cSAndroid Build Coastguard Workerfmt::buffered_file open_buffered_file(FILE** fp) { 15*5c90c05cSAndroid Build Coastguard Worker #if FMT_USE_FCNTL 16*5c90c05cSAndroid Build Coastguard Worker auto pipe = fmt::pipe(); 17*5c90c05cSAndroid Build Coastguard Worker pipe.write_end.write(file_content, std::strlen(file_content)); 18*5c90c05cSAndroid Build Coastguard Worker pipe.write_end.close(); 19*5c90c05cSAndroid Build Coastguard Worker fmt::buffered_file f = pipe.read_end.fdopen("r"); 20*5c90c05cSAndroid Build Coastguard Worker if (fp) *fp = f.get(); 21*5c90c05cSAndroid Build Coastguard Worker #else 22*5c90c05cSAndroid Build Coastguard Worker fmt::buffered_file f("test-file", "w"); 23*5c90c05cSAndroid Build Coastguard Worker fputs(file_content, f.get()); 24*5c90c05cSAndroid Build Coastguard Worker if (fp) *fp = f.get(); 25*5c90c05cSAndroid Build Coastguard Worker #endif 26*5c90c05cSAndroid Build Coastguard Worker return f; 27*5c90c05cSAndroid Build Coastguard Worker } 28*5c90c05cSAndroid Build Coastguard Worker do_get_locale(const char * name)29*5c90c05cSAndroid Build Coastguard Workerstd::locale do_get_locale(const char* name) { 30*5c90c05cSAndroid Build Coastguard Worker try { 31*5c90c05cSAndroid Build Coastguard Worker return std::locale(name); 32*5c90c05cSAndroid Build Coastguard Worker } catch (const std::runtime_error&) { 33*5c90c05cSAndroid Build Coastguard Worker } 34*5c90c05cSAndroid Build Coastguard Worker return std::locale::classic(); 35*5c90c05cSAndroid Build Coastguard Worker } 36*5c90c05cSAndroid Build Coastguard Worker get_locale(const char * name,const char * alt_name)37*5c90c05cSAndroid Build Coastguard Workerstd::locale get_locale(const char* name, const char* alt_name) { 38*5c90c05cSAndroid Build Coastguard Worker auto loc = do_get_locale(name); 39*5c90c05cSAndroid Build Coastguard Worker if (loc == std::locale::classic() && alt_name) loc = do_get_locale(alt_name); 40*5c90c05cSAndroid Build Coastguard Worker #ifdef __OpenBSD__ 41*5c90c05cSAndroid Build Coastguard Worker // Locales are not working in OpenBSD: 42*5c90c05cSAndroid Build Coastguard Worker // https://github.com/fmtlib/fmt/issues/3670. 43*5c90c05cSAndroid Build Coastguard Worker loc = std::locale::classic(); 44*5c90c05cSAndroid Build Coastguard Worker #endif 45*5c90c05cSAndroid Build Coastguard Worker if (loc == std::locale::classic()) 46*5c90c05cSAndroid Build Coastguard Worker fmt::print(stderr, "{} locale is missing.\n", name); 47*5c90c05cSAndroid Build Coastguard Worker return loc; 48*5c90c05cSAndroid Build Coastguard Worker } 49