Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Sync from libucl
Baptiste Daroussin committed 12 years ago
commit 6e854765da907a60f8744efe5ecb8a49bd11829f
parent 21b1cd7
5 files changed +50 -36
modified external/libucl/src/ucl_chartable.h
@@ -49,18 +49,18 @@ UCL_CHARACTER_VALUE_STR /* ) */, UCL_CHARACTER_VALUE_STR /* * */,
UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT /* + */,
UCL_CHARACTER_VALUE_END /* , */,
UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* - */,
-
UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT /* . */,
-
UCL_CHARACTER_VALUE_STR /* / */,
-
UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 0 */,
-
UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 1 */,
-
UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 2 */,
-
UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 3 */,
-
UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 4 */,
-
UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 5 */,
-
UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 6 */,
-
UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 7 */,
-
UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 8 */,
-
UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 9 */,
+
UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT /* . */,
+
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR /* / */,
+
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 0 */,
+
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 1 */,
+
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 2 */,
+
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 3 */,
+
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 4 */,
+
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 5 */,
+
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 6 */,
+
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 7 */,
+
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 8 */,
+
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT_START|UCL_CHARACTER_VALUE_DIGIT /* 9 */,
UCL_CHARACTER_VALUE_STR /* : */, UCL_CHARACTER_VALUE_END /* ; */,
UCL_CHARACTER_VALUE_STR /* < */, UCL_CHARACTER_VALUE_STR /* = */,
UCL_CHARACTER_VALUE_STR /* > */, UCL_CHARACTER_VALUE_STR /* ? */,
@@ -93,7 +93,7 @@ UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT /* Z */,
UCL_CHARACTER_VALUE_STR /* [ */, UCL_CHARACTER_VALUE_STR /* \ */,
UCL_CHARACTER_VALUE_END /* ] */, UCL_CHARACTER_VALUE_STR /* ^ */,
-
UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR /* _ */,
+
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR /* _ */,
UCL_CHARACTER_VALUE_STR /* ` */,
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT /* a */,
UCL_CHARACTER_KEY_START|UCL_CHARACTER_KEY|UCL_CHARACTER_VALUE_STR|UCL_CHARACTER_VALUE_DIGIT /* b */,
modified external/libucl/src/ucl_emitter.c
@@ -283,7 +283,8 @@ ucl_object_emit_json (ucl_object_t *obj, bool compact)

	ucl_obj_write_json (obj, buf, 0, false, compact);

-
	res = strdup(utstring_body (buf));
+
	res = malloc (utstring_len (buf) + 1);
+
	ucl_strlcpy_unsafe (res, utstring_body (buf), utstring_len (buf) + 1);
	utstring_free (buf);

	return res;
@@ -422,7 +423,9 @@ ucl_object_emit_rcl (ucl_object_t *obj)

	ucl_elt_write_rcl (obj, buf, 0, false, true);

-
	res = strdup(utstring_body (buf));
+
	res = malloc (utstring_len (buf) + 1);
+
	ucl_strlcpy_unsafe (res, utstring_body (buf), utstring_len (buf) + 1);
+

	utstring_free (buf);

	return res;
@@ -567,7 +570,8 @@ ucl_object_emit_yaml (ucl_object_t *obj)

	ucl_elt_write_yaml (obj, buf, 0, false, true);

-
	res = strdup(utstring_body (buf));
+
	res = malloc (utstring_len (buf) + 1);
+
	ucl_strlcpy_unsafe (res, utstring_body (buf), utstring_len (buf) + 1);
	utstring_free (buf);

	return res;
