summaryrefslogtreecommitdiffstats
path: root/src/lookups/lf_quote.c
blob: 6f4143d9f7d41bdc44dd58ccd18df40b6c9e818a (plain)
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
/*************************************************
*     Exim - an Internet mail transport agent    *
*************************************************/

/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */


#include "../exim.h"
#include "lf_functions.h"


/*************************************************
*   Add string to result, quoting if necessary   *
*************************************************/

/* This function is called by some lookups that create name=value result
strings, to handle the quoting of the data. It adds "name=" to the result,
followed by appropriately quoted data, followed by a single space.

Arguments:
  name           the field name
  value          the data value
  vlength        the data length
  result         the result expanding-string

Returns:         the result pointer (possibly updated)
*/

gstring *
lf_quote(uschar *name, uschar *value, int vlength, gstring * result)
{
result = string_append(result, 2, name, US"=");

/* NULL is handled as an empty string */

if (!value)
  {
  value = US"";
  vlength = 0;
  }

/* Quote the value if it is empty, contains white space, or starts with a quote
character. */

if (value[0] == 0 || Ustrpbrk(value, " \t\n\r") != NULL || value[0] == '\"')
  {
  result = string_catn(result, US"\"", 1);
  for (int j = 0; j < vlength; j++)
    {
    if (value[j] == '\"' || value[j] == '\\')
      result = string_catn(result, US"\\", 1);
    result = string_catn(result, US value+j, 1);
    }
  result = string_catn(result, US"\"", 1);
  }
else
  result = string_catn(result, US value, vlength);

return string_catn(result, US" ", 1);
}

/* End of lf_quote.c */