15 #include <sys/types.h>
17 #include "absl/strings/str_cat.h"
20 #define access _access
33 File::File(FILE*
const f_des,
const absl::string_view&
name)
34 : f_(f_des), name_(
name) {}
42 stat(name_.data(), &f_stat);
43 return f_stat.st_size;
49 if (fclose(f_) == 0) {
59 return absl::Status(absl::StatusCode::kInvalidArgument,
"Wrong flags");
62 : absl::Status(absl::StatusCode::kInvalidArgument,
63 absl::StrCat(
"Could not close file '", name_,
"'"));
67 CHECK_EQ(fread(buf, 1, size, f_), size);
71 return fread(buf, 1, size, f_);
75 CHECK_EQ(fwrite(buf, 1, size, f_), size);
78 return fwrite(buf, 1, size, f_);
82 FILE*
const f_des = fopen(
name, flag);
84 std::cerr <<
"Cannot open " <<
name;
92 FILE*
const f_des = fopen(
name, flag);
93 if (f_des == NULL)
return NULL;
99 return fgets(output, max_length, f_);
103 CHECK(output !=
nullptr);
106 if (max_length == 0)
return 0;
108 int64 needed = max_length;
109 int bufsize = (needed < (2 << 20) ? needed : (2 << 20));
111 std::unique_ptr<char[]> buf(
new char[bufsize]);
115 nread = Read(buf.get(), (bufsize < needed ? bufsize : needed));
117 output->append(buf.get(), nread);
123 return (nread >= 0 ?
static_cast<int64>(output->size()) : -1);
127 return Write(line.c_str(), line.size());
131 if (Write(line.c_str(), line.size()) != line.size())
return false;
132 return Write(
"\n", 1) == 1;
142 absl::Status
Open(
const absl::string_view& filename,
143 const absl::string_view& mode,
File** f,
int flags) {
147 return absl::OkStatus();
150 return absl::Status(absl::StatusCode::kInvalidArgument,
151 absl::StrCat(
"Could not open '", filename,
"'"));
155 const absl::string_view& mode,
int flags) {
159 CHECK(f !=
nullptr) << absl::StrCat(
"Could not open '", filename,
"'");
163 absl::Status
GetContents(
const absl::string_view& filename, std::string* output,
169 if (
file->ReadToString(output, size) == size)
return absl::OkStatus();
172 return absl::Status(absl::StatusCode::kInvalidArgument,
173 absl::StrCat(
"Could not read '", filename,
"'"));
179 file->Write(contents.data(), contents.size()) == contents.size() &&
181 return absl::OkStatus();
184 absl::StatusCode::kInvalidArgument,
185 absl::StrCat(
"Could not write ", contents.size(),
" bytes"));
189 const absl::string_view& contents,
int flags) {
198 const absl::string_view& file_name) {
203 class NoOpErrorCollector :
public google::protobuf::io::ErrorCollector {
205 virtual void AddError(
int line,
int column,
const std::string&
message) {}
210 google::protobuf::Message*
proto) {
213 LOG(
INFO) <<
"Could not read " << file_name;
222 NoOpErrorCollector error_collector;
223 google::protobuf::TextFormat::Parser parser;
224 parser.RecordErrorsTo(&error_collector);
225 if (parser.ParseFromString(str,
proto)) {
228 if (
proto->ParseFromString(str)) {
233 google::protobuf::TextFormat::ParseFromString(str,
proto);
234 LOG(
INFO) <<
"Could not parse contents of " << file_name;
239 google::protobuf::Message*
proto) {
244 const absl::string_view& file_name) {
245 std::string proto_string;
246 return google::protobuf::TextFormat::PrintToString(
proto, &proto_string) &&
251 const absl::string_view& file_name) {
256 const absl::string_view& file_name) {
257 std::string proto_string;
258 return proto.AppendToString(&proto_string) &&
263 const absl::string_view& file_name) {
268 google::protobuf::Message*
proto,
int flags) {
273 absl::StatusCode::kInvalidArgument,
274 absl::StrCat(
"Could not read proto from '", filename,
"'."));
278 const google::protobuf::Message&
proto,
int flags) {
283 absl::StatusCode::kInvalidArgument,
284 absl::StrCat(
"Could not write proto to '", filename,
"'."));
288 const google::protobuf::Message&
proto,
int flags) {
293 absl::StatusCode::kInvalidArgument,
294 absl::StrCat(
"Could not write proto to '", filename,
"'."));
297 absl::Status
Delete(
const absl::string_view& path,
int flags) {
299 if (remove(path.data()) == 0)
return absl::OkStatus();
301 return absl::Status(absl::StatusCode::kInvalidArgument,
302 absl::StrCat(
"Could not delete '", path,
"'."));
305 absl::Status
Exists(
const absl::string_view& path,
int flags) {
307 if (access(path.data(), F_OK) == 0)
return absl::OkStatus();
309 return absl::Status(absl::StatusCode::kInvalidArgument,
310 absl::StrCat(
"File '", path,
"' does not exist."));