aboutsummaryrefslogtreecommitdiff
path: root/build2/utility.txx
blob: 7256547e32673df15231a3bf813c44a669ef7cb2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// file      : build2/utility.txx -*- C++ -*-
// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
// license   : MIT; see accompanying LICENSE file

namespace build2
{
  template <typename T>
  T
  run (const process_path& pp,
       const char* args[],
       T (*f) (string&),
       bool err,
       bool ignore_exit,
       sha256* checksum)
  {
    process pr (run_start (pp, args, err));

    T r;
    string l; // Last line of output.

    try
    {
      ifdstream is (pr.in_ofd);

      while (is.peek () != ifdstream::traits_type::eof () && // Keep last line.
             getline (is, l))
      {
        trim (l);

        if (checksum != nullptr)
          checksum->append (l);

        if (r.empty ())
          r = f (l);
      }
    }
    catch (const ifdstream::failure&)
    {
      // Presumably the child process failed. Let run_finish() deal with that.
    }

    if (!(run_finish (args, err, pr, l) || ignore_exit))
      r = T ();

    return r;
  }
}