*** xref:xlat/alternation.adoc[Alternation Syntax]
*** xref:xlat/conversion.adoc[Data Conversion]
*** xref:xlat/deprecated.adoc[Deprecated Functions]
+
*** xref:xlat/file/index.adoc[File Handling]
**** xref:reference:xlat/file/escape.adoc[escape]
**** xref:xlat/file/exists.adoc[exists]
**** xref:xlat/file/rm.adoc[rm]
**** xref:xlat/file/size.adoc[size]
**** xref:xlat/file/tail.adoc[tail]
+
*** xref:xlat/function.adoc[Function Syntax]
*** xref:xlat/hash.adoc[Hashing]
+
*** xref:xlat/interpreter.adoc[Interpreter State and Debugging]
*** xref:xlat/log.adoc[Logging Functions]
*** xref:xlat/protocol.adoc[Protocol Encoding and Decoding]
-*** xref:xlat/string.adoc[String Handling]
-**** xref:xlat/concat.adoc[Concatenation]
-**** xref:xlat/explode.adoc[Split Strings]
+
+*** xref:xlat/str/index.adoc[String Handling]
+**** xref:xlat/str/concat.adoc[Concatenation]
+**** xref:xlat/str/split.adoc[Split Strings]
**** xref:xlat/builtin.adoc#length[Length]
-**** xref:xlat/lpad.adoc[Left Pad]
-**** xref:xlat/pairs.adoc[Print Attributes]
-**** xref:xlat/rpad.adoc[Right Pad]
-**** xref:xlat/randstr.adoc[Random Strings]
-**** xref:xlat/tolower.adoc[Convert to Lowercase]
-**** xref:xlat/toupper.adoc[Convert to Uppercase]
+**** xref:xlat/str/lpad.adoc[Left Pad]
+**** xref:xlat/str/rpad.adoc[Right Pad]
+**** xref:xlat/str/rand.adoc[Random Strings]
+**** xref:xlat/str/lower.adoc[Convert to Lowercase]
+**** xref:xlat/str/upper.adoc[Convert to Uppercase]
+
*** xref:xlat/builtin.adoc[Built-in Expansions]
*** xref:xlat/character.adoc[Single Letter Expansions]
*** xref:xlat/attribute.adoc[Attribute References]
+++ /dev/null
-= %pairs(<list>.[*])
-
-Serialize a list of attributes as comma-delimited string.
-
-.Return: _string_
-
-Note that there is no "convert string to pairs" function. Instead, you can simply assign the string to a structural attribute (`group`, `tlv`, etc.) and the string will be parsed as pairs.
-
-.Example
-
-[source,unlang]
-----
-control.Tmp-String-0 := { "This is a string", "This is another one" }
-reply.Reply-Message := "Serialize output: %pairs(control.[*])"
-----
-
-.Output
-
-```
-Serialize output: Tmp-String-0 = "\"This is a string\", Tmp-String-0 = \"This is another one\""
-```
-
-// Copyright (C) 2023 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
-// This documentation was developed by Network RADIUS SAS.
Used to join two or more attributes, separated by an optional delimiter.
-This expansion is the inverse of xref:xlat/explode.adoc[explode].
+This expansion is the inverse of xref:xlat/str/explode.adoc[explode].
.Return: _string_
foo += control.Tmp-String-0[*]
----
-// Copyright (C) 2023 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
+// Copyright (C) 2025 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
// This documentation was developed by Network RADIUS SAS.
--- /dev/null
+= String manipulation
+
+The following functions perform string manipulation.
+
+.String manipulation
+[options="header"]
+[cols="30%,70%"]
+|=====
+| Function | Description
+| xref:xlat/str/concat.adoc[concat] | Concatenate strings with delimiters
+| xref:xlat/str/split.adoc[split] | Split a string based on delimiters
+| xref:xlat/builtin.adoc#length[Length] | Returns the size of the string (strlen)
+| xref:xlat/str/lpad.adoc[lpad] | Left pad a string
+| xref:xlat/str/rpad.adoc[rpad] | Right pad a string
+| xref:xlat/str/rand.adoc[rand] | Return a random string based on input format
+| xref:xlat/str/lower.adoc[lower] | Convert the input string to lowercase.
+| xref:xlat/str/upper.adoc[upper] | Convert the input string to uppercase
+|=====
+
+// Copyright (C) 2025 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
+// This documentation was developed by Network RADIUS SAS.
+
--- /dev/null
+= %str.lower( ... )
+
+Returns the lowercase version of the input.
+
+The lowercase operation is done using the current locale.
+
+.Return: _string_
+
+.Example
+
+[source,unlang]
+----
+control.Tmp-String-0 := "CAIPIRINHA"
+reply.Reply-Message := "lowercase of %{control.Tmp-String-0} is %str.lower(control.Tmp-String-0)"
+----
+
+.Output
+
+```
+lowercase of CAIPIRINHA is caipirinha
+```
+
+// Copyright (C) 2025 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
+// This documentation was developed by Network RADIUS SAS.
Maximum should be 00000000123
```
-// Copyright (C) 2023 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
+// Copyright (C) 2025 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
// This documentation was developed by Network RADIUS SAS.
| b | binary data
|=====
-There is no `h` for "hex". Instead, use `b` to create binary data, followed by the `%hex(..)` function to convert it to hex.
+There is no `h` for "hex". Instead, use `b` to create binary data, and then use the `%hex(..)` function to convert the output to hex.
-.Example
+.Example of a random string
[source,unlang]
----
-reply.Reply-Message := "The random string output is %str.rand(8a)"
+reply.Reply-Message := "The random string output is %str.rand('8a')"
----
.Output
The random string output is 4Uq0gPyG
```
-// Copyright (C) 2023 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
+.Example of conversion to hex
+
+[source,unlang]
+----
+reply.Reply-Message := "The random string output is %hex(%str.rand('1b'))"
+----
+
+.Output
+
+```
+The random string output is ad
+```
+
+// Copyright (C) 2025 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
// This documentation was developed by Network RADIUS SAS.
Maximum should be 12300000000
```
-// Copyright (C) 2023 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
+// Copyright (C) 2025 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
// This documentation was developed by Network RADIUS SAS.
Split an string into multiple new strings based on a delimiter.
-This expansion is the inverse of xref:xlat/concat.adoc[concat].
+This expansion is the inverse of xref:xlat/str/concat.adoc[str.concat].
.Return: _the list of strings_.
----
control.Tmp-String-0 := "bob.toba@domain.com"
-control.Tmp-String-1 := "%str.split(control.Tmp-String-0, '@')"
+control.Tmp-String-1 := %str.split(control.Tmp-String-0, '@')
reply.Reply-Message := "Welcome %{control.Tmp-String-1[0]}"
----
Welcome bob.toba
```
-// Copyright (C) 2023 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
+// Copyright (C) 2025 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
// This documentation was developed by Network RADIUS SAS.
--- /dev/null
+= %str.upper( ... )
+
+Returns the uppercase version of the input.
+
+The uppercase operation is done using the current locale.
+
+.Return: _string_
+
+.Example
+
+[source,unlang]
+----
+control.Tmp-String-0 := "caipirinha"
+reply.Reply-Message := "uppercase of %{control.Tmp-String-0} is " + %str.upper(control.Tmp-String-0)
+----
+
+.Output
+
+```
+uppercase of caipirinha is CAIPIRINHA
+```
+
+// Copyright (C) 2025 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
+// This documentation was developed by Network RADIUS SAS.
+++ /dev/null
-= String manipulation
-
-The following functions perform string manipulation.
-
-.String manipulation
-[options="header"]
-[cols="30%,70%"]
-|=====
-| Function | Description
-| xref:xlat/concat.adoc[concat] | Concatenate strings with delimiters
-| xref:xlat/explode.adoc[explode] | Split a string based on delimiters
-| xref:xlat/lpad.adoc[lpad] | Left pad a string
-| xref:xlat/pairs.adoc[pairs] | Serialize a list of attributes to a string
-| xref:xlat/rpad.adoc[rpad] | Right pad a string
-| xref:xlat/randstr.adoc[randstr] | Return a random string based on input format
-| xref:xlat/tolower.adoc[tolower] | Convert the input string to lowercase.
-| xref:xlat/toupper.adoc[toupper] | Convert the input string to uppercase
-|=====
-
-// Copyright (C) 2023 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
-// This documentation was developed by Network RADIUS SAS.
+++ /dev/null
-= %str.lower( ... )
-
-Dynamically expands the string and returns the lowercase version of
-it.
-
-The lowercase operation is done using the current locale.
-
-.Return: _string_
-
-.Example
-
-[source,unlang]
-----
-control.Tmp-String-0 := "CAIPIRINHA"
-reply.Reply-Message := "tolower of %{control.Tmp-String-0} is %str.lower(%{control.Tmp-String-0})"
-----
-
-.Output
-
-```
-tolower of CAIPIRINHA is caipirinha
-```
-
-// Copyright (C) 2023 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
-// This documentation was developed by Network RADIUS SAS.
+++ /dev/null
-= %str.upper( ... )
-
-Dynamically expands the string and returns the uppercase version of
-it.
-
-The uppercasecase operation is done using the current locale.
-
-.Return: _string_
-
-.Example
-
-[source,unlang]
-----
-control.Tmp-String-0 := "caipirinha"
-reply.Reply-Message := "toupper of %{control.Tmp-String-0} is " + %str.upper(%{control.Tmp-String-0})
-----
-
-.Output
-
-```
-toupper of caipirinha is CAIPIRINHA
-```
-
-// Copyright (C) 2023 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
-// This documentation was developed by Network RADIUS SAS.