${hexquote: expansion operator
authorTony Finch <dot@dotat.at>
Fri, 12 Oct 2012 13:52:28 +0000 (14:52 +0100)
committerTony Finch <dot@dotat.at>
Thu, 23 May 2013 17:44:04 +0000 (18:44 +0100)
This converts octets outside the range 0x21-0x7E (the ASCII
graphic characters) to \xNN hex escapes.

src/src/expand.c

index 391b943cfcb40afe343c9461bbda7888c0b753e7..1da2225637850b5ae8eda30854c96d81858c6499 100644 (file)
@@ -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: