Vcsn  2.8
Be Rational
stream.hh
Go to the documentation of this file.
1 #pragma once
2 
3 #include <iostream> // cin
4 #include <memory> // shared_ptr
5 #include <sstream>
6 #include <stdexcept>
7 
8 #include <vcsn/misc/escape.hh>
9 #include <vcsn/misc/export.hh>
10 #include <vcsn/misc/raise.hh>
11 #include <vcsn/misc/to-string.hh>
12 
13 namespace vcsn LIBVCSN_API
14 {
16  extern std::ostream cnull;
17 
19  extern std::wostream wcnull;
20 
23  std::string
24  bracketed(std::istream& i, char lbracket, char rbracket);
25 
27  template <typename ValueSet, typename... Args>
28  auto
29  conv(const ValueSet& vs, const std::string& str, Args&&... args)
30  -> decltype(vs.conv(std::declval<std::istream&>(),
31  std::forward<Args>(args)...))
32  {
33  std::istringstream i{str};
34  try
35  {
36  const auto res = vs.conv(i, std::forward<Args>(args)...);
37  VCSN_REQUIRE(i.peek() == EOF,
38  vs, ": unexpected trailing characters: ", i);
39  return res;
40  }
41  catch (const std::runtime_error& e)
42  {
43  raise(e, " while reading: ", str_quote(str));
44  }
45  }
46 
52  char eat(std::istream& is, char c);
53 
59  const std::string& eat(std::istream& is, const std::string& s);
60 
62  bool
63  equal_files(const std::string& fn1, const std::string& fn2);
64 
66  // http://stackoverflow.com/questions/4891006.
67  std::string expand_tilda(const std::string& res);
68 
74  template <typename... Args>
75  ATTRIBUTE_NORETURN
76  void fail_reading(std::istream& is, Args&&... args)
77  {
78  is.clear();
79  std::string buf;
80  std::getline(is, buf, '\n');
81  if (!is.good())
82  // This shouldn't really happen; however it's best to fail cleanly.
83  is.clear();
84  if (buf.empty())
85  raise(std::forward<Args>(args)...);
86  else
87  raise(std::forward<Args>(args)..., ": ", str_quote(buf));
88  }
89 
92  char get_char(std::istream& i);
93 
95  std::string get_file_contents(const std::string& file);
96 
100  std::shared_ptr<std::istream> open_input_file(const std::string& file);
101 
105  std::shared_ptr<std::ostream> open_output_file(const std::string& file);
106 
109  void skip_space(std::istream& is);
110 
112  std::string
113  xgetenv(const std::string& var, const std::string& val = "");
114 }
std::string xgetenv(const std::string &var, const std::string &val="")
getenv(var) if defined, otherwise val.
Definition: stream.cc:229
char get_char(std::istream &i)
Read a single char, with possible -escape support.
Definition: stream.cc:92
#define LIBVCSN_API
Definition: export.hh:8
char eat(std::istream &is, char c)
Check lookahead character and advance.
Definition: stream.cc:147
void skip_space(std::istream &is)
Ignore spaces.
Definition: stream.cc:222
std::string get_file_contents(const std::string &file)
Return the contents of file.
Definition: stream.cc:178
ATTRIBUTE_NORETURN void fail_reading(std::istream &is, Args &&... args)
Throw an exception after failing to read from is.
Definition: stream.hh:76
auto conv(const ValueSet &vs, const std::string &str, Args &&... args) -> decltype(vs.conv(std::declval< std::istream &>(), std::forward< Args >(args)...))
Parse str via vs.conv.
Definition: stream.hh:29
std::string expand_tilda(const std::string &res)
Expand initial "~" in res.
Definition: stream.cc:58
bool equal_files(const std::string &fn1, const std::string &fn2)
Whether two files have exactly equal contents.
Definition: stream.cc:39
std::ostream cnull
An narrow-char stream that discards the output.
Definition: stream.cc:13
Definition: a-star.hh:8
std::shared_ptr< std::istream > open_input_file(const std::string &file)
Open file for reading and return its autoclosing stream.
Definition: stream.cc:193
std::shared_ptr< std::ostream > open_output_file(const std::string &file)
Open file for writing and return its autoclosing stream.
Definition: stream.cc:208
return o str()
std::string bracketed(std::istream &i, char lbracket, char rbracket)
Extract the string which is here between lbracket and rbracket.
Definition: stream.cc:17
std::string str_quote(Args &&... args)
Convert to a string, in quotes.
Definition: escape.hh:49
std::wostream wcnull
An wide-char stream that discards the output.
Definition: stream.cc:14
#define VCSN_REQUIRE(Cond,...)
A macro similar to require.
Definition: raise.hh:98
return res
Definition: multiply.hh:399