diff options
author | Tony Finch <dot@dotat.at> | 2012-10-12 14:52:28 +0100 |
---|---|---|
committer | Tony Finch <dot@dotat.at> | 2013-05-23 18:44:04 +0100 |
commit | c393f9312e022187f24bc9536e9d3ea426009ea0 (patch) | |
tree | 4785dbe603497bd9a20ba8bb62b6b700dd7b49bf | |
parent | da45993f49e890de3642db3f4c8bddbdb5302277 (diff) |
${hexquote: expansion operator
This converts octets outside the range 0x21-0x7E (the ASCII
graphic characters) to \xNN hex escapes.
-rw-r--r-- | src/src/expand.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/src/expand.c b/src/src/expand.c index 391b943cf..1da222563 100644 --- a/src/src/expand.c +++ b/src/src/expand.c @@ -181,6 +181,7 @@ static uschar *op_table_main[] = { US"h", US"hash", US"hex2b64", + US"hexquote", US"l", US"lc", US"length", @@ -216,6 +217,7 @@ enum { EOP_H, EOP_HASH, EOP_HEX2B64, + EOP_HEXQUOTE, EOP_L, EOP_LC, EOP_LENGTH, @@ -5664,6 +5666,22 @@ while (*s != 0) continue; } + /* Convert octets outside 0x21..0x7E to \xXX form */ + + case EOP_HEXQUOTE: + { + uschar *t = sub - 1; + while (*(++t) != 0) + { + if (*t < 0x21 || 0x7E < *t) + yield = string_cat(yield, &size, &ptr, + string_sprintf("\\x%02x", *t), 4); + else + yield = string_cat(yield, &size, &ptr, t, 1); + } + continue; + } + /* count the number of list elements */ case EOP_LISTCOUNT: |