summaryrefslogtreecommitdiff
path: root/source/luametatex/source/luarest/lmtbasexxlib.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/luametatex/source/luarest/lmtbasexxlib.c')
-rw-r--r--source/luametatex/source/luarest/lmtbasexxlib.c193
1 files changed, 193 insertions, 0 deletions
diff --git a/source/luametatex/source/luarest/lmtbasexxlib.c b/source/luametatex/source/luarest/lmtbasexxlib.c
new file mode 100644
index 000000000..fca7fcef8
--- /dev/null
+++ b/source/luametatex/source/luarest/lmtbasexxlib.c
@@ -0,0 +1,193 @@
+/*
+ See license.txt in the root of this project.
+*/
+
+# include "luametatex.h"
+
+/* # define BASEXX_PDF 1 */
+
+# include <utiliof.h>
+# include <utilbasexx.h>
+# include <utillzw.h>
+
+/*tex
+
+ First I had a mix of own code and LHF code (base64 and base85) but in the end I decided to reuse
+ some of pplibs code. Performance is ok, although we can speed up the base16 coders. When needed,
+ we can have a few more bur normally pure \LUA\ is quite ok for our purpose.
+
+*/
+
+# define encode_nl(L) \
+ (lua_type(L, 2) == LUA_TNUMBER) ? (lmt_tointeger(L, 2)) : ( (lua_isboolean(L, 2)) ? 80 : 0 )
+
+# define lua_iof_push(L,out) \
+ lua_pushlstring(L,(const char *) out->buf, iof_size(out))
+
+static int basexxlib_encode_16(lua_State *L)
+{
+ size_t l;
+ const unsigned char *s = (const unsigned char*) luaL_checklstring(L, 1, &l);
+ size_t n = 2 * l;
+ size_t nl = encode_nl(L);
+ iof *inp = iof_filter_string_reader(s, l);
+ iof *out = iof_filter_buffer_writer(n);
+ if (nl) {
+ base16_encode_ln(inp, out, 0, nl);
+ } else {
+ base16_encode(inp, out);
+ }
+ lua_iof_push(L, out);
+ iof_close(out);
+ return 1;
+}
+
+static int basexxlib_decode_16(lua_State *L)
+{
+ size_t l;
+ const unsigned char *s = (const unsigned char*) luaL_checklstring(L, 1, &l);
+ size_t n = l / 2;
+ iof *inp = iof_filter_string_reader(s, l);
+ iof *out = iof_filter_buffer_writer(n);
+ base16_decode(inp, out);
+ lua_iof_push(L, out);
+ iof_close(out);
+ return 1;
+}
+
+static int basexxlib_encode_64(lua_State *L)
+{
+ size_t l;
+ const unsigned char *s = (const unsigned char*) luaL_checklstring(L,1,&l);
+ size_t n = 4 * l;
+ size_t nl = encode_nl(L);
+ iof *inp = iof_filter_string_reader(s,l);
+ iof *out = iof_filter_buffer_writer(n);
+ if (nl) {
+ base64_encode_ln(inp,out,0,nl);
+ } else {
+ base64_encode(inp,out);
+ }
+ lua_iof_push(L,out);
+ iof_close(out);
+ return 1;
+}
+
+static int basexxlib_decode_64(lua_State *L)
+{
+ size_t l;
+ const unsigned char *s = (const unsigned char*) luaL_checklstring(L, 1, &l);
+ size_t n = l;
+ iof *inp = iof_filter_string_reader(s, l);
+ iof *out = iof_filter_buffer_writer(n);
+ base64_decode(inp, out);
+ lua_iof_push(L, out);
+ iof_close(out);
+ return 1;
+}
+
+static int basexxlib_encode_85(lua_State *L)
+{
+ size_t l;
+ const unsigned char *s = (const unsigned char*) luaL_checklstring(L, 1, &l);
+ size_t n = 5 * l;
+ size_t nl = encode_nl(L);
+ iof *inp = iof_filter_string_reader(s, l);
+ iof *out = iof_filter_buffer_writer(n);
+ if (nl) {
+ base85_encode_ln(inp, out, 0, 80);
+ } else {
+ base85_encode(inp, out);
+ }
+ lua_iof_push(L,out);
+ iof_close(out);
+ return 1;
+}
+
+static int basexxlib_decode_85(lua_State *L)
+{
+ size_t l;
+ const unsigned char *s = (const unsigned char*) luaL_checklstring(L, 1, &l);
+ size_t n = l;
+ iof *inp = iof_filter_string_reader(s, l);
+ iof *out = iof_filter_buffer_writer(n);
+ base85_decode(inp, out);
+ lua_iof_push(L, out);
+ iof_close(out);
+ return 1;
+}
+
+static int basexxlib_encode_RL(lua_State *L)
+{
+ size_t l;
+ const unsigned char *s = (const unsigned char*) luaL_checklstring(L, 1, &l);
+ size_t n = 2 * l;
+ iof *inp = iof_filter_string_reader(s, l);
+ iof *out = iof_filter_buffer_writer(n);
+ runlength_encode(inp, out);
+ lua_iof_push(L, out);
+ iof_close(out);
+ return 1;
+}
+
+static int basexxlib_decode_RL(lua_State *L)
+{
+ size_t l;
+ const unsigned char *s = (const unsigned char*) luaL_checklstring(L, 1, &l);
+ size_t n = 2 * l;
+ iof *inp = iof_filter_string_reader(s, l);
+ iof *out = iof_filter_buffer_writer(n);
+ runlength_decode(inp, out);
+ lua_iof_push(L, out);
+ iof_close(out);
+ return 1;
+}
+
+static int basexxlib_encode_LZW(lua_State *L)
+{
+ size_t l;
+ const unsigned char *s = (const unsigned char*) luaL_checklstring(L, 1, &l);
+ size_t n = 2 * l;
+ char *t = lmt_memory_malloc(n);
+ int flags = lmt_optinteger(L, 2, LZW_ENCODER_DEFAULTS);
+ iof *inp = iof_filter_string_reader(s, l);
+ iof *out = iof_filter_string_writer(t, n);
+ lzw_encode(inp, out, flags);
+ lua_pushlstring(L, t, iof_size(out));
+ lmt_memory_free(t);
+ return 1;
+}
+
+static int basexxlib_decode_LZW(lua_State *L)
+{
+ size_t l;
+ const unsigned char *s = (const unsigned char*) luaL_checklstring(L, 1, &l);
+ size_t n = 2 * l;
+ iof *inp = iof_filter_string_reader(s, l);
+ iof *out = iof_filter_buffer_writer(n);
+ int flags = lmt_optinteger(L, 2, LZW_DECODER_DEFAULTS);
+ lzw_decode(inp, out, flags);
+ lua_iof_push(L, out);
+ iof_close(out);
+ return 1;
+}
+
+static struct luaL_Reg basexxlib_function_list[] = {
+ { "encode16", basexxlib_encode_16 },
+ { "decode16", basexxlib_decode_16 },
+ { "encode64", basexxlib_encode_64 },
+ { "decode64", basexxlib_decode_64 },
+ { "encode85", basexxlib_encode_85 },
+ { "decode85", basexxlib_decode_85 },
+ { "encodeRL", basexxlib_encode_RL },
+ { "decodeRL", basexxlib_decode_RL },
+ { "encodeLZW", basexxlib_encode_LZW },
+ { "decodeLZW", basexxlib_decode_LZW },
+ { NULL, NULL },
+};
+
+int luaopen_basexx(lua_State *L) {
+ lua_newtable(L);
+ luaL_setfuncs(L, basexxlib_function_list, 0);
+ return 1;
+}