1*a62be085SSadaf Ebrahimi #include "xmpmeta/file.h"
2*a62be085SSadaf Ebrahimi
3*a62be085SSadaf Ebrahimi #include <cstdio>
4*a62be085SSadaf Ebrahimi #include "android-base/logging.h"
5*a62be085SSadaf Ebrahimi
6*a62be085SSadaf Ebrahimi namespace dynamic_depth {
7*a62be085SSadaf Ebrahimi namespace xmpmeta {
8*a62be085SSadaf Ebrahimi
9*a62be085SSadaf Ebrahimi using std::string;
10*a62be085SSadaf Ebrahimi
WriteStringToFileOrDie(const string & data,const string & filename)11*a62be085SSadaf Ebrahimi void WriteStringToFileOrDie(const string& data, const string& filename) {
12*a62be085SSadaf Ebrahimi FILE* file_descriptor = fopen(filename.c_str(), "wb");
13*a62be085SSadaf Ebrahimi if (!file_descriptor) {
14*a62be085SSadaf Ebrahimi LOG(FATAL) << "Couldn't write to file: " << filename;
15*a62be085SSadaf Ebrahimi }
16*a62be085SSadaf Ebrahimi fwrite(data.c_str(), 1, data.size(), file_descriptor);
17*a62be085SSadaf Ebrahimi fclose(file_descriptor);
18*a62be085SSadaf Ebrahimi }
19*a62be085SSadaf Ebrahimi
ReadFileToStringOrDie(const string & filename,string * data)20*a62be085SSadaf Ebrahimi void ReadFileToStringOrDie(const string& filename, string* data) {
21*a62be085SSadaf Ebrahimi FILE* file_descriptor = fopen(filename.c_str(), "r");
22*a62be085SSadaf Ebrahimi
23*a62be085SSadaf Ebrahimi if (!file_descriptor) {
24*a62be085SSadaf Ebrahimi LOG(FATAL) << "Couldn't read file: " << filename;
25*a62be085SSadaf Ebrahimi }
26*a62be085SSadaf Ebrahimi
27*a62be085SSadaf Ebrahimi // Resize the input buffer appropriately.
28*a62be085SSadaf Ebrahimi fseek(file_descriptor, 0L, SEEK_END);
29*a62be085SSadaf Ebrahimi int num_bytes = ftell(file_descriptor);
30*a62be085SSadaf Ebrahimi data->resize(num_bytes);
31*a62be085SSadaf Ebrahimi
32*a62be085SSadaf Ebrahimi // Read the data.
33*a62be085SSadaf Ebrahimi fseek(file_descriptor, 0L, SEEK_SET);
34*a62be085SSadaf Ebrahimi int num_read =
35*a62be085SSadaf Ebrahimi fread(&((*data)[0]), sizeof((*data)[0]), num_bytes, file_descriptor);
36*a62be085SSadaf Ebrahimi if (num_read != num_bytes) {
37*a62be085SSadaf Ebrahimi LOG(FATAL) << "Couldn't read all of " << filename
38*a62be085SSadaf Ebrahimi << "expected bytes: " << num_bytes * sizeof((*data)[0])
39*a62be085SSadaf Ebrahimi << "actual bytes: " << num_read;
40*a62be085SSadaf Ebrahimi }
41*a62be085SSadaf Ebrahimi fclose(file_descriptor);
42*a62be085SSadaf Ebrahimi }
43*a62be085SSadaf Ebrahimi
JoinPath(const string & dirname,const string & basename)44*a62be085SSadaf Ebrahimi string JoinPath(const string& dirname, const string& basename) {
45*a62be085SSadaf Ebrahimi #ifdef _WIN32
46*a62be085SSadaf Ebrahimi static const char separator = '\\';
47*a62be085SSadaf Ebrahimi #else
48*a62be085SSadaf Ebrahimi static const char separator = '/';
49*a62be085SSadaf Ebrahimi #endif // _WIN32
50*a62be085SSadaf Ebrahimi
51*a62be085SSadaf Ebrahimi if ((!basename.empty() && basename[0] == separator) || dirname.empty()) {
52*a62be085SSadaf Ebrahimi return basename;
53*a62be085SSadaf Ebrahimi } else if (dirname[dirname.size() - 1] == separator) {
54*a62be085SSadaf Ebrahimi return dirname + basename;
55*a62be085SSadaf Ebrahimi } else {
56*a62be085SSadaf Ebrahimi return dirname + string(&separator, 1) + basename;
57*a62be085SSadaf Ebrahimi }
58*a62be085SSadaf Ebrahimi }
59*a62be085SSadaf Ebrahimi
60*a62be085SSadaf Ebrahimi } // namespace xmpmeta
61*a62be085SSadaf Ebrahimi } // namespace dynamic_depth
62