modified external/libucl/src/ucl_internal.h
@@ -148,6 +148,7 @@ bool ucl_include_handler (const unsigned char *data, size_t len, void* ud, UT_st
bool ucl_includes_handler (const unsigned char *data, size_t len, void* ud, UT_string **err);

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

#ifdef __GNUC__
modified external/libucl/src/ucl_parser.c
@@ -526,19 +526,25 @@ ucl_parse_key (struct ucl_parser *parser,

	p = chunk->pos;

+
	if (*p == '.') {
+
		/* It is macro actually */
+
		ucl_chunk_skipc (chunk, *p);
+
		parser->prev_state = parser->state;
+
		parser->state = UCL_STATE_MACRO_NAME;
+
		return true;
+
	}
	while (p < chunk->end) {
		/*
-
		 * A key must start with alpha and end with space character
+
		 * A key must start with alpha, number, '/' or '_' and end with space character
		 */
-
		if (*p == '.') {
-
			/* It is macro actually */
-
			ucl_chunk_skipc (chunk, *p);
-
			parser->prev_state = parser->state;
-
			parser->state = UCL_STATE_MACRO_NAME;
-
			return true;
-
		}
-
		else if (c == NULL) {
-
			if (ucl_test_character (*p, UCL_CHARACTER_KEY_START)) {
+
		if (c == NULL) {
+
			if (ucl_lex_is_comment (p[0], p[1])) {
+
				if (!ucl_skip_comments (parser, err)) {
+
					return false;
+
				}
+
				p = chunk->pos;
+
			}
+
			else if (ucl_test_character (*p, UCL_CHARACTER_KEY_START)) {
				/* The first symbol */
				c = p;
				ucl_chunk_skipc (chunk, *p);
@@ -551,12 +557,6 @@ ucl_parse_key (struct ucl_parser *parser,
				ucl_chunk_skipc (chunk, *p);
				p ++;
			}
-
			else if (ucl_lex_is_comment (p[0], p[1])) {
-
				if (!ucl_skip_comments (parser, err)) {
-
					return false;
-
				}
-
				p = chunk->pos;
-
			}
			else {
				/* Invalid identifier */
				ucl_set_err (chunk, UCL_ESYNTAX, "key must begin with a letter", err);
@@ -653,7 +653,7 @@ ucl_parse_key (struct ucl_parser *parser,
		ucl_strlcpy_tolower (nobj->key, c, end - c + 1);
	}
	else {
-
		ucl_strlcpy (nobj->key, c, end - c + 1);
+
		ucl_strlcpy_unsafe (nobj->key, c, end - c + 1);
	}

	if (need_unescape) {
@@ -802,7 +802,7 @@ ucl_parse_value (struct ucl_parser *parser, struct ucl_chunk *chunk, UT_string *
				return false;
			}
			obj->value.sv = malloc (chunk->pos - c - 1);
-
			ucl_strlcpy (obj->value.sv, c + 1, chunk->pos - c - 1);
+
			ucl_strlcpy_unsafe (obj->value.sv, c + 1, chunk->pos - c - 1);
			if (need_unescape) {
				ucl_unescape_json_string (obj->value.sv);
			}
@@ -880,7 +880,7 @@ ucl_parse_value (struct ucl_parser *parser, struct ucl_chunk *chunk, UT_string *
							ucl_set_err (chunk, 0, "cannot allocate memory for a string", err);
							return false;
						}
-
						ucl_strlcpy (obj->value.sv, c, str_len);
+
						ucl_strlcpy_unsafe (obj->value.sv, c, str_len);
						obj->type = UCL_STRING;
					}
					parser->state = UCL_STATE_AFTER_VALUE;
@@ -913,7 +913,7 @@ ucl_parse_value (struct ucl_parser *parser, struct ucl_chunk *chunk, UT_string *
						ucl_set_err (chunk, 0, "cannot allocate memory for a string", err);
						return false;
					}
-
					ucl_strlcpy (obj->value.sv, c, str_len);
+
					ucl_strlcpy_unsafe (obj->value.sv, c, str_len);
					obj->type = UCL_STRING;
				}
				parser->state = UCL_STATE_AFTER_VALUE;
modified external/libucl/src/ucl_util.c
@@ -644,6 +644,15 @@ ucl_strlcpy (char *dst, const char *src, size_t siz)
}

size_t
+
ucl_strlcpy_unsafe (char *dst, const char *src, size_t siz)
+
{
+
	memcpy (dst, src, siz - 1);
+
	dst[siz - 1] = '\0';
+

+
	return siz - 1;
+
}
+

+
size_t
ucl_strlcpy_tolower (char *dst, const char *src, size_t siz)
{
	char *d = dst;