aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libucl/lua_ucl.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-01-13 09:24:19 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2017-01-13 09:24:19 +0000
commitd9f7a74a1c97af5b878066447178135a8349d6b5 (patch)
tree7f684b1038d90f210a5a36ec88520c46247785e2 /contrib/libucl/lua_ucl.c
parent66da8cd82b10a94a2422b27be23bdd6c7bbebb53 (diff)
downloadrspamd-d9f7a74a1c97af5b878066447178135a8349d6b5.tar.gz
rspamd-d9f7a74a1c97af5b878066447178135a8349d6b5.zip
[Feature] Allow custom parse types in lua ucl
Diffstat (limited to 'contrib/libucl/lua_ucl.c')
-rw-r--r--contrib/libucl/lua_ucl.c65
1 files changed, 51 insertions, 14 deletions
diff --git a/contrib/libucl/lua_ucl.c b/contrib/libucl/lua_ucl.c
index 5535ad427..fa69c72d0 100644
--- a/contrib/libucl/lua_ucl.c
+++ b/contrib/libucl/lua_ucl.c
@@ -526,6 +526,24 @@ lua_ucl_push_opaque (lua_State *L, ucl_object_t *obj)
lua_setmetatable (L, -2);
}
+static inline enum ucl_parse_type
+lua_ucl_str_to_parse_type (const char *str)
+{
+ enum ucl_parse_type type = UCL_PARSE_UCL;
+
+ if (str != NULL) {
+ if (strcasecmp (str, "msgpack") == 0) {
+ type = UCL_PARSE_MSGPACK;
+ }
+ else if (strcasecmp (str, "sexp") == 0 ||
+ strcasecmp (str, "csexp") == 0) {
+ type = UCL_PARSE_CSEXP;
+ }
+ }
+
+ return type;
+}
+
/***
* @method parser:parse_file(name)
* Parse UCL object from file.
@@ -581,13 +599,19 @@ lua_ucl_parser_parse_string (lua_State *L)
struct ucl_parser *parser;
const char *string;
size_t llen;
+ enum ucl_parse_type type = UCL_PARSE_UCL;
int ret = 2;
parser = lua_ucl_parser_get (L, 1);
string = luaL_checklstring (L, 2, &llen);
+ if (lua_type (L, 3) == LUA_TSTRING) {
+ type = lua_ucl_str_to_parse_type (lua_tostring (L, 3));
+ }
+
if (parser != NULL && string != NULL) {
- if (ucl_parser_add_chunk (parser, (const unsigned char *)string, llen)) {
+ if (ucl_parser_add_chunk_full (parser, (const unsigned char *)string,
+ llen, 0, UCL_DUPLICATE_APPEND, type)) {
lua_pushboolean (L, true);
ret = 1;
}
@@ -763,6 +787,28 @@ lua_ucl_object_unwrap (lua_State *L)
return 1;
}
+static inline enum ucl_emitter
+lua_ucl_str_to_emit_type (const char *strtype)
+{
+ enum ucl_emitter format = UCL_EMIT_JSON_COMPACT;
+
+ if (strcasecmp (strtype, "json") == 0) {
+ format = UCL_EMIT_JSON;
+ }
+ else if (strcasecmp (strtype, "json-compact") == 0) {
+ format = UCL_EMIT_JSON_COMPACT;
+ }
+ else if (strcasecmp (strtype, "yaml") == 0) {
+ format = UCL_EMIT_YAML;
+ }
+ else if (strcasecmp (strtype, "config") == 0 ||
+ strcasecmp (strtype, "ucl") == 0) {
+ format = UCL_EMIT_CONFIG;
+ }
+
+ return format;
+}
+
/***
* @method object:tostring(type)
* Unwraps opaque ucl object to string (json by default). Optionally you can
@@ -789,19 +835,7 @@ lua_ucl_object_tostring (lua_State *L)
if (lua_type (L, 2) == LUA_TSTRING) {
const char *strtype = lua_tostring (L, 2);
- if (strcasecmp (strtype, "json") == 0) {
- format = UCL_EMIT_JSON;
- }
- else if (strcasecmp (strtype, "json-compact") == 0) {
- format = UCL_EMIT_JSON_COMPACT;
- }
- else if (strcasecmp (strtype, "yaml") == 0) {
- format = UCL_EMIT_YAML;
- }
- else if (strcasecmp (strtype, "config") == 0 ||
- strcasecmp (strtype, "ucl") == 0) {
- format = UCL_EMIT_CONFIG;
- }
+ format = lua_ucl_str_to_emit_type (strtype);
}
}
@@ -1090,6 +1124,9 @@ lua_ucl_to_format (lua_State *L)
strcasecmp (strtype, "ucl") == 0) {
format = UCL_EMIT_CONFIG;
}
+ else if (strcasecmp (strtype, "msgpack") == 0) {
+ format = UCL_EMIT_MSGPACK;
+ }
}
}