xref: /aosp_15_r20/external/federated-compute/fcp/base/platform.cc (revision 14675a029014e728ec732f129a32e299b2da0601)
1*14675a02SAndroid Build Coastguard Worker /*
2*14675a02SAndroid Build Coastguard Worker  * Copyright 2017 Google LLC
3*14675a02SAndroid Build Coastguard Worker  *
4*14675a02SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*14675a02SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*14675a02SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*14675a02SAndroid Build Coastguard Worker  *
8*14675a02SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*14675a02SAndroid Build Coastguard Worker  *
10*14675a02SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*14675a02SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*14675a02SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*14675a02SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*14675a02SAndroid Build Coastguard Worker  * limitations under the License.
15*14675a02SAndroid Build Coastguard Worker  */
16*14675a02SAndroid Build Coastguard Worker 
17*14675a02SAndroid Build Coastguard Worker #include "fcp/base/platform.h"
18*14675a02SAndroid Build Coastguard Worker 
19*14675a02SAndroid Build Coastguard Worker #include <stdlib.h>
20*14675a02SAndroid Build Coastguard Worker #include <sys/stat.h>
21*14675a02SAndroid Build Coastguard Worker 
22*14675a02SAndroid Build Coastguard Worker #include <cstdio>
23*14675a02SAndroid Build Coastguard Worker #include <fstream>
24*14675a02SAndroid Build Coastguard Worker #include <sstream>
25*14675a02SAndroid Build Coastguard Worker #include <string>
26*14675a02SAndroid Build Coastguard Worker 
27*14675a02SAndroid Build Coastguard Worker #include "absl/status/status.h"
28*14675a02SAndroid Build Coastguard Worker 
29*14675a02SAndroid Build Coastguard Worker #ifdef _WIN32
30*14675a02SAndroid Build Coastguard Worker #include <direct.h>
31*14675a02SAndroid Build Coastguard Worker #endif
32*14675a02SAndroid Build Coastguard Worker 
33*14675a02SAndroid Build Coastguard Worker #include "absl/strings/str_cat.h"
34*14675a02SAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
35*14675a02SAndroid Build Coastguard Worker #include "absl/strings/strip.h"
36*14675a02SAndroid Build Coastguard Worker #include "fcp/base/monitoring.h"
37*14675a02SAndroid Build Coastguard Worker 
38*14675a02SAndroid Build Coastguard Worker namespace fcp {
39*14675a02SAndroid Build Coastguard Worker 
40*14675a02SAndroid Build Coastguard Worker namespace {
41*14675a02SAndroid Build Coastguard Worker #ifdef _WIN32
42*14675a02SAndroid Build Coastguard Worker constexpr char kPathSeparator[] = "\\";
43*14675a02SAndroid Build Coastguard Worker #else
44*14675a02SAndroid Build Coastguard Worker constexpr char kPathSeparator[] = "/";
45*14675a02SAndroid Build Coastguard Worker #endif
46*14675a02SAndroid Build Coastguard Worker }  // namespace
47*14675a02SAndroid Build Coastguard Worker 
ConcatPath(absl::string_view path1,absl::string_view path2)48*14675a02SAndroid Build Coastguard Worker std::string ConcatPath(absl::string_view path1, absl::string_view path2) {
49*14675a02SAndroid Build Coastguard Worker   if (path1.empty()) {
50*14675a02SAndroid Build Coastguard Worker     return std::string(path2);
51*14675a02SAndroid Build Coastguard Worker   }
52*14675a02SAndroid Build Coastguard Worker   return absl::StrCat(path1, kPathSeparator, path2);
53*14675a02SAndroid Build Coastguard Worker }
54*14675a02SAndroid Build Coastguard Worker 
StripTrailingPathSeparator(absl::string_view path)55*14675a02SAndroid Build Coastguard Worker absl::string_view StripTrailingPathSeparator(absl::string_view path) {
56*14675a02SAndroid Build Coastguard Worker   return absl::StripSuffix(path, kPathSeparator);
57*14675a02SAndroid Build Coastguard Worker }
58*14675a02SAndroid Build Coastguard Worker 
59*14675a02SAndroid Build Coastguard Worker namespace internal {
60*14675a02SAndroid Build Coastguard Worker 
61*14675a02SAndroid Build Coastguard Worker template <typename T>
ReadFile(absl::string_view file_name)62*14675a02SAndroid Build Coastguard Worker absl::StatusOr<T> ReadFile(absl::string_view file_name) {
63*14675a02SAndroid Build Coastguard Worker   auto file_name_str = std::string(file_name);
64*14675a02SAndroid Build Coastguard Worker   std::ifstream is(file_name_str);
65*14675a02SAndroid Build Coastguard Worker   if (!is) {
66*14675a02SAndroid Build Coastguard Worker     return absl::InternalError(
67*14675a02SAndroid Build Coastguard Worker         absl::StrCat("cannot read file ", file_name_str));
68*14675a02SAndroid Build Coastguard Worker   }
69*14675a02SAndroid Build Coastguard Worker   std::ostringstream buffer;
70*14675a02SAndroid Build Coastguard Worker   buffer << is.rdbuf();
71*14675a02SAndroid Build Coastguard Worker   if (!is) {
72*14675a02SAndroid Build Coastguard Worker     return absl::InternalError(
73*14675a02SAndroid Build Coastguard Worker         absl::StrCat("error reading file ", file_name_str));
74*14675a02SAndroid Build Coastguard Worker   }
75*14675a02SAndroid Build Coastguard Worker   return static_cast<T>(buffer.str());
76*14675a02SAndroid Build Coastguard Worker }
77*14675a02SAndroid Build Coastguard Worker 
78*14675a02SAndroid Build Coastguard Worker }  // namespace internal
79*14675a02SAndroid Build Coastguard Worker 
ReadFileToString(absl::string_view file_name)80*14675a02SAndroid Build Coastguard Worker absl::StatusOr<std::string> ReadFileToString(absl::string_view file_name) {
81*14675a02SAndroid Build Coastguard Worker   return internal::ReadFile<std::string>(file_name);
82*14675a02SAndroid Build Coastguard Worker }
83*14675a02SAndroid Build Coastguard Worker 
ReadFileToCord(absl::string_view file_name)84*14675a02SAndroid Build Coastguard Worker absl::StatusOr<absl::Cord> ReadFileToCord(absl::string_view file_name) {
85*14675a02SAndroid Build Coastguard Worker   return internal::ReadFile<absl::Cord>(file_name);
86*14675a02SAndroid Build Coastguard Worker }
87*14675a02SAndroid Build Coastguard Worker 
WriteStringToFile(absl::string_view file_name,absl::string_view content)88*14675a02SAndroid Build Coastguard Worker absl::Status WriteStringToFile(absl::string_view file_name,
89*14675a02SAndroid Build Coastguard Worker                                absl::string_view content) {
90*14675a02SAndroid Build Coastguard Worker   auto file_name_str = std::string(file_name);
91*14675a02SAndroid Build Coastguard Worker   std::ofstream os(file_name_str);
92*14675a02SAndroid Build Coastguard Worker   if (!os) {
93*14675a02SAndroid Build Coastguard Worker     return absl::InternalError(
94*14675a02SAndroid Build Coastguard Worker         absl::StrCat("cannot create file ", file_name_str));
95*14675a02SAndroid Build Coastguard Worker   }
96*14675a02SAndroid Build Coastguard Worker   os << content;
97*14675a02SAndroid Build Coastguard Worker   if (!os) {
98*14675a02SAndroid Build Coastguard Worker     return absl::InternalError(
99*14675a02SAndroid Build Coastguard Worker         absl::StrCat("error writing to file ", file_name_str));
100*14675a02SAndroid Build Coastguard Worker   }
101*14675a02SAndroid Build Coastguard Worker   return absl::OkStatus();
102*14675a02SAndroid Build Coastguard Worker }
103*14675a02SAndroid Build Coastguard Worker 
WriteCordToFile(absl::string_view file_name,const absl::Cord & content)104*14675a02SAndroid Build Coastguard Worker absl::Status WriteCordToFile(absl::string_view file_name,
105*14675a02SAndroid Build Coastguard Worker                              const absl::Cord& content) {
106*14675a02SAndroid Build Coastguard Worker   auto file_name_str = std::string(file_name);
107*14675a02SAndroid Build Coastguard Worker   std::ofstream os(file_name_str);
108*14675a02SAndroid Build Coastguard Worker   if (!os) {
109*14675a02SAndroid Build Coastguard Worker     return absl::InternalError(
110*14675a02SAndroid Build Coastguard Worker         absl::StrCat("cannot create file ", file_name_str));
111*14675a02SAndroid Build Coastguard Worker   }
112*14675a02SAndroid Build Coastguard Worker   for (absl::string_view chunk : content.Chunks()) {
113*14675a02SAndroid Build Coastguard Worker     os << chunk;
114*14675a02SAndroid Build Coastguard Worker     if (!os) {
115*14675a02SAndroid Build Coastguard Worker       return absl::InternalError(
116*14675a02SAndroid Build Coastguard Worker           absl::StrCat("error writing to file ", file_name_str));
117*14675a02SAndroid Build Coastguard Worker     }
118*14675a02SAndroid Build Coastguard Worker   }
119*14675a02SAndroid Build Coastguard Worker   return absl::OkStatus();
120*14675a02SAndroid Build Coastguard Worker }
121*14675a02SAndroid Build Coastguard Worker 
FileExists(absl::string_view file_name)122*14675a02SAndroid Build Coastguard Worker bool FileExists(absl::string_view file_name) {
123*14675a02SAndroid Build Coastguard Worker   struct stat info;
124*14675a02SAndroid Build Coastguard Worker   return stat(std::string(file_name).c_str(), &info) == 0;
125*14675a02SAndroid Build Coastguard Worker }
126*14675a02SAndroid Build Coastguard Worker 
GetDataPath(absl::string_view relative_path)127*14675a02SAndroid Build Coastguard Worker std::string GetDataPath(absl::string_view relative_path) {
128*14675a02SAndroid Build Coastguard Worker   return std::string(relative_path);
129*14675a02SAndroid Build Coastguard Worker }
130*14675a02SAndroid Build Coastguard Worker 
131*14675a02SAndroid Build Coastguard Worker }  // namespace fcp
132