summaryrefslogtreecommitdiffstats
path: root/lib/puppet/parser/functions/regsubst.rb
blob: 8a1a244ab40e207eadab47cada966be58baf90a9 (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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
module Puppet::Parser::Functions
    newfunction(:regsubst, :type => :rvalue,
                :doc => "
                Perform regexp replacement on a string. 

- **Parameters** (in order):

:str:  The string to operate on.

:regexp:  The regular expression matching the string.  If you want it anchored at the start and or end of the string, you must do that with ^ and $ yourself.

:replacement:  Replacement string. Can contain back references to what was matched using 0, 1, and so on.

:flags:  Optional. String of single letter flags for how the regexp is interpreted:

    - **E**         Extended regexps
    - **I**         Ignore case in regexps
    - **M**         Multiline regexps
    - **G**         Global replacement; all occurrences of the regexp in the string will be replaced.  Without this, only the first occurrence will be replaced.

:lang:  Optional.  How to handle multibyte characters.  A single-character string with the following values:
     
     - **N**         None
     - **E**         EUC
     - **S**         SJIS
     - **U**         UTF-8

- **Examples**

Get the third octet from the node's IP address::

    $i3 = regsubst($ipaddress,'^([0-9]+)[.]([0-9]+)[.]([0-9]+)[.]([0-9]+)$','\\3')

Put angle brackets around each octet in the node's IP address::

    $x = regsubst($ipaddress, '([0-9]+)', '<\\1>', 'G')
") \
        do |args|
        flag_mapping = {
            "E" => Regexp::EXTENDED,
            "I" => Regexp::IGNORECASE,
            "M" => Regexp::MULTILINE,
        }
        if args.length < 3  or  args.length > 5
            raise Puppet::ParseError, ("regsub(): wrong number of arguments" +
                                       " (#{args.length}; min 3, max 5)")
        end
        str, regexp, replacement, flags, lang = args
        reflags = 0
        global = false
        (flags or "").each_byte do |f|
            f = f.chr
            if f == "G"
                global = true
            else
                fvalue = flag_mapping[f]
                if !fvalue
                    raise Puppet::ParseError, "regsub(): bad flag `#{f}'"
                end
                reflags |= fvalue
            end
        end
        re = Regexp.compile(regexp, reflags, lang)
        if global
            result = str.gsub(re, replacement)
        else
            result = str.sub(re, replacement)
        end
        return result
    end
end