diff options
Diffstat (limited to '3rdparty/lua/src/modules/lua-winreg/src/lua_tstring.c')
-rw-r--r-- | 3rdparty/lua/src/modules/lua-winreg/src/lua_tstring.c | 748 |
1 files changed, 374 insertions, 374 deletions
diff --git a/3rdparty/lua/src/modules/lua-winreg/src/lua_tstring.c b/3rdparty/lua/src/modules/lua-winreg/src/lua_tstring.c index 5a96413..8a24cfe 100644 --- a/3rdparty/lua/src/modules/lua-winreg/src/lua_tstring.c +++ b/3rdparty/lua/src/modules/lua-winreg/src/lua_tstring.c @@ -1,375 +1,375 @@ -#include <limits.h> -#include <string.h> -#include <lua.h> -#include <lualib.h> -#include <lauxlib.h> - -#include "luamacro.h" - -size_t lua_utf8towcsZ(lua_State *L, const char *s, int len){ - wchar_t UNCH = 0; - size_t cchWC = 0; // # of wchar_t code points generated - const unsigned char * pUTF8 = (const unsigned char *)s; - const unsigned char * pEnd = (const unsigned char *)(s + len); - luaL_Buffer b; - luaL_buffinit(L, &b); - while (pUTF8 < pEnd){ - // See if there are any trail bytes. - if (*pUTF8 < 0xC0) {// 192 - // Found ASCII. - UNCH = pUTF8[0]; - }else if (pUTF8[0] < 0xE0){ //224 - if ((pUTF8[1] & 0xC0) == 0x80) { - /* A two-byte-character lead-byte not followed by trail-byte represents itself.*/ - UNCH = (wchar_t) (((pUTF8[0] & 0x1F) << 6) | (pUTF8[1] & 0x3F)); - pUTF8 += 1; - }else{ - /* A two-byte-character lead-byte not followed by trail-byte represents itself. */ - UNCH = pUTF8[0]; - } - }else if (pUTF8[0] < 0xF0) {//240 - if (((pUTF8[1] & 0xC0) == 0x80) && ((pUTF8[2] & 0xC0) == 0x80)) { - /* Three-byte-character lead byte followed by two trail bytes.*/ - UNCH = (wchar_t) (((pUTF8[0] & 0x0F) << 12) | ((pUTF8[1] & 0x3F) << 6) | (pUTF8[2] & 0x3F)); - pUTF8 += 2; - }else{ - /* Three-byte-character lead byte followed by two trail bytes.*/ - UNCH = pUTF8[0]; - } - }else{ - UNCH = pUTF8[0]; - } - luaL_addlstring(&b, (const char*)&UNCH, sizeof(wchar_t)); - cchWC++; - pUTF8++; - } - luaL_addchar(&b, '\0');// the other '\0' will be added by lua - luaL_pushresult(&b); - // Return the number of wchar_t characters written. - return (cchWC); -} - -size_t lua_utf8towcs(lua_State *L, const char *s, int len){ - wchar_t UNCH = 0; - size_t cchWC = 0; // # of wchar_t code points generated - const unsigned char * pUTF8 = (const unsigned char *)s; - const unsigned char * pEnd = (const unsigned char *)(s + len); - luaL_Buffer b; - luaL_buffinit(L, &b); - while (pUTF8 < pEnd){ - // See if there are any trail bytes. - if (*pUTF8 < 0xC0) {// 192 - // Found ASCII. - UNCH = pUTF8[0]; - }else if (pUTF8[0] < 0xE0){ //224 - if ((pUTF8[1] & 0xC0) == 0x80) { - /* A two-byte-character lead-byte not followed by trail-byte represents itself.*/ - UNCH = (wchar_t) (((pUTF8[0] & 0x1F) << 6) | (pUTF8[1] & 0x3F)); - pUTF8 += 1; - }else{ - /* A two-byte-character lead-byte not followed by trail-byte represents itself. */ - UNCH = pUTF8[0]; - } - }else if (pUTF8[0] < 0xF0) {//240 - if (((pUTF8[1] & 0xC0) == 0x80) && ((pUTF8[2] & 0xC0) == 0x80)) { - /* Three-byte-character lead byte followed by two trail bytes.*/ - UNCH = (wchar_t) (((pUTF8[0] & 0x0F) << 12) | ((pUTF8[1] & 0x3F) << 6) | (pUTF8[2] & 0x3F)); - pUTF8 += 2; - }else{ - /* Three-byte-character lead byte followed by two trail bytes.*/ - UNCH = pUTF8[0]; - } - }else{ - UNCH = pUTF8[0]; - } - luaL_addlstring(&b, (const char*)&UNCH, sizeof(wchar_t)); - cchWC++; - pUTF8++; - } - luaL_pushresult(&b); - // Return the number of wchar_t characters written. - return (cchWC); -} - -// Constant Declarations. -#define ASCII 0x007f -#define UTF8_2_MAX 0x07ff // max UTF8 2-byte sequence (32 * 64 = 2048) -#define UTF8_1ST_OF_2 0xc0 // 110x xxxx -#define UTF8_1ST_OF_3 0xe0 // 1110 xxxx -#define UTF8_TRAIL 0x80 // 10xx xxxx -#define HIGER_6_BIT(u) ((u) >> 12) -#define MIDDLE_6_BIT(u) (((u) & 0x0fc0) >> 6) -#define LOWER_6_BIT(u) ((u) & 0x003f) - -#ifndef HIBYTE -#define BYTE unsigned char -#define HIBYTE(w) ((BYTE) (((wchar_t) (w) >> 8) & 0xFF)) -#define LOBYTE(w) ((BYTE) (w)) -#endif - -// Maps a wchar_t character string to its UTF-8 string counterpart. -size_t lua_wcstoutf8(lua_State *L, const wchar_t *s, size_t cchSrc){ - const wchar_t * lpWC = s; - size_t cchU8 = 0; // # of UTF8 chars generated - - luaL_Buffer b; - luaL_buffinit(L, &b); - - while (cchSrc--) { - if (*lpWC <= ASCII){ - // Found ASCII. - luaL_addchar(&b, (char)*lpWC); - cchU8++; - }else if (*lpWC <= UTF8_2_MAX){ - // Found 2 byte sequence if < 0x07ff (11 bits). - // Use upper 5 bits in first byte. - // Use lower 6 bits in second byte. - luaL_addchar(&b, (char)(UTF8_1ST_OF_2 | (*lpWC >> 6))); - luaL_addchar(&b, (char)(UTF8_TRAIL | LOWER_6_BIT(*lpWC))); - cchU8 += 2; - }else{ - // Found 3 byte sequence. - // Use upper 4 bits in first byte. - // Use middle 6 bits in second byte. - // Use lower 6 bits in third byte. - luaL_addchar(&b, (char)(UTF8_1ST_OF_3 | (*lpWC >> 12))); - luaL_addchar(&b, (char)(UTF8_TRAIL | MIDDLE_6_BIT(*lpWC))); - luaL_addchar(&b, (char)(UTF8_TRAIL | LOWER_6_BIT(*lpWC))); - cchU8 += 3; - } - lpWC++; - } - luaL_pushresult(&b); - // Return the number of UTF-8 characters written. - return (cchU8); -} - -size_t lua_chartowcsZ(lua_State *L, const char *s, int len){ - luaL_Buffer b; - size_t cchWC = 0; - wchar_t UNCH = 0; - const unsigned char * pCur = (const unsigned char *)s; - const unsigned char * pEnd = (const unsigned char *)(s + len); - luaL_buffinit(L, &b); - while (pCur < pEnd){ - UNCH = pCur[0]; - luaL_addlstring(&b, (const char*)&UNCH, sizeof(wchar_t)); - cchWC++; - pCur++; - } - luaL_addchar(&b, '\0');// the other '\0' will be added by lua - luaL_pushresult(&b); - // Return the number of wchar_t characters written. - return (cchWC); -} -int wc2utf8(char *d, wchar_t ch){ - if (ch < 0x80) { - *d++ = (char)ch; - return 1; - } - if (ch < 0x800) { - *d++ = (char)(( ch >> 6) | 0xc0); - *d++ = (char)(( ch & 0x3f) | 0x80); - return 2; - } - { - *d++ = (char)(( ch >> 12) | 0xe0); - *d++ = (char)(((ch >> 6) & 0x3f) | 0x80); - *d++ = (char)(( ch & 0x3f) | 0x80); - return 3; - } -} -// push a wchar_t character value convert equiv utf8 chars -void lua_pushutf8_from_wchar(lua_State *L, wchar_t ch){ - char buf[4] = {0,0,0,0}; - lua_pushlstring(L, buf, wc2utf8(buf, ch)); -} -// add a wchar_t character to buffer converted to equiv utf8 chars -void lua_addutf8_from_wchar(luaL_Buffer * pB, wchar_t ch){ - luaL_addsize(pB, wc2utf8(luaL_prepbuffer (pB), ch)); -} -// gets an int character value, if string is >= 2 chars checks if utf -wchar_t lua_checkwchar_from_utf8(lua_State *L, int i){ - const unsigned char* psz = (const unsigned char *)luaL_checkstring(L, i); - if ((psz[0] && psz[1] == 0) || psz[0] == 0) { - return psz[0];// single character - }else if ((psz[0] >= 0xC0) && (psz[0] < 0xE0) - && (psz[1] & 0xC0) == 0x80 - && (psz[2] == 0)// Two-byte-character lead-byte followed by a trail-byte. - ){ return (wchar_t)(((psz[0] & 0x1F) << 6) | (psz[1] & 0x3F)); - }else if ((psz[0] >= 0xE0) && (psz[0] < 0xF0) - && ((psz[1] & 0xC0) == 0x80) - && ((psz[2] & 0xC0) == 0x80) - && (psz[3] == 0)// Three-utf-character lead utf followed by two trail bytes. - ){ return (wchar_t)(((psz[0] & 0x0F) << 12) | ((psz[1] & 0x3F) << 6) | (psz[2] & 0x3F)); - }else{ - luaL_argerror(L, i, "character expected"); - } - return 0; -} -// lua utf8 string to wide string -const wchar_t *lua_tolwcs_from_utf8(lua_State *L, int narg, size_t* l){ - size_t ulen = 0; - const char * psz; - narg = lua_absindex(L, narg); -#if LUA_VERSION_NUM >= 501 - psz = lua_tolstring(L, narg, &ulen); -#else - psz = lua_tostring(L, narg); - ulen = lua_strlen(L, narg); -#endif - if(psz){ - ulen = (size_t)lua_utf8towcsZ(L, psz, (int)ulen); - if(l)*l = ulen; - lua_replace (L, narg); - return (const wchar_t *)lua_tostring(L, narg); - }else{ - return NULL; - } -} -// lua utf8 string to wide string, with len -const wchar_t *lua_checklwcs_from_utf8(lua_State *L, int narg, size_t* l){ - size_t ulen = 0; - const char * psz; - narg = lua_absindex(L, narg); - psz = luaL_checklstring(L, narg, &ulen); - ulen = (size_t)lua_utf8towcsZ(L, psz, (int)ulen); - if(l)*l = ulen; - lua_replace (L, narg); - return (const wchar_t *)lua_tostring(L, narg); -} -// lua utf8 string to wide string, with len, optional -const wchar_t *lua_optlwcs_from_utf8(lua_State *L, int narg, const wchar_t *def, size_t *len){ - if (lua_isnoneornil(L, narg)) { - if (len) - *len = (def ? wcslen(def) : 0); - return def; - } - else return lua_checklwcs_from_utf8(L, narg, len); -} -// lua push wide string, convert to utf8 -void lua_pushutf8_from_wcs (lua_State *L, const wchar_t *s) { - if (s == NULL) - lua_pushnil(L); - else - lua_wcstoutf8(L, s, wcslen(s)); -} - - -size_t lua_cstowcsZ(lua_State *L, const char *s, int len){ - wchar_t UNCH = 0; - size_t cchWC = 0; // # of wchar_t code points generated - const unsigned char * pStr = (const unsigned char *)s; - const unsigned char * pEnd = (const unsigned char *)(s + len); - luaL_Buffer b; - luaL_buffinit(L, &b); - - while (pStr < pEnd){ - UNCH = *pStr; - luaL_addlstring(&b, (const char*)&UNCH, sizeof(wchar_t)); - cchWC++; - pStr++; - } - luaL_addchar(&b, '\0');// the other '\0' will be added by lua - luaL_pushresult(&b); - // Return the number of wchar_t characters written. - return (cchWC); -} -// Lua char string to wide string, with len -const wchar_t *lua_checklwcs_from_char(lua_State *L, int narg, size_t* l){ - size_t ulen = 0; - const char * psz; - narg = lua_absindex(L, narg); - psz = luaL_checklstring(L, narg, &ulen); - ulen = (size_t)lua_cstowcsZ(L, psz, (int)ulen); - if(l)*l = ulen; - lua_replace (L, narg); - return (const wchar_t *)lua_tostring(L, narg); -} -// Lua char string to wide string, with len, optional -const wchar_t *lua_optlwcs_from_char (lua_State *L, int narg, const wchar_t *def, size_t *len){ - if (lua_isnoneornil(L, narg)) { - if (len) - *len = (def ? wcslen(def) : 0); - return def; - } - else return lua_checklwcs_from_char(L, narg, len); -} -// Maps a wchar_t character string to its char string counterpart. -size_t lua_wcstochar(lua_State *L, const wchar_t *s, size_t cchSrc){ - const wchar_t * lpWC = s; - size_t cch = 0; // # of UTF8 chars generated - - luaL_Buffer b; - luaL_buffinit(L, &b); - - while (cchSrc--) { - if (*lpWC <= 0x00ff){ - luaL_addchar(&b, (char)*lpWC); - }else{ - luaL_addchar(&b, '?');// no choice - } - cch++; - lpWC++; - } - luaL_pushresult(&b); - // Return the number of char characters written. - return (cch); -} - - - - - - - -/* -size_t lua_utf8towcsZ2(lua_State *L, const char *s, int len){ - size_t cchWC = 0; // # of wchar_t code points generated - const unsigned char * pUTF8 = (const unsigned char *)s; - const unsigned char * pEnd = (const unsigned char *)(s + len); - wchar_t * pBuf = NULL; - const wchar_t * pBuf0 = NULL; - const wchar_t * pBuf1 = NULL; - luaL_Buffer b; - luaL_buffinit(L, &b); - while (pUTF8 < pEnd){ - pBuf = (wchar_t *)luaL_prepbuffer(&b); - pBuf0 = pBuf; - pBuf1 = pBuf + (LUAL_BUFFERSIZE-sizeof(wchar_t)); - while(pUTF8 < pEnd && pBuf <= pBuf1){ - // See if there are any trail bytes. - if (*pUTF8 < 0xC0) {// 192 - // Found ASCII. - *pBuf++ = pUTF8[0]; - }else if (pUTF8[0] < 0xE0){ //224 - if ((pUTF8[1] & 0xC0) == 0x80) { - // A two-byte-character lead-byte not followed by trail-byte represents itself. - *pBuf++ = (wchar_t) (((pUTF8[0] & 0x1F) << 6) | (pUTF8[1] & 0x3F)); - pUTF8 += 1; - }else{ - // A two-byte-character lead-byte not followed by trail-byte represents itself. - *pBuf++ = pUTF8[0]; - } - }else if (pUTF8[0] < 0xF0) {//240 - if (((pUTF8[1] & 0xC0) == 0x80) && ((pUTF8[2] & 0xC0) == 0x80)) { - // Three-byte-character lead byte followed by two trail bytes. - *pBuf++ = (wchar_t) (((pUTF8[0] & 0x0F) << 12) | ((pUTF8[1] & 0x3F) << 6) | (pUTF8[2] & 0x3F)); - pUTF8 += 2; - }else{ - // Three-byte-character lead byte followed by two trail bytes. - *pBuf++ = pUTF8[0]; - } - }else{ - *pBuf++ = pUTF8[0]; - } - cchWC++; - pUTF8++; - } - luaL_addsize(&b, (size_t)(pBuf0 - pBuf)); - } - luaL_addchar(&b, '\0');// the other '\0' will be added by lua - luaL_pushresult(&b); - // Return the number of wchar_t characters written. - return (cchWC); +#include <limits.h>
+#include <string.h>
+#include <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+
+#include "luamacro.h"
+
+size_t lua_utf8towcsZ(lua_State *L, const char *s, int len){
+ wchar_t UNCH = 0;
+ size_t cchWC = 0; // # of wchar_t code points generated
+ const unsigned char * pUTF8 = (const unsigned char *)s;
+ const unsigned char * pEnd = (const unsigned char *)(s + len);
+ luaL_Buffer b;
+ luaL_buffinit(L, &b);
+ while (pUTF8 < pEnd){
+ // See if there are any trail bytes.
+ if (*pUTF8 < 0xC0) {// 192
+ // Found ASCII.
+ UNCH = pUTF8[0];
+ }else if (pUTF8[0] < 0xE0){ //224
+ if ((pUTF8[1] & 0xC0) == 0x80) {
+ /* A two-byte-character lead-byte not followed by trail-byte represents itself.*/
+ UNCH = (wchar_t) (((pUTF8[0] & 0x1F) << 6) | (pUTF8[1] & 0x3F));
+ pUTF8 += 1;
+ }else{
+ /* A two-byte-character lead-byte not followed by trail-byte represents itself. */
+ UNCH = pUTF8[0];
+ }
+ }else if (pUTF8[0] < 0xF0) {//240
+ if (((pUTF8[1] & 0xC0) == 0x80) && ((pUTF8[2] & 0xC0) == 0x80)) {
+ /* Three-byte-character lead byte followed by two trail bytes.*/
+ UNCH = (wchar_t) (((pUTF8[0] & 0x0F) << 12) | ((pUTF8[1] & 0x3F) << 6) | (pUTF8[2] & 0x3F));
+ pUTF8 += 2;
+ }else{
+ /* Three-byte-character lead byte followed by two trail bytes.*/
+ UNCH = pUTF8[0];
+ }
+ }else{
+ UNCH = pUTF8[0];
+ }
+ luaL_addlstring(&b, (const char*)&UNCH, sizeof(wchar_t));
+ cchWC++;
+ pUTF8++;
+ }
+ luaL_addchar(&b, '\0');// the other '\0' will be added by lua
+ luaL_pushresult(&b);
+ // Return the number of wchar_t characters written.
+ return (cchWC);
+}
+
+size_t lua_utf8towcs(lua_State *L, const char *s, int len){
+ wchar_t UNCH = 0;
+ size_t cchWC = 0; // # of wchar_t code points generated
+ const unsigned char * pUTF8 = (const unsigned char *)s;
+ const unsigned char * pEnd = (const unsigned char *)(s + len);
+ luaL_Buffer b;
+ luaL_buffinit(L, &b);
+ while (pUTF8 < pEnd){
+ // See if there are any trail bytes.
+ if (*pUTF8 < 0xC0) {// 192
+ // Found ASCII.
+ UNCH = pUTF8[0];
+ }else if (pUTF8[0] < 0xE0){ //224
+ if ((pUTF8[1] & 0xC0) == 0x80) {
+ /* A two-byte-character lead-byte not followed by trail-byte represents itself.*/
+ UNCH = (wchar_t) (((pUTF8[0] & 0x1F) << 6) | (pUTF8[1] & 0x3F));
+ pUTF8 += 1;
+ }else{
+ /* A two-byte-character lead-byte not followed by trail-byte represents itself. */
+ UNCH = pUTF8[0];
+ }
+ }else if (pUTF8[0] < 0xF0) {//240
+ if (((pUTF8[1] & 0xC0) == 0x80) && ((pUTF8[2] & 0xC0) == 0x80)) {
+ /* Three-byte-character lead byte followed by two trail bytes.*/
+ UNCH = (wchar_t) (((pUTF8[0] & 0x0F) << 12) | ((pUTF8[1] & 0x3F) << 6) | (pUTF8[2] & 0x3F));
+ pUTF8 += 2;
+ }else{
+ /* Three-byte-character lead byte followed by two trail bytes.*/
+ UNCH = pUTF8[0];
+ }
+ }else{
+ UNCH = pUTF8[0];
+ }
+ luaL_addlstring(&b, (const char*)&UNCH, sizeof(wchar_t));
+ cchWC++;
+ pUTF8++;
+ }
+ luaL_pushresult(&b);
+ // Return the number of wchar_t characters written.
+ return (cchWC);
+}
+
+// Constant Declarations.
+#define ASCII 0x007f
+#define UTF8_2_MAX 0x07ff // max UTF8 2-byte sequence (32 * 64 = 2048)
+#define UTF8_1ST_OF_2 0xc0 // 110x xxxx
+#define UTF8_1ST_OF_3 0xe0 // 1110 xxxx
+#define UTF8_TRAIL 0x80 // 10xx xxxx
+#define HIGER_6_BIT(u) ((u) >> 12)
+#define MIDDLE_6_BIT(u) (((u) & 0x0fc0) >> 6)
+#define LOWER_6_BIT(u) ((u) & 0x003f)
+
+#ifndef HIBYTE
+#define BYTE unsigned char
+#define HIBYTE(w) ((BYTE) (((wchar_t) (w) >> 8) & 0xFF))
+#define LOBYTE(w) ((BYTE) (w))
+#endif
+
+// Maps a wchar_t character string to its UTF-8 string counterpart.
+size_t lua_wcstoutf8(lua_State *L, const wchar_t *s, size_t cchSrc){
+ const wchar_t * lpWC = s;
+ size_t cchU8 = 0; // # of UTF8 chars generated
+
+ luaL_Buffer b;
+ luaL_buffinit(L, &b);
+
+ while (cchSrc--) {
+ if (*lpWC <= ASCII){
+ // Found ASCII.
+ luaL_addchar(&b, (char)*lpWC);
+ cchU8++;
+ }else if (*lpWC <= UTF8_2_MAX){
+ // Found 2 byte sequence if < 0x07ff (11 bits).
+ // Use upper 5 bits in first byte.
+ // Use lower 6 bits in second byte.
+ luaL_addchar(&b, (char)(UTF8_1ST_OF_2 | (*lpWC >> 6)));
+ luaL_addchar(&b, (char)(UTF8_TRAIL | LOWER_6_BIT(*lpWC)));
+ cchU8 += 2;
+ }else{
+ // Found 3 byte sequence.
+ // Use upper 4 bits in first byte.
+ // Use middle 6 bits in second byte.
+ // Use lower 6 bits in third byte.
+ luaL_addchar(&b, (char)(UTF8_1ST_OF_3 | (*lpWC >> 12)));
+ luaL_addchar(&b, (char)(UTF8_TRAIL | MIDDLE_6_BIT(*lpWC)));
+ luaL_addchar(&b, (char)(UTF8_TRAIL | LOWER_6_BIT(*lpWC)));
+ cchU8 += 3;
+ }
+ lpWC++;
+ }
+ luaL_pushresult(&b);
+ // Return the number of UTF-8 characters written.
+ return (cchU8);
+}
+
+size_t lua_chartowcsZ(lua_State *L, const char *s, int len){
+ luaL_Buffer b;
+ size_t cchWC = 0;
+ wchar_t UNCH = 0;
+ const unsigned char * pCur = (const unsigned char *)s;
+ const unsigned char * pEnd = (const unsigned char *)(s + len);
+ luaL_buffinit(L, &b);
+ while (pCur < pEnd){
+ UNCH = pCur[0];
+ luaL_addlstring(&b, (const char*)&UNCH, sizeof(wchar_t));
+ cchWC++;
+ pCur++;
+ }
+ luaL_addchar(&b, '\0');// the other '\0' will be added by lua
+ luaL_pushresult(&b);
+ // Return the number of wchar_t characters written.
+ return (cchWC);
+}
+int wc2utf8(char *d, wchar_t ch){
+ if (ch < 0x80) {
+ *d++ = (char)ch;
+ return 1;
+ }
+ if (ch < 0x800) {
+ *d++ = (char)(( ch >> 6) | 0xc0);
+ *d++ = (char)(( ch & 0x3f) | 0x80);
+ return 2;
+ }
+ {
+ *d++ = (char)(( ch >> 12) | 0xe0);
+ *d++ = (char)(((ch >> 6) & 0x3f) | 0x80);
+ *d++ = (char)(( ch & 0x3f) | 0x80);
+ return 3;
+ }
+}
+// push a wchar_t character value convert equiv utf8 chars
+void lua_pushutf8_from_wchar(lua_State *L, wchar_t ch){
+ char buf[4] = {0,0,0,0};
+ lua_pushlstring(L, buf, wc2utf8(buf, ch));
+}
+// add a wchar_t character to buffer converted to equiv utf8 chars
+void lua_addutf8_from_wchar(luaL_Buffer * pB, wchar_t ch){
+ luaL_addsize(pB, wc2utf8(luaL_prepbuffer (pB), ch));
+}
+// gets an int character value, if string is >= 2 chars checks if utf
+wchar_t lua_checkwchar_from_utf8(lua_State *L, int i){
+ const unsigned char* psz = (const unsigned char *)luaL_checkstring(L, i);
+ if ((psz[0] && psz[1] == 0) || psz[0] == 0) {
+ return psz[0];// single character
+ }else if ((psz[0] >= 0xC0) && (psz[0] < 0xE0)
+ && (psz[1] & 0xC0) == 0x80
+ && (psz[2] == 0)// Two-byte-character lead-byte followed by a trail-byte.
+ ){ return (wchar_t)(((psz[0] & 0x1F) << 6) | (psz[1] & 0x3F));
+ }else if ((psz[0] >= 0xE0) && (psz[0] < 0xF0)
+ && ((psz[1] & 0xC0) == 0x80)
+ && ((psz[2] & 0xC0) == 0x80)
+ && (psz[3] == 0)// Three-utf-character lead utf followed by two trail bytes.
+ ){ return (wchar_t)(((psz[0] & 0x0F) << 12) | ((psz[1] & 0x3F) << 6) | (psz[2] & 0x3F));
+ }else{
+ luaL_argerror(L, i, "character expected");
+ }
+ return 0;
+}
+// lua utf8 string to wide string
+const wchar_t *lua_tolwcs_from_utf8(lua_State *L, int narg, size_t* l){
+ size_t ulen = 0;
+ const char * psz;
+ narg = lua_absindex(L, narg);
+#if LUA_VERSION_NUM >= 501
+ psz = lua_tolstring(L, narg, &ulen);
+#else
+ psz = lua_tostring(L, narg);
+ ulen = lua_strlen(L, narg);
+#endif
+ if(psz){
+ ulen = (size_t)lua_utf8towcsZ(L, psz, (int)ulen);
+ if(l)*l = ulen;
+ lua_replace (L, narg);
+ return (const wchar_t *)lua_tostring(L, narg);
+ }else{
+ return NULL;
+ }
+}
+// lua utf8 string to wide string, with len
+const wchar_t *lua_checklwcs_from_utf8(lua_State *L, int narg, size_t* l){
+ size_t ulen = 0;
+ const char * psz;
+ narg = lua_absindex(L, narg);
+ psz = luaL_checklstring(L, narg, &ulen);
+ ulen = (size_t)lua_utf8towcsZ(L, psz, (int)ulen);
+ if(l)*l = ulen;
+ lua_replace (L, narg);
+ return (const wchar_t *)lua_tostring(L, narg);
+}
+// lua utf8 string to wide string, with len, optional
+const wchar_t *lua_optlwcs_from_utf8(lua_State *L, int narg, const wchar_t *def, size_t *len){
+ if (lua_isnoneornil(L, narg)) {
+ if (len)
+ *len = (def ? wcslen(def) : 0);
+ return def;
+ }
+ else return lua_checklwcs_from_utf8(L, narg, len);
+}
+// lua push wide string, convert to utf8
+void lua_pushutf8_from_wcs (lua_State *L, const wchar_t *s) {
+ if (s == NULL)
+ lua_pushnil(L);
+ else
+ lua_wcstoutf8(L, s, wcslen(s));
+}
+
+
+size_t lua_cstowcsZ(lua_State *L, const char *s, int len){
+ wchar_t UNCH = 0;
+ size_t cchWC = 0; // # of wchar_t code points generated
+ const unsigned char * pStr = (const unsigned char *)s;
+ const unsigned char * pEnd = (const unsigned char *)(s + len);
+ luaL_Buffer b;
+ luaL_buffinit(L, &b);
+
+ while (pStr < pEnd){
+ UNCH = *pStr;
+ luaL_addlstring(&b, (const char*)&UNCH, sizeof(wchar_t));
+ cchWC++;
+ pStr++;
+ }
+ luaL_addchar(&b, '\0');// the other '\0' will be added by lua
+ luaL_pushresult(&b);
+ // Return the number of wchar_t characters written.
+ return (cchWC);
+}
+// Lua char string to wide string, with len
+const wchar_t *lua_checklwcs_from_char(lua_State *L, int narg, size_t* l){
+ size_t ulen = 0;
+ const char * psz;
+ narg = lua_absindex(L, narg);
+ psz = luaL_checklstring(L, narg, &ulen);
+ ulen = (size_t)lua_cstowcsZ(L, psz, (int)ulen);
+ if(l)*l = ulen;
+ lua_replace (L, narg);
+ return (const wchar_t *)lua_tostring(L, narg);
+}
+// Lua char string to wide string, with len, optional
+const wchar_t *lua_optlwcs_from_char (lua_State *L, int narg, const wchar_t *def, size_t *len){
+ if (lua_isnoneornil(L, narg)) {
+ if (len)
+ *len = (def ? wcslen(def) : 0);
+ return def;
+ }
+ else return lua_checklwcs_from_char(L, narg, len);
+}
+// Maps a wchar_t character string to its char string counterpart.
+size_t lua_wcstochar(lua_State *L, const wchar_t *s, size_t cchSrc){
+ const wchar_t * lpWC = s;
+ size_t cch = 0; // # of UTF8 chars generated
+
+ luaL_Buffer b;
+ luaL_buffinit(L, &b);
+
+ while (cchSrc--) {
+ if (*lpWC <= 0x00ff){
+ luaL_addchar(&b, (char)*lpWC);
+ }else{
+ luaL_addchar(&b, '?');// no choice
+ }
+ cch++;
+ lpWC++;
+ }
+ luaL_pushresult(&b);
+ // Return the number of char characters written.
+ return (cch);
+}
+
+
+
+
+
+
+
+/*
+size_t lua_utf8towcsZ2(lua_State *L, const char *s, int len){
+ size_t cchWC = 0; // # of wchar_t code points generated
+ const unsigned char * pUTF8 = (const unsigned char *)s;
+ const unsigned char * pEnd = (const unsigned char *)(s + len);
+ wchar_t * pBuf = NULL;
+ const wchar_t * pBuf0 = NULL;
+ const wchar_t * pBuf1 = NULL;
+ luaL_Buffer b;
+ luaL_buffinit(L, &b);
+ while (pUTF8 < pEnd){
+ pBuf = (wchar_t *)luaL_prepbuffer(&b);
+ pBuf0 = pBuf;
+ pBuf1 = pBuf + (LUAL_BUFFERSIZE-sizeof(wchar_t));
+ while(pUTF8 < pEnd && pBuf <= pBuf1){
+ // See if there are any trail bytes.
+ if (*pUTF8 < 0xC0) {// 192
+ // Found ASCII.
+ *pBuf++ = pUTF8[0];
+ }else if (pUTF8[0] < 0xE0){ //224
+ if ((pUTF8[1] & 0xC0) == 0x80) {
+ // A two-byte-character lead-byte not followed by trail-byte represents itself.
+ *pBuf++ = (wchar_t) (((pUTF8[0] & 0x1F) << 6) | (pUTF8[1] & 0x3F));
+ pUTF8 += 1;
+ }else{
+ // A two-byte-character lead-byte not followed by trail-byte represents itself.
+ *pBuf++ = pUTF8[0];
+ }
+ }else if (pUTF8[0] < 0xF0) {//240
+ if (((pUTF8[1] & 0xC0) == 0x80) && ((pUTF8[2] & 0xC0) == 0x80)) {
+ // Three-byte-character lead byte followed by two trail bytes.
+ *pBuf++ = (wchar_t) (((pUTF8[0] & 0x0F) << 12) | ((pUTF8[1] & 0x3F) << 6) | (pUTF8[2] & 0x3F));
+ pUTF8 += 2;
+ }else{
+ // Three-byte-character lead byte followed by two trail bytes.
+ *pBuf++ = pUTF8[0];
+ }
+ }else{
+ *pBuf++ = pUTF8[0];
+ }
+ cchWC++;
+ pUTF8++;
+ }
+ luaL_addsize(&b, (size_t)(pBuf0 - pBuf));
+ }
+ luaL_addchar(&b, '\0');// the other '\0' will be added by lua
+ luaL_pushresult(&b);
+ // Return the number of wchar_t characters written.
+ return (cchWC);
}//*/
\ No newline at end of file |