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