File: string.jam

package info (click to toggle)
boost-build 2.0-m11-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 4,624 kB
  • ctags: 2,387
  • sloc: ansic: 12,978; python: 5,209; xml: 4,782; cpp: 555; yacc: 456; sh: 237; makefile: 71
file content (122 lines) | stat: -rw-r--r-- 2,909 bytes parent folder | download | duplicates (3)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# (C) Copyright David Abrahams, 2002.
# (C) Copyright Rene Rivera, 2003.
#
# See accompanying license for terms and conditions of use.
#

import regex ;

# Characters considered whitespace, as a list.
.whitespace-chars = " " "	" "
" ;

# Characters considered whitespace, as a single string.
.whitespace = $(.whitespace-chars:J="") ;

# Returns the canonical set of whitespace characters, as a list.
#
rule whitespace-chars ( )
{
    return $(.whitespace-chars) ;
}

# Returns the canonical set of whitespace characters, as a single string.
#
rule whitespace ( )
{
    return $(.whitespace) ;
}

# Splits the given string into a list of strings composed
# of each character of the string in sequence.
#
rule chars (
    string # The string to split.
    )
{
    local result ;
    while $(string)
    {
        local s = [ MATCH (.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.*) : $(string) ] ;
        string = $(s[9]) ;
        result += $(s[1-8]) ;
    }
    
    # trim off empty strings
    while $(result[1]) && ! $(result[-1])
    {
        result = $(result[1--2]) ;
    }
    
    return $(result) ;
}

# Concatenates the given strings, inserting the given separator
# between each string.
#
rule join (
    strings * # The strings to join.
    : separator ? # The optional separator.
    )
{
    separator ?= "" ;
    return $(strings:J=$(separator)) ;
}

# Split a string into whitespace separated words.
#
rule words (
    string # The string to split.
    : whitespace * # Optional, characters to consider as whitespace.
    )
{
    whitespace = $(whitespace:J="") ;
    whitespace ?= $(.whitespace) ;
    local w = ;
    while $(string)
    {
        string = [ MATCH "^[$(whitespace)]*([^$(whitespace)]*)(.*)" : $(string) ] ;
        if $(string[1]) && $(string[1]) != ""
        {
            w += $(string[1]) ;
        }
        string = $(string[2]) ;
    }
    return $(w) ;
}

# Check that the given string is composed entirely of whitespace.
#
rule is-whitespace (
    string ? # The string to test.
    )
{
    if ! $(string) { return true ; }
    else if $(string) = "" { return true ; }
    else if [ MATCH "^([$(.whitespace)]+)$" : $(string) ] { return true ; }
    else { return ; }
}

rule __test__ ( )
{
    import assert ;
    assert.result a b c : chars abc ;
    
    # check boundary cases
    assert.result a : chars a ;
    assert.result : chars "" ;
    assert.result a b c d e f g h : chars abcdefgh ;
    assert.result a b c d e f g h i : chars abcdefghi ;
    assert.result a b c d e f g h i j : chars abcdefghij ;
    assert.result a b c d e f g h i j k : chars abcdefghijk ;
    
    assert.result a//b/c/d : join a "" b c d : / ;
    assert.result abcd : join  a "" b c d ;
    
    assert.result a b c : words "a b	c" ;
    
    assert.true is-whitespace "     	" ;
    assert.false is-whitespace "  a b c	" ;
    assert.true is-whitespace "" ;
    assert.true is-whitespace ;
}