String handling: refactor the expanding-string routines and users to use a descriptor...
[exim.git] / src / src / lookups / lf_quote.c
CommitLineData
0756eb3c
PH
1/*************************************************
2* Exim - an Internet mail transport agent *
3*************************************************/
4
0a49a7a4 5/* Copyright (c) University of Cambridge 1995 - 2009 */
0756eb3c
PH
6/* See the file NOTICE for conditions of use and distribution. */
7
8
9#include "../exim.h"
10#include "lf_functions.h"
11
12
13/*************************************************
14* Add string to result, quoting if necessary *
15*************************************************/
16
17/* This function is called by some lookups that create name=value result
18strings, to handle the quoting of the data. It adds "name=" to the result,
19followed by appropriately quoted data, followed by a single space.
20
21Arguments:
22 name the field name
23 value the data value
24 vlength the data length
94e1f16d 25 result the result expanding-string
0756eb3c
PH
26
27Returns: the result pointer (possibly updated)
28*/
29
94e1f16d
JH
30gstring *
31lf_quote(uschar *name, uschar *value, int vlength, gstring * result)
0756eb3c 32{
94e1f16d 33result = string_append(result, 2, name, US"=");
0756eb3c
PH
34
35/* NULL is handled as an empty string */
36
a5bdc7ee
JH
37if (!value)
38 {
39 value = US"";
40 vlength = 0;
41 }
0756eb3c
PH
42
43/* Quote the value if it is empty, contains white space, or starts with a quote
44character. */
45
46if (value[0] == 0 || Ustrpbrk(value, " \t\n\r") != NULL || value[0] == '\"')
47 {
48 int j;
94e1f16d 49 result = string_catn(result, US"\"", 1);
0756eb3c
PH
50 for (j = 0; j < vlength; j++)
51 {
52 if (value[j] == '\"' || value[j] == '\\')
94e1f16d
JH
53 result = string_catn(result, US"\\", 1);
54 result = string_catn(result, US value+j, 1);
0756eb3c 55 }
94e1f16d 56 result = string_catn(result, US"\"", 1);
0756eb3c
PH
57 }
58else
94e1f16d 59 result = string_catn(result, US value, vlength);
0756eb3c 60
94e1f16d 61return string_catn(result, US" ", 1);
0756eb3c
PH
62}
63
64/* End of lf_quote.c */