|
@@ -588,15 +588,38 @@ static void put_char(char ch, char **buf, size_t *remain, size_t *needed)
|
|
|
|
|
|
static void put_str(const char *str, char **buf, size_t *remain, size_t *needed)
|
|
|
{
|
|
|
- size_t olen, len;
|
|
|
+ size_t olen, len, i;
|
|
|
+ char quote = '\0';
|
|
|
+ int quotes;
|
|
|
|
|
|
len = olen = strlen(str);
|
|
|
*needed += len;
|
|
|
|
|
|
- if (*remain == 0)
|
|
|
+ /*
|
|
|
+ * Check to see if we need quotes or not.
|
|
|
+ * Characters that are legal in a PropertyName don't need quoting.
|
|
|
+ * We simply assume all others require quotes.
|
|
|
+ */
|
|
|
+ for (i = 0; i < len; i++)
|
|
|
+ if (!ossl_isalnum(str[i]) && str[i] != '.' && str[i] != '_') {
|
|
|
+ /* Default to single quotes ... */
|
|
|
+ if (quote == '\0')
|
|
|
+ quote = '\'';
|
|
|
+ /* ... but use double quotes if a single is present */
|
|
|
+ if (str[i] == '\'')
|
|
|
+ quote = '"';
|
|
|
+ }
|
|
|
+
|
|
|
+ quotes = quote != '\0';
|
|
|
+ if (*remain == 0) {
|
|
|
+ *needed += 2 * quotes;
|
|
|
return;
|
|
|
+ }
|
|
|
|
|
|
- if (*remain < len + 1)
|
|
|
+ if (quotes)
|
|
|
+ put_char(quote, buf, remain, needed);
|
|
|
+
|
|
|
+ if (*remain < len + 1 + quotes)
|
|
|
len = *remain - 1;
|
|
|
|
|
|
if (len > 0) {
|
|
@@ -605,6 +628,9 @@ static void put_str(const char *str, char **buf, size_t *remain, size_t *needed)
|
|
|
*remain -= len;
|
|
|
}
|
|
|
|
|
|
+ if (quotes)
|
|
|
+ put_char(quote, buf, remain, needed);
|
|
|
+
|
|
|
if (len < olen && *remain == 1) {
|
|
|
**buf = '\0';
|
|
|
++*buf;
|