// Copyright 2015 The Shaderc Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef LIBSHADERC_UTIL_IO_H_
#define LIBSHADERC_UTIL_IO_H_

#include <string>
#include <vector>

#include "string_piece.h"

namespace shaderc_util {

// Returns true if the given path is an absolute path.
bool IsAbsolutePath(const std::string& path);

// A helper function to return the base file name from either absolute path or
// relative path representation of a file. It keeps the component from the last
// '/' or '\' to the end of the given string. If the component is '..' or '.',
// returns an empty string. If '/' or '\' is the last char of the given string,
// also returns an empty string.
// e.g.: dir_a/dir_b/file_c.vert => file_c.vert
//       dir_a/dir_b/.. => <empty string>
//       dir_a/dir_b/.  => <empty string>
//       dir_a/dirb/c/  => <empty string>
// Note that this method doesn't check whether the given path is a valid one or
// not.
std::string GetBaseFileName(const std::string& file_path);

// Reads all of the characters in a given file into input_data.  Outputs an
// error message to std::cerr if the file could not be read and returns false if
// there was an error.  If the input_file is "-", then input is read from
// std::cin.
bool ReadFile(const std::string& input_file_name,
              std::vector<char>* input_data);

// Returns and initializes the file_stream parameter if the output_filename
// refers to a file, or returns &std::cout if the output_filename is "-".
// Returns nullptr and emits an error message to std::cout if the file could
// not be opened for writing.  If the output refers to a file, and the open
// failed for writing, file_stream is left with its fail_bit set.
std::ostream* GetOutputStream(const string_piece& output_filename,
                              std::ofstream* file_stream);

// Writes output_data to a file, overwriting if it exists.  If output_file_name
// is "-", writes to std::cout.
bool WriteFile(std::ostream* output_stream, const string_piece& output_data);

}  // namespace shaderc_util

#endif  // LIBSHADERC_UTIL_IO_H_
