luci-base: add urldecode() and urlencode() C implementations
[project/luci.git] / modules / luci-base / src / template_lualib.c
index 1035611..45e2396 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * LuCI Template - Lua binding
  *
- *   Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
+ *   Copyright (C) 2009-2018 Jo-Philipp Wich <jo@mein.io>
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -110,6 +110,51 @@ int template_L_striptags(lua_State *L)
        return 0;
 }
 
+int template_L_urlencode(lua_State *L)
+{
+       size_t len = 0;
+       const char *str = luaL_checkstring(L, 1);
+       char *res = urlencode(str, &len);
+
+       if (res != NULL)
+       {
+               lua_pushlstring(L, res, len);
+               free(res);
+
+               return 1;
+       }
+       else if (len == 0)
+       {
+               lua_pushvalue(L, 1);
+               return 1;
+       }
+
+       return 0;
+}
+
+int template_L_urldecode(lua_State *L)
+{
+       size_t len = 0;
+       const char *str = luaL_checkstring(L, 1);
+       int keep_plus = lua_toboolean(L, 2);
+       char *res = urldecode(str, &len, keep_plus == 1);
+
+       if (res != NULL)
+       {
+               lua_pushlstring(L, res, len);
+               free(res);
+
+               return 1;
+       }
+       else if (len == 0)
+       {
+               lua_pushvalue(L, 1);
+               return 1;
+       }
+
+       return 0;
+}
+
 static int template_L_load_catalog(lua_State *L) {
        const char *lang = luaL_optstring(L, 1, "en");
        const char *dir  = luaL_optstring(L, 2, NULL);
@@ -165,6 +210,8 @@ static const luaL_reg R[] = {
        { "utf8",                               template_L_utf8 },
        { "pcdata",                             template_L_pcdata },
        { "striptags",                  template_L_striptags },
+       { "urlencode",                  template_L_urlencode },
+       { "urldecode",                  template_L_urldecode },
        { "load_catalog",               template_L_load_catalog },
        { "close_catalog",              template_L_close_catalog },
        { "change_catalog",             template_L_change_catalog },