string: add substring method

This method aims to offer a simple way to 'substring'
an existing string with start and end values.
pull/7472/head
Stéphane Cerveau 4 years ago committed by Xavier Claessens
parent 804a71e8f2
commit 8f106a2b9a
  1. 3
      docs/markdown/Reference-manual.md
  2. 20
      docs/markdown/Syntax.md
  3. 14
      mesonbuild/interpreterbase.py
  4. 15
      test cases/common/38 string operations/meson.build

@ -1977,6 +1977,9 @@ are immutable, all operations return their results as a new string.
- `startswith(string)`: returns true if string starts with the string
specified as the argument
- `substring(start,end)` *(since 0.56.0)*: returns a substring specified from start to end.
Both `start` and `end` arguments are optional, so, for example, `'foobar'.substring()` will return `'foobar'`.
- `strip()`: removes whitespace at the beginning and end of the string.
*(since 0.43.0)* Optionally can take one positional string argument,
and all characters in that string will be stripped.

@ -220,6 +220,26 @@ is_x86 = target.startswith('x86') # boolean value 'true'
is_bsd = target.to_lower().endswith('bsd') # boolean value 'true'
```
#### .substring()
Since 0.56.0, you can extract a substring from a string.
```meson
# Similar to the Python str[start:end] syntax
target = 'x86_FreeBSD'
platform = target.substring(0, 3) # prefix string value 'x86'
system = target.substring(4) # suffix string value 'FreeBSD'
```
The method accepts negative values where negative `start` is relative to the end of
string `len(string) - start` as well as negative `end`.
```meson
string = 'foobar'
target.substring(-5, -3) # => 'oo'
target.substring(1, -1) # => 'ooba'
```
#### .split(), .join()
```meson

@ -1026,6 +1026,20 @@ The result of this is undefined and will become a hard error in a future Meson r
if not isinstance(cmpr, str):
raise InterpreterException('Version_compare() argument must be a string.')
return mesonlib.version_compare(obj, cmpr)
elif method_name == 'substring':
if len(posargs) > 2:
raise InterpreterException('substring() takes maximum two arguments.')
start = 0
end = len(obj)
if len (posargs) > 0:
if not isinstance(posargs[0], int):
raise InterpreterException('substring() argument must be an int')
start = posargs[0]
if len (posargs) > 1:
if not isinstance(posargs[1], int):
raise InterpreterException('substring() argument must be an int')
end = posargs[1]
return obj[start:end]
raise InterpreterException('Unknown method "%s" for a string.' % method_name)
def format_string(self, templ: str, args: T.List[TYPE_nvar]) -> str:

@ -101,3 +101,18 @@ assert('\\\\n' == bs_bs_n, 'Four backslash broken before n')
assert('\\\\\n' == bs_bs_nl, 'Five backslash broken before n')
assert('\\\\' == bs_bs, 'Double-backslash broken')
assert('\\' == bs, 'Backslash broken')
mysubstring='foobarbaz'
assert(mysubstring.substring() == 'foobarbaz', 'substring is broken')
assert(mysubstring.substring(0) == 'foobarbaz', 'substring is broken')
assert(mysubstring.substring(1) == 'oobarbaz', 'substring is broken')
assert(mysubstring.substring(-5) == 'arbaz', 'substring is broken')
assert(mysubstring.substring(1, 4) == 'oob', 'substring is broken')
assert(mysubstring.substring(1,-5) == 'oob', 'substring is broken')
assert(mysubstring.substring(1, 0) == '', 'substring is broken')
assert(mysubstring.substring(0, 100) == 'foobarbaz', 'substring is broken')
assert(mysubstring.substring(-1, -5) == '', 'substring is broken')
assert(mysubstring.substring(10, -25) == '', 'substring is broken')
assert(mysubstring.substring(-4, 2) == '', 'substring is broken')
assert(mysubstring.substring(10, 9) == '', 'substring is broken')
assert(mysubstring.substring(8, 10) == 'z', 'substring is broken')

Loading…
Cancel
Save