Hash :
fd3f14c0
Author :
Thomas de Grivel
Date :
2022-01-02T10:32:18
kv wip
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 64 65 66 67 68 69 70 71 72
/*
* kv - key value text file format
*
* Copyright 2022 Thomas de Grivel
*/
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "kv.h"
int kv_contains_triple_double_quotes (const char *str, size_t str_size)
{
while (str_size >= 4) {
if (str[0] == '\n' && str[1] == '"' && str[2] == '"' && str[3] == '"')
return 1;
str++;
str_size--;
}
return 0;
}
int kv_quote_triple_double_quotes (char **str, size_t *str_size)
{
char *e;
char *s;
if (kv_contains_triple_double_quotes(*str, *str_size))
return 1;
s = calloc(*str_size + 9, 1);
if (!s)
return -1;
s[0] = '"'; s[1] = '"'; s[2] = '"'; s[3] = '\n';
memcpy(s + 4, *str, *str_size);
e = s + 4 + *str_size;
e[0] = '\n'; e[1] = '"'; e[2] = '"'; e[3] = '"'; e[4] = 0;
*str = e;
*str_size = *str_size + 8;
return 0;
}
int kv_contains_reserved_char (const char *str, size_t str_size)
{
while (str_size) {
if (kv_is_reserved_char(str[0]))
return 1;
str++;
str_size--;
}
return 0;
}
int kv_needs_quoting (const char *str, size_t str_size)
{
if (str_size == 0 ||
(str[0] != '<' && !kv_contains_reserved_char(str, str_size)))
return 0;
return 1;
}
int kv_quote (char **str, size_t *str_size)
{
int r;
assert(str);
assert(*str);
assert(str_size);
if (!kv_needs_quoting(*str, *str_size))
return 0;
r = kv_quote_triple_double_quotes(str, str_size);
if (r <= 0)
return r;
return -1;
}