summary refs log tree commit diff
path: root/nixos/modules/installer/tools/nixos-option/libnix-copy-paste.cc
blob: 875c07da6399665dda41b112a3572c2f53c241f2 (plain) (blame)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// These are useful methods inside the nix library that ought to be exported.
// Since they are not, copy/paste them here.
// TODO: Delete these and use the ones in the library as they become available.

#include <nix/config.h> // for nix/globals.hh's reference to SYSTEM

#include "libnix-copy-paste.hh"
#include <boost/format/alt_sstream.hpp>           // for basic_altstringbuf...
#include <boost/format/alt_sstream_impl.hpp>      // for basic_altstringbuf...
#include <boost/format/format_class.hpp>          // for basic_format
#include <boost/format/format_fwd.hpp>            // for format
#include <boost/format/format_implementation.hpp> // for basic_format::basi...
#include <boost/optional/optional.hpp>            // for get_pointer
#include <iostream>                               // for operator<<, basic_...
#include <nix/types.hh>                           // for Strings, Error
#include <string>                                 // for string, basic_string

using boost::format;
using nix::Error;
using nix::Strings;
using std::string;

// From nix/src/libexpr/attr-path.cc
Strings parseAttrPath(const string & s)
{
    Strings res;
    string cur;
    string::const_iterator i = s.begin();
    while (i != s.end()) {
        if (*i == '.') {
            res.push_back(cur);
            cur.clear();
        } else if (*i == '"') {
            ++i;
            while (1) {
                if (i == s.end())
                    throw Error(format("missing closing quote in selection path '%1%'") % s);
                if (*i == '"')
                    break;
                cur.push_back(*i++);
            }
        } else
            cur.push_back(*i);
        ++i;
    }
    if (!cur.empty())
        res.push_back(cur);
    return res;
}

// From nix/src/nix/repl.cc
bool isVarName(const string & s)
{
    if (s.size() == 0)
        return false;
    char c = s[0];
    if ((c >= '0' && c <= '9') || c == '-' || c == '\'')
        return false;
    for (auto & i : s)
        if (!((i >= 'a' && i <= 'z') || (i >= 'A' && i <= 'Z') || (i >= '0' && i <= '9') || i == '_' || i == '-' ||
              i == '\''))
            return false;
    return true;
}

// From nix/src/nix/repl.cc
std::ostream & printStringValue(std::ostream & str, const char * string)
{
    str << "\"";
    for (const char * i = string; *i; i++)
        if (*i == '\"' || *i == '\\')
            str << "\\" << *i;
        else if (*i == '\n')
            str << "\\n";
        else if (*i == '\r')
            str << "\\r";
        else if (*i == '\t')
            str << "\\t";
        else
            str << *i;
    str << "\"";
    return str;
}