util-src/encodings.c
author Kim Alvefur <zash@zash.se>
Sun, 24 Mar 2024 20:39:42 +0100
changeset 13466 720aed1f5cf2
parent 12980 a187600ec7d6
permissions -rw-r--r--
util.startup: Check root after detecting platform and reading config (thanks SigmaTel71) Ensures that startup.detect_platform() runs so know whether to use the POSIX method of checking the current user or something else. Also after reading the config so we know whether the root override setting is set.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2572
diff changeset
     1
/* Prosody IM
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2572
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2572
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
     4
-- Copyright (C) 1994-2015 Lua.org, PUC-Rio.
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
     5
--
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
     6
-- This project is MIT/X11 licensed. Please see the
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
     7
-- COPYING file in the source package for more information.
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
     8
--
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
     9
*/
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    10
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    11
/*
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    12
* encodings.c
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    13
* Lua library for base64, stringprep and idna encodings
520
e96ac4bb6dd8 and the C files too
Matthew Wild <mwild1@gmail.com>
parents: 474
diff changeset
    14
*/
e96ac4bb6dd8 and the C files too
Matthew Wild <mwild1@gmail.com>
parents: 474
diff changeset
    15
3965
4ae4b2c0e99d util.encodings: Switch comment styles to build ok as ANSI C
Matthew Wild <mwild1@gmail.com>
parents: 3769
diff changeset
    16
/* Newer MSVC compilers deprecate strcpy as unsafe, but we use it in a safe way */
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    17
#define _CRT_SECURE_NO_DEPRECATE
520
e96ac4bb6dd8 and the C files too
Matthew Wild <mwild1@gmail.com>
parents: 474
diff changeset
    18
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    19
#include <string.h>
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    20
#include <stdlib.h>
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    21
#include "lua.h"
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    22
#include "lauxlib.h"
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
    23
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
    24
#if (LUA_VERSION_NUM < 504)
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
    25
#define luaL_pushfail lua_pushnil
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
    26
#endif
6416
a552f4170aed util-src/*.c: Add macro for compiling with Lua 5.2
Kim Alvefur <zash@zash.se>
parents: 6415
diff changeset
    27
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
    28
/***************** BASE64 *****************/
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    29
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    30
static const char code[] =
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    31
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    32
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
    33
static void base64_encode(luaL_Buffer *b, unsigned int c1, unsigned int c2, unsigned int c3, int n) {
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    34
	unsigned long tuple = c3 + 256UL * (c2 + 256UL * c1);
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    35
	int i;
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    36
	char s[4];
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    37
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    38
	for(i = 0; i < 4; i++) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    39
		s[3 - i] = code[tuple % 64];
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    40
		tuple /= 64;
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    41
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    42
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    43
	for(i = n + 1; i < 4; i++) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    44
		s[i] = '=';
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    45
	}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    46
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    47
	luaL_addlstring(b, s, 4);
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    48
}
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    49
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
    50
static int Lbase64_encode(lua_State *L) {	/** encode(s) */
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    51
	size_t l;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
    52
	const unsigned char *s = (const unsigned char *)luaL_checklstring(L, 1, &l);
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    53
	luaL_Buffer b;
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    54
	int n;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    55
	luaL_buffinit(L, &b);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    56
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    57
	for(n = l / 3; n--; s += 3) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    58
		base64_encode(&b, s[0], s[1], s[2], 3);
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    59
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    60
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    61
	switch(l % 3) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    62
		case 1:
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    63
			base64_encode(&b, s[0], 0, 0, 1);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    64
			break;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
    65
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    66
		case 2:
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    67
			base64_encode(&b, s[0], s[1], 0, 2);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    68
			break;
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    69
	}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    70
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    71
	luaL_pushresult(&b);
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    72
	return 1;
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    73
}
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    74
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
    75
static void base64_decode(luaL_Buffer *b, int c1, int c2, int c3, int c4, int n) {
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    76
	unsigned long tuple = c4 + 64L * (c3 + 64L * (c2 + 64L * c1));
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    77
	char s[3];
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    78
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    79
	switch(--n) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    80
		case 3:
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    81
			s[2] = (char) tuple;
9156
26c5a4a14905 encodings: Explicitly say that base64 decoding falls through in a switch, fixes a warning in gcc 7+.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8294
diff changeset
    82
			/* Falls through. */
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
    83
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    84
		case 2:
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    85
			s[1] = (char)(tuple >> 8);
9156
26c5a4a14905 encodings: Explicitly say that base64 decoding falls through in a switch, fixes a warning in gcc 7+.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8294
diff changeset
    86
			/* Falls through. */
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
    87
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    88
		case 1:
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    89
			s[0] = (char)(tuple >> 16);
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    90
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    91
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    92
	luaL_addlstring(b, s, n);
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    93
}
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    94
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
    95
