aboutsummaryrefslogtreecommitdiffstats
path: root/util-src/encodings.c
diff options
context:
space:
mode:
Diffstat (limited to 'util-src/encodings.c')
-rw-r--r--util-src/encodings.c174
1 files changed, 95 insertions, 79 deletions
diff --git a/util-src/encodings.c b/util-src/encodings.c
index 2a4653fb..9b6c6cf4 100644
--- a/util-src/encodings.c
+++ b/util-src/encodings.c
@@ -117,55 +117,8 @@ static const luaL_Reg Reg_base64[] =
};
/***************** STRINGPREP *****************/
-#ifndef USE_STRINGPREP_ICU
-/****************** libidn ********************/
-
-#include <stringprep.h>
-
-static int stringprep_prep(lua_State *L, const Stringprep_profile *profile)
-{
- size_t len;
- const char *s;
- char string[1024];
- int ret;
- if(!lua_isstring(L, 1)) {
- lua_pushnil(L);
- return 1;
- }
- s = lua_tolstring(L, 1, &len);
- if (len >= 1024) {
- lua_pushnil(L);
- return 1; /* TODO return error message */
- }
- strcpy(string, s);
- ret = stringprep(string, 1024, (Stringprep_profile_flags)0, profile);
- if (ret == STRINGPREP_OK) {
- lua_pushstring(L, string);
- return 1;
- } else {
- lua_pushnil(L);
- return 1; /* TODO return error message */
- }
-}
-
-#define MAKE_PREP_FUNC(myFunc, prep) \
-static int myFunc(lua_State *L) { return stringprep_prep(L, prep); }
-
-MAKE_PREP_FUNC(Lstringprep_nameprep, stringprep_nameprep) /** stringprep.nameprep(s) */
-MAKE_PREP_FUNC(Lstringprep_nodeprep, stringprep_xmpp_nodeprep) /** stringprep.nodeprep(s) */
-MAKE_PREP_FUNC(Lstringprep_resourceprep, stringprep_xmpp_resourceprep) /** stringprep.resourceprep(s) */
-MAKE_PREP_FUNC(Lstringprep_saslprep, stringprep_saslprep) /** stringprep.saslprep(s) */
-
-static const luaL_Reg Reg_stringprep[] =
-{
- { "nameprep", Lstringprep_nameprep },
- { "nodeprep", Lstringprep_nodeprep },
- { "resourceprep", Lstringprep_resourceprep },
- { "saslprep", Lstringprep_saslprep },
- { NULL, NULL }
-};
+#ifdef USE_STRINGPREP_ICU
-#else
#include <unicode/usprep.h>
#include <unicode/ustring.h>
#include <unicode/utrace.h>
@@ -192,13 +145,17 @@ static int icu_stringprep_prep(lua_State *L, const UStringPrepProfile *profile)
return 1;
}
u_strFromUTF8(unprepped, 1024, &unprepped_len, input, input_len, &err);
+ if (U_FAILURE(err)) {
+ luah_pushnil(L);
+ return 1;
+ }
prepped_len = usprep_prepare(profile, unprepped, unprepped_len, prepped, 1024, 0, NULL, &err);
if (U_FAILURE(err)) {
lua_pushnil(L);
return 1;
} else {
u_strToUTF8(output, 1024, &output_len, prepped, prepped_len, &err);
- if(output_len < 1024)
+ if (U_SUCCESS(err) && output_len < 1024)
lua_pushlstring(L, output, output_len);
else
lua_pushnil(L);
@@ -239,49 +196,58 @@ static const luaL_Reg Reg_stringprep[] =
{ "saslprep", Lstringprep_saslprep },
{ NULL, NULL }
};
-#endif
+#else /* USE_STRINGPREP_ICU */
-/***************** IDNA *****************/
-#ifndef USE_STRINGPREP_ICU
/****************** libidn ********************/
-#include <idna.h>
-#include <idn-free.h>
+#include <stringprep.h>
-static int Lidna_to_ascii(lua_State *L) /** idna.to_ascii(s) */
+static int stringprep_prep(lua_State *L, const Stringprep_profile *profile)
{
size_t len;
- const char *s = luaL_checklstring(L, 1, &len);
- char* output = NULL;
- int ret = idna_to_ascii_8z(s, &output, IDNA_USE_STD3_ASCII_RULES);
- if (ret == IDNA_SUCCESS) {
- lua_pushstring(L, output);
- idn_free(output);
+ const char *s;
+ char string[1024];
+ int ret;
+ if(!lua_isstring(L, 1)) {
+ lua_pushnil(L);
return 1;
- } else {
+ }
+ s = lua_tolstring(L, 1, &len);
+ if (len >= 1024) {
lua_pushnil(L);
- idn_free(output);
return 1; /* TODO return error message */
}
-}
-
-static int Lidna_to_unicode(lua_State *L) /** idna.to_unicode(s) */
-{
- size_t len;
- const char *s = luaL_checklstring(L, 1, &len);
- char* output = NULL;
- int ret = idna_to_unicode_8z8z(s, &output, 0);
- if (ret == IDNA_SUCCESS) {
- lua_pushstring(L, output);
- idn_free(output);
+ strcpy(string, s);
+ ret = stringprep(string, 1024, (Stringprep_profile_flags)0, profile);
+ if (ret == STRINGPREP_OK) {
+ lua_pushstring(L, string);
return 1;
} else {
lua_pushnil(L);
- idn_free(output);
return 1; /* TODO return error message */
}
}
-#else
+
+#define MAKE_PREP_FUNC(myFunc, prep) \
+static int myFunc(lua_State *L) { return stringprep_prep(L, prep); }
+
+MAKE_PREP_FUNC(Lstringprep_nameprep, stringprep_nameprep) /** stringprep.nameprep(s) */
+MAKE_PREP_FUNC(Lstringprep_nodeprep, stringprep_xmpp_nodeprep) /** stringprep.nodeprep(s) */
+MAKE_PREP_FUNC(Lstringprep_resourceprep, stringprep_xmpp_resourceprep) /** stringprep.resourceprep(s) */
+MAKE_PREP_FUNC(Lstringprep_saslprep, stringprep_saslprep) /** stringprep.saslprep(s) */
+
+static const luaL_Reg Reg_stringprep[] =
+{
+ { "nameprep", Lstringprep_nameprep },
+ { "nodeprep", Lstringprep_nodeprep },
+ { "resourceprep", Lstringprep_resourceprep },
+ { "saslprep", Lstringprep_saslprep },
+ { NULL, NULL }
+};
+#endif
+
+/***************** IDNA *****************/
+#ifdef USE_STRINGPREP_ICU
#include <unicode/ustdio.h>
#include <unicode/uidna.h>
/* IDNA2003 or IDNA2008 ? ? ? */
@@ -296,13 +262,18 @@ static int Lidna_to_ascii(lua_State *L) /** idna.to_ascii(s) */
char output[1024];
u_strFromUTF8(ustr, 1024, &ulen, s, len, &err);
+ if (U_FAILURE(err)) {
+ lua_pushnil(L);
+ return 1;
+ }
+
dest_len = uidna_IDNToASCII(ustr, ulen, dest, 1024, UIDNA_USE_STD3_RULES, NULL, &err);
if (U_FAILURE(err)) {
lua_pushnil(L);
return 1;
} else {
u_strToUTF8(output, 1024, &output_len, dest, dest_len, &err);
- if(output_len < 1024)
+ if (U_SUCCESS(err) && output_len < 1024)
lua_pushlstring(L, output, output_len);
else
lua_pushnil(L);
@@ -315,25 +286,70 @@ static int Lidna_to_unicode(lua_State *L) /** idna.to_unicode(s) */
size_t len;
int32_t ulen, dest_len, output_len;
const char *s = luaL_checklstring(L, 1, &len);
- UChar* ustr;
+ UChar ustr[1024];
UErrorCode err = U_ZERO_ERROR;
UChar dest[1024];
char output[1024];
u_strFromUTF8(ustr, 1024, &ulen, s, len, &err);
+ if (U_FAILURE(err)) {
+ lua_pushnil(L);
+ return 1;
+ }
+
dest_len = uidna_IDNToUnicode(ustr, ulen, dest, 1024, UIDNA_USE_STD3_RULES, NULL, &err);
if (U_FAILURE(err)) {
lua_pushnil(L);
return 1;
} else {
u_strToUTF8(output, 1024, &output_len, dest, dest_len, &err);
- if(output_len < 1024)
+ if (U_SUCCESS(err) && output_len < 1024)
lua_pushlstring(L, output, output_len);
else
lua_pushnil(L);
return 1;
}
}
+
+#else /* USE_STRINGPREP_ICU */
+/****************** libidn ********************/
+
+#include <idna.h>
+#include <idn-free.h>
+
+static int Lidna_to_ascii(lua_State *L) /** idna.to_ascii(s) */
+{
+ size_t len;
+ const char *s = luaL_checklstring(L, 1, &len);
+ char* output = NULL;
+ int ret = idna_to_ascii_8z(s, &output, IDNA_USE_STD3_ASCII_RULES);
+ if (ret == IDNA_SUCCESS) {
+ lua_pushstring(L, output);
+ idn_free(output);
+ return 1;
+ } else {
+ lua_pushnil(L);
+ idn_free(output);
+ return 1; /* TODO return error message */
+ }
+}
+
+static int Lidna_to_unicode(lua_State *L) /** idna.to_unicode(s) */
+{
+ size_t len;
+ const char *s = luaL_checklstring(L, 1, &len);
+ char* output = NULL;
+ int ret = idna_to_unicode_8z8z(s, &output, 0);
+ if (ret == IDNA_SUCCESS) {
+ lua_pushstring(L, output);
+ idn_free(output);
+ return 1;
+ } else {
+ lua_pushnil(L);
+ idn_free(output);
+ return 1; /* TODO return error message */
+ }
+}
#endif
static const luaL_Reg Reg_idna[] =