]>
git.proxmox.com Git - ceph.git/blob - ceph/src/common/escape.c
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2011 New Dream Network
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
15 #include "common/escape.h"
21 * Some functions for escaping RGW responses
24 /* Static string length */
25 #define SSTRL(x) ((sizeof(x)/sizeof(x[0])) - 1)
27 #define LESS_THAN_XESCAPE "<"
28 #define AMPERSAND_XESCAPE "&"
29 #define GREATER_THAN_XESCAPE ">"
30 #define SGL_QUOTE_XESCAPE "'"
31 #define DBL_QUOTE_XESCAPE """
33 int escape_xml_attr_len(const char *buf
)
37 for (b
= buf
; *b
; ++b
) {
41 ret
+= SSTRL(LESS_THAN_XESCAPE
);
44 ret
+= SSTRL(AMPERSAND_XESCAPE
);
47 ret
+= SSTRL(GREATER_THAN_XESCAPE
);
50 ret
+= SSTRL(SGL_QUOTE_XESCAPE
);
53 ret
+= SSTRL(DBL_QUOTE_XESCAPE
);
56 // Escape control characters.
57 if (((c
< 0x20) && (c
!= 0x09) && (c
!= 0x0a)) ||
66 // leave room for null terminator
71 void escape_xml_attr(const char *buf
, char *out
)
75 for (b
= buf
; *b
; ++b
) {
79 memcpy(o
, LESS_THAN_XESCAPE
, SSTRL(LESS_THAN_XESCAPE
));
80 o
+= SSTRL(LESS_THAN_XESCAPE
);
83 memcpy(o
, AMPERSAND_XESCAPE
, SSTRL(AMPERSAND_XESCAPE
));
84 o
+= SSTRL(AMPERSAND_XESCAPE
);
87 memcpy(o
, GREATER_THAN_XESCAPE
, SSTRL(GREATER_THAN_XESCAPE
));
88 o
+= SSTRL(GREATER_THAN_XESCAPE
);
91 memcpy(o
, SGL_QUOTE_XESCAPE
, SSTRL(SGL_QUOTE_XESCAPE
));
92 o
+= SSTRL(SGL_QUOTE_XESCAPE
);
95 memcpy(o
, DBL_QUOTE_XESCAPE
, SSTRL(DBL_QUOTE_XESCAPE
));
96 o
+= SSTRL(DBL_QUOTE_XESCAPE
);
99 // Escape control characters.
100 if (((c
< 0x20) && (c
!= 0x09) && (c
!= 0x0a)) ||
102 snprintf(o
, 7, "&#x%02x;", c
);
115 #define DBL_QUOTE_JESCAPE "\\\""
116 #define BACKSLASH_JESCAPE "\\\\"
117 #define TAB_JESCAPE "\\t"
118 #define NEWLINE_JESCAPE "\\n"
120 int escape_json_attr_len(const char *buf
, int src_len
)
125 for (i
= 0, b
= buf
; i
< src_len
; ++i
, ++b
) {
126 unsigned char c
= *b
;
129 ret
+= SSTRL(DBL_QUOTE_JESCAPE
);
132 ret
+= SSTRL(BACKSLASH_JESCAPE
);
135 ret
+= SSTRL(TAB_JESCAPE
);
138 ret
+= SSTRL(NEWLINE_JESCAPE
);
141 // Escape control characters.
142 if ((c
< 0x20) || (c
== 0x7f)) {
150 // leave room for null terminator
155 void escape_json_attr(const char *buf
, int src_len
, char *out
)
160 for (i
= 0, b
= buf
; i
< src_len
; ++i
, ++b
) {
161 unsigned char c
= *b
;
164 // cppcheck-suppress invalidFunctionArg
165 memcpy(o
, DBL_QUOTE_JESCAPE
, SSTRL(DBL_QUOTE_JESCAPE
));
166 o
+= SSTRL(DBL_QUOTE_JESCAPE
);
169 // cppcheck-suppress invalidFunctionArg
170 memcpy(o
, BACKSLASH_JESCAPE
, SSTRL(BACKSLASH_JESCAPE
));
171 o
+= SSTRL(BACKSLASH_JESCAPE
);
174 // cppcheck-suppress invalidFunctionArg
175 memcpy(o
, TAB_JESCAPE
, SSTRL(TAB_JESCAPE
));
176 o
+= SSTRL(TAB_JESCAPE
);
179 // cppcheck-suppress invalidFunctionArg
180 memcpy(o
, NEWLINE_JESCAPE
, SSTRL(NEWLINE_JESCAPE
));
181 o
+= SSTRL(NEWLINE_JESCAPE
);
184 // Escape control characters.
185 if ((c
< 0x20) || (c
== 0x7f)) {
186 snprintf(o
, 7, "\\u%04x", c
);