xref: /aosp_15_r20/external/fmtlib/test/util.cc (revision 5c90c05cd622c0a81b57953a4d343e0e489f2e08)
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 Worker fmt::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 Worker std::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 Worker std::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