summaryrefslogtreecommitdiffstats
path: root/contrib/libucl/src
diff options
context:
space:
mode:
authorbapt <bapt@FreeBSD.org>2014-03-10 10:39:29 +0000
committerbapt <bapt@FreeBSD.org>2014-03-10 10:39:29 +0000
commit50635436ebf5c6eea0ba4c293e67521eb3ca6fd5 (patch)
treec0234a5bbb7dc3cc808cdd6b0b6249f1d3f031dd /contrib/libucl/src
parent839805534c2ca18d328aa5025aeee4a678ab7f83 (diff)
parentf90b2a4ce9b9dc56b8f7252f74ad07aef32bcf7a (diff)
downloadFreeBSD-src-50635436ebf5c6eea0ba4c293e67521eb3ca6fd5.zip
FreeBSD-src-50635436ebf5c6eea0ba4c293e67521eb3ca6fd5.tar.gz
Update libucl to 2014-03-03
Diffstat (limited to 'contrib/libucl/src')
-rw-r--r--contrib/libucl/src/ucl_internal.h2
-rw-r--r--contrib/libucl/src/ucl_parser.c79
-rw-r--r--contrib/libucl/src/ucl_util.c114
3 files changed, 157 insertions, 38 deletions
diff --git a/contrib/libucl/src/ucl_internal.h b/contrib/libucl/src/ucl_internal.h
index e2a6d52..49c4aae 100644
--- a/contrib/libucl/src/ucl_internal.h
+++ b/contrib/libucl/src/ucl_internal.h
@@ -25,7 +25,9 @@
#define UCL_INTERNAL_H_
#include <sys/types.h>
+#ifndef _WIN32
#include <sys/mman.h>
+#endif
#include <sys/stat.h>
#include <sys/param.h>
diff --git a/contrib/libucl/src/ucl_parser.c b/contrib/libucl/src/ucl_parser.c
index 7aa2181..12ebad2 100644
--- a/contrib/libucl/src/ucl_parser.c
+++ b/contrib/libucl/src/ucl_parser.c
@@ -1233,6 +1233,28 @@ ucl_parse_multiline_string (struct ucl_parser *parser,
return len;
}
+static ucl_object_t*
+ucl_get_value_object (struct ucl_parser *parser)
+{
+ ucl_object_t *t, *obj = NULL;
+
+ if (parser->stack->obj->type == UCL_ARRAY) {
+ /* Object must be allocated */
+ obj = ucl_object_new ();
+ t = parser->stack->obj->value.av;
+ DL_APPEND (t, obj);
+ parser->cur_obj = obj;
+ parser->stack->obj->value.av = t;
+ parser->stack->obj->len ++;
+ }
+ else {
+ /* Object has been already allocated */
+ obj = parser->cur_obj;
+ }
+
+ return obj;
+}
+
/**
* Handle value data
* @param parser
@@ -1243,32 +1265,30 @@ static bool
ucl_parse_value (struct ucl_parser *parser, struct ucl_chunk *chunk)
{
const unsigned char *p, *c;
- ucl_object_t *obj = NULL, *t;
+ ucl_object_t *obj = NULL;
unsigned int stripped_spaces;
int str_len;
bool need_unescape = false, ucl_escape = false, var_expand = false;
p = chunk->pos;
- while (p < chunk->end) {
- if (obj == NULL) {
- if (parser->stack->obj->type == UCL_ARRAY) {
- /* Object must be allocated */
- obj = ucl_object_new ();
- t = parser->stack->obj->value.av;
- DL_APPEND (t, obj);
- parser->cur_obj = obj;
- parser->stack->obj->value.av = t;
- parser->stack->obj->len ++;
- }
- else {
- /* Object has been already allocated */
- obj = parser->cur_obj;
- }
+ /* Skip any spaces and comments */
+ if (ucl_test_character (*p, UCL_CHARACTER_WHITESPACE_UNSAFE) ||
+ (chunk->remain >= 2 && ucl_lex_is_comment (p[0], p[1]))) {
+ while (p < chunk->end && ucl_test_character (*p, UCL_CHARACTER_WHITESPACE_UNSAFE)) {
+ ucl_chunk_skipc (chunk, p);
+ }
+ if (!ucl_skip_comments (parser)) {
+ return false;
}
+ p = chunk->pos;
+ }
+
+ while (p < chunk->end) {
c = p;
switch (*p) {
case '"':
+ obj = ucl_get_value_object (parser);
ucl_chunk_skipc (chunk, p);
if (!ucl_lex_json_string (parser, chunk, &need_unescape, &ucl_escape, &var_expand)) {
return false;
@@ -1285,6 +1305,7 @@ ucl_parse_value (struct ucl_parser *parser, struct ucl_chunk *chunk)
return true;
break;
case '{':
+ obj = ucl_get_value_object (parser);
/* We have a new object */
obj = ucl_add_parser_stack (obj, parser, false, parser->stack->level);
@@ -1292,13 +1313,25 @@ ucl_parse_value (struct ucl_parser *parser, struct ucl_chunk *chunk)
return true;
break;
case '[':
+ obj = ucl_get_value_object (parser);
/* We have a new array */
obj = ucl_add_parser_stack (obj, parser, true, parser->stack->level);
ucl_chunk_skipc (chunk, p);
return true;
break;
+ case ']':
+ /* We have the array ending */
+ if (parser->stack && parser->stack->obj->type == UCL_ARRAY) {
+ parser->state = UCL_STATE_AFTER_VALUE;
+ return true;
+ }
+ else {
+ goto parse_string;
+ }
+ break;
case '<':
+ obj = ucl_get_value_object (parser);
/* We have something like multiline value, which must be <<[A-Z]+\n */
if (chunk->end - p > 3) {
if (memcmp (p, "<<", 2) == 0) {
@@ -1332,17 +1365,9 @@ ucl_parse_value (struct ucl_parser *parser, struct ucl_chunk *chunk)
}
/* Fallback to ordinary strings */
default:
- /* Skip any spaces and comments */
- if (ucl_test_character (*p, UCL_CHARACTER_WHITESPACE_UNSAFE) ||
- (chunk->remain >= 2 && ucl_lex_is_comment (p[0], p[1]))) {
- while (p < chunk->end && ucl_test_character (*p, UCL_CHARACTER_WHITESPACE_UNSAFE)) {
- ucl_chunk_skipc (chunk, p);
- }
- if (!ucl_skip_comments (parser)) {
- return false;
- }
- p = chunk->pos;
- continue;
+parse_string:
+ if (obj == NULL) {
+ obj = ucl_get_value_object (parser);
}
/* Parse atom */
if (ucl_test_character (*p, UCL_CHARACTER_VALUE_DIGIT_START)) {
diff --git a/contrib/libucl/src/ucl_util.c b/contrib/libucl/src/ucl_util.c
index 6ab1d38..34080d4 100644
--- a/contrib/libucl/src/ucl_util.c
+++ b/contrib/libucl/src/ucl_util.c
@@ -35,6 +35,75 @@
#include <openssl/evp.h>
#endif
+#ifdef _WIN32
+#include <windows.h>
+
+#define PROT_READ 1
+#define PROT_WRITE 2
+#define PROT_READWRITE 3
+#define MAP_SHARED 1
+#define MAP_PRIVATE 2
+#define MAP_FAILED ((void *) -1)
+
+static void *mmap(char *addr, size_t length, int prot, int access, int fd, off_t offset)
+{
+ void *map = NULL;
+ HANDLE handle = INVALID_HANDLE_VALUE;
+
+ switch (prot) {
+ default:
+ case PROT_READ:
+ {
+ handle = CreateFileMapping((HANDLE) _get_osfhandle(fd), 0, PAGE_READONLY, 0, length, 0);
+ if (!handle) break;
+ map = (void *) MapViewOfFile(handle, FILE_MAP_READ, 0, 0, length);
+ CloseHandle(handle);
+ break;
+ }
+ case PROT_WRITE:
+ {
+ handle = CreateFileMapping((HANDLE) _get_osfhandle(fd), 0, PAGE_READWRITE, 0, length, 0);
+ if (!handle) break;
+ map = (void *) MapViewOfFile(handle, FILE_MAP_WRITE, 0, 0, length);
+ CloseHandle(handle);
+ break;
+ }
+ case PROT_READWRITE:
+ {
+ handle = CreateFileMapping((HANDLE) _get_osfhandle(fd), 0, PAGE_READWRITE, 0, length, 0);
+ if (!handle) break;
+ map = (void *) MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, length);
+ CloseHandle(handle);
+ break;
+ }
+ }
+ if (map == (void *) NULL) {
+ return (void *) MAP_FAILED;
+ }
+ return (void *) ((char *) map + offset);
+}
+
+static int munmap(void *map,size_t length)
+{
+ if (!UnmapViewOfFile(map)) {
+ return(-1);
+ }
+ return(0);
+}
+
+static char* realpath(const char *path, char *resolved_path) {
+ char *p;
+ char tmp[MAX_PATH + 1];
+ strncpy(tmp, path, sizeof(tmp)-1);
+ p = tmp;
+ while(*p) {
+ if (*p == '/') *p = '\\';
+ p++;
+ }
+ return _fullpath(resolved_path, tmp, MAX_PATH);
+}
+#endif
+
/**
* @file rcl_util.c
* Utilities for rcl parsing
@@ -177,7 +246,7 @@ ucl_unescape_json_string (char *str, size_t len)
return (t - str);
}
-char *
+UCL_EXTERN char *
ucl_copy_key_trash (ucl_object_t *obj)
{
if (obj->trash_stack[UCL_TRASH_KEY] == NULL && obj->key != NULL) {
@@ -193,7 +262,7 @@ ucl_copy_key_trash (ucl_object_t *obj)
return obj->trash_stack[UCL_TRASH_KEY];
}
-char *
+UCL_EXTERN char *
ucl_copy_value_trash (ucl_object_t *obj)
{
if (obj->trash_stack[UCL_TRASH_VALUE] == NULL) {
@@ -216,7 +285,7 @@ ucl_copy_value_trash (ucl_object_t *obj)
return obj->trash_stack[UCL_TRASH_VALUE];
}
-ucl_object_t*
+UCL_EXTERN ucl_object_t*
ucl_parser_get_object (struct ucl_parser *parser)
{
if (parser->state != UCL_STATE_ERROR && parser->top_obj != NULL) {
@@ -226,7 +295,7 @@ ucl_parser_get_object (struct ucl_parser *parser)
return NULL;
}
-void
+UCL_EXTERN void
ucl_parser_free (struct ucl_parser *parser)
{
struct ucl_stack *stack, *stmp;
@@ -266,7 +335,7 @@ ucl_parser_free (struct ucl_parser *parser)
UCL_FREE (sizeof (struct ucl_parser), parser);
}
-const char *
+UCL_EXTERN const char *
ucl_parser_get_error(struct ucl_parser *parser)
{
if (parser->err == NULL)
@@ -275,7 +344,7 @@ ucl_parser_get_error(struct ucl_parser *parser)
return utstring_body(parser->err);
}
-bool
+UCL_EXTERN bool
ucl_pubkey_add (struct ucl_parser *parser, const unsigned char *key, size_t len)
{
#ifndef HAVE_OPENSSL
@@ -679,7 +748,7 @@ ucl_include_file (const unsigned char *data, size_t len,
* @param err error ptr
* @return
*/
-bool
+UCL_EXTERN bool
ucl_include_handler (const unsigned char *data, size_t len, void* ud)
{
struct ucl_parser *parser = ud;
@@ -700,7 +769,7 @@ ucl_include_handler (const unsigned char *data, size_t len, void* ud)
* @param err error ptr
* @return
*/
-bool
+UCL_EXTERN bool
ucl_includes_handler (const unsigned char *data, size_t len, void* ud)
{
struct ucl_parser *parser = ud;
@@ -714,7 +783,7 @@ ucl_includes_handler (const unsigned char *data, size_t len, void* ud)
}
-bool
+UCL_EXTERN bool
ucl_try_include_handler (const unsigned char *data, size_t len, void* ud)
{
struct ucl_parser *parser = ud;
@@ -727,7 +796,7 @@ ucl_try_include_handler (const unsigned char *data, size_t len, void* ud)
return ucl_include_url (data, len, parser, false, false);
}
-bool
+UCL_EXTERN bool
ucl_parser_set_filevars (struct ucl_parser *parser, const char *filename, bool need_expand)
{
char realbuf[PATH_MAX], *curdir;
@@ -757,7 +826,7 @@ ucl_parser_set_filevars (struct ucl_parser *parser, const char *filename, bool n
return true;
}
-bool
+UCL_EXTERN bool
ucl_parser_add_file (struct ucl_parser *parser, const char *filename)
{
unsigned char *buf;
@@ -1055,6 +1124,29 @@ ucl_object_insert_key_common (ucl_object_t *top, ucl_object_t *elt,
return top;
}
+bool
+ucl_object_delete_keyl(ucl_object_t *top, const char *key, size_t keylen)
+{
+ ucl_object_t *found;
+
+ found = ucl_object_find_keyl(top, key, keylen);
+
+ if (found == NULL)
+ return false;
+
+ ucl_hash_delete(top->value.ov, found);
+ ucl_object_unref (found);
+ top->len --;
+
+ return true;
+}
+
+bool
+ucl_object_delete_key(ucl_object_t *top, const char *key)
+{
+ return ucl_object_delete_keyl(top, key, 0);
+}
+
ucl_object_t *
ucl_object_insert_key (ucl_object_t *top, ucl_object_t *elt,
const char *key, size_t keylen, bool copy_key)
OpenPOWER on IntegriCloud