static int Lbase64_decode(lua_State *L) {	/** decode(s) */
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    96
	size_t l;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
    97
	const char *s = luaL_checklstring(L, 1, &l);
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
    98
	luaL_Buffer b;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
    99
	int n = 0;
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   100
	char t[4];
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   101
	luaL_buffinit(L, &b);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   102
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   103
	for(;;) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   104
		int c = *s++;
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   105
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   106
		switch(c) {
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   107
				const char *p;
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   108
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   109
			default:
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   110
				p = strchr(code, c);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   111
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   112
				if(p == NULL) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   113
					return 0;
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   114
				}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   115
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   116
				t[n++] = (char)(p - code);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   117
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   118
				if(n == 4) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   119
					base64_decode(&b, t[0], t[1], t[2], t[3], 4);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   120
					n = 0;
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   121
				}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   122
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   123
				break;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   124
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   125
			case '=':
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   126
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   127
				switch(n) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   128
					case 1:
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   129
						base64_decode(&b, t[0], 0, 0, 0, 1);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   130
						break;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   131
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   132
					case 2:
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   133
						base64_decode(&b, t[0], t[1], 0, 0, 2);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   134
						break;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   135
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   136
					case 3:
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   137
						base64_decode(&b, t[0], t[1], t[2], 0, 3);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   138
						break;
601
6cb908ef01c8 Fixed util.encodings.base64.decode to not truncate results when encountering an '=' before the end of the given input.
Waqas Hussain <waqas20@gmail.com>
parents: 520
diff changeset
   139
				}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   140
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   141
				n = 0;
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   142
				break;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   143
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   144
			case 0:
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   145
				luaL_pushresult(&b);
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   146
				return 1;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   147
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   148
			case '\n':
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   149
			case '\r':
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   150
			case '\t':
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   151
			case ' ':
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   152
			case '\f':
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   153
			case '\b':
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   154
				break;
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   155
		}
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   156
	}
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   157
}
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   158
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   159
static const luaL_Reg Reg_base64[] = {
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   160
	{ "encode",	Lbase64_encode	},
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   161
	{ "decode",	Lbase64_decode	},
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   162
	{ NULL,		NULL	}
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   163
};
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   164
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   165
/******************* UTF-8 ********************/
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   166
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   167
/*
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   168
 * Adapted from Lua 5.3
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   169
 * Needed because libidn does not validate that input is valid UTF-8
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   170
 */
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   171
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   172
#define MAXUNICODE	0x10FFFF
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   173
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   174
/*
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   175
 * Decode one UTF-8 sequence, returning NULL if byte sequence is invalid.
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   176
 */
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   177
static const char *utf8_decode(const char *o, int *val) {
8001
604beb13596a util.encodings: Make limit lookup table a const (from Lua f2a813ae)
Kim Alvefur <zash@zash.se>
parents: 7892
diff changeset
   178
	static const unsigned int limits[] = {0xFF, 0x7F, 0x7FF, 0xFFFF};
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   179
	const unsigned char *s = (const unsigned char *)o;
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   180
	unsigned int c = s[0];
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   181
	unsigned int res = 0;  /* final result */
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   182
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   183
	if(c < 0x80) { /* ascii? */
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   184
		res = c;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   185
	} else {
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   186
		int count = 0;  /* to count number of continuation bytes */
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   187
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   188
		while(c & 0x40) {   /* still have continuation bytes? */
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   189
			int cc = s[++count];  /* read next byte */
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   190
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   191
			if((cc & 0xC0) != 0x80) { /* not a continuation byte? */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   192
				return NULL;    /* invalid byte sequence */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   193
			}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   194
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   195
			res = (res << 6) | (cc & 0x3F);  /* add lower 6 bits from cont. byte */
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   196
			c <<= 1;  /* to test next bit */
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   197
		}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   198
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   199
		res |= ((c & 0x7F) << (count * 5));  /* add first byte */
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   200
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   201
		if(count > 3 || res > MAXUNICODE || res <= limits[count] || (0xd800 <= res && res <= 0xdfff)) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   202
			return NULL;    /* invalid byte sequence */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   203
		}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   204
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   205
		s += count;  /* skip continuation bytes read */
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   206
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   207
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   208
	if(val) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   209
		*val = res;
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   210
	}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   211
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   212
	return (const char *)s + 1;  /* +1 to include first byte */
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   213
}
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   214
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   215
/*
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   216
 * Check that a string is valid UTF-8
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   217
 * Returns NULL if not
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   218
 */
10482
5e9a1a75f8a7 util.encodings: Don’t export unneeded symbols
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 10375
diff changeset
   219
