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);