summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/lua/llanglib.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/lua/llanglib.c')
-rw-r--r--Build/source/texk/web2c/luatexdir/lua/llanglib.c219
1 files changed, 219 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/lua/llanglib.c b/Build/source/texk/web2c/luatexdir/lua/llanglib.c
new file mode 100644
index 00000000000..63e8c45dec8
--- /dev/null
+++ b/Build/source/texk/web2c/luatexdir/lua/llanglib.c
@@ -0,0 +1,219 @@
+/*
+Copyright (c) 2007 Taco Hoekwater <taco@latex.org>
+
+This file is part of luatex.
+
+luatex is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+luatex is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with luatex; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+This is llanglib.c
+*/
+
+#include "luatex-api.h"
+#include <ptexlib.h>
+
+#include "nodes.h"
+
+#define LANG_METATABLE "luatex.lang"
+
+#define check_islang(L,b) (struct tex_language **)luaL_checkudata(L,b,LANG_METATABLE)
+
+static int
+lang_new (lua_State *L) {
+ struct tex_language **lang;
+ if (lua_gettop(L)==0) {
+ lang = lua_newuserdata(L, sizeof(struct tex_language *));
+ *lang = new_language();
+ if (!*lang) {
+ lua_pushstring(L,"lang.new(): no room for a new language");
+ return lua_error(L);
+ }
+ } else {
+ lang = lua_newuserdata(L, sizeof(struct tex_language *));
+ *lang = get_language(lua_tonumber(L,1));
+ }
+ luaL_getmetatable(L,LANG_METATABLE);
+ lua_setmetatable(L,-2);
+ return 1;
+}
+
+static int
+lang_id (lua_State *L) {
+ struct tex_language **lang_ptr;
+ lang_ptr = check_islang(L,1);
+ lua_pushnumber(L,(*lang_ptr)->id);
+ return 1;
+}
+
+static int
+lang_patterns (lua_State *L) {
+ struct tex_language **lang_ptr;
+ lang_ptr = check_islang(L,1);
+ if (lua_gettop(L)!=1) {
+ if (!lua_isstring(L,2)) {
+ lua_pushstring(L,"lang.patterns(): argument should be a string");
+ return lua_error(L);
+ }
+ load_patterns(*lang_ptr, (unsigned char *)lua_tostring(L,2));
+ return 0;
+ } else {
+ if ((*lang_ptr)->patterns!=NULL) {
+ lua_pushstring(L,(char *)hnj_serialize((*lang_ptr)->patterns));
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
+ }
+}
+
+static int
+lang_clear_patterns (lua_State *L) {
+ struct tex_language **lang_ptr;
+ lang_ptr = check_islang(L,1);
+ clear_patterns(*lang_ptr);
+ return 0;
+}
+
+
+static int
+lang_hyphenation (lua_State *L) {
+ struct tex_language **lang_ptr;
+ lang_ptr = check_islang(L,1);
+ if (lua_gettop(L)!=1) {
+ if(!lua_isstring(L,2)) {
+ lua_pushstring(L,"lang.hyphenation(): argument should be a string");
+ return lua_error(L);
+ }
+ load_hyphenation(*lang_ptr,(unsigned char *)lua_tostring(L,2));
+ return 0;
+ } else {
+ if ((*lang_ptr)->exceptions!=0) {
+ lua_pushstring(L,exception_strings(*lang_ptr));
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
+ }
+}
+
+static int
+lang_pre_hyphen_char (lua_State *L) {
+ struct tex_language **lang_ptr;
+ lang_ptr = check_islang(L,1);
+ if (lua_gettop(L)!=1) {
+ if(!lua_isnumber(L,2)) {
+ lua_pushstring(L,"lang.prehyphenchar(): argument should be a character number");
+ return lua_error(L);
+ }
+ (*lang_ptr)->pre_hyphen_char = lua_tonumber(L,2);
+ return 0;
+ } else {
+ lua_pushnumber(L,(*lang_ptr)->pre_hyphen_char);
+ return 1;
+ }
+}
+
+static int
+lang_post_hyphen_char (lua_State *L) {
+ struct tex_language **lang_ptr;
+ lang_ptr = check_islang(L,1);
+ if (lua_gettop(L)!=1) {
+ if(!lua_isnumber(L,2)) {
+ lua_pushstring(L,"lang.posthyphenchar(): argument should be a character number");
+ return lua_error(L);
+ }
+ (*lang_ptr)->post_hyphen_char = lua_tonumber(L,2);
+ return 0;
+ } else {
+ lua_pushnumber(L,(*lang_ptr)->post_hyphen_char);
+ return 1;
+ }
+}
+
+static int
+lang_clear_hyphenation (lua_State *L) {
+ struct tex_language **lang_ptr;
+ lang_ptr = check_islang(L,1);
+ clear_hyphenation(*lang_ptr);
+ return 0;
+}
+
+
+static int
+do_lang_clean (lua_State *L) {
+ char *cleaned;
+ if (!lua_isstring(L,1)) {
+ lua_pushstring(L,"lang.clean(): argument should be a string");
+ return lua_error(L);
+ }
+ (void)clean_hyphenation((char *)lua_tostring(L,1),&cleaned);
+ lua_pushstring(L,cleaned);
+ return 1;
+}
+
+static int
+do_lang_hyphenate (lua_State *L) {
+ halfword *h,*t;
+ h = check_isnode(L,1);
+ if (lua_isuserdata(L,2)) {
+ t = check_isnode(L,2);
+ lua_pop(L,1);
+ } else {
+ t = h;
+ while (vlink(*t)!=null)
+ *t = vlink(*t);
+ }
+ hnj_hyphenation(*h,*t);
+ lua_pushboolean(L,1);
+ return 1;
+}
+
+
+static const struct luaL_reg langlib_d [] = {
+ {"clear_patterns", lang_clear_patterns},
+ {"clear_hyphenation", lang_clear_hyphenation},
+ {"patterns", lang_patterns},
+ {"hyphenation", lang_hyphenation},
+ {"prehyphenchar", lang_pre_hyphen_char},
+ {"posthyphenchar", lang_post_hyphen_char},
+ {"id", lang_id},
+ {NULL, NULL} /* sentinel */
+};
+
+
+static const struct luaL_reg langlib[] = {
+ {"clear_patterns", lang_clear_patterns},
+ {"clear_hyphenation", lang_clear_hyphenation},
+ {"patterns", lang_patterns},
+ {"hyphenation", lang_hyphenation},
+ {"prehyphenchar", lang_pre_hyphen_char},
+ {"posthyphenchar", lang_post_hyphen_char},
+ {"id", lang_id},
+ {"clean", do_lang_clean},
+ {"hyphenate", do_lang_hyphenate},
+ {"new", lang_new},
+ {NULL, NULL} /* sentinel */
+};
+
+
+int
+luaopen_lang (lua_State *L) {
+ luaL_newmetatable(L,LANG_METATABLE);
+ lua_pushvalue(L, -1); /* push metatable */
+ lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */
+ luaL_register(L, NULL, langlib_d); /* dict methods */
+ luaL_register(L, "lang", langlib);
+ return 1;
+}
+