From 8c9fbcb456c88a843282655dd6e3403e8d7d3c0c Mon Sep 17 00:00:00 2001 From: Baptiste Daroussin Date: Wed, 26 Feb 2014 23:39:30 +0100 Subject: [PATCH 1/2] Implement UCL_PARSER_KEY_UPPERCASE --- include/ucl.h | 3 ++- src/ucl_internal.h | 1 + src/ucl_parser.c | 17 ++++++++++------- src/ucl_util.c | 23 +++++++++++++++++++++++ 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/include/ucl.h b/include/ucl.h index 89aebe9..0a2fce9 100644 --- a/include/ucl.h +++ b/include/ucl.h @@ -138,7 +138,8 @@ typedef enum ucl_emitter { */ typedef enum ucl_parser_flags { UCL_PARSER_KEY_LOWERCASE = 0x1, /**< Convert all keys to lower case */ - UCL_PARSER_ZEROCOPY = 0x2 /**< Parse input in zero-copy mode if possible */ + UCL_PARSER_ZEROCOPY = 0x2, /**< Parse input in zero-copy mode if possible */ + UCL_PARSER_KEY_UPPERCASE = 0x3 /**< Convert all keys to upper case */ } ucl_parser_flags_t; /** diff --git a/src/ucl_internal.h b/src/ucl_internal.h index 49c4aae..6828c15 100644 --- a/src/ucl_internal.h +++ b/src/ucl_internal.h @@ -176,6 +176,7 @@ bool ucl_includes_handler (const unsigned char *data, size_t len, void* ud); size_t ucl_strlcpy (char *dst, const char *src, size_t siz); size_t ucl_strlcpy_unsafe (char *dst, const char *src, size_t siz); size_t ucl_strlcpy_tolower (char *dst, const char *src, size_t siz); +size_t ucl_strlcpy_toupper (char *dst, const char *src, size_t siz); #ifdef __GNUC__ diff --git a/src/ucl_parser.c b/src/ucl_parser.c index 7aa2181..7b48e29 100644 --- a/src/ucl_parser.c +++ b/src/ucl_parser.c @@ -467,12 +467,12 @@ static inline ssize_t ucl_copy_or_store_ptr (struct ucl_parser *parser, const unsigned char *src, unsigned char **dst, const char **dst_const, size_t in_len, - bool need_unescape, bool need_lowercase, bool need_expand) + bool need_unescape, int flags, bool need_expand) { ssize_t ret = -1, tret; unsigned char *tmp; - if (need_unescape || need_lowercase || + if (need_unescape || flags != 0 || (need_expand && parser->variables != NULL) || !(parser->flags & UCL_PARSER_ZEROCOPY)) { /* Copy string */ @@ -481,9 +481,12 @@ ucl_copy_or_store_ptr (struct ucl_parser *parser, ucl_set_err (parser->chunks, 0, "cannot allocate memory for a string", &parser->err); return false; } - if (need_lowercase) { + if (flags & UCL_PARSER_KEY_LOWERCASE) { ret = ucl_strlcpy_tolower (*dst, src, in_len + 1); } + else if (flags & UCL_PARSER_KEY_UPPERCASE) { + ret = ucl_strlcpy_toupper (*dst, src, in_len + 1); + } else { ret = ucl_strlcpy_unsafe (*dst, src, in_len + 1); } @@ -1075,7 +1078,7 @@ ucl_parse_key (struct ucl_parser *parser, struct ucl_chunk *chunk, bool *next_ke /* Create a new object */ nobj = ucl_object_new (); keylen = ucl_copy_or_store_ptr (parser, c, &nobj->trash_stack[UCL_TRASH_KEY], - &key, end - c, need_unescape, parser->flags & UCL_PARSER_KEY_LOWERCASE, false); + &key, end - c, need_unescape, parser->flags, false); if (keylen == -1) { ucl_object_free(nobj); return false; @@ -1276,7 +1279,7 @@ ucl_parse_value (struct ucl_parser *parser, struct ucl_chunk *chunk) str_len = chunk->pos - c - 2; obj->type = UCL_STRING; if ((str_len = ucl_copy_or_store_ptr (parser, c + 1, &obj->trash_stack[UCL_TRASH_VALUE], - &obj->value.sv, str_len, need_unescape, false, var_expand)) == -1) { + &obj->value.sv, str_len, need_unescape, 0, var_expand)) == -1) { return false; } obj->len = str_len; @@ -1321,7 +1324,7 @@ ucl_parse_value (struct ucl_parser *parser, struct ucl_chunk *chunk) } obj->type = UCL_STRING; if ((str_len = ucl_copy_or_store_ptr (parser, c, &obj->trash_stack[UCL_TRASH_VALUE], - &obj->value.sv, str_len - 1, false, false, var_expand)) == -1) { + &obj->value.sv, str_len - 1, false, 0, var_expand)) == -1) { return false; } obj->len = str_len; @@ -1380,7 +1383,7 @@ ucl_parse_value (struct ucl_parser *parser, struct ucl_chunk *chunk) obj->type = UCL_STRING; if ((str_len = ucl_copy_or_store_ptr (parser, c, &obj->trash_stack[UCL_TRASH_VALUE], &obj->value.sv, str_len, need_unescape, - false, var_expand)) == -1) { + 0, var_expand)) == -1) { return false; } obj->len = str_len; diff --git a/src/ucl_util.c b/src/ucl_util.c index 0f83b84..cbe525d 100644 --- a/src/ucl_util.c +++ b/src/ucl_util.c @@ -888,6 +888,29 @@ ucl_strlcpy_unsafe (char *dst, const char *src, size_t siz) } size_t +ucl_strlcpy_toupper (char *dst, const char *src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0) { + while (--n != 0) { + if ((*d++ = toupper (*s++)) == '\0') { + break; + } + } + } + + if (n == 0 && siz != 0) { + *d = '\0'; + } + + return (s - src); /* count does not include NUL */ +} + +size_t ucl_strlcpy_tolower (char *dst, const char *src, size_t siz) { char *d = dst; -- 1.8.5.2