static const char *check_utf8(lua_State *L, int idx, size_t *l) {
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   220
	size_t pos, len;
8294
fba1ea67f5c0 util.encodings: Use the 'idx' argument correctly [-Wunused-parameter]
Kim Alvefur <zash@zash.se>
parents: 8001
diff changeset
   221
	const char *s = luaL_checklstring(L, idx, &len);
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   222
	pos = 0;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   223
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   224
	while(pos <= len) {
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   225
		const char *s1 = utf8_decode(s + pos, NULL);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   226
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   227
		if(s1 == NULL) {   /* conversion error? */
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   228
			return NULL;
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   229
		}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   230
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   231
		pos = s1 - s;
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   232
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   233
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   234
	if(l != NULL) {
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   235
		*l = len;
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   236
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   237
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   238
	return s;
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   239
}
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   240
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   241
static int Lutf8_valid(lua_State *L) {
6595
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   242
	lua_pushboolean(L, check_utf8(L, 1, NULL) != NULL);
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   243
	return 1;
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   244
}
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   245
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   246
static int Lutf8_length(lua_State *L) {
6595
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   247
	size_t len;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   248
6595
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   249
	if(!check_utf8(L, 1, &len)) {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   250
		luaL_pushfail(L);
6595
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   251
		lua_pushliteral(L, "invalid utf8");
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   252
		return 2;
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   253
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   254
6595
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   255
	lua_pushinteger(L, len);
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   256
	return 1;
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   257
}
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   258
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   259
static const luaL_Reg Reg_utf8[] = {
6595
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   260
	{ "valid",	Lutf8_valid	},
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   261
	{ "length",	Lutf8_length	},
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   262
	{ NULL,		NULL	}
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   263
};
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   264
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   265
/***************** STRINGPREP *****************/
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   266
#ifdef USE_STRINGPREP_ICU
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   267
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   268
#include <unicode/usprep.h>
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   269
#include <unicode/ustring.h>
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   270
#include <unicode/utrace.h>
9980
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   271
#include <unicode/uspoof.h>
10265
010c67532ed0 util.encodings: Switch ICU binding to IDNA2008 (fixes #533, #1301)
Kim Alvefur <zash@zash.se>
parents: 10010
diff changeset
   272
#include <unicode/uidna.h>
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   273
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   274
static int icu_stringprep_prep(lua_State *L, const UStringPrepProfile *profile) {
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   275
	size_t input_len;
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   276
	int32_t unprepped_len, prepped_len, output_len;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   277
	const char *input;
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   278
	char output[1024];
10361
72e6d0d7ff9b util.encodings: Optional strict flag to stringprep
Kim Alvefur <zash@zash.se>
parents: 10266
diff changeset
   279
	int flags = USPREP_ALLOW_UNASSIGNED;
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   280
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   281
	UChar unprepped[1024]; /* Temporary unicode buffer (1024 characters) */
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   282
	UChar prepped[1024];
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   283
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   284
	UErrorCode err = U_ZERO_ERROR;
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   285
10375
228338120009 util.encodings: Don't ignore non-strings passed to stringprep functions
Kim Alvefur <zash@zash.se>
parents: 10363
diff changeset
   286
	input = luaL_checklstring(L, 1, &input_len);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   287
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   288
	if(input_len >= 1024) {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   289
		luaL_pushfail(L);
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   290
		return 1;
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   291
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   292
10361
72e6d0d7ff9b util.encodings: Optional strict flag to stringprep
Kim Alvefur <zash@zash.se>
parents: 10266
diff changeset
   293
	/* strict */
10363
4ef785f45aa2 util.encodings: Strictly verify that the 'strict' *prep argument is a boolean
Kim Alvefur <zash@zash.se>
parents: 10361
diff changeset
   294
	if(!lua_isnoneornil(L, 2)) {
4ef785f45aa2 util.encodings: Strictly verify that the 'strict' *prep argument is a boolean
Kim Alvefur <zash@zash.se>
parents: 10361
diff changeset
   295
		luaL_checktype(L, 2, LUA_TBOOLEAN);
4ef785f45aa2 util.encodings: Strictly verify that the 'strict' *prep argument is a boolean
Kim Alvefur <zash@zash.se>
parents: 10361
diff changeset
   296
		if(lua_toboolean(L, 2)) {
4ef785f45aa2 util.encodings: Strictly verify that the 'strict' *prep argument is a boolean
Kim Alvefur <zash@zash.se>
parents: 10361
diff changeset
   297
			flags = 0;
4ef785f45aa2 util.encodings: Strictly verify that the 'strict' *prep argument is a boolean
Kim Alvefur <zash@zash.se>
parents: 10361
diff changeset
   298
		}
10361
72e6d0d7ff9b util.encodings: Optional strict flag to stringprep
Kim Alvefur <zash@zash.se>
parents: 10266
diff changeset
   299
	}
72e6d0d7ff9b util.encodings: Optional strict flag to stringprep
Kim Alvefur <zash@zash.se>
parents: 10266
diff changeset
   300
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   301
	u_strFromUTF8(unprepped, 1024, &unprepped_len, input, input_len, &err);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   302
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   303
	if(U_FAILURE(err)) {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   304
		luaL_pushfail(L);
4273
7f789266b741 util.encodings: Check return values before proceeding
Paul Aurich <paul@darkrain42.org>
parents: 4272
diff changeset
   305
		return 1;
7f789266b741 util.encodings: Check return values before proceeding
Paul Aurich <paul@darkrain42.org>
parents: 4272
diff changeset
   306
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   307
10361
72e6d0d7ff9b util.encodings: Optional strict flag to stringprep
Kim Alvefur <zash@zash.se>
parents: 10266
diff changeset
   308
	prepped_len = usprep_prepare(profile, unprepped, unprepped_len, prepped, 1024, flags, NULL, &err);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   309
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   310
	if(U_FAILURE(err)) {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   311
		luaL_pushfail(L);
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   312
		return 1;
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   313
	} else {
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   314
		u_strToUTF8(output, 1024, &output_len, prepped, prepped_len, &err);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   315
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   316
		if(U_SUCCESS(err) && output_len < 1024) {
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   317
			lua_pushlstring(L, output, output_len);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   318
		} else {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   319
			luaL_pushfail(L);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   320
		}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   321
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   322
		return 1;
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   323
	}
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   324
}
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   325
10482
5e9a1a75f8a7 util.encodings: Don’t export unneeded symbols
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 10375
diff changeset
   326
static UStringPrepProfile *icu_nameprep;
5e9a1a75f8a7 util.encodings: Don’t export unneeded symbols
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 10375
diff changeset
   327
static UStringPrepProfile *icu_nodeprep;
5e9a1a75f8a7 util.encodings: Don’t export unneeded symbols
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 10375
diff changeset
   328
static UStringPrepProfile *icu_resourceprep;
5e9a1a75f8a7 util.encodings: Don’t export unneeded symbols
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 10375
diff changeset
   329
static UStringPrepProfile *icu_saslprep;
5e9a1a75f8a7 util.encodings: Don’t export unneeded symbols
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 10375
diff changeset
   330
static USpoofChecker *icu_spoofcheck;
5e9a1a75f8a7 util.encodings: Don’t export unneeded symbols
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 10375
diff changeset
   331
static UIDNA *icu_idna2008;
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   332
9983
b06f6ff878ee util.encodings: Add compat with ICU before version 58
Kim Alvefur <zash@zash.se>
parents: 9980
diff changeset
   333
#if (U_ICU_VERSION_MAJOR_NUM < 58)
b06f6ff878ee util.encodings: Add compat with ICU before version 58
Kim Alvefur <zash@zash.se>
parents: 9980
diff changeset
   334
/* COMPAT */
b06f6ff878ee util.encodings: Add compat with ICU before version 58
Kim Alvefur <zash@zash.se>
parents: 9980
diff changeset
   335
#define USPOOF_CONFUSABLE (USPOOF_SINGLE_SCRIPT_CONFUSABLE | USPOOF_MIXED_SCRIPT_CONFUSABLE | USPOOF_WHOLE_SCRIPT_CONFUSABLE)
b06f6ff878ee util.encodings: Add compat with ICU before version 58
Kim Alvefur <zash@zash.se>
parents: 9980
diff changeset
   336
#endif
b06f6ff878ee util.encodings: Add compat with ICU before version 58
Kim Alvefur <zash@zash.se>
parents: 9980
diff changeset
   337
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   338
/* initialize global ICU stringprep profiles */
10482
5e9a1a75f8a7 util.encodings: Don’t export unneeded symbols
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 10375
diff changeset
   339
static void init_icu(void) {
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   340
	UErrorCode err = U_ZERO_ERROR;
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   341
	utrace_setLevel(UTRACE_VERBOSE);
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   342
	icu_nameprep = usprep_openByType(USPREP_RFC3491_NAMEPREP, &err);
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   343
	icu_nodeprep = usprep_openByType(USPREP_RFC3920_NODEPREP, &err);
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   344
	icu_resourceprep = usprep_openByType(USPREP_RFC3920_RESOURCEPREP, &err);
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   345
	icu_saslprep = usprep_openByType(USPREP_RFC4013_SASLPREP, &err);
9980
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   346
	icu_spoofcheck = uspoof_open(&err);
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   347
	uspoof_setChecks(icu_spoofcheck, USPOOF_CONFUSABLE, &err);
10266
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   348
	int options = UIDNA_DEFAULT;
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   349
#if 0
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   350
	/* COMPAT with future Unicode versions */
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   351
	options |= UIDNA_ALLOW_UNASSIGNED;
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   352
#endif
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   353
#if 1
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   354
	/* Forbid eg labels starting with _ */
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   355
	options |= UIDNA_USE_STD3_RULES;
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   356
#endif
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   357
#if 0
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   358
	/* TODO determine if we need this */
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   359
	options |= UIDNA_CHECK_BIDI;
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   360
#endif
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   361
#if 0
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   362
	/* UTS46 makes it sound like these are the responsibility of registrars */
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   363
	options |= UIDNA_CHECK_CONTEXTJ;
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   364
	options |= UIDNA_CHECK_CONTEXTO;
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   365
#endif
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   366
#if 0
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   367
	/* This disables COMPAT with IDNA 2003 */
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   368
	options |= UIDNA_NONTRANSITIONAL_TO_ASCII;
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   369
	options |= UIDNA_NONTRANSITIONAL_TO_UNICODE;
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   370
#endif
b1209bc15cd1 util.encodings: Spell out all IDNA 2008 options ICU has
Kim Alvefur <zash@zash.se>
parents: 10265
diff changeset
   371
	icu_idna2008 = uidna_openUTS46(options, &err);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   372
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   373
	if(U_FAILURE(err)) {
10483
d362934437eb util.encodings: Remove redundant cast
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 10482
diff changeset
   374
		fprintf(stderr, "[c] util.encodings: error: %s\n", u_errorName(err));
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   375
	}
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   376
}
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   377
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   378
#define MAKE_PREP_FUNC(myFunc, prep) \
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   379
static int myFunc(lua_State *L) { return icu_stringprep_prep(L, prep); }
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   380
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   381
MAKE_PREP_FUNC(Lstringprep_nameprep, icu_nameprep)		/** stringprep.nameprep(s) */
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   382
MAKE_PREP_FUNC(Lstringprep_nodeprep, icu_nodeprep)		/** stringprep.nodeprep(s) */
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   383
MAKE_PREP_FUNC(Lstringprep_resourceprep, icu_resourceprep)		/** stringprep.resourceprep(s) */
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   384
MAKE_PREP_FUNC(Lstringprep_saslprep, icu_saslprep)		/** stringprep.saslprep(s) */
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   385
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   386
static const luaL_Reg Reg_stringprep[] = {
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   387
	{ "nameprep",	Lstringprep_nameprep	},
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   388
	{ "nodeprep",	Lstringprep_nodeprep	},
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   389
	{ "resourceprep",	Lstringprep_resourceprep	},
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   390
	{ "saslprep",	Lstringprep_saslprep	},
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   391
	{ NULL,		NULL	}
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   392
};
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   393
#else /* USE_STRINGPREP_ICU */
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   394
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   395
/****************** libidn ********************/
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   396
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   397
#include <stringprep.h>
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   398
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   399
static int stringprep_prep(lua_State *L, const Stringprep_profile *profile) {
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   400
	size_t len;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   401
	const char *s;
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   402
	char string[1024];
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   403
	int ret;
10361
72e6d0d7ff9b util.encodings: Optional strict flag to stringprep
Kim Alvefur <zash@zash.se>
parents: 10266
diff changeset
   404
	Stringprep_profile_flags flags = 0;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   405
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   406
	s = check_utf8(L, 1, &len);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   407
10361
72e6d0d7ff9b util.encodings: Optional strict flag to stringprep
Kim Alvefur <zash@zash.se>
parents: 10266
diff changeset
   408
	/* strict */
10363
4ef785f45aa2 util.encodings: Strictly verify that the 'strict' *prep argument is a boolean
Kim Alvefur <zash@zash.se>
parents: 10361
diff changeset
   409
	if(!lua_isnoneornil(L, 2)) {
4ef785f45aa2 util.encodings: Strictly verify that the 'strict' *prep argument is a boolean
Kim Alvefur <zash@zash.se>
parents: 10361
diff changeset
   410
		luaL_checktype(L, 2, LUA_TBOOLEAN);
4ef785f45aa2 util.encodings: Strictly verify that the 'strict' *prep argument is a boolean
Kim Alvefur <zash@zash.se>
parents: 10361
diff changeset
   411
		if(lua_toboolean(L, 2)) {
4ef785f45aa2 util.encodings: Strictly verify that the 'strict' *prep argument is a boolean
Kim Alvefur <zash@zash.se>
parents: 10361
diff changeset
   412
			flags = STRINGPREP_NO_UNASSIGNED;
4ef785f45aa2 util.encodings: Strictly verify that the 'strict' *prep argument is a boolean
Kim Alvefur <zash@zash.se>
parents: 10361
diff changeset
   413
		}
10361
72e6d0d7ff9b util.encodings: Optional strict flag to stringprep
Kim Alvefur <zash@zash.se>
parents: 10266
diff changeset
   414
	}
72e6d0d7ff9b util.encodings: Optional strict flag to stringprep
Kim Alvefur <zash@zash.se>
parents: 10266
diff changeset
   415
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   416
	if(s == NULL || len >= 1024 || len != strlen(s)) {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   417
		luaL_pushfail(L);
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   418
		return 1; /* TODO return error message */
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   419
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   420
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   421
	strcpy(string, s);
10361
72e6d0d7ff9b util.encodings: Optional strict flag to stringprep
Kim Alvefur <zash@zash.se>
parents: 10266
diff changeset
   422
	ret = stringprep(string, 1024, flags, profile);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   423
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   424
	if(ret == STRINGPREP_OK) {
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   425
		lua_pushstring(L, string);
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   426
		return 1;
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   427
	} else {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   428
		luaL_pushfail(L);
3965
4ae4b2c0e99d util.encodings: Switch comment styles to build ok as ANSI C
Matthew Wild <mwild1@gmail.com>
parents: 3769
diff changeset
   429
		return 1; /* TODO return error message */
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   430
	}
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   431
}
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   432
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   433
#define MAKE_PREP_FUNC(myFunc, prep) \
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   434
static int myFunc(lua_State *L) { return stringprep_prep(L, prep); }
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   435
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   436
MAKE_PREP_FUNC(Lstringprep_nameprep, stringprep_nameprep)		/** stringprep.nameprep(s) */
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   437
MAKE_PREP_FUNC(Lstringprep_nodeprep, stringprep_xmpp_nodeprep)		/** stringprep.nodeprep(s) */
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   438
MAKE_PREP_FUNC(Lstringprep_resourceprep, stringprep_xmpp_resourceprep)		/** stringprep.resourceprep(s) */
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   439
MAKE_PREP_FUNC(Lstringprep_saslprep, stringprep_saslprep)		/** stringprep.saslprep(s) */
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   440
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   441
static const luaL_Reg Reg_stringprep[] = {
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   442
	{ "nameprep",	Lstringprep_nameprep	},
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   443
	{ "nodeprep",	Lstringprep_nodeprep	},
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   444
	{ "resourceprep",	Lstringprep_resourceprep	},
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   445
	{ "saslprep",	Lstringprep_saslprep	},
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   446
	{ NULL,		NULL	}
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   447
};
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   448
#endif
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   449
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   450
/***************** IDNA *****************/
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   451
#ifdef USE_STRINGPREP_ICU
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   452
#include <unicode/ustdio.h>
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   453
#include <unicode/uidna.h>
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   454
/* IDNA2003 or IDNA2008 ? ? ? */
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   455
static int Lidna_to_ascii(lua_State *L) {	/** idna.to_ascii(s) */
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   456
	size_t len;
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   457
	int32_t ulen, dest_len, output_len;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   458
	const char *s = luaL_checklstring(L, 1, &len);
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   459
	UChar ustr[1024];
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   460
	UErrorCode err = U_ZERO_ERROR;
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   461
	UChar dest[1024];
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   462
	char output[1024];
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   463
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   464
	u_strFromUTF8(ustr, 1024, &ulen, s, len, &err);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   465
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   466
	if(U_FAILURE(err)) {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   467
		luaL_pushfail(L);
4273
7f789266b741 util.encodings: Check return values before proceeding
Paul Aurich <paul@darkrain42.org>
parents: 4272
diff changeset
   468
		return 1;
7f789266b741 util.encodings: Check return values before proceeding
Paul Aurich <paul@darkrain42.org>
parents: 4272
diff changeset
   469
	}
7f789266b741 util.encodings: Check return values before proceeding
Paul Aurich <paul@darkrain42.org>
parents: 4272
diff changeset
   470
10265
010c67532ed0 util.encodings: Switch ICU binding to IDNA2008 (fixes #533, #1301)
Kim Alvefur <zash@zash.se>
parents: 10010
diff changeset
   471
	UIDNAInfo info = UIDNA_INFO_INITIALIZER;
010c67532ed0 util.encodings: Switch ICU binding to IDNA2008 (fixes #533, #1301)
Kim Alvefur <zash@zash.se>
parents: 10010
diff changeset
   472
	dest_len = uidna_nameToASCII(icu_idna2008, ustr, ulen, dest, 256, &info, &err);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   473
10265
010c67532ed0 util.encodings: Switch ICU binding to IDNA2008 (fixes #533, #1301)
Kim Alvefur <zash@zash.se>
parents: 10010
diff changeset
   474
	if(U_FAILURE(err) || info.errors) {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   475
		luaL_pushfail(L);
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   476
		return 1;
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   477
	} else {
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   478
		u_strToUTF8(output, 1024, &output_len, dest, dest_len, &err);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   479
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   480
		if(U_SUCCESS(err) && output_len < 1024) {
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   481
			lua_pushlstring(L, output, output_len);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   482
		} else {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   483
			luaL_pushfail(L);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   484
		}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   485
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   486
		return 1;
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   487
	}
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   488
}
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   489
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   490
static int Lidna_to_unicode(lua_State *L) {	/** idna.to_unicode(s) */
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   491
	size_t len;
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   492
	int32_t ulen, dest_len, output_len;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   493
	const char *s = luaL_checklstring(L, 1, &len);
4271
18d888c8c12d util.encodings: Fix idna.to_unicode
Paul Aurich <paul@darkrain42.org>
parents: 3965
diff changeset
   494
	UChar ustr[1024];
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   495
	UErrorCode err = U_ZERO_ERROR;
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   496
	UChar dest[1024];
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   497
	char output[1024];
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   498
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   499
	u_strFromUTF8(ustr, 1024, &ulen, s, len, &err);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   500
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   501
	if(U_FAILURE(err)) {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   502
		luaL_pushfail(L);
4273
7f789266b741 util.encodings: Check return values before proceeding
Paul Aurich <paul@darkrain42.org>
parents: 4272
diff changeset
   503
		return 1;
7f789266b741 util.encodings: Check return values before proceeding
Paul Aurich <paul@darkrain42.org>
parents: 4272
diff changeset
   504
	}
7f789266b741 util.encodings: Check return values before proceeding
Paul Aurich <paul@darkrain42.org>
parents: 4272
diff changeset
   505
10265
010c67532ed0 util.encodings: Switch ICU binding to IDNA2008 (fixes #533, #1301)
Kim Alvefur <zash@zash.se>
parents: 10010
diff changeset
   506
	UIDNAInfo info = UIDNA_INFO_INITIALIZER;
010c67532ed0 util.encodings: Switch ICU binding to IDNA2008 (fixes #533, #1301)
Kim Alvefur <zash@zash.se>
parents: 10010
diff changeset
   507
	dest_len = uidna_nameToUnicode(icu_idna2008, ustr, ulen, dest, 1024, &info, &err);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   508
10265
010c67532ed0 util.encodings: Switch ICU binding to IDNA2008 (fixes #533, #1301)
Kim Alvefur <zash@zash.se>
parents: 10010
diff changeset
   509
	if(U_FAILURE(err) || info.errors) {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   510
		luaL_pushfail(L);
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   511
		return 1;
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   512
	} else {
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   513
		u_strToUTF8(output, 1024, &output_len, dest, dest_len, &err);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   514
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   515
		if(U_SUCCESS(err) && output_len < 1024) {
3769
9338d0785277 util-src/Makefile, util-src/encodings.c{,pp}: Port ICU code to C, rename encodings.cpp back to .c and amend the Makefile accordingly
Matthew Wild <mwild1@gmail.com>
parents: 3764
diff changeset
   516
			lua_pushlstring(L, output, output_len);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   517
		} else {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   518
			luaL_pushfail(L);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   519
		}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   520
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   521
		return 1;
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   522
	}
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   523
}
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   524
9980
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   525
static int Lskeleton(lua_State *L) {
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   526
	size_t len;
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   527
	int32_t ulen, dest_len, output_len;
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   528
	const char *s = luaL_checklstring(L, 1, &len);
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   529
	UErrorCode err = U_ZERO_ERROR;
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   530
	UChar ustr[1024];
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   531
	UChar dest[1024];
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   532
	char output[1024];
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   533
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   534
	u_strFromUTF8(ustr, 1024, &ulen, s, len, &err);
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   535
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   536
	if(U_FAILURE(err)) {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   537
		luaL_pushfail(L);
9980
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   538
		return 1;
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   539
	}
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   540
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   541
	dest_len = uspoof_getSkeleton(icu_spoofcheck, 0, ustr, ulen, dest, 1024, &err);
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   542
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   543
	if(U_FAILURE(err)) {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   544
		luaL_pushfail(L);
9980
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   545
		return 1;
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   546
	}
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   547
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   548
	u_strToUTF8(output, 1024, &output_len, dest, dest_len, &err);
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   549
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   550
	if(U_SUCCESS(err)) {
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   551
		lua_pushlstring(L, output, output_len);
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   552
		return 1;
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   553
	}
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   554
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   555
	luaL_pushfail(L);
9980
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   556
	return 1;
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   557
}
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   558
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   559
#else /* USE_STRINGPREP_ICU */
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   560
/****************** libidn ********************/
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   561
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   562
#include <idna.h>
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   563
#include <idn-free.h>
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   564
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   565
static int Lidna_to_ascii(lua_State *L) {	/** idna.to_ascii(s) */
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   566
	size_t len;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   567
	const char *s = check_utf8(L, 1, &len);
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   568
	char *output = NULL;
6646
127b9f0c6135 util.encodings: Move declarations to top of function [pedantic]
Kim Alvefur <zash@zash.se>
parents: 6618
diff changeset
   569
	int ret;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   570
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   571
	if(s == NULL || len != strlen(s)) {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   572
		luaL_pushfail(L);
6594
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   573
		return 1; /* TODO return error message */
fe3018a2f187 util.encodings: Perform validation of UTF-8 strings before passing to libidn (Based on code from the utf8 library in Lua 5.3)
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   574
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   575
6646
127b9f0c6135 util.encodings: Move declarations to top of function [pedantic]
Kim Alvefur <zash@zash.se>
parents: 6618
diff changeset
   576
	ret = idna_to_ascii_8z(s, &output, IDNA_USE_STD3_ASCII_RULES);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   577
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   578
	if(ret == IDNA_SUCCESS) {
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   579
		lua_pushstring(L, output);
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   580
		idn_free(output);
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   581
		return 1;
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   582
	} else {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   583
		luaL_pushfail(L);
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   584
		idn_free(output);
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   585
		return 1; /* TODO return error message */
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   586
	}
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   587
}
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   588
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   589
static int Lidna_to_unicode(lua_State *L) {	/** idna.to_unicode(s) */
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   590
	size_t len;
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   591
	const char *s = luaL_checklstring(L, 1, &len);
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
   592
	char *output = NULL;
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   593
	int ret = idna_to_unicode_8z8z(s, &output, 0);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   594
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   595
	if(ret == IDNA_SUCCESS) {
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   596
		lua_pushstring(L, output);
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   597
		idn_free(output);
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   598
		return 1;
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   599
	} else {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10483
diff changeset
   600
		luaL_pushfail(L);
4272
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   601
		idn_free(output);
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   602
		return 1; /* TODO return error message */
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   603
	}
0a4ce2086a88 util.encodings: Swap code order ("ifndef" bugs me)
Paul Aurich <paul@darkrain42.org>
parents: 4271
diff changeset
   604
}
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   605
#endif
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   606
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6611
diff changeset
   607
static const luaL_Reg Reg_idna[] = {
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   608
	{ "to_ascii",	Lidna_to_ascii	},
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   609
	{ "to_unicode",	Lidna_to_unicode	},
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   610
	{ NULL,		NULL	}
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   611
};
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   612
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   613
/***************** end *****************/
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   614
12980
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12579
diff changeset
   615
LUALIB_API int luaopen_prosody_util_encodings(lua_State *L) {
7821
54669df178c2 util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents: 6792
diff changeset
   616
	luaL_checkversion(L);
3762
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   617
#ifdef USE_STRINGPREP_ICU
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   618
	init_icu();
f02bac902a1e util.encodings: Support for ICU for IDNA operations.
Tobias Markmann <tm@ayena.de>
parents: 2923
diff changeset
   619
#endif
6414
6c8f6364bc48 util-src/*.c: Don't create globals when loaded
Kim Alvefur <zash@zash.se>
parents: 4302
diff changeset
   620
	lua_newtable(L);
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   621
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   622
	lua_newtable(L);
6792
6b180e77c97a util-src/*.c: Invert Lua 5.2 compat to be 5.2+ by default and a macro to support 5.1
Kim Alvefur <zash@zash.se>
parents: 6646
diff changeset
   623
	luaL_setfuncs(L, Reg_base64, 0);
6415
0e94f89d0e62 util-src/*.c: Use the more concise lua_setfield
Kim Alvefur <zash@zash.se>
parents: 6414
diff changeset
   624
	lua_setfield(L, -2, "base64");
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   625
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   626
	lua_newtable(L);
6792
6b180e77c97a util-src/*.c: Invert Lua 5.2 compat to be 5.2+ by default and a macro to support 5.1
Kim Alvefur <zash@zash.se>
parents: 6646
diff changeset
   627
	luaL_setfuncs(L, Reg_stringprep, 0);
6415
0e94f89d0e62 util-src/*.c: Use the more concise lua_setfield
Kim Alvefur <zash@zash.se>
parents: 6414
diff changeset
   628
	lua_setfield(L, -2, "stringprep");
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   629
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   630
	lua_newtable(L);
6792
6b180e77c97a util-src/*.c: Invert Lua 5.2 compat to be 5.2+ by default and a macro to support 5.1
Kim Alvefur <zash@zash.se>
parents: 6646
diff changeset
   631
	luaL_setfuncs(L, Reg_idna, 0);
6415
0e94f89d0e62 util-src/*.c: Use the more concise lua_setfield
Kim Alvefur <zash@zash.se>
parents: 6414
diff changeset
   632
	lua_setfield(L, -2, "idna");
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   633
6595
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   634
	lua_newtable(L);
6792
6b180e77c97a util-src/*.c: Invert Lua 5.2 compat to be 5.2+ by default and a macro to support 5.1
Kim Alvefur <zash@zash.se>
parents: 6646
diff changeset
   635
	luaL_setfuncs(L, Reg_utf8, 0);
6607
478308ee29dd Merge 0.9->0.10 again
Kim Alvefur <zash@zash.se>
parents: 6416 6595
diff changeset
   636
	lua_setfield(L, -2, "utf8");
6595
141afe8a167b util.encodings: Expose UTF-8 validation and length checking functions
Kim Alvefur <zash@zash.se>
parents: 6594
diff changeset
   637
9980
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   638
#ifdef USE_STRINGPREP_ICU
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   639
	lua_newtable(L);
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   640
	lua_pushcfunction(L, Lskeleton);
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   641
	lua_setfield(L, -2, "skeleton");
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   642
	lua_setfield(L, -2, "confusable");
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   643
#endif
0e2f663d0714 util.encodings: Add binding to confusables skeleton function in ICU
Kim Alvefur <zash@zash.se>
parents: 9977
diff changeset
   644
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   645
	lua_pushliteral(L, "-3.14");
6415
0e94f89d0e62 util-src/*.c: Use the more concise lua_setfield
Kim Alvefur <zash@zash.se>
parents: 6414
diff changeset
   646
	lua_setfield(L, -2, "version");
766
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   647
	return 1;
433a5226267f Licensing/version updates for some files (forgot to commit, doh...)
Matthew Wild <mwild1@gmail.com>
parents: 601
diff changeset
   648
}
12980
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12579
diff changeset
   649
LUALIB_API int luaopen_util_encodings(lua_State *L) {
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12579
diff changeset
   650
	return luaopen_prosody_util_encodings(L);
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12579
diff changeset
   651
}