diff options
Diffstat (limited to 'src/lutf8lib.js')
| -rw-r--r-- | src/lutf8lib.js | 28 | 
1 files changed, 27 insertions, 1 deletions
diff --git a/src/lutf8lib.js b/src/lutf8lib.js index f2c7f6b..6ebbec8 100644 --- a/src/lutf8lib.js +++ b/src/lutf8lib.js @@ -50,6 +50,31 @@ const utf8_decode = function(s, val) {      };  }; +const pushutfchar = function(L, arg) { +    let code = lauxlib.luaL_checkinteger(L, arg); +    lauxlib.luaL_argcheck(L, 0 <= code && code <= MAXUNICODE, arg, "value out of range"); +    lapi.lua_pushstring(L, `${String.fromCharCode(code)}`); +}; + +/* +** utfchar(n1, n2, ...)  -> char(n1)..char(n2)... +*/ +const utfchar = function(L) { +    let n = lapi.lua_gettop(L);  /* number of arguments */ +    if (n === 1)  /* optimize common case of single char */ +        pushutfchar(L, 1); +    else { +        let b = new lauxlib.luaL_Buffer(); +        lauxlib.luaL_buffinit(L, b); +        for (let i = 1; i <= n; i++) { +            pushutfchar(L, i); +            lauxlib.luaL_addvalue(b); +        } +        lauxlib.luaL_pushresult(b); +    } +    return 1; +}; +  /*  ** offset(s, n, [i])  -> index where n-th character counting from  **   position 'i' starts; 0 means character at 'i'. @@ -128,8 +153,9 @@ const codepoint = function(L) {  };  const funcs = { +    "char":      utfchar,      "codepoint": codepoint, -    "offset":    byteoffset +    "offset":    byteoffset,  };  /* pattern to match a single UTF-8 character */  | 
