diff options
118 files changed, 5 insertions, 37339 deletions
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 245d98f8..f6e7748c 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -5,7 +5,6 @@ INSTALL(FILES INSTALL(DIRECTORY apex cmov - core data dngn edit diff --git a/lib/core/gen_idx.lua b/lib/core/gen_idx.lua deleted file mode 100644 index 5f3af435..00000000 --- a/lib/core/gen_idx.lua +++ /dev/null @@ -1,261 +0,0 @@ --- Place here the list of files to parse -files = -{ - "birth.txt", - "experien.hlp", - "gods.txt", - "explore.hlp", - "newbie.hlp", - "advanced.hlp", - "help.hlp", - "general.txt", - "whattome.txt", - "dungeon.txt", - "spoiler.hlp", - "g_melkor.txt", - "skills.txt", - "c_bard.txt", - "c_druid.txt", - "c_lorema.txt", - "c_mage.txt", - "c_mimic.txt", - "c_mindcr.txt", - "c_monk.txt", - "c_palad.txt", - "c_posses.txt", - "c_pr_drk.txt", - "c_pr_eru.txt", - "c_pr_man.txt", - "c_symbia.txt", - "c_alchem.txt", - "c_archer.txt", - "c_assass.txt", - "c_axemas.txt", - "c_demono.txt", - "c_geoman.txt", - "c_hafted.txt", - "c_necro.txt", - "c_polear.txt", - "c_ranger.txt", - "c_rogue.txt", - "c_runecr.txt", - "c_sorcer.txt", - "c_swordm.txt", - "c_thaum.txt", - "c_unbel.txt", - "c_warper.txt", - "c_warrio.txt", - "m_meta.txt", - "rm_skel.txt", - "rm_zomb.txt", - "luckspoi.txt", - "m_air.txt", - "dunspoil.txt", - "g_eru.txt", - "g_manwe.txt", - "g_tulkas.txt", - "m_divin.txt", - "m_mimic.txt", - "m_water.txt", - "magic.txt", - "r_drkelf.txt", - "r_dwarf.txt", - "r_elf.txt", - "r_hielf.txt", - "r_hobbit.txt", - "r_pettyd.txt", - "r_wodelf.txt", - "rm_spec.txt", - "tome_faq.txt", - "ability.txt", - "automat.txt", - "c_summon.txt", - "command.txt", - "corspoil.txt", - "debug.txt", - "m_music.txt", - "rm_barb.txt", - "macrofaq.txt", - "m_necrom.txt", - "m_mindcr.txt", - "m_symbio.txt", - "m_thaum.txt", - "magic.hlp", - "m_convey.txt", - "m_fire.txt", - "m_mana.txt", - "m_mind.txt", - "m_nature.txt", - "m_tempo.txt", - "m_udun.txt", - "m_geoman.txt", - "essences.txt", - "r_ent.txt", - "g_yavann.txt", - "defines.txt", - "rm_vamp.txt", - "inscrip.txt", - "m_earth.txt", - "option.txt", - "attack.txt", - "version.txt", - "m_demono.txt", - "r_beorn.txt", - "r_deathm.txt", - "r_rohank.txt", - "r_hafogr.txt", - "r_human.txt", - "r_kobold.txt", - "r_maia.txt", - "r_orc.txt", - "r_thlord.txt", - "r_troll.txt", - "r_yeek.txt", - "rm_class.txt", - "rm_herm.txt", - "rm_lsoul.txt", - "wishing.txt", - "c_priest.txt", - "fatespoi.txt", - "gambling.txt", - "r_dunad.txt", - "r_gnome.txt", - "r_hafelf.txt", - "c_merch.txt", - "spoil_faq.txt", -} - -out_file = "index.txt" - -index = {} - -function parse_file(file) - local fff = openfile(path_build(ANGBAND_DIR_HELP, file), "r") - local line - - line = read(fff, "*l") - while line do - local i, j, anchor, name, subname = strfind(line, "~~~~~(%d+)|([%d%a -]+)|([%d%a -]+)") - if not i then - i, j, anchor, name = strfind(line, "~~~~~(%d+)|([%d%a -]+)") - - subname = nil - end - - if i then - if not index[name] then - index[name] = {} - end - if subname then - tinsert(index[name], { __name__ = subname, __file__ = file, __anchor__ = anchor}) - else - tinsert(index[name], { __name__ = "__primary__", __file__ = file, __anchor__ = anchor}) - end - end - - line = read(fff, "*l") - end - - closefile(fff) -end - -function sort_fct(a, b) - local i, len - - a = a.__name__ - b = b.__name__ - - if strlen(a) > strlen(b) then len = strlen(b) else len = strlen(a) end - - for i = 1, len do - local ac = strbyte(a, i) - local bc = strbyte(b, i) - - if ac < bc then - return not nil - elseif ac > bc then - return nil - end - end - if strlen(a) > strlen(b) then return nil else return not nil end -end - -function generate_index() - local k, e, index_list - for _, e in files do - parse_file(e) - end - - index_list = {} - for k, e in index do - -- Ok either my sort function or lua sort function sucks ass .. - sort(e, sort_fct) - sort(e, sort_fct) - sort(e, sort_fct) - sort(e, sort_fct) - sort(e, sort_fct) - tinsert(index_list, {__name__= k, __table__ = e}) - end - - -- Ok either my sort function or lua sort function sucks ass .. - sort(index_list, sort_fct) - sort(index_list, sort_fct) - sort(index_list, sort_fct) - sort(index_list, sort_fct) - sort(index_list, sort_fct) - index = index_list -end - -function out_link(fff, space, name, file, anchor) - write(fff, space.."*****"..file.."*"..anchor.."["..name.."]\n") -end - -function print_index() - local i, j, c, new_c - local fff = openfile(path_build(ANGBAND_DIR_HELP, out_file), "w") - - write(fff, -[[|||||oy -#####R /----------------------------------------\ -#####R < Help Index > -#####R \----------------------------------------/ - -This is the index of everything in the T.o.M.E. documentation. - -#####BHit a letter key to jump to the entries for that letter. - -Some entries in the index link to the same place as other entries. This is -intentional, so that the information you want is easy to find. - -Don't forget you can browse the help from the *****help.hlp*02[Main menu]. - -#####sSpotted a problem with the help files, or some content thats missing? -#####sContact fearoffours@t-o-m-e.net . - -]]) - - c = ' ' - for i = 1, getn(index) do - new_c = strbyte(index[i].__name__, 1) - if c ~= new_c then - c = new_c - write(fff, "~~~~~"..c.."\n") - write(fff, "*****/"..strchar(c)..out_file.."*"..c.."["..strchar(c).."]\n") - end - for j = 1, getn(index[i].__table__) do - if index[i].__table__[j].__name__ == "__primary__" then - out_link(fff, " ", index[i].__name__, index[i].__table__[j].__file__, index[i].__table__[j].__anchor__) - end - end - for j = 1, getn(index[i].__table__) do - if index[i].__table__[j].__name__ ~= "__primary__" then - out_link(fff, " ", index[i].__table__[j].__name__, index[i].__table__[j].__file__, index[i].__table__[j].__anchor__) - end - end - end - closefile(fff) -end - -generate_index() - -print_index() diff --git a/lib/core/init.lua b/lib/core/init.lua deleted file mode 100644 index 44ef9a7a..00000000 --- a/lib/core/init.lua +++ /dev/null @@ -1,9 +0,0 @@ --- --- This file is loaded at the initialisation of ToME --- Load the system functions --- - --- various vital helper code -tome_dofile_anywhere(ANGBAND_DIR_CORE, "util.lua") -tome_dofile_anywhere(ANGBAND_DIR_CORE, "player.lua") -tome_dofile_anywhere(ANGBAND_DIR_CORE, "objects.lua") diff --git a/lib/core/objects.lua b/lib/core/objects.lua deleted file mode 100644 index fa77c57b..00000000 --- a/lib/core/objects.lua +++ /dev/null @@ -1,8 +0,0 @@ --- SYSTEM FILE --- --- Lua object funtions --- - -function get_kind(obj) - return k_info[obj.k_idx + 1] -end diff --git a/lib/core/player.lua b/lib/core/player.lua deleted file mode 100644 index deec2e21..00000000 --- a/lib/core/player.lua +++ /dev/null @@ -1,16 +0,0 @@ --- SYSTEM FILE --- --- Lua player funtions --- - --------- skill stuff --------- - --- Easy skill access -function skill(i) - return s_info[i + 1] -end - --- easier inventory access -function player.inventory(i) - return player.inventory_real[i + 1] -end diff --git a/lib/core/util.lua b/lib/core/util.lua deleted file mode 100644 index c3387401..00000000 --- a/lib/core/util.lua +++ /dev/null @@ -1,37 +0,0 @@ --- various stuff to make scripters life easier - --- Beware of the scary undefined globals -function safe_getglobal(x) - local v = rawget(globals(), x) - - if v then - return v - else - error("undefined global variable '"..x.."'") - end -end - -function set_safe_globals() - settagmethod(tag(nil), "getglobal", safe_getglobal) -end -function unset_safe_globals() - settagmethod(tag(nil), "getglobal", nil) -end - -set_safe_globals() - --- Wrapper for the real msg_print and cmsg_print --- it understands if we want color or not -function msg_print(c, m) - if type(c) == "number" then - cmsg_print(c, m) - else - call(%msg_print, { c }) - end -end - - --- Strings -function msg_format(...) - msg_print(call(format, arg)) -end diff --git a/lib/mods/theme/core/gen_idx.lua b/lib/mods/theme/core/gen_idx.lua deleted file mode 100644 index 5f3af435..00000000 --- a/lib/mods/theme/core/gen_idx.lua +++ /dev/null @@ -1,261 +0,0 @@ --- Place here the list of files to parse -files = -{ - "birth.txt", - "experien.hlp", - "gods.txt", - "explore.hlp", - "newbie.hlp", - "advanced.hlp", - "help.hlp", - "general.txt", - "whattome.txt", - "dungeon.txt", - "spoiler.hlp", - "g_melkor.txt", - "skills.txt", - "c_bard.txt", - "c_druid.txt", - "c_lorema.txt", - "c_mage.txt", - "c_mimic.txt", - "c_mindcr.txt", - "c_monk.txt", - "c_palad.txt", - "c_posses.txt", - "c_pr_drk.txt", - "c_pr_eru.txt", - "c_pr_man.txt", - "c_symbia.txt", - "c_alchem.txt", - "c_archer.txt", - "c_assass.txt", - "c_axemas.txt", - "c_demono.txt", - "c_geoman.txt", - "c_hafted.txt", - "c_necro.txt", - "c_polear.txt", - "c_ranger.txt", - "c_rogue.txt", - "c_runecr.txt", - "c_sorcer.txt", - "c_swordm.txt", - "c_thaum.txt", - "c_unbel.txt", - "c_warper.txt", - "c_warrio.txt", - "m_meta.txt", - "rm_skel.txt", - "rm_zomb.txt", - "luckspoi.txt", - "m_air.txt", - "dunspoil.txt", - "g_eru.txt", - "g_manwe.txt", - "g_tulkas.txt", - "m_divin.txt", - "m_mimic.txt", - "m_water.txt", - "magic.txt", - "r_drkelf.txt", - "r_dwarf.txt", - "r_elf.txt", - "r_hielf.txt", - "r_hobbit.txt", - "r_pettyd.txt", - "r_wodelf.txt", - "rm_spec.txt", - "tome_faq.txt", - "ability.txt", - "automat.txt", - "c_summon.txt", - "command.txt", - "corspoil.txt", - "debug.txt", - "m_music.txt", - "rm_barb.txt", - "macrofaq.txt", - "m_necrom.txt", - "m_mindcr.txt", - "m_symbio.txt", - "m_thaum.txt", - "magic.hlp", - "m_convey.txt", - "m_fire.txt", - "m_mana.txt", - "m_mind.txt", - "m_nature.txt", - "m_tempo.txt", - "m_udun.txt", - "m_geoman.txt", - "essences.txt", - "r_ent.txt", - "g_yavann.txt", - "defines.txt", - "rm_vamp.txt", - "inscrip.txt", - "m_earth.txt", - "option.txt", - "attack.txt", - "version.txt", - "m_demono.txt", - "r_beorn.txt", - "r_deathm.txt", - "r_rohank.txt", - "r_hafogr.txt", - "r_human.txt", - "r_kobold.txt", - "r_maia.txt", - "r_orc.txt", - "r_thlord.txt", - "r_troll.txt", - "r_yeek.txt", - "rm_class.txt", - "rm_herm.txt", - "rm_lsoul.txt", - "wishing.txt", - "c_priest.txt", - "fatespoi.txt", - "gambling.txt", - "r_dunad.txt", - "r_gnome.txt", - "r_hafelf.txt", - "c_merch.txt", - "spoil_faq.txt", -} - -out_file = "index.txt" - -index = {} - -function parse_file(file) - local fff = openfile(path_build(ANGBAND_DIR_HELP, file), "r") - local line - - line = read(fff, "*l") - while line do - local i, j, anchor, name, subname = strfind(line, "~~~~~(%d+)|([%d%a -]+)|([%d%a -]+)") - if not i then - i, j, anchor, name = strfind(line, "~~~~~(%d+)|([%d%a -]+)") - - subname = nil - end - - if i then - if not index[name] then - index[name] = {} - end - if subname then - tinsert(index[name], { __name__ = subname, __file__ = file, __anchor__ = anchor}) - else - tinsert(index[name], { __name__ = "__primary__", __file__ = file, __anchor__ = anchor}) - end - end - - line = read(fff, "*l") - end - - closefile(fff) -end - -function sort_fct(a, b) - local i, len - - a = a.__name__ - b = b.__name__ - - if strlen(a) > strlen(b) then len = strlen(b) else len = strlen(a) end - - for i = 1, len do - local ac = strbyte(a, i) - local bc = strbyte(b, i) - - if ac < bc then - return not nil - elseif ac > bc then - return nil - end - end - if strlen(a) > strlen(b) then return nil else return not nil end -end - -function generate_index() - local k, e, index_list - for _, e in files do - parse_file(e) - end - - index_list = {} - for k, e in index do - -- Ok either my sort function or lua sort function sucks ass .. - sort(e, sort_fct) - sort(e, sort_fct) - sort(e, sort_fct) - sort(e, sort_fct) - sort(e, sort_fct) - tinsert(index_list, {__name__= k, __table__ = e}) - end - - -- Ok either my sort function or lua sort function sucks ass .. - sort(index_list, sort_fct) - sort(index_list, sort_fct) - sort(index_list, sort_fct) - sort(index_list, sort_fct) - sort(index_list, sort_fct) - index = index_list -end - -function out_link(fff, space, name, file, anchor) - write(fff, space.."*****"..file.."*"..anchor.."["..name.."]\n") -end - -function print_index() - local i, j, c, new_c - local fff = openfile(path_build(ANGBAND_DIR_HELP, out_file), "w") - - write(fff, -[[|||||oy -#####R /----------------------------------------\ -#####R < Help Index > -#####R \----------------------------------------/ - -This is the index of everything in the T.o.M.E. documentation. - -#####BHit a letter key to jump to the entries for that letter. - -Some entries in the index link to the same place as other entries. This is -intentional, so that the information you want is easy to find. - -Don't forget you can browse the help from the *****help.hlp*02[Main menu]. - -#####sSpotted a problem with the help files, or some content thats missing? -#####sContact fearoffours@t-o-m-e.net . - -]]) - - c = ' ' - for i = 1, getn(index) do - new_c = strbyte(index[i].__name__, 1) - if c ~= new_c then - c = new_c - write(fff, "~~~~~"..c.."\n") - write(fff, "*****/"..strchar(c)..out_file.."*"..c.."["..strchar(c).."]\n") - end - for j = 1, getn(index[i].__table__) do - if index[i].__table__[j].__name__ == "__primary__" then - out_link(fff, " ", index[i].__name__, index[i].__table__[j].__file__, index[i].__table__[j].__anchor__) - end - end - for j = 1, getn(index[i].__table__) do - if index[i].__table__[j].__name__ ~= "__primary__" then - out_link(fff, " ", index[i].__table__[j].__name__, index[i].__table__[j].__file__, index[i].__table__[j].__anchor__) - end - end - end - closefile(fff) -end - -generate_index() - -print_index() diff --git a/lib/mods/theme/core/init.lua b/lib/mods/theme/core/init.lua deleted file mode 100644 index 44ef9a7a..00000000 --- a/lib/mods/theme/core/init.lua +++ /dev/null @@ -1,9 +0,0 @@ --- --- This file is loaded at the initialisation of ToME --- Load the system functions --- - --- various vital helper code -tome_dofile_anywhere(ANGBAND_DIR_CORE, "util.lua") -tome_dofile_anywhere(ANGBAND_DIR_CORE, "player.lua") -tome_dofile_anywhere(ANGBAND_DIR_CORE, "objects.lua") diff --git a/lib/mods/theme/core/objects.lua b/lib/mods/theme/core/objects.lua deleted file mode 100644 index fa77c57b..00000000 --- a/lib/mods/theme/core/objects.lua +++ /dev/null @@ -1,8 +0,0 @@ --- SYSTEM FILE --- --- Lua object funtions --- - -function get_kind(obj) - return k_info[obj.k_idx + 1] -end diff --git a/lib/mods/theme/core/player.lua b/lib/mods/theme/core/player.lua deleted file mode 100644 index deec2e21..00000000 --- a/lib/mods/theme/core/player.lua +++ /dev/null @@ -1,16 +0,0 @@ --- SYSTEM FILE --- --- Lua player funtions --- - --------- skill stuff --------- - --- Easy skill access -function skill(i) - return s_info[i + 1] -end - --- easier inventory access -function player.inventory(i) - return player.inventory_real[i + 1] -end diff --git a/lib/mods/theme/core/util.lua b/lib/mods/theme/core/util.lua deleted file mode 100644 index c3387401..00000000 --- a/lib/mods/theme/core/util.lua +++ /dev/null @@ -1,37 +0,0 @@ --- various stuff to make scripters life easier - --- Beware of the scary undefined globals -function safe_getglobal(x) - local v = rawget(globals(), x) - - if v then - return v - else - error("undefined global variable '"..x.."'") - end -end - -function set_safe_globals() - settagmethod(tag(nil), "getglobal", safe_getglobal) -end -function unset_safe_globals() - settagmethod(tag(nil), "getglobal", nil) -end - -set_safe_globals() - --- Wrapper for the real msg_print and cmsg_print --- it understands if we want color or not -function msg_print(c, m) - if type(c) == "number" then - cmsg_print(c, m) - else - call(%msg_print, { c }) - end -end - - --- Strings -function msg_format(...) - msg_print(call(format, arg)) -end diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0e1b21da..452ca3e2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,3 @@ -# Lua support code. -ADD_SUBDIRECTORY(lua) - SET(SRCS main-gcu.c main-x11.c main-xaw.c main-sdl.c main-gtk2.c z-rand.c z-util.c z-form.c z-virt.c z-term.c @@ -19,8 +16,7 @@ SET(SRCS cmovie.c wizard2.c init2.c birth.c wizard1.c init1.c main.c # Lua bits: - lua_bind.c script.c w_mnster.c w_player.c w_play_c.c w_z_pack.c - w_obj.c w_util.c w_spells.c w_dun.c + lua_bind.c script.c ) # Need a few additional source files for Windows. @@ -41,26 +37,6 @@ if(WIN32) endif(WIN32) -# Macro for defining tolua targets. -MACRO(TOLUA_FILE MODULE_NAME OUTPUT_FILE_NAME) - ADD_CUSTOM_COMMAND( - OUTPUT ${OUTPUT_FILE_NAME} - COMMAND tolua -n ${MODULE_NAME} -o ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE_NAME}.pkg - DEPENDS tolua ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE_NAME}.pkg - ) - SET_SOURCE_FILES_PROPERTIES("${OUTPUT_FILE_NAME}" PROPERTIES GENERATED TRUE) -ENDMACRO(TOLUA_FILE) - -# Process all the needed modules. -TOLUA_FILE(monster w_mnster.c) -TOLUA_FILE(player w_player.c) -TOLUA_FILE(player_c w_play_c.c) -TOLUA_FILE(z_pack w_z_pack.c) -TOLUA_FILE(object w_obj.c) -TOLUA_FILE(util w_util.c) -TOLUA_FILE(spells w_spells.c) -TOLUA_FILE(dungeon w_dun.c) - # tome executable INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) @@ -12,8 +12,6 @@ #include "angband.h" -#include "lua/lua.h" -#include "tolua.h" #include <assert.h> diff --git a/src/defines.h b/src/defines.h index 6fa426c7..0b6c4c26 100644 --- a/src/defines.h +++ b/src/defines.h @@ -4558,7 +4558,6 @@ #define MAX_HOOKS 77 #define HOOK_TYPE_C 0 -#define HOOK_TYPE_LUA 1 #define HOOK_TYPE_NEW 2 /* diff --git a/src/dungeon.c b/src/dungeon.c index ce259344..d13da812 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -11,12 +11,8 @@ */ #include "angband.h" -#include "lua/lua.h" -#include "tolua.h" #include <assert.h> -extern lua_State* L; - #define TY_CURSE_CHANCE 100 #define DG_CURSE_CHANCE 50 #define AUTO_CURSE_CHANCE 15 diff --git a/src/dungeon.pkg b/src/dungeon.pkg deleted file mode 100644 index f5e4045f..00000000 --- a/src/dungeon.pkg +++ /dev/null @@ -1,1607 +0,0 @@ -/* File: dungeon.pkg */ - -/* - * Purpose: Lua interface defitions for dungeon routines. - * To be processed by tolua to generate C source code. - */ - -$#include "angband.h" - -/** @typedef cptr - * @note String - */ -typedef char* cptr; - -/** @typedef errr - * @note Number - */ -typedef int errr; - -/** @typedef bool - * @note Boolean - */ -typedef unsigned char bool; - -/** @typedef byte - * @note Number - */ -typedef unsigned char byte; - -/** @typedef s16b - * @note Number - */ -typedef signed short s16b; - -/** @typedef u16b - * @note Number - */ -typedef unsigned short u16b; - -/** @typedef s32b - * @note Number - */ -typedef signed int s32b; - -/** @typedef u32b - * @note Number - */ -typedef unsigned int u32b; - -/** @name Cave Grid - * @note Special cave grid flags - * @{ - */ - -/** @def CAVE_MARK - * @note memorized feature - */ -#define CAVE_MARK 0x0001 - -/** @def CAVE_GLOW - * @note self-illuminating - */ -#define CAVE_GLOW 0x0002 - -/** @def CAVE_ICKY - * @note part of a vault - */ -#define CAVE_ICKY 0x0004 - -/** @def CAVE_ROOM - * @note part of a room - */ -#define CAVE_ROOM 0x0008 - -/** @def CAVE_SEEN - * @note seen flag - */ -#define CAVE_SEEN 0x0010 - -/** @def CAVE_VIEW - * @note view flag - */ -#define CAVE_VIEW 0x0020 - -/** @def CAVE_TEMP - * @note temp flag - */ -#define CAVE_TEMP 0x0040 - -/** @def CAVE_WALL - * @note wall flag - */ -#define CAVE_WALL 0x0080 - -/** @def CAVE_TRDT - * @note trap detected - */ -#define CAVE_TRDT 0x0100 - -/** @def CAVE_IDNT - * @note grid identified (fountains) - */ -#define CAVE_IDNT 0x0200 - -/** @def CAVE_SPEC - * @note special mark(quests) - */ -#define CAVE_SPEC 0x0400 - -/** @def CAVE_FREE - * @note no random generation on it - */ -#define CAVE_FREE 0x0800 - -/** @def CAVE_DETECT - * @note Traps detected here - */ -#define CAVE_DETECT 0x1000 - -/** @def CAVE_PLIT - * @note Player lit grid - */ -#define CAVE_PLIT 0x2000 - -/** @def CAVE_MLIT - * @note Monster lit grid - */ -#define CAVE_MLIT 0x4000 -/** @} */ - -/** @name Terrain Feature Indexes - * @note (see "lib/edit/f_info.txt") - * @{ - */ - -/* Nothing */ -/** @def FEAT_NONE */ -#define FEAT_NONE 0x00 - - -/* Basic features */ -/** @def FEAT_FLOOR */ -#define FEAT_FLOOR 0x01 - -/** @def FEAT_FOUNTAIN */ -#define FEAT_FOUNTAIN 0x02 - -/** @def FEAT_GLYPH */ -#define FEAT_GLYPH 0x03 - -/** @def FEAT_OPEN */ -#define FEAT_OPEN 0x04 - -/** @def FEAT_BROKEN */ -#define FEAT_BROKEN 0x05 - -/** @def FEAT_LESS */ -#define FEAT_LESS 0x06 - -/** @def FEAT_MORE */ -#define FEAT_MORE 0x07 - - -/* Quest features -KMW- */ -/** @def FEAT_QUEST_ENTER */ -#define FEAT_QUEST_ENTER 0x08 - -/** @def FEAT_QUEST_EXIT */ -#define FEAT_QUEST_EXIT 0x09 - -/** @def FEAT_QUEST_DOWN */ -#define FEAT_QUEST_DOWN 0x0A - -/** @def FEAT_QUEST_UP */ -#define FEAT_QUEST_UP 0x0B - - -/* Shafts -GSN- */ -/** @def FEAT_SHAFT_DOWN */ -#define FEAT_SHAFT_DOWN 0x0D - -/** @def FEAT_SHAFT_UP */ -#define FEAT_SHAFT_UP 0x0E - - -/* Basic feature */ -/** @def FEAT_EMPTY_FOUNTAIN */ -#define FEAT_EMPTY_FOUNTAIN 0x0F - - -/* Feature 0x10 -- web */ - -/* Traps */ -/** @def FEAT_TRAP */ -#define FEAT_TRAP 0x11 - - -/* Features 0x12 - 0x1F -- unused */ - -/* Doors */ -/** @def FEAT_DOOR_HEAD */ -#define FEAT_DOOR_HEAD 0x20 - -/** @def FEAT_DOOR_TAIL */ -#define FEAT_DOOR_TAIL 0x2F - - -/* Extra */ -/** @def FEAT_SECRET */ -#define FEAT_SECRET 0x30 - -/** @def FEAT_RUBBLE */ -#define FEAT_RUBBLE 0x31 - - -/* Seams */ -/** @def FEAT_MAGMA */ -#define FEAT_MAGMA 0x32 - -/** @def FEAT_QUARTZ */ -#define FEAT_QUARTZ 0x33 - -/** @def FEAT_MAGMA_H */ -#define FEAT_MAGMA_H 0x34 - -/** @def FEAT_QUARTZ_H */ -#define FEAT_QUARTZ_H 0x35 - -/** @def FEAT_MAGMA_K */ -#define FEAT_MAGMA_K 0x36 - -/** @def FEAT_QUARTZ_K */ -#define FEAT_QUARTZ_K 0x37 - - -/* Walls */ -/** @def FEAT_WALL_EXTRA */ -#define FEAT_WALL_EXTRA 0x38 - -/** @def FEAT_WALL_INNER */ -#define FEAT_WALL_INNER 0x39 - -/** @def FEAT_WALL_OUTER */ -#define FEAT_WALL_OUTER 0x3A - -/** @def FEAT_WALL_SOLID */ -#define FEAT_WALL_SOLID 0x3B - -/** @def FEAT_PERM_EXTRA */ -#define FEAT_PERM_EXTRA 0x3C - -/** @def FEAT_PERM_INNER */ -#define FEAT_PERM_INNER 0x3D - -/** @def FEAT_PERM_OUTER */ -#define FEAT_PERM_OUTER 0x3E - -/** @def FEAT_PERM_SOLID */ -#define FEAT_PERM_SOLID 0x3F - - -/* Explosive rune */ -/** @def FEAT_MINOR_GLYPH */ -#define FEAT_MINOR_GLYPH 0x40 - - -/* Pattern */ -/** @def FEAT_PATTERN_START */ -#define FEAT_PATTERN_START 0x41 - -/** @def FEAT_PATTERN_1 */ -#define FEAT_PATTERN_1 0x42 - -/** @def FEAT_PATTERN_2 */ -#define FEAT_PATTERN_2 0x43 - -/** @def FEAT_PATTERN_3 */ -#define FEAT_PATTERN_3 0x44 - -/** @def FEAT_PATTERN_4 */ -#define FEAT_PATTERN_4 0x45 - -/** @def FEAT_PATTERN_END */ -#define FEAT_PATTERN_END 0x46 - -/** @def FEAT_PATTERN_OLD */ -#define FEAT_PATTERN_OLD 0x47 - -/** @def FEAT_PATTERN_XTRA1 */ -#define FEAT_PATTERN_XTRA1 0x48 - -/** @def FEAT_PATTERN_XTRA2 */ -#define FEAT_PATTERN_XTRA2 0x49 - - -/* Shops */ -/** @def FEAT_SHOP */ -#define FEAT_SHOP 0x4A - - -/* Permanent walls for quests */ -/** @def FEAT_QUEST1 */ -#define FEAT_QUEST1 0x4B - -/** @def FEAT_QUEST2 */ -#define FEAT_QUEST2 0x4C - -/** @def FEAT_QUEST3 */ -#define FEAT_QUEST3 0x4D - -/** @def FEAT_QUEST4 */ -#define FEAT_QUEST4 0x4E - - -/* Features 0x4F - 0x53 -- unused */ - -/* Additional terrains */ -/** @def FEAT_SHAL_WATER */ -#define FEAT_SHAL_WATER 0x54 - -/** @def FEAT_DEEP_LAVA */ -#define FEAT_DEEP_LAVA 0x55 - -/** @def FEAT_SHAL_LAVA */ -#define FEAT_SHAL_LAVA 0x56 - -/** @def FEAT_DARK_PIT */ -#define FEAT_DARK_PIT 0x57 - -/** @def FEAT_DIRT */ -#define FEAT_DIRT 0x58 - -/** @def FEAT_GRASS */ -#define FEAT_GRASS 0x59 - -/** @def FEAT_ICE */ -#define FEAT_ICE 0x5A - -/** @def FEAT_SAND */ -#define FEAT_SAND 0x5B - -/** @def FEAT_DEAD_TREE */ -#define FEAT_DEAD_TREE 0x5C - -/** @def FEAT_ASH */ -#define FEAT_ASH 0x5D - -/** @def FEAT_MUD */ -#define FEAT_MUD 0x5E - -/** @def FEAT_ICE_WALL */ -#define FEAT_ICE_WALL 0x5F - -/** @def FEAT_TREES */ -#define FEAT_TREES 0x60 - -/** @def FEAT_MOUNTAIN */ -#define FEAT_MOUNTAIN 0x61 - -/** @def FEAT_SANDWALL */ -#define FEAT_SANDWALL 0x62 - -/** @def FEAT_SANDWALL_H */ -#define FEAT_SANDWALL_H 0x63 - -/** @def FEAT_SANDWALL_K */ -#define FEAT_SANDWALL_K 0x64 - -/* Feature 0x65 -- high mountain chain */ -/* Feature 0x66 -- nether mist */ - -/* Features 0x67 - 0x9F -- unused */ - -/** @def FEAT_BETWEEN - * @note 160 - */ -#define FEAT_BETWEEN 0xA0 - -/* Altars */ -/** @def FEAT_ALTAR_HEAD - * @note 161 - */ -#define FEAT_ALTAR_HEAD 0xA1 - -/** @def FEAT_ALTAR_TAIL - * @note 171 - */ -#define FEAT_ALTAR_TAIL 0xAB - -/** @def FEAT_MARKER - * @note 172 - */ -#define FEAT_MARKER 0xAC - -/* Feature 0xAD -- Underground Tunnel */ -/** @def FEAT_TAINTED_WATER - * @note 174 - */ -#define FEAT_TAINTED_WATER 0xAE - -/** @def FEAT_MON_TRAP - * @note 175 - */ -#define FEAT_MON_TRAP 0xAF - -/** @def FEAT_BETWEEN2 - * @note 176 - */ -#define FEAT_BETWEEN2 0xB0 - -/** @def FEAT_LAVA_WALL - * @note 177 - */ -#define FEAT_LAVA_WALL 0xB1 - -/** @def FEAT_GREAT_FIRE - * @note 178 - */ -#define FEAT_GREAT_FIRE 0xB2 - -/** @def FEAT_WAY_MORE - * @note 179 - */ -#define FEAT_WAY_MORE 0xB3 - -/** @def FEAT_WAY_LESS - * @note 180 - */ -#define FEAT_WAY_LESS 0xB4 - -/* Feature 0xB5 -- field */ - -/** @def FEAT_EKKAIA - * @note 182 - */ -#define FEAT_EKKAIA 0xB6 - -/* Features 0xB7 - 0xBA -- unused */ - -/** @def FEAT_DEEP_WATER - * @note 187 - */ -#define FEAT_DEEP_WATER 0xBB - -/** @def FEAT_GLASS_WALL - * @note 188 - */ -#define FEAT_GLASS_WALL 0xBC - -/** @def FEAT_ILLUS_WALL - * @note 189 - */ -#define FEAT_ILLUS_WALL 0xBD - -/* Feature 0xBE -- grass roof */ -/* Feature 0xBF -- grass roof top */ -/* Feature 0xC0 -- grass roof chimney */ -/* Feature 0xC1 -- brick roof */ -/* Feature 0xC2 -- brick roof top */ -/* Feature 0xC3 -- brick roof chimney */ -/* Feature 0xC4 -- window */ -/* Feature 0xC5 -- small window */ -/* Feature 0xC6 -- rain barrel */ - -/** @def FEAT_FLOWER - * @note 199 - */ -#define FEAT_FLOWER 0xC7 - -/* Feature 0xC8 -- cobblestone road */ -/* Feature 0xC9 -- cobblestone with outlet */ - -/** @def FEAT_SMALL_TREES - * @note 202 - */ -#define FEAT_SMALL_TREES 0xCA - -/** @def FEAT_TOWN - * @note 203 - */ -#define FEAT_TOWN 0xCB - -/* Feature 0xCC -- Underground Tunnel */ - -/** @def FEAT_FIRE - * @note 205 - */ -#define FEAT_FIRE 0xCD - -/* Feature 0xCE -- pile of rubble (permanent) */ -/* Features 0xCF - 0xFF -- unused */ -/** @} */ - -/** @name Dungeon Type Flags (part 1) - * @{ */ - -/** @def DF1_PRINCIPAL - * @note Is a principal dungeon - */ -#define DF1_PRINCIPAL 0x00000001L -/** @def DF1_MAZE - * @note Is a maze-type dungeon - */ -#define DF1_MAZE 0x00000002L -/** @def DF1_SMALLEST - * @note Creates VERY small levels like The Maze - */ -#define DF1_SMALLEST 0x00000004L -/** @def DF1_SMALL - * @note Creates small levels like Dol Goldor - */ -#define DF1_SMALL 0x00000008L -/** @def DF1_BIG - * @note Creates big levels like Moria, and Angband dungeons - */ -#define DF1_BIG 0x00000010L -/** @def DF1_NO_DOORS - * @note No doors on rooms, like Barrowdowns, Old Forest etc) - */ -#define DF1_NO_DOORS 0x00000020L -/** @def DF1_WATER_RIVER - * @note Allow a single water streamer on a level - */ -#define DF1_WATER_RIVER 0x00000040L -/** @def DF1_LAVA_RIVER - * @note Allow a single lava streamer on a level - */ -#define DF1_LAVA_RIVER 0x00000080L -/** @def DF1_WATER_RIVERS - * @note Allow multiple water streamers on a level - */ -#define DF1_WATER_RIVERS 0x00000100L -/** @def DF1_LAVA_RIVERS - * @note Allow multiple lava streamers on a level - */ -#define DF1_LAVA_RIVERS 0x00000200L -/** @def DF1_CAVE - * @note Allow orc-cave like 'fractal' rooms - */ -#define DF1_CAVE 0x00000400L -/** @def DF1_CAVERN - * @note Allow cavern rooms - */ -#define DF1_CAVERN 0x00000800L -/** @def DF1_NO_UP - * @note Disallow up stairs - */ -#define DF1_NO_UP 0x00001000L -/** @def DF1_HOT - * @note Corpses on ground and in pack decay quicker through heat - */ -#define DF1_HOT 0x00002000L -/** @def DF1_COLD - * @note Corpses on ground and in pack decay quicker through cold - */ -#define DF1_COLD 0x00004000L -/** @def DF1_FORCE_DOWN - * @note No up stairs generated - */ -#define DF1_FORCE_DOWN 0x00008000L -/** @def DF1_FORGET - * @note Features are forgotten, like the Maze and Illusory Castle - */ -#define DF1_FORGET 0x00010000L -/** @def DF1_NO_DESTROY - * @note No destroyed levels in dungeon - */ -#define DF1_NO_DESTROY 0x00020000L -/** @def DF1_SAND_VEIN - * @note Like in the sandworm lair - */ -#define DF1_SAND_VEIN 0x00040000L -/** @def DF1_CIRCULAR_ROOMS - * @note Allow circular rooms - */ -#define DF1_CIRCULAR_ROOMS 0x00080000L -/** @def DF1_EMPTY - * @note Allow arena levels - */ -#define DF1_EMPTY 0x00100000L -/** @def DF1_DAMAGE_FEAT - * @note Effect specified in will affect all grids incl. terrain and monsters - */ -#define DF1_DAMAGE_FEAT 0x00200000L -/** @def DF1_FLAT - * @note Creates paths to next areas at edge of level, like Barrowdowns - */ -#define DF1_FLAT 0x00400000L -/** @def DF1_TOWER - * @note You start at bottom and go up rather than the reverse - */ -#define DF1_TOWER 0x00800000L -/** @def DF1_RANDOM_TOWNS - * @note Allow random towns - */ -#define DF1_RANDOM_TOWNS 0x01000000L -/** @def DF1_DOUBLE - * @note Generates everything at double size like Helcaraxe and Erebor - */ -#define DF1_DOUBLE 0x02000000L -/** @def DF1_LIFE_LEVEL - * @note Creates dungeon level on modified 'game of life' algorithm - */ -#define DF1_LIFE_LEVEL 0x04000000L -/** @def DF1_EVOLVE - * @note Evolving, pulsing levels like Heart of the Earth - */ -#define DF1_EVOLVE 0x08000000L -/** @def DF1_ADJUST_LEVEL_1 - * @note Minimum monster level will be equal to dungeon level - */ -#define DF1_ADJUST_LEVEL_1 0x10000000L -/** @def DF1_ADJUST_LEVEL_2 - * @note Minimum monster level will be double the dungeon level - */ -#define DF1_ADJUST_LEVEL_2 0x20000000L -/** @def DF1_NO_RECALL - * @note No recall allowed - */ -#define DF1_NO_RECALL 0x40000000L -/** @def DF1_NO_STREAMERS - * @note No streamers - */ -#define DF1_NO_STREAMERS 0x80000000L -/** @} */ - -/** @name Dungeon Type Flags (part 2) - * @{ */ - -/** @def DF2_ADJUST_LEVEL_1_2 - * @note Minimum monster level will be half the dungeon level - */ -#define DF2_ADJUST_LEVEL_1_2 0x00000001L - -/** @def DF2_NO_SHAFT - * @note No shafts - */ -#define DF2_NO_SHAFT 0x00000002L - -/** @def DF2_ADJUST_LEVEL_PLAYER - * @note Uses player level*2 instead of dungeon level for other ADJUST_LEVEL flags - */ -#define DF2_ADJUST_LEVEL_PLAYER 0x00000004L - -/** @def DF2_NO_TELEPORT */ -#define DF2_NO_TELEPORT 0x00000008L - -/** @def DF2_ASK_LEAVE */ -#define DF2_ASK_LEAVE 0x00000010L - -/** @def DF2_NO_STAIR */ -#define DF2_NO_STAIR 0x00000020L - -/** @def DF2_SPECIAL */ -#define DF2_SPECIAL 0x00000040L - -/** @def DF2_NO_NEW_MONSTER */ -#define DF2_NO_NEW_MONSTER 0x00000080L - -/** @def DF2_DESC */ -#define DF2_DESC 0x00000100L - -/** @def DF2_NO_GENO */ -#define DF2_NO_GENO 0x00000200L - -/** @def DF2_NO_BREATH - * @note Oups, cannot breath here - */ -#define DF2_NO_BREATH 0x00000400L - -/** @def DF2_WATER_BREATH - * @note Oups, cannot breath here, need water breathing - */ -#define DF2_WATER_BREATH 0x00000800L - -/** @def DF2_ELVEN - * @note Try to create elven monster ego - */ -#define DF2_ELVEN 0x00001000L - -/** @def DF2_DWARVEN - * @note Try to create dwarven monster ego - */ -#define DF2_DWARVEN 0x00002000L - -/** @def DF2_NO_EASY_MOVE - * @note Forbid stuff like teleport level, probability travel, ... - */ -#define DF2_NO_EASY_MOVE 0x00004000L - -/** @def DF2_NO_RECALL_OUT - * @note Cannot recall out of the place - */ -#define DF2_NO_RECALL_OUT 0x00008000L - -/** @def DF2_DESC_ALWAYS - * @note Always shows the desc - */ -#define DF2_DESC_ALWAYS 0x00010000L -/** @} */ - -/** @var level_flags1; - * @brief Number - */ -extern u32b dungeon_flags1@level_flags1; - -/** @var level_flags2; - * @brief Number - */ -extern u32b dungeon_flags2@level_flags2; - -/** @def MAX_HGT - * @note Maximum dungeon height in grids, must be a multiple of SCREEN_HGT, - * probably hard-coded to SCREEN_HGT * 3. - */ -#define MAX_HGT 66 - - -/** @def MAX_WID - * @note Maximum dungeon width in grids, must be a multiple of SCREEN_WID, - * probably hard-coded to SCREEN_WID * 3. - */ -#define MAX_WID 198 - - -/** @name Town Defines - * @{ */ - -/** @def TOWN_RANDOM - * @note First random town - */ -#define TOWN_RANDOM 20 - -/** @def TOWN_DUNGEON - * @note Maximun number of towns per dungeon - */ -#define TOWN_DUNGEON 4 - -/** @def TOWN_CHANCE - * @note Chance of 1 town - */ -#define TOWN_CHANCE 50 - -/** @} */ - -/** @name Wilderness Terrains - * @{ - */ - -/** @def TERRAIN_EDGE - * @note Edge of the World - */ -#define TERRAIN_EDGE 0 - -/** @def TERRAIN_TOWN - * @note Town - */ -#define TERRAIN_TOWN 1 - -/** @def TERRAIN_DEEP_WATER - * @note Deep water - */ -#define TERRAIN_DEEP_WATER 2 - -/** @def TERRAIN_SHALLOW_WATER - * @note Shallow water - */ -#define TERRAIN_SHALLOW_WATER 3 - -/** @def TERRAIN_SWAMP - * @note Swamp - */ -#define TERRAIN_SWAMP 4 - -/** @def TERRAIN_DIRT - * @note Dirt - */ -#define TERRAIN_DIRT 5 - -/** @def TERRAIN_GRASS - * @note Grass - */ -#define TERRAIN_GRASS 6 - -/** @def TERRAIN_TREES - * @note Trees - */ -#define TERRAIN_TREES 7 - -/** @def TERRAIN_DESERT - * @note Desert - */ -#define TERRAIN_DESERT 8 - -/** @def TERRAIN_SHALLOW_LAVA - * @note Shallow lava - */ -#define TERRAIN_SHALLOW_LAVA 9 - -/** @def TERRAIN_DEEP_LAVA - * @note Deep lava - */ -#define TERRAIN_DEEP_LAVA 10 - -/** @def TERRAIN_MOUNTAIN - * @note Mountain - */ -#define TERRAIN_MOUNTAIN 11 - -/** @def MAX_WILD_TERRAIN */ -#define MAX_WILD_TERRAIN 18 -/** @} */ - -/** @struct border_type - * @note Border - */ -struct border_type -{ - /** @structvar north[MAX_WID] - * @brief Number - */ - byte north[MAX_WID]; - - /** @structvar south[MAX_WID] - * @brief Number - */ - byte south[MAX_WID]; - - /** @structvar east[MAX_HGT] - * @brief Number - */ - byte east[MAX_HGT]; - - /** @structvar west[MAX_HGT] - * @brief Number - */ - byte west[MAX_HGT]; - - /** @structvar north_west - * @brief Number - */ - byte north_west; - - /** @structvar north_east - * @brief Number - */ - byte north_east; - - /** @structvar south_west - * @brief Number - */ - byte south_west; - - /** @structvar south_east - * @brief Number - */ - byte south_east; -}; - - -/** @struct wilderness_type_info - * @note A structure describing a wilderness area - * with a terrain, a town or a dungeon entrance - */ -struct wilderness_type_info -{ - /** @structvar name - * @brief Number - * @note Name (offset) - */ - u32b name; - - /** @structvar text - * @brief Number - * @note Text (offset) - */ - u32b text; - - /** @structvar entrance - * @brief Number - * @note Which town is there(<1000 i's a town, >=1000 it a dungeon) - */ - u16b entrance; - - /** @structvar road - * @brief Number - * @note Flags of road - */ - byte road; - - /** @structvar level - * @brief Number - * @note Difficulty level - */ - int level; - - /** @structvar flags1 - * @brief Number - * @note Some flags - */ - u32b flags1; - - /** @structvar feat - * @brief Number - * @note The feature of f_info.txt that is used to allow passing, ... and to get a char/color/graph - */ - byte feat; - - /** @structvar terrain_idx - * @brief Number - * @note Terrain index(defined in defines.h) - */ - byte terrain_idx; - - /** @structvar terrain[MAX_WILD_TERRAIN] - * @brief Number - * @note Feature types for the plasma generator - */ - byte terrain[MAX_WILD_TERRAIN]; -}; - -/** @struct wilderness_map - * @note A structure describing a wilderness map - */ -struct wilderness_map -{ - /** @structvar feat - * @brief Number - * @note Wilderness feature - */ - int feat; - - /** @structvar seed - * @brief Number - * @note Seed for the RNG - */ - u32b seed; - - /** @structvar entrance - * @brief Number - * @note Entrance for dungeons - */ - u16b entrance; - - /** @structvar known - * @brief Boolean - * @note Is it seen by the player ? - */ - bool known; -}; - - -/** @struct town_type - * @note A structure describing a town with - * stores and buildings - */ -struct town_type -{ - /** @structvar name - * @brief String - */ - cptr name; - - /** @structvar seed - * @brief Number - * @note Seed for RNG - */ - u32b seed; - - /** @structvar *store - * @brief store_type - * @note The stores [max_st_idx] - */ - store_type store[max_st_idx]; - - /** @structvar numstores - * @brief Number - */ - byte numstores; - - /** @structvar flags - * @brief Number - * @note Town flags - */ - byte flags; - - /** @structvar stocked - * @brief Boolean - * @note Is the town actually stocked ? - * Left this for the sake of compatibility - */ - bool stocked; - - /** @structvar destroyed - * @brief Boolean - * @note Is the town destroyed? - */ - bool destroyed; -}; - -/** @var max_towns - * @brief Number - */ -extern u16b max_towns; - -/** @var town_info[max_towns] - * @brief town_type - */ -extern town_type town_info[max_towns]; - -/** @struct rule_type - * Define monster generation rules - */ -struct rule_type -{ - /** @structvar mode - * @brief Number - * @note Mode of combination of the monster flags - */ - byte mode; - - /** @structvar percent - * @brief Number - * @note Percent of monsters affected by the rule - */ - byte percent; - - /** @structvar mflags1 - * @brief Number - * @note The monster flags that are allowed - */ - u32b mflags1; - - /** @structvar mflags2 - * @brief Number - */ - u32b mflags2; - - /** @structvar mflags3 - * @brief Number - */ - u32b mflags3; - - /** @structvar mflags4 - * @brief Number - */ - u32b mflags4; - - /** @structvar mflags5 - * @brief Number - */ - u32b mflags5; - - /** @structvar mflags6 - * @brief Number - */ - u32b mflags6; - - /** @structvar mflags7 - * @brief Number - */ - u32b mflags7; - - /** @structvar mflags8 - * @brief Number - */ - u32b mflags8; - - /** @structvar mflags9 - * @brief Number - */ - u32b mflags9; - - /** @structvar r_char[5] - * @brief String - * @note Monster race allowed - */ - char r_char[5]; -}; - -/** @struct obj_theme - * @brief "Themed" objects. - * @note Probability in percent for each class of objects to be dropped. - * This could perhaps be an array - but that wouldn't be as clear. - */ -struct obj_theme -{ - /** @structvar treasure - * @brief Number - */ - byte treasure; - - /** @structvar combat - * @brief Number - */ - byte combat; - - /** @structvar magic - * @brief Number - */ - byte magic; - - /** @structvar tools - * @brief Number - */ - byte tools; -}; - -/** @struct dungeon_info_type - * A structure for the != dungeon types - */ -struct dungeon_info_type -{ - /** @structvar name - * @brief Number - * @note Name - */ - u32b name; - - /** @structvar text - * @brief Number - * @note Description - */ - u32b text; - - /** @structvar short_name[3] - * @brief String - * @note Short name - */ - char short_name[3]; - - /** @structvar floor1 - * @brief Number - * @note Floor tile 1 - */ - s16b floor1; - - /** @structvar floor_percent1[2] - * @brief Number - * @note Chance of type 1 - */ - byte floor_percent1[2]; - - /** @structvar floor2 - * @brief Number - * @note Floor tile 2 - */ - s16b floor2; - - /** @structvar floor_percent2[2] - * @brief Number - * @note Chance of type 2 - */ - byte floor_percent2[2]; - - /** @structvar floor3 - * @brief Number - * @note Floor tile 3 - */ - s16b floor3; - - /** @structvar floor_percent3[2] - * @brief Number - * @note Chance of type 3 - */ - byte floor_percent3[2]; - - /** @structvar outer_wall - * @brief Number - * @note Outer wall tile - */ - s16b outer_wall; - - /** @structvar inner_wall - * @brief Number - * @note Inner wall tile - */ - s16b inner_wall; - - /** @structvar fill_type1 - * @brief Number - * @note Cave tile 1 - */ - s16b fill_type1; - - /** @structvar fill_percent1[2] - * @brief Number - * @note Chance of type 1 - */ - byte fill_percent1[2]; - - /** @structvar fill_type2 - * @brief Number - * @note Cave tile 2 - */ - s16b fill_type2; - - /** @structvar fill_percent2[2] - * @brief Number - * @note Chance of type 2 - */ - byte fill_percent2[2]; - - /** @structvar fill_type3 - * @brief Number - * @note Cave tile 3 - */ - s16b fill_type3; - - /** @structvar fill_percent3[2] - * @brief Number - * @note Chance of type 3 - */ - byte fill_percent3[2]; - - /** @structvar fill_method - * @brief Number - * @note Smoothing parameter for the above - */ - byte fill_method; - - /** @structvar mindepth - * @brief Number - * @note Minimal depth - */ - s16b mindepth; - - /** @structvar maxdepth - * @brief Number - * @note Maximal depth - */ - s16b maxdepth; - - /** @structvar principal - * @brief Boolean - * @note If it's a part of the main dungeon - */ - bool principal; - - /** @structvar next - * @brief Number - * @note The next part of the main dungeon - */ - byte next; - - /** @structvar min_plev - * @brief Number - * @note Minimal plev needed to enter -- it's an anti-cheating mesure - */ - byte min_plev; - - /** @structvar min_m_alloc_level - * @brief Number - * @note Minimal number of monsters per level - */ - int min_m_alloc_level; - - /** @structvar max_m_alloc_chance - * @brief Number - * @note There is a 1/max_m_alloc_chance chance per round of creating a new monster - */ - int max_m_alloc_chance; - - /** @structvar flags1 - * @brief Number - * @note Flags 1 - */ - u32b flags1; - - /** @structvar flags2 - * @brief Number - * @note Flags 1 - */ - u32b flags2; - - /** @structvar size_x - * @brief Number - */ - int size_x; - - /** @structvar size_y - * @brief Number - * @note Desired numers of panels - */ - int size_y; - - /** @structvar rule_percents[100] - * @brief Number - * @note Flat rule percents - */ - byte rule_percents[100]; - - /** @structvar rules[5] - * @brief rule_type - * @note Monster generation rules - */ - rule_type rules[5]; - - /** @structvar final_object - * @brief Number - * @note The object you'll find at the bottom - */ - int final_object; - - /** @structvar final_artifact - * @brief Number - * @note The artifact you'll find at the bottom - */ - int final_artifact; - - /** @structvar final_guardian - * @brief Number - * @note The artifact's guardian. If an artifact is specified, then it's NEEDED - */ - int final_guardian; - - /** @structvar ix - * @brief Number - */ - int ix; - - /** @structvar iy - * @brief Number - */ - int iy; - - /** @structvar ox - * @brief Number - */ - int ox; - - /** @structvar oy - * @brief Number - * @note Wilderness coordinates of the entrance/output of the dungeon - */ - int oy; - - /** @structvar objs - * @brief obj_theme - * @note The drops type - */ - obj_theme objs; - - /** @structvar d_dice[4] - * @brief Number - * @note Number of dices - */ - int d_dice[4]; - - /** @structvar d_side[4] - * @brief Number - * @note Number of sides - */ - int d_side[4]; - - /** @structvar d_frequency[4] - * @brief Number - * @note Frequency of damage (1 is the minimum) - */ - int d_frequency[4]; - - /** @structvar d_type[4] - * @brief Number - * @note Type of damage - */ - int d_type[4]; - - /** @structvar t_idx[TOWN_DUNGEON] - * @brief Number - * @note The towns - */ - s16b t_idx[TOWN_DUNGEON]; - - /** @structvar t_level[TOWN_DUNGEON] - * @brief Number - * @note The towns levels - */ - s16b t_level[TOWN_DUNGEON]; - - /** @structvar t_num - * @brief Number - * @note Number of towns - */ - s16b t_num; -}; - -/** @var max_d_idx - * @brief Number - */ -extern u16b max_d_idx; - -/** @var d_info[max_d_idx] - * @brief dungeon_info_type - */ -extern dungeon_info_type d_info[max_d_idx]; - -/** @var *d_name - * @brief String - */ -extern char *d_name; - -/** @var *d_text - * @brief String - */ -extern char *d_text; - -/** @var max_wild_x - * @brief Number - */ -extern u16b max_wild_x; - -/** @var max_wild_y - * @brief Number - */ -extern u16b max_wild_y; - -/** @var max_wf_idx - * @brief Number - */ -extern u16b max_wf_idx; - -/** @var wf_info[max_wf_idx] - * @brief wilderness_type_info - */ -extern wilderness_type_info wf_info[max_wf_idx]; - -/** @var *wf_name - * @brief String - */ -extern char *wf_name; - -/** @var *wf_text - * @brief String - */ -extern char *wf_text; - -/** @var DUNGEON_DEATH - * @brief Number - */ -extern s32b DUNGEON_DEATH; - -/** @var current_dungeon_idx; - * @brief Number - */ -extern byte dungeon_type@current_dungeon_idx; - -/* - * tolua doesnt like wierd arraysn, I'll use accessing functions - * extern wilderness_map wild_map[max_wild_y][max_wild_x]; - */ -$static wilderness_map* lua_get_wild_map(int y, int x) { return &wild_map[y][x]; } - -/** @fn wild_map(int y, int x); - * @brief Return a map of the wilderness at coordinate (y,x).\n - * @param y Number \n y coordinate of wilderness map - * @brief Y-coordinate - * @param x Number \n x coordinate of wilderness map - * @brief X-coordinate - * @return wilderness_map \n map of wilderness at coordinate (y,x) - * @note (see file w_dun.c) - */ -wilderness_map* lua_get_wild_map@wild_map(int y, int x); - -/** @fn place_trap(int y, int x) - * @brief Place a random trap at the given location.\n - * @param y Number \n y coordinate of dungeon - * @brief Y-coordinate - * @param x Number \n x coordinate of dungeon - * @brief X-coordinate - * @note - * Places a random trap at the given location.\n - * The location must be a valid, empty, clean, floor grid. - * @note (see file traps.c) - */ -extern void place_trap(int y, int x); - -/** @fn place_floor(int y, int x) - * @brief Place floor terrain at (y, x).\n - * @param y Number \n y coordinate of dungeon - * @brief Y-coordinate - * @param x Number \n x coordinate of dungeon - * @brief X-coordinate - * @note - * Place floor terrain at (y, x) according to dungeon info. - * @note (see file cave.c) - */ -extern void place_floor(int y, int x); - -/** @fn place_filler(int y, int x) - * @brief Place a cave filler at (y, x).\n - * @param y Number \n y coordinate of dungeon - * @brief Y-coordinate - * @param x Number \n x coordinate of dungeon - * @brief X-coordinate - * @note (see file generate.c) - */ -extern void place_filler(int y, int x); - -/** @fn new_player_spot(int branch) - * @brief Places player in a new location.\n - * @param branch Number \n branch is the dungeon branch (if any). - * @brief Dungeon branch - * @return Boolean \n TRUE if player was placed successfully, otherwise FALSE. - * The global values py and px are updated. - * @note - * Up to 5000 attempts are made to place the player in the dungeon. The grid - * must be a naked floor and not an anti-teleport grid. In some circumstances - * stairs or ways in/out may be created under the player. - * @note (see file generate.c) - */ -extern bool new_player_spot(int branch); - -/** @fn get_level_desc(char *buf) - * @brief Return the special level desc.\n - * @param *buf String - * @brief Description - * @return *buf String \n The level description - * @return Boolean \n TRUE if a level description was returned, otherwise FALSE - * @note - * This is the 'D' line in the dngn files. - * @note (see file levels.c) - */ -extern bool get_level_desc(char *buf); - -/** @fn get_level_flags() - * These are the 'F' lines in the dngn files. - * @note (see file levels.c) - */ -extern void get_level_flags(); - -/** @fn get_dungeon_name(char *buf) - * @brief Return the special level name.\n - * @param *buf String - * @brief Name - * @return *buf String \n The level name - * @return Boolean \n TRUE if a level name was returned, otherwise FALSE - * @note - * This is the 'N' line in the dngn files. - * @note (see file levels.c) - */ -extern bool get_dungeon_name(char *buf); - -/** @fn get_dungeon_special(char *buf) - * @brief Return the map filename.\n - * @param *buf String - * @brief Map filename - * @return *buf String \n The map filename - * @return Boolean \n TRUE if a map filename was returned, otherwise FALSE - * @note - * This is the 'S' line in the dngn files. - * @note (see file levels.c) - */ -extern bool get_dungeon_special(char *buf); - -/** @fn get_command(const char *file, char comm, char *param) - * @brief Return the parameter of command "comm" in file "*file".\n - * @param *file String \n name of the dungeon file. - * @brief Dungeon file - * @param comm String \n The command \n - * 'A' = father branch, 'B' = branch, 'D' = desccription, 'L' = father level, - * 'N' = name, 'S' = savefile extension, 'U' = map filename - * @brief Command - * @param *param String - * @brief Parameter - * @return *param String \n The result of the command - * @return Boolean \n TRUE if a result is returned, otherwise FALSE - * @note (see file levels.c) - */ -extern bool get_command(const char *file, char comm, char *param); - -/** @fn get_branch() - * @brief return the dungeon branch starting form the current dungeon/level. - * @return Number \n The branch - * @note - * This is the 'B' line in the dngn files. - * @note (see file levels.c) - */ -extern int get_branch(); - -/** @fn get_fbranch() - * @brief Return the father dungeon branch. - * @return Number \n The father branch - * @note - * This is the 'A' line in the dngn files. - * @note (see file levels.c) - */ -extern int get_fbranch(); - -/** @fn get_flevel() - * @brief Return the father dungeon level. - * @return Number \n The father level - * @note - * This is the 'L' line in the dngn files. - * @note (see file levels.c) - */ -extern int get_flevel(); - -/** @fn get_dungeon_save(char *buf) - * @brief Return the extension of the savefile for the level.\n - * @param *buf String - * @brief Savefile extension - * @return *buf String \n The savefile extension - * @return Boolean \n TRUE if a savefile extension was returned, otherwise FALSE - * This is the 'S' line in the dngn files. - * @note (see file levels.c) - */ -extern bool get_dungeon_save(char *buf); diff --git a/src/externs.h b/src/externs.h index 71d7b393..f86014dd 100644 --- a/src/externs.h +++ b/src/externs.h @@ -2345,15 +2345,7 @@ extern bool_ easy_floor; /* script.c */ -extern void init_lua(void); extern void init_lua_init(void); -extern int exec_lua(char *file); -extern cptr string_exec_lua(char *file); -extern bool_ tome_dofile(char *file); -extern bool_ tome_dofile_anywhere(cptr dir, char *file, bool_ test_exist); -extern void dump_lua_stack(int min, int max); -extern bool_ call_lua(cptr function, cptr args, cptr ret, ...); -extern bool_ get_lua_var(cptr name, char type, void *arg); /* modules.c */ extern void module_reset_dir(cptr dir, cptr new_path); diff --git a/src/init2.c b/src/init2.c index 2f897d9b..8f20ecfc 100644 --- a/src/init2.c +++ b/src/init2.c @@ -2652,8 +2652,7 @@ void init_angband(void) wipe_hooks(); /* Initialise some other arrays */ - note("[Initialising lua scripting... (lua)]"); - init_lua(); + note("[Initialising scripting... (script)]"); init_lua_init(); /* Initialise skills info */ diff --git a/src/lauxlib.h b/src/lauxlib.h deleted file mode 100644 index 8b6db343..00000000 --- a/src/lauxlib.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -** $Id: lauxlib.h,v 1.4 2002/01/04 03:31:23 pelpel Exp $ -** Auxiliary functions for building Lua libraries -** See Copyright Notice in lua.h -*/ - - -#ifndef lauxlib_h -#define lauxlib_h - - -#include <stddef.h> -#include <stdio.h> - -#include "lua.h" - - -#ifndef LUALIB_API -#define LUALIB_API extern -#endif - - -struct luaL_reg { - const char *name; - lua_CFunction func; -}; - - -LUALIB_API void luaL_openlib (lua_State *L, const struct luaL_reg *l, int n); -LUALIB_API void luaL_argerror (lua_State *L, int numarg, const char *extramsg); -LUALIB_API const char *luaL_check_lstr (lua_State *L, int numArg, size_t *len); -LUALIB_API const char *luaL_opt_lstr (lua_State *L, int numArg, const char *def, size_t *len); -LUALIB_API long luaL_check_number (lua_State *L, int numArg); -LUALIB_API long luaL_opt_number (lua_State *L, int numArg, long def); - -LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg); -LUALIB_API void luaL_checktype (lua_State *L, int narg, int t); -LUALIB_API void luaL_checkany (lua_State *L, int narg); - -LUALIB_API void luaL_verror (lua_State *L, const char *fmt, ...); -LUALIB_API int luaL_findstring (const char *name, const char *const list[]); - - - -/* -** =============================================================== -** some useful macros -** =============================================================== -*/ - -#define luaL_arg_check(L, cond,numarg,extramsg) if (!(cond)) \ - luaL_argerror(L, numarg,extramsg) -#define luaL_check_string(L,n) (luaL_check_lstr(L, (n), NULL)) -#define luaL_opt_string(L,n,d) (luaL_opt_lstr(L, (n), (d), NULL)) -#define luaL_check_int(L,n) ((int)luaL_check_number(L, n)) -#define luaL_check_long(L,n) ((long)luaL_check_number(L, n)) -#define luaL_opt_int(L,n,d) ((int)luaL_opt_number(L, n,d)) -#define luaL_opt_long(L,n,d) ((long)luaL_opt_number(L, n,d)) -#define luaL_openl(L,a) luaL_openlib(L, a, (sizeof(a)/sizeof(a[0]))) - - -/* -** {====================================================== -** Generic Buffer manipulation -** ======================================================= -*/ - - -#ifndef LUAL_BUFFERSIZE -#define LUAL_BUFFERSIZE BUFSIZ -#endif - - -typedef struct luaL_Buffer { - char *p; /* current position in buffer */ - int level; - lua_State *L; - char buffer[LUAL_BUFFERSIZE]; -} luaL_Buffer; - -#define luaL_putchar(B,c) \ - ((void)((B)->p < &(B)->buffer[LUAL_BUFFERSIZE] || luaL_prepbuffer(B)), \ - (*(B)->p++ = (char)(c))) - -#define luaL_addsize(B,n) ((B)->p += (n)) - -LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B); -LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B); -LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l); -LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s); -LUALIB_API void luaL_addvalue (luaL_Buffer *B); -LUALIB_API void luaL_pushresult (luaL_Buffer *B); - - -/* }====================================================== */ - - -#endif - - diff --git a/src/lua/.gitignore b/src/lua/.gitignore deleted file mode 100644 index 26548e17..00000000 --- a/src/lua/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/liblua.a -/tolua diff --git a/src/lua/CMakeLists.txt b/src/lua/CMakeLists.txt deleted file mode 100644 index df2b30e7..00000000 --- a/src/lua/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -ADD_LIBRARY (lua STATIC - lapi.c lcode.c ldebug.c ldo.c lfunc.c lgc.c - llex.c lmem.c lobject.c lparser.c lstate.c lstring.c - ltable.c ltests.c ltm.c lundump.c lvm.c lzio.c - lauxlib.c lbaselib.c ldblib.c liolib.c lstrlib.c - tolua_lb.c tolua_rg.c tolua_tt.c tolua_tm.c tolua_gp.c - tolua_eh.c tolua_bd.c) - -ADD_EXECUTABLE(tolua tolua.c tolualua.c lua) - -TARGET_LINK_LIBRARIES(tolua lua) diff --git a/src/lua/array.lua b/src/lua/array.lua deleted file mode 100644 index 7929f8cd..00000000 --- a/src/lua/array.lua +++ /dev/null @@ -1,203 +0,0 @@ --- tolua: array class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1999 --- $Id: array.lua,v 1.2 2001/11/26 23:00:23 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - --- Array class --- Represents a extern array variable or a public member of a class. --- Stores all fields present in a declaration. -classArray = { - _base = classDeclaration, -} - -settag(classArray,tolua_tag) - --- Print method -function classArray:print (ident,close) - print(ident.."Array{") - print(ident.." mod = '"..self.mod.."',") - print(ident.." type = '"..self.type.."',") - print(ident.." ptr = '"..self.ptr.."',") - print(ident.." name = '"..self.name.."',") - print(ident.." def = '"..self.def.."',") - print(ident.." dim = '"..self.dim.."',") - print(ident.." ret = '"..self.ret.."',") - print(ident.."}"..close) -end - --- get variable value -function classArray:getvalue (class,static) - if class and static then - return class..'::'..self.name..'[toluaI_index]' - elseif class then - return 'self->'..self.name..'[toluaI_index]' - else - return self.name..'[toluaI_index]' - end -end - --- Write binding functions -function classArray:supcode () - local class = self:inclass() - - -- get function ------------------------------------------------ - if class then - output("/* get function:",self.name," of class ",class," */") - else - output("/* get function:",self.name," */") - end - self.cgetname = self:cfuncname("toluaI_get") - output("static int",self.cgetname,"(lua_State* tolua_S)") - output("{") - - -- declare index - output(' int toluaI_index;') - - -- declare self, if the case - local _,_,static = strfind(self.mod,'^%s*(static)') - if class and static==nil then - output(' ',class,'*','self;') - output(' lua_pushstring(tolua_S,".self");') - output(' lua_rawget(tolua_S,1);') - output(' self = ') - output('(',class,'*) ') - output('lua_touserdata(tolua_S,-1);') - elseif static then - _,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)') - end - - -- check index - output(' if (!tolua_istype(tolua_S,2,LUA_TNUMBER,0))') - output(' tolua_error(tolua_S,"invalid type in array indexing.");') - output(' toluaI_index = (int)tolua_getnumber(tolua_S,2,0)-1;') - output(' if (toluaI_index<0 || toluaI_index>='..self.dim..')') - output(' tolua_error(tolua_S,"array indexing out of range.");') - - -- return value - local t,ct = isbasic(self.type) - if t then - output(' tolua_push'..t..'(tolua_S,(',ct,')'..self:getvalue(class,static)..');') - else - if self.ptr == '&' or self.ptr == '' then - output(' tolua_pushusertype(tolua_S,(void*)&'..self:getvalue(class,static)..',',self.tag,');') - else - output(' tolua_pushusertype(tolua_S,(void*)'..self:getvalue(class,static)..',',self.tag,');') - end - end - output(' return 1;') - output('}') - output('\n') - - -- set function ------------------------------------------------ - if not strfind(self.mod,'const') then - if class then - output("/* set function:",self.name," of class ",class," */") - else - output("/* set function:",self.name," */") - end - self.csetname = self:cfuncname("toluaI_set") - output("static int",self.csetname,"(lua_State* tolua_S)") - output("{") - - -- declare index - output(' int toluaI_index;') - - -- declare self, if the case - local _,_,static = strfind(self.mod,'^%s*(static)') - if class and static==nil then - output(' ',class,'*','self;') - output(' lua_pushstring(tolua_S,".self");') - output(' lua_rawget(tolua_S,1);') - output(' self = ') - output('(',class,'*) ') - output('lua_touserdata(tolua_S,-1);') - elseif static then - _,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)') - end - - -- check index - output(' if (!tolua_istype(tolua_S,2,LUA_TNUMBER,0))') - output(' tolua_error(tolua_S,"invalid type in array indexing.");') - output(' toluaI_index = (int)tolua_getnumber(tolua_S,2,0)-1;') - output(' if (toluaI_index<0 || toluaI_index>='..self.dim..')') - output(' tolua_error(tolua_S,"array indexing out of range.");') - - -- assign value - local ptr = '' - if self.ptr~='' then ptr = '*' end - output(' ') - if class and static then - output(class..'::'..self.name..'[toluaI_index]') - elseif class then - output('self->'..self.name..'[toluaI_index]') - else - output(self.name..'[toluaI_index]') - end - local t = isbasic(self.type) - output(' = ') - if not t and ptr=='' then output('*') end - output('((',self.mod,self.type) - if not t then - output('*') - end - output(') ') - local def = 0 - if self.def ~= '' then def = self.def end - if t then - output('tolua_get'..t,'(tolua_S,3,',def,'));') - else - output('tolua_getusertype(tolua_S,3,',def,'));') - end - output(' return 0;') - output('}') - output('\n') - end - -end - -function classArray:register () - local parent = self:inclass() or self:inmodule() - if parent then - if self.csetname then - output(' tolua_tablearray(tolua_S,"'..parent..'","'..self.lname..'",'..self.cgetname..','..self.csetname..');') - else - output(' tolua_tablearray(tolua_S,"'..parent..'","'..self.lname..'",'..self.cgetname..',NULL);') - end - else - if self.csetname then - output(' tolua_globalarray(tolua_S,"'..self.lname..'",'..self.cgetname..','..self.csetname..');') - else - output(' tolua_globalarray(tolua_S,"'..self.lname..'",'..self.cgetname..',NULL);') - end - end -end - -function classArray:unregister () - if self:inclass()==nil and self:inmodule()==nil then - output(' lua_pushnil(tolua_S); lua_setglobal(tolua_S,"'..self.lname..'");') - end -end - - --- Internal constructor -function _Array (t) - t._base = classArray - settag(t,tolua_tag) - append(t) - return t -end - --- Constructor --- Expects a string representing the variable declaration. -function Array (s) - return _Array (Declaration(s,'var')) -end - - diff --git a/src/lua/basic.lua b/src/lua/basic.lua deleted file mode 100644 index 2bac463f..00000000 --- a/src/lua/basic.lua +++ /dev/null @@ -1,190 +0,0 @@ --- tolua: basic utility functions --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: basic.lua,v 1.2 2001/11/26 23:00:23 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - --- Basic C types and their corresponding Lua types --- All occurrences of "char*" will be replaced by "_cstring", --- and all occurrences of "void*" will be replaced by "_userdata" -_basic = { - ['void'] = '', - ['char'] = 'number', - ['int'] = 'number', - ['short'] = 'number', - ['long'] = 'number', - ['_cstring'] = 'string', - ['_userdata'] = 'userdata', - ['char*'] = 'string', - ['void*'] = 'userdata', - ['bool'] = 'bool', - ['LUA_VALUE'] = 'value', - ['byte'] = 'number', - ['s16b'] = 'number', - ['u16b'] = 'number', - ['s32b'] = 'number', - ['u32b'] = 'number', -} - -_basic_tag = { - ['void'] = '', - ['char'] = 'LUA_TNUMBER', - ['int'] = 'LUA_TNUMBER', - ['short'] = 'LUA_TNUMBER', - ['long'] = 'LUA_TNUMBER', - ['_cstring'] = 'LUA_TSTRING', - ['_userdata'] = 'LUA_TUSERDATA', - ['char*'] = 'LUA_TSTRING', - ['void*'] = 'LUA_TUSERDATA', - ['bool'] = 'tolua_tag(tolua_S,"bool")', - ['byte'] = 'LUA_TNUMBER', - ['s16b'] = 'LUA_TNUMBER', - ['u16b'] = 'LUA_TNUMBER', - ['s32b'] = 'LUA_TNUMBER', - ['u32b'] = 'LUA_TNUMBER', -} - -_basic_ctype = { - number = "long", - string = "const char*", - userdata = "void*", - bool = "int", -} - --- List of user defined types --- Each type corresponds to a variable name that stores its tag value. -_usertype = {} - --- Tag method to provide inheritance -function tolua_index (t,f) - if f == '_base' then -- to avoid loop - return tolua_old_index(t,f) - else - return t._base[f] - end -end - -tolua_tag = newtag() -tolua_old_index = settagmethod(tolua_tag,"index",tolua_index) - --- Error handler -function tolua_error (s) - local out = _OUTPUT - _OUTPUT = _STDERR - if strsub(s,1,1) == '#' then - write("\n** tolua: "..strsub(s,2)..".\n\n") - else - write("\n** tolua internal error: "..s..".\n\n") - return - end - - if _curr_code then - local _,_,s = strfind(_curr_code,"^%s*(.-\n)") -- extract first line - if s==nil then s = _curr_code end - s = gsub(s,"_userdata","void*") -- return with 'void*' - s = gsub(s,"_cstring","char*") -- return with 'char*' - write("Code being processed:\n"..s.."\n") - end - _OUTPUT = out -end - - -_ERRORMESSAGE = tolua_error - --- register an user defined type -function regtype (t) - if not istype(t) then - _usertype[t] = t - end - return t -end - --- return tag name -function tagvar(type,const) - if type == '' or type == 'void' then - return type,0 - else - local m,t = findtypedef(type) - if isbasic(t) then - return t, _basic_tag[t] - end - if strfind(m,'const') then const = 'const' end - regtype(t) - if const and const ~= '' then - t = 'const '..t - end - return t,'tolua_tag(tolua_S,"'..t..'")' - end -end - --- check if basic type -function isbasic (type) - local m,t = findtypedef(type) - local b = _basic[t] - if b then - return b,_basic_ctype[b] - end - return nil -end - --- check if type -function istype (t) - return _basic[t] or _usertype[t] or istypedef(t) -end - - --- split string using a token -function split (s,t) - local l = {n=0} - local f = function (s) - %l.n = %l.n + 1 - %l[%l.n] = s - end - local p = "%s*(.-)%s*"..t.."%s*" - s = gsub(s,"^%s+","") - s = gsub(s,"%s+$","") - s = gsub(s,p,f) - l.n = l.n + 1 - l[l.n] = gsub(s,"(%s%s*)$","") - return l -end - - --- concatenate strings of a table -function concat (t,f,l) - local s = '' - local i=f - while i<=l do - s = s..t[i] - i = i+1 - if i <= l then s = s..' ' end - end - return s -end - --- output line -function output (...) - local i=1 - while i<=arg.n do - if _cont and not strfind(_cont,'[%(,"]') and - strfind(arg[i],"^[%a_~]") then - write(' ') - end - write(arg[i]) - if arg[i] ~= '' then - _cont = strsub(arg[i],-1,-1) - end - i = i+1 - end - if strfind(arg[arg.n],"[%/%)%;%{%}]$") then - _cont=nil write('\n') - end -end - - diff --git a/src/lua/class.lua b/src/lua/class.lua deleted file mode 100644 index 01385178..00000000 --- a/src/lua/class.lua +++ /dev/null @@ -1,85 +0,0 @@ --- tolua: class class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: class.lua,v 1.2 2001/11/26 23:00:23 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - --- Class class --- Represents a class definition. --- Stores the following fields: --- name = class name --- base = class base, if any (only single inheritance is supported) --- {i} = list of members -classClass = { - _base = classContainer, - type = 'class', - name = '', - base = '', -} -settag(classClass,tolua_tag) - - --- register class -function classClass:register () - output(' tolua_cclass(tolua_S,"'..self.name..'","'..self.base..'");') - local i=1 - while self[i] do - self[i]:register() - i = i+1 - end -end - --- unregister class -function classClass:unregister () - output(' lua_pushnil(tolua_S); lua_setglobal(tolua_S,"'..self.name..'");') -end - --- output tags -function classClass:decltag () - self.itype,self.tag = tagvar(self.name); - self.citype,self.ctag = tagvar(self.name,'const'); - local i=1 - while self[i] do - self[i]:decltag() - i = i+1 - end -end - - --- Print method -function classClass:print (ident,close) - print(ident.."Class{") - print(ident.." name = '"..self.name.."',") - print(ident.." base = '"..self.base.."';") - local i=1 - while self[i] do - self[i]:print(ident.." ",",") - i = i+1 - end - print(ident.."}"..close) -end - --- Internal constructor -function _Class (t) - t._base = classClass - settag(t,tolua_tag) - append(t) - return t -end - --- Constructor --- Expects the name, the base and the body of the class. -function Class (n,p,b) - local c = _Class(_Container{name=n, base=p}) - push(c) - c:parse(strsub(b,2,strlen(b)-1)) -- eliminate braces - pop() -end - - diff --git a/src/lua/clean.lua b/src/lua/clean.lua deleted file mode 100644 index ba08d534..00000000 --- a/src/lua/clean.lua +++ /dev/null @@ -1,74 +0,0 @@ --- mark up comments and strings -STR1 = "\001" -STR2 = "\002" -STR3 = "\003" -STR4 = "\004" -REM = "\005" -ANY = "([\001-\005])" -ESC1 = "\006" -ESC2 = "\007" - -MASK = { -- the substitution order is important - {ESC1, "\\'"}, - {ESC2, '\\"'}, - {STR1, "'"}, - {STR2, '"'}, - {STR3, "%[%["}, - {STR4, "%]%]"}, - {REM , "%-%-"}, -} - -function mask (s) - for i = 1,getn(MASK) do - s = gsub(s,MASK[i][2],MASK[i][1]) - end - return s -end - -function unmask (s) - for i = 1,getn(MASK) do - s = gsub(s,MASK[i][1],MASK[i][2]) - end - return s -end - -function clean (s) - -- check for compilation error - local code = "return function () " .. s .. " end" - if not dostring(code) then - return nil - end - - local S = "" -- saved string - - s = mask(s) - - -- remove blanks and comments - while 1 do - local b,e,d = strfind(s,ANY) - if b then - S = S..strsub(s,1,b-1) - s = strsub(s,b+1) - if d==STR1 or d==STR2 then - e = strfind(s,d) - S = S ..d..strsub(s,1,e) - s = strsub(s,e+1) - elseif d==STR3 then - e = strfind(s,STR4) - S = S..d..strsub(s,1,e) - s = strsub(s,e+1) - elseif d==REM then - s = gsub(s,"[^\n]*(\n?)","%1",1) - end - else - S = S..s - break - end - end - -- eliminate unecessary spaces - S = gsub(S,"[ \t]+"," ") - S = gsub(S,"[ \t]*\n[ \t]*","\n") - S = unmask(S) - return S -end - diff --git a/src/lua/code.lua b/src/lua/code.lua deleted file mode 100644 index 08f38ad2..00000000 --- a/src/lua/code.lua +++ /dev/null @@ -1,73 +0,0 @@ --- tolua: code class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1999 --- $Id: code.lua,v 1.2 2001/11/26 23:00:23 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - --- Code class --- Represents Lua code to be compiled and included --- in the initialization function. --- The following fields are stored: --- text = text code -classCode = { - text = '', - _base = classFeature, -} -settag(classCode,tolua_tag) - --- register code -function classCode:register () - -- clean Lua code - local s = clean(self.text) - if not s then - error("parser error in embedded code") - end - - -- convert to C - output('\n { /* begin embedded lua code */\n') - output(' static unsigned char B[] = {\n ') - local t={n=0} - local b = gsub(s,'(.)',function (c) - local e = '' - %t.n=%t.n+1 if %t.n==15 then %t.n=0 e='\n ' end - return format('%3u,%s',strbyte(c),e) - end - ) - output(b..strbyte(" ")) - output('\n };\n') - output(' lua_dobuffer(tolua_S,(char*)B,sizeof(B),"tolua: embedded Lua code");') - output(' } /* end of embedded lua code */\n\n') -end - - --- Print method -function classCode:print (ident,close) - print(ident.."Code{") - print(ident.." text = [["..self.text.."]],") - print(ident.."}"..close) -end - - --- Internal constructor -function _Code (t) - t._base = classCode - settag(t,tolua_tag) - append(t) - return t -end - --- Constructor --- Expects a string representing the code text -function Code (l) - return _Code { - text = l - } -end - - diff --git a/src/lua/container.lua b/src/lua/container.lua deleted file mode 100644 index cbbf11c1..00000000 --- a/src/lua/container.lua +++ /dev/null @@ -1,311 +0,0 @@ --- tolua: container abstract class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: container.lua,v 1.2 2001/11/26 23:00:23 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - --- Container class --- Represents a container of features to be bound --- to lua. -classContainer = -{ - curr = nil, - _base = classFeature, -} -settag(classContainer,tolua_tag) - --- output tags -function classContainer:decltag () - push(self) - local i=1 - while self[i] do - self[i]:decltag() - i = i+1 - end - pop() -end - - --- write support code -function classContainer:supcode () - push(self) - local i=1 - while self[i] do - self[i]:supcode() - i = i+1 - end - pop() -end - - --- Internal container constructor -function _Container (self) - self._base = classContainer - settag(self,tolua_tag) - self.n = 0 - self.typedefs = {n=0} - self.lnames = {} - return self -end - --- push container -function push (t) - classContainer.curr = t -end - --- pop container -function pop () - classContainer.curr = classContainer.curr.parent -end - --- append to current container -function append (t) - return classContainer.curr:append(t) -end - --- append typedef to current container -function appendtypedef (t) - return classContainer.curr:appendtypedef(t) -end - --- substitute typedef -function findtypedef (type) - return classContainer.curr:findtypedef(type) -end - --- check if is typedef -function istypedef (type) - return classContainer.curr:istypedef(type) -end - --- append feature to container -function classContainer:append (t) - self.n = self.n + 1 - self[self.n] = t - t.parent = self -end - --- append typedef -function classContainer:appendtypedef (t) - self.typedefs.n = self.typedefs.n + 1 - self.typedefs[self.typedefs.n] = t -end - --- determine lua function name overload -function classContainer:overload (lname) - if not self.lnames[lname] then - self.lnames[lname] = 0 - else - self.lnames[lname] = self.lnames[lname] + 1 - end - return format("%02d",self.lnames[lname]) -end - -function classContainer:findtypedef (type) - local env = self - while env do - if env.typedefs then - local i=1 - while env.typedefs[i] do - if env.typedefs[i].utype == type then - local mod1,type1 = env.typedefs[i].mod,env.typedefs[i].type - local mod2,type2 = findtypedef(type1) - return mod2..' '..mod1,type2 - end - i = i+1 - end - end - env = env.parent - end - return '',type -end - -function classContainer:istypedef (type) - local env = self - while env do - if env.typedefs then - local i=1 - while env.typedefs[i] do - if env.typedefs[i].utype == type then - return 1 - end - i = i+1 - end - end - env = env.parent - end - return nil -end - --- parse chunk -function classContainer:doparse (s) - - -- try module - do - local b,e,name,body = strfind(s,"^%s*module%s%s*([_%w][_%w]*)%s*(%b{})%s*") - if b then - _curr_code = strsub(s,b,e) - Module(name,body) - return strsub(s,e+1) - end - end - - -- try define - do - local b,e,name = strfind(s,"^%s*#define%s%s*([^%s]*)[^\n]*\n%s*") - if b then - _curr_code = strsub(s,b,e) - Define(name) - return strsub(s,e+1) - end - end - - -- try enumerates - do - local b,e,body = strfind(s,"^%s*enum[^{]*(%b{})%s*;?%s*") - if b then - _curr_code = strsub(s,b,e) - Enumerate(body) - return strsub(s,e+1) - end - end - - do - local b,e,body,name = strfind(s,"^%s*typedef%s%s*enum[^{]*(%b{})%s*([%w_][^%s]*)%s*;%s*") - if b then - _curr_code = strsub(s,b,e) - Enumerate(body) - Typedef("int "..name) - return strsub(s,e+1) - end - end - - -- try operator - do - local b,e,decl,kind,arg,const = strfind(s,"^%s*([_%w][_%w%s%*&]*operator)%s*([^%s][^%s]*)%s*(%b())%s*(c?o?n?s?t?)%s*;%s*") - if b then - _curr_code = strsub(s,b,e) - Operator(decl,kind,arg,const) - return strsub(s,e+1) - end - end - - -- try function - do - local b,e,decl,arg,const = strfind(s,"^%s*([~_%w][_@%w%s%*&]*[_%w])%s*(%b())%s*(c?o?n?s?t?)%s*=?%s*0?%s*;%s*") - if not b then - -- try a single letter function name - b,e,decl,arg,const = strfind(s,"^%s*([_%w])%s*(%b())%s*(c?o?n?s?t?)%s*;%s*") - end - if b then - _curr_code = strsub(s,b,e) - Function(decl,arg,const) - return strsub(s,e+1) - end - end - - -- try inline function - do - local b,e,decl,arg,const = strfind(s,"^%s*([~_%w][_@%w%s%*&]*[_%w])%s*(%b())%s*(c?o?n?s?t?)%s*%b{}%s*") - if not b then - -- try a single letter function name - b,e,decl,arg,const = strfind(s,"^%s*([_%w])%s*(%b())%s*(c?o?n?s?t?)%s*%b{}%s*") - end - if b then - _curr_code = strsub(s,b,e) - Function(decl,arg,const) - return strsub(s,e+1) - end - end - - -- try class - do - local b,e,name,base,body = strfind(s,"^%s*class%s*([_%w][_%w]*)%s*(.-)%s*(%b{})%s*;%s*") - if not b then - b,e,name,base,body = strfind(s,"^%s*struct%s*([_%w][_%w]*)%s*(.-)%s*(%b{})%s*;%s*") - if not b then - base = '' - b,e,body,name = strfind(s,"^%s*typedef%s%s*struct%s%s*[_%w]*%s*(%b{})%s*([_%w][_%w]*)%s*;%s*") - end - end - if b then - if base ~= '' then - local b,e - b,e,base = strfind(base,".-([_%w][_%w]*)$") - end - _curr_code = strsub(s,b,e) - Class(name,base,body) - return strsub(s,e+1) - end - end - - -- try typedef - do - local b,e,types = strfind(s,"^%s*typedef%s%s*(.-)%s*;%s*") - if b then - _curr_code = strsub(s,b,e) - Typedef(types) - return strsub(s,e+1) - end - end - - -- try variable - do - local b,e,decl = strfind(s,"^%s*([_%w][_@%s%w%d%*&]*[_%w%d])%s*;%s*") - if b then - _curr_code = strsub(s,b,e) - Variable(decl) - return strsub(s,e+1) - end - end - - -- try array - do - local b,e,decl = strfind(s,"^%s*([_%w][][_@%s%w%d%*&%-%>]*[]_%w%d])%s*;%s*") - if b then - _curr_code = strsub(s,b,e) - Array(decl) - return strsub(s,e+1) - end - end - - -- try code - do - local b,e,code = strfind(s,"^%s*(%b\1\2)") - if b then - Code(strsub(code,2,-2)) - return strsub(s,e+1) - end - end - - -- try verbatim - do - local b,e,line = strfind(s,"^%s*%$(.-\n)") - if b then - Verbatim(line) - return strsub(s,e+1) - end - end - - -- no matching - if gsub(s,"%s%s*","") ~= "" then - _curr_code = s - error("#parse error") - else - return "" - end -end - -function classContainer:parse (s) - while s ~= '' do - s = self:doparse(s) - end -end - - diff --git a/src/lua/declaration.lua b/src/lua/declaration.lua deleted file mode 100644 index e4d5c688..00000000 --- a/src/lua/declaration.lua +++ /dev/null @@ -1,399 +0,0 @@ --- tolua: declaration class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: declaration.lua,v 1.2 2001/11/26 23:00:23 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - --- Declaration class --- Represents variable, function, or argument declaration. --- Stores the following fields: --- mod = type modifiers --- type = type --- ptr = "*" or "&", if representing a pointer or a reference --- name = name --- dim = dimension, if a vector --- def = default value, if any (only for arguments) --- ret = "*" or "&", if value is to be returned (only for arguments) -classDeclaration = { - _base = classFeature, - mod = '', - type = '', - ptr = '', - name = '', - dim = '', - ret = '', - def = '' -} -settag(classDeclaration,tolua_tag) - --- Create an unique variable name -function create_varname () - if not _varnumber then _varnumber = 0 end - _varnumber = _varnumber + 1 - return "tolua_var_".._varnumber -end - --- Check declaration name --- It also identifies default values -function classDeclaration:checkname () - - if strsub(self.name,1,1) == '[' and not istype(self.type) then - self.name = self.type..self.name - local m = split(self.mod,'%s%s*') - self.type = m[m.n] - self.mod = concat(m,1,m.n-1) - end - - local t = split(self.name,'=') - if t.n==2 then - self.name = t[1] - self.def = t[t.n] - end - - local b,e,d = strfind(self.name,"%[(.-)%]") - if b then - self.name = strsub(self.name,1,b-1) - self.dim = d - end - - - if self.type ~= '' and self.type ~= 'void' and self.name == '' then - self.name = create_varname() - elseif self.kind=='var' then - if self.type=='' and self.name~='' then - self.type = self.type..self.name - self.name = create_varname() - elseif istype(self.name) then - if self.type=='' then self.type = self.name - else self.type = self.type..' '..self.name end - self.name = create_varname() - end - end - -end - --- Check declaration type --- Substitutes typedef's. -function classDeclaration:checktype () - - -- check if there is a pointer to basic type - if isbasic(self.type) and self.ptr~='' then - self.ret = self.ptr - self.ptr = nil - end - - -- check if there is array to be returned - if self.dim~='' and self.ret~='' then - error('#invalid parameter: cannot return an array of values') - end - - -- register type - if self.type~='' then - regtype(self.type) - end - - -- restore 'void*' and 'string*' - if self.type == '_userdata' then self.type = 'void*' - elseif self.type == '_cstring' then self.type = 'char*' - end - --- --- -- if returning value, automatically set default value --- if self.ret ~= '' and self.def == '' then --- self.def = '0' --- end --- - -end - --- Print method -function classDeclaration:print (ident,close) - print(ident.."Declaration{") - print(ident.." mod = '"..self.mod.."',") - print(ident.." type = '"..self.type.."',") - print(ident.." ptr = '"..self.ptr.."',") - print(ident.." name = '"..self.name.."',") - print(ident.." dim = '"..self.dim.."',") - print(ident.." def = '"..self.def.."',") - print(ident.." ret = '"..self.ret.."',") - print(ident.."}"..close) -end - --- declare tag -function classDeclaration:decltag () - self.itype, self.tag = tagvar(self.type,strfind(self.mod,'const')) -end - - --- output type checking -function classDeclaration:outchecktype (narg) - local tag, def - if self.dim ~= '' then - tag = 'LUA_TTABLE' - def = 0 - else - tag = self.tag - def = self.def~='' or 0 - end - return 'tolua_istype(tolua_S,'..narg..','..tag..','..def..')' -end - --- Declare variable -function classDeclaration:declare (narg) - local ptr = '' - if self.ptr~='' then ptr = '*' end - output(" ",self.mod,self.type,ptr) - if self.dim ~= '' and tonumber(self.dim)==nil then - output('*') - end - output(self.name) - if self.dim ~= '' then - if tonumber(self.dim)~=nil then - output('[',self.dim,'];') - else - output(' = (',self.mod,self.type,ptr,'*)', - 'malloc(',self.dim,'*sizeof(',self.type,ptr,'));') - end - else - local t = isbasic(self.type) - output(' = ') - if not t and ptr=='' then output('*') end - output('((',self.mod,self.type) - if not t then - output('*') - end - output(') ') - local def = 0 - if self.def ~= '' then def = self.def end - if t then - output('tolua_get'..t,'(tolua_S,',narg,',',def,'));') - else - output('tolua_getusertype(tolua_S,',narg,',',def,'));') - end - end -end - --- Get parameter value -function classDeclaration:getarray (narg) - if self.dim ~= '' then - output(' {') - local def = self.def~='' or 0 - output(' if (!tolua_arrayistype(tolua_S,',narg,',',self.tag,',',self.dim,',',def,'))') - output(' goto tolua_lerror;') - output(' else\n') - output(' {') - output(' int i;') - output(' for(i=0; i<'..self.dim..';i++)') - local t = isbasic(self.type) - local ptr = '' - if self.ptr~='' then ptr = '*' end - output(' ',self.name..'[i] = ') - if not t and ptr=='' then output('*') end - output('((',self.mod,self.type) - if not t then - output('*') - end - output(') ') - local def = 0 - if self.def ~= '' then def = self.def end - if t then - output('tolua_getfield'..t..'(tolua_S,',narg,',i+1,',def,'));') - else - output('tolua_getfieldusertype(tolua_S,',narg,',i+1,',def,'));') - end - output(' }') - output(' }') - end -end - --- Get parameter value -function classDeclaration:setarray (narg) - if self.dim ~= '' then - output(' {') - output(' int i;') - output(' for(i=0; i<'..self.dim..';i++)') - local t,ct = isbasic(self.type) - if t then - output(' tolua_pushfield'..t..'(tolua_S,',narg,',i+1,(',ct,')',self.name,'[i]);') - else - if self.ptr == '' then - output(' {') - output('#ifdef __cplusplus\n') - output(' void* toluaI_clone = new',self.type,'(',self.name,'[i]);') - output('#else\n') - output(' void* toluaI_clone = tolua_copy(tolua_S,(void*)&',self.name,'[i],sizeof(',self.type,'));') - output('#endif\n') - output(' tolua_pushfieldusertype(tolua_S,',narg,',i+1,tolua_doclone(tolua_S,toluaI_clone,',self.tag,'),',self.tag,');') - output(' }') - - --output(' tolua_pushfieldclone(tolua_S,',narg,',i+1,(void*)&',self.name,'[i],sizeof(',self.type,'),',self.tag,');') - else - output(' tolua_pushfieldusertype(tolua_S,',narg,',i+1,(void*)',self.name,'[i],',self.tag,');') - end - end - output(' }') - end -end - --- Free dynamically allocated array -function classDeclaration:freearray () - if self.dim ~= '' and tonumber(self.dim)==nil then - output(' free(',self.name,');') - end -end - --- Pass parameter -function classDeclaration:passpar () - if self.ptr=='&' then - output('*'..self.name) - elseif self.ret=='*' then - output('&'..self.name) - else - output(self.name) - end -end - --- Return parameter value -function classDeclaration:retvalue () - if self.ret ~= '' then - local t,ct = isbasic(self.type) - if t then - output(' tolua_push'..t..'(tolua_S,(',ct,')'..self.name..');') - else - output(' tolua_pushusertype(tolua_S,(void*)'..self.name..',',self.tag,');') - end - return 1 - end - return 0 -end - --- Internal constructor -function _Declaration (t) - if t.name and t.name~='' then - local n = split(t.name,'@') - t.name = n[1] - t.lname = gsub(n[2] or n[1],"%[.-%]","") - end - t._base = classDeclaration - settag(t,tolua_tag) - t:checkname() - t:checktype() - return t -end - --- Constructor --- Expects the string declaration. --- The kind of declaration can be "var" or "func". -function Declaration (s,kind) - -- eliminate spaces if default value is provided - s = gsub(s,"%s*=%s*","=") - - if kind == "var" then - -- check the form: void - if s == '' or s == 'void' then - return _Declaration{type = 'void', kind = kind} - end - end - - -- check the form: mod type*& name - local t = split(s,'%*%s*&') - if t.n == 2 then - if kind == 'func' then - error("#invalid function return type: "..s) - end - local m = split(t[1],'%s%s*') - return _Declaration{ - name = t[2], - ptr = '*', - ret = '&', - type = m[m.n], - mod = concat(m,1,m.n-1), - kind = kind - } - end - - -- check the form: mod type** name - t = split(s,'%*%s*%*') - if t.n == 2 then - if kind == 'func' then - error("#invalid function return type: "..s) - end - local m = split(t[1],'%s%s*') - return _Declaration{ - name = t[2], - ptr = '*', - ret = '*', - type = m[m.n], - mod = concat(m,1,m.n-1), - kind = kind - } - end - - -- check the form: mod type& name - t = split(s,'&') - if t.n == 2 then - local m = split(t[1],'%s%s*') - return _Declaration{ - name = t[2], - ptr = '&', - type = m[m.n], - mod = concat(m,1,m.n-1) , - kind = kind - } - end - - -- check the form: mod type* name - local s1 = gsub(s,"(%b\[\])",function (n) return gsub(n,'%*','\1') end) - t = split(s1,'%*') - if t.n == 2 then - t[2] = gsub(t[2],'\1','%*') -- restore * in dimension expression - local m = split(t[1],'%s%s*') - return _Declaration{ - name = t[2], - ptr = '*', - type = m[m.n], - mod = concat(m,1,m.n-1) , - kind = kind - } - end - - if kind == 'var' then - -- check the form: mod type name - t = split(s,'%s%s*') - local v - if istype(t[t.n]) then v = '' else v = t[t.n]; t.n = t.n-1 end - return _Declaration{ - name = v, - type = t[t.n], - mod = concat(t,1,t.n-1), - kind = kind - } - - else -- kind == "func" - - -- check the form: mod type name - t = split(s,'%s%s*') - local v = t[t.n] -- last word is the function name - local tp,md - if t.n>1 then - tp = t[t.n-1] - md = concat(t,1,t.n-2) - end - return _Declaration{ - name = v, - type = tp, - mod = md, - kind = kind - } - end - -end - - - diff --git a/src/lua/define.lua b/src/lua/define.lua deleted file mode 100644 index db64db50..00000000 --- a/src/lua/define.lua +++ /dev/null @@ -1,72 +0,0 @@ --- tolua: define class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: define.lua,v 1.2 2001/11/26 23:00:23 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - --- Define class --- Represents a numeric const definition --- The following filds are stored: --- name = constant name -classDefine = { - name = '', - _base = classFeature, -} -settag(classDefine,tolua_tag) - --- register define -function classDefine:register () - local p = self:inmodule() - if p then - output(' tolua_constant(tolua_S,"'..p..'","'..self.lname..'",'..self.name..');') - else - output(' tolua_constant(tolua_S,NULL,"'..self.lname..'",'..self.name..');') - end -end - --- unregister define -function classDefine:unregister () - if not self:inmodule() then - output(' lua_pushnil(tolua_S); lua_setglobal(tolua_S,"'..self.lname..'");') - end -end - --- Print method -function classDefine:print (ident,close) - print(ident.."Define{") - print(ident.." name = '"..self.name.."',") - print(ident.." lname = '"..self.lname.."',") - print(ident.."}"..close) -end - - --- Internal constructor -function _Define (t) - t._base = classDefine - settag(t,tolua_tag) - - if t.name == '' then - error("#invalid define") - end - - append(t) - return t -end - --- Constructor --- Expects a string representing the constant name -function Define (n) - local t = split(n,'@') - return _Define { - name = t[1], - lname = t[2] or t[1] - } -end - - diff --git a/src/lua/doit.lua b/src/lua/doit.lua deleted file mode 100644 index aa184d62..00000000 --- a/src/lua/doit.lua +++ /dev/null @@ -1,73 +0,0 @@ --- Generate binding code --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: doit.lua,v 1.2 2001/11/26 23:00:23 darkgod Exp $ - - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - --- open input file, if any -if flags.f then - local st, msg = readfrom(flags.f) - if not st then - error('#'..msg) - end -end - --- define package name, if not provided -if not flags.n then - if flags.f then - flags.n = gsub(flags.f,"%..*","") - else - error("#no package name nor input file provided") - end -end - -local p = Package(flags.n) - -if flags.f then - readfrom() -end - -if flags.p then - return -- only parse -end - -if flags.o then - local st,msg = writeto(flags.o) - if not st then - error('#'..msg) - end -end - -if flags.P then - p:print() -else - p:decltag() - p:preamble() - p:supcode() - p:register() - p:unregister() -end - -if flags.o then - writeto() -end - --- write header file -if not flags.P then - if flags.H then - local st,msg = writeto(flags.H) - if not st then - error('#'..msg) - end - p:header() - writeto() - end -end - diff --git a/src/lua/enumerate.lua b/src/lua/enumerate.lua deleted file mode 100644 index 6b2b7466..00000000 --- a/src/lua/enumerate.lua +++ /dev/null @@ -1,93 +0,0 @@ --- tolua: enumerate class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: enumerate.lua,v 1.2 2001/11/26 23:00:23 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - --- Enumerate class --- Represents enumeration --- The following fields are stored: --- {i} = list of constant names -classEnumerate = { - _base = classFeature, -} -settag(classEnumerate,tolua_tag) - --- register enumeration -function classEnumerate:register () - local p = self:inclass() or self:inmodule() - local i=1 - while self[i] do - if p then - if self:inclass() then - output(' tolua_constant(tolua_S,"'..p..'","'..self.lnames[i]..'",'..p..'::'..self[i]..');') - else - output(' tolua_constant(tolua_S,"'..p..'","'..self.lnames[i]..'",'..self[i]..');') - end - else - output(' tolua_constant(tolua_S,NULL,"'..self.lnames[i]..'",'..self[i]..');') - end - i = i+1 - end -end --- register enumeration -function classEnumerate:unregister () - if self:inclass()==nil and self:inmodule()==nil then - local i=1 - while self[i] do - output(' lua_pushnil(tolua_S); lua_setglobal(tolua_S,"'..self.lnames[i]..'");') - i = i+1 - end - end -end - --- Print method -function classEnumerate:print (ident,close) - print(ident.."Enumerate{") - local i=1 - while self[i] do - print(ident.." '"..self[i].."'("..self.lnames[i].."),") - i = i+1 - end - print(ident.."}"..close) -end - --- Internal constructor -function _Enumerate (t) - t._base = classEnumerate - settag(t,tolua_tag) - append(t) - return t -end - --- Constructor --- Expects a string representing the enumerate body -function Enumerate (b) - local t = split(strsub(b,2,-2),',') -- eliminate braces - local i = 1 - local e = {n=0} - while t[i] do - local tt = split(t[i],'=') -- discard initial value - e.n = e.n + 1 - e[e.n] = tt[1] - i = i+1 - end - -- set lua names - i = 1 - e.lnames = {} - while e[i] do - local t = split(e[i],'@') - e[i] = t[1] - e.lnames[i] = t[2] or t[1] - i = i+1 - end - return _Enumerate(e) -end - - diff --git a/src/lua/feature.lua b/src/lua/feature.lua deleted file mode 100644 index 4a4379e1..00000000 --- a/src/lua/feature.lua +++ /dev/null @@ -1,72 +0,0 @@ --- tolua: abstract feature class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: feature.lua,v 1.2 2001/11/26 23:00:23 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - --- Feature class --- Represents the base class of all mapped feature. -classFeature = { -} - --- write support code -function classFeature:supcode () -end - --- output tag -function classFeature:decltag () -end - --- register feature -function classFeature:register () -end - --- unregister feature -function classFeature:unregister () -end - --- translate verbatim -function classFeature:preamble () -end - --- check if feature is inside a class definition --- it returns the feature class name or nil. -function classFeature:inclass () - if self.parent and self.parent.type == 'class' then - return self.parent.name - else - return nil - end -end - --- check if feature is inside a module --- it returns the feature module name or nil. -function classFeature:inmodule () - if self.parent and self.parent.type == 'module' then - return self.parent.name - else - return nil - end -end - --- return C binding function name based on name --- the client specifies a prefix --- return C binding function name --- the client specifies a prefix -function classFeature:cfuncname (n) - if self.parent then - n = self.parent:cfuncname(n) - end - if self.lname then - return n..'_'..self.lname - else - return n..'_'..self.name - end -end - diff --git a/src/lua/function.lua b/src/lua/function.lua deleted file mode 100644 index b87e3488..00000000 --- a/src/lua/function.lua +++ /dev/null @@ -1,317 +0,0 @@ --- tolua: function class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: function.lua,v 1.2 2001/11/26 23:00:23 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - - --- Function class --- Represents a function or a class method. --- The following fields are stored: --- mod = type modifiers --- type = type --- ptr = "*" or "&", if representing a pointer or a reference --- name = name --- args = list of argument declarations --- const = if it is a method receiving a const "this". -classFunction = { - mod = '', - type = '', - ptr = '', - name = '', - args = {n=0}, - const = '', - _base = classFeature, -} -settag(classFunction,tolua_tag) - --- declare tags -function classFunction:decltag () - self.itype,self.tag = tagvar(self.type,strfind(self.mod,'const')) - local i=1 - while self.args[i] do - self.args[i]:decltag() - i = i+1 - end -end - - --- Write binding function --- Outputs C/C++ binding function. -function classFunction:supcode () - local nret = 0 -- number of returned values - local class = self:inclass() - local _,_,static = strfind(self.mod,'^%s*(static)') - - if class then - output("/* method:",self.name," of class ",class," */") - else - output("/* function:",self.name," */") - end - output("static int",self.cname,"(lua_State* tolua_S)") - output("{") - - -- check types - output(' if (\n') - -- check self - local narg - if class then narg=2 else narg=1 end - if class and self.name~='new' and static==nil then - if self.const == 'const' then - output(' !tolua_istype(tolua_S,1,',self.parent.ctag,',0) ||\n') - else - output(' !tolua_istype(tolua_S,1,',self.parent.tag,',0) ||\n') - end - end - -- check args - if self.args[1].type ~= 'void' then - local i=1 - while self.args[i] do - if isbasic(self.args[i].type) ~= 'value' then - output(' !'..self.args[i]:outchecktype(narg)..' ||\n') - end - narg = narg+1 - i = i+1 - end - end - -- check end of list - output(' !tolua_isnoobj(tolua_S,'..narg..')\n )\n goto tolua_lerror;') - - output(' else\n {') - - -- declare self, if the case - local narg - if class then narg=2 else narg=1 end - if class and self.name~='new' and static==nil then - output(' ',self.const,class,'*','self = ') - output('(',self.const,class,'*) ') - output('tolua_getusertype(tolua_S,1,0);') - elseif static then - _,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)') - end - -- declare parameters - if self.args[1].type ~= 'void' then - local i=1 - while self.args[i] do - self.args[i]:declare(narg) - narg = narg+1 - i = i+1 - end - end - - -- check self - if class and self.name~='new' and static==nil then - output(' if (!self) tolua_error(tolua_S,"invalid \'self\' in function \''..self.name..'\'");'); - end - - -- get array element values - if class then narg=2 else narg=1 end - if self.args[1].type ~= 'void' then - local i=1 - while self.args[i] do - self.args[i]:getarray(narg) - narg = narg+1 - i = i+1 - end - end - - -- call function - if class and self.name=='delete' then - output(' delete self;') - elseif class and self.name == 'operator&[]' then - output(' self->operator[](',self.args[1].name,') = ',self.args[2].name,';') - else - output(' {') - if self.type ~= '' and self.type ~= 'void' then - output(' ',self.mod,self.type,self.ptr,'toluaI_ret = ') - output('(',self.mod,self.type,self.ptr,') ') - else - output(' ') - end - if class and self.name=='new' then - output('new',class,'(') - elseif class and static then - output(class..'::'..self.name,'(') - elseif class then - output('self->'..self.name,'(') - else - output(self.name,'(') - end - - -- write parameters - local i=1 - while self.args[i] do - self.args[i]:passpar() - i = i+1 - if self.args[i] then - output(',') - end - end - - output(');') - - -- return values - if self.type ~= '' and self.type ~= 'void' then - nret = nret + 1 - local t,ct = isbasic(self.type) - if t then - output(' tolua_push'..t..'(tolua_S,(',ct,')toluaI_ret);') - else - if self.ptr == '' then - output(' {') - output('#ifdef __cplusplus\n') - output(' void* toluaI_clone = new',self.type,'(toluaI_ret);') - output('#else\n') - output(' void* toluaI_clone = tolua_copy(tolua_S,(void*)&toluaI_ret,sizeof(',self.type,'));') - output('#endif\n') - output(' tolua_pushusertype(tolua_S,tolua_doclone(tolua_S,toluaI_clone,',self.tag,'),',self.tag,');') - output(' }') - --output(' tolua_pushclone((void*)&toluaI_ret,sizeof(',self.type,'),',self.tag,');') - elseif self.ptr == '&' then - output(' tolua_pushusertype(tolua_S,(void*)&toluaI_ret,',self.tag,');') - else - output(' tolua_pushusertype(tolua_S,(void*)toluaI_ret,',self.tag,');') - end - end - end - local i=1 - while self.args[i] do - nret = nret + self.args[i]:retvalue() - i = i+1 - end - output(' }') - - -- set array element values - if class then narg=2 else narg=1 end - if self.args[1].type ~= 'void' then - local i=1 - while self.args[i] do - self.args[i]:setarray(narg) - narg = narg+1 - i = i+1 - end - end - - -- free dynamically allocated array - if self.args[1].type ~= 'void' then - local i=1 - while self.args[i] do - self.args[i]:freearray() - i = i+1 - end - end - end - - output(' }') - output(' return '..nret..';') - - -- call overloaded function or generate error - output('tolua_lerror:\n') - local overload = strsub(self.cname,-2,-1) - 1 - if overload >= 0 then - output(' return '..strsub(self.cname,1,-3)..format("%02d",overload)..'(tolua_S);') - else - output(' tolua_error(tolua_S,"#ferror in function \''..self.lname..'\'.");') - output(' return 0;') - end - - output('}') - output('\n') -end - --- register function -function classFunction:register () - local parent = self:inclass() or self:inmodule() - if parent then - output(' tolua_function(tolua_S,"'..parent..'","'..self.lname..'",'..self.cname..');') - else - output(' tolua_function(tolua_S,NULL,"'..self.lname..'",'..self.cname..');') - end -end - --- unregister function -function classFunction:unregister () - if self:inclass()==nil and self:inmodule()==nil then - output(' lua_pushnil(tolua_S); lua_setglobal(tolua_S,"'..self.lname..'");') - end -end - - --- Print method -function classFunction:print (ident,close) - print(ident.."Function{") - print(ident.." mod = '"..self.mod.."',") - print(ident.." type = '"..self.type.."',") - print(ident.." ptr = '"..self.ptr.."',") - print(ident.." name = '"..self.name.."',") - print(ident.." const = '"..self.const.."',") - print(ident.." cname = '"..self.cname.."',") - print(ident.." lname = '"..self.lname.."',") - print(ident.." args = {") - local i=1 - while self.args[i] do - self.args[i]:print(ident.." ",",") - i = i+1 - end - print(ident.." }") - print(ident.."}"..close) -end - --- determine lua function name overload -function classFunction:overload () - return self.parent:overload(self.lname) -end - - - --- Internal constructor -function _Function (t) - t._base = classFunction - settag(t,tolua_tag) - - if t.const ~= 'const' and t.const ~= '' then - error("#invalid 'const' specification") - end - - append(t) - if t:inclass() then - if t.name == t.parent.name then - t.name = 'new' - t.lname = 'new' - t.type = t.parent.name - t.ptr = '*' - elseif t.name == '~'..t.parent.name then - t.name = 'delete' - t.lname = 'delete' - end - end - t.cname = t:cfuncname("toluaI")..t:overload(t) - return t -end - --- Constructor --- Expects three strings: one representing the function declaration, --- another representing the argument list, and the third representing --- the "const" or empty string. -function Function (d,a,c) - local t = split(strsub(a,2,-2),',') -- eliminate braces - local i=1 - local l = {n=0} - while t[i] do - l.n = l.n+1 - l[l.n] = Declaration(t[i],'var') - i = i+1 - end - local f = Declaration(d,'func') - f.args = l - f.const = c - return _Function(f) -end - - diff --git a/src/lua/lapi.c b/src/lua/lapi.c deleted file mode 100644 index b597e00a..00000000 --- a/src/lua/lapi.c +++ /dev/null @@ -1,499 +0,0 @@ -/* -** $Id: lapi.c,v 1.3 2001/11/26 23:00:23 darkgod Exp $ -** Lua API -** See Copyright Notice in lua.h -*/ - - -#include <string.h> - -#include "lua.h" - -#include "lapi.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lvm.h" - - -const char lua_ident[] = "$Lua: " LUA_VERSION " " LUA_COPYRIGHT " $\n" - "$Authors: " LUA_AUTHORS " $"; - - - -#define Index(L,i) ((i) >= 0 ? (L->Cbase+((i)-1)) : (L->top+(i))) - -#define api_incr_top(L) incr_top - - - - -TObject *luaA_index (lua_State *L, int index) { - return Index(L, index); -} - - -static TObject *luaA_indexAcceptable (lua_State *L, int index) { - if (index == 0) { - return NULL; - } else if (index > 0) { - TObject *o = L->Cbase+(index-1); - if (o >= L->top) return NULL; - else return o; - } else { - TObject *o = L->top+index; - if(o < L->Cbase) return NULL; - else return o; - } -} - - -void luaA_pushobject (lua_State *L, const TObject *o) { - *L->top = *o; - incr_top; -} - -LUA_API int lua_stackspace (lua_State *L) { - return (L->stack_last - L->top); -} - - - -/* -** basic stack manipulation -*/ - - -LUA_API int lua_gettop (lua_State *L) { - return (L->top - L->Cbase); -} - - -LUA_API void lua_settop (lua_State *L, int index) { - if (index >= 0) - luaD_adjusttop(L, L->Cbase, index); - else - L->top = L->top+index+1; /* index is negative */ -} - - -LUA_API void lua_remove (lua_State *L, int index) { - StkId p = luaA_index(L, index); - while (++p < L->top) *(p-1) = *p; - L->top--; -} - - -LUA_API void lua_insert (lua_State *L, int index) { - StkId p = luaA_index(L, index); - StkId q; - for (q = L->top; q>p; q--) - *q = *(q-1); - *p = *L->top; -} - - -LUA_API void lua_pushvalue (lua_State *L, int index) { - *L->top = *luaA_index(L, index); - api_incr_top(L); -} - - - -/* -** access functions (stack -> C) -*/ - - -LUA_API int lua_type (lua_State *L, int index) { - StkId o = luaA_indexAcceptable(L, index); - return (o == NULL) ? LUA_TNONE : ttype(o); -} - -LUA_API const char *lua_typename (lua_State *L, int t) { - UNUSED(L); - return (t == LUA_TNONE) ? "no value" : luaO_typenames[t]; -} - - -LUA_API int lua_iscfunction (lua_State *L, int index) { - StkId o = luaA_indexAcceptable(L, index); - return (o == NULL) ? 0 : iscfunction(o); -} - -LUA_API int lua_isnumber (lua_State *L, int index) { - TObject *o = luaA_indexAcceptable(L, index); - return (o == NULL) ? 0 : (tonumber(o) == 0); -} - -LUA_API int lua_isstring (lua_State *L, int index) { - int t = lua_type(L, index); - return (t == LUA_TSTRING || t == LUA_TNUMBER); -} - - -LUA_API int lua_tag (lua_State *L, int index) { - StkId o = luaA_indexAcceptable(L, index); - return (o == NULL) ? LUA_NOTAG : luaT_tag(o); -} - -LUA_API int lua_equal (lua_State *L, int index1, int index2) { - StkId o1 = luaA_indexAcceptable(L, index1); - StkId o2 = luaA_indexAcceptable(L, index2); - if (o1 == NULL || o2 == NULL) return 0; /* index out-of-range */ - else return luaO_equalObj(o1, o2); -} - -LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { - StkId o1 = luaA_indexAcceptable(L, index1); - StkId o2 = luaA_indexAcceptable(L, index2); - if (o1 == NULL || o2 == NULL) return 0; /* index out-of-range */ - else return luaV_lessthan(L, o1, o2, L->top); -} - - - -LUA_API long lua_tonumber (lua_State *L, int index) { - StkId o = luaA_indexAcceptable(L, index); - return (o == NULL || tonumber(o)) ? 0 : nvalue(o); -} - -LUA_API const char *lua_tostring (lua_State *L, int index) { - StkId o = luaA_indexAcceptable(L, index); - return (o == NULL || tostring(L, o)) ? NULL : svalue(o); -} - -LUA_API size_t lua_strlen (lua_State *L, int index) { - StkId o = luaA_indexAcceptable(L, index); - return (o == NULL || tostring(L, o)) ? 0 : tsvalue(o)->len; -} - -LUA_API lua_CFunction lua_tocfunction (lua_State *L, int index) { - StkId o = luaA_indexAcceptable(L, index); - return (o == NULL || !iscfunction(o)) ? NULL : clvalue(o)->f.c; -} - -LUA_API void *lua_touserdata (lua_State *L, int index) { - StkId o = luaA_indexAcceptable(L, index); - return (o == NULL || ttype(o) != LUA_TUSERDATA) ? NULL : - tsvalue(o)->u.d.value; -} - -LUA_API const void *lua_topointer (lua_State *L, int index) { - StkId o = luaA_indexAcceptable(L, index); - if (o == NULL) return NULL; - switch (ttype(o)) { - case LUA_TTABLE: - return hvalue(o); - case LUA_TFUNCTION: - return clvalue(o); - default: return NULL; - } -} - - - -/* -** push functions (C -> stack) -*/ - - -LUA_API void lua_pushnil (lua_State *L) { - ttype(L->top) = LUA_TNIL; - api_incr_top(L); -} - - -LUA_API void lua_pushnumber (lua_State *L, long n) { - nvalue(L->top) = n; - ttype(L->top) = LUA_TNUMBER; - api_incr_top(L); -} - - -LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) { - tsvalue(L->top) = luaS_newlstr(L, s, len); - ttype(L->top) = LUA_TSTRING; - api_incr_top(L); -} - - -LUA_API void lua_pushstring (lua_State *L, const char *s) { - if (s == NULL) - lua_pushnil(L); - else - lua_pushlstring(L, s, strlen(s)); -} - - -LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { - luaV_Cclosure(L, fn, n); -} - - -LUA_API void lua_pushusertag (lua_State *L, void *u, int tag) { - /* ORDER LUA_T */ - if (!(tag == LUA_ANYTAG || tag == LUA_TUSERDATA || validtag(tag))) - luaO_verror(L, "invalid tag for a userdata (%d)", tag); - tsvalue(L->top) = luaS_createudata(L, u, tag); - ttype(L->top) = LUA_TUSERDATA; - api_incr_top(L); -} - - - -/* -** get functions (Lua -> stack) -*/ - - -LUA_API void lua_getglobal (lua_State *L, const char *name) { - StkId top = L->top; - *top = *luaV_getglobal(L, luaS_new(L, name)); - L->top = top; - api_incr_top(L); -} - - -LUA_API void lua_gettable (lua_State *L, int index) { - StkId t = Index(L, index); - StkId top = L->top; - *(top-1) = *luaV_gettable(L, t); - L->top = top; /* tag method may change top */ -} - - -LUA_API void lua_rawget (lua_State *L, int index) { - StkId t = Index(L, index); - LUA_ASSERT(ttype(t) == LUA_TTABLE, "table expected"); - *(L->top - 1) = *luaH_get(L, hvalue(t), L->top - 1); -} - - -LUA_API void lua_rawgeti (lua_State *L, int index, int n) { - StkId o = Index(L, index); - LUA_ASSERT(ttype(o) == LUA_TTABLE, "table expected"); - *L->top = *luaH_getnum(hvalue(o), n); - api_incr_top(L); -} - - -LUA_API void lua_getglobals (lua_State *L) { - hvalue(L->top) = L->gt; - ttype(L->top) = LUA_TTABLE; - api_incr_top(L); -} - - -LUA_API int lua_getref (lua_State *L, int ref) { - if (ref == LUA_REFNIL) - ttype(L->top) = LUA_TNIL; - else if (0 <= ref && ref < L->refSize && - (L->refArray[ref].st == LOCK || L->refArray[ref].st == HOLD)) - *L->top = L->refArray[ref].o; - else - return 0; - api_incr_top(L); - return 1; -} - - -LUA_API void lua_newtable (lua_State *L) { - hvalue(L->top) = luaH_new(L, 0); - ttype(L->top) = LUA_TTABLE; - api_incr_top(L); -} - - - -/* -** set functions (stack -> Lua) -*/ - - -LUA_API void lua_setglobal (lua_State *L, const char *name) { - StkId top = L->top; - luaV_setglobal(L, luaS_new(L, name)); - L->top = top-1; /* remove element from the top */ -} - - -LUA_API void lua_settable (lua_State *L, int index) { - StkId t = Index(L, index); - StkId top = L->top; - luaV_settable(L, t, top-2); - L->top = top-2; /* pop index and value */ -} - - -LUA_API void lua_rawset (lua_State *L, int index) { - StkId t = Index(L, index); - LUA_ASSERT(ttype(t) == LUA_TTABLE, "table expected"); - *luaH_set(L, hvalue(t), L->top-2) = *(L->top-1); - L->top -= 2; -} - - -LUA_API void lua_rawseti (lua_State *L, int index, int n) { - StkId o = Index(L, index); - LUA_ASSERT(ttype(o) == LUA_TTABLE, "table expected"); - *luaH_setint(L, hvalue(o), n) = *(L->top-1); - L->top--; -} - - -LUA_API void lua_setglobals (lua_State *L) { - StkId newtable = --L->top; - LUA_ASSERT(ttype(newtable) == LUA_TTABLE, "table expected"); - L->gt = hvalue(newtable); -} - - -LUA_API int lua_ref (lua_State *L, int lock) { - int ref; - if (ttype(L->top-1) == LUA_TNIL) - ref = LUA_REFNIL; - else { - if (L->refFree != NONEXT) { /* is there a free place? */ - ref = L->refFree; - L->refFree = L->refArray[ref].st; - } - else { /* no more free places */ - luaM_growvector(L, L->refArray, L->refSize, 1, struct Ref, - "reference table overflow", MAX_INT); - L->nblocks += sizeof(struct Ref); - ref = L->refSize++; - } - L->refArray[ref].o = *(L->top-1); - L->refArray[ref].st = lock ? LOCK : HOLD; - } - L->top--; - return ref; -} - - -/* -** "do" functions (run Lua code) -** (most of them are in ldo.c) -*/ - -LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults) { - luaD_call(L, L->top-(nargs+1), nresults); -} - - -/* -** Garbage-collection functions -*/ - -/* GC values are expressed in Kbytes: #bytes/2^10 */ -#define GCscale(x) ((int)((x)>>10)) -#define GCunscale(x) ((unsigned long)(x)<<10) - -LUA_API int lua_getgcthreshold (lua_State *L) { - return GCscale(L->GCthreshold); -} - -LUA_API int lua_getgccount (lua_State *L) { - return GCscale(L->nblocks); -} - -LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold) { - if (newthreshold > GCscale(ULONG_MAX)) - L->GCthreshold = ULONG_MAX; - else - L->GCthreshold = GCunscale(newthreshold); - luaC_checkGC(L); -} - - -/* -** miscellaneous functions -*/ - -LUA_API void lua_settag (lua_State *L, int tag) { - luaT_realtag(L, tag); - switch (ttype(L->top-1)) { - case LUA_TTABLE: - hvalue(L->top-1)->htag = tag; - break; - case LUA_TUSERDATA: - tsvalue(L->top-1)->u.d.tag = tag; - break; - default: - luaO_verror(L, "cannot change the tag of a %.20s", - luaO_typename(L->top-1)); - } -} - - -LUA_API void lua_unref (lua_State *L, int ref) { - if (ref >= 0) { - LUA_ASSERT(ref < L->refSize && L->refArray[ref].st < 0, "invalid ref"); - L->refArray[ref].st = L->refFree; - L->refFree = ref; - } -} - - -LUA_API int lua_next (lua_State *L, int index) { - StkId t = luaA_index(L, index); - Node *n; - LUA_ASSERT(ttype(t) == LUA_TTABLE, "table expected"); - n = luaH_next(L, hvalue(t), luaA_index(L, -1)); - if (n) { - *(L->top-1) = *key(n); - *L->top = *val(n); - api_incr_top(L); - return 1; - } - else { /* no more elements */ - L->top -= 1; /* remove key */ - return 0; - } -} - - -LUA_API int lua_getn (lua_State *L, int index) { - Hash *h = hvalue(luaA_index(L, index)); - const TObject *value = luaH_getstr(h, luaS_new(L, "n")); /* value = h.n */ - if (ttype(value) == LUA_TNUMBER) - return (int)nvalue(value); - else { - Number max = 0; - int i = h->size; - Node *n = h->node; - while (i--) { - if (ttype(key(n)) == LUA_TNUMBER && - ttype(val(n)) != LUA_TNIL && - nvalue(key(n)) > max) - max = nvalue(key(n)); - n++; - } - return (int)max; - } -} - - -LUA_API void lua_concat (lua_State *L, int n) { - StkId top = L->top; - luaV_strconc(L, n, top); - L->top = top-(n-1); - luaC_checkGC(L); -} - - -LUA_API void *lua_newuserdata (lua_State *L, size_t size) { - TString *ts = luaS_newudata(L, size, NULL); - tsvalue(L->top) = ts; - ttype(L->top) = LUA_TUSERDATA; - api_incr_top(L); - return ts->u.d.value; -} - diff --git a/src/lua/lapi.h b/src/lua/lapi.h deleted file mode 100644 index d6e1c44f..00000000 --- a/src/lua/lapi.h +++ /dev/null @@ -1,17 +0,0 @@ -/* -** $Id: lapi.h,v 1.3 2001/11/26 23:00:23 darkgod Exp $ -** Auxiliary functions from Lua API -** See Copyright Notice in lua.h -*/ - -#ifndef lapi_h -#define lapi_h - - -#include "lobject.h" - - -TObject *luaA_index (lua_State *L, int index); -void luaA_pushobject (lua_State *L, const TObject *o); - -#endif diff --git a/src/lua/lauxlib.c b/src/lua/lauxlib.c deleted file mode 100644 index 810bca20..00000000 --- a/src/lua/lauxlib.c +++ /dev/null @@ -1,216 +0,0 @@ -/* -** $Id: lauxlib.c,v 1.3 2001/11/26 23:00:23 darkgod Exp $ -** Auxiliary functions for building Lua libraries -** See Copyright Notice in lua.h -*/ - - -#include <stdarg.h> -#include <stdio.h> -#include <string.h> - -/* This file uses only the official API of Lua. -** Any function declared here could be written as an application function. -** With care, these functions can be used by other libraries. -*/ - -#include "lua.h" - -#include "lauxlib.h" -#include "luadebug.h" - - - -LUALIB_API int luaL_findstring (const char *name, const char *const list[]) { - int i; - for (i=0; list[i]; i++) - if (strcmp(list[i], name) == 0) - return i; - return -1; /* name not found */ -} - -LUALIB_API void luaL_argerror (lua_State *L, int narg, const char *extramsg) { - lua_Debug ar; - lua_getstack(L, 0, &ar); - lua_getinfo(L, "n", &ar); - if (ar.name == NULL) - ar.name = "?"; - luaL_verror(L, "bad argument #%d to `%.50s' (%.100s)", - narg, ar.name, extramsg); -} - - -static void type_error (lua_State *L, int narg, int t) { - char buff[50]; - sprintf(buff, "%.8s expected, got %.8s", lua_typename(L, t), - lua_typename(L, lua_type(L, narg))); - luaL_argerror(L, narg, buff); -} - - -LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) { - if (space > lua_stackspace(L)) - luaL_verror(L, "stack overflow (%.30s)", mes); -} - - -LUALIB_API void luaL_checktype(lua_State *L, int narg, int t) { - if (lua_type(L, narg) != t) - type_error(L, narg, t); -} - - -LUALIB_API void luaL_checkany (lua_State *L, int narg) { - if (lua_type(L, narg) == LUA_TNONE) - luaL_argerror(L, narg, "value expected"); -} - - -LUALIB_API const char *luaL_check_lstr (lua_State *L, int narg, size_t *len) { - const char *s = lua_tostring(L, narg); - if (!s) type_error(L, narg, LUA_TSTRING); - if (len) *len = lua_strlen(L, narg); - return s; -} - - -LUALIB_API const char *luaL_opt_lstr (lua_State *L, int narg, const char *def, size_t *len) { - if (lua_isnull(L, narg)) { - if (len) - *len = (def ? strlen(def) : 0); - return def; - } - else return luaL_check_lstr(L, narg, len); -} - - -LUALIB_API long luaL_check_number (lua_State *L, int narg) { - long d = lua_tonumber(L, narg); - if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */ - type_error(L, narg, LUA_TNUMBER); - return d; -} - - -LUALIB_API long luaL_opt_number (lua_State *L, int narg, long def) { - if (lua_isnull(L, narg)) return def; - else return luaL_check_number(L, narg); -} - - -LUALIB_API void luaL_openlib (lua_State *L, const struct luaL_reg *l, int n) { - int i; - for (i=0; i<n; i++) - lua_register(L, l[i].name, l[i].func); -} - - -LUALIB_API void luaL_verror (lua_State *L, const char *fmt, ...) { - char buff[500]; - va_list argp; - va_start(argp, fmt); - vsprintf(buff, fmt, argp); - va_end(argp); - lua_error(L, buff); -} - - -/* -** {====================================================== -** Generic Buffer manipulation -** ======================================================= -*/ - - -#define buffempty(B) ((B)->p == (B)->buffer) -#define bufflen(B) ((B)->p - (B)->buffer) -#define bufffree(B) ((size_t)(LUAL_BUFFERSIZE - bufflen(B))) - -#define LIMIT (LUA_MINSTACK/2) - - -static int emptybuffer (luaL_Buffer *B) { - size_t l = bufflen(B); - if (l == 0) return 0; /* put nothing on stack */ - else { - lua_pushlstring(B->L, B->buffer, l); - B->p = B->buffer; - B->level++; - return 1; - } -} - - -static void adjuststack (luaL_Buffer *B) { - if (B->level > 1) { - lua_State *L = B->L; - int toget = 1; /* number of levels to concat */ - size_t toplen = lua_strlen(L, -1); - do { - size_t l = lua_strlen(L, -(toget+1)); - if (B->level - toget + 1 >= LIMIT || toplen > l) { - toplen += l; - toget++; - } - else break; - } while (toget < B->level); - if (toget >= 2) { - lua_concat(L, toget); - B->level = B->level - toget + 1; - } - } -} - - -LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) { - if (emptybuffer(B)) - adjuststack(B); - return B->buffer; -} - - -LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { - while (l--) - luaL_putchar(B, *s++); -} - - -LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) { - luaL_addlstring(B, s, strlen(s)); -} - - -LUALIB_API void luaL_pushresult (luaL_Buffer *B) { - emptybuffer(B); - if (B->level == 0) - lua_pushlstring(B->L, NULL, 0); - else if (B->level > 1) - lua_concat(B->L, B->level); - B->level = 1; -} - - -LUALIB_API void luaL_addvalue (luaL_Buffer *B) { - lua_State *L = B->L; - size_t vl = lua_strlen(L, -1); - if (vl <= bufffree(B)) { /* fit into buffer? */ - memcpy(B->p, lua_tostring(L, -1), vl); /* put it there */ - B->p += vl; - lua_pop(L, 1); /* remove from stack */ - } - else { - if (emptybuffer(B)) - lua_insert(L, -2); /* put buffer before new value */ - B->level++; /* add new value into B stack */ - adjuststack(B); - } -} - - -LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) { - B->L = L; - B->p = B->buffer; - B->level = 0; -} - -/* }====================================================== */ diff --git a/src/lua/lauxlib.h b/src/lua/lauxlib.h deleted file mode 100644 index a8d35aff..00000000 --- a/src/lua/lauxlib.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -** $Id: lauxlib.h,v 1.2 2001/11/26 23:00:23 darkgod Exp $ -** Auxiliary functions for building Lua libraries -** See Copyright Notice in lua.h -*/ - - -#ifndef lauxlib_h -#define lauxlib_h - - -#include <stddef.h> -#include <stdio.h> - -#include "lua.h" - - -#ifndef LUALIB_API -#define LUALIB_API extern -#endif - - -struct luaL_reg { - const char *name; - lua_CFunction func; -}; - - -LUALIB_API void luaL_openlib (lua_State *L, const struct luaL_reg *l, int n); -LUALIB_API void luaL_argerror (lua_State *L, int numarg, const char *extramsg); -LUALIB_API const char *luaL_check_lstr (lua_State *L, int numArg, size_t *len); -LUALIB_API const char *luaL_opt_lstr (lua_State *L, int numArg, const char *def, size_t *len); -LUALIB_API long luaL_check_number (lua_State *L, int numArg); -LUALIB_API long luaL_opt_number (lua_State *L, int numArg, long def); - -LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg); -LUALIB_API void luaL_checktype (lua_State *L, int narg, int t); -LUALIB_API void luaL_checkany (lua_State *L, int narg); - -LUALIB_API void luaL_verror (lua_State *L, const char *fmt, ...); -LUALIB_API int luaL_findstring (const char *name, const char *const list[]); - - - -/* -** =============================================================== -** some useful macros -** =============================================================== -*/ - -#define luaL_arg_check(L, cond,numarg,extramsg) if (!(cond)) \ - luaL_argerror(L, numarg,extramsg) -#define luaL_check_string(L,n) (luaL_check_lstr(L, (n), NULL)) -#define luaL_opt_string(L,n,d) (luaL_opt_lstr(L, (n), (d), NULL)) -#define luaL_check_int(L,n) ((int)luaL_check_number(L, n)) -#define luaL_check_long(L,n) ((long)luaL_check_number(L, n)) -#define luaL_opt_int(L,n,d) ((int)luaL_opt_number(L, n,d)) -#define luaL_opt_long(L,n,d) ((long)luaL_opt_number(L, n,d)) -#define luaL_openl(L,a) luaL_openlib(L, a, (sizeof(a)/sizeof(a[0]))) - - -/* -** {====================================================== -** Generic Buffer manipulation -** ======================================================= -*/ - - -#ifndef LUAL_BUFFERSIZE -#define LUAL_BUFFERSIZE BUFSIZ -#endif - - -typedef struct luaL_Buffer { - char *p; /* current position in buffer */ - int level; - lua_State *L; - char buffer[LUAL_BUFFERSIZE]; -} luaL_Buffer; - -#define luaL_putchar(B,c) \ - ((void)((B)->p < &(B)->buffer[LUAL_BUFFERSIZE] || luaL_prepbuffer(B)), \ - (*(B)->p++ = (char)(c))) - -#define luaL_addsize(B,n) ((B)->p += (n)) - -LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B); -LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B); -LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l); -LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s); -LUALIB_API void luaL_addvalue (luaL_Buffer *B); -LUALIB_API void luaL_pushresult (luaL_Buffer *B); - - -/* }====================================================== */ - - -#endif - - diff --git a/src/lua/lbaselib.c b/src/lua/lbaselib.c deleted file mode 100644 index 71c643aa..00000000 --- a/src/lua/lbaselib.c +++ /dev/null @@ -1,651 +0,0 @@ -/* -** $Id: lbaselib.c,v 1.2 2001/11/26 23:00:23 darkgod Exp $ -** Basic library -** See Copyright Notice in lua.h -*/ - - - -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "lua.h" - -#include "lauxlib.h" -#include "luadebug.h" -#include "lualib.h" - - - -/* -** If your system does not support `stderr', redefine this function, or -** redefine _ERRORMESSAGE so that it won't need _ALERT. -*/ -static int luaB__ALERT (lua_State *L) { - fputs(luaL_check_string(L, 1), stderr); - return 0; -} - - -/* -** Basic implementation of _ERRORMESSAGE. -** The library `liolib' redefines _ERRORMESSAGE for better error information. -*/ -static int luaB__ERRORMESSAGE (lua_State *L) { - luaL_checktype(L, 1, LUA_TSTRING); - lua_getglobal(L, LUA_ALERT); - if (lua_isfunction(L, -1)) { /* avoid error loop if _ALERT is not defined */ - lua_Debug ar; - lua_pushstring(L, "error: "); - lua_pushvalue(L, 1); - if (lua_getstack(L, 1, &ar)) { - lua_getinfo(L, "Sl", &ar); - if (ar.source && ar.currentline > 0) { - char buff[100]; - sprintf(buff, "\n <%.70s: line %d>", ar.short_src, ar.currentline); - lua_pushstring(L, buff); - lua_concat(L, 2); - } - } - lua_pushstring(L, "\n"); - lua_concat(L, 3); - lua_rawcall(L, 1, 0); - } - return 0; -} - - -/* -** If your system does not support `stdout', you can just remove this function. -** If you need, you can define your own `print' function, following this -** model but changing `fputs' to put the strings at a proper place -** (a console window or a log file, for instance). -*/ -static int luaB_print (lua_State *L) { - int n = lua_gettop(L); /* number of arguments */ - int i; - lua_getglobal(L, "tostring"); - for (i=1; i<=n; i++) { - const char *s; - lua_pushvalue(L, -1); /* function to be called */ - lua_pushvalue(L, i); /* value to print */ - lua_rawcall(L, 1, 1); - s = lua_tostring(L, -1); /* get result */ - if (s == NULL) - lua_error(L, "`tostring' must return a string to `print'"); - if (i>1) fputs("\t", stdout); - fputs(s, stdout); - lua_pop(L, 1); /* pop result */ - } - fputs("\n", stdout); - return 0; -} - - -static int luaB_tonumber (lua_State *L) { - int base = luaL_opt_int(L, 2, 10); - if (base == 10) { /* standard conversion */ - luaL_checkany(L, 1); - if (lua_isnumber(L, 1)) { - lua_pushnumber(L, lua_tonumber(L, 1)); - return 1; - } - } - else { - const char *s1 = luaL_check_string(L, 1); - char *s2; - unsigned long n; - luaL_arg_check(L, 2 <= base && base <= 36, 2, "base out of range"); - n = strtoul(s1, &s2, base); - if (s1 != s2) { /* at least one valid digit? */ - while (isspace((unsigned char)*s2)) s2++; /* skip trailing spaces */ - if (*s2 == '\0') { /* no invalid trailing characters? */ - lua_pushnumber(L, n); - return 1; - } - } - } - lua_pushnil(L); /* else not a number */ - return 1; -} - - -static int luaB_error (lua_State *L) { - lua_error(L, luaL_opt_string(L, 1, NULL)); - return 0; /* to avoid warnings */ -} - -static int luaB_setglobal (lua_State *L) { - luaL_checkany(L, 2); - lua_setglobal(L, luaL_check_string(L, 1)); - return 0; -} - -static int luaB_getglobal (lua_State *L) { - lua_getglobal(L, luaL_check_string(L, 1)); - return 1; -} - -static int luaB_tag (lua_State *L) { - luaL_checkany(L, 1); - lua_pushnumber(L, lua_tag(L, 1)); - return 1; -} - -static int luaB_settag (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - lua_pushvalue(L, 1); /* push table */ - lua_settag(L, luaL_check_int(L, 2)); - return 1; /* return table */ -} - -static int luaB_newtag (lua_State *L) { - lua_pushnumber(L, lua_newtag(L)); - return 1; -} - -static int luaB_copytagmethods (lua_State *L) { - lua_pushnumber(L, lua_copytagmethods(L, luaL_check_int(L, 1), - luaL_check_int(L, 2))); - return 1; -} - -static int luaB_globals (lua_State *L) { - lua_getglobals(L); /* value to be returned */ - if (!lua_isnull(L, 1)) { - luaL_checktype(L, 1, LUA_TTABLE); - lua_pushvalue(L, 1); /* new table of globals */ - lua_setglobals(L); - } - return 1; -} - -static int luaB_rawget (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - luaL_checkany(L, 2); - lua_rawget(L, -2); - return 1; -} - -static int luaB_rawset (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - luaL_checkany(L, 2); - luaL_checkany(L, 3); - lua_rawset(L, -3); - return 1; -} - -static int luaB_settagmethod (lua_State *L) { - int tag = luaL_check_int(L, 1); - const char *event = luaL_check_string(L, 2); - luaL_arg_check(L, lua_isfunction(L, 3) || lua_isnil(L, 3), 3, - "function or nil expected"); - if (strcmp(event, "gc") == 0) - lua_error(L, "deprecated use: cannot set the `gc' tag method from Lua"); - lua_gettagmethod(L, tag, event); - lua_pushvalue(L, 3); - lua_settagmethod(L, tag, event); - return 1; -} - - -static int luaB_gettagmethod (lua_State *L) { - int tag = luaL_check_int(L, 1); - const char *event = luaL_check_string(L, 2); - if (strcmp(event, "gc") == 0) - lua_error(L, "deprecated use: cannot get the `gc' tag method from Lua"); - lua_gettagmethod(L, tag, event); - return 1; -} - - -static int luaB_gcinfo (lua_State *L) { - lua_pushnumber(L, lua_getgccount(L)); - lua_pushnumber(L, lua_getgcthreshold(L)); - return 2; -} - - -static int luaB_collectgarbage (lua_State *L) { - lua_setgcthreshold(L, luaL_opt_int(L, 1, 0)); - return 0; -} - - -static int luaB_type (lua_State *L) { - luaL_checkany(L, 1); - lua_pushstring(L, lua_typename(L, lua_type(L, 1))); - return 1; -} - - -static int luaB_next (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - lua_settop(L, 2); /* create a 2nd argument if there isn't one */ - if (lua_next(L, 1)) - return 2; - else { - lua_pushnil(L); - return 1; - } -} - - -static int passresults (lua_State *L, int status, int oldtop) { - static const char *const errornames[] = - {"ok", "run-time error", "file error", "syntax error", - "memory error", "error in error handling"}; - if (status == 0) { - int nresults = lua_gettop(L) - oldtop; - if (nresults > 0) - return nresults; /* results are already on the stack */ - else { - lua_pushuserdata(L, NULL); /* at least one result to signal no errors */ - return 1; - } - } - else { /* error */ - lua_pushnil(L); - lua_pushstring(L, errornames[status]); /* error code */ - return 2; - } -} - -static int luaB_dostring (lua_State *L) { - int oldtop = lua_gettop(L); - size_t l; - const char *s = luaL_check_lstr(L, 1, &l); - if (*s == '\27') /* binary files start with ESC... */ - lua_error(L, "`dostring' cannot run pre-compiled code"); - return passresults(L, lua_dobuffer(L, s, l, luaL_opt_string(L, 2, s)), oldtop); -} - - -static int luaB_dofile (lua_State *L) { - int oldtop = lua_gettop(L); - const char *fname = luaL_opt_string(L, 1, NULL); - return passresults(L, lua_dofile(L, fname), oldtop); -} - - -static int luaB_call (lua_State *L) { - int oldtop; - const char *options = luaL_opt_string(L, 3, ""); - int err = 0; /* index of old error method */ - int i, status; - int n; - luaL_checktype(L, 2, LUA_TTABLE); - n = lua_getn(L, 2); - if (!lua_isnull(L, 4)) { /* set new error method */ - lua_getglobal(L, LUA_ERRORMESSAGE); - err = lua_gettop(L); /* get index */ - lua_pushvalue(L, 4); - lua_setglobal(L, LUA_ERRORMESSAGE); - } - oldtop = lua_gettop(L); /* top before function-call preparation */ - /* push function */ - lua_pushvalue(L, 1); - luaL_checkstack(L, n, "too many arguments"); - for (i=0; i<n; i++) /* push arg[1...n] */ - lua_rawgeti(L, 2, i+1); - status = lua_call(L, n, LUA_MULTRET); - if (err != 0) { /* restore old error method */ - lua_pushvalue(L, err); - lua_setglobal(L, LUA_ERRORMESSAGE); - } - if (status != 0) { /* error in call? */ - if (strchr(options, 'x')) - lua_pushnil(L); /* return nil to signal the error */ - else - lua_error(L, NULL); /* propagate error without additional messages */ - return 1; - } - if (strchr(options, 'p')) /* pack results? */ - lua_error(L, "deprecated option `p' in `call'"); - return lua_gettop(L) - oldtop; /* results are already on the stack */ -} - - -static int luaB_tostring (lua_State *L) { - char buff[64]; - switch (lua_type(L, 1)) { - case LUA_TNUMBER: - lua_pushstring(L, lua_tostring(L, 1)); - return 1; - case LUA_TSTRING: - lua_pushvalue(L, 1); - return 1; - case LUA_TTABLE: - sprintf(buff, "table: %p", lua_topointer(L, 1)); - break; - case LUA_TFUNCTION: - sprintf(buff, "function: %p", lua_topointer(L, 1)); - break; - case LUA_TUSERDATA: - sprintf(buff, "userdata(%d): %p", lua_tag(L, 1), lua_touserdata(L, 1)); - break; - case LUA_TNIL: - lua_pushstring(L, "nil"); - return 1; - default: - luaL_argerror(L, 1, "value expected"); - } - lua_pushstring(L, buff); - return 1; -} - - -static int luaB_foreachi (lua_State *L) { - int n, i; - luaL_checktype(L, 1, LUA_TTABLE); - luaL_checktype(L, 2, LUA_TFUNCTION); - n = lua_getn(L, 1); - for (i=1; i<=n; i++) { - lua_pushvalue(L, 2); /* function */ - lua_pushnumber(L, i); /* 1st argument */ - lua_rawgeti(L, 1, i); /* 2nd argument */ - lua_rawcall(L, 2, 1); - if (!lua_isnil(L, -1)) - return 1; - lua_pop(L, 1); /* remove nil result */ - } - return 0; -} - - -static int luaB_foreach (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - luaL_checktype(L, 2, LUA_TFUNCTION); - lua_pushnil(L); /* first index */ - for (;;) { - if (lua_next(L, 1) == 0) - return 0; - lua_pushvalue(L, 2); /* function */ - lua_pushvalue(L, -3); /* key */ - lua_pushvalue(L, -3); /* value */ - lua_rawcall(L, 2, 1); - if (!lua_isnil(L, -1)) - return 1; - lua_pop(L, 2); /* remove value and result */ - } -} - - -static int luaB_assert (lua_State *L) { - luaL_checkany(L, 1); - if (lua_isnil(L, 1)) - luaL_verror(L, "assertion failed! %.90s", luaL_opt_string(L, 2, "")); - return 0; -} - - -static int luaB_getn (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - lua_pushnumber(L, lua_getn(L, 1)); - return 1; -} - - -static int luaB_tinsert (lua_State *L) { - int v = lua_gettop(L); /* last argument: to be inserted */ - int n, pos; - luaL_checktype(L, 1, LUA_TTABLE); - n = lua_getn(L, 1); - if (v == 2) /* called with only 2 arguments */ - pos = n+1; - else - pos = luaL_check_int(L, 2); /* 2nd argument is the position */ - lua_pushstring(L, "n"); - lua_pushnumber(L, n+1); - lua_rawset(L, 1); /* t.n = n+1 */ - for (; n>=pos; n--) { - lua_rawgeti(L, 1, n); - lua_rawseti(L, 1, n+1); /* t[n+1] = t[n] */ - } - lua_pushvalue(L, v); - lua_rawseti(L, 1, pos); /* t[pos] = v */ - return 0; -} - - -static int luaB_tremove (lua_State *L) { - int pos, n; - luaL_checktype(L, 1, LUA_TTABLE); - n = lua_getn(L, 1); - pos = luaL_opt_int(L, 2, n); - if (n <= 0) return 0; /* table is "empty" */ - lua_rawgeti(L, 1, pos); /* result = t[pos] */ - for ( ;pos<n; pos++) { - lua_rawgeti(L, 1, pos+1); - lua_rawseti(L, 1, pos); /* a[pos] = a[pos+1] */ - } - lua_pushstring(L, "n"); - lua_pushnumber(L, n-1); - lua_rawset(L, 1); /* t.n = n-1 */ - lua_pushnil(L); - lua_rawseti(L, 1, n); /* t[n] = nil */ - return 1; -} - - - - -/* -** {====================================================== -** Quicksort -** (based on `Algorithms in MODULA-3', Robert Sedgewick; -** Addison-Wesley, 1993.) -*/ - - -static void set2 (lua_State *L, int i, int j) { - lua_rawseti(L, 1, i); - lua_rawseti(L, 1, j); -} - -static int sort_comp (lua_State *L, int a, int b) { - /* WARNING: the caller (auxsort) must ensure stack space */ - if (!lua_isnil(L, 2)) { /* function? */ - int res; - lua_pushvalue(L, 2); - lua_pushvalue(L, a-1); /* -1 to compensate function */ - lua_pushvalue(L, b-2); /* -2 to compensate function and `a' */ - lua_rawcall(L, 2, 1); - res = !lua_isnil(L, -1); - lua_pop(L, 1); - return res; - } - else /* a < b? */ - return lua_lessthan(L, a, b); -} - -static void auxsort (lua_State *L, int l, int u) { - while (l < u) { /* for tail recursion */ - int i, j; - /* sort elements a[l], a[(l+u)/2] and a[u] */ - lua_rawgeti(L, 1, l); - lua_rawgeti(L, 1, u); - if (sort_comp(L, -1, -2)) /* a[u] < a[l]? */ - set2(L, l, u); /* swap a[l] - a[u] */ - else - lua_pop(L, 2); - if (u-l == 1) break; /* only 2 elements */ - i = (l+u)/2; - lua_rawgeti(L, 1, i); - lua_rawgeti(L, 1, l); - if (sort_comp(L, -2, -1)) /* a[i]<a[l]? */ - set2(L, i, l); - else { - lua_pop(L, 1); /* remove a[l] */ - lua_rawgeti(L, 1, u); - if (sort_comp(L, -1, -2)) /* a[u]<a[i]? */ - set2(L, i, u); - else - lua_pop(L, 2); - } - if (u-l == 2) break; /* only 3 elements */ - lua_rawgeti(L, 1, i); /* Pivot */ - lua_pushvalue(L, -1); - lua_rawgeti(L, 1, u-1); - set2(L, i, u-1); - /* a[l] <= P == a[u-1] <= a[u], only need to sort from l+1 to u-2 */ - i = l; j = u-1; - for (;;) { /* invariant: a[l..i] <= P <= a[j..u] */ - /* repeat ++i until a[i] >= P */ - while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) { - if (i>u) lua_error(L, "invalid order function for sorting"); - lua_pop(L, 1); /* remove a[i] */ - } - /* repeat --j until a[j] <= P */ - while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) { - if (j<l) lua_error(L, "invalid order function for sorting"); - lua_pop(L, 1); /* remove a[j] */ - } - if (j<i) { - lua_pop(L, 3); /* pop pivot, a[i], a[j] */ - break; - } - set2(L, i, j); - } - lua_rawgeti(L, 1, u-1); - lua_rawgeti(L, 1, i); - set2(L, u-1, i); /* swap pivot (a[u-1]) with a[i] */ - /* a[l..i-1] <= a[i] == P <= a[i+1..u] */ - /* adjust so that smaller "half" is in [j..i] and larger one in [l..u] */ - if (i-l < u-i) { - j=l; i=i-1; l=i+2; - } - else { - j=i+1; i=u; u=j-2; - } - auxsort(L, j, i); /* call recursively the smaller one */ - } /* repeat the routine for the larger one */ -} - -static int luaB_sort (lua_State *L) { - int n; - luaL_checktype(L, 1, LUA_TTABLE); - n = lua_getn(L, 1); - if (!lua_isnull(L, 2)) /* is there a 2nd argument? */ - luaL_checktype(L, 2, LUA_TFUNCTION); - lua_settop(L, 2); /* make sure there is two arguments */ - auxsort(L, 1, n); - return 0; -} - -/* }====================================================== */ - - - -/* -** {====================================================== -** Deprecated functions to manipulate global environment. -** ======================================================= -*/ - - -#define num_deprecated 4 - -static const struct luaL_reg deprecated_names [num_deprecated] = { - {"foreachvar", luaB_foreach}, - {"nextvar", luaB_next}, - {"rawgetglobal", luaB_rawget}, - {"rawsetglobal", luaB_rawset} -}; - - -#ifdef LUA_DEPRECATEDFUNCS - -/* -** call corresponding function inserting `globals' as first argument -*/ -static int deprecated_func (lua_State *L) { - lua_insert(L, 1); /* upvalue is the function to be called */ - lua_getglobals(L); - lua_insert(L, 2); /* table of globals is 1o argument */ - lua_rawcall(L, lua_gettop(L)-1, LUA_MULTRET); - return lua_gettop(L); /* return all results */ -} - - -static void deprecated_funcs (lua_State *L) { - int i; - for (i=0; i<num_deprecated; i++) { - lua_pushcfunction(L, deprecated_names[i].func); - lua_pushcclosure(L, deprecated_func, 1); - lua_setglobal(L, deprecated_names[i].name); - } -} - - -#else - -/* -** gives an explicit error in any attempt to call a deprecated function -*/ -static int deprecated_func (lua_State *L) { - luaL_verror(L, "function `%.20s' is deprecated", lua_tostring(L, -1)); - return 0; /* to avoid warnings */ -} - - -static void deprecated_funcs (lua_State *L) { - int i; - for (i=0; i<num_deprecated; i++) { - lua_pushstring(L, deprecated_names[i].name); - lua_pushcclosure(L, deprecated_func, 1); - lua_setglobal(L, deprecated_names[i].name); - } -} - -#endif - -/* }====================================================== */ - -static const struct luaL_reg base_funcs[] = { - {LUA_ALERT, luaB__ALERT}, - {LUA_ERRORMESSAGE, luaB__ERRORMESSAGE}, - {"call", luaB_call}, - {"collectgarbage", luaB_collectgarbage}, - {"copytagmethods", luaB_copytagmethods}, - {"dofile", luaB_dofile}, - {"dostring", luaB_dostring}, - {"error", luaB_error}, - {"foreach", luaB_foreach}, - {"foreachi", luaB_foreachi}, - {"gcinfo", luaB_gcinfo}, - {"getglobal", luaB_getglobal}, - {"gettagmethod", luaB_gettagmethod}, - {"globals", luaB_globals}, - {"newtag", luaB_newtag}, - {"next", luaB_next}, - {"print", luaB_print}, - {"rawget", luaB_rawget}, - {"rawset", luaB_rawset}, - {"rawgettable", luaB_rawget}, /* for compatibility */ - {"rawsettable", luaB_rawset}, /* for compatibility */ - {"setglobal", luaB_setglobal}, - {"settag", luaB_settag}, - {"settagmethod", luaB_settagmethod}, - {"tag", luaB_tag}, - {"tonumber", luaB_tonumber}, - {"tostring", luaB_tostring}, - {"type", luaB_type}, - {"assert", luaB_assert}, - {"getn", luaB_getn}, - {"sort", luaB_sort}, - {"tinsert", luaB_tinsert}, - {"tremove", luaB_tremove} -}; - - - -LUALIB_API void lua_baselibopen (lua_State *L) { - luaL_openl(L, base_funcs); - lua_pushstring(L, LUA_VERSION); - lua_setglobal(L, "_VERSION"); - deprecated_funcs(L); -} - diff --git a/src/lua/lcode.c b/src/lua/lcode.c deleted file mode 100644 index 89de4a55..00000000 --- a/src/lua/lcode.c +++ /dev/null @@ -1,701 +0,0 @@ -/* -** $Id: lcode.c,v 1.4 2004/06/04 13:42:10 neil Exp $ -** Code generator for Lua -** See Copyright Notice in lua.h -*/ - - -#include "stdlib.h" - -#include "lua.h" - -#include "lcode.h" -#include "ldo.h" -#include "llex.h" -#include "lmem.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" - - -void luaK_error (LexState *ls, const char *msg) { - luaX_error(ls, msg, ls->t.token); -} - - -/* -** Returns the the previous instruction, for optimizations. -** If there is a jump target between this and the current instruction, -** returns a dummy instruction to avoid wrong optimizations. -*/ -static Instruction previous_instruction (FuncState *fs) { - if (fs->pc > fs->lasttarget) /* no jumps to current position? */ - return fs->f->code[fs->pc-1]; /* returns previous instruction */ - else - return CREATE_0(OP_END); /* no optimizations after an `END' */ -} - - -int luaK_jump (FuncState *fs) { - int j = luaK_code1(fs, OP_JMP, NO_JUMP); - if (j == fs->lasttarget) { /* possible jumps to this jump? */ - luaK_concat(fs, &j, fs->jlt); /* keep them on hold */ - fs->jlt = NO_JUMP; - } - return j; -} - - -static void luaK_fixjump (FuncState *fs, int pc, int dest) { - Instruction *jmp = &fs->f->code[pc]; - if (dest == NO_JUMP) - SETARG_S(*jmp, NO_JUMP); /* point to itself to represent end of list */ - else { /* jump is relative to position following jump instruction */ - int offset = dest-(pc+1); - if (abs(offset) > MAXARG_S) - luaK_error(fs->ls, "control structure too long"); - SETARG_S(*jmp, offset); - } -} - - -static int luaK_getjump (FuncState *fs, int pc) { - int offset = GETARG_S(fs->f->code[pc]); - if (offset == NO_JUMP) /* point to itself represents end of list */ - return NO_JUMP; /* end of list */ - else - return (pc+1)+offset; /* turn offset into absolute position */ -} - - -/* -** returns current `pc' and marks it as a jump target (to avoid wrong -** optimizations with consecutive instructions not in the same basic block). -** discharge list of jumps to last target. -*/ -int luaK_getlabel (FuncState *fs) { - if (fs->pc != fs->lasttarget) { - int lasttarget = fs->lasttarget; - fs->lasttarget = fs->pc; - luaK_patchlist(fs, fs->jlt, lasttarget); /* discharge old list `jlt' */ - fs->jlt = NO_JUMP; /* nobody jumps to this new label (yet) */ - } - return fs->pc; -} - - -void luaK_deltastack (FuncState *fs, int delta) { - fs->stacklevel += delta; - if (fs->stacklevel > fs->f->maxstacksize) { - if (fs->stacklevel > MAXSTACK) - luaK_error(fs->ls, "function or expression too complex"); - fs->f->maxstacksize = fs->stacklevel; - } -} - - -void luaK_kstr (LexState *ls, int c) { - luaK_code1(ls->fs, OP_PUSHSTRING, c); -} - - -static int number_constant (FuncState *fs, Number r) { - /* check whether `r' has appeared within the last LOOKBACKNUMS entries */ - Proto *f = fs->f; - int c = f->nknum; - int lim = c < LOOKBACKNUMS ? 0 : c-LOOKBACKNUMS; - while (--c >= lim) - if (f->knum[c] == r) return c; - /* not found; create a new entry */ - luaM_growvector(fs->L, f->knum, f->nknum, 1, Number, - "constant table overflow", MAXARG_U); - c = f->nknum++; - f->knum[c] = r; - return c; -} - - -void luaK_number (FuncState *fs, Number f) { - if (f <= (Number)MAXARG_S && (Number)(int)f == f) - luaK_code1(fs, OP_PUSHINT, (int)f); /* f has a short integer value */ - else - luaK_code1(fs, OP_PUSHNUM, number_constant(fs, f)); -} - - -void luaK_adjuststack (FuncState *fs, int n) { - if (n > 0) - luaK_code1(fs, OP_POP, n); - else - luaK_code1(fs, OP_PUSHNIL, -n); -} - - -int luaK_lastisopen (FuncState *fs) { - /* check whether last instruction is an open function call */ - Instruction i = previous_instruction(fs); - if (GET_OPCODE(i) == OP_CALL && GETARG_B(i) == MULT_RET) - return 1; - else return 0; -} - - -void luaK_setcallreturns (FuncState *fs, int nresults) { - if (luaK_lastisopen(fs)) { /* expression is an open function call? */ - SETARG_B(fs->f->code[fs->pc-1], nresults); /* set number of results */ - luaK_deltastack(fs, nresults); /* push results */ - } -} - - -static int discharge (FuncState *fs, expdesc *var) { - switch (var->k) { - case VLOCAL: - luaK_code1(fs, OP_GETLOCAL, var->u.index); - break; - case VGLOBAL: - luaK_code1(fs, OP_GETGLOBAL, var->u.index); - break; - case VINDEXED: - luaK_code0(fs, OP_GETTABLE); - break; - case VEXP: - return 0; /* nothing to do */ - } - var->k = VEXP; - var->u.l.t = var->u.l.f = NO_JUMP; - return 1; -} - - -static void discharge1 (FuncState *fs, expdesc *var) { - discharge(fs, var); - /* if it has jumps then it is already discharged */ - if (var->u.l.t == NO_JUMP && var->u.l.f == NO_JUMP) - luaK_setcallreturns(fs, 1); /* call must return 1 value */ -} - - -void luaK_storevar (LexState *ls, const expdesc *var) { - FuncState *fs = ls->fs; - switch (var->k) { - case VLOCAL: - luaK_code1(fs, OP_SETLOCAL, var->u.index); - break; - case VGLOBAL: - luaK_code1(fs, OP_SETGLOBAL, var->u.index); - break; - case VINDEXED: /* table is at top-3; pop 3 elements after operation */ - luaK_code2(fs, OP_SETTABLE, 3, 3); - break; - default: - LUA_INTERNALERROR("invalid var kind to store"); - } -} - - -static OpCode invertjump (OpCode op) { - switch (op) { - case OP_JMPNE: return OP_JMPEQ; - case OP_JMPEQ: return OP_JMPNE; - case OP_JMPLT: return OP_JMPGE; - case OP_JMPLE: return OP_JMPGT; - case OP_JMPGT: return OP_JMPLE; - case OP_JMPGE: return OP_JMPLT; - case OP_JMPT: case OP_JMPONT: return OP_JMPF; - case OP_JMPF: case OP_JMPONF: return OP_JMPT; - default: - LUA_INTERNALERROR("invalid jump instruction"); - return OP_END; /* to avoid warnings */ - } -} - - -static void luaK_patchlistaux (FuncState *fs, int list, int target, - OpCode special, int special_target) { - Instruction *code = fs->f->code; - while (list != NO_JUMP) { - int next = luaK_getjump(fs, list); - Instruction *i = &code[list]; - OpCode op = GET_OPCODE(*i); - if (op == special) /* this `op' already has a value */ - luaK_fixjump(fs, list, special_target); - else { - luaK_fixjump(fs, list, target); /* do the patch */ - if (op == OP_JMPONT) /* remove eventual values */ - SET_OPCODE(*i, OP_JMPT); - else if (op == OP_JMPONF) - SET_OPCODE(*i, OP_JMPF); - } - list = next; - } -} - - -void luaK_patchlist (FuncState *fs, int list, int target) { - if (target == fs->lasttarget) /* same target that list `jlt'? */ - luaK_concat(fs, &fs->jlt, list); /* delay fixing */ - else - luaK_patchlistaux(fs, list, target, OP_END, 0); -} - - -static int need_value (FuncState *fs, int list, OpCode hasvalue) { - /* check whether list has a jump without a value */ - for (; list != NO_JUMP; list = luaK_getjump(fs, list)) - if (GET_OPCODE(fs->f->code[list]) != hasvalue) return 1; - return 0; /* not found */ -} - - -void luaK_concat (FuncState *fs, int *l1, int l2) { - if (*l1 == NO_JUMP) - *l1 = l2; - else { - int list = *l1; - for (;;) { /* traverse `l1' */ - int next = luaK_getjump(fs, list); - if (next == NO_JUMP) { /* end of list? */ - luaK_fixjump(fs, list, l2); - return; - } - list = next; - } - } -} - - -static void luaK_testgo (FuncState *fs, expdesc *v, int invert, OpCode jump) { - int prevpos; /* position of last instruction */ - Instruction *previous; - int *golist, *exitlist; - if (!invert) { - golist = &v->u.l.f; /* go if false */ - exitlist = &v->u.l.t; /* exit if true */ - } - else { - golist = &v->u.l.t; /* go if true */ - exitlist = &v->u.l.f; /* exit if false */ - } - discharge1(fs, v); - prevpos = fs->pc-1; - previous = &fs->f->code[prevpos]; - LUA_ASSERT(*previous==previous_instruction(fs), "no jump allowed here"); - if (!ISJUMP(GET_OPCODE(*previous))) - prevpos = luaK_code1(fs, jump, NO_JUMP); - else { /* last instruction is already a jump */ - if (invert) - SET_OPCODE(*previous, invertjump(GET_OPCODE(*previous))); - } - luaK_concat(fs, exitlist, prevpos); /* insert last jump in `exitlist' */ - luaK_patchlist(fs, *golist, luaK_getlabel(fs)); - *golist = NO_JUMP; -} - - -void luaK_goiftrue (FuncState *fs, expdesc *v, int keepvalue) { - luaK_testgo(fs, v, 1, keepvalue ? OP_JMPONF : OP_JMPF); -} - - -static void luaK_goiffalse (FuncState *fs, expdesc *v, int keepvalue) { - luaK_testgo(fs, v, 0, keepvalue ? OP_JMPONT : OP_JMPT); -} - - -static int code_label (FuncState *fs, OpCode op, int arg) { - luaK_getlabel(fs); /* those instructions may be jump targets */ - return luaK_code1(fs, op, arg); -} - - -void luaK_tostack (LexState *ls, expdesc *v, int onlyone) { - FuncState *fs = ls->fs; - if (!discharge(fs, v)) { /* `v' is an expression? */ - OpCode previous = GET_OPCODE(fs->f->code[fs->pc-1]); - if (!ISJUMP(previous) && v->u.l.f == NO_JUMP && v->u.l.t == NO_JUMP) { - /* expression has no jumps */ - if (onlyone) - luaK_setcallreturns(fs, 1); /* call must return 1 value */ - } - else { /* expression has jumps */ - int final; /* position after whole expression */ - int j = NO_JUMP; /* eventual jump over values */ - int p_nil = NO_JUMP; /* position of an eventual PUSHNIL */ - int p_1 = NO_JUMP; /* position of an eventual PUSHINT */ - if (ISJUMP(previous) || need_value(fs, v->u.l.f, OP_JMPONF) - || need_value(fs, v->u.l.t, OP_JMPONT)) { - /* expression needs values */ - if (ISJUMP(previous)) - luaK_concat(fs, &v->u.l.t, fs->pc-1); /* put `previous' in t. list */ - else { - j = code_label(fs, OP_JMP, NO_JUMP); /* to jump over both pushes */ - /* correct stack for compiler and symbolic execution */ - luaK_adjuststack(fs, 1); - } - p_nil = code_label(fs, OP_PUSHNILJMP, 0); - p_1 = code_label(fs, OP_PUSHINT, 1); - luaK_patchlist(fs, j, luaK_getlabel(fs)); - } - final = luaK_getlabel(fs); - luaK_patchlistaux(fs, v->u.l.f, p_nil, OP_JMPONF, final); - luaK_patchlistaux(fs, v->u.l.t, p_1, OP_JMPONT, final); - v->u.l.f = v->u.l.t = NO_JUMP; - } - } -} - - -void luaK_prefix (LexState *ls, UnOpr op, expdesc *v) { - FuncState *fs = ls->fs; - if (op == OPR_MINUS) { - luaK_tostack(ls, v, 1); - luaK_code0(fs, OP_MINUS); - } - else { /* op == NOT */ - Instruction *previous; - discharge1(fs, v); - previous = &fs->f->code[fs->pc-1]; - if (ISJUMP(GET_OPCODE(*previous))) - SET_OPCODE(*previous, invertjump(GET_OPCODE(*previous))); - else - luaK_code0(fs, OP_NOT); - /* interchange true and false lists */ - { int temp = v->u.l.f; v->u.l.f = v->u.l.t; v->u.l.t = temp; } - } -} - - -void luaK_infix (LexState *ls, BinOpr op, expdesc *v) { - FuncState *fs = ls->fs; - switch (op) { - case OPR_AND: - luaK_goiftrue(fs, v, 1); - break; - case OPR_OR: - luaK_goiffalse(fs, v, 1); - break; - default: - luaK_tostack(ls, v, 1); /* all other binary operators need a value */ - } -} - - - -static const struct { - OpCode opcode; /* opcode for each binary operator */ - int arg; /* default argument for the opcode */ -} codes[] = { /* ORDER OPR */ - {OP_ADD, 0}, {OP_SUB, 0}, {OP_MULT, 0}, {OP_DIV, 0}, - {OP_POW, 0}, {OP_CONCAT, 2}, - {OP_JMPNE, NO_JUMP}, {OP_JMPEQ, NO_JUMP}, - {OP_JMPLT, NO_JUMP}, {OP_JMPLE, NO_JUMP}, - {OP_JMPGT, NO_JUMP}, {OP_JMPGE, NO_JUMP} -}; - - -void luaK_posfix (LexState *ls, BinOpr op, expdesc *v1, expdesc *v2) { - FuncState *fs = ls->fs; - switch (op) { - case OPR_AND: { - LUA_ASSERT(v1->u.l.t == NO_JUMP, "list must be closed"); - discharge1(fs, v2); - v1->u.l.t = v2->u.l.t; - luaK_concat(fs, &v1->u.l.f, v2->u.l.f); - break; - } - case OPR_OR: { - LUA_ASSERT(v1->u.l.f == NO_JUMP, "list must be closed"); - discharge1(fs, v2); - v1->u.l.f = v2->u.l.f; - luaK_concat(fs, &v1->u.l.t, v2->u.l.t); - break; - } - default: { - luaK_tostack(ls, v2, 1); /* `v2' must be a value */ - luaK_code1(fs, codes[op].opcode, codes[op].arg); - } - } -} - - -static void codelineinfo (FuncState *fs) { - Proto *f = fs->f; - LexState *ls = fs->ls; - if (ls->lastline > fs->lastline) { - luaM_growvector(fs->L, f->lineinfo, f->nlineinfo, 2, int, - "line info overflow", MAX_INT); - if (ls->lastline > fs->lastline+1) - f->lineinfo[f->nlineinfo++] = -(ls->lastline - (fs->lastline+1)); - f->lineinfo[f->nlineinfo++] = fs->pc; - fs->lastline = ls->lastline; - } -} - - -int luaK_code0 (FuncState *fs, OpCode o) { - return luaK_code2(fs, o, 0, 0); -} - - -int luaK_code1 (FuncState *fs, OpCode o, int arg1) { - return luaK_code2(fs, o, arg1, 0); -} - - -int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) { - Instruction i = previous_instruction(fs); - int delta = luaK_opproperties[o].push - luaK_opproperties[o].pop; - int optm = 0; /* 1 when there is an optimization */ - switch (o) { - case OP_CLOSURE: { - delta = -arg2+1; - break; - } - case OP_SETTABLE: { - delta = -arg2; - break; - } - case OP_SETLIST: { - if (arg2 == 0) return NO_JUMP; /* nothing to do */ - delta = -arg2; - break; - } - case OP_SETMAP: { - if (arg1 == 0) return NO_JUMP; /* nothing to do */ - delta = -2*arg1; - break; - } - case OP_RETURN: { - if (GET_OPCODE(i) == OP_CALL && GETARG_B(i) == MULT_RET) { - SET_OPCODE(i, OP_TAILCALL); - SETARG_B(i, arg1); - optm = 1; - } - break; - } - case OP_PUSHNIL: { - if (arg1 == 0) return NO_JUMP; /* nothing to do */ - delta = arg1; - switch(GET_OPCODE(i)) { - case OP_PUSHNIL: SETARG_U(i, GETARG_U(i)+arg1); optm = 1; break; - default: break; - } - break; - } - case OP_POP: { - if (arg1 == 0) return NO_JUMP; /* nothing to do */ - delta = -arg1; - switch(GET_OPCODE(i)) { - case OP_SETTABLE: SETARG_B(i, GETARG_B(i)+arg1); optm = 1; break; - default: break; - } - break; - } - case OP_GETTABLE: { - switch(GET_OPCODE(i)) { - case OP_PUSHSTRING: /* `t.x' */ - SET_OPCODE(i, OP_GETDOTTED); - optm = 1; - break; - case OP_GETLOCAL: /* `t[i]' */ - SET_OPCODE(i, OP_GETINDEXED); - optm = 1; - break; - default: break; - } - break; - } - case OP_ADD: { - switch(GET_OPCODE(i)) { - case OP_PUSHINT: SET_OPCODE(i, OP_ADDI); optm = 1; break; /* `a+k' */ - default: break; - } - break; - } - case OP_SUB: { - switch(GET_OPCODE(i)) { - case OP_PUSHINT: /* `a-k' */ - i = CREATE_S(OP_ADDI, -GETARG_S(i)); - optm = 1; - break; - default: break; - } - break; - } - case OP_CONCAT: { - delta = -arg1+1; - switch(GET_OPCODE(i)) { - case OP_CONCAT: /* `a..b..c' */ - SETARG_U(i, GETARG_U(i)+1); - optm = 1; - break; - default: break; - } - break; - } - case OP_MINUS: { - switch(GET_OPCODE(i)) { - case OP_PUSHINT: /* `-k' */ - SETARG_S(i, -GETARG_S(i)); - optm = 1; - break; - case OP_PUSHNUM: /* `-k' */ - SET_OPCODE(i, OP_PUSHNEGNUM); - optm = 1; - break; - default: break; - } - break; - } - case OP_JMPNE: { - if (i == CREATE_U(OP_PUSHNIL, 1)) { /* `a~=nil' */ - i = CREATE_S(OP_JMPT, NO_JUMP); - optm = 1; - } - break; - } - case OP_JMPEQ: { - if (i == CREATE_U(OP_PUSHNIL, 1)) { /* `a==nil' */ - i = CREATE_0(OP_NOT); - delta = -1; /* just undo effect of previous PUSHNIL */ - optm = 1; - } - break; - } - case OP_JMPT: - case OP_JMPONT: { - switch (GET_OPCODE(i)) { - case OP_NOT: { - i = CREATE_S(OP_JMPF, NO_JUMP); - optm = 1; - break; - } - case OP_PUSHINT: { - if (o == OP_JMPT) { /* JMPONT must keep original integer value */ - i = CREATE_S(OP_JMP, NO_JUMP); - optm = 1; - } - break; - } - case OP_PUSHNIL: { - if (GETARG_U(i) == 1) { - fs->pc--; /* erase previous instruction */ - luaK_deltastack(fs, -1); /* correct stack */ - return NO_JUMP; - } - break; - } - default: break; - } - break; - } - case OP_JMPF: - case OP_JMPONF: { - switch (GET_OPCODE(i)) { - case OP_NOT: { - i = CREATE_S(OP_JMPT, NO_JUMP); - optm = 1; - break; - } - case OP_PUSHINT: { /* `while 1 do ...' */ - fs->pc--; /* erase previous instruction */ - luaK_deltastack(fs, -1); /* correct stack */ - return NO_JUMP; - } - case OP_PUSHNIL: { /* `repeat ... until nil' */ - if (GETARG_U(i) == 1) { - i = CREATE_S(OP_JMP, NO_JUMP); - optm = 1; - } - break; - } - default: break; - } - break; - } - case OP_GETDOTTED: - case OP_GETINDEXED: - case OP_TAILCALL: - case OP_ADDI: { - LUA_INTERNALERROR("instruction used only for optimizations"); - break; - } - default: { - LUA_ASSERT(delta != VD, "invalid delta"); - break; - } - } - luaK_deltastack(fs, delta); - if (optm) { /* optimize: put instruction in place of last one */ - fs->f->code[fs->pc-1] = i; /* change previous instruction */ - return fs->pc-1; /* do not generate new instruction */ - } - /* else build new instruction */ - switch ((enum Mode)luaK_opproperties[o].mode) { - case iO: i = CREATE_0(o); break; - case iU: i = CREATE_U(o, arg1); break; - case iS: i = CREATE_S(o, arg1); break; - case iAB: i = CREATE_AB(o, arg1, arg2); break; - } - codelineinfo(fs); - /* put new instruction in code array */ - luaM_growvector(fs->L, fs->f->code, fs->pc, 1, Instruction, - "code size overflow", MAX_INT); - fs->f->code[fs->pc] = i; - return fs->pc++; -} - - -const struct OpProperties luaK_opproperties[NUM_OPCODES] = { - {iO, 0, 0}, /* OP_END */ - {iU, 0, 0}, /* OP_RETURN */ - {iAB, 0, 0}, /* OP_CALL */ - {iAB, 0, 0}, /* OP_TAILCALL */ - {iU, VD, 0}, /* OP_PUSHNIL */ - {iU, VD, 0}, /* OP_POP */ - {iS, 1, 0}, /* OP_PUSHINT */ - {iU, 1, 0}, /* OP_PUSHSTRING */ - {iU, 1, 0}, /* OP_PUSHNUM */ - {iU, 1, 0}, /* OP_PUSHNEGNUM */ - {iU, 1, 0}, /* OP_PUSHUPVALUE */ - {iU, 1, 0}, /* OP_GETLOCAL */ - {iU, 1, 0}, /* OP_GETGLOBAL */ - {iO, 1, 2}, /* OP_GETTABLE */ - {iU, 1, 1}, /* OP_GETDOTTED */ - {iU, 1, 1}, /* OP_GETINDEXED */ - {iU, 2, 1}, /* OP_PUSHSELF */ - {iU, 1, 0}, /* OP_CREATETABLE */ - {iU, 0, 1}, /* OP_SETLOCAL */ - {iU, 0, 1}, /* OP_SETGLOBAL */ - {iAB, VD, 0}, /* OP_SETTABLE */ - {iAB, VD, 0}, /* OP_SETLIST */ - {iU, VD, 0}, /* OP_SETMAP */ - {iO, 1, 2}, /* OP_ADD */ - {iS, 1, 1}, /* OP_ADDI */ - {iO, 1, 2}, /* OP_SUB */ - {iO, 1, 2}, /* OP_MULT */ - {iO, 1, 2}, /* OP_DIV */ - {iO, 1, 2}, /* OP_POW */ - {iU, VD, 0}, /* OP_CONCAT */ - {iO, 1, 1}, /* OP_MINUS */ - {iO, 1, 1}, /* OP_NOT */ - {iS, 0, 2}, /* OP_JMPNE */ - {iS, 0, 2}, /* OP_JMPEQ */ - {iS, 0, 2}, /* OP_JMPLT */ - {iS, 0, 2}, /* OP_JMPLE */ - {iS, 0, 2}, /* OP_JMPGT */ - {iS, 0, 2}, /* OP_JMPGE */ - {iS, 0, 1}, /* OP_JMPT */ - {iS, 0, 1}, /* OP_JMPF */ - {iS, 0, 1}, /* OP_JMPONT */ - {iS, 0, 1}, /* OP_JMPONF */ - {iS, 0, 0}, /* OP_JMP */ - {iO, 0, 0}, /* OP_PUSHNILJMP */ - {iS, 0, 0}, /* OP_FORPREP */ - {iS, 0, 3}, /* OP_FORLOOP */ - {iS, 2, 0}, /* OP_LFORPREP */ - {iS, 0, 3}, /* OP_LFORLOOP */ - {iAB, VD, 0} /* OP_CLOSURE */ -}; - diff --git a/src/lua/lcode.h b/src/lua/lcode.h deleted file mode 100644 index c413c897..00000000 --- a/src/lua/lcode.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -** $Id: lcode.h,v 1.2 2001/11/26 23:00:23 darkgod Exp $ -** Code generator for Lua -** See Copyright Notice in lua.h -*/ - -#ifndef lcode_h -#define lcode_h - -#include "llex.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" - - -/* -** Marks the end of a patch list. It is an invalid value both as an absolute -** address, and as a list link (would link an element to itself). -*/ -#define NO_JUMP (-1) - - -/* -** grep "ORDER OPR" if you change these enums -*/ -typedef enum BinOpr { - OPR_ADD, OPR_SUB, OPR_MULT, OPR_DIV, OPR_POW, - OPR_CONCAT, - OPR_NE, OPR_EQ, OPR_LT, OPR_LE, OPR_GT, OPR_GE, - OPR_AND, OPR_OR, - OPR_NOBINOPR -} BinOpr; - -typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_NOUNOPR } UnOpr; - - -enum Mode {iO, iU, iS, iAB}; /* instruction format */ - -#define VD 100 /* flag for variable delta */ - -extern const struct OpProperties { - char mode; - unsigned char push; - unsigned char pop; -} luaK_opproperties[NUM_OPCODES]; - - -void luaK_error (LexState *ls, const char *msg); -int luaK_code0 (FuncState *fs, OpCode o); -int luaK_code1 (FuncState *fs, OpCode o, int arg1); -int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2); -int luaK_jump (FuncState *fs); -void luaK_patchlist (FuncState *fs, int list, int target); -void luaK_concat (FuncState *fs, int *l1, int l2); -void luaK_goiftrue (FuncState *fs, expdesc *v, int keepvalue); -int luaK_getlabel (FuncState *fs); -void luaK_deltastack (FuncState *fs, int delta); -void luaK_kstr (LexState *ls, int c); -void luaK_number (FuncState *fs, Number f); -void luaK_adjuststack (FuncState *fs, int n); -int luaK_lastisopen (FuncState *fs); -void luaK_setcallreturns (FuncState *fs, int nresults); -void luaK_tostack (LexState *ls, expdesc *v, int onlyone); -void luaK_storevar (LexState *ls, const expdesc *var); -void luaK_prefix (LexState *ls, UnOpr op, expdesc *v); -void luaK_infix (LexState *ls, BinOpr op, expdesc *v); -void luaK_posfix (LexState *ls, BinOpr op, expdesc *v1, expdesc *v2); - - -#endif diff --git a/src/lua/ldblib.c b/src/lua/ldblib.c deleted file mode 100644 index 481f1d6f..00000000 --- a/src/lua/ldblib.c +++ /dev/null @@ -1,188 +0,0 @@ -/* -** $Id: ldblib.c,v 1.2 2001/11/26 23:00:23 darkgod Exp $ -** Interface from Lua to its debug API -** See Copyright Notice in lua.h -*/ - - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "lua.h" - -#include "lauxlib.h" -#include "luadebug.h" -#include "lualib.h" - - - -static void settabss (lua_State *L, const char *i, const char *v) { - lua_pushstring(L, i); - lua_pushstring(L, v); - lua_settable(L, -3); -} - - -static void settabsi (lua_State *L, const char *i, int v) { - lua_pushstring(L, i); - lua_pushnumber(L, v); - lua_settable(L, -3); -} - - -static int getinfo (lua_State *L) { - lua_Debug ar; - const char *options = luaL_opt_string(L, 2, "flnSu"); - char buff[20]; - if (lua_isnumber(L, 1)) { - if (!lua_getstack(L, (int)lua_tonumber(L, 1), &ar)) { - lua_pushnil(L); /* level out of range */ - return 1; - } - } - else if (lua_isfunction(L, 1)) { - lua_pushvalue(L, 1); - sprintf(buff, ">%.10s", options); - options = buff; - } - else - luaL_argerror(L, 1, "function or level expected"); - if (!lua_getinfo(L, options, &ar)) - luaL_argerror(L, 2, "invalid option"); - lua_newtable(L); - for (; *options; options++) { - switch (*options) { - case 'S': - settabss(L, "source", ar.source); - if (ar.source) - settabss(L, "short_src", ar.short_src); - settabsi(L, "linedefined", ar.linedefined); - settabss(L, "what", ar.what); - break; - case 'l': - settabsi(L, "currentline", ar.currentline); - break; - case 'u': - settabsi(L, "nups", ar.nups); - break; - case 'n': - settabss(L, "name", ar.name); - settabss(L, "namewhat", ar.namewhat); - break; - case 'f': - lua_pushstring(L, "func"); - lua_pushvalue(L, -3); - lua_settable(L, -3); - break; - } - } - return 1; /* return table */ -} - - -static int getlocal (lua_State *L) { - lua_Debug ar; - const char *name; - if (!lua_getstack(L, luaL_check_int(L, 1), &ar)) /* level out of range? */ - luaL_argerror(L, 1, "level out of range"); - name = lua_getlocal(L, &ar, luaL_check_int(L, 2)); - if (name) { - lua_pushstring(L, name); - lua_pushvalue(L, -2); - return 2; - } - else { - lua_pushnil(L); - return 1; - } -} - - -static int setlocal (lua_State *L) { - lua_Debug ar; - if (!lua_getstack(L, luaL_check_int(L, 1), &ar)) /* level out of range? */ - luaL_argerror(L, 1, "level out of range"); - luaL_checkany(L, 3); - lua_pushstring(L, lua_setlocal(L, &ar, luaL_check_int(L, 2))); - return 1; -} - - - -/* dummy variables (to define unique addresses) */ -static char key1, key2; -#define KEY_CALLHOOK (&key1) -#define KEY_LINEHOOK (&key2) - - -static void hookf (lua_State *L, void *key) { - lua_getregistry(L); - lua_pushuserdata(L, key); - lua_gettable(L, -2); - if (lua_isfunction(L, -1)) { - lua_pushvalue(L, 1); - lua_rawcall(L, 1, 0); - } - else - lua_pop(L, 1); /* pop result from gettable */ - lua_pop(L, 1); /* pop table */ -} - - -static void callf (lua_State *L, lua_Debug *ar) { - lua_pushstring(L, ar->event); - hookf(L, KEY_CALLHOOK); -} - - -static void linef (lua_State *L, lua_Debug *ar) { - lua_pushnumber(L, ar->currentline); - hookf(L, KEY_LINEHOOK); -} - - -static void sethook (lua_State *L, void *key, lua_Hook hook, - lua_Hook (*sethookf)(lua_State * L, lua_Hook h)) { - lua_settop(L, 1); - if (lua_isnil(L, 1)) - (*sethookf)(L, NULL); - else if (lua_isfunction(L, 1)) - (*sethookf)(L, hook); - else - luaL_argerror(L, 1, "function expected"); - lua_getregistry(L); - lua_pushuserdata(L, key); - lua_pushvalue(L, -1); /* dup key */ - lua_gettable(L, -3); /* get old value */ - lua_pushvalue(L, -2); /* key (again) */ - lua_pushvalue(L, 1); - lua_settable(L, -5); /* set new value */ -} - - -static int setcallhook (lua_State *L) { - sethook(L, KEY_CALLHOOK, callf, lua_setcallhook); - return 1; -} - - -static int setlinehook (lua_State *L) { - sethook(L, KEY_LINEHOOK, linef, lua_setlinehook); - return 1; -} - - -static const struct luaL_reg dblib[] = { - {"getlocal", getlocal}, - {"getinfo", getinfo}, - {"setcallhook", setcallhook}, - {"setlinehook", setlinehook}, - {"setlocal", setlocal} -}; - - -LUALIB_API void lua_dblibopen (lua_State *L) { - luaL_openl(L, dblib); -} - diff --git a/src/lua/ldebug.c b/src/lua/ldebug.c deleted file mode 100644 index 02481b4c..00000000 --- a/src/lua/ldebug.c +++ /dev/null @@ -1,466 +0,0 @@ -/* -** $Id: ldebug.c,v 1.2 2001/11/26 23:00:23 darkgod Exp $ -** Debug Interface -** See Copyright Notice in lua.h -*/ - - -#include <stdlib.h> - -#include "lua.h" - -#include "lapi.h" -#include "lcode.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "luadebug.h" - - - -static const char *getfuncname (lua_State *L, StkId f, const char **name); - - -static void setnormalized (TObject *d, const TObject *s) { - if (ttype(s) == LUA_TMARK) { - clvalue(d) = infovalue(s)->func; - ttype(d) = LUA_TFUNCTION; - } - else *d = *s; -} - - -static int isLmark (StkId o) { - return (o && ttype(o) == LUA_TMARK && !infovalue(o)->func->isC); -} - - -LUA_API lua_Hook lua_setcallhook (lua_State *L, lua_Hook func) { - lua_Hook oldhook = L->callhook; - L->callhook = func; - return oldhook; -} - - -LUA_API lua_Hook lua_setlinehook (lua_State *L, lua_Hook func) { - lua_Hook oldhook = L->linehook; - L->linehook = func; - return oldhook; -} - - -static StkId aux_stackedfunction (lua_State *L, int level, StkId top) { - int i; - for (i = (top-1) - L->stack; i>=0; i--) { - if (is_T_MARK(L->stack[i].ttype)) { - if (level == 0) - return L->stack+i; - level--; - } - } - return NULL; -} - - -LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { - StkId f = aux_stackedfunction(L, level, L->top); - if (f == NULL) return 0; /* there is no such level */ - else { - ar->_func = f; - return 1; - } -} - - -static int nups (StkId f) { - switch (ttype(f)) { - case LUA_TFUNCTION: - return clvalue(f)->nupvalues; - case LUA_TMARK: - return infovalue(f)->func->nupvalues; - default: - return 0; - } -} - - -int luaG_getline (int *lineinfo, int pc, int refline, int *prefi) { - int refi; - if (lineinfo == NULL || pc == -1) - return -1; /* no line info or function is not active */ - refi = prefi ? *prefi : 0; - if (lineinfo[refi] < 0) - refline += -lineinfo[refi++]; - LUA_ASSERT(lineinfo[refi] >= 0, "invalid line info"); - while (lineinfo[refi] > pc) { - refline--; - refi--; - if (lineinfo[refi] < 0) - refline -= -lineinfo[refi--]; - LUA_ASSERT(lineinfo[refi] >= 0, "invalid line info"); - } - for (;;) { - int nextline = refline + 1; - int nextref = refi + 1; - if (lineinfo[nextref] < 0) - nextline += -lineinfo[nextref++]; - LUA_ASSERT(lineinfo[nextref] >= 0, "invalid line info"); - if (lineinfo[nextref] > pc) - break; - refline = nextline; - refi = nextref; - } - if (prefi) *prefi = refi; - return refline; -} - - -static int currentpc (StkId f) { - CallInfo *ci = infovalue(f); - LUA_ASSERT(isLmark(f), "function has no pc"); - if (ci->pc) - return (*ci->pc - ci->func->f.l->code) - 1; - else - return -1; /* function is not active */ -} - - -static int currentline (StkId f) { - if (!isLmark(f)) - return -1; /* only active lua functions have current-line information */ - else { - CallInfo *ci = infovalue(f); - int *lineinfo = ci->func->f.l->lineinfo; - return luaG_getline(lineinfo, currentpc(f), 1, NULL); - } -} - - - -static Proto *getluaproto (StkId f) { - return (isLmark(f) ? infovalue(f)->func->f.l : NULL); -} - - -LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { - const char *name; - StkId f = ar->_func; - Proto *fp = getluaproto(f); - if (!fp) return NULL; /* `f' is not a Lua function? */ - name = luaF_getlocalname(fp, n, currentpc(f)); - if (!name) return NULL; - luaA_pushobject(L, (f+1)+(n-1)); /* push value */ - return name; -} - - -LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { - const char *name; - StkId f = ar->_func; - Proto *fp = getluaproto(f); - L->top--; /* pop new value */ - if (!fp) return NULL; /* `f' is not a Lua function? */ - name = luaF_getlocalname(fp, n, currentpc(f)); - if (!name || name[0] == '(') return NULL; /* `(' starts private locals */ - *((f+1)+(n-1)) = *L->top; - return name; -} - - -static void infoLproto (lua_Debug *ar, Proto *f) { - ar->source = f->source->str; - ar->linedefined = f->lineDefined; - ar->what = "Lua"; -} - - -static void funcinfo (lua_State *L, lua_Debug *ar, StkId func) { - Closure *cl = NULL; - switch (ttype(func)) { - case LUA_TFUNCTION: - cl = clvalue(func); - break; - case LUA_TMARK: - cl = infovalue(func)->func; - break; - default: - lua_error(L, "value for `lua_getinfo' is not a function"); - } - if (cl->isC) { - ar->source = "=C"; - ar->linedefined = -1; - ar->what = "C"; - } - else - infoLproto(ar, cl->f.l); - luaO_chunkid(ar->short_src, ar->source, sizeof(ar->short_src)); - if (ar->linedefined == 0) - ar->what = "main"; -} - - -static const char *travtagmethods (lua_State *L, const TObject *o) { - if (ttype(o) == LUA_TFUNCTION) { - int e; - for (e=0; e<TM_N; e++) { - int t; - for (t=0; t<=L->last_tag; t++) - if (clvalue(o) == luaT_gettm(L, t, e)) - return luaT_eventname[e]; - } - } - return NULL; -} - - -static const char *travglobals (lua_State *L, const TObject *o) { - Hash *g = L->gt; - int i; - for (i=0; i<g->size; i++) { - if (luaO_equalObj(o, val(node(g, i))) && - ttype(key(node(g, i))) == LUA_TSTRING) - return tsvalue(key(node(g, i)))->str; - } - return NULL; -} - - -static void getname (lua_State *L, StkId f, lua_Debug *ar) { - TObject o; - setnormalized(&o, f); - /* try to find a name for given function */ - if ((ar->name = travglobals(L, &o)) != NULL) - ar->namewhat = "global"; - /* not found: try tag methods */ - else if ((ar->name = travtagmethods(L, &o)) != NULL) - ar->namewhat = "tag-method"; - else ar->namewhat = ""; /* not found at all */ -} - - -LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { - StkId func; - int isactive = (*what != '>'); - if (isactive) - func = ar->_func; - else { - what++; /* skip the '>' */ - func = L->top - 1; - } - for (; *what; what++) { - switch (*what) { - case 'S': { - funcinfo(L, ar, func); - break; - } - case 'l': { - ar->currentline = currentline(func); - break; - } - case 'u': { - ar->nups = nups(func); - break; - } - case 'n': { - ar->namewhat = (isactive) ? getfuncname(L, func, &ar->name) : NULL; - if (ar->namewhat == NULL) - getname(L, func, ar); - break; - } - case 'f': { - setnormalized(L->top, func); - incr_top; /* push function */ - break; - } - default: return 0; /* invalid option */ - } - } - if (!isactive) L->top--; /* pop function */ - return 1; -} - - -/* -** {====================================================== -** Symbolic Execution -** ======================================================= -*/ - - -static int pushpc (int *stack, int pc, int top, int n) { - while (n--) - stack[top++] = pc-1; - return top; -} - - -static Instruction luaG_symbexec (const Proto *pt, int lastpc, int stackpos) { - int stack[MAXSTACK]; /* stores last instruction that changed a stack entry */ - const Instruction *code = pt->code; - int top = pt->numparams; - int pc = 0; - if (pt->is_vararg) /* varargs? */ - top++; /* `arg' */ - while (pc < lastpc) { - const Instruction i = code[pc++]; - LUA_ASSERT(0 <= top && top <= pt->maxstacksize, "wrong stack"); - switch (GET_OPCODE(i)) { - case OP_RETURN: { - LUA_ASSERT(top >= GETARG_U(i), "wrong stack"); - top = GETARG_U(i); - break; - } - case OP_TAILCALL: { - LUA_ASSERT(top >= GETARG_A(i), "wrong stack"); - top = GETARG_B(i); - break; - } - case OP_CALL: { - int nresults = GETARG_B(i); - if (nresults == MULT_RET) nresults = 1; - LUA_ASSERT(top >= GETARG_A(i), "wrong stack"); - top = pushpc(stack, pc, GETARG_A(i), nresults); - break; - } - case OP_PUSHNIL: { - top = pushpc(stack, pc, top, GETARG_U(i)); - break; - } - case OP_POP: { - top -= GETARG_U(i); - break; - } - case OP_SETTABLE: - case OP_SETLIST: { - top -= GETARG_B(i); - break; - } - case OP_SETMAP: { - top -= 2*GETARG_U(i); - break; - } - case OP_CONCAT: { - top -= GETARG_U(i); - stack[top++] = pc-1; - break; - } - case OP_CLOSURE: { - top -= GETARG_B(i); - stack[top++] = pc-1; - break; - } - case OP_JMPONT: - case OP_JMPONF: { - int newpc = pc + GETARG_S(i); - /* jump is forward and do not skip `lastpc'? */ - if (pc < newpc && newpc <= lastpc) { - stack[top-1] = pc-1; /* value comes from `and'/`or' */ - pc = newpc; /* do the jump */ - } - else - top--; /* do not jump; pop value */ - break; - } - default: { - OpCode op = GET_OPCODE(i); - LUA_ASSERT(luaK_opproperties[op].push != VD, - "invalid opcode for default"); - top -= luaK_opproperties[op].pop; - LUA_ASSERT(top >= 0, "wrong stack"); - top = pushpc(stack, pc, top, luaK_opproperties[op].push); - } - } - } - return code[stack[stackpos]]; -} - - -static const char *getobjname (lua_State *L, StkId obj, const char **name) { - StkId func = aux_stackedfunction(L, 0, obj); - if (!isLmark(func)) - return NULL; /* not an active Lua function */ - else { - Proto *p = infovalue(func)->func->f.l; - int pc = currentpc(func); - int stackpos = obj - (func+1); /* func+1 == function base */ - Instruction i = luaG_symbexec(p, pc, stackpos); - LUA_ASSERT(pc != -1, "function must be active"); - switch (GET_OPCODE(i)) { - case OP_GETGLOBAL: { - *name = p->kstr[GETARG_U(i)]->str; - return "global"; - } - case OP_GETLOCAL: { - *name = luaF_getlocalname(p, GETARG_U(i)+1, pc); - LUA_ASSERT(*name, "local must exist"); - return "local"; - } - case OP_PUSHSELF: - case OP_GETDOTTED: { - *name = p->kstr[GETARG_U(i)]->str; - return "field"; - } - default: - return NULL; /* no useful name found */ - } - } -} - - -static const char *getfuncname (lua_State *L, StkId f, const char **name) { - StkId func = aux_stackedfunction(L, 0, f); /* calling function */ - if (!isLmark(func)) - return NULL; /* not an active Lua function */ - else { - Proto *p = infovalue(func)->func->f.l; - int pc = currentpc(func); - Instruction i; - if (pc == -1) return NULL; /* function is not activated */ - i = p->code[pc]; - switch (GET_OPCODE(i)) { - case OP_CALL: case OP_TAILCALL: - return getobjname(L, (func+1)+GETARG_A(i), name); - default: - return NULL; /* no useful name found */ - } - } -} - - -/* }====================================================== */ - - -void luaG_typeerror (lua_State *L, StkId o, const char *op) { - const char *name; - const char *kind = getobjname(L, o, &name); - const char *t = luaO_typename(o); - if (kind) - luaO_verror(L, "attempt to %.30s %.20s `%.40s' (a %.10s value)", - op, kind, name, t); - else - luaO_verror(L, "attempt to %.30s a %.10s value", op, t); -} - - -void luaG_binerror (lua_State *L, StkId p1, int t, const char *op) { - if (ttype(p1) == t) p1++; - LUA_ASSERT(ttype(p1) != t, "must be an error"); - luaG_typeerror(L, p1, op); -} - - -void luaG_ordererror (lua_State *L, StkId top) { - const char *t1 = luaO_typename(top-2); - const char *t2 = luaO_typename(top-1); - if (t1[2] == t2[2]) - luaO_verror(L, "attempt to compare two %.10s values", t1); - else - luaO_verror(L, "attempt to compare %.10s with %.10s", t1, t2); -} - diff --git a/src/lua/ldebug.h b/src/lua/ldebug.h deleted file mode 100644 index 76865616..00000000 --- a/src/lua/ldebug.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -** $Id: ldebug.h,v 1.2 2001/11/26 23:00:23 darkgod Exp $ -** Auxiliary functions from Debug Interface module -** See Copyright Notice in lua.h -*/ - -#ifndef ldebug_h -#define ldebug_h - - -#include "lstate.h" -#include "luadebug.h" - - -void luaG_typeerror (lua_State *L, StkId o, const char *op); -void luaG_binerror (lua_State *L, StkId p1, int t, const char *op); -int luaG_getline (int *lineinfo, int pc, int refline, int *refi); -void luaG_ordererror (lua_State *L, StkId top); - - -#endif diff --git a/src/lua/ldo.c b/src/lua/ldo.c deleted file mode 100644 index 5f23bfd9..00000000 --- a/src/lua/ldo.c +++ /dev/null @@ -1,385 +0,0 @@ -/* -** $Id: ldo.c,v 1.7 2004/06/04 13:42:10 neil Exp $ -** Stack and Call structure of Lua -** See Copyright Notice in lua.h -*/ - - -#include <setjmp.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lparser.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lundump.h" -#include "lvm.h" -#include "lzio.h" - - -/* space to handle stack overflow errors */ -#define EXTRA_STACK (2*LUA_MINSTACK) - - -void luaD_init (lua_State *L, int stacksize) { - L->stack = luaM_newvector(L, stacksize+EXTRA_STACK, TObject); - L->nblocks += stacksize*sizeof(TObject); - L->stack_last = L->stack+(stacksize-1); - L->stacksize = stacksize; - L->Cbase = L->top = L->stack; -} - - -void luaD_checkstack (lua_State *L, int n) { - if (L->stack_last - L->top <= n) { /* stack overflow? */ - if (L->stack_last-L->stack > (L->stacksize-1)) { - /* overflow while handling overflow */ - luaD_breakrun(L, LUA_ERRERR); /* break run without error message */ - } - else { - L->stack_last += EXTRA_STACK; /* to be used by error message */ - lua_error(L, "stack overflow"); - } - } -} - - -static void restore_stack_limit (lua_State *L) { - if (L->top - L->stack < L->stacksize - 1) - L->stack_last = L->stack + (L->stacksize-1); -} - - -/* -** Adjust stack. Set top to base+extra, pushing NILs if needed. -** (we cannot add base+extra unless we are sure it fits in the stack; -** otherwise the result of such operation on pointers is undefined) -*/ -void luaD_adjusttop (lua_State *L, StkId base, int extra) { - int diff = extra-(L->top-base); - if (diff <= 0) - L->top = base+extra; - else { - luaD_checkstack(L, diff); - while (diff--) - ttype(L->top++) = LUA_TNIL; - } -} - - -/* -** Open a hole inside the stack at `pos' -*/ -static void luaD_openstack (lua_State *L, StkId pos) { - int i = L->top-pos; - while (i--) pos[i+1] = pos[i]; - incr_top; -} - - -static void dohook (lua_State *L, lua_Debug *ar, lua_Hook hook) { - StkId old_Cbase = L->Cbase; - StkId old_top = L->Cbase = L->top; - luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ - L->allowhooks = 0; /* cannot call hooks inside a hook */ - (*hook)(L, ar); - LUA_ASSERT(L->allowhooks == 0, "invalid allow"); - L->allowhooks = 1; - L->top = old_top; - L->Cbase = old_Cbase; -} - - -void luaD_lineHook (lua_State *L, StkId func, int line, lua_Hook linehook) { - if (L->allowhooks) { - lua_Debug ar; - ar._func = func; - ar.event = "line"; - ar.currentline = line; - dohook(L, &ar, linehook); - } -} - - -static void luaD_callHook (lua_State *L, StkId func, lua_Hook callhook, - const char *event) { - if (L->allowhooks) { - lua_Debug ar; - ar._func = func; - ar.event = event; - infovalue(func)->pc = NULL; /* function is not active */ - dohook(L, &ar, callhook); - } -} - - -static StkId callCclosure (lua_State *L, const struct Closure *cl, StkId base) { - int nup = cl->nupvalues; /* number of upvalues */ - StkId old_Cbase = L->Cbase; - int n; - L->Cbase = base; /* new base for C function */ - luaD_checkstack(L, nup+LUA_MINSTACK); /* ensure minimum stack size */ - for (n=0; n<nup; n++) /* copy upvalues as extra arguments */ - *(L->top++) = cl->upvalue[n]; - n = (*cl->f.c)(L); /* do the actual call */ - L->Cbase = old_Cbase; /* restore old C base */ - return L->top - n; /* return index of first result */ -} - - -void luaD_callTM (lua_State *L, Closure *f, int nParams, int nResults) { - StkId base = L->top - nParams; - luaD_openstack(L, base); - clvalue(base) = f; - ttype(base) = LUA_TFUNCTION; - luaD_call(L, base, nResults); -} - - -/* -** Call a function (C or Lua). The function to be called is at *func. -** The arguments are on the stack, right after the function. -** When returns, the results are on the stack, starting at the original -** function position. -** The number of results is nResults, unless nResults=LUA_MULTRET. -*/ -void luaD_call (lua_State *L, StkId func, int nResults) { - lua_Hook callhook; - StkId firstResult; - CallInfo ci; - Closure *cl; - if (ttype(func) != LUA_TFUNCTION) { - /* `func' is not a function; check the `function' tag method */ - Closure *tm = luaT_gettmbyObj(L, func, TM_FUNCTION); - if (tm == NULL) - luaG_typeerror(L, func, "call"); - luaD_openstack(L, func); - clvalue(func) = tm; /* tag method is the new function to be called */ - ttype(func) = LUA_TFUNCTION; - } - cl = clvalue(func); - ci.func = cl; - infovalue(func) = &ci; - ttype(func) = LUA_TMARK; - callhook = L->callhook; - if (callhook) - luaD_callHook(L, func, callhook, "call"); - firstResult = (cl->isC ? callCclosure(L, cl, func+1) : - luaV_execute(L, cl, func+1)); - if (callhook) /* same hook that was active at entry */ - luaD_callHook(L, func, callhook, "return"); - LUA_ASSERT(ttype(func) == LUA_TMARK, "invalid tag"); - /* move results to `func' (to erase parameters and function) */ - if (nResults == LUA_MULTRET) { - while (firstResult < L->top) /* copy all results */ - *func++ = *firstResult++; - L->top = func; - } - else { /* copy at most `nResults' */ - for (; nResults > 0 && firstResult < L->top; nResults--) - *func++ = *firstResult++; - L->top = func; - for (; nResults > 0; nResults--) { /* if there are not enough results */ - ttype(L->top) = LUA_TNIL; /* adjust the stack */ - incr_top; /* must check stack space */ - } - } - luaC_checkGC(L); -} - - -/* -** Execute a protected call. -*/ -struct CallS { /* data to `f_call' */ - StkId func; - int nresults; -}; - -static void f_call (lua_State *L, void *ud) { - struct CallS *c = (struct CallS *)ud; - luaD_call(L, c->func, c->nresults); -} - - -LUA_API int lua_call (lua_State *L, int nargs, int nresults) { - StkId func = L->top - (nargs+1); /* function to be called */ - struct CallS c; - int status; - c.func = func; c.nresults = nresults; - status = luaD_runprotected(L, f_call, &c); - if (status != 0) /* an error occurred? */ - L->top = func; /* remove parameters from the stack */ - return status; -} - - -/* -** Execute a protected parser. -*/ -struct ParserS { /* data to `f_parser' */ - ZIO *z; - int bin; -}; - -static void f_parser (lua_State *L, void *ud) { - struct ParserS *p = (struct ParserS *)ud; - Proto *tf = p->bin ? luaU_undump(L, p->z) : luaY_parser(L, p->z); - luaV_Lclosure(L, tf, 0); -} - - -static int protectedparser (lua_State *L, ZIO *z, int bin) { - struct ParserS p; - unsigned long old_blocks; - int status; - p.z = z; p.bin = bin; - luaC_checkGC(L); - old_blocks = L->nblocks; - status = luaD_runprotected(L, f_parser, &p); - if (status == 0) { - /* add new memory to threshold (as it probably will stay) */ - L->GCthreshold += (L->nblocks - old_blocks); - } - else if (status == LUA_ERRRUN) /* an error occurred: correct error code */ - status = LUA_ERRSYNTAX; - return status; -} - - -static int parse_file (lua_State *L, const char *filename) { - ZIO z; - int status; - int bin; /* flag for file mode */ - int c; /* look ahead char */ - FILE *f = (filename == NULL) ? stdin : fopen(filename, "r"); - if (f == NULL) return LUA_ERRFILE; /* unable to open file */ - c = fgetc(f); - ungetc(c, f); - bin = (c == ID_CHUNK); - if (bin && f != stdin) { - f = freopen(filename, "rb", f); /* set binary mode */ - if (f == NULL) return LUA_ERRFILE; /* unable to reopen file */ - } - lua_pushstring(L, "@"); - lua_pushstring(L, (filename == NULL) ? "(stdin)" : filename); - lua_concat(L, 2); - filename = lua_tostring(L, -1); /* filename = '@'..filename */ - lua_pop(L, 1); /* OK: there is no GC during parser */ - luaZ_Fopen(&z, f, filename); - status = protectedparser(L, &z, bin); - if (f != stdin) - fclose(f); - return status; -} - - -LUA_API int lua_dofile (lua_State *L, const char *filename) { - int status = parse_file(L, filename); - if (status == 0) /* parse OK? */ - status = lua_call(L, 0, LUA_MULTRET); /* call main */ - return status; -} - - -static int parse_buffer (lua_State *L, const char *buff, size_t size, - const char *name) { - ZIO z; - if (!name) name = "?"; - luaZ_mopen(&z, buff, size, name); - return protectedparser(L, &z, buff[0]==ID_CHUNK); -} - - -LUA_API int lua_dobuffer (lua_State *L, const char *buff, size_t size, const char *name) { - int status = parse_buffer(L, buff, size, name); - if (status == 0) /* parse OK? */ - status = lua_call(L, 0, LUA_MULTRET); /* call main */ - return status; -} - - -LUA_API int lua_dostring (lua_State *L, const char *str) { - return lua_dobuffer(L, str, strlen(str), str); -} - - -/* -** {====================================================== -** Error-recover functions (based on long jumps) -** ======================================================= -*/ - -/* chain list of long jump buffers */ -struct lua_longjmp { - jmp_buf b; - struct lua_longjmp *previous; - volatile int status; /* error code */ -}; - - -static void message (lua_State *L, const char *s) { - const TObject *em = luaH_getglobal(L, LUA_ERRORMESSAGE); - if (ttype(em) == LUA_TFUNCTION) { - *L->top = *em; - incr_top; - lua_pushstring(L, s); - luaD_call(L, L->top-2, 0); - } -} - - -/* -** Reports an error, and jumps up to the available recovery label -*/ -LUA_API void lua_error (lua_State *L, const char *s) { - if (s) message(L, s); - luaD_breakrun(L, LUA_ERRRUN); -} - - -void luaD_breakrun (lua_State *L, int errcode) { - if (L->errorJmp) { - L->errorJmp->status = errcode; - longjmp(L->errorJmp->b, 1); - } - else { - if (errcode != LUA_ERRMEM) - message(L, "unable to recover; exiting\n"); - exit(EXIT_FAILURE); - } -} - - -int luaD_runprotected (lua_State *L, void (*f)(lua_State *, void *), void *ud) { - StkId oldCbase = L->Cbase; - StkId oldtop = L->top; - struct lua_longjmp lj; - int allowhooks = L->allowhooks; - lj.status = 0; - lj.previous = L->errorJmp; /* chain new error handler */ - L->errorJmp = &lj; - if (setjmp(lj.b) == 0) - (*f)(L, ud); - else { /* an error occurred: restore the state */ - L->allowhooks = allowhooks; - L->Cbase = oldCbase; - L->top = oldtop; - restore_stack_limit(L); - } - L->errorJmp = lj.previous; /* restore old error handler */ - return lj.status; -} - -/* }====================================================== */ - diff --git a/src/lua/ldo.h b/src/lua/ldo.h deleted file mode 100644 index d948ad35..00000000 --- a/src/lua/ldo.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -** $Id: ldo.h,v 1.3 2001/11/26 23:00:23 darkgod Exp $ -** Stack and Call structure of Lua -** See Copyright Notice in lua.h -*/ - -#ifndef ldo_h -#define ldo_h - - -#include "lobject.h" -#include "lstate.h" - - -/* -** macro to increment stack top. -** There must be always an empty slot at the L->stack.top -*/ -#define incr_top {if (L->top == L->stack_last) luaD_checkstack(L, 1); L->top++;} - - -void luaD_init (lua_State *L, int stacksize); -void luaD_adjusttop (lua_State *L, StkId base, int extra); -void luaD_lineHook (lua_State *L, StkId func, int line, lua_Hook linehook); -void luaD_call (lua_State *L, StkId func, int nResults); -void luaD_callTM (lua_State *L, Closure *f, int nParams, int nResults); -void luaD_checkstack (lua_State *L, int n); - -void luaD_breakrun (lua_State *L, int errcode); -int luaD_runprotected (lua_State *L, void (*f)(lua_State *, void *), void *ud); - - -#endif diff --git a/src/lua/lfunc.c b/src/lua/lfunc.c deleted file mode 100644 index d3427653..00000000 --- a/src/lua/lfunc.c +++ /dev/null @@ -1,109 +0,0 @@ -/* -** $Id: lfunc.c,v 1.3 2001/11/26 23:00:23 darkgod Exp $ -** Auxiliary functions to manipulate prototypes and closures -** See Copyright Notice in lua.h -*/ - - -#include <stdlib.h> - -#include "lua.h" - -#include "lfunc.h" -#include "lmem.h" -#include "lstate.h" - - -#define sizeclosure(n) ((int)sizeof(Closure) + (int)sizeof(TObject)*((n)-1)) - - -Closure *luaF_newclosure (lua_State *L, int nelems) { - int size = sizeclosure(nelems); - Closure *c = (Closure *)luaM_malloc(L, size); - c->next = L->rootcl; - L->rootcl = c; - c->mark = c; - c->nupvalues = nelems; - L->nblocks += size; - return c; -} - - -Proto *luaF_newproto (lua_State *L) { - Proto *f = luaM_new(L, Proto); - f->knum = NULL; - f->nknum = 0; - f->kstr = NULL; - f->nkstr = 0; - f->kproto = NULL; - f->nkproto = 0; - f->code = NULL; - f->ncode = 0; - f->numparams = 0; - f->is_vararg = 0; - f->maxstacksize = 0; - f->marked = 0; - f->lineinfo = NULL; - f->nlineinfo = 0; - f->nlocvars = 0; - f->locvars = NULL; - f->lineDefined = 0; - f->source = NULL; - f->next = L->rootproto; /* chain in list of protos */ - L->rootproto = f; - return f; -} - - -static size_t protosize (Proto *f) { - return sizeof(Proto) - + f->nknum*sizeof(Number) - + f->nkstr*sizeof(TString *) - + f->nkproto*sizeof(Proto *) - + f->ncode*sizeof(Instruction) - + f->nlocvars*sizeof(struct LocVar) - + f->nlineinfo*sizeof(int); -} - - -void luaF_protook (lua_State *L, Proto *f, int pc) { - f->ncode = pc; /* signal that proto was properly created */ - L->nblocks += protosize(f); -} - - -void luaF_freeproto (lua_State *L, Proto *f) { - if (f->ncode > 0) /* function was properly created? */ - L->nblocks -= protosize(f); - luaM_free(L, f->code); - luaM_free(L, f->locvars); - luaM_free(L, f->kstr); - luaM_free(L, f->knum); - luaM_free(L, f->kproto); - luaM_free(L, f->lineinfo); - luaM_free(L, f); -} - - -void luaF_freeclosure (lua_State *L, Closure *c) { - L->nblocks -= sizeclosure(c->nupvalues); - luaM_free(L, c); -} - - -/* -** Look for n-th local variable at line `line' in function `func'. -** Returns NULL if not found. -*/ -const char *luaF_getlocalname (const Proto *f, int local_number, int pc) { - int i; - for (i = 0; i<f->nlocvars && f->locvars[i].startpc <= pc; i++) { - if (pc < f->locvars[i].endpc) { /* is variable active? */ - local_number--; - if (local_number == 0) - return f->locvars[i].varname->str; - } - } - return NULL; /* not found */ -} - diff --git a/src/lua/lfunc.h b/src/lua/lfunc.h deleted file mode 100644 index 1bd9722d..00000000 --- a/src/lua/lfunc.h +++ /dev/null @@ -1,24 +0,0 @@ -/* -** $Id: lfunc.h,v 1.3 2001/11/26 23:00:23 darkgod Exp $ -** Auxiliary functions to manipulate prototypes and closures -** See Copyright Notice in lua.h -*/ - -#ifndef lfunc_h -#define lfunc_h - - -#include "lobject.h" - - - -Proto *luaF_newproto (lua_State *L); -void luaF_protook (lua_State *L, Proto *f, int pc); -Closure *luaF_newclosure (lua_State *L, int nelems); -void luaF_freeproto (lua_State *L, Proto *f); -void luaF_freeclosure (lua_State *L, Closure *c); - -const char *luaF_getlocalname (const Proto *func, int local_number, int pc); - - -#endif diff --git a/src/lua/lgc.c b/src/lua/lgc.c deleted file mode 100644 index 4e8b234d..00000000 --- a/src/lua/lgc.c +++ /dev/null @@ -1,353 +0,0 @@ -/* -** $Id: lgc.c,v 1.3 2001/11/26 23:00:24 darkgod Exp $ -** Garbage Collector -** See Copyright Notice in lua.h -*/ - -#include "lua.h" - -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" - - -typedef struct GCState { - Hash *tmark; /* list of marked tables to be visited */ - Closure *cmark; /* list of marked closures to be visited */ -} GCState; - - - -static void markobject (GCState *st, TObject *o); - - -/* mark a string; marks larger than 1 cannot be changed */ -#define strmark(s) {if ((s)->marked == 0) (s)->marked = 1;} - - - -static void protomark (Proto *f) { - if (!f->marked) { - int i; - f->marked = 1; - strmark(f->source); - for (i=0; i<f->nkstr; i++) - strmark(f->kstr[i]); - for (i=0; i<f->nkproto; i++) - protomark(f->kproto[i]); - for (i=0; i<f->nlocvars; i++) /* mark local-variable names */ - strmark(f->locvars[i].varname); - } -} - - -static void markstack (lua_State *L, GCState *st) { - StkId o; - for (o=L->stack; o<L->top; o++) - markobject(st, o); -} - - -static void marklock (lua_State *L, GCState *st) { - int i; - for (i=0; i<L->refSize; i++) { - if (L->refArray[i].st == LOCK) - markobject(st, &L->refArray[i].o); - } -} - - -static void markclosure (GCState *st, Closure *cl) { - if (!ismarked(cl)) { - if (!cl->isC) - protomark(cl->f.l); - cl->mark = st->cmark; /* chain it for later traversal */ - st->cmark = cl; - } -} - - -static void marktagmethods (lua_State *L, GCState *st) { - int e; - for (e=0; e<TM_N; e++) { - int t; - for (t=0; t<=L->last_tag; t++) { - Closure *cl = luaT_gettm(L, t, e); - if (cl) markclosure(st, cl); - } - } -} - - -static void markobject (GCState *st, TObject *o) { - switch (ttype(o)) { - case LUA_TUSERDATA: case LUA_TSTRING: - strmark(tsvalue(o)); - break; - case LUA_TMARK: - markclosure(st, infovalue(o)->func); - break; - case LUA_TFUNCTION: - markclosure(st, clvalue(o)); - break; - case LUA_TTABLE: { - if (!ismarked(hvalue(o))) { - hvalue(o)->mark = st->tmark; /* chain it in list of marked */ - st->tmark = hvalue(o); - } - break; - } - default: break; /* numbers, etc */ - } -} - - -static void markall (lua_State *L) { - GCState st; - st.cmark = NULL; - st.tmark = L->gt; /* put table of globals in mark list */ - L->gt->mark = NULL; - marktagmethods(L, &st); /* mark tag methods */ - markstack(L, &st); /* mark stack objects */ - marklock(L, &st); /* mark locked objects */ - for (;;) { /* mark tables and closures */ - if (st.cmark) { - int i; - Closure *f = st.cmark; /* get first closure from list */ - st.cmark = f->mark; /* remove it from list */ - for (i=0; i<f->nupvalues; i++) /* mark its upvalues */ - markobject(&st, &f->upvalue[i]); - } - else if (st.tmark) { - int i; - Hash *h = st.tmark; /* get first table from list */ - st.tmark = h->mark; /* remove it from list */ - for (i=0; i<h->size; i++) { - Node *n = node(h, i); - if (ttype(key(n)) != LUA_TNIL) { - if (ttype(val(n)) == LUA_TNIL) - luaH_remove(h, key(n)); /* dead element; try to remove it */ - markobject(&st, &n->key); - markobject(&st, &n->val); - } - } - } - else break; /* nothing else to mark */ - } -} - - -static int hasmark (const TObject *o) { - /* valid only for locked objects */ - switch (o->ttype) { - case LUA_TSTRING: case LUA_TUSERDATA: - return tsvalue(o)->marked; - case LUA_TTABLE: - return ismarked(hvalue(o)); - case LUA_TFUNCTION: - return ismarked(clvalue(o)); - default: /* number */ - return 1; - } -} - - -/* macro for internal debugging; check if a link of free refs is valid */ -#define VALIDLINK(L, st,n) (NONEXT <= (st) && (st) < (n)) - -static void invalidaterefs (lua_State *L) { - int n = L->refSize; - int i; - for (i=0; i<n; i++) { - struct Ref *r = &L->refArray[i]; - if (r->st == HOLD && !hasmark(&r->o)) - r->st = COLLECTED; - LUA_ASSERT((r->st == LOCK && hasmark(&r->o)) || - (r->st == HOLD && hasmark(&r->o)) || - r->st == COLLECTED || - r->st == NONEXT || - (r->st < n && VALIDLINK(L, L->refArray[r->st].st, n)), - "inconsistent ref table"); - } - LUA_ASSERT(VALIDLINK(L, L->refFree, n), "inconsistent ref table"); -} - - - -static void collectproto (lua_State *L) { - Proto **p = &L->rootproto; - Proto *next; - while ((next = *p) != NULL) { - if (next->marked) { - next->marked = 0; - p = &next->next; - } - else { - *p = next->next; - luaF_freeproto(L, next); - } - } -} - - -static void collectclosure (lua_State *L) { - Closure **p = &L->rootcl; - Closure *next; - while ((next = *p) != NULL) { - if (ismarked(next)) { - next->mark = next; /* unmark */ - p = &next->next; - } - else { - *p = next->next; - luaF_freeclosure(L, next); - } - } -} - - -static void collecttable (lua_State *L) { - Hash **p = &L->roottable; - Hash *next; - while ((next = *p) != NULL) { - if (ismarked(next)) { - next->mark = next; /* unmark */ - p = &next->next; - } - else { - *p = next->next; - luaH_free(L, next); - } - } -} - - -static void checktab (lua_State *L, stringtable *tb) { - if (tb->nuse < (lint32)(tb->size/4) && tb->size > 10) - luaS_resize(L, tb, tb->size/2); /* table is too big */ -} - - -static void collectstrings (lua_State *L, int all) { - int i; - for (i=0; i<L->strt.size; i++) { /* for each list */ - TString **p = &L->strt.hash[i]; - TString *next; - while ((next = *p) != NULL) { - if (next->marked && !all) { /* preserve? */ - if (next->marked < FIXMARK) /* does not change FIXMARKs */ - next->marked = 0; - p = &next->nexthash; - } - else { /* collect */ - *p = next->nexthash; - L->strt.nuse--; - L->nblocks -= sizestring(next->len); - luaM_free(L, next); - } - } - } - checktab(L, &L->strt); -} - - -static void collectudata (lua_State *L, int all) { - int i; - for (i=0; i<L->udt.size; i++) { /* for each list */ - TString **p = &L->udt.hash[i]; - TString *next; - while ((next = *p) != NULL) { - LUA_ASSERT(next->marked <= 1, "udata cannot be fixed"); - if (next->marked && !all) { /* preserve? */ - next->marked = 0; - p = &next->nexthash; - } - else { /* collect */ - int tag = next->u.d.tag; - *p = next->nexthash; - next->nexthash = L->TMtable[tag].collected; /* chain udata */ - L->TMtable[tag].collected = next; - L->nblocks -= sizestring(next->len); - L->udt.nuse--; - } - } - } - checktab(L, &L->udt); -} - - -#define MINBUFFER 256 -static void checkMbuffer (lua_State *L) { - if (L->Mbuffsize > MINBUFFER*2) { /* is buffer too big? */ - size_t newsize = L->Mbuffsize/2; /* still larger than MINBUFFER */ - L->nblocks += (newsize - L->Mbuffsize)*sizeof(char); - L->Mbuffsize = newsize; - luaM_reallocvector(L, L->Mbuffer, newsize, char); - } -} - - -static void callgcTM (lua_State *L, const TObject *o) { - Closure *tm = luaT_gettmbyObj(L, o, TM_GC); - if (tm != NULL) { - int oldah = L->allowhooks; - L->allowhooks = 0; /* stop debug hooks during GC tag methods */ - luaD_checkstack(L, 2); - clvalue(L->top) = tm; - ttype(L->top) = LUA_TFUNCTION; - *(L->top+1) = *o; - L->top += 2; - luaD_call(L, L->top-2, 0); - L->allowhooks = oldah; /* restore hooks */ - } -} - - -static void callgcTMudata (lua_State *L) { - int tag; - TObject o; - ttype(&o) = LUA_TUSERDATA; - L->GCthreshold = 2*L->nblocks; /* avoid GC during tag methods */ - for (tag=L->last_tag; tag>=0; tag--) { /* for each tag (in reverse order) */ - TString *udata; - while ((udata = L->TMtable[tag].collected) != NULL) { - L->TMtable[tag].collected = udata->nexthash; /* remove it from list */ - tsvalue(&o) = udata; - callgcTM(L, &o); - luaM_free(L, udata); - } - } -} - - -void luaC_collect (lua_State *L, int all) { - collectudata(L, all); - callgcTMudata(L); - collectstrings(L, all); - collecttable(L); - collectproto(L); - collectclosure(L); -} - - -static void luaC_collectgarbage (lua_State *L) { - markall(L); - invalidaterefs(L); /* check unlocked references */ - luaC_collect(L, 0); - checkMbuffer(L); - L->GCthreshold = 2*L->nblocks; /* set new threshold */ - callgcTM(L, &luaO_nilobject); -} - - -void luaC_checkGC (lua_State *L) { - if (L->nblocks >= L->GCthreshold) - luaC_collectgarbage(L); -} - diff --git a/src/lua/lgc.h b/src/lua/lgc.h deleted file mode 100644 index 2dea9e4d..00000000 --- a/src/lua/lgc.h +++ /dev/null @@ -1,18 +0,0 @@ -/* -** $Id: lgc.h,v 1.3 2001/11/26 23:00:24 darkgod Exp $ -** Garbage Collector -** See Copyright Notice in lua.h -*/ - -#ifndef lgc_h -#define lgc_h - - -#include "lobject.h" - - -void luaC_collect (lua_State *L, int all); -void luaC_checkGC (lua_State *L); - - -#endif diff --git a/src/lua/liolib.c b/src/lua/liolib.c deleted file mode 100644 index 4fb385f4..00000000 --- a/src/lua/liolib.c +++ /dev/null @@ -1,710 +0,0 @@ -/* -** $Id: liolib.c,v 1.5 2004/06/04 13:42:10 neil Exp $ -** Standard I/O (and system) library -** See Copyright Notice in lua.h -*/ - - -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -#include "lua.h" - -#include "lauxlib.h" -#include "luadebug.h" -#include "lualib.h" - - -#ifndef OLD_ANSI -#include <errno.h> -#include <locale.h> -#define realloc(b,s) ((b) == NULL ? malloc(s) : (realloc)(b, s)) -#define free(b) if (b) (free)(b) -#else -/* no support for locale and for strerror: fake them */ -#define setlocale(a,b) ((void)a, strcmp((b),"C")==0?"C":NULL) -#define LC_ALL 0 -#define LC_COLLATE 0 -#define LC_CTYPE 0 -#define LC_MONETARY 0 -#define LC_NUMERIC 0 -#define LC_TIME 0 -#define strerror(e) "generic I/O error" -#define errno (-1) -#endif - - - -#ifdef POPEN -/* FILE *popen(); -int pclose(); */ -#define CLOSEFILE(L, f) ((pclose(f) == -1) ? fclose(f) : 0) -#else -/* no support for popen */ -#define popen(x,y) NULL /* that is, popen always fails */ -#define CLOSEFILE(L, f) (fclose(f)) -#endif - - -#define INFILE 0 -#define OUTFILE 1 - -typedef struct IOCtrl { - int ref[2]; /* ref for strings _INPUT/_OUTPUT */ - int iotag; /* tag for file handles */ - int closedtag; /* tag for closed handles */ -} IOCtrl; - - - -static const char *const filenames[] = {"_INPUT", "_OUTPUT"}; - - -static int pushresult (lua_State *L, int i) { - if (i) { - lua_pushuserdata(L, NULL); - return 1; - } - else { - lua_pushnil(L); - lua_pushstring(L, strerror(errno)); - lua_pushnumber(L, errno); - return 3;; - } -} - - -/* -** {====================================================== -** FILE Operations -** ======================================================= -*/ - - -static FILE *gethandle (lua_State *L, IOCtrl *ctrl, int f) { - void *p = lua_touserdata(L, f); - if (p != NULL) { /* is `f' a userdata ? */ - int ftag = lua_tag(L, f); - if (ftag == ctrl->iotag) /* does it have the correct tag? */ - return (FILE *)p; - else if (ftag == ctrl->closedtag) - lua_error(L, "cannot access a closed file"); - /* else go through */ - } - return NULL; -} - - -static FILE *getnonullfile (lua_State *L, IOCtrl *ctrl, int arg) { - FILE *f = gethandle(L, ctrl, arg); - luaL_arg_check(L, f, arg, "invalid file handle"); - return f; -} - - -static FILE *getfilebyref (lua_State *L, IOCtrl *ctrl, int inout) { - FILE *f; - lua_getglobals(L); - lua_getref(L, ctrl->ref[inout]); - lua_rawget(L, -2); - f = gethandle(L, ctrl, -1); - if (f == NULL) - luaL_verror(L, "global variable `%.10s' is not a file handle", - filenames[inout]); - return f; -} - - -static void setfilebyname (lua_State *L, IOCtrl *ctrl, FILE *f, - const char *name) { - lua_pushusertag(L, f, ctrl->iotag); - lua_setglobal(L, name); -} - - -#define setfile(L,ctrl,f,inout) (setfilebyname(L,ctrl,f,filenames[inout])) - - -static int setreturn (lua_State *L, IOCtrl *ctrl, FILE *f, int inout) { - if (f == NULL) - return pushresult(L, 0); - else { - setfile(L, ctrl, f, inout); - lua_pushusertag(L, f, ctrl->iotag); - return 1; - } -} - - -static int closefile (lua_State *L, IOCtrl *ctrl, FILE *f) { - if (f == stdin || f == stdout || f == stderr) - return 1; - else { - lua_pushusertag(L, f, ctrl->iotag); - lua_settag(L, ctrl->closedtag); - return (CLOSEFILE(L, f) == 0); - } -} - - -static int io_close (lua_State *L) { - IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); - lua_pop(L, 1); /* remove upvalue */ - return pushresult(L, closefile(L, ctrl, getnonullfile(L, ctrl, 1))); -} - - -static int file_collect (lua_State *L) { - IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); - FILE *f = getnonullfile(L, ctrl, 1); - if (f != stdin && f != stdout && f != stderr) - CLOSEFILE(L, f); - return 0; -} - - -static int io_open (lua_State *L) { - IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); - FILE *f; - lua_pop(L, 1); /* remove upvalue */ - f = fopen(luaL_check_string(L, 1), luaL_check_string(L, 2)); - if (f) { - lua_pushusertag(L, f, ctrl->iotag); - return 1; - } - else - return pushresult(L, 0); -} - - - -static int io_fromto (lua_State *L, int inout, const char *mode) { - IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); - FILE *current; - lua_pop(L, 1); /* remove upvalue */ - if (lua_isnull(L, 1)) { - closefile(L, ctrl, getfilebyref(L, ctrl, inout)); - current = (inout == 0) ? stdin : stdout; - } - else if (lua_tag(L, 1) == ctrl->iotag) /* deprecated option */ - current = (FILE *)lua_touserdata(L, 1); - else { - const char *s = luaL_check_string(L, 1); - current = (*s == '|') ? popen(s+1, mode) : fopen(s, mode); - } - return setreturn(L, ctrl, current, inout); -} - - -static int io_readfrom (lua_State *L) { - return io_fromto(L, INFILE, "r"); -} - - -static int io_writeto (lua_State *L) { - return io_fromto(L, OUTFILE, "w"); -} - - -static int io_appendto (lua_State *L) { - IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); - FILE *current; - lua_pop(L, 1); /* remove upvalue */ - current = fopen(luaL_check_string(L, 1), "a"); - return setreturn(L, ctrl, current, OUTFILE); -} - - - -/* -** {====================================================== -** READ -** ======================================================= -*/ - - - -#ifdef LUA_COMPAT_READPATTERN - -/* -** We cannot lookahead without need, because this can lock stdin. -** This flag signals when we need to read a next char. -*/ -#define NEED_OTHER (EOF-1) /* just some flag different from EOF */ - - -static int read_pattern (lua_State *L, FILE *f, const char *p) { - int inskip = 0; /* {skip} level */ - int c = NEED_OTHER; - luaL_Buffer b; - luaL_buffinit(L, &b); - while (*p != '\0') { - switch (*p) { - case '{': - inskip++; - p++; - continue; - case '}': - if (!inskip) lua_error(L, "unbalanced braces in read pattern"); - inskip--; - p++; - continue; - default: { - const char *ep = luaI_classend(L, p); /* get what is next */ - int m; /* match result */ - if (c == NEED_OTHER) c = getc(f); - m = (c==EOF) ? 0 : luaI_singlematch(c, p, ep); - if (m) { - if (!inskip) luaL_putchar(&b, c); - c = NEED_OTHER; - } - switch (*ep) { - case '+': /* repetition (1 or more) */ - if (!m) goto break_while; /* pattern fails? */ - /* else go through */ - case '*': /* repetition (0 or more) */ - while (m) { /* reads the same item until it fails */ - c = getc(f); - m = (c==EOF) ? 0 : luaI_singlematch(c, p, ep); - if (m && !inskip) luaL_putchar(&b, c); - } - /* go through to continue reading the pattern */ - case '?': /* optional */ - p = ep+1; /* continues reading the pattern */ - continue; - default: - if (!m) goto break_while; /* pattern fails? */ - p = ep; /* else continues reading the pattern */ - } - } - } - } break_while: - if (c != NEED_OTHER) ungetc(c, f); - luaL_pushresult(&b); /* close buffer */ - return (*p == '\0'); -} - -#else - -#define read_pattern(L, f, p) (lua_error(L, "read patterns are deprecated"), 0) - -#endif - - -static int read_number (lua_State *L, FILE *f) { - long d; - if (fscanf(f, "%ld", &d) == 1) { - lua_pushnumber(L, d); - return 1; - } - else return 0; /* read fails */ -} - - -static int read_word (lua_State *L, FILE *f) { - int c; - luaL_Buffer b; - luaL_buffinit(L, &b); - do { c = fgetc(f); } while (isspace(c)); /* skip spaces */ - while (c != EOF && !isspace(c)) { - luaL_putchar(&b, c); - c = fgetc(f); - } - ungetc(c, f); - luaL_pushresult(&b); /* close buffer */ - return (lua_strlen(L, -1) > 0); -} - - -static int read_line (lua_State *L, FILE *f) { - int n = 0; - luaL_Buffer b; - luaL_buffinit(L, &b); - for (;;) { - char *p = luaL_prepbuffer(&b); - if (!fgets(p, LUAL_BUFFERSIZE, f)) /* read fails? */ - break; - n = strlen(p); - if (p[n-1] != '\n') - luaL_addsize(&b, n); - else { - luaL_addsize(&b, n-1); /* do not add the `\n' */ - break; - } - } - luaL_pushresult(&b); /* close buffer */ - return (n > 0); /* read something? */ -} - - -static void read_file (lua_State *L, FILE *f) { - size_t len = 0; - size_t size = BUFSIZ; - char *buffer = NULL; - for (;;) { - char *newbuffer = (char *)realloc(buffer, size); - if (newbuffer == NULL) { - free(buffer); - lua_error(L, "not enough memory to read a file"); - } - buffer = newbuffer; - len += fread(buffer+len, sizeof(char), size-len, f); - if (len < size) break; /* did not read all it could */ - size *= 2; - } - lua_pushlstring(L, buffer, len); - free(buffer); -} - - -static int read_chars (lua_State *L, FILE *f, size_t n) { - char *buffer; - size_t n1; - char statbuff[BUFSIZ]; - if (n <= BUFSIZ) - buffer = statbuff; - else { - buffer = (char *)malloc(n); - if (buffer == NULL) - lua_error(L, "not enough memory to read a file"); - } - n1 = fread(buffer, sizeof(char), n, f); - lua_pushlstring(L, buffer, n1); - if (buffer != statbuff) free(buffer); - return (n1 > 0 || n == 0); -} - - -static int io_read (lua_State *L) { - IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); - int lastarg = lua_gettop(L) - 1; - int firstarg = 1; - FILE *f = gethandle(L, ctrl, firstarg); - int n; - if (f) firstarg++; - else f = getfilebyref(L, ctrl, INFILE); /* get _INPUT */ - lua_pop(L, 1); - if (firstarg > lastarg) { /* no arguments? */ - lua_settop(L, 0); /* erase upvalue and other eventual garbage */ - firstarg = lastarg = 1; /* correct indices */ - lua_pushstring(L, "*l"); /* push default argument */ - } - else /* ensure stack space for all results and for auxlib's buffer */ - luaL_checkstack(L, lastarg-firstarg+1+LUA_MINSTACK, "too many arguments"); - for (n = firstarg; n<=lastarg; n++) { - int success; - if (lua_isnumber(L, n)) - success = read_chars(L, f, (size_t)lua_tonumber(L, n)); - else { - const char *p = luaL_check_string(L, n); - if (p[0] != '*') - success = read_pattern(L, f, p); /* deprecated! */ - else { - switch (p[1]) { - case 'n': /* number */ - if (!read_number(L, f)) goto endloop; /* read fails */ - continue; /* number is already pushed; avoid the "pushstring" */ - case 'l': /* line */ - success = read_line(L, f); - break; - case 'a': /* file */ - read_file(L, f); - success = 1; /* always success */ - break; - case 'w': /* word */ - success = read_word(L, f); - break; - default: - luaL_argerror(L, n, "invalid format"); - success = 0; /* to avoid warnings */ - } - } - } - if (!success) { - lua_pop(L, 1); /* remove last result */ - break; /* read fails */ - } - } endloop: - return n - firstarg; -} - -/* }====================================================== */ - - -static int io_write (lua_State *L) { - int lastarg = lua_gettop(L) - 1; - IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); - int arg = 1; - int status = 1; - FILE *f = gethandle(L, ctrl, arg); - if (f) arg++; - else f = getfilebyref(L, ctrl, OUTFILE); /* get _OUTPUT */ - for (; arg <= lastarg; arg++) { - if (lua_type(L, arg) == LUA_TNUMBER) { /* LUA_NUMBER */ - /* optimization: could be done exactly as for strings */ - status = status && fprintf(f, "%ld", lua_tonumber(L, arg)) > 0; - } - else { - size_t l; - const char *s = luaL_check_lstr(L, arg, &l); - status = status && (fwrite(s, sizeof(char), l, f) == l); - } - } - pushresult(L, status); - return 1; -} - - -static int io_seek (lua_State *L) { - static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; - static const char *const modenames[] = {"set", "cur", "end", NULL}; - IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); - FILE *f; - int op; - long offset; - lua_pop(L, 1); /* remove upvalue */ - f = getnonullfile(L, ctrl, 1); - op = luaL_findstring(luaL_opt_string(L, 2, "cur"), modenames); - offset = luaL_opt_long(L, 3, 0); - luaL_arg_check(L, op != -1, 2, "invalid mode"); - op = fseek(f, offset, mode[op]); - if (op) - return pushresult(L, 0); /* error */ - else { - lua_pushnumber(L, ftell(f)); - return 1; - } -} - - -static int io_flush (lua_State *L) { - IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); - FILE *f; - lua_pop(L, 1); /* remove upvalue */ - f = gethandle(L, ctrl, 1); - luaL_arg_check(L, f || lua_isnull(L, 1), 1, "invalid file handle"); - return pushresult(L, fflush(f) == 0); -} - -/* }====================================================== */ - - -/* -** {====================================================== -** Other O.S. Operations -** ======================================================= -*/ - -static int io_execute (lua_State *L) { - lua_pushnumber(L, system(luaL_check_string(L, 1))); - return 1; -} - - -static int io_remove (lua_State *L) { - return pushresult(L, remove(luaL_check_string(L, 1)) == 0); -} - - -static int io_rename (lua_State *L) { - return pushresult(L, rename(luaL_check_string(L, 1), - luaL_check_string(L, 2)) == 0); -} - - -static int io_getenv (lua_State *L) { - lua_pushstring(L, getenv(luaL_check_string(L, 1))); /* if NULL push nil */ - return 1; -} - - -static int io_clock (lua_State *L) { - lua_pushnumber(L, ((long)clock())/CLOCKS_PER_SEC); - return 1; -} - - -static int io_date (lua_State *L) { - char b[256]; - const char *s = luaL_opt_string(L, 1, "%c"); - struct tm *stm; - time_t t; - time(&t); stm = localtime(&t); - if (strftime(b, sizeof(b), s, stm)) - lua_pushstring(L, b); - else - lua_error(L, "invalid `date' format"); - return 1; -} - - -static int setloc (lua_State *L) { - static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, - LC_NUMERIC, LC_TIME}; - static const char *const catnames[] = {"all", "collate", "ctype", "monetary", - "numeric", "time", NULL}; - int op = luaL_findstring(luaL_opt_string(L, 2, "all"), catnames); - luaL_arg_check(L, op != -1, 2, "invalid option"); - lua_pushstring(L, setlocale(cat[op], luaL_check_string(L, 1))); - return 1; -} - - -static int io_exit (lua_State *L) { - exit(luaL_opt_int(L, 1, EXIT_SUCCESS)); - return 0; /* to avoid warnings */ -} - -/* }====================================================== */ - - - -static int io_debug (lua_State *L) { - for (;;) { - char buffer[250]; - fprintf(stderr, "lua_debug> "); - if (fgets(buffer, sizeof(buffer), stdin) == 0 || - strcmp(buffer, "cont\n") == 0) - return 0; - lua_dostring(L, buffer); - lua_settop(L, 0); /* remove eventual returns */ - } -} - - -#define LEVELS1 12 /* size of the first part of the stack */ -#define LEVELS2 10 /* size of the second part of the stack */ - -static int errorfb (lua_State *L) { - int level = 1; /* skip level 0 (it's this function) */ - int firstpart = 1; /* still before eventual `...' */ - lua_Debug ar; - luaL_Buffer b; - luaL_buffinit(L, &b); - luaL_addstring(&b, "error: "); - luaL_addstring(&b, luaL_check_string(L, 1)); - luaL_addstring(&b, "\n"); - while (lua_getstack(L, level++, &ar)) { - char buff[120]; /* enough to fit following `sprintf's */ - if (level == 2) - luaL_addstring(&b, "stack traceback:\n"); - else if (level > LEVELS1 && firstpart) { - /* no more than `LEVELS2' more levels? */ - if (!lua_getstack(L, level+LEVELS2, &ar)) - level--; /* keep going */ - else { - luaL_addstring(&b, " ...\n"); /* too many levels */ - while (lua_getstack(L, level+LEVELS2, &ar)) /* find last levels */ - level++; - } - firstpart = 0; - continue; - } - sprintf(buff, "%4d: ", level-1); - luaL_addstring(&b, buff); - lua_getinfo(L, "Snl", &ar); - switch (*ar.namewhat) { - case 'g': case 'l': /* global, local */ - sprintf(buff, "function `%.50s'", ar.name); - break; - case 'f': /* field */ - sprintf(buff, "method `%.50s'", ar.name); - break; - case 't': /* tag method */ - sprintf(buff, "`%.50s' tag method", ar.name); - break; - default: { - if (*ar.what == 'm') /* main? */ - sprintf(buff, "main of %.70s", ar.short_src); - else if (*ar.what == 'C') /* C function? */ - sprintf(buff, "%.70s", ar.short_src); - else - sprintf(buff, "function <%d:%.70s>", ar.linedefined, ar.short_src); - ar.source = NULL; /* do not print source again */ - } - } - luaL_addstring(&b, buff); - if (ar.currentline > 0) { - sprintf(buff, " at line %d", ar.currentline); - luaL_addstring(&b, buff); - } - if (ar.source) { - sprintf(buff, " [%.70s]", ar.short_src); - luaL_addstring(&b, buff); - } - luaL_addstring(&b, "\n"); - } - luaL_pushresult(&b); - lua_getglobal(L, LUA_ALERT); - if (lua_isfunction(L, -1)) { /* avoid loop if _ALERT is not defined */ - lua_pushvalue(L, -2); /* error message */ - lua_rawcall(L, 1, 0); - } - return 0; -} - - - -static const struct luaL_reg iolib[] = { - {LUA_ERRORMESSAGE, errorfb}, - {"clock", io_clock}, - {"date", io_date}, - {"debug", io_debug}, - {"execute", io_execute}, - {"exit", io_exit}, - {"getenv", io_getenv}, - {"remove", io_remove}, - {"rename", io_rename}, - {"setlocale", setloc}, -}; - - -static const struct luaL_reg iolibtag[] = { - {"appendto", io_appendto}, - {"closefile", io_close}, - {"flush", io_flush}, - {"openfile", io_open}, - {"read", io_read}, - {"readfrom", io_readfrom}, - {"seek", io_seek}, - {"write", io_write}, - {"writeto", io_writeto} -}; - - -static void openwithcontrol (lua_State *L) { - IOCtrl *ctrl = (IOCtrl *)lua_newuserdata(L, sizeof(IOCtrl)); - unsigned int i; - ctrl->iotag = lua_newtag(L); - ctrl->closedtag = lua_newtag(L); - for (i=0; i<sizeof(iolibtag)/sizeof(iolibtag[0]); i++) { - /* put `ctrl' as upvalue for these functions */ - lua_pushvalue(L, -1); - lua_pushcclosure(L, iolibtag[i].func, 1); - lua_setglobal(L, iolibtag[i].name); - } - /* create references to variable names */ - lua_pushstring(L, filenames[INFILE]); - ctrl->ref[INFILE] = lua_ref(L, 1); - lua_pushstring(L, filenames[OUTFILE]); - ctrl->ref[OUTFILE] = lua_ref(L, 1); - /* predefined file handles */ - setfile(L, ctrl, stdin, INFILE); - setfile(L, ctrl, stdout, OUTFILE); - setfilebyname(L, ctrl, stdin, "_STDIN"); - setfilebyname(L, ctrl, stdout, "_STDOUT"); - setfilebyname(L, ctrl, stderr, "_STDERR"); - /* close files when collected */ - lua_pushcclosure(L, file_collect, 1); /* pops `ctrl' from stack */ - lua_settagmethod(L, ctrl->iotag, "gc"); -} - - -LUALIB_API void lua_iolibopen (lua_State *L) { - luaL_openl(L, iolib); - openwithcontrol(L); -} - diff --git a/src/lua/llex.c b/src/lua/llex.c deleted file mode 100644 index 86fb69ab..00000000 --- a/src/lua/llex.c +++ /dev/null @@ -1,411 +0,0 @@ -/* -** $Id: llex.c,v 1.6 2004/06/04 13:42:10 neil Exp $ -** Lexical Analyzer -** See Copyright Notice in lua.h -*/ - - -#include <ctype.h> -#include <stdio.h> -#include <string.h> - -#include "lua.h" - -#include "llex.h" -#include "lmem.h" -#include "lobject.h" -#include "lparser.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "luadebug.h" -#include "lzio.h" - - - -#define next(LS) (LS->current = zgetc(LS->z)) - - - -/* ORDER RESERVED */ -static const char *const token2string [] = { - "and", "break", "do", "else", "elseif", "end", "for", - "function", "if", "local", "nil", "not", "or", "repeat", "return", "then", - "until", "while", "", "..", "...", "==", ">=", "<=", "~=", "", "", "<eof>"}; - - -void luaX_init (lua_State *L) { - int i; - for (i=0; i<NUM_RESERVED; i++) { - TString *ts = luaS_new(L, token2string[i]); - ts->marked = (unsigned char)(RESERVEDMARK+i); /* reserved word */ - } -} - - -#define MAXSRC 80 - - -void luaX_checklimit (LexState *ls, int val, int limit, const char *msg) { - if (val > limit) { - char buff[100]; - sprintf(buff, "too many %.50s (limit=%d)", msg, limit); - luaX_error(ls, buff, ls->t.token); - } -} - - -void luaX_syntaxerror (LexState *ls, const char *s, const char *token) { - char buff[MAXSRC]; - luaO_chunkid(buff, ls->source->str, sizeof(buff)); - luaO_verror(ls->L, "%.99s;\n last token read: `%.30s' at line %d in %.80s", - s, token, ls->linenumber, buff); -} - - -void luaX_error (LexState *ls, const char *s, int token) { - char buff[TOKEN_LEN]; - luaX_token2str(token, buff); - if (buff[0] == '\0') - luaX_syntaxerror(ls, s, ls->L->Mbuffer); - else - luaX_syntaxerror(ls, s, buff); -} - - -void luaX_token2str (int token, char *s) { - if (token < 256) { - s[0] = (char)token; - s[1] = '\0'; - } - else - strcpy(s, token2string[token-FIRST_RESERVED]); -} - - -static void luaX_invalidchar (LexState *ls, int c) { - char buff[8]; - sprintf(buff, "0x%02X", c); - luaX_syntaxerror(ls, "invalid control char", buff); -} - - -static void inclinenumber (LexState *LS) { - next(LS); /* skip '\n' */ - ++LS->linenumber; - luaX_checklimit(LS, LS->linenumber, MAX_INT, "lines in a chunk"); -} - - -void luaX_setinput (lua_State *L, LexState *LS, ZIO *z, TString *source) { - LS->L = L; - LS->lookahead.token = TK_EOS; /* no look-ahead token */ - LS->z = z; - LS->fs = NULL; - LS->linenumber = 1; - LS->lastline = 1; - LS->source = source; - next(LS); /* read first char */ - if (LS->current == '#') { - do { /* skip first line */ - next(LS); - } while (LS->current != '\n' && LS->current != '\r' && LS->current != EOZ); - } -} - - - -/* -** ======================================================= -** LEXICAL ANALYZER -** ======================================================= -*/ - - -/* use Mbuffer to store names, literal strings and numbers */ - -#define EXTRABUFF 128 -#define checkbuffer(L, n, len) if ((len)+(n) > L->Mbuffsize) \ - luaO_openspace(L, (len)+(n)+EXTRABUFF) - -#define save(L, c, l) (L->Mbuffer[l++] = (char)c) -#define save_and_next(L, LS, l) (save(L, LS->current, l), next(LS)) - - -static const char *readname (LexState *LS) { - lua_State *L = LS->L; - size_t l = 0; - checkbuffer(L, 10, l); - do { - checkbuffer(L, 10, l); - save_and_next(L, LS, l); - } while (isalnum(LS->current) || LS->current == '_'); - save(L, '\0', l); - return L->Mbuffer; -} - - -/* LUA_NUMBER */ -static void read_number (LexState *LS, int comma, SemInfo *seminfo) { - lua_State *L = LS->L; - size_t l = 0; - checkbuffer(L, 10, l); - if (comma) save(L, '.', l); - while (isdigit(LS->current)) { - checkbuffer(L, 10, l); - save_and_next(L, LS, l); - } - if (LS->current == '.') { - save_and_next(L, LS, l); - if (LS->current == '.') { - save_and_next(L, LS, l); - save(L, '\0', l); - luaX_error(LS, "ambiguous syntax" - " (decimal point x string concatenation)", TK_NUMBER); - } - } - while (isdigit(LS->current)) { - checkbuffer(L, 10, l); - save_and_next(L, LS, l); - } - if (LS->current == 'e' || LS->current == 'E') { - save_and_next(L, LS, l); /* read 'E' */ - if (LS->current == '+' || LS->current == '-') - save_and_next(L, LS, l); /* optional exponent sign */ - while (isdigit(LS->current)) { - checkbuffer(L, 10, l); - save_and_next(L, LS, l); - } - } - save(L, '\0', l); - if (!luaO_str2d(L->Mbuffer, &seminfo->r)) - luaX_error(LS, "malformed number", TK_NUMBER); -} - - -static void read_long_string (LexState *LS, SemInfo *seminfo) { - lua_State *L = LS->L; - int cont = 0; - size_t l = 0; - checkbuffer(L, 10, l); - save(L, '[', l); /* save first '[' */ - save_and_next(L, LS, l); /* pass the second '[' */ - for (;;) { - checkbuffer(L, 10, l); - switch (LS->current) { - case EOZ: - save(L, '\0', l); - if (seminfo) - luaX_error(LS, "unfinished long string", TK_STRING); - else - luaX_error(LS, "unfinished comment", TK_EOS); - break; /* to avoid warnings */ - case '[': - save_and_next(L, LS, l); - if (LS->current == '[') { - cont++; - save_and_next(L, LS, l); - } - continue; - case ']': - save_and_next(L, LS, l); - if (LS->current == ']') { - if (cont == 0) goto endloop; - cont--; - save_and_next(L, LS, l); - } - continue; - case '\n': - save(L, '\n', l); - inclinenumber(LS); - if (LS->current == '\r') next(LS); - continue; - case '\r': - save(L, '\n', l); - inclinenumber(LS); - if (LS->current == '\n') next(LS); - continue; - default: - if (seminfo) /* no need to save complete comment */ - save(L, LS->current, l); - next(LS); - } - } endloop: - save_and_next(L, LS, l); /* skip the second ']' */ - save(L, '\0', l); - if (seminfo) - seminfo->ts = luaS_newlstr(L, L->Mbuffer+2, l-5); -} - - -static void read_string (LexState *LS, int del, SemInfo *seminfo) { - lua_State *L = LS->L; - size_t l = 0; - checkbuffer(L, 10, l); - save_and_next(L, LS, l); - while (LS->current != del) { - checkbuffer(L, 10, l); - switch (LS->current) { - case EOZ: case '\n': case '\r': - save(L, '\0', l); - luaX_error(LS, "unfinished string", TK_STRING); - break; /* to avoid warnings */ - case '\\': - next(LS); /* do not save the '\' */ - switch (LS->current) { - case 'a': save(L, '\a', l); next(LS); break; - case 'b': save(L, '\b', l); next(LS); break; - case 'f': save(L, '\f', l); next(LS); break; - case 'n': save(L, '\n', l); next(LS); break; - case 'r': save(L, '\r', l); next(LS); break; - case 't': save(L, '\t', l); next(LS); break; - case 'v': save(L, '\v', l); next(LS); break; - case '\n': - save(L, '\n', l); - inclinenumber(LS); - if (LS->current == '\r') next(LS); - break; - case '\r': - save(L, '\n', l); - inclinenumber(LS); - if (LS->current == '\n') next(LS); - break; - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': { - int c = 0; - int i = 0; - do { - c = 10*c + (LS->current-'0'); - next(LS); - } while (++i<3 && isdigit(LS->current)); - if (c != (unsigned char)c) { - save(L, '\0', l); - luaX_error(LS, "escape sequence too large", TK_STRING); - } - save(L, c, l); - break; - } - default: /* handles \\, \", \', and \? */ - save_and_next(L, LS, l); - } - break; - default: - save_and_next(L, LS, l); - } - } - save_and_next(L, LS, l); /* skip delimiter */ - save(L, '\0', l); - seminfo->ts = luaS_newlstr(L, L->Mbuffer+1, l-3); -} - - -int luaX_lex (LexState *LS, SemInfo *seminfo) { - for (;;) { - switch (LS->current) { - - case ' ': case '\t': - next(LS); - continue; - - case '\n': - inclinenumber(LS); - if (LS->current == '\r') next(LS); - continue; - - case '\r': - inclinenumber(LS); - if (LS->current == '\n') next(LS); - continue; - - case '$': - luaX_error(LS, "unexpected `$' (pragmas are no longer supported)", '$'); - break; - - case '-': - next(LS); - if (LS->current != '-') return '-'; - if (next(LS) == '[' && next(LS) == '[') - read_long_string(LS, NULL); - else - while (LS->current != '\n' && LS->current != '\r' && LS->current != EOZ) - next(LS); - continue; - - case '[': - next(LS); - if (LS->current != '[') return '['; - else { - read_long_string(LS, seminfo); - return TK_STRING; - } - - case '=': - next(LS); - if (LS->current != '=') return '='; - else { next(LS); return TK_EQ; } - - case '<': - next(LS); - if (LS->current != '=') return '<'; - else { next(LS); return TK_LE; } - - case '>': - next(LS); - if (LS->current != '=') return '>'; - else { next(LS); return TK_GE; } - - case '~': - next(LS); - if (LS->current != '=') return '~'; - else { next(LS); return TK_NE; } - - case '"': - case '\'': - read_string(LS, LS->current, seminfo); - return TK_STRING; - - case '.': - next(LS); - if (LS->current == '.') { - next(LS); - if (LS->current == '.') { - next(LS); - return TK_DOTS; /* ... */ - } - else return TK_CONCAT; /* .. */ - } - else if (!isdigit(LS->current)) return '.'; - else { - read_number(LS, 1, seminfo); - return TK_NUMBER; - } - - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - read_number(LS, 0, seminfo); - return TK_NUMBER; - - case EOZ: - return TK_EOS; - - case '_': goto tname; - - default: - if (!isalpha(LS->current)) { - int c = LS->current; - if (iscntrl(c)) - luaX_invalidchar(LS, c); - next(LS); - return c; - } - tname: { /* identifier or reserved word */ - TString *ts = luaS_new(LS->L, readname(LS)); - if (ts->marked >= RESERVEDMARK) /* reserved word? */ - return ts->marked-RESERVEDMARK+FIRST_RESERVED; - seminfo->ts = ts; - return TK_NAME; - } - } - } -} - diff --git a/src/lua/llex.h b/src/lua/llex.h deleted file mode 100644 index 5fb13c88..00000000 --- a/src/lua/llex.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -** $Id: llex.h,v 1.3 2001/11/26 23:00:24 darkgod Exp $ -** Lexical Analyzer -** See Copyright Notice in lua.h -*/ - -#ifndef llex_h -#define llex_h - -#include "lobject.h" -#include "lzio.h" - - -#define FIRST_RESERVED 257 - -/* maximum length of a reserved word (+1 for final 0) */ -#define TOKEN_LEN 15 - - -/* -* WARNING: if you change the order of this enumeration, -* grep "ORDER RESERVED" -*/ -enum RESERVED { - /* terminal symbols denoted by reserved words */ - TK_AND = FIRST_RESERVED, TK_BREAK, - TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FOR, TK_FUNCTION, TK_IF, TK_LOCAL, - TK_NIL, TK_NOT, TK_OR, TK_REPEAT, TK_RETURN, TK_THEN, TK_UNTIL, TK_WHILE, - /* other terminal symbols */ - TK_NAME, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER, - TK_STRING, TK_EOS -}; - -/* number of reserved words */ -#define NUM_RESERVED ((int)(TK_WHILE-FIRST_RESERVED+1)) - - -typedef union { - Number r; - TString *ts; -} SemInfo; /* semantics information */ - - -typedef struct Token { - int token; - SemInfo seminfo; -} Token; - - -typedef struct LexState { - int current; /* current character */ - Token t; /* current token */ - Token lookahead; /* look ahead token */ - struct FuncState *fs; /* `FuncState' is private to the parser */ - struct lua_State *L; - struct zio *z; /* input stream */ - int linenumber; /* input line counter */ - int lastline; /* line of last token `consumed' */ - TString *source; /* current source name */ -} LexState; - - -void luaX_init (lua_State *L); -void luaX_setinput (lua_State *L, LexState *LS, ZIO *z, TString *source); -int luaX_lex (LexState *LS, SemInfo *seminfo); -void luaX_checklimit (LexState *ls, int val, int limit, const char *msg); -void luaX_syntaxerror (LexState *ls, const char *s, const char *token); -void luaX_error (LexState *ls, const char *s, int token); -void luaX_token2str (int token, char *s); - - -#endif diff --git a/src/lua/llimits.h b/src/lua/llimits.h deleted file mode 100644 index 4b124503..00000000 --- a/src/lua/llimits.h +++ /dev/null @@ -1,204 +0,0 @@ -/* -** $Id: llimits.h,v 1.2 2001/11/26 23:00:24 darkgod Exp $ -** Limits, basic types, and some other "installation-dependent" definitions -** See Copyright Notice in lua.h -*/ - -#ifndef llimits_h -#define llimits_h - - -#include <limits.h> -#include <stddef.h> - - - -/* -** try to find number of bits in an integer -*/ -#ifndef BITS_INT -/* avoid overflows in comparison */ -#if INT_MAX-20 < 32760 -#define BITS_INT 16 -#else -#if INT_MAX > 2147483640L -/* machine has at least 32 bits */ -#define BITS_INT 32 -#else -#error "you must define BITS_INT with number of bits in an integer" -#endif -#endif -#endif - - -/* -** Define the type `number' of Lua -** GREP LUA_NUMBER to change that -*/ -#ifndef LUA_NUM_TYPE -#define LUA_NUM_TYPE long -#endif - -typedef LUA_NUM_TYPE Number; - -/* function to convert a Number to a string */ -#define NUMBER_FMT "%ld" /* LUA_NUMBER */ -#define lua_number2str(s,n) sprintf((s), NUMBER_FMT, (n)) - -/* function to convert a string to a Number */ -#define lua_str2number(s,p) strtol((s), (p), 10) - - - -typedef unsigned long lint32; /* unsigned int with at least 32 bits */ - - -#define MAX_SIZET ((size_t)(~(size_t)0)-2) - - -#define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */ - -/* -** conversion of pointer to int (for hashing only) -** (the shift removes bits that are usually 0 because of alignment) -*/ -#define IntPoint(p) (((unsigned long)(p)) >> 3) - - - -#define MINPOWER2 4 /* minimum size for "growing" vectors */ - - - -#ifndef DEFAULT_STACK_SIZE -#define DEFAULT_STACK_SIZE 1024 -#endif - - - -/* type to ensure maximum alignment */ -union L_Umaxalign { long d; char *s; long l; }; - - - -/* -** type for virtual-machine instructions -** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) -** For a very small machine, you may change that to 2 bytes (and adjust -** the following limits accordingly) -*/ -typedef unsigned long Instruction; - - -/* -** size and position of opcode arguments. -** For an instruction with 2 bytes, size is 16, and size_b can be 5 -** (accordingly, size_u will be 10, and size_a will be 5) -*/ -#define SIZE_INSTRUCTION 32 -#define SIZE_B 9 - -#define SIZE_OP 6 -#define SIZE_U (SIZE_INSTRUCTION-SIZE_OP) -#define POS_U SIZE_OP -#define POS_B SIZE_OP -#define SIZE_A (SIZE_INSTRUCTION-(SIZE_OP+SIZE_B)) -#define POS_A (SIZE_OP+SIZE_B) - - -/* -** limits for opcode arguments. -** we use (signed) int to manipulate most arguments, -** so they must fit in BITS_INT-1 bits (-1 for sign) -*/ -#if SIZE_U < BITS_INT-1 -#define MAXARG_U ((1<<SIZE_U)-1) -#define MAXARG_S (MAXARG_U>>1) /* `S' is signed */ -#else -#define MAXARG_U MAX_INT -#define MAXARG_S MAX_INT -#endif - -#if SIZE_A < BITS_INT-1 -#define MAXARG_A ((1<<SIZE_A)-1) -#else -#define MAXARG_A MAX_INT -#endif - -#if SIZE_B < BITS_INT-1 -#define MAXARG_B ((1<<SIZE_B)-1) -#else -#define MAXARG_B MAX_INT -#endif - - -/* maximum stack size in a function */ -#ifndef MAXSTACK -#define MAXSTACK 250 -#endif - -#if MAXSTACK > MAXARG_B -#undef MAXSTACK -#define MAXSTACK MAXARG_B -#endif - - -/* maximum number of local variables */ -#ifndef MAXLOCALS -#define MAXLOCALS 200 /* arbitrary limit (<MAXSTACK) */ -#endif -#if MAXLOCALS>=MAXSTACK -#undef MAXLOCALS -#define MAXLOCALS (MAXSTACK-1) -#endif - - -/* maximum number of upvalues */ -#ifndef MAXUPVALUES -#define MAXUPVALUES 32 /* arbitrary limit (<=MAXARG_B) */ -#endif -#if MAXUPVALUES>MAXARG_B -#undef MAXUPVALUES -#define MAXUPVALUES MAXARG_B -#endif - - -/* maximum number of variables in the left side of an assignment */ -#ifndef MAXVARSLH -#define MAXVARSLH 100 /* arbitrary limit (<MULT_RET) */ -#endif -#if MAXVARSLH>=MULT_RET -#undef MAXVARSLH -#define MAXVARSLH (MULT_RET-1) -#endif - - -/* maximum number of parameters in a function */ -#ifndef MAXPARAMS -#define MAXPARAMS 100 /* arbitrary limit (<MAXLOCALS) */ -#endif -#if MAXPARAMS>=MAXLOCALS -#undef MAXPARAMS -#define MAXPARAMS (MAXLOCALS-1) -#endif - - -/* number of list items to accumulate before a SETLIST instruction */ -#define LFIELDS_PER_FLUSH 64 -#if LFIELDS_PER_FLUSH>(MAXSTACK/4) -#undef LFIELDS_PER_FLUSH -#define LFIELDS_PER_FLUSH (MAXSTACK/4) -#endif - -/* number of record items to accumulate before a SETMAP instruction */ -/* (each item counts 2 elements on the stack: an index and a value) */ -#define RFIELDS_PER_FLUSH (LFIELDS_PER_FLUSH/2) - - -/* maximum lookback to find a real constant (for code generation) */ -#ifndef LOOKBACKNUMS -#define LOOKBACKNUMS 20 /* arbitrary constant */ -#endif - - -#endif diff --git a/src/lua/lmem.c b/src/lua/lmem.c deleted file mode 100644 index 8fdecef3..00000000 --- a/src/lua/lmem.c +++ /dev/null @@ -1,150 +0,0 @@ -/* -** $Id: lmem.c,v 1.3 2001/11/26 23:00:24 darkgod Exp $ -** Interface to Memory Manager -** See Copyright Notice in lua.h -*/ - - -#include <stdlib.h> - -#include "lua.h" - -#include "ldo.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" - - - - -#ifdef LUA_DEBUG -/* -** {====================================================================== -** Controlled version for realloc. -** ======================================================================= -*/ - - -#include <assert.h> -#include <limits.h> -#include <string.h> - -#define realloc(b, s) debug_realloc(b, s) -#define malloc(b) debug_realloc(NULL, b) -#define free(b) debug_realloc(b, 0) - - -/* ensures maximum alignment for HEADER */ -#define HEADER (sizeof(union L_Umaxalign)) - -#define MARKSIZE 16 -#define MARK 0x55 /* 01010101 (a nice pattern) */ - - -#define blocksize(b) ((unsigned long *)((char *)(b) - HEADER)) - -unsigned long memdebug_numblocks = 0; -unsigned long memdebug_total = 0; -unsigned long memdebug_maxmem = 0; -unsigned long memdebug_memlimit = LONG_MAX; - - -static void *checkblock (void *block) { - unsigned long *b = blocksize(block); - unsigned long size = *b; - int i; - for (i=0;i<MARKSIZE;i++) - assert(*(((char *)b)+HEADER+size+i) == MARK+i); /* corrupted block? */ - memdebug_numblocks--; - memdebug_total -= size; - return b; -} - - -static void freeblock (void *block) { - if (block) { - size_t size = *blocksize(block); - block = checkblock(block); - memset(block, -1, size+HEADER+MARKSIZE); /* erase block */ - (free)(block); /* free original block */ - } -} - - -static void *debug_realloc (void *block, size_t size) { - if (size == 0) { - freeblock(block); - return NULL; - } - else if (memdebug_total+size > memdebug_memlimit) - return NULL; /* to test memory allocation errors */ - else { - size_t realsize = HEADER+size+MARKSIZE; - char *newblock = (char *)(malloc)(realsize); /* alloc a new block */ - int i; - if (realsize < size) return NULL; /* overflow! */ - if (newblock == NULL) return NULL; - if (block) { - size_t oldsize = *blocksize(block); - if (oldsize > size) oldsize = size; - memcpy(newblock+HEADER, block, oldsize); - freeblock(block); /* erase (and check) old copy */ - } - memdebug_total += size; - if (memdebug_total > memdebug_maxmem) memdebug_maxmem = memdebug_total; - memdebug_numblocks++; - *(unsigned long *)newblock = size; - for (i=0;i<MARKSIZE;i++) - *(newblock+HEADER+size+i) = (char)(MARK+i); - return newblock+HEADER; - } -} - - -/* }====================================================================== */ -#endif - - - -/* -** Real ISO (ANSI) systems do not need these tests; -** but some systems (Sun OS) are not that ISO... -*/ -#ifdef OLD_ANSI -#define realloc(b,s) ((b) == NULL ? malloc(s) : (realloc)(b, s)) -#define free(b) if (b) (free)(b) -#endif - - -void *luaM_growaux (lua_State *L, void *block, size_t nelems, - int inc, size_t size, const char *errormsg, size_t limit) { - size_t newn = nelems+inc; - if (nelems >= limit-inc) lua_error(L, errormsg); - if ((newn ^ nelems) <= nelems || /* still the same power-of-2 limit? */ - (nelems > 0 && newn < MINPOWER2)) /* or block already is MINPOWER2? */ - return block; /* do not need to reallocate */ - else /* it crossed a power-of-2 boundary; grow to next power */ - return luaM_realloc(L, block, luaO_power2(newn)*size); -} - - -/* -** generic allocation routine. -*/ -void *luaM_realloc (lua_State *L, void *block, lint32 size) { - if (size == 0) { - free(block); /* block may be NULL; that is OK for free */ - return NULL; - } - else if (size >= MAX_SIZET) - lua_error(L, "memory allocation error: block too big"); - block = realloc(block, size); - if (block == NULL) { - if (L) - luaD_breakrun(L, LUA_ERRMEM); /* break run without error message */ - else return NULL; /* error before creating state! */ - } - return block; -} - - diff --git a/src/lua/lmem.h b/src/lua/lmem.h deleted file mode 100644 index 0d27c336..00000000 --- a/src/lua/lmem.h +++ /dev/null @@ -1,42 +0,0 @@ -/* -** $Id: lmem.h,v 1.3 2001/11/26 23:00:24 darkgod Exp $ -** Interface to Memory Manager -** See Copyright Notice in lua.h -*/ - -#ifndef lmem_h -#define lmem_h - - -#include <stddef.h> - -#include "llimits.h" -#include "lua.h" - -void *luaM_realloc (lua_State *L, void *oldblock, lint32 size); -void *luaM_growaux (lua_State *L, void *block, size_t nelems, - int inc, size_t size, const char *errormsg, - size_t limit); - -#define luaM_free(L, b) luaM_realloc(L, (b), 0) -#define luaM_malloc(L, t) luaM_realloc(L, NULL, (t)) -#define luaM_new(L, t) ((t *)luaM_malloc(L, sizeof(t))) -#define luaM_newvector(L, n,t) ((t *)luaM_malloc(L, (n)*(lint32)sizeof(t))) - -#define luaM_growvector(L, v,nelems,inc,t,e,l) \ - ((v)=(t *)luaM_growaux(L, v,nelems,inc,sizeof(t),e,l)) - -#define luaM_reallocvector(L, v,n,t) \ - ((v)=(t *)luaM_realloc(L, v,(n)*(lint32)sizeof(t))) - - -#ifdef LUA_DEBUG -extern unsigned long memdebug_numblocks; -extern unsigned long memdebug_total; -extern unsigned long memdebug_maxmem; -extern unsigned long memdebug_memlimit; -#endif - - -#endif - diff --git a/src/lua/lobject.c b/src/lua/lobject.c deleted file mode 100644 index cd9d1f0b..00000000 --- a/src/lua/lobject.c +++ /dev/null @@ -1,125 +0,0 @@ -/* -** $Id: lobject.c,v 1.3 2001/11/26 23:00:24 darkgod Exp $ -** Some generic functions over Lua objects -** See Copyright Notice in lua.h -*/ - -#include <ctype.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "lua.h" - -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" - - - -const TObject luaO_nilobject = {LUA_TNIL, {NULL}}; - - -const char *const luaO_typenames[] = { - "userdata", "nil", "number", "string", "table", "function" -}; - - - -/* -** returns smaller power of 2 larger than `n' (minimum is MINPOWER2) -*/ -lint32 luaO_power2 (lint32 n) { - lint32 p = MINPOWER2; - while (p<=n) p<<=1; - return p; -} - - -int luaO_equalObj (const TObject *t1, const TObject *t2) { - if (ttype(t1) != ttype(t2)) return 0; - switch (ttype(t1)) { - case LUA_TNUMBER: - return nvalue(t1) == nvalue(t2); - case LUA_TSTRING: case LUA_TUSERDATA: - return tsvalue(t1) == tsvalue(t2); - case LUA_TTABLE: - return hvalue(t1) == hvalue(t2); - case LUA_TFUNCTION: - return clvalue(t1) == clvalue(t2); - default: - LUA_ASSERT(ttype(t1) == LUA_TNIL, "invalid type"); - return 1; /* LUA_TNIL */ - } -} - - -char *luaO_openspace (lua_State *L, size_t n) { - if (n > L->Mbuffsize) { - luaM_reallocvector(L, L->Mbuffer, n, char); - L->nblocks += (n - L->Mbuffsize)*sizeof(char); - L->Mbuffsize = n; - } - return L->Mbuffer; -} - - -int luaO_str2d (const char *s, Number *result) { /* LUA_NUMBER */ - char *endptr; - Number res = lua_str2number(s, &endptr); - if (endptr == s) return 0; /* no conversion */ - while (isspace((unsigned char)*endptr)) endptr++; - if (*endptr != '\0') return 0; /* invalid trailing characters? */ - *result = res; - return 1; -} - - -/* maximum length of a string format for `luaO_verror' */ -#define MAX_VERROR 280 - -/* this function needs to handle only '%d' and '%.XXs' formats */ -void luaO_verror (lua_State *L, const char *fmt, ...) { - va_list argp; - char buff[MAX_VERROR]; /* to hold formatted message */ - va_start(argp, fmt); - vsprintf(buff, fmt, argp); - va_end(argp); - lua_error(L, buff); -} - - -void luaO_chunkid (char *out, const char *source, int bufflen) { - if (*source == '=') { - strncpy(out, source+1, bufflen); /* remove first char */ - out[bufflen-1] = '\0'; /* ensures null termination */ - } - else { - if (*source == '@') { - int l; - source++; /* skip the `@' */ - bufflen -= sizeof("file `...%s'"); - l = strlen(source); - if (l>bufflen) { - source += (l-bufflen); /* get last part of file name */ - sprintf(out, "file `...%.99s'", source); - } - else - sprintf(out, "file `%.99s'", source); - } - else { - int len = strcspn(source, "\n"); /* stop at first newline */ - bufflen -= sizeof("string \"%.*s...\""); - if (len > bufflen) len = bufflen; - if (source[len] != '\0') { /* must truncate? */ - strcpy(out, "string \""); - out += strlen(out); - strncpy(out, source, len); - strcpy(out+len, "...\""); - } - else - sprintf(out, "string \"%.99s\"", source); - } - } -} diff --git a/src/lua/lobject.h b/src/lua/lobject.h deleted file mode 100644 index ce978205..00000000 --- a/src/lua/lobject.h +++ /dev/null @@ -1,204 +0,0 @@ -/* -** $Id: lobject.h,v 1.3 2001/11/26 23:00:24 darkgod Exp $ -** Type definitions for Lua objects -** See Copyright Notice in lua.h -*/ - -#ifndef lobject_h -#define lobject_h - - -#include "llimits.h" -#include "lua.h" - - -#ifdef LUA_DEBUG -#undef NDEBUG -#include <assert.h> -#define LUA_INTERNALERROR(s) assert(((void)s,0)) -#define LUA_ASSERT(c,s) assert(((void)s,(c))) -#else -#define LUA_INTERNALERROR(s) /* empty */ -#define LUA_ASSERT(c,s) /* empty */ -#endif - - -#ifdef LUA_DEBUG -/* to avoid warnings, and make sure value is really unused */ -#define UNUSED(x) (x=0, (void)(x)) -#else -#define UNUSED(x) ((void)(x)) /* to avoid warnings */ -#endif - - -/* mark for closures active in the stack */ -#define LUA_TMARK 6 - - -/* tags for values visible from Lua == first user-created tag */ -#define NUM_TAGS 6 - - -/* check whether `t' is a mark */ -#define is_T_MARK(t) ((t) == LUA_TMARK) - - -typedef union { - struct TString *ts; /* LUA_TSTRING, LUA_TUSERDATA */ - struct Closure *cl; /* LUA_TFUNCTION */ - struct Hash *a; /* LUA_TTABLE */ - struct CallInfo *i; /* LUA_TLMARK */ - Number n; /* LUA_TNUMBER */ -} Value; - - -/* Macros to access values */ -#define ttype(o) ((o)->ttype) -#define nvalue(o) ((o)->value.n) -#define tsvalue(o) ((o)->value.ts) -#define clvalue(o) ((o)->value.cl) -#define hvalue(o) ((o)->value.a) -#define infovalue(o) ((o)->value.i) -#define svalue(o) (tsvalue(o)->str) - - -typedef struct lua_TObject { - int ttype; - Value value; -} TObject; - - -/* -** String headers for string table -*/ - -/* -** most `malloc' libraries allocate memory in blocks of 8 bytes. TSPACK -** tries to make sizeof(TString) a multiple of this granularity, to reduce -** waste of space. -*/ -#define TSPACK ((int)sizeof(int)) - -typedef struct TString { - union { - struct { /* for strings */ - unsigned long hash; - int constindex; /* hint to reuse constants */ - } s; - struct { /* for userdata */ - int tag; - void *value; - } d; - } u; - size_t len; - struct TString *nexthash; /* chain for hash table */ - int marked; - char str[TSPACK]; /* variable length string!! must be the last field! */ -} TString; - - -/* -** Function Prototypes -*/ -typedef struct Proto { - Number *knum; /* Number numbers used by the function */ - int nknum; /* size of `knum' */ - struct TString **kstr; /* strings used by the function */ - int nkstr; /* size of `kstr' */ - struct Proto **kproto; /* functions defined inside the function */ - int nkproto; /* size of `kproto' */ - Instruction *code; - int ncode; /* size of `code'; when 0 means an incomplete `Proto' */ - short numparams; - short is_vararg; - short maxstacksize; - short marked; - struct Proto *next; - /* debug information */ - int *lineinfo; /* map from opcodes to source lines */ - int nlineinfo; /* size of `lineinfo' */ - int nlocvars; - struct LocVar *locvars; /* information about local variables */ - int lineDefined; - TString *source; -} Proto; - - -typedef struct LocVar { - TString *varname; - int startpc; /* first point where variable is active */ - int endpc; /* first point where variable is dead */ -} LocVar; - - -/* -** Closures -*/ -typedef struct Closure { - union { - lua_CFunction c; /* C functions */ - struct Proto *l; /* Lua functions */ - } f; - struct Closure *next; - struct Closure *mark; /* marked closures (point to itself when not marked) */ - short isC; /* 0 for Lua functions, 1 for C functions */ - short nupvalues; - TObject upvalue[1]; -} Closure; - - -#define iscfunction(o) (ttype(o) == LUA_TFUNCTION && clvalue(o)->isC) - - -typedef struct Node { - TObject key; - TObject val; - struct Node *next; /* for chaining */ -} Node; - -typedef struct Hash { - Node *node; - int htag; - int size; - Node *firstfree; /* this position is free; all positions after it are full */ - struct Hash *next; - struct Hash *mark; /* marked tables (point to itself when not marked) */ -} Hash; - - -/* unmarked tables and closures are represented by pointing `mark' to -** themselves -*/ -#define ismarked(x) ((x)->mark != (x)) - - -/* -** informations about a call (for debugging) -*/ -typedef struct CallInfo { - struct Closure *func; /* function being called */ - const Instruction **pc; /* current pc of called function */ - int lastpc; /* last pc traced */ - int line; /* current line */ - int refi; /* current index in `lineinfo' */ -} CallInfo; - - -extern const TObject luaO_nilobject; -extern const char *const luaO_typenames[]; - - -#define luaO_typename(o) (luaO_typenames[ttype(o)]) - - -lint32 luaO_power2 (lint32 n); -char *luaO_openspace (lua_State *L, size_t n); - -int luaO_equalObj (const TObject *t1, const TObject *t2); -int luaO_str2d (const char *s, Number *result); - -void luaO_verror (lua_State *L, const char *fmt, ...); -void luaO_chunkid (char *out, const char *source, int len); - - -#endif diff --git a/src/lua/lopcodes.h b/src/lua/lopcodes.h deleted file mode 100644 index 59740896..00000000 --- a/src/lua/lopcodes.h +++ /dev/null @@ -1,168 +0,0 @@ -/* -** $Id: lopcodes.h,v 1.5 2004/06/04 13:42:10 neil Exp $ -** Opcodes for Lua virtual machine -** See Copyright Notice in lua.h -*/ - -#ifndef lopcodes_h -#define lopcodes_h - -#include "llimits.h" - - -/*=========================================================================== - We assume that instructions are unsigned numbers. - All instructions have an opcode in the first 6 bits. Moreover, - an instruction can have 0, 1, or 2 arguments. Instructions can - have the following types: - type 0: no arguments - type 1: 1 unsigned argument in the higher bits (called `U') - type 2: 1 signed argument in the higher bits (`S') - type 3: 1st unsigned argument in the higher bits (`A') - 2nd unsigned argument in the middle bits (`B') - - A signed argument is represented in excess K; that is, the number - value is the unsigned value minus K. K is exactly the maximum value - for that argument (so that -max is represented by 0, and +max is - represented by 2*max), which is half the maximum for the corresponding - unsigned argument. - - The size of each argument is defined in `llimits.h'. The usual is an - instruction with 32 bits, U arguments with 26 bits (32-6), B arguments - with 9 bits, and A arguments with 17 bits (32-6-9). For small - installations, the instruction size can be 16, so U has 10 bits, - and A and B have 5 bits each. -===========================================================================*/ - - - - -/* creates a mask with `n' 1 bits at position `p' */ -#define MASK1(n,p) ((~((~(Instruction)0)<<n))<<p) - -/* creates a mask with `n' 0 bits at position `p' */ -#define MASK0(n,p) (~MASK1(n,p)) - -/* -** the following macros help to manipulate instructions -*/ - -#define CREATE_0(o) ((Instruction)(o)) -#define GET_OPCODE(i) ((OpCode)((i)&MASK1(SIZE_OP,0))) -#define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,0)) | (Instruction)(o))) - -#define CREATE_U(o,u) ((Instruction)(o) | ((Instruction)(u)<<POS_U)) -#define GETARG_U(i) ((int)((i)>>POS_U)) -#define SETARG_U(i,u) ((i) = (((i)&MASK0(SIZE_U,POS_U)) | \ - ((Instruction)(u)<<POS_U))) - -#define CREATE_S(o,s) CREATE_U((o),(s)+MAXARG_S) -#define GETARG_S(i) (GETARG_U(i)-MAXARG_S) -#define SETARG_S(i,s) SETARG_U((i),(s)+MAXARG_S) - - -#define CREATE_AB(o,a,b) ((Instruction)(o) | ((Instruction)(a)<<POS_A) \ - | ((Instruction)(b)<<POS_B)) -#define GETARG_A(i) ((int)((i)>>POS_A)) -#define SETARG_A(i,a) ((i) = (((i)&MASK0(SIZE_A,POS_A)) | \ - ((Instruction)(a)<<POS_A))) -#define GETARG_B(i) ((int)(((i)>>POS_B) & MASK1(SIZE_B,0))) -#define SETARG_B(i,b) ((i) = (((i)&MASK0(SIZE_B,POS_B)) | \ - ((Instruction)(b)<<POS_B))) - - -/* -** K = U argument used as index to `kstr' -** J = S argument used as jump offset (relative to pc of next instruction) -** L = unsigned argument used as index of local variable -** N = U argument used as index to `knum' -*/ - -typedef enum { -/*---------------------------------------------------------------------- -name args stack before stack after side effects -------------------------------------------------------------------------*/ -OP_END,/* - - (return) no results */ -OP_RETURN,/* U v_n-v_x(at u) (return) returns v_x-v_n */ - -OP_CALL,/* A B v_n-v_1 f(at a) r_b-r_1 f(v1,...,v_n) */ -OP_TAILCALL,/* A B v_n-v_1 f(at a) (return) f(v1,...,v_n) */ - -OP_PUSHNIL,/* U - nil_1-nil_u */ -OP_POP,/* U a_u-a_1 - */ - -OP_PUSHINT,/* S - (Number)s */ -OP_PUSHSTRING,/* K - KSTR[k] */ -OP_PUSHNUM,/* N - KNUM[n] */ -OP_PUSHNEGNUM,/* N - -KNUM[n] */ - -OP_PUSHUPVALUE,/* U - Closure[u] */ - -OP_GETLOCAL,/* L - LOC[l] */ -OP_GETGLOBAL,/* K - VAR[KSTR[k]] */ - -OP_GETTABLE,/* - i t t[i] */ -OP_GETDOTTED,/* K t t[KSTR[k]] */ -OP_GETINDEXED,/* L t t[LOC[l]] */ -OP_PUSHSELF,/* K t t t[KSTR[k]] */ - -OP_CREATETABLE,/* U - newarray(size = u) */ - -OP_SETLOCAL,/* L x - LOC[l]=x */ -OP_SETGLOBAL,/* K x - VAR[KSTR[k]]=x */ -OP_SETTABLE,/* A B v a_a-a_1 i t (pops b values) t[i]=v */ - -OP_SETLIST,/* A B v_b-v_1 t t t[i+a*FPF]=v_i */ -OP_SETMAP,/* U v_u k_u - v_1 k_1 t t t[k_i]=v_i */ - -OP_ADD,/* - y x x+y */ -OP_ADDI,/* S x x+s */ -OP_SUB,/* - y x x-y */ -OP_MULT,/* - y x x*y */ -OP_DIV,/* - y x x/y */ -OP_POW,/* - y x x^y */ -OP_CONCAT,/* U v_u-v_1 v1..-..v_u */ -OP_MINUS,/* - x -x */ -OP_NOT,/* - x (x==nil)? 1 : nil */ - -OP_JMPNE,/* J y x - (x~=y)? PC+=s */ -OP_JMPEQ,/* J y x - (x==y)? PC+=s */ -OP_JMPLT,/* J y x - (x<y)? PC+=s */ -OP_JMPLE,/* J y x - (x<y)? PC+=s */ -OP_JMPGT,/* J y x - (x>y)? PC+=s */ -OP_JMPGE,/* J y x - (x>=y)? PC+=s */ - -OP_JMPT,/* J x - (x~=nil)? PC+=s */ -OP_JMPF,/* J x - (x==nil)? PC+=s */ -OP_JMPONT,/* J x (x~=nil)? x : - (x~=nil)? PC+=s */ -OP_JMPONF,/* J x (x==nil)? x : - (x==nil)? PC+=s */ -OP_JMP,/* J - - PC+=s */ - -OP_PUSHNILJMP,/* - - nil PC++; */ - -OP_FORPREP,/* J */ -OP_FORLOOP,/* J */ - -OP_LFORPREP,/* J */ -OP_LFORLOOP,/* J */ - -OP_CLOSURE/* A B v_b-v_1 closure(KPROTO[a], v_1-v_b) */ - -} OpCode; - -#define NUM_OPCODES ((int)OP_CLOSURE+1) - - -#define ISJUMP(o) (OP_JMPNE <= (o) && (o) <= OP_JMP) - - - -/* special code to fit a LUA_MULTRET inside an argB */ -#define MULT_RET 255 /* (<=MAXARG_B) */ -#if MULT_RET>MAXARG_B -#undef MULT_RET -#define MULT_RET MAXARG_B -#endif - - -#endif diff --git a/src/lua/lparser.c b/src/lua/lparser.c deleted file mode 100644 index 1ac1f37b..00000000 --- a/src/lua/lparser.c +++ /dev/null @@ -1,1129 +0,0 @@ -/* -** $Id: lparser.c,v 1.8 2004/06/04 13:42:10 neil Exp $ -** LL(1) Parser and code generator for Lua -** See Copyright Notice in lua.h -*/ - - -#include <stdio.h> -#include <string.h> - -#include "lua.h" - -#include "lcode.h" -#include "lfunc.h" -#include "llex.h" -#include "lmem.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" -#include "lstate.h" -#include "lstring.h" - -#ifdef __MWERKS__ -/* To avoid name conflict resulting from the use of prefix header */ -#define stat lua_hack_stat -#endif /* __MWERKS__ */ - - -/* -** Constructors descriptor: -** `n' indicates number of elements, and `k' signals whether -** it is a list constructor (k = 0) or a record constructor (k = 1) -** or empty (k = ';' or '}') -*/ -typedef struct Constdesc { - int n; - int k; -} Constdesc; - - -typedef struct Breaklabel { - struct Breaklabel *previous; /* chain */ - int breaklist; - int stacklevel; -} Breaklabel; - - - - -/* -** prototypes for recursive non-terminal functions -*/ -static void body (LexState *ls, int needself, int line); -static void chunk (LexState *ls); -static void constructor (LexState *ls); -static void expr (LexState *ls, expdesc *v); -static void exp1 (LexState *ls); - - - -static void next (LexState *ls) { - ls->lastline = ls->linenumber; - if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ - ls->t = ls->lookahead; /* use this one */ - ls->lookahead.token = TK_EOS; /* and discharge it */ - } - else - ls->t.token = luaX_lex(ls, &ls->t.seminfo); /* read next token */ -} - - -static void lookahead (LexState *ls) { - LUA_ASSERT(ls->lookahead.token == TK_EOS, "two look-aheads"); - ls->lookahead.token = luaX_lex(ls, &ls->lookahead.seminfo); -} - - -static void error_expected (LexState *ls, int token) { - char buff[100], t[TOKEN_LEN]; - luaX_token2str(token, t); - sprintf(buff, "`%.20s' expected", t); - luaK_error(ls, buff); -} - - -static void check (LexState *ls, int c) { - if (ls->t.token != c) - error_expected(ls, c); - next(ls); -} - - -static void check_condition (LexState *ls, int c, const char *msg) { - if (!c) luaK_error(ls, msg); -} - - -static int optional (LexState *ls, int c) { - if (ls->t.token == c) { - next(ls); - return 1; - } - else return 0; -} - - -static void check_match (LexState *ls, int what, int who, int where) { - if (ls->t.token != what) { - if (where == ls->linenumber) - error_expected(ls, what); - else { - char buff[100]; - char t_what[TOKEN_LEN], t_who[TOKEN_LEN]; - luaX_token2str(what, t_what); - luaX_token2str(who, t_who); - sprintf(buff, "`%.20s' expected (to close `%.20s' at line %d)", - t_what, t_who, where); - luaK_error(ls, buff); - } - } - next(ls); -} - - -static int string_constant (FuncState *fs, TString *s) { - Proto *f = fs->f; - int c = s->u.s.constindex; - if (c >= f->nkstr || f->kstr[c] != s) { - luaM_growvector(fs->L, f->kstr, f->nkstr, 1, TString *, - "constant table overflow", MAXARG_U); - c = f->nkstr++; - f->kstr[c] = s; - s->u.s.constindex = c; /* hint for next time */ - } - return c; -} - - -static void code_string (LexState *ls, TString *s) { - luaK_kstr(ls, string_constant(ls->fs, s)); -} - - -static TString *str_checkname (LexState *ls) { - TString *ts; - check_condition(ls, (ls->t.token == TK_NAME), "<name> expected"); - ts = ls->t.seminfo.ts; - next(ls); - return ts; -} - - -static int checkname (LexState *ls) { - return string_constant(ls->fs, str_checkname(ls)); -} - - -static int luaI_registerlocalvar (LexState *ls, TString *varname) { - Proto *f = ls->fs->f; - luaM_growvector(ls->L, f->locvars, f->nlocvars, 1, LocVar, "", MAX_INT); - f->locvars[f->nlocvars].varname = varname; - return f->nlocvars++; -} - - -static void new_localvar (LexState *ls, TString *name, int n) { - FuncState *fs = ls->fs; - luaX_checklimit(ls, fs->nactloc+n+1, MAXLOCALS, "local variables"); - fs->actloc[fs->nactloc+n] = luaI_registerlocalvar(ls, name); -} - - -static void adjustlocalvars (LexState *ls, int nvars) { - FuncState *fs = ls->fs; - while (nvars--) - fs->f->locvars[fs->actloc[fs->nactloc++]].startpc = fs->pc; -} - - -static void removelocalvars (LexState *ls, int nvars) { - FuncState *fs = ls->fs; - while (nvars--) - fs->f->locvars[fs->actloc[--fs->nactloc]].endpc = fs->pc; -} - - -static void new_localvarstr (LexState *ls, const char *name, int n) { - new_localvar(ls, luaS_newfixed(ls->L, name), n); -} - - -static int search_local (LexState *ls, TString *n, expdesc *var) { - FuncState *fs; - int level = 0; - for (fs=ls->fs; fs; fs=fs->prev) { - int i; - for (i=fs->nactloc-1; i >= 0; i--) { - if (n == fs->f->locvars[fs->actloc[i]].varname) { - var->k = VLOCAL; - var->u.index = i; - return level; - } - } - level++; /* `var' not found; check outer level */ - } - var->k = VGLOBAL; /* not found in any level; must be global */ - return -1; -} - - -static void singlevar (LexState *ls, TString *n, expdesc *var) { - int level = search_local(ls, n, var); - if (level >= 1) /* neither local (0) nor global (-1)? */ - luaX_syntaxerror(ls, "cannot access a variable in outer scope", n->str); - else if (level == -1) /* global? */ - var->u.index = string_constant(ls->fs, n); -} - - -static int indexupvalue (LexState *ls, expdesc *v) { - FuncState *fs = ls->fs; - int i; - for (i=0; i<fs->nupvalues; i++) { - if (fs->upvalues[i].k == v->k && fs->upvalues[i].u.index == v->u.index) - return i; - } - /* new one */ - luaX_checklimit(ls, fs->nupvalues+1, MAXUPVALUES, "upvalues"); - fs->upvalues[fs->nupvalues] = *v; - return fs->nupvalues++; -} - - -static void pushupvalue (LexState *ls, TString *n) { - FuncState *fs = ls->fs; - expdesc v; - int level = search_local(ls, n, &v); - if (level == -1) { /* global? */ - if (fs->prev == NULL) - luaX_syntaxerror(ls, "cannot access upvalue in main", n->str); - v.u.index = string_constant(fs->prev, n); - } - else if (level != 1) - luaX_syntaxerror(ls, - "upvalue must be global or local to immediately outer scope", n->str); - luaK_code1(fs, OP_PUSHUPVALUE, indexupvalue(ls, &v)); -} - - -static void adjust_mult_assign (LexState *ls, int nvars, int nexps) { - FuncState *fs = ls->fs; - int diff = nexps - nvars; - if (nexps > 0 && luaK_lastisopen(fs)) { /* list ends in a function call */ - diff--; /* do not count function call itself */ - if (diff <= 0) { /* more variables than values? */ - luaK_setcallreturns(fs, -diff); /* function call provide extra values */ - diff = 0; /* no more difference */ - } - else /* more values than variables */ - luaK_setcallreturns(fs, 0); /* call should provide no value */ - } - /* push or pop eventual difference between list lengths */ - luaK_adjuststack(fs, diff); -} - - -static void code_params (LexState *ls, int nparams, int dots) { - FuncState *fs = ls->fs; - adjustlocalvars(ls, nparams); - luaX_checklimit(ls, fs->nactloc, MAXPARAMS, "parameters"); - fs->f->numparams = fs->nactloc; /* `self' could be there already */ - fs->f->is_vararg = dots; - if (dots) { - new_localvarstr(ls, "arg", 0); - adjustlocalvars(ls, 1); - } - luaK_deltastack(fs, fs->nactloc); /* count parameters in the stack */ -} - - -static void enterbreak (FuncState *fs, Breaklabel *bl) { - bl->stacklevel = fs->stacklevel; - bl->breaklist = NO_JUMP; - bl->previous = fs->bl; - fs->bl = bl; -} - - -static void leavebreak (FuncState *fs, Breaklabel *bl) { - fs->bl = bl->previous; - LUA_ASSERT(bl->stacklevel == fs->stacklevel, "wrong levels"); - luaK_patchlist(fs, bl->breaklist, luaK_getlabel(fs)); -} - - -static void pushclosure (LexState *ls, FuncState *func) { - FuncState *fs = ls->fs; - Proto *f = fs->f; - int i; - for (i=0; i<func->nupvalues; i++) - luaK_tostack(ls, &func->upvalues[i], 1); - luaM_growvector(ls->L, f->kproto, f->nkproto, 1, Proto *, - "constant table overflow", MAXARG_A); - f->kproto[f->nkproto++] = func->f; - luaK_code2(fs, OP_CLOSURE, f->nkproto-1, func->nupvalues); -} - - -static void open_func (LexState *ls, FuncState *fs) { - Proto *f = luaF_newproto(ls->L); - fs->prev = ls->fs; /* linked list of funcstates */ - fs->ls = ls; - fs->L = ls->L; - ls->fs = fs; - fs->stacklevel = 0; - fs->nactloc = 0; - fs->nupvalues = 0; - fs->bl = NULL; - fs->f = f; - f->source = ls->source; - fs->pc = 0; - fs->lasttarget = 0; - fs->lastline = 0; - fs->jlt = NO_JUMP; - f->code = NULL; - f->maxstacksize = 0; - f->numparams = 0; /* default for main chunk */ - f->is_vararg = 0; /* default for main chunk */ -} - - -static void close_func (LexState *ls) { - lua_State *L = ls->L; - FuncState *fs = ls->fs; - Proto *f = fs->f; - luaK_code0(fs, OP_END); - luaK_getlabel(fs); /* close eventual list of pending jumps */ - luaM_reallocvector(L, f->code, fs->pc, Instruction); - luaM_reallocvector(L, f->kstr, f->nkstr, TString *); - luaM_reallocvector(L, f->knum, f->nknum, Number); - luaM_reallocvector(L, f->kproto, f->nkproto, Proto *); - removelocalvars(ls, fs->nactloc); - luaM_reallocvector(L, f->locvars, f->nlocvars, LocVar); - luaM_reallocvector(L, f->lineinfo, f->nlineinfo+1, int); - f->lineinfo[f->nlineinfo++] = MAX_INT; /* end flag */ - luaF_protook(L, f, fs->pc); /* proto is ok now */ - ls->fs = fs->prev; - LUA_ASSERT(fs->bl == NULL, "wrong list end"); -} - - -Proto *luaY_parser (lua_State *L, ZIO *z) { - struct LexState lexstate; - struct FuncState funcstate; - luaX_setinput(L, &lexstate, z, luaS_new(L, zname(z))); - open_func(&lexstate, &funcstate); - next(&lexstate); /* read first token */ - chunk(&lexstate); - check_condition(&lexstate, (lexstate.t.token == TK_EOS), "<eof> expected"); - close_func(&lexstate); - LUA_ASSERT(funcstate.prev == NULL, "wrong list end"); - LUA_ASSERT(funcstate.nupvalues == 0, "no upvalues in main"); - return funcstate.f; -} - - - -/*============================================================*/ -/* GRAMMAR RULES */ -/*============================================================*/ - - -static int explist1 (LexState *ls) { - /* explist1 -> expr { ',' expr } */ - int n = 1; /* at least one expression */ - expdesc v; - expr(ls, &v); - while (ls->t.token == ',') { - luaK_tostack(ls, &v, 1); /* gets only 1 value from previous expression */ - next(ls); /* skip comma */ - expr(ls, &v); - n++; - } - luaK_tostack(ls, &v, 0); /* keep open number of values of last expression */ - return n; -} - - -static void funcargs (LexState *ls, int slf) { - FuncState *fs = ls->fs; - int slevel = fs->stacklevel - slf - 1; /* where is func in the stack */ - switch (ls->t.token) { - case '(': { /* funcargs -> '(' [ explist1 ] ')' */ - int line = ls->linenumber; - int nargs = 0; - next(ls); - if (ls->t.token != ')') /* arg list not empty? */ - nargs = explist1(ls); - check_match(ls, ')', '(', line); -#ifdef LUA_COMPAT_ARGRET - if (nargs > 0) /* arg list is not empty? */ - luaK_setcallreturns(fs, 1); /* last call returns only 1 value */ -#else - UNUSED(nargs); /* to avoid warnings */ -#endif - break; - } - case '{': { /* funcargs -> constructor */ - constructor(ls); - break; - } - case TK_STRING: { /* funcargs -> STRING */ - code_string(ls, ls->t.seminfo.ts); /* must use `seminfo' before `next' */ - next(ls); - break; - } - default: { - luaK_error(ls, "function arguments expected"); - break; - } - } - fs->stacklevel = slevel; /* call will remove function and arguments */ - luaK_code2(fs, OP_CALL, slevel, MULT_RET); -} - - -static void var_or_func_tail (LexState *ls, expdesc *v) { - for (;;) { - switch (ls->t.token) { - case '.': { /* var_or_func_tail -> '.' NAME */ - next(ls); - luaK_tostack(ls, v, 1); /* `v' must be on stack */ - luaK_kstr(ls, checkname(ls)); - v->k = VINDEXED; - break; - } - case '[': { /* var_or_func_tail -> '[' exp1 ']' */ - next(ls); - luaK_tostack(ls, v, 1); /* `v' must be on stack */ - v->k = VINDEXED; - exp1(ls); - check(ls, ']'); - break; - } - case ':': { /* var_or_func_tail -> ':' NAME funcargs */ - int name; - next(ls); - name = checkname(ls); - luaK_tostack(ls, v, 1); /* `v' must be on stack */ - luaK_code1(ls->fs, OP_PUSHSELF, name); - funcargs(ls, 1); - v->k = VEXP; - v->u.l.t = v->u.l.f = NO_JUMP; - break; - } - case '(': case TK_STRING: case '{': { /* var_or_func_tail -> funcargs */ - luaK_tostack(ls, v, 1); /* `v' must be on stack */ - funcargs(ls, 0); - v->k = VEXP; - v->u.l.t = v->u.l.f = NO_JUMP; - break; - } - default: return; /* should be follow... */ - } - } -} - - -static void var_or_func (LexState *ls, expdesc *v) { - /* var_or_func -> ['%'] NAME var_or_func_tail */ - if (optional(ls, '%')) { /* upvalue? */ - pushupvalue(ls, str_checkname(ls)); - v->k = VEXP; - v->u.l.t = v->u.l.f = NO_JUMP; - } - else /* variable name */ - singlevar(ls, str_checkname(ls), v); - var_or_func_tail(ls, v); -} - - - -/* -** {====================================================================== -** Rules for Constructors -** ======================================================================= -*/ - - -static void recfield (LexState *ls) { - /* recfield -> (NAME | '['exp1']') = exp1 */ - switch (ls->t.token) { - case TK_NAME: { - luaK_kstr(ls, checkname(ls)); - break; - } - case '[': { - next(ls); - exp1(ls); - check(ls, ']'); - break; - } - default: luaK_error(ls, "<name> or `[' expected"); - } - check(ls, '='); - exp1(ls); -} - - -static int recfields (LexState *ls) { - /* recfields -> recfield { ',' recfield } [','] */ - FuncState *fs = ls->fs; - int n = 1; /* at least one element */ - recfield(ls); - while (ls->t.token == ',') { - next(ls); - if (ls->t.token == ';' || ls->t.token == '}') - break; - recfield(ls); - n++; - if (n%RFIELDS_PER_FLUSH == 0) - luaK_code1(fs, OP_SETMAP, RFIELDS_PER_FLUSH); - } - luaK_code1(fs, OP_SETMAP, n%RFIELDS_PER_FLUSH); - return n; -} - - -static int listfields (LexState *ls) { - /* listfields -> exp1 { ',' exp1 } [','] */ - FuncState *fs = ls->fs; - int n = 1; /* at least one element */ - exp1(ls); - while (ls->t.token == ',') { - next(ls); - if (ls->t.token == ';' || ls->t.token == '}') - break; - exp1(ls); - n++; - luaX_checklimit(ls, n/LFIELDS_PER_FLUSH, MAXARG_A, - "`item groups' in a list initializer"); - if (n%LFIELDS_PER_FLUSH == 0) - luaK_code2(fs, OP_SETLIST, n/LFIELDS_PER_FLUSH - 1, LFIELDS_PER_FLUSH); - } - luaK_code2(fs, OP_SETLIST, n/LFIELDS_PER_FLUSH, n%LFIELDS_PER_FLUSH); - return n; -} - - - -static void constructor_part (LexState *ls, Constdesc *cd) { - switch (ls->t.token) { - case ';': case '}': { /* constructor_part -> empty */ - cd->n = 0; - cd->k = ls->t.token; - break; - } - case TK_NAME: { /* may be listfields or recfields */ - lookahead(ls); - if (ls->lookahead.token != '=') /* expression? */ - goto case_default; - /* else go through to recfields */ - } - case '[': { /* constructor_part -> recfields */ - cd->n = recfields(ls); - cd->k = 1; /* record */ - break; - } - default: { /* constructor_part -> listfields */ - case_default: - cd->n = listfields(ls); - cd->k = 0; /* list */ - break; - } - } -} - - -static void constructor (LexState *ls) { - /* constructor -> '{' constructor_part [';' constructor_part] '}' */ - FuncState *fs = ls->fs; - int line = ls->linenumber; - int pc = luaK_code1(fs, OP_CREATETABLE, 0); - int nelems; - Constdesc cd; - check(ls, '{'); - constructor_part(ls, &cd); - nelems = cd.n; - if (optional(ls, ';')) { - Constdesc other_cd; - constructor_part(ls, &other_cd); - check_condition(ls, (cd.k != other_cd.k), "invalid constructor syntax"); - nelems += other_cd.n; - } - check_match(ls, '}', '{', line); - luaX_checklimit(ls, nelems, MAXARG_U, "elements in a table constructor"); - SETARG_U(fs->f->code[pc], nelems); /* set initial table size */ -} - -/* }====================================================================== */ - - - - -/* -** {====================================================================== -** Expression parsing -** ======================================================================= -*/ - - -static void simpleexp (LexState *ls, expdesc *v) { - FuncState *fs = ls->fs; - switch (ls->t.token) { - case TK_NUMBER: { /* simpleexp -> NUMBER */ - Number r = ls->t.seminfo.r; - next(ls); - luaK_number(fs, r); - break; - } - case TK_STRING: { /* simpleexp -> STRING */ - code_string(ls, ls->t.seminfo.ts); /* must use `seminfo' before `next' */ - next(ls); - break; - } - case TK_NIL: { /* simpleexp -> NIL */ - luaK_adjuststack(fs, -1); - next(ls); - break; - } - case '{': { /* simpleexp -> constructor */ - constructor(ls); - break; - } - case TK_FUNCTION: { /* simpleexp -> FUNCTION body */ - next(ls); - body(ls, 0, ls->linenumber); - break; - } - case '(': { /* simpleexp -> '(' expr ')' */ - next(ls); - expr(ls, v); - check(ls, ')'); - return; - } - case TK_NAME: case '%': { - var_or_func(ls, v); - return; - } - default: { - luaK_error(ls, "<expression> expected"); - return; - } - } - v->k = VEXP; - v->u.l.t = v->u.l.f = NO_JUMP; -} - - -static void exp1 (LexState *ls) { - expdesc v; - expr(ls, &v); - luaK_tostack(ls, &v, 1); -} - - -static UnOpr getunopr (int op) { - switch (op) { - case TK_NOT: return OPR_NOT; - case '-': return OPR_MINUS; - default: return OPR_NOUNOPR; - } -} - - -static BinOpr getbinopr (int op) { - switch (op) { - case '+': return OPR_ADD; - case '-': return OPR_SUB; - case '*': return OPR_MULT; - case '/': return OPR_DIV; - case '^': return OPR_POW; - case TK_CONCAT: return OPR_CONCAT; - case TK_NE: return OPR_NE; - case TK_EQ: return OPR_EQ; - case '<': return OPR_LT; - case TK_LE: return OPR_LE; - case '>': return OPR_GT; - case TK_GE: return OPR_GE; - case TK_AND: return OPR_AND; - case TK_OR: return OPR_OR; - default: return OPR_NOBINOPR; - } -} - - -static const struct { - char left; /* left priority for each binary operator */ - char right; /* right priority */ -} priority[] = { /* ORDER OPR */ - {5, 5}, {5, 5}, {6, 6}, {6, 6}, /* arithmetic */ - {9, 8}, {4, 3}, /* power and concat (right associative) */ - {2, 2}, {2, 2}, /* equality */ - {2, 2}, {2, 2}, {2, 2}, {2, 2}, /* order */ - {1, 1}, {1, 1} /* logical */ -}; - -#define UNARY_PRIORITY 7 /* priority for unary operators */ - - -/* -** subexpr -> (simplexep | unop subexpr) { binop subexpr } -** where `binop' is any binary operator with a priority higher than `limit' -*/ -static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { - BinOpr op; - UnOpr uop = getunopr(ls->t.token); - if (uop != OPR_NOUNOPR) { - next(ls); - subexpr(ls, v, UNARY_PRIORITY); - luaK_prefix(ls, uop, v); - } - else simpleexp(ls, v); - /* expand while operators have priorities higher than `limit' */ - op = getbinopr(ls->t.token); - while (op != OPR_NOBINOPR && priority[op].left > limit) { - expdesc v2; - BinOpr nextop; - next(ls); - luaK_infix(ls, op, v); - /* read sub-expression with higher priority */ - nextop = subexpr(ls, &v2, priority[op].right); - luaK_posfix(ls, op, v, &v2); - op = nextop; - } - return op; /* return first untreated operator */ -} - - -static void expr (LexState *ls, expdesc *v) { - subexpr(ls, v, -1); -} - -/* }==================================================================== */ - - -/* -** {====================================================================== -** Rules for Statements -** ======================================================================= -*/ - - -static int block_follow (int token) { - switch (token) { - case TK_ELSE: case TK_ELSEIF: case TK_END: - case TK_UNTIL: case TK_EOS: - return 1; - default: return 0; - } -} - - -static void block (LexState *ls) { - /* block -> chunk */ - FuncState *fs = ls->fs; - int nactloc = fs->nactloc; - chunk(ls); - luaK_adjuststack(fs, fs->nactloc - nactloc); /* remove local variables */ - removelocalvars(ls, fs->nactloc - nactloc); -} - - -static int assignment (LexState *ls, expdesc *v, int nvars) { - int left = 0; /* number of values left in the stack after assignment */ - luaX_checklimit(ls, nvars, MAXVARSLH, "variables in a multiple assignment"); - if (ls->t.token == ',') { /* assignment -> ',' NAME assignment */ - expdesc nv; - next(ls); - var_or_func(ls, &nv); - check_condition(ls, (nv.k != VEXP), "syntax error"); - left = assignment(ls, &nv, nvars+1); - } - else { /* assignment -> '=' explist1 */ - int nexps; - check(ls, '='); - nexps = explist1(ls); - adjust_mult_assign(ls, nvars, nexps); - } - if (v->k != VINDEXED) - luaK_storevar(ls, v); - else { /* there may be garbage between table-index and value */ - luaK_code2(ls->fs, OP_SETTABLE, left+nvars+2, 1); - left += 2; - } - return left; -} - - -static void cond (LexState *ls, expdesc *v) { - /* cond -> exp */ - expr(ls, v); /* read condition */ - luaK_goiftrue(ls->fs, v, 0); -} - - -static void whilestat (LexState *ls, int line) { - /* whilestat -> WHILE cond DO block END */ - FuncState *fs = ls->fs; - int while_init = luaK_getlabel(fs); - expdesc v; - Breaklabel bl; - enterbreak(fs, &bl); - next(ls); - cond(ls, &v); - check(ls, TK_DO); - block(ls); - luaK_patchlist(fs, luaK_jump(fs), while_init); - luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs)); - check_match(ls, TK_END, TK_WHILE, line); - leavebreak(fs, &bl); -} - - -static void repeatstat (LexState *ls, int line) { - /* repeatstat -> REPEAT block UNTIL cond */ - FuncState *fs = ls->fs; - int repeat_init = luaK_getlabel(fs); - expdesc v; - Breaklabel bl; - enterbreak(fs, &bl); - next(ls); - block(ls); - check_match(ls, TK_UNTIL, TK_REPEAT, line); - cond(ls, &v); - luaK_patchlist(fs, v.u.l.f, repeat_init); - leavebreak(fs, &bl); -} - - -static void forbody (LexState *ls, int nvar, OpCode prepfor, OpCode loopfor) { - /* forbody -> DO block END */ - FuncState *fs = ls->fs; - int prep = luaK_code1(fs, prepfor, NO_JUMP); - int blockinit = luaK_getlabel(fs); - check(ls, TK_DO); - adjustlocalvars(ls, nvar); /* scope for control variables */ - block(ls); - luaK_patchlist(fs, luaK_code1(fs, loopfor, NO_JUMP), blockinit); - luaK_patchlist(fs, prep, luaK_getlabel(fs)); - removelocalvars(ls, nvar); -} - - -static void fornum (LexState *ls, TString *varname) { - /* fornum -> NAME = exp1,exp1[,exp1] forbody */ - FuncState *fs = ls->fs; - check(ls, '='); - exp1(ls); /* initial value */ - check(ls, ','); - exp1(ls); /* limit */ - if (optional(ls, ',')) - exp1(ls); /* optional step */ - else - luaK_code1(fs, OP_PUSHINT, 1); /* default step */ - new_localvar(ls, varname, 0); - new_localvarstr(ls, "(limit)", 1); - new_localvarstr(ls, "(step)", 2); - forbody(ls, 3, OP_FORPREP, OP_FORLOOP); -} - - -static void forlist (LexState *ls, TString *indexname) { - /* forlist -> NAME,NAME IN exp1 forbody */ - TString *valname; - check(ls, ','); - valname = str_checkname(ls); - /* next test is dirty, but avoids `in' being a reserved word */ - check_condition(ls, - (ls->t.token == TK_NAME && ls->t.seminfo.ts == luaS_new(ls->L, "in")), - "`in' expected"); - next(ls); /* skip `in' */ - exp1(ls); /* table */ - new_localvarstr(ls, "(table)", 0); - new_localvar(ls, indexname, 1); - new_localvar(ls, valname, 2); - forbody(ls, 3, OP_LFORPREP, OP_LFORLOOP); -} - - -static void forstat (LexState *ls, int line) { - /* forstat -> fornum | forlist */ - FuncState *fs = ls->fs; - TString *varname; - Breaklabel bl; - enterbreak(fs, &bl); - next(ls); /* skip `for' */ - varname = str_checkname(ls); /* first variable name */ - switch (ls->t.token) { - case '=': fornum(ls, varname); break; - case ',': forlist(ls, varname); break; - default: luaK_error(ls, "`=' or `,' expected"); - } - check_match(ls, TK_END, TK_FOR, line); - leavebreak(fs, &bl); -} - - -static void test_then_block (LexState *ls, expdesc *v) { - /* test_then_block -> [IF | ELSEIF] cond THEN block */ - next(ls); /* skip IF or ELSEIF */ - cond(ls, v); - check(ls, TK_THEN); - block(ls); /* `then' part */ -} - - -static void ifstat (LexState *ls, int line) { - /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ - FuncState *fs = ls->fs; - expdesc v; - int escapelist = NO_JUMP; - test_then_block(ls, &v); /* IF cond THEN block */ - while (ls->t.token == TK_ELSEIF) { - luaK_concat(fs, &escapelist, luaK_jump(fs)); - luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs)); - test_then_block(ls, &v); /* ELSEIF cond THEN block */ - } - if (ls->t.token == TK_ELSE) { - luaK_concat(fs, &escapelist, luaK_jump(fs)); - luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs)); - next(ls); /* skip ELSE */ - block(ls); /* `else' part */ - } - else - luaK_concat(fs, &escapelist, v.u.l.f); - luaK_patchlist(fs, escapelist, luaK_getlabel(fs)); - check_match(ls, TK_END, TK_IF, line); -} - - -static void localstat (LexState *ls) { - /* stat -> LOCAL NAME {',' NAME} ['=' explist1] */ - int nvars = 0; - int nexps; - do { - next(ls); /* skip LOCAL or ',' */ - new_localvar(ls, str_checkname(ls), nvars++); - } while (ls->t.token == ','); - if (optional(ls, '=')) - nexps = explist1(ls); - else - nexps = 0; - adjust_mult_assign(ls, nvars, nexps); - adjustlocalvars(ls, nvars); -} - - -static int funcname (LexState *ls, expdesc *v) { - /* funcname -> NAME [':' NAME | '.' NAME] */ - int needself = 0; - singlevar(ls, str_checkname(ls), v); - if (ls->t.token == ':' || ls->t.token == '.') { - needself = (ls->t.token == ':'); - next(ls); - luaK_tostack(ls, v, 1); - luaK_kstr(ls, checkname(ls)); - v->k = VINDEXED; - } - return needself; -} - - -static void funcstat (LexState *ls, int line) { - /* funcstat -> FUNCTION funcname body */ - int needself; - expdesc v; - next(ls); /* skip FUNCTION */ - needself = funcname(ls, &v); - body(ls, needself, line); - luaK_storevar(ls, &v); -} - - -static void namestat (LexState *ls) { - /* stat -> func | ['%'] NAME assignment */ - FuncState *fs = ls->fs; - expdesc v; - var_or_func(ls, &v); - if (v.k == VEXP) { /* stat -> func */ - check_condition(ls, luaK_lastisopen(fs), "syntax error"); /* an upvalue? */ - luaK_setcallreturns(fs, 0); /* call statement uses no results */ - } - else { /* stat -> ['%'] NAME assignment */ - int left = assignment(ls, &v, 1); - luaK_adjuststack(fs, left); /* remove eventual garbage left on stack */ - } -} - - -static void retstat (LexState *ls) { - /* stat -> RETURN explist */ - FuncState *fs = ls->fs; - next(ls); /* skip RETURN */ - if (!block_follow(ls->t.token)) - explist1(ls); /* optional return values */ - luaK_code1(fs, OP_RETURN, ls->fs->nactloc); - fs->stacklevel = fs->nactloc; /* removes all temp values */ -} - - -static void breakstat (LexState *ls) { - /* stat -> BREAK [NAME] */ - FuncState *fs = ls->fs; - int currentlevel = fs->stacklevel; - Breaklabel *bl = fs->bl; - if (!bl) - luaK_error(ls, "no loop to break"); - next(ls); /* skip BREAK */ - luaK_adjuststack(fs, currentlevel - bl->stacklevel); - luaK_concat(fs, &bl->breaklist, luaK_jump(fs)); - /* correct stack for compiler and symbolic execution */ - luaK_adjuststack(fs, bl->stacklevel - currentlevel); -} - - -static int stat (LexState *ls) { - int line = ls->linenumber; /* may be needed for error messages */ - switch (ls->t.token) { - case TK_IF: { /* stat -> ifstat */ - ifstat(ls, line); - return 0; - } - case TK_WHILE: { /* stat -> whilestat */ - whilestat(ls, line); - return 0; - } - case TK_DO: { /* stat -> DO block END */ - next(ls); /* skip DO */ - block(ls); - check_match(ls, TK_END, TK_DO, line); - return 0; - } - case TK_FOR: { /* stat -> forstat */ - forstat(ls, line); - return 0; - } - case TK_REPEAT: { /* stat -> repeatstat */ - repeatstat(ls, line); - return 0; - } - case TK_FUNCTION: { /* stat -> funcstat */ - funcstat(ls, line); - return 0; - } - case TK_LOCAL: { /* stat -> localstat */ - localstat(ls); - return 0; - } - case TK_NAME: case '%': { /* stat -> namestat */ - namestat(ls); - return 0; - } - case TK_RETURN: { /* stat -> retstat */ - retstat(ls); - return 1; /* must be last statement */ - } - case TK_BREAK: { /* stat -> breakstat */ - breakstat(ls); - return 1; /* must be last statement */ - } - default: { - luaK_error(ls, "<statement> expected"); - return 0; /* to avoid warnings */ - } - } -} - - -static void parlist (LexState *ls) { - /* parlist -> [ param { ',' param } ] */ - int nparams = 0; - int dots = 0; - if (ls->t.token != ')') { /* is `parlist' not empty? */ - do { - switch (ls->t.token) { - case TK_DOTS: next(ls); dots = 1; break; - case TK_NAME: new_localvar(ls, str_checkname(ls), nparams++); break; - default: luaK_error(ls, "<name> or `...' expected"); - } - } while (!dots && optional(ls, ',')); - } - code_params(ls, nparams, dots); -} - - -static void body (LexState *ls, int needself, int line) { - /* body -> '(' parlist ')' chunk END */ - FuncState new_fs; - open_func(ls, &new_fs); - new_fs.f->lineDefined = line; - check(ls, '('); - if (needself) { - new_localvarstr(ls, "self", 0); - adjustlocalvars(ls, 1); - } - parlist(ls); - check(ls, ')'); - chunk(ls); - check_match(ls, TK_END, TK_FUNCTION, line); - close_func(ls); - pushclosure(ls, &new_fs); -} - - -/* }====================================================================== */ - - -static void chunk (LexState *ls) { - /* chunk -> { stat [';'] } */ - int islast = 0; - while (!islast && !block_follow(ls->t.token)) { - islast = stat(ls); - optional(ls, ';'); - LUA_ASSERT(ls->fs->stacklevel == ls->fs->nactloc, - "stack size != # local vars"); - } -} - diff --git a/src/lua/lparser.h b/src/lua/lparser.h deleted file mode 100644 index d83fb5f1..00000000 --- a/src/lua/lparser.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -** $Id: lparser.h,v 1.3 2001/11/26 23:00:26 darkgod Exp $ -** LL(1) Parser and code generator for Lua -** See Copyright Notice in lua.h -*/ - -#ifndef lparser_h -#define lparser_h - -#include "lobject.h" -#include "lzio.h" - - -/* -** Expression descriptor -*/ - -typedef enum { - VGLOBAL, - VLOCAL, - VINDEXED, - VEXP -} expkind; - -typedef struct expdesc { - expkind k; - union { - int index; /* VGLOBAL: `kstr' index of global name; VLOCAL: stack index */ - struct { - int t; /* patch list of `exit when true' */ - int f; /* patch list of `exit when false' */ - } l; - } u; -} expdesc; - - - -/* state needed to generate code for a given function */ -typedef struct FuncState { - Proto *f; /* current function header */ - struct FuncState *prev; /* enclosing function */ - struct LexState *ls; /* lexical state */ - struct lua_State *L; /* copy of the Lua state */ - int pc; /* next position to code */ - int lasttarget; /* `pc' of last `jump target' */ - int jlt; /* list of jumps to `lasttarget' */ - short stacklevel; /* number of values on activation register */ - short nactloc; /* number of active local variables */ - short nupvalues; /* number of upvalues */ - int lastline; /* line where last `lineinfo' was generated */ - struct Breaklabel *bl; /* chain of breakable blocks */ - expdesc upvalues[MAXUPVALUES]; /* upvalues */ - int actloc[MAXLOCALS]; /* local-variable stack (indices to locvars) */ -} FuncState; - - -Proto *luaY_parser (lua_State *L, ZIO *z); - - -#endif diff --git a/src/lua/lstate.c b/src/lua/lstate.c deleted file mode 100644 index 6310cb7e..00000000 --- a/src/lua/lstate.c +++ /dev/null @@ -1,121 +0,0 @@ -/* -** $Id: lstate.c,v 1.3 2001/11/26 23:00:26 darkgod Exp $ -** Global State -** See Copyright Notice in lua.h -*/ - - -#include <stdio.h> - -#include "lua.h" - -#include "ldo.h" -#include "lgc.h" -#include "llex.h" -#include "lmem.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" - - -#ifdef LUA_DEBUG -static lua_State *lua_state = NULL; -void luaB_opentests (lua_State *L); -#endif - - -/* -** built-in implementation for ERRORMESSAGE. In a "correct" environment -** ERRORMESSAGE should have an external definition, and so this function -** would not be used. -*/ -static int errormessage (lua_State *L) { - const char *s = lua_tostring(L, 1); - if (s == NULL) s = "(no message)"; - fprintf(stderr, "error: %s\n", s); - return 0; -} - - -/* -** open parts that may cause memory-allocation errors -*/ -static void f_luaopen (lua_State *L, void *ud) { - int stacksize = *(int *)ud; - if (stacksize == 0) - stacksize = DEFAULT_STACK_SIZE; - else - stacksize += LUA_MINSTACK; - L->gt = luaH_new(L, 10); /* table of globals */ - luaD_init(L, stacksize); - luaS_init(L); - luaX_init(L); - luaT_init(L); - lua_newtable(L); - lua_ref(L, 1); /* create registry */ - lua_register(L, LUA_ERRORMESSAGE, errormessage); -#ifdef LUA_DEBUG - luaB_opentests(L); - if (lua_state == NULL) lua_state = L; /* keep first state to be opened */ -#endif - LUA_ASSERT(lua_gettop(L) == 0, "wrong API stack"); -} - - -LUA_API lua_State *lua_open (int stacksize) { - lua_State *L = luaM_new(NULL, lua_State); - if (L == NULL) return NULL; /* memory allocation error */ - L->stack = NULL; - L->strt.size = L->udt.size = 0; - L->strt.nuse = L->udt.nuse = 0; - L->strt.hash = NULL; - L->udt.hash = NULL; - L->Mbuffer = NULL; - L->Mbuffsize = 0; - L->rootproto = NULL; - L->rootcl = NULL; - L->roottable = NULL; - L->TMtable = NULL; - L->last_tag = -1; - L->refArray = NULL; - L->refSize = 0; - L->refFree = NONEXT; - L->nblocks = sizeof(lua_State); - L->GCthreshold = MAX_INT; /* to avoid GC during pre-definitions */ - L->callhook = NULL; - L->linehook = NULL; - L->allowhooks = 1; - L->errorJmp = NULL; - if (luaD_runprotected(L, f_luaopen, &stacksize) != 0) { - /* memory allocation error: free partial state */ - lua_close(L); - return NULL; - } - L->GCthreshold = 2*L->nblocks; - return L; -} - - -LUA_API void lua_close (lua_State *L) { - LUA_ASSERT(L != lua_state || lua_gettop(L) == 0, "garbage in C stack"); - luaC_collect(L, 1); /* collect all elements */ - LUA_ASSERT(L->rootproto == NULL, "list should be empty"); - LUA_ASSERT(L->rootcl == NULL, "list should be empty"); - LUA_ASSERT(L->roottable == NULL, "list should be empty"); - luaS_freeall(L); - if (L->stack) - L->nblocks -= (L->stack_last - L->stack + 1)*sizeof(TObject); - luaM_free(L, L->stack); - L->nblocks -= (L->last_tag+1)*sizeof(struct TM); - luaM_free(L, L->TMtable); - L->nblocks -= (L->refSize)*sizeof(struct Ref); - luaM_free(L, L->refArray); - L->nblocks -= (L->Mbuffsize)*sizeof(char); - luaM_free(L, L->Mbuffer); - LUA_ASSERT(L->nblocks == sizeof(lua_State), "wrong count for nblocks"); - luaM_free(L, L); - LUA_ASSERT(L != lua_state || memdebug_numblocks == 0, "memory leak!"); - LUA_ASSERT(L != lua_state || memdebug_total == 0,"memory leak!"); -} - diff --git a/src/lua/lstate.h b/src/lua/lstate.h deleted file mode 100644 index ee02db01..00000000 --- a/src/lua/lstate.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -** $Id: lstate.h,v 1.3 2001/11/26 23:00:26 darkgod Exp $ -** Global State -** See Copyright Notice in lua.h -*/ - -#ifndef lstate_h -#define lstate_h - -#include "lobject.h" -#include "lua.h" -#include "luadebug.h" - - - -typedef TObject *StkId; /* index to stack elements */ - - -/* -** marks for Reference array -*/ -#define NONEXT -1 /* to end the free list */ -#define HOLD -2 -#define COLLECTED -3 -#define LOCK -4 - - -struct Ref { - TObject o; - int st; /* can be LOCK, HOLD, COLLECTED, or next (for free list) */ -}; - - -struct lua_longjmp; /* defined in ldo.c */ -struct TM; /* defined in ltm.h */ - - -typedef struct stringtable { - int size; - lint32 nuse; /* number of elements */ - TString **hash; -} stringtable; - - - -struct lua_State { - /* thread-specific state */ - StkId top; /* first free slot in the stack */ - StkId stack; /* stack base */ - StkId stack_last; /* last free slot in the stack */ - int stacksize; - StkId Cbase; /* base for current C function */ - struct lua_longjmp *errorJmp; /* current error recover point */ - char *Mbuffer; /* global buffer */ - size_t Mbuffsize; /* size of Mbuffer */ - /* global state */ - Proto *rootproto; /* list of all prototypes */ - Closure *rootcl; /* list of all closures */ - Hash *roottable; /* list of all tables */ - stringtable strt; /* hash table for strings */ - stringtable udt; /* hash table for udata */ - Hash *gt; /* table for globals */ - struct TM *TMtable; /* table for tag methods */ - int last_tag; /* last used tag in TMtable */ - struct Ref *refArray; /* locked objects */ - int refSize; /* size of refArray */ - int refFree; /* list of free positions in refArray */ - unsigned long GCthreshold; - unsigned long nblocks; /* number of `bytes' currently allocated */ - lua_Hook callhook; - lua_Hook linehook; - int allowhooks; -}; - - -#endif - diff --git a/src/lua/lstring.c b/src/lua/lstring.c deleted file mode 100644 index 7293e195..00000000 --- a/src/lua/lstring.c +++ /dev/null @@ -1,155 +0,0 @@ -/* -** $Id: lstring.c,v 1.3 2001/11/26 23:00:26 darkgod Exp $ -** String table (keeps all strings handled by Lua) -** See Copyright Notice in lua.h -*/ - - -#include <string.h> - -#include "lua.h" - -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" - - -/* -** type equivalent to TString, but with maximum alignment requirements -*/ -union L_UTString { - TString ts; - union L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */ -}; - - - -void luaS_init (lua_State *L) { - L->strt.hash = luaM_newvector(L, 1, TString *); - L->udt.hash = luaM_newvector(L, 1, TString *); - L->nblocks += 2*sizeof(TString *); - L->strt.size = L->udt.size = 1; - L->strt.nuse = L->udt.nuse = 0; - L->strt.hash[0] = L->udt.hash[0] = NULL; -} - - -void luaS_freeall (lua_State *L) { - LUA_ASSERT(L->strt.nuse==0, "non-empty string table"); - L->nblocks -= (L->strt.size + L->udt.size)*sizeof(TString *); - luaM_free(L, L->strt.hash); - LUA_ASSERT(L->udt.nuse==0, "non-empty udata table"); - luaM_free(L, L->udt.hash); -} - - -static unsigned long hash_s (const char *s, size_t l) { - unsigned long h = l; /* seed */ - size_t step = (l>>5)|1; /* if string is too long, don't hash all its chars */ - for (; l>=step; l-=step) - h = h ^ ((h<<5)+(h>>2)+(unsigned char)*(s++)); - return h; -} - - -void luaS_resize (lua_State *L, stringtable *tb, int newsize) { - TString **newhash = luaM_newvector(L, newsize, TString *); - int i; - for (i=0; i<newsize; i++) newhash[i] = NULL; - /* rehash */ - for (i=0; i<tb->size; i++) { - TString *p = tb->hash[i]; - while (p) { /* for each node in the list */ - TString *next = p->nexthash; /* save next */ - unsigned long h = (tb == &L->strt) ? p->u.s.hash : IntPoint(p->u.d.value); - int h1 = h&(newsize-1); /* new position */ - LUA_ASSERT(h%newsize == (h&(newsize-1)), - "a&(x-1) == a%x, for x power of 2"); - p->nexthash = newhash[h1]; /* chain it in new position */ - newhash[h1] = p; - p = next; - } - } - luaM_free(L, tb->hash); - L->nblocks += (newsize - tb->size)*sizeof(TString *); - tb->size = newsize; - tb->hash = newhash; -} - - -static void newentry (lua_State *L, stringtable *tb, TString *ts, int h) { - ts->nexthash = tb->hash[h]; /* chain new entry */ - tb->hash[h] = ts; - tb->nuse++; - if (tb->nuse > (lint32)tb->size && tb->size < MAX_INT/2) /* too crowded? */ - luaS_resize(L, tb, tb->size*2); -} - - - -TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { - unsigned long h = hash_s(str, l); - int h1 = h & (L->strt.size-1); - TString *ts; - for (ts = L->strt.hash[h1]; ts; ts = ts->nexthash) { - if (ts->len == l && (memcmp(str, ts->str, l) == 0)) - return ts; - } - /* not found */ - ts = (TString *)luaM_malloc(L, sizestring(l)); - ts->marked = 0; - ts->nexthash = NULL; - ts->len = l; - ts->u.s.hash = h; - ts->u.s.constindex = 0; - memcpy(ts->str, str, l); - ts->str[l] = 0; /* ending 0 */ - L->nblocks += sizestring(l); - newentry(L, &L->strt, ts, h1); /* insert it on table */ - return ts; -} - - -TString *luaS_newudata (lua_State *L, size_t s, void *udata) { - union L_UTString *uts = (union L_UTString *)luaM_malloc(L, - (lint32)sizeof(union L_UTString)+s); - TString *ts = &uts->ts; - ts->marked = 0; - ts->nexthash = NULL; - ts->len = s; - ts->u.d.tag = 0; - ts->u.d.value = (udata == NULL) ? uts+1 : udata; - L->nblocks += sizestring(s); - /* insert it on table */ - newentry(L, &L->udt, ts, IntPoint(ts->u.d.value) & (L->udt.size-1)); - return ts; -} - - -TString *luaS_createudata (lua_State *L, void *udata, int tag) { - int h1 = IntPoint(udata) & (L->udt.size-1); - TString *ts; - for (ts = L->udt.hash[h1]; ts; ts = ts->nexthash) { - if (udata == ts->u.d.value && (tag == ts->u.d.tag || tag == LUA_ANYTAG)) - return ts; - } - /* not found */ - ts = luaS_newudata(L, 0, udata); - if (tag != LUA_ANYTAG) - ts->u.d.tag = tag; - return ts; -} - - -TString *luaS_new (lua_State *L, const char *str) { - return luaS_newlstr(L, str, strlen(str)); -} - - -TString *luaS_newfixed (lua_State *L, const char *str) { - TString *ts = luaS_new(L, str); - if (ts->marked == 0) ts->marked = FIXMARK; /* avoid GC */ - return ts; -} - diff --git a/src/lua/lstring.h b/src/lua/lstring.h deleted file mode 100644 index f23159ec..00000000 --- a/src/lua/lstring.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -** $Id: lstring.h,v 1.3 2001/11/26 23:00:26 darkgod Exp $ -** String table (keep all strings handled by Lua) -** See Copyright Notice in lua.h -*/ - -#ifndef lstring_h -#define lstring_h - - -#include "lobject.h" -#include "lstate.h" - - -/* -** any TString with mark>=FIXMARK is never collected. -** Marks>=RESERVEDMARK are used to identify reserved words. -*/ -#define FIXMARK 2 -#define RESERVEDMARK 3 - - -#define sizestring(l) ((long)sizeof(TString) + \ - ((long)(l+1)-TSPACK)*(long)sizeof(char)) - - -void luaS_init (lua_State *L); -void luaS_resize (lua_State *L, stringtable *tb, int newsize); -TString *luaS_newudata (lua_State *L, size_t s, void *udata); -TString *luaS_createudata (lua_State *L, void *udata, int tag); -void luaS_freeall (lua_State *L); -TString *luaS_newlstr (lua_State *L, const char *str, size_t l); -TString *luaS_new (lua_State *L, const char *str); -TString *luaS_newfixed (lua_State *L, const char *str); - - -#endif diff --git a/src/lua/lstrlib.c b/src/lua/lstrlib.c deleted file mode 100644 index 051eccf7..00000000 --- a/src/lua/lstrlib.c +++ /dev/null @@ -1,621 +0,0 @@ -/* -** $Id: lstrlib.c,v 1.3 2001/11/26 23:00:26 darkgod Exp $ -** Standard library for string operations and pattern-matching -** See Copyright Notice in lua.h -*/ - - -#include <ctype.h> -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - - -static int str_len (lua_State *L) { - size_t l; - luaL_check_lstr(L, 1, &l); - lua_pushnumber(L, l); - return 1; -} - - -static long posrelat (long pos, size_t len) { - /* relative string position: negative means back from end */ - return (pos>=0) ? pos : (long)len+pos+1; -} - - -static int str_sub (lua_State *L) { - size_t l; - const char *s = luaL_check_lstr(L, 1, &l); - long start = posrelat(luaL_check_long(L, 2), l); - long end = posrelat(luaL_opt_long(L, 3, -1), l); - if (start < 1) start = 1; - if (end > (long)l) end = l; - if (start <= end) - lua_pushlstring(L, s+start-1, end-start+1); - else lua_pushstring(L, ""); - return 1; -} - - -static int str_lower (lua_State *L) { - size_t l; - size_t i; - luaL_Buffer b; - const char *s = luaL_check_lstr(L, 1, &l); - luaL_buffinit(L, &b); - for (i=0; i<l; i++) - luaL_putchar(&b, tolower((unsigned char)(s[i]))); - luaL_pushresult(&b); - return 1; -} - - -static int str_upper (lua_State *L) { - size_t l; - size_t i; - luaL_Buffer b; - const char *s = luaL_check_lstr(L, 1, &l); - luaL_buffinit(L, &b); - for (i=0; i<l; i++) - luaL_putchar(&b, toupper((unsigned char)(s[i]))); - luaL_pushresult(&b); - return 1; -} - -static int str_rep (lua_State *L) { - size_t l; - luaL_Buffer b; - const char *s = luaL_check_lstr(L, 1, &l); - int n = luaL_check_int(L, 2); - luaL_buffinit(L, &b); - while (n-- > 0) - luaL_addlstring(&b, s, l); - luaL_pushresult(&b); - return 1; -} - - -static int str_byte (lua_State *L) { - size_t l; - const char *s = luaL_check_lstr(L, 1, &l); - long pos = posrelat(luaL_opt_long(L, 2, 1), l); - luaL_arg_check(L, 0<pos && (size_t)pos<=l, 2, "out of range"); - lua_pushnumber(L, (unsigned char)s[pos-1]); - return 1; -} - - -static int str_char (lua_State *L) { - int n = lua_gettop(L); /* number of arguments */ - int i; - luaL_Buffer b; - luaL_buffinit(L, &b); - for (i=1; i<=n; i++) { - int c = luaL_check_int(L, i); - luaL_arg_check(L, (unsigned char)c == c, i, "invalid value"); - luaL_putchar(&b, (unsigned char)c); - } - luaL_pushresult(&b); - return 1; -} - - - -/* -** {====================================================== -** PATTERN MATCHING -** ======================================================= -*/ - -#ifndef MAX_CAPTURES -#define MAX_CAPTURES 32 /* arbitrary limit */ -#endif - - -struct Capture { - const char *src_end; /* end ('\0') of source string */ - int level; /* total number of captures (finished or unfinished) */ - struct { - const char *init; - long len; /* -1 signals unfinished capture */ - } capture[MAX_CAPTURES]; -}; - - -#define ESC '%' -#define SPECIALS "^$*+?.([%-" - - -static int check_capture (lua_State *L, int l, struct Capture *cap) { - l -= '1'; - if (!(0 <= l && l < cap->level && cap->capture[l].len != -1)) - lua_error(L, "invalid capture index"); - return l; -} - - -static int capture_to_close (lua_State *L, struct Capture *cap) { - int level = cap->level; - for (level--; level>=0; level--) - if (cap->capture[level].len == -1) return level; - lua_error(L, "invalid pattern capture"); - return 0; /* to avoid warnings */ -} - - -const char *luaI_classend (lua_State *L, const char *p) { - switch (*p++) { - case ESC: - if (*p == '\0') lua_error(L, "malformed pattern (ends with `%')"); - return p+1; - case '[': - if (*p == '^') p++; - do { /* look for a ']' */ - if (*p == '\0') lua_error(L, "malformed pattern (missing `]')"); - if (*(p++) == ESC && *p != '\0') p++; /* skip escapes (e.g. '%]') */ - } while (*p != ']'); - return p+1; - default: - return p; - } -} - - -static int match_class (int c, int cl) { - int res; - switch (tolower(cl)) { - case 'a' : res = isalpha(c); break; - case 'c' : res = iscntrl(c); break; - case 'd' : res = isdigit(c); break; - case 'l' : res = islower(c); break; - case 'p' : res = ispunct(c); break; - case 's' : res = isspace(c); break; - case 'u' : res = isupper(c); break; - case 'w' : res = isalnum(c); break; - case 'x' : res = isxdigit(c); break; - case 'z' : res = (c == '\0'); break; - default: return (cl == c); - } - return (islower(cl) ? res : !res); -} - - - -static int matchbracketclass (int c, const char *p, const char *endclass) { - int sig = 1; - if (*(p+1) == '^') { - sig = 0; - p++; /* skip the '^' */ - } - while (++p < endclass) { - if (*p == ESC) { - p++; - if (match_class(c, (unsigned char)*p)) - return sig; - } - else if ((*(p+1) == '-') && (p+2 < endclass)) { - p+=2; - if ((int)(unsigned char)*(p-2) <= c && c <= (int)(unsigned char)*p) - return sig; - } - else if ((int)(unsigned char)*p == c) return sig; - } - return !sig; -} - - - -int luaI_singlematch (int c, const char *p, const char *ep) { - switch (*p) { - case '.': /* matches any char */ - return 1; - case ESC: - return match_class(c, (unsigned char)*(p+1)); - case '[': - return matchbracketclass(c, p, ep-1); - default: - return ((unsigned char)*p == c); - } -} - - -static const char *match (lua_State *L, const char *s, const char *p, - struct Capture *cap); - - -static const char *matchbalance (lua_State *L, const char *s, const char *p, - struct Capture *cap) { - if (*p == 0 || *(p+1) == 0) - lua_error(L, "unbalanced pattern"); - if (*s != *p) return NULL; - else { - int b = *p; - int e = *(p+1); - int cont = 1; - while (++s < cap->src_end) { - if (*s == e) { - if (--cont == 0) return s+1; - } - else if (*s == b) cont++; - } - } - return NULL; /* string ends out of balance */ -} - - -static const char *max_expand (lua_State *L, const char *s, const char *p, - const char *ep, struct Capture *cap) { - long i = 0; /* counts maximum expand for item */ - while ((s+i)<cap->src_end && luaI_singlematch((unsigned char)*(s+i), p, ep)) - i++; - /* keeps trying to match with the maximum repetitions */ - while (i>=0) { - const char *res = match(L, (s+i), ep+1, cap); - if (res) return res; - i--; /* else didn't match; reduce 1 repetition to try again */ - } - return NULL; -} - - -static const char *min_expand (lua_State *L, const char *s, const char *p, - const char *ep, struct Capture *cap) { - for (;;) { - const char *res = match(L, s, ep+1, cap); - if (res != NULL) - return res; - else if (s<cap->src_end && luaI_singlematch((unsigned char)*s, p, ep)) - s++; /* try with one more repetition */ - else return NULL; - } -} - - -static const char *start_capture (lua_State *L, const char *s, const char *p, - struct Capture *cap) { - const char *res; - int level = cap->level; - if (level >= MAX_CAPTURES) lua_error(L, "too many captures"); - cap->capture[level].init = s; - cap->capture[level].len = -1; - cap->level = level+1; - if ((res=match(L, s, p+1, cap)) == NULL) /* match failed? */ - cap->level--; /* undo capture */ - return res; -} - - -static const char *end_capture (lua_State *L, const char *s, const char *p, - struct Capture *cap) { - int l = capture_to_close(L, cap); - const char *res; - cap->capture[l].len = s - cap->capture[l].init; /* close capture */ - if ((res = match(L, s, p+1, cap)) == NULL) /* match failed? */ - cap->capture[l].len = -1; /* undo capture */ - return res; -} - - -static const char *match_capture (lua_State *L, const char *s, int level, - struct Capture *cap) { - int l = check_capture(L, level, cap); - size_t len = cap->capture[l].len; - if ((size_t)(cap->src_end-s) >= len && - memcmp(cap->capture[l].init, s, len) == 0) - return s+len; - else return NULL; -} - - -static const char *match (lua_State *L, const char *s, const char *p, - struct Capture *cap) { - init: /* using goto's to optimize tail recursion */ - switch (*p) { - case '(': /* start capture */ - return start_capture(L, s, p, cap); - case ')': /* end capture */ - return end_capture(L, s, p, cap); - case ESC: /* may be %[0-9] or %b */ - if (isdigit((unsigned char)(*(p+1)))) { /* capture? */ - s = match_capture(L, s, *(p+1), cap); - if (s == NULL) return NULL; - p+=2; goto init; /* else return match(L, s, p+2, cap) */ - } - else if (*(p+1) == 'b') { /* balanced string? */ - s = matchbalance(L, s, p+2, cap); - if (s == NULL) return NULL; - p+=4; goto init; /* else return match(L, s, p+4, cap); */ - } - else goto dflt; /* case default */ - case '\0': /* end of pattern */ - return s; /* match succeeded */ - case '$': - if (*(p+1) == '\0') /* is the '$' the last char in pattern? */ - return (s == cap->src_end) ? s : NULL; /* check end of string */ - else goto dflt; - default: dflt: { /* it is a pattern item */ - const char *ep = luaI_classend(L, p); /* points to what is next */ - int m = s<cap->src_end && luaI_singlematch((unsigned char)*s, p, ep); - switch (*ep) { - case '?': { /* optional */ - const char *res; - if (m && ((res=match(L, s+1, ep+1, cap)) != NULL)) - return res; - p=ep+1; goto init; /* else return match(L, s, ep+1, cap); */ - } - case '*': /* 0 or more repetitions */ - return max_expand(L, s, p, ep, cap); - case '+': /* 1 or more repetitions */ - return (m ? max_expand(L, s+1, p, ep, cap) : NULL); - case '-': /* 0 or more repetitions (minimum) */ - return min_expand(L, s, p, ep, cap); - default: - if (!m) return NULL; - s++; p=ep; goto init; /* else return match(L, s+1, ep, cap); */ - } - } - } -} - - - -static const char *lmemfind (const char *s1, size_t l1, - const char *s2, size_t l2) { - if (l2 == 0) return s1; /* empty strings are everywhere */ - else if (l2 > l1) return NULL; /* avoids a negative `l1' */ - else { - const char *init; /* to search for a `*s2' inside `s1' */ - l2--; /* 1st char will be checked by `memchr' */ - l1 = l1-l2; /* `s2' cannot be found after that */ - while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) { - init++; /* 1st char is already checked */ - if (memcmp(init, s2+1, l2) == 0) - return init-1; - else { /* correct `l1' and `s1' to try again */ - l1 -= init-s1; - s1 = init; - } - } - return NULL; /* not found */ - } -} - - -static int push_captures (lua_State *L, struct Capture *cap) { - int i; - luaL_checkstack(L, cap->level, "too many captures"); - for (i=0; i<cap->level; i++) { - int l = cap->capture[i].len; - if (l == -1) lua_error(L, "unfinished capture"); - lua_pushlstring(L, cap->capture[i].init, l); - } - return cap->level; /* number of strings pushed */ -} - - -static int str_find (lua_State *L) { - size_t l1, l2; - const char *s = luaL_check_lstr(L, 1, &l1); - const char *p = luaL_check_lstr(L, 2, &l2); - long init = posrelat(luaL_opt_long(L, 3, 1), l1) - 1; - struct Capture cap; - luaL_arg_check(L, 0 <= init && (size_t)init <= l1, 3, "out of range"); - if (lua_gettop(L) > 3 || /* extra argument? */ - strpbrk(p, SPECIALS) == NULL) { /* or no special characters? */ - const char *s2 = lmemfind(s+init, l1-init, p, l2); - if (s2) { - lua_pushnumber(L, s2-s+1); - lua_pushnumber(L, s2-s+l2); - return 2; - } - } - else { - int anchor = (*p == '^') ? (p++, 1) : 0; - const char *s1=s+init; - cap.src_end = s+l1; - do { - const char *res; - cap.level = 0; - if ((res=match(L, s1, p, &cap)) != NULL) { - lua_pushnumber(L, s1-s+1); /* start */ - lua_pushnumber(L, res-s); /* end */ - return push_captures(L, &cap) + 2; - } - } while (s1++<cap.src_end && !anchor); - } - lua_pushnil(L); /* not found */ - return 1; -} - - -static void add_s (lua_State *L, luaL_Buffer *b, struct Capture *cap) { - if (lua_isstring(L, 3)) { - const char *news = lua_tostring(L, 3); - size_t l = lua_strlen(L, 3); - size_t i; - for (i=0; i<l; i++) { - if (news[i] != ESC) - luaL_putchar(b, news[i]); - else { - i++; /* skip ESC */ - if (!isdigit((unsigned char)news[i])) - luaL_putchar(b, news[i]); - else { - int level = check_capture(L, news[i], cap); - luaL_addlstring(b, cap->capture[level].init, cap->capture[level].len); - } - } - } - } - else { /* is a function */ - int n; - lua_pushvalue(L, 3); - n = push_captures(L, cap); - lua_rawcall(L, n, 1); - if (lua_isstring(L, -1)) - luaL_addvalue(b); /* add return to accumulated result */ - else - lua_pop(L, 1); /* function result is not a string: pop it */ - } -} - - -static int str_gsub (lua_State *L) { - size_t srcl; - const char *src = luaL_check_lstr(L, 1, &srcl); - const char *p = luaL_check_string(L, 2); - int max_s = luaL_opt_int(L, 4, srcl+1); - int anchor = (*p == '^') ? (p++, 1) : 0; - int n = 0; - struct Capture cap; - luaL_Buffer b; - luaL_arg_check(L, - lua_gettop(L) >= 3 && (lua_isstring(L, 3) || lua_isfunction(L, 3)), - 3, "string or function expected"); - luaL_buffinit(L, &b); - cap.src_end = src+srcl; - while (n < max_s) { - const char *e; - cap.level = 0; - e = match(L, src, p, &cap); - if (e) { - n++; - add_s(L, &b, &cap); - } - if (e && e>src) /* non empty match? */ - src = e; /* skip it */ - else if (src < cap.src_end) - luaL_putchar(&b, *src++); - else break; - if (anchor) break; - } - luaL_addlstring(&b, src, cap.src_end-src); - luaL_pushresult(&b); - lua_pushnumber(L, n); /* number of substitutions */ - return 2; -} - -/* }====================================================== */ - - -static void luaI_addquoted (lua_State *L, luaL_Buffer *b, int arg) { - size_t l; - const char *s = luaL_check_lstr(L, arg, &l); - luaL_putchar(b, '"'); - while (l--) { - switch (*s) { - case '"': case '\\': case '\n': - luaL_putchar(b, '\\'); - luaL_putchar(b, *s); - break; - case '\0': luaL_addlstring(b, "\\000", 4); break; - default: luaL_putchar(b, *s); - } - s++; - } - luaL_putchar(b, '"'); -} - -/* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */ -#define MAX_ITEM 512 -/* maximum size of each format specification (such as '%-099.99d') */ -#define MAX_FORMAT 20 - -static int str_format (lua_State *L) { - int arg = 1; - const char *strfrmt = luaL_check_string(L, arg); - luaL_Buffer b; - luaL_buffinit(L, &b); - while (*strfrmt) { - if (*strfrmt != '%') - luaL_putchar(&b, *strfrmt++); - else if (*++strfrmt == '%') - luaL_putchar(&b, *strfrmt++); /* %% */ - else { /* format item */ - struct Capture cap; - char form[MAX_FORMAT]; /* to store the format ('%...') */ - char buff[MAX_ITEM]; /* to store the formatted item */ - const char *initf = strfrmt; - form[0] = '%'; - if (isdigit((unsigned char)*initf) && *(initf+1) == '$') { - arg = *initf - '0'; - initf += 2; /* skip the 'n$' */ - } - arg++; - cap.src_end = strfrmt+strlen(strfrmt)+1; - cap.level = 0; - strfrmt = match(L, initf, "[-+ #0]*(%d*)%.?(%d*)", &cap); - if (cap.capture[0].len > 2 || cap.capture[1].len > 2 || /* < 100? */ - strfrmt-initf > MAX_FORMAT-2) - lua_error(L, "invalid format (width or precision too long)"); - strncpy(form+1, initf, strfrmt-initf+1); /* +1 to include conversion */ - form[strfrmt-initf+2] = 0; - switch (*strfrmt++) { - case 'c': case 'd': case 'i': - sprintf(buff, form, luaL_check_int(L, arg)); - break; - case 'o': case 'u': case 'x': case 'X': - sprintf(buff, form, (unsigned int)luaL_check_number(L, arg)); - break; - case 'e': case 'E': case 'f': case 'g': case 'G': - sprintf(buff, form, luaL_check_number(L, arg)); - break; - case 'q': - luaI_addquoted(L, &b, arg); - continue; /* skip the "addsize" at the end */ - case 's': { - size_t l; - const char *s = luaL_check_lstr(L, arg, &l); - if (cap.capture[1].len == 0 && l >= 100) { - /* no precision and string is too long to be formatted; - keep original string */ - lua_pushvalue(L, arg); - luaL_addvalue(&b); - continue; /* skip the "addsize" at the end */ - } - else { - sprintf(buff, form, s); - break; - } - } - default: /* also treat cases 'pnLlh' */ - lua_error(L, "invalid option in `format'"); - } - luaL_addlstring(&b, buff, strlen(buff)); - } - } - luaL_pushresult(&b); - return 1; -} - - -static const struct luaL_reg strlib[] = { -{"strlen", str_len}, -{"strsub", str_sub}, -{"strlower", str_lower}, -{"strupper", str_upper}, -{"strchar", str_char}, -{"strrep", str_rep}, -{"ascii", str_byte}, /* for compatibility with 3.0 and earlier */ -{"strbyte", str_byte}, -{"format", str_format}, -{"strfind", str_find}, -{"gsub", str_gsub} -}; - - -/* -** Open string library -*/ -LUALIB_API void lua_strlibopen (lua_State *L) { - luaL_openl(L, strlib); -} diff --git a/src/lua/ltable.c b/src/lua/ltable.c deleted file mode 100644 index 1e3eb4f5..00000000 --- a/src/lua/ltable.c +++ /dev/null @@ -1,303 +0,0 @@ -/* -** $Id: ltable.c,v 1.3 2001/11/26 23:00:26 darkgod Exp $ -** Lua tables (hash) -** See Copyright Notice in lua.h -*/ - - -/* -** Implementation of tables (aka arrays, objects, or hash tables); -** uses a mix of chained scatter table with Brent's variation. -** A main invariant of these tables is that, if an element is not -** in its main position (i.e. the `original' position that its hash gives -** to it), then the colliding element is in its own main position. -** In other words, there are collisions only when two elements have the -** same main position (i.e. the same hash values for that table size). -** Because of that, the load factor of these tables can be 100% without -** performance penalties. -*/ - - -#include "lua.h" - -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" - - -#define gcsize(L, n) (sizeof(Hash)+(n)*sizeof(Node)) - - - -#define TagDefault LUA_TTABLE - - - -/* -** returns the `main' position of an element in a table (that is, the index -** of its hash value) -*/ -Node *luaH_mainposition (const Hash *t, const TObject *key) { - unsigned long h; - switch (ttype(key)) { - case LUA_TNUMBER: - h = (unsigned long)(long)nvalue(key); - break; - case LUA_TSTRING: - h = tsvalue(key)->u.s.hash; - break; - case LUA_TUSERDATA: - h = IntPoint(tsvalue(key)); - break; - case LUA_TTABLE: - h = IntPoint(hvalue(key)); - break; - case LUA_TFUNCTION: - h = IntPoint(clvalue(key)); - break; - default: - return NULL; /* invalid key */ - } - LUA_ASSERT(h%(unsigned int)t->size == (h&((unsigned int)t->size-1)), - "a&(x-1) == a%x, for x power of 2"); - return &t->node[h&(t->size-1)]; -} - - -static const TObject *luaH_getany (lua_State *L, const Hash *t, - const TObject *key) { - Node *n = luaH_mainposition(t, key); - if (!n) - lua_error(L, "table index is nil"); - else do { - if (luaO_equalObj(key, &n->key)) - return &n->val; - n = n->next; - } while (n); - return &luaO_nilobject; /* key not found */ -} - - -/* specialized version for numbers */ -const TObject *luaH_getnum (const Hash *t, Number key) { - Node *n = &t->node[(unsigned long)(long)key&(t->size-1)]; - do { - if (ttype(&n->key) == LUA_TNUMBER && nvalue(&n->key) == key) - return &n->val; - n = n->next; - } while (n); - return &luaO_nilobject; /* key not found */ -} - - -/* specialized version for strings */ -const TObject *luaH_getstr (const Hash *t, TString *key) { - Node *n = &t->node[key->u.s.hash&(t->size-1)]; - do { - if (ttype(&n->key) == LUA_TSTRING && tsvalue(&n->key) == key) - return &n->val; - n = n->next; - } while (n); - return &luaO_nilobject; /* key not found */ -} - - -const TObject *luaH_get (lua_State *L, const Hash *t, const TObject *key) { - switch (ttype(key)) { - case LUA_TNUMBER: return luaH_getnum(t, nvalue(key)); - case LUA_TSTRING: return luaH_getstr(t, tsvalue(key)); - default: return luaH_getany(L, t, key); - } -} - - -Node *luaH_next (lua_State *L, const Hash *t, const TObject *key) { - int i; - if (ttype(key) == LUA_TNIL) - i = 0; /* first iteration */ - else { - const TObject *v = luaH_get(L, t, key); - if (v == &luaO_nilobject) - lua_error(L, "invalid key for `next'"); - i = (int)(((const char *)v - - (const char *)(&t->node[0].val)) / sizeof(Node)) + 1; - } - for (; i<t->size; i++) { - Node *n = node(t, i); - if (ttype(val(n)) != LUA_TNIL) - return n; - } - return NULL; /* no more elements */ -} - - -/* -** try to remove a key without value from a table. To avoid problems with -** hash, change `key' for a number with the same hash. -*/ -void luaH_remove (Hash *t, TObject *key) { - if (ttype(key) == LUA_TNUMBER || - (ttype(key) == LUA_TSTRING && tsvalue(key)->len <= 30)) - return; /* do not remove numbers nor small strings */ - else { - /* try to find a number `n' with the same hash as `key' */ - Node *mp = luaH_mainposition(t, key); - int n = mp - &t->node[0]; - /* make sure `n' is not in `t' */ - while (luaH_getnum(t, n) != &luaO_nilobject) { - if (n >= MAX_INT - t->size) - return; /* give up; (to avoid overflow) */ - n += t->size; - } - ttype(key) = LUA_TNUMBER; - nvalue(key) = n; - LUA_ASSERT(luaH_mainposition(t, key) == mp, "cannot change hash"); - } -} - - -static void setnodevector (lua_State *L, Hash *t, lint32 size) { - int i; - if (size > MAX_INT) - lua_error(L, "table overflow"); - t->node = luaM_newvector(L, size, Node); - for (i=0; i<(int)size; i++) { - ttype(&t->node[i].key) = ttype(&t->node[i].val) = LUA_TNIL; - t->node[i].next = NULL; - } - L->nblocks += gcsize(L, size) - gcsize(L, t->size); - t->size = size; - t->firstfree = &t->node[size-1]; /* first free position to be used */ -} - - -Hash *luaH_new (lua_State *L, int size) { - Hash *t = luaM_new(L, Hash); - t->htag = TagDefault; - t->next = L->roottable; - L->roottable = t; - t->mark = t; - t->size = 0; - L->nblocks += gcsize(L, 0); - t->node = NULL; - setnodevector(L, t, luaO_power2(size)); - return t; -} - - -void luaH_free (lua_State *L, Hash *t) { - L->nblocks -= gcsize(L, t->size); - luaM_free(L, t->node); - luaM_free(L, t); -} - - -static int numuse (const Hash *t) { - Node *v = t->node; - int size = t->size; - int realuse = 0; - int i; - for (i=0; i<size; i++) { - if (ttype(&v[i].val) != LUA_TNIL) - realuse++; - } - return realuse; -} - - -static void rehash (lua_State *L, Hash *t) { - int oldsize = t->size; - Node *nold = t->node; - int nelems = numuse(t); - int i; - LUA_ASSERT(nelems<=oldsize, "wrong count"); - if (nelems >= oldsize-oldsize/4) /* using more than 3/4? */ - setnodevector(L, t, (lint32)oldsize*2); - else if (nelems <= oldsize/4 && /* less than 1/4? */ - oldsize > MINPOWER2) - setnodevector(L, t, oldsize/2); - else - setnodevector(L, t, oldsize); - for (i=0; i<oldsize; i++) { - Node *old = nold+i; - if (ttype(&old->val) != LUA_TNIL) - *luaH_set(L, t, &old->key) = old->val; - } - luaM_free(L, nold); /* free old array */ -} - - -/* -** inserts a key into a hash table; first, check whether key is -** already present; if not, check whether key's main position is free; -** if not, check whether colliding node is in its main position or not; -** if it is not, move colliding node to an empty place and put new key -** in its main position; otherwise (colliding node is in its main position), -** new key goes to an empty position. -*/ -TObject *luaH_set (lua_State *L, Hash *t, const TObject *key) { - Node *mp = luaH_mainposition(t, key); - Node *n = mp; - if (!mp) - lua_error(L, "table index is nil"); - do { /* check whether `key' is somewhere in the chain */ - if (luaO_equalObj(key, &n->key)) - return &n->val; /* that's all */ - else n = n->next; - } while (n); - /* `key' not found; must insert it */ - if (ttype(&mp->key) != LUA_TNIL) { /* main position is not free? */ - Node *othern; /* main position of colliding node */ - n = t->firstfree; /* get a free place */ - /* is colliding node out of its main position? (can only happens if - its position is after "firstfree") */ - if (mp > n && (othern=luaH_mainposition(t, &mp->key)) != mp) { - /* yes; move colliding node into free position */ - while (othern->next != mp) othern = othern->next; /* find previous */ - othern->next = n; /* redo the chain with `n' in place of `mp' */ - *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */ - mp->next = NULL; /* now `mp' is free */ - } - else { /* colliding node is in its own main position */ - /* new node will go into free position */ - n->next = mp->next; /* chain new position */ - mp->next = n; - mp = n; - } - } - mp->key = *key; - for (;;) { /* correct `firstfree' */ - if (ttype(&t->firstfree->key) == LUA_TNIL) - return &mp->val; /* OK; table still has a free place */ - else if (t->firstfree == t->node) break; /* cannot decrement from here */ - else (t->firstfree)--; - } - rehash(L, t); /* no more free places */ - return luaH_set(L, t, key); /* `rehash' invalidates this insertion */ -} - - -TObject *luaH_setint (lua_State *L, Hash *t, int key) { - TObject index; - ttype(&index) = LUA_TNUMBER; - nvalue(&index) = key; - return luaH_set(L, t, &index); -} - - -void luaH_setstrnum (lua_State *L, Hash *t, TString *key, Number val) { - TObject *value, index; - ttype(&index) = LUA_TSTRING; - tsvalue(&index) = key; - value = luaH_set(L, t, &index); - ttype(value) = LUA_TNUMBER; - nvalue(value) = val; -} - - -const TObject *luaH_getglobal (lua_State *L, const char *name) { - return luaH_getstr(L->gt, luaS_new(L, name)); -} - diff --git a/src/lua/ltable.h b/src/lua/ltable.h deleted file mode 100644 index 3bc2a5df..00000000 --- a/src/lua/ltable.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -** $Id: ltable.h,v 1.3 2001/11/26 23:00:26 darkgod Exp $ -** Lua tables (hash) -** See Copyright Notice in lua.h -*/ - -#ifndef ltable_h -#define ltable_h - -#include "lobject.h" - - -#define node(t,i) (&(t)->node[i]) -#define key(n) (&(n)->key) -#define val(n) (&(n)->val) - -Hash *luaH_new (lua_State *L, int nhash); -void luaH_free (lua_State *L, Hash *t); -const TObject *luaH_get (lua_State *L, const Hash *t, const TObject *key); -const TObject *luaH_getnum (const Hash *t, Number key); -const TObject *luaH_getstr (const Hash *t, TString *key); -void luaH_remove (Hash *t, TObject *key); -TObject *luaH_set (lua_State *L, Hash *t, const TObject *key); -Node * luaH_next (lua_State *L, const Hash *t, const TObject *r); -TObject *luaH_setint (lua_State *L, Hash *t, int key); -void luaH_setstrnum (lua_State *L, Hash *t, TString *key, Number val); -unsigned long luaH_hash (lua_State *L, const TObject *key); -const TObject *luaH_getglobal (lua_State *L, const char *name); - -/* exported only for debugging */ -Node *luaH_mainposition (const Hash *t, const TObject *key); - - -#endif diff --git a/src/lua/ltests.c b/src/lua/ltests.c deleted file mode 100644 index 06e08f5a..00000000 --- a/src/lua/ltests.c +++ /dev/null @@ -1,543 +0,0 @@ -/* -** $Id: ltests.c,v 1.2 2001/11/26 23:00:26 darkgod Exp $ -** Internal Module for Debugging of the Lua Implementation -** See Copyright Notice in lua.h -*/ - - -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -#include "lua.h" - -#include "lapi.h" -#include "lauxlib.h" -#include "lcode.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lmem.h" -#include "lopcodes.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "luadebug.h" -#include "lualib.h" - - -void luaB_opentests (lua_State *L); - - -/* -** The whole module only makes sense with LUA_DEBUG on -*/ -#ifdef LUA_DEBUG - - - -static void setnameval (lua_State *L, const char *name, int val) { - lua_pushstring(L, name); - lua_pushnumber(L, val); - lua_settable(L, -3); -} - - -/* -** {====================================================== -** Disassembler -** ======================================================= -*/ - - -static const char *const instrname[NUM_OPCODES] = { - "END", "RETURN", "CALL", "TAILCALL", "PUSHNIL", "POP", "PUSHINT", - "PUSHSTRING", "PUSHNUM", "PUSHNEGNUM", "PUSHUPVALUE", "GETLOCAL", - "GETGLOBAL", "GETTABLE", "GETDOTTED", "GETINDEXED", "PUSHSELF", - "CREATETABLE", "SETLOCAL", "SETGLOBAL", "SETTABLE", "SETLIST", "SETMAP", - "ADD", "ADDI", "SUB", "MULT", "DIV", "POW", "CONCAT", "MINUS", "NOT", - "JMPNE", "JMPEQ", "JMPLT", "JMPLE", "JMPGT", "JMPGE", "JMPT", "JMPF", - "JMPONT", "JMPONF", "JMP", "PUSHNILJMP", "FORPREP", "FORLOOP", "LFORPREP", - "LFORLOOP", "CLOSURE" -}; - - -static int pushop (lua_State *L, Proto *p, int pc) { - char buff[100]; - Instruction i = p->code[pc]; - OpCode o = GET_OPCODE(i); - const char *name = instrname[o]; - sprintf(buff, "%5d - ", luaG_getline(p->lineinfo, pc, 1, NULL)); - switch ((enum Mode)luaK_opproperties[o].mode) { - case iO: - sprintf(buff+8, "%-12s", name); - break; - case iU: - sprintf(buff+8, "%-12s%4u", name, GETARG_U(i)); - break; - case iS: - sprintf(buff+8, "%-12s%4d", name, GETARG_S(i)); - break; - case iAB: - sprintf(buff+8, "%-12s%4d %4d", name, GETARG_A(i), GETARG_B(i)); - break; - } - lua_pushstring(L, buff); - return (o != OP_END); -} - - -static int listcode (lua_State *L) { - int pc; - Proto *p; - int res; - luaL_arg_check(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), - 1, "Lua function expected"); - p = clvalue(luaA_index(L, 1))->f.l; - lua_newtable(L); - setnameval(L, "maxstack", p->maxstacksize); - setnameval(L, "numparams", p->numparams); - pc = 0; - do { - lua_pushnumber(L, pc+1); - res = pushop(L, p, pc++); - lua_settable(L, -3); - } while (res); - return 1; -} - - -static int liststrings (lua_State *L) { - Proto *p; - int i; - luaL_arg_check(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), - 1, "Lua function expected"); - p = clvalue(luaA_index(L, 1))->f.l; - lua_newtable(L); - for (i=0; i<p->nkstr; i++) { - lua_pushnumber(L, i+1); - lua_pushstring(L, p->kstr[i]->str); - lua_settable(L, -3); - } - return 1; -} - - -static int listlocals (lua_State *L) { - Proto *p; - int pc = luaL_check_int(L, 2) - 1; - int i = 0; - const char *name; - luaL_arg_check(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), - 1, "Lua function expected"); - p = clvalue(luaA_index(L, 1))->f.l; - while ((name = luaF_getlocalname(p, ++i, pc)) != NULL) - lua_pushstring(L, name); - return i-1; -} - -/* }====================================================== */ - - - -static int get_limits (lua_State *L) { - lua_newtable(L); - setnameval(L, "BITS_INT", BITS_INT); - setnameval(L, "LFPF", LFIELDS_PER_FLUSH); - setnameval(L, "MAXARG_A", MAXARG_A); - setnameval(L, "MAXARG_B", MAXARG_B); - setnameval(L, "MAXARG_S", MAXARG_S); - setnameval(L, "MAXARG_U", MAXARG_U); - setnameval(L, "MAXLOCALS", MAXLOCALS); - setnameval(L, "MAXPARAMS", MAXPARAMS); - setnameval(L, "MAXSTACK", MAXSTACK); - setnameval(L, "MAXUPVALUES", MAXUPVALUES); - setnameval(L, "MAXVARSLH", MAXVARSLH); - setnameval(L, "RFPF", RFIELDS_PER_FLUSH); - setnameval(L, "SIZE_A", SIZE_A); - setnameval(L, "SIZE_B", SIZE_B); - setnameval(L, "SIZE_OP", SIZE_OP); - setnameval(L, "SIZE_U", SIZE_U); - return 1; -} - - -static int mem_query (lua_State *L) { - if (lua_isnull(L, 1)) { - lua_pushnumber(L, memdebug_total); - lua_pushnumber(L, memdebug_numblocks); - lua_pushnumber(L, memdebug_maxmem); - return 3; - } - else { - memdebug_memlimit = luaL_check_int(L, 1); - return 0; - } -} - - -static int hash_query (lua_State *L) { - if (lua_isnull(L, 2)) { - luaL_arg_check(L, lua_tag(L, 1) == LUA_TSTRING, 1, "string expected"); - lua_pushnumber(L, tsvalue(luaA_index(L, 1))->u.s.hash); - } - else { - Hash *t; - luaL_checktype(L, 2, LUA_TTABLE); - t = hvalue(luaA_index(L, 2)); - lua_pushnumber(L, luaH_mainposition(t, luaA_index(L, 1)) - t->node); - } - return 1; -} - - -static int table_query (lua_State *L) { - const Hash *t; - int i = luaL_opt_int(L, 2, -1); - luaL_checktype(L, 1, LUA_TTABLE); - t = hvalue(luaA_index(L, 1)); - if (i == -1) { - lua_pushnumber(L, t->size); - lua_pushnumber(L, t->firstfree - t->node); - return 2; - } - else if (i < t->size) { - luaA_pushobject(L, &t->node[i].key); - luaA_pushobject(L, &t->node[i].val); - if (t->node[i].next) { - lua_pushnumber(L, t->node[i].next - t->node); - return 3; - } - else - return 2; - } - return 0; -} - - -static int string_query (lua_State *L) { - stringtable *tb = (*luaL_check_string(L, 1) == 's') ? &L->strt : &L->udt; - int s = luaL_opt_int(L, 2, 0) - 1; - if (s==-1) { - lua_pushnumber(L ,tb->nuse); - lua_pushnumber(L ,tb->size); - return 2; - } - else if (s < tb->size) { - TString *ts; - int n = 0; - for (ts = tb->hash[s]; ts; ts = ts->nexthash) { - ttype(L->top) = LUA_TSTRING; - tsvalue(L->top) = ts; - incr_top; - n++; - } - return n; - } - return 0; -} - - -static int tref (lua_State *L) { - luaL_checkany(L, 1); - lua_pushvalue(L, 1); - lua_pushnumber(L, lua_ref(L, luaL_opt_int(L, 2, 1))); - return 1; -} - -static int getref (lua_State *L) { - if (lua_getref(L, luaL_check_int(L, 1))) - return 1; - else - return 0; -} - -static int unref (lua_State *L) { - lua_unref(L, luaL_check_int(L, 1)); - return 0; -} - -static int newuserdata (lua_State *L) { - if (lua_isnumber(L, 2)) - lua_pushusertag(L, (void *)luaL_check_int(L, 1), luaL_check_int(L, 2)); - else - lua_newuserdata(L, luaL_check_int(L, 1)); - return 1; -} - -static int udataval (lua_State *L) { - luaL_checktype(L, 1, LUA_TUSERDATA); - lua_pushnumber(L, (int)lua_touserdata(L, 1)); - return 1; -} - -static int newstate (lua_State *L) { - lua_State *L1 = lua_open(luaL_check_int(L, 1)); - if (L1) - lua_pushuserdata(L, L1); - else - lua_pushnil(L); - return 1; -} - -static int loadlib (lua_State *L) { - lua_State *L1 = (lua_State *)lua_touserdata(L, 1); - switch (*luaL_check_string(L, 2)) { - case 'm': lua_mathlibopen(L1); break; - case 's': lua_strlibopen(L1); break; - case 'i': lua_iolibopen(L1); break; - case 'd': lua_dblibopen(L1); break; - case 'b': lua_baselibopen(L1); break; - default: luaL_argerror(L, 2, "invalid option"); - } - return 0; -} - -static int closestate (lua_State *L) { - luaL_checktype(L, 1, LUA_TUSERDATA); - lua_close((lua_State *)lua_touserdata(L, 1)); - return 0; -} - -static int doremote (lua_State *L) { - lua_State *L1; - const char *code = luaL_check_string(L, 2); - int status; - luaL_checktype(L, 1, LUA_TUSERDATA); - L1 = (lua_State *)lua_touserdata(L, 1); - status = lua_dostring(L1, code); - if (status != 0) { - lua_pushnil(L); - lua_pushnumber(L, status); - return 2; - } - else { - int i = 0; - while (!lua_isnull(L1, ++i)) - lua_pushstring(L, lua_tostring(L1, i)); - return i-1; - } -} - -static int settagmethod (lua_State *L) { - int tag = luaL_check_int(L, 1); - const char *event = luaL_check_string(L, 2); - luaL_checkany(L, 3); - lua_gettagmethod(L, tag, event); - lua_pushvalue(L, 3); - lua_settagmethod(L, tag, event); - return 1; -} - -static int pushbool (lua_State *L, int b) { - if (b) lua_pushnumber(L, 1); - else lua_pushnil(L); - return 1; -} - -static int equal (lua_State *L) { - return pushbool(L, lua_equal(L, 1, 2)); -} - - - -/* -** {====================================================== -** function to test the API with C. It interprets a kind of "assembler" -** language with calls to the API, so the test can be driven by Lua code -** ======================================================= -*/ - -static const char *const delimits = " \t\n,;"; - -static void skip (const char **pc) { - while (**pc != '\0' && strchr(delimits, **pc)) (*pc)++; -} - -static int getnum (lua_State *L, const char **pc) { - int res = 0; - int sig = 1; - skip(pc); - if (**pc == '.') { - res = (int)lua_tonumber(L, -1); - lua_pop(L, 1); - (*pc)++; - return res; - } - else if (**pc == '-') { - sig = -1; - (*pc)++; - } - while (isdigit(**pc)) res = res*10 + (*(*pc)++) - '0'; - return sig*res; -} - -static const char *getname (char *buff, const char **pc) { - int i = 0; - skip(pc); - while (**pc != '\0' && !strchr(delimits, **pc)) - buff[i++] = *(*pc)++; - buff[i] = '\0'; - return buff; -} - - -#define EQ(s1) (strcmp(s1, inst) == 0) - -#define getnum ((getnum)(L, &pc)) -#define getname ((getname)(buff, &pc)) - - -static int testC (lua_State *L) { - char buff[30]; - const char *pc = luaL_check_string(L, 1); - for (;;) { - const char *inst = getname; - if EQ("") return 0; - else if EQ("isnumber") { - lua_pushnumber(L, lua_isnumber(L, getnum)); - } - else if EQ("isstring") { - lua_pushnumber(L, lua_isstring(L, getnum)); - } - else if EQ("istable") { - lua_pushnumber(L, lua_istable(L, getnum)); - } - else if EQ("iscfunction") { - lua_pushnumber(L, lua_iscfunction(L, getnum)); - } - else if EQ("isfunction") { - lua_pushnumber(L, lua_isfunction(L, getnum)); - } - else if EQ("isuserdata") { - lua_pushnumber(L, lua_isuserdata(L, getnum)); - } - else if EQ("isnil") { - lua_pushnumber(L, lua_isnil(L, getnum)); - } - else if EQ("isnull") { - lua_pushnumber(L, lua_isnull(L, getnum)); - } - else if EQ("tonumber") { - lua_pushnumber(L, lua_tonumber(L, getnum)); - } - else if EQ("tostring") { - lua_pushstring(L, lua_tostring(L, getnum)); - } - else if EQ("tonumber") { - lua_pushnumber(L, lua_tonumber(L, getnum)); - } - else if EQ("strlen") { - lua_pushnumber(L, lua_strlen(L, getnum)); - } - else if EQ("tocfunction") { - lua_pushcfunction(L, lua_tocfunction(L, getnum)); - } - else if EQ("return") { - return getnum; - } - else if EQ("gettop") { - lua_pushnumber(L, lua_gettop(L)); - } - else if EQ("settop") { - lua_settop(L, getnum); - } - else if EQ("pop") { - lua_pop(L, getnum); - } - else if EQ("pushnum") { - lua_pushnumber(L, getnum); - } - else if EQ("pushvalue") { - lua_pushvalue(L, getnum); - } - else if EQ("remove") { - lua_remove(L, getnum); - } - else if EQ("insert") { - lua_insert(L, getnum); - } - else if EQ("gettable") { - lua_gettable(L, getnum); - } - else if EQ("settable") { - lua_settable(L, getnum); - } - else if EQ("next") { - lua_next(L, -2); - } - else if EQ("concat") { - lua_concat(L, getnum); - } - else if EQ("rawcall") { - int narg = getnum; - int nres = getnum; - lua_rawcall(L, narg, nres); - } - else if EQ("call") { - int narg = getnum; - int nres = getnum; - lua_call(L, narg, nres); - } - else if EQ("dostring") { - lua_dostring(L, luaL_check_string(L, getnum)); - } - else if EQ("settagmethod") { - int tag = getnum; - const char *event = getname; - lua_settagmethod(L, tag, event); - } - else if EQ("gettagmethod") { - int tag = getnum; - const char *event = getname; - lua_gettagmethod(L, tag, event); - } - else if EQ("type") { - lua_pushstring(L, lua_typename(L, lua_type(L, getnum))); - } - else luaL_verror(L, "unknown instruction %.30s", buff); - } - return 0; -} - -/* }====================================================== */ - - - -static const struct luaL_reg tests_funcs[] = { - {"hash", hash_query}, - {"limits", get_limits}, - {"listcode", listcode}, - {"liststrings", liststrings}, - {"listlocals", listlocals}, - {"loadlib", loadlib}, - {"querystr", string_query}, - {"querytab", table_query}, - {"testC", testC}, - {"ref", tref}, - {"getref", getref}, - {"unref", unref}, - {"newuserdata", newuserdata}, - {"udataval", udataval}, - {"newstate", newstate}, - {"closestate", closestate}, - {"doremote", doremote}, - {"settagmethod", settagmethod}, - {"equal", equal}, - {"totalmem", mem_query} -}; - - -void luaB_opentests (lua_State *L) { - lua_newtable(L); - lua_getglobals(L); - lua_pushvalue(L, -2); - lua_setglobals(L); - luaL_openl(L, tests_funcs); /* open functions inside new table */ - lua_setglobals(L); /* restore old table of globals */ - lua_setglobal(L, "T"); /* set new table as global T */ -} - -#endif diff --git a/src/lua/ltm.c b/src/lua/ltm.c deleted file mode 100644 index 3f69a6ca..00000000 --- a/src/lua/ltm.c +++ /dev/null @@ -1,163 +0,0 @@ -/* -** $Id: ltm.c,v 1.3 2001/11/26 23:00:26 darkgod Exp $ -** Tag methods -** See Copyright Notice in lua.h -*/ - - -#include <stdio.h> -#include <string.h> - -#include "lua.h" - -#include "ldo.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "ltm.h" - - -const char *const luaT_eventname[] = { /* ORDER TM */ - "gettable", "settable", "index", "getglobal", "setglobal", "add", "sub", - "mul", "div", "pow", "unm", "lt", "concat", "gc", "function", - "le", "gt", "ge", /* deprecated options!! */ - NULL -}; - - -static int findevent (const char *name) { - int i; - for (i=0; luaT_eventname[i]; i++) - if (strcmp(luaT_eventname[i], name) == 0) - return i; - return -1; /* name not found */ -} - - -static int luaI_checkevent (lua_State *L, const char *name, int t) { - int e = findevent(name); - if (e >= TM_N) - luaO_verror(L, "event `%.50s' is deprecated", name); - if (e == TM_GC && t == LUA_TTABLE) - luaO_verror(L, "event `gc' for tables is deprecated"); - if (e < 0) - luaO_verror(L, "`%.50s' is not a valid event name", name); - return e; -} - - - -/* events in LUA_TNIL are all allowed, since this is used as a -* 'placeholder' for "default" fallbacks -*/ -/* ORDER LUA_T, ORDER TM */ -static const char luaT_validevents[NUM_TAGS][TM_N] = { - {1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* LUA_TUSERDATA */ - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* LUA_TNIL */ - {1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}, /* LUA_TNUMBER */ - {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_TSTRING */ - {0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* LUA_TTABLE */ - {1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0} /* LUA_TFUNCTION */ -}; - -int luaT_validevent (int t, int e) { /* ORDER LUA_T */ - return (t >= NUM_TAGS) ? 1 : luaT_validevents[t][e]; -} - - -static void init_entry (lua_State *L, int tag) { - int i; - for (i=0; i<TM_N; i++) - luaT_gettm(L, tag, i) = NULL; - L->TMtable[tag].collected = NULL; -} - - -void luaT_init (lua_State *L) { - int t; - luaM_growvector(L, L->TMtable, 0, NUM_TAGS, struct TM, "", MAX_INT); - L->nblocks += NUM_TAGS*sizeof(struct TM); - L->last_tag = NUM_TAGS-1; - for (t=0; t<=L->last_tag; t++) - init_entry(L, t); -} - - -LUA_API int lua_newtag (lua_State *L) { - luaM_growvector(L, L->TMtable, L->last_tag, 1, struct TM, - "tag table overflow", MAX_INT); - L->nblocks += sizeof(struct TM); - L->last_tag++; - init_entry(L, L->last_tag); - return L->last_tag; -} - - -static void checktag (lua_State *L, int tag) { - if (!(0 <= tag && tag <= L->last_tag)) - luaO_verror(L, "%d is not a valid tag", tag); -} - -void luaT_realtag (lua_State *L, int tag) { - if (!validtag(tag)) - luaO_verror(L, "tag %d was not created by `newtag'", tag); -} - - -LUA_API int lua_copytagmethods (lua_State *L, int tagto, int tagfrom) { - int e; - checktag(L, tagto); - checktag(L, tagfrom); - for (e=0; e<TM_N; e++) { - if (luaT_validevent(tagto, e)) - luaT_gettm(L, tagto, e) = luaT_gettm(L, tagfrom, e); - } - return tagto; -} - - -int luaT_tag (const TObject *o) { - int t = ttype(o); - switch (t) { - case LUA_TUSERDATA: return tsvalue(o)->u.d.tag; - case LUA_TTABLE: return hvalue(o)->htag; - default: return t; - } -} - - -LUA_API void lua_gettagmethod (lua_State *L, int t, const char *event) { - int e; - e = luaI_checkevent(L, event, t); - checktag(L, t); - if (luaT_validevent(t, e) && luaT_gettm(L, t, e)) { - clvalue(L->top) = luaT_gettm(L, t, e); - ttype(L->top) = LUA_TFUNCTION; - } - else - ttype(L->top) = LUA_TNIL; - incr_top; -} - - -LUA_API void lua_settagmethod (lua_State *L, int t, const char *event) { - int e = luaI_checkevent(L, event, t); - checktag(L, t); - if (!luaT_validevent(t, e)) - luaO_verror(L, "cannot change `%.20s' tag method for type `%.20s'%.20s", - luaT_eventname[e], luaO_typenames[t], - (t == LUA_TTABLE || t == LUA_TUSERDATA) ? - " with default tag" : ""); - switch (ttype(L->top - 1)) { - case LUA_TNIL: - luaT_gettm(L, t, e) = NULL; - break; - case LUA_TFUNCTION: - luaT_gettm(L, t, e) = clvalue(L->top - 1); - break; - default: - lua_error(L, "tag method must be a function (or nil)"); - } - L->top--; -} - diff --git a/src/lua/ltm.h b/src/lua/ltm.h deleted file mode 100644 index f6be13ed..00000000 --- a/src/lua/ltm.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -** $Id: ltm.h,v 1.3 2001/11/26 23:00:26 darkgod Exp $ -** Tag methods -** See Copyright Notice in lua.h -*/ - -#ifndef ltm_h -#define ltm_h - - -#include "lobject.h" -#include "lstate.h" - -/* -* WARNING: if you change the order of this enumeration, -* grep "ORDER TM" -*/ -typedef enum { - TM_GETTABLE = 0, - TM_SETTABLE, - TM_INDEX, - TM_GETGLOBAL, - TM_SETGLOBAL, - TM_ADD, - TM_SUB, - TM_MUL, - TM_DIV, - TM_POW, - TM_UNM, - TM_LT, - TM_CONCAT, - TM_GC, - TM_FUNCTION, - TM_N /* number of elements in the enum */ -} TMS; - - -struct TM { - Closure *method[TM_N]; - TString *collected; /* list of garbage-collected udata with this tag */ -}; - - -#define luaT_gettm(L,tag,event) (L->TMtable[tag].method[event]) -#define luaT_gettmbyObj(L,o,e) (luaT_gettm((L),luaT_tag(o),(e))) - - -#define validtag(t) (NUM_TAGS <= (t) && (t) <= L->last_tag) - -extern const char *const luaT_eventname[]; - - -void luaT_init (lua_State *L); -void luaT_realtag (lua_State *L, int tag); -int luaT_tag (const TObject *o); -int luaT_validevent (int t, int e); /* used by compatibility module */ - - -#endif diff --git a/src/lua/lua.h b/src/lua/lua.h deleted file mode 100644 index 87d64e71..00000000 --- a/src/lua/lua.h +++ /dev/null @@ -1,248 +0,0 @@ -/* -** $Id: lua.h,v 1.2 2001/11/26 23:00:26 darkgod Exp $ -** Lua - An Extensible Extension Language -** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil -** e-mail: lua@tecgraf.puc-rio.br -** www: http://www.tecgraf.puc-rio.br/lua/ -** See Copyright Notice at the end of this file -*/ - - -#ifndef lua_h -#define lua_h - - -/* definition of `size_t' */ -#include <stddef.h> - - -/* mark for all API functions */ -#ifndef LUA_API -#define LUA_API extern -#endif - - -#define LUA_VERSION "Lua 4.0" -#define LUA_COPYRIGHT "Copyright (C) 1994-2000 TeCGraf, PUC-Rio" -#define LUA_AUTHORS "W. Celes, R. Ierusalimschy & L. H. de Figueiredo" - - -/* name of global variable with error handler */ -#define LUA_ERRORMESSAGE "_ERRORMESSAGE" - - -/* pre-defined references */ -#define LUA_NOREF (-2) -#define LUA_REFNIL (-1) -#define LUA_REFREGISTRY 0 - -/* pre-defined tags */ -#define LUA_ANYTAG (-1) -#define LUA_NOTAG (-2) - - -/* option for multiple returns in lua_call */ -#define LUA_MULTRET (-1) - - -/* minimum stack available for a C function */ -#define LUA_MINSTACK 20 - - -/* error codes for lua_do* */ -#define LUA_ERRRUN 1 -#define LUA_ERRFILE 2 -#define LUA_ERRSYNTAX 3 -#define LUA_ERRMEM 4 -#define LUA_ERRERR 5 - - -typedef struct lua_State lua_State; - -typedef int (*lua_CFunction) (lua_State *L); - -/* -** types returned by `lua_type' -*/ -#define LUA_TNONE (-1) - -#define LUA_TUSERDATA 0 -#define LUA_TNIL 1 -#define LUA_TNUMBER 2 -#define LUA_TSTRING 3 -#define LUA_TTABLE 4 -#define LUA_TFUNCTION 5 - - - -/* -** state manipulation -*/ -LUA_API lua_State *lua_open (int stacksize); -LUA_API void lua_close (lua_State *L); - - -/* -** basic stack manipulation -*/ -LUA_API int lua_gettop (lua_State *L); -LUA_API void lua_settop (lua_State *L, int index); -LUA_API void lua_pushvalue (lua_State *L, int index); -LUA_API void lua_remove (lua_State *L, int index); -LUA_API void lua_insert (lua_State *L, int index); -LUA_API int lua_stackspace (lua_State *L); - - -/* -** access functions (stack -> C) -*/ - -LUA_API int lua_type (lua_State *L, int index); -LUA_API const char *lua_typename (lua_State *L, int t); -LUA_API int lua_isnumber (lua_State *L, int index); -LUA_API int lua_isstring (lua_State *L, int index); -LUA_API int lua_iscfunction (lua_State *L, int index); -LUA_API int lua_tag (lua_State *L, int index); - -LUA_API int lua_equal (lua_State *L, int index1, int index2); -LUA_API int lua_lessthan (lua_State *L, int index1, int index2); - -LUA_API long lua_tonumber (lua_State *L, int index); -LUA_API const char *lua_tostring (lua_State *L, int index); -LUA_API size_t lua_strlen (lua_State *L, int index); -LUA_API lua_CFunction lua_tocfunction (lua_State *L, int index); -LUA_API void *lua_touserdata (lua_State *L, int index); -LUA_API const void *lua_topointer (lua_State *L, int index); - - -/* -** push functions (C -> stack) -*/ -LUA_API void lua_pushnil (lua_State *L); -LUA_API void lua_pushnumber (lua_State *L, long n); -LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len); -LUA_API void lua_pushstring (lua_State *L, const char *s); -LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n); -LUA_API void lua_pushusertag (lua_State *L, void *u, int tag); - - -/* -** get functions (Lua -> stack) -*/ -LUA_API void lua_getglobal (lua_State *L, const char *name); -LUA_API void lua_gettable (lua_State *L, int index); -LUA_API void lua_rawget (lua_State *L, int index); -LUA_API void lua_rawgeti (lua_State *L, int index, int n); -LUA_API void lua_getglobals (lua_State *L); -LUA_API void lua_gettagmethod (lua_State *L, int tag, const char *event); -LUA_API int lua_getref (lua_State *L, int ref); -LUA_API void lua_newtable (lua_State *L); - - -/* -** set functions (stack -> Lua) -*/ -LUA_API void lua_setglobal (lua_State *L, const char *name); -LUA_API void lua_settable (lua_State *L, int index); -LUA_API void lua_rawset (lua_State *L, int index); -LUA_API void lua_rawseti (lua_State *L, int index, int n); -LUA_API void lua_setglobals (lua_State *L); -LUA_API void lua_settagmethod (lua_State *L, int tag, const char *event); -LUA_API int lua_ref (lua_State *L, int lock); - - -/* -** "do" functions (run Lua code) -*/ -LUA_API int lua_call (lua_State *L, int nargs, int nresults); -LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults); -LUA_API int lua_dofile (lua_State *L, const char *filename); -LUA_API int lua_dostring (lua_State *L, const char *str); -LUA_API int lua_dobuffer (lua_State *L, const char *buff, size_t size, const char *name); - -/* -** Garbage-collection functions -*/ -LUA_API int lua_getgcthreshold (lua_State *L); -LUA_API int lua_getgccount (lua_State *L); -LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold); - -/* -** miscellaneous functions -*/ -LUA_API int lua_newtag (lua_State *L); -LUA_API int lua_copytagmethods (lua_State *L, int tagto, int tagfrom); -LUA_API void lua_settag (lua_State *L, int tag); - -LUA_API void lua_error (lua_State *L, const char *s); - -LUA_API void lua_unref (lua_State *L, int ref); - -LUA_API int lua_next (lua_State *L, int index); -LUA_API int lua_getn (lua_State *L, int index); - -LUA_API void lua_concat (lua_State *L, int n); - -LUA_API void *lua_newuserdata (lua_State *L, size_t size); - - -/* -** =============================================================== -** some useful macros -** =============================================================== -*/ - -#define lua_pop(L,n) lua_settop(L, -(n)-1) - -#define lua_register(L,n,f) (lua_pushcfunction(L, f), lua_setglobal(L, n)) -#define lua_pushuserdata(L,u) lua_pushusertag(L, u, 0) -#define lua_pushcfunction(L,f) lua_pushcclosure(L, f, 0) -#define lua_clonetag(L,t) lua_copytagmethods(L, lua_newtag(L), (t)) - -#define lua_isfunction(L,n) (lua_type(L,n) == LUA_TFUNCTION) -#define lua_istable(L,n) (lua_type(L,n) == LUA_TTABLE) -#define lua_isuserdata(L,n) (lua_type(L,n) == LUA_TUSERDATA) -#define lua_isnil(L,n) (lua_type(L,n) == LUA_TNIL) -#define lua_isnull(L,n) (lua_type(L,n) == LUA_TNONE) - -#define lua_getregistry(L) lua_getref(L, LUA_REFREGISTRY) - -#endif - - - -/****************************************************************************** -* Copyright (C) 1994-2000 TeCGraf, PUC-Rio. All rights reserved. -* -* Permission is hereby granted, without written agreement and without license -* or royalty fees, to use, copy, modify, and distribute this software and its -* documentation for any purpose, including commercial applications, subject to -* the following conditions: -* -* - The above copyright notice and this permission notice shall appear in all -* copies or substantial portions of this software. -* -* - The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software in a -* product, an acknowledgment in the product documentation would be greatly -* appreciated (but it is not required). -* -* - Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* -* The authors specifically disclaim any warranties, including, but not limited -* to, the implied warranties of merchantability and fitness for a particular -* purpose. The software provided hereunder is on an "as is" basis, and the -* authors have no obligation to provide maintenance, support, updates, -* enhancements, or modifications. In no event shall TeCGraf, PUC-Rio, or the -* authors be held liable to any party for direct, indirect, special, -* incidental, or consequential damages arising out of the use of this software -* and its documentation. -* -* The Lua language and this implementation have been entirely designed and -* written by Waldemar Celes Filho, Roberto Ierusalimschy and -* Luiz Henrique de Figueiredo at TeCGraf, PUC-Rio. -* -* This implementation contains no third-party code. -******************************************************************************/ - diff --git a/src/lua/lua2c.lua b/src/lua/lua2c.lua deleted file mode 100644 index 3f8d1716..00000000 --- a/src/lua/lua2c.lua +++ /dev/null @@ -1,29 +0,0 @@ --- lua2c.lua --- embed lua code into C source --- celetecgraf.puc-rio.br --- dez 2000 - -function embed (code) - - -- clean Lua code - local s = clean(code) - if not s then - error("parser error in embedded code") - end - - -- convert to C - output('\n { /* begin embedded lua code */\n') - output(' static unsigned char B[] = {\n ') - local t={n=0} - local b = gsub(s,'(.)',function (c) - local e = '' - %t.n=%t.n+1 if %t.n==15 then %t.n=0 e='\n ' end - return format('%3u,%s',strbyte(c),e) - end - ) - output(b..strbyte(" ")) - output('\n };\n') - output(' lua_dobuffer(tolua_S,(char*)B,sizeof(B),"'..fn..': embedded Lua code");') - output(' } /* end of embedded lua code */\n\n') -end - diff --git a/src/lua/luadebug.h b/src/lua/luadebug.h deleted file mode 100644 index 21522445..00000000 --- a/src/lua/luadebug.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -** $Id: luadebug.h,v 1.2 2001/11/26 23:00:26 darkgod Exp $ -** Debugging API -** See Copyright Notice in lua.h -*/ - - -#ifndef luadebug_h -#define luadebug_h - - -#include "lua.h" - -typedef struct lua_Debug lua_Debug; /* activation record */ -typedef struct lua_Localvar lua_Localvar; - -typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); - - -LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar); -LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar); -LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n); -LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n); - -LUA_API lua_Hook lua_setcallhook (lua_State *L, lua_Hook func); -LUA_API lua_Hook lua_setlinehook (lua_State *L, lua_Hook func); - - -#define LUA_IDSIZE 60 - -struct lua_Debug { - const char *event; /* `call', `return' */ - int currentline; /* (l) */ - const char *name; /* (n) */ - const char *namewhat; /* (n) `global', `tag method', `local', `field' */ - int nups; /* (u) number of upvalues */ - int linedefined; /* (S) */ - const char *what; /* (S) `Lua' function, `C' function, Lua `main' */ - const char *source; /* (S) */ - char short_src[LUA_IDSIZE]; /* (S) */ - /* private part */ - struct lua_TObject *_func; /* active function */ -}; - - -#endif diff --git a/src/lua/lualib.h b/src/lua/lualib.h deleted file mode 100644 index 89f5519f..00000000 --- a/src/lua/lualib.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -** $Id: lualib.h,v 1.2 2001/11/26 23:00:26 darkgod Exp $ -** Lua standard libraries -** See Copyright Notice in lua.h -*/ - - -#ifndef lualib_h -#define lualib_h - -#include "lua.h" - - -#ifndef LUALIB_API -#define LUALIB_API extern -#endif - - -#define LUA_ALERT "_ALERT" - -LUALIB_API void lua_baselibopen (lua_State *L); -LUALIB_API void lua_iolibopen (lua_State *L); -LUALIB_API void lua_strlibopen (lua_State *L); -LUALIB_API void lua_mathlibopen (lua_State *L); -LUALIB_API void lua_dblibopen (lua_State *L); - - - -/* Auxiliary functions (private) */ - -const char *luaI_classend (lua_State *L, const char *p); -int luaI_singlematch (int c, const char *p, const char *ep); - -#endif diff --git a/src/lua/lundump.c b/src/lua/lundump.c deleted file mode 100644 index 7f69573e..00000000 --- a/src/lua/lundump.c +++ /dev/null @@ -1,244 +0,0 @@ -/* -** $Id: lundump.c,v 1.3 2001/11/26 23:00:26 darkgod Exp $ -** load bytecodes from files -** See Copyright Notice in lua.h -*/ - -#include <stdio.h> -#include <string.h> - -#include "lfunc.h" -#include "lmem.h" -#include "lopcodes.h" -#include "lstring.h" -#include "lundump.h" - -#define LoadByte ezgetc - -static const char* ZNAME (ZIO* Z) -{ - const char* s=zname(Z); - return (*s=='@') ? s+1 : s; -} - -static void unexpectedEOZ (lua_State* L, ZIO* Z) -{ - luaO_verror(L,"unexpected end of file in `%.99s'",ZNAME(Z)); -} - -static int ezgetc (lua_State* L, ZIO* Z) -{ - int c=zgetc(Z); - if (c==EOZ) unexpectedEOZ(L,Z); - return c; -} - -static void ezread (lua_State* L, ZIO* Z, void* b, int n) -{ - int r=zread(Z,b,n); - if (r!=0) unexpectedEOZ(L,Z); -} - -static void LoadBlock (lua_State* L, void* b, size_t size, ZIO* Z, int swap) -{ - if (swap) - { - char *p=(char *) b+size-1; - int n=size; - while (n--) *p--=(char)ezgetc(L,Z); - } - else - ezread(L,Z,b,size); -} - -static void LoadVector (lua_State* L, void* b, int m, size_t size, ZIO* Z, int swap) -{ - if (swap) - { - char *q=(char *) b; - while (m--) - { - char *p=q+size-1; - int n=size; - while (n--) *p--=(char)ezgetc(L,Z); - q+=size; - } - } - else - ezread(L,Z,b,m*size); -} - -static int LoadInt (lua_State* L, ZIO* Z, int swap) -{ - int x; - LoadBlock(L,&x,sizeof(x),Z,swap); - return x; -} - -static size_t LoadSize (lua_State* L, ZIO* Z, int swap) -{ - size_t x; - LoadBlock(L,&x,sizeof(x),Z,swap); - return x; -} - -static Number LoadNumber (lua_State* L, ZIO* Z, int swap) -{ - Number x; - LoadBlock(L,&x,sizeof(x),Z,swap); - return x; -} - -static TString* LoadString (lua_State* L, ZIO* Z, int swap) -{ - size_t size=LoadSize(L,Z,swap); - if (size==0) - return NULL; - else - { - char* s=luaO_openspace(L,size); - LoadBlock(L,s,size,Z,0); - return luaS_newlstr(L,s,size-1); /* remove trailing '\0' */ - } -} - -static void LoadCode (lua_State* L, Proto* tf, ZIO* Z, int swap) -{ - int size=LoadInt(L,Z,swap); - tf->code=luaM_newvector(L,size,Instruction); - LoadVector(L,tf->code,size,sizeof(*tf->code),Z,swap); - if (tf->code[size-1]!=OP_END) luaO_verror(L,"bad code in `%.99s'",ZNAME(Z)); - luaF_protook(L,tf,size); -} - -static void LoadLocals (lua_State* L, Proto* tf, ZIO* Z, int swap) -{ - int i,n; - tf->nlocvars=n=LoadInt(L,Z,swap); - tf->locvars=luaM_newvector(L,n,LocVar); - for (i=0; i<n; i++) - { - tf->locvars[i].varname=LoadString(L,Z,swap); - tf->locvars[i].startpc=LoadInt(L,Z,swap); - tf->locvars[i].endpc=LoadInt(L,Z,swap); - } -} - -static void LoadLines (lua_State* L, Proto* tf, ZIO* Z, int swap) -{ - int n; - tf->nlineinfo=n=LoadInt(L,Z,swap); - tf->lineinfo=luaM_newvector(L,n,int); - LoadVector(L,tf->lineinfo,n,sizeof(*tf->lineinfo),Z,swap); -} - -static Proto* LoadFunction (lua_State* L, ZIO* Z, int swap); - -static void LoadConstants (lua_State* L, Proto* tf, ZIO* Z, int swap) -{ - int i,n; - tf->nkstr=n=LoadInt(L,Z,swap); - tf->kstr=luaM_newvector(L,n,TString*); - for (i=0; i<n; i++) - tf->kstr[i]=LoadString(L,Z,swap); - tf->nknum=n=LoadInt(L,Z,swap); - tf->knum=luaM_newvector(L,n,Number); - LoadVector(L,tf->knum,n,sizeof(*tf->knum),Z,swap); - tf->nkproto=n=LoadInt(L,Z,swap); - tf->kproto=luaM_newvector(L,n,Proto*); - for (i=0; i<n; i++) - tf->kproto[i]=LoadFunction(L,Z,swap); -} - -static Proto* LoadFunction (lua_State* L, ZIO* Z, int swap) -{ - Proto* tf=luaF_newproto(L); - tf->source=LoadString(L,Z,swap); - tf->lineDefined=LoadInt(L,Z,swap); - tf->numparams=LoadInt(L,Z,swap); - tf->is_vararg=LoadByte(L,Z); - tf->maxstacksize=LoadInt(L,Z,swap); - LoadLocals(L,tf,Z,swap); - LoadLines(L,tf,Z,swap); - LoadConstants(L,tf,Z,swap); - LoadCode(L,tf,Z,swap); - return tf; -} - -static void LoadSignature (lua_State* L, ZIO* Z) -{ - const char* s=SIGNATURE; - while (*s!=0 && ezgetc(L,Z)==*s) - ++s; - if (*s!=0) luaO_verror(L,"bad signature in `%.99s'",ZNAME(Z)); -} - -static void TestSize (lua_State* L, int s, const char* what, ZIO* Z) -{ - int r=ezgetc(L,Z); - if (r!=s) - luaO_verror(L,"virtual machine mismatch in `%.99s':\n" - " %.20s is %d but read %d",ZNAME(Z),what,s,r); -} - -#define TESTSIZE(s) TestSize(L,s,#s,Z) -#define V(v) v/16,v%16 - -static int LoadHeader (lua_State* L, ZIO* Z) -{ - int version,swap; - Number f=0,tf=TEST_NUMBER; - LoadSignature(L,Z); - version=ezgetc(L,Z); - if (version>VERSION) - luaO_verror(L,"`%.99s' too new:\n" - " read version %d.%d; expected at most %d.%d", - ZNAME(Z),V(version),V(VERSION)); - if (version<VERSION0) /* check last major change */ - luaO_verror(L,"`%.99s' too old:\n" - " read version %d.%d; expected at least %d.%d", - ZNAME(Z),V(version),V(VERSION)); - swap=(luaU_endianess()!=ezgetc(L,Z)); /* need to swap bytes? */ - TESTSIZE(sizeof(int)); - TESTSIZE(sizeof(size_t)); - TESTSIZE(sizeof(Instruction)); - TESTSIZE(SIZE_INSTRUCTION); - TESTSIZE(SIZE_OP); - TESTSIZE(SIZE_B); - TESTSIZE(sizeof(Number)); - f=LoadNumber(L,Z,swap); - if ((long)f!=(long)tf) /* disregard errors in last bit of fraction */ - luaO_verror(L,"unknown number format in `%.99s':\n" - " read " NUMBER_FMT "; expected " NUMBER_FMT, ZNAME(Z),f,tf); - return swap; -} - -static Proto* LoadChunk (lua_State* L, ZIO* Z) -{ - return LoadFunction(L,Z,LoadHeader(L,Z)); -} - -/* -** load one chunk from a file or buffer -** return main if ok and NULL at EOF -*/ -Proto* luaU_undump (lua_State* L, ZIO* Z) -{ - Proto* tf=NULL; - int c=zgetc(Z); - if (c==ID_CHUNK) - tf=LoadChunk(L,Z); - c=zgetc(Z); - if (c!=EOZ) - luaO_verror(L,"`%.99s' apparently contains more than one chunk",ZNAME(Z)); - return tf; -} - -/* -** find byte order -*/ -int luaU_endianess (void) -{ - int x=1; - return *(char*)&x; -} diff --git a/src/lua/lundump.h b/src/lua/lundump.h deleted file mode 100644 index ec394f46..00000000 --- a/src/lua/lundump.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -** $Id: lundump.h,v 1.3 2001/11/26 23:00:26 darkgod Exp $ -** load pre-compiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#ifndef lundump_h -#define lundump_h - -#include "lobject.h" -#include "lzio.h" - -/* load one chunk */ -Proto* luaU_undump (lua_State* L, ZIO* Z); - -/* find byte order */ -int luaU_endianess (void); - -/* definitions for headers of binary files */ -#define VERSION 0x40 /* last format change was in 4.0 */ -#define VERSION0 0x40 /* last major change was in 4.0 */ -#define ID_CHUNK 27 /* binary files start with ESC... */ -#define SIGNATURE "Lua" /* ...followed by this signature */ - -/* formats for error messages */ -#define SOURCE_FMT "<%d:%.99s>" -#define SOURCE tf->lineDefined,tf->source->str -#define IN_FMT " in %p " SOURCE_FMT -#define IN tf,SOURCE - -/* a multiple of PI for testing native format */ -/* multiplying by 1E8 gives non-trivial integer values */ -#define TEST_NUMBER 3 - -#endif diff --git a/src/lua/lvm.c b/src/lua/lvm.c deleted file mode 100644 index e304e11e..00000000 --- a/src/lua/lvm.c +++ /dev/null @@ -1,710 +0,0 @@ -/* -** $Id: lvm.c,v 1.5 2004/06/04 13:42:10 neil Exp $ -** Lua virtual machine -** See Copyright Notice in lua.h -*/ - - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "lua.h" - -#include "lapi.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lvm.h" - - -#ifdef OLD_ANSI -#define strcoll(a,b) strcmp(a,b) -#endif - - - -/* -** Extra stack size to run a function: -** TAG_LINE(1), NAME(1), TM calls(3) (plus some extra...) -*/ -#define EXTRA_STACK 8 - - - -int luaV_tonumber (TObject *obj) { - if (ttype(obj) != LUA_TSTRING) - return 1; - else { - if (!luaO_str2d(svalue(obj), &nvalue(obj))) - return 2; - ttype(obj) = LUA_TNUMBER; - return 0; - } -} - - -int luaV_tostring (lua_State *L, TObject *obj) { /* LUA_NUMBER */ - if (ttype(obj) != LUA_TNUMBER) - return 1; - else { - char s[32]; /* 16 digits, sign, point and \0 (+ some extra...) */ - lua_number2str(s, nvalue(obj)); /* convert `s' to number */ - tsvalue(obj) = luaS_new(L, s); - ttype(obj) = LUA_TSTRING; - return 0; - } -} - - -static void traceexec (lua_State *L, StkId base, StkId top, lua_Hook linehook) { - CallInfo *ci = infovalue(base-1); - int *lineinfo = ci->func->f.l->lineinfo; - int pc = (*ci->pc - ci->func->f.l->code) - 1; - int newline; - if (pc == 0) { /* may be first time? */ - ci->line = 1; - ci->refi = 0; - ci->lastpc = pc+1; /* make sure it will call linehook */ - } - newline = luaG_getline(lineinfo, pc, ci->line, &ci->refi); - /* calls linehook when enters a new line or jumps back (loop) */ - if (newline != ci->line || pc <= ci->lastpc) { - ci->line = newline; - L->top = top; - luaD_lineHook(L, base-2, newline, linehook); - } - ci->lastpc = pc; -} - - -static Closure *luaV_closure (lua_State *L, int nelems) { - Closure *c = luaF_newclosure(L, nelems); - L->top -= nelems; - while (nelems--) - c->upvalue[nelems] = *(L->top+nelems); - clvalue(L->top) = c; - ttype(L->top) = LUA_TFUNCTION; - incr_top; - return c; -} - - -void luaV_Cclosure (lua_State *L, lua_CFunction c, int nelems) { - Closure *cl = luaV_closure(L, nelems); - cl->f.c = c; - cl->isC = 1; -} - - -void luaV_Lclosure (lua_State *L, Proto *l, int nelems) { - Closure *cl = luaV_closure(L, nelems); - cl->f.l = l; - cl->isC = 0; -} - - -/* -** Function to index a table. -** Receives the table at `t' and the key at top. -*/ -const TObject *luaV_gettable (lua_State *L, StkId t) { - Closure *tm; - int tg; - if (ttype(t) == LUA_TTABLE && /* `t' is a table? */ - ((tg = hvalue(t)->htag) == LUA_TTABLE || /* with default tag? */ - luaT_gettm(L, tg, TM_GETTABLE) == NULL)) { /* or no TM? */ - /* do a primitive get */ - const TObject *h = luaH_get(L, hvalue(t), L->top-1); - /* result is no nil or there is no `index' tag method? */ - if (ttype(h) != LUA_TNIL || ((tm=luaT_gettm(L, tg, TM_INDEX)) == NULL)) - return h; /* return result */ - /* else call `index' tag method */ - } - else { /* try a `gettable' tag method */ - tm = luaT_gettmbyObj(L, t, TM_GETTABLE); - } - if (tm != NULL) { /* is there a tag method? */ - luaD_checkstack(L, 2); - *(L->top+1) = *(L->top-1); /* key */ - *L->top = *t; /* table */ - clvalue(L->top-1) = tm; /* tag method */ - ttype(L->top-1) = LUA_TFUNCTION; - L->top += 2; - luaD_call(L, L->top - 3, 1); - return L->top - 1; /* call result */ - } - else { /* no tag method */ - luaG_typeerror(L, t, "index"); - return NULL; /* to avoid warnings */ - } -} - - -/* -** Receives table at `t', key at `key' and value at top. -*/ -void luaV_settable (lua_State *L, StkId t, StkId key) { - int tg; - if (ttype(t) == LUA_TTABLE && /* `t' is a table? */ - ((tg = hvalue(t)->htag) == LUA_TTABLE || /* with default tag? */ - luaT_gettm(L, tg, TM_SETTABLE) == NULL)) /* or no TM? */ - *luaH_set(L, hvalue(t), key) = *(L->top-1); /* do a primitive set */ - else { /* try a `settable' tag method */ - Closure *tm = luaT_gettmbyObj(L, t, TM_SETTABLE); - if (tm != NULL) { - luaD_checkstack(L, 3); - *(L->top+2) = *(L->top-1); - *(L->top+1) = *key; - *(L->top) = *t; - clvalue(L->top-1) = tm; - ttype(L->top-1) = LUA_TFUNCTION; - L->top += 3; - luaD_call(L, L->top - 4, 0); /* call `settable' tag method */ - } - else /* no tag method... */ - luaG_typeerror(L, t, "index"); - } -} - - -const TObject *luaV_getglobal (lua_State *L, TString *s) { - const TObject *value = luaH_getstr(L->gt, s); - Closure *tm = luaT_gettmbyObj(L, value, TM_GETGLOBAL); - if (tm == NULL) /* is there a tag method? */ - return value; /* default behavior */ - else { /* tag method */ - luaD_checkstack(L, 3); - clvalue(L->top) = tm; - ttype(L->top) = LUA_TFUNCTION; - tsvalue(L->top+1) = s; /* global name */ - ttype(L->top+1) = LUA_TSTRING; - *(L->top+2) = *value; - L->top += 3; - luaD_call(L, L->top - 3, 1); - return L->top - 1; - } -} - - -void luaV_setglobal (lua_State *L, TString *s) { - const TObject *oldvalue = luaH_getstr(L->gt, s); - Closure *tm = luaT_gettmbyObj(L, oldvalue, TM_SETGLOBAL); - if (tm == NULL) { /* is there a tag method? */ - if (oldvalue != &luaO_nilobject) { - /* cast to remove `const' is OK, because `oldvalue' != luaO_nilobject */ - *(TObject *)oldvalue = *(L->top - 1); - } - else { - TObject key; - ttype(&key) = LUA_TSTRING; - tsvalue(&key) = s; - *luaH_set(L, L->gt, &key) = *(L->top - 1); - } - } - else { - luaD_checkstack(L, 3); - *(L->top+2) = *(L->top-1); /* new value */ - *(L->top+1) = *oldvalue; - ttype(L->top) = LUA_TSTRING; - tsvalue(L->top) = s; - clvalue(L->top-1) = tm; - ttype(L->top-1) = LUA_TFUNCTION; - L->top += 3; - luaD_call(L, L->top - 4, 0); - } -} - - -static int call_binTM (lua_State *L, StkId top, TMS event) { - /* try first operand */ - Closure *tm = luaT_gettmbyObj(L, top-2, event); - L->top = top; - if (tm == NULL) { - tm = luaT_gettmbyObj(L, top-1, event); /* try second operand */ - if (tm == NULL) { - tm = luaT_gettm(L, 0, event); /* try a `global' method */ - if (tm == NULL) - return 0; /* error */ - } - } - lua_pushstring(L, luaT_eventname[event]); - luaD_callTM(L, tm, 3, 1); - return 1; -} - - -static void call_arith (lua_State *L, StkId top, TMS event) { - if (!call_binTM(L, top, event)) - luaG_binerror(L, top-2, LUA_TNUMBER, "perform arithmetic on"); -} - - -static int luaV_strcomp (const TString *ls, const TString *rs) { - const char *l = ls->str; - size_t ll = ls->len; - const char *r = rs->str; - size_t lr = rs->len; - for (;;) { - int temp = strcoll(l, r); - if (temp != 0) return temp; - else { /* strings are equal up to a '\0' */ - size_t len = strlen(l); /* index of first '\0' in both strings */ - if (len == ll) /* l is finished? */ - return (len == lr) ? 0 : -1; /* l is equal or smaller than r */ - else if (len == lr) /* r is finished? */ - return 1; /* l is greater than r (because l is not finished) */ - /* both strings longer than `len'; go on comparing (after the '\0') */ - len++; - l += len; ll -= len; r += len; lr -= len; - } - } -} - - -int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r, StkId top) { - if (ttype(l) == LUA_TNUMBER && ttype(r) == LUA_TNUMBER) - return (nvalue(l) < nvalue(r)); - else if (ttype(l) == LUA_TSTRING && ttype(r) == LUA_TSTRING) - return (luaV_strcomp(tsvalue(l), tsvalue(r)) < 0); - else { /* call TM */ - luaD_checkstack(L, 2); - *top++ = *l; - *top++ = *r; - if (!call_binTM(L, top, TM_LT)) - luaG_ordererror(L, top-2); - L->top--; - return (ttype(L->top) != LUA_TNIL); - } -} - - -void luaV_strconc (lua_State *L, int total, StkId top) { - do { - int n = 2; /* number of elements handled in this pass (at least 2) */ - if (tostring(L, top-2) || tostring(L, top-1)) { - if (!call_binTM(L, top, TM_CONCAT)) - luaG_binerror(L, top-2, LUA_TSTRING, "concat"); - } - else if (tsvalue(top-1)->len > 0) { /* if len=0, do nothing */ - /* at least two string values; get as many as possible */ - lint32 tl = (lint32)tsvalue(top-1)->len + - (lint32)tsvalue(top-2)->len; - char *buffer; - int i; - while (n < total && !tostring(L, top-n-1)) { /* collect total length */ - tl += tsvalue(top-n-1)->len; - n++; - } - if (tl > MAX_SIZET) lua_error(L, "string size overflow"); - buffer = luaO_openspace(L, tl); - tl = 0; - for (i=n; i>0; i--) { /* concat all strings */ - size_t l = tsvalue(top-i)->len; - memcpy(buffer+tl, tsvalue(top-i)->str, l); - tl += l; - } - tsvalue(top-n) = luaS_newlstr(L, buffer, tl); - } - total -= n-1; /* got `n' strings to create 1 new */ - top -= n-1; - } while (total > 1); /* repeat until only 1 result left */ -} - - -static void luaV_pack (lua_State *L, StkId firstelem) { - int i; - Hash *htab = luaH_new(L, 0); - for (i=0; firstelem+i<L->top; i++) - *luaH_setint(L, htab, i+1) = *(firstelem+i); - /* store counter in field `n' */ - luaH_setstrnum(L, htab, luaS_new(L, "n"), i); - L->top = firstelem; /* remove elements from the stack */ - ttype(L->top) = LUA_TTABLE; - hvalue(L->top) = htab; - incr_top; -} - - -static void adjust_varargs (lua_State *L, StkId base, int nfixargs) { - int nvararg = (L->top-base) - nfixargs; - if (nvararg < 0) - luaD_adjusttop(L, base, nfixargs); - luaV_pack(L, base+nfixargs); -} - - - -#define dojump(pc, i) { int d = GETARG_S(i); pc += d; } - -/* -** Executes the given Lua function. Parameters are between [base,top). -** Returns n such that the the results are between [n,top). -*/ -StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { - const Proto *const tf = cl->f.l; - StkId top; /* keep top local, for performance */ - const Instruction *pc = tf->code; - TString **const kstr = tf->kstr; - const lua_Hook linehook = L->linehook; - infovalue(base-1)->pc = &pc; - luaD_checkstack(L, tf->maxstacksize+EXTRA_STACK); - if (tf->is_vararg) /* varargs? */ - adjust_varargs(L, base, tf->numparams); - else - luaD_adjusttop(L, base, tf->numparams); - top = L->top; - /* main loop of interpreter */ - for (;;) { - const Instruction i = *pc++; - if (linehook) - traceexec(L, base, top, linehook); - switch (GET_OPCODE(i)) { - case OP_END: { - L->top = top; - return top; - } - case OP_RETURN: { - L->top = top; - return base+GETARG_U(i); - } - case OP_CALL: { - int nres = GETARG_B(i); - if (nres == MULT_RET) nres = LUA_MULTRET; - L->top = top; - luaD_call(L, base+GETARG_A(i), nres); - top = L->top; - break; - } - case OP_TAILCALL: { - L->top = top; - luaD_call(L, base+GETARG_A(i), LUA_MULTRET); - return base+GETARG_B(i); - } - case OP_PUSHNIL: { - int n = GETARG_U(i); - LUA_ASSERT(n>0, "invalid argument"); - do { - ttype(top++) = LUA_TNIL; - } while (--n > 0); - break; - } - case OP_POP: { - top -= GETARG_U(i); - break; - } - case OP_PUSHINT: { - ttype(top) = LUA_TNUMBER; - nvalue(top) = (Number)GETARG_S(i); - top++; - break; - } - case OP_PUSHSTRING: { - ttype(top) = LUA_TSTRING; - tsvalue(top) = kstr[GETARG_U(i)]; - top++; - break; - } - case OP_PUSHNUM: { - ttype(top) = LUA_TNUMBER; - nvalue(top) = tf->knum[GETARG_U(i)]; - top++; - break; - } - case OP_PUSHNEGNUM: { - ttype(top) = LUA_TNUMBER; - nvalue(top) = -tf->knum[GETARG_U(i)]; - top++; - break; - } - case OP_PUSHUPVALUE: { - *top++ = cl->upvalue[GETARG_U(i)]; - break; - } - case OP_GETLOCAL: { - *top++ = *(base+GETARG_U(i)); - break; - } - case OP_GETGLOBAL: { - L->top = top; - *top = *luaV_getglobal(L, kstr[GETARG_U(i)]); - top++; - break; - } - case OP_GETTABLE: { - L->top = top; - top--; - *(top-1) = *luaV_gettable(L, top-1); - break; - } - case OP_GETDOTTED: { - ttype(top) = LUA_TSTRING; - tsvalue(top) = kstr[GETARG_U(i)]; - L->top = top+1; - *(top-1) = *luaV_gettable(L, top-1); - break; - } - case OP_GETINDEXED: { - *top = *(base+GETARG_U(i)); - L->top = top+1; - *(top-1) = *luaV_gettable(L, top-1); - break; - } - case OP_PUSHSELF: { - TObject receiver; - receiver = *(top-1); - ttype(top) = LUA_TSTRING; - tsvalue(top++) = kstr[GETARG_U(i)]; - L->top = top; - *(top-2) = *luaV_gettable(L, top-2); - *(top-1) = receiver; - break; - } - case OP_CREATETABLE: { - L->top = top; - luaC_checkGC(L); - hvalue(top) = luaH_new(L, GETARG_U(i)); - ttype(top) = LUA_TTABLE; - top++; - break; - } - case OP_SETLOCAL: { - *(base+GETARG_U(i)) = *(--top); - break; - } - case OP_SETGLOBAL: { - L->top = top; - luaV_setglobal(L, kstr[GETARG_U(i)]); - top--; - break; - } - case OP_SETTABLE: { - StkId t = top-GETARG_A(i); - L->top = top; - luaV_settable(L, t, t+1); - top -= GETARG_B(i); /* pop values */ - break; - } - case OP_SETLIST: { - int aux = GETARG_A(i) * LFIELDS_PER_FLUSH; - int n = GETARG_B(i); - Hash *arr = hvalue(top-n-1); - L->top = top-n; /* final value of `top' (in case of errors) */ - for (; n; n--) - *luaH_setint(L, arr, n+aux) = *(--top); - break; - } - case OP_SETMAP: { - int n = GETARG_U(i); - StkId finaltop = top-2*n; - Hash *arr = hvalue(finaltop-1); - L->top = finaltop; /* final value of `top' (in case of errors) */ - for (; n; n--) { - top-=2; - *luaH_set(L, arr, top) = *(top+1); - } - break; - } - case OP_ADD: { - if (tonumber(top-2) || tonumber(top-1)) - call_arith(L, top, TM_ADD); - else - nvalue(top-2) += nvalue(top-1); - top--; - break; - } - case OP_ADDI: { - if (tonumber(top-1)) { - ttype(top) = LUA_TNUMBER; - nvalue(top) = (Number)GETARG_S(i); - call_arith(L, top+1, TM_ADD); - } - else - nvalue(top-1) += (Number)GETARG_S(i); - break; - } - case OP_SUB: { - if (tonumber(top-2) || tonumber(top-1)) - call_arith(L, top, TM_SUB); - else - nvalue(top-2) -= nvalue(top-1); - top--; - break; - } - case OP_MULT: { - if (tonumber(top-2) || tonumber(top-1)) - call_arith(L, top, TM_MUL); - else - nvalue(top-2) *= nvalue(top-1); - top--; - break; - } - case OP_DIV: { - if (tonumber(top-2) || tonumber(top-1)) - call_arith(L, top, TM_DIV); - else - nvalue(top-2) /= nvalue(top-1); - top--; - break; - } - case OP_POW: { - if (!call_binTM(L, top, TM_POW)) - lua_error(L, "undefined operation"); - top--; - break; - } - case OP_CONCAT: { - int n = GETARG_U(i); - luaV_strconc(L, n, top); - top -= n-1; - L->top = top; - luaC_checkGC(L); - break; - } - case OP_MINUS: { - if (tonumber(top-1)) { - ttype(top) = LUA_TNIL; - call_arith(L, top+1, TM_UNM); - } - else - nvalue(top-1) = -nvalue(top-1); - break; - } - case OP_NOT: { - ttype(top-1) = - (ttype(top-1) == LUA_TNIL) ? LUA_TNUMBER : LUA_TNIL; - nvalue(top-1) = 1; - break; - } - case OP_JMPNE: { - top -= 2; - if (!luaO_equalObj(top, top+1)) dojump(pc, i); - break; - } - case OP_JMPEQ: { - top -= 2; - if (luaO_equalObj(top, top+1)) dojump(pc, i); - break; - } - case OP_JMPLT: { - top -= 2; - if (luaV_lessthan(L, top, top+1, top+2)) dojump(pc, i); - break; - } - case OP_JMPLE: { /* a <= b === !(b<a) */ - top -= 2; - if (!luaV_lessthan(L, top+1, top, top+2)) dojump(pc, i); - break; - } - case OP_JMPGT: { /* a > b === (b<a) */ - top -= 2; - if (luaV_lessthan(L, top+1, top, top+2)) dojump(pc, i); - break; - } - case OP_JMPGE: { /* a >= b === !(a<b) */ - top -= 2; - if (!luaV_lessthan(L, top, top+1, top+2)) dojump(pc, i); - break; - } - case OP_JMPT: { - if (ttype(--top) != LUA_TNIL) dojump(pc, i); - break; - } - case OP_JMPF: { - if (ttype(--top) == LUA_TNIL) dojump(pc, i); - break; - } - case OP_JMPONT: { - if (ttype(top-1) == LUA_TNIL) top--; - else dojump(pc, i); - break; - } - case OP_JMPONF: { - if (ttype(top-1) != LUA_TNIL) top--; - else dojump(pc, i); - break; - } - case OP_JMP: { - dojump(pc, i); - break; - } - case OP_PUSHNILJMP: { - ttype(top++) = LUA_TNIL; - pc++; - break; - } - case OP_FORPREP: { - if (tonumber(top-1)) - lua_error(L, "`for' step must be a number"); - if (tonumber(top-2)) - lua_error(L, "`for' limit must be a number"); - if (tonumber(top-3)) - lua_error(L, "`for' initial value must be a number"); - if (nvalue(top-1) > 0 ? - nvalue(top-3) > nvalue(top-2) : - nvalue(top-3) < nvalue(top-2)) { /* `empty' loop? */ - top -= 3; /* remove control variables */ - dojump(pc, i); /* jump to loop end */ - } - break; - } - case OP_FORLOOP: { - LUA_ASSERT(ttype(top-1) == LUA_TNUMBER, "invalid step"); - LUA_ASSERT(ttype(top-2) == LUA_TNUMBER, "invalid limit"); - if (ttype(top-3) != LUA_TNUMBER) - lua_error(L, "`for' index must be a number"); - nvalue(top-3) += nvalue(top-1); /* increment index */ - if (nvalue(top-1) > 0 ? - nvalue(top-3) > nvalue(top-2) : - nvalue(top-3) < nvalue(top-2)) - top -= 3; /* end loop: remove control variables */ - else - dojump(pc, i); /* repeat loop */ - break; - } - case OP_LFORPREP: { - Node *node; - if (ttype(top-1) != LUA_TTABLE) - lua_error(L, "`for' table must be a table"); - node = luaH_next(L, hvalue(top-1), &luaO_nilobject); - if (node == NULL) { /* `empty' loop? */ - top--; /* remove table */ - dojump(pc, i); /* jump to loop end */ - } - else { - top += 2; /* index,value */ - *(top-2) = *key(node); - *(top-1) = *val(node); - } - break; - } - case OP_LFORLOOP: { - Node *node; - LUA_ASSERT(ttype(top-3) == LUA_TTABLE, "invalid table"); - node = luaH_next(L, hvalue(top-3), top-2); - if (node == NULL) /* end loop? */ - top -= 3; /* remove table, key, and value */ - else { - *(top-2) = *key(node); - *(top-1) = *val(node); - dojump(pc, i); /* repeat loop */ - } - break; - } - case OP_CLOSURE: { - L->top = top; - luaV_Lclosure(L, tf->kproto[GETARG_A(i)], GETARG_B(i)); - top = L->top; - luaC_checkGC(L); - break; - } - } - } -} diff --git a/src/lua/lvm.h b/src/lua/lvm.h deleted file mode 100644 index ac95ae41..00000000 --- a/src/lua/lvm.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -** $Id: lvm.h,v 1.3 2001/11/26 23:00:26 darkgod Exp $ -** Lua virtual machine -** See Copyright Notice in lua.h -*/ - -#ifndef lvm_h -#define lvm_h - - -#include "ldo.h" -#include "lobject.h" -#include "ltm.h" - - -#define tonumber(o) ((ttype(o) != LUA_TNUMBER) && (luaV_tonumber(o) != 0)) -#define tostring(L,o) ((ttype(o) != LUA_TSTRING) && (luaV_tostring(L, o) != 0)) - - -int luaV_tonumber (TObject *obj); -int luaV_tostring (lua_State *L, TObject *obj); -const TObject *luaV_gettable (lua_State *L, StkId t); -void luaV_settable (lua_State *L, StkId t, StkId key); -const TObject *luaV_getglobal (lua_State *L, TString *s); -void luaV_setglobal (lua_State *L, TString *s); -StkId luaV_execute (lua_State *L, const Closure *cl, StkId base); -void luaV_Cclosure (lua_State *L, lua_CFunction c, int nelems); -void luaV_Lclosure (lua_State *L, Proto *l, int nelems); -int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r, StkId top); -void luaV_strconc (lua_State *L, int total, StkId top); - -#endif diff --git a/src/lua/lzio.c b/src/lua/lzio.c deleted file mode 100644 index 84d4a35c..00000000 --- a/src/lua/lzio.c +++ /dev/null @@ -1,84 +0,0 @@ -/* -** $Id: lzio.c,v 1.5 2004/06/04 13:42:10 neil Exp $ -** a generic input stream interface -** See Copyright Notice in lua.h -*/ - - - -#include <stdio.h> -#include <string.h> - -#include "lua.h" - -#include "lzio.h" - - - -/* ----------------------------------------------------- memory buffers --- */ - -static int zmfilbuf (ZIO* z) { - (void)z; /* to avoid warnings */ - return EOZ; -} - - -ZIO* zmopen (ZIO* z, const char* b, size_t size, const char *name) { - if (b==NULL) return NULL; - z->n = size; - z->p = (const unsigned char *)b; - z->filbuf = zmfilbuf; - z->u = NULL; - z->name = name; - return z; -} - -/* ------------------------------------------------------------ strings --- */ - -ZIO* zsopen (ZIO* z, const char* s, const char *name) { - if (s==NULL) return NULL; - return zmopen(z, s, strlen(s), name); -} - -/* -------------------------------------------------------------- FILEs --- */ - -static int zffilbuf (ZIO* z) { - size_t n; - if (feof((FILE *)z->u)) return EOZ; - n = fread(z->buffer, 1, ZBSIZE, (FILE *)z->u); - if (n==0) return EOZ; - z->n = n-1; - z->p = z->buffer; - return *(z->p++); -} - - -ZIO* zFopen (ZIO* z, FILE* f, const char *name) { - if (f==NULL) return NULL; - z->n = 0; - z->p = z->buffer; - z->filbuf = zffilbuf; - z->u = f; - z->name = name; - return z; -} - - -/* --------------------------------------------------------------- read --- */ -size_t zread (ZIO *z, void *b, size_t n) { - while (n) { - size_t m; - if (z->n == 0) { - if (z->filbuf(z) == EOZ) - return n; /* return number of missing bytes */ - zungetc(z); /* put result from `filbuf' in the buffer */ - } - m = (n <= z->n) ? n : z->n; /* min. between n and z->n */ - memcpy(b, z->p, m); - z->n -= m; - z->p += m; - b = (char *)b + m; - n -= m; - } - return 0; -} diff --git a/src/lua/lzio.h b/src/lua/lzio.h deleted file mode 100644 index 45feeee3..00000000 --- a/src/lua/lzio.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -** $Id: lzio.h,v 1.5 2004/06/04 13:42:10 neil Exp $ -** Buffered streams -** See Copyright Notice in lua.h -*/ - - -#ifndef lzio_h -#define lzio_h - -#include <stdio.h> - - - -/* For Lua only */ -#define zFopen luaZ_Fopen -#define zsopen luaZ_sopen -#define zmopen luaZ_mopen -#define zread luaZ_read - -#define EOZ (-1) /* end of stream */ - -typedef struct zio ZIO; - -ZIO* zFopen (ZIO* z, FILE* f, const char *name); /* open FILEs */ -ZIO* zsopen (ZIO* z, const char* s, const char *name); /* string */ -ZIO* zmopen (ZIO* z, const char* b, size_t size, const char *name); /* memory */ - -size_t zread (ZIO* z, void* b, size_t n); /* read next n bytes */ - -#define zgetc(z) (((z)->n--)>0 ? ((int)*(z)->p++): (z)->filbuf(z)) -#define zungetc(z) (++(z)->n,--(z)->p) -#define zname(z) ((z)->name) - - - -/* --------- Private Part ------------------ */ - -#ifndef ZBSIZE -#define ZBSIZE 256 /* buffer size */ -#endif - -struct zio { - size_t n; /* bytes still unread */ - const unsigned char* p; /* current position in buffer */ - int (*filbuf)(ZIO* z); - void* u; /* additional data */ - const char *name; - unsigned char buffer[ZBSIZE]; /* buffer */ -}; - - -#endif diff --git a/src/lua/module.lua b/src/lua/module.lua deleted file mode 100644 index 98dffe6e..00000000 --- a/src/lua/module.lua +++ /dev/null @@ -1,69 +0,0 @@ --- tolua: module class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: module.lua,v 1.2 2001/11/26 23:00:26 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - - --- Module class --- Represents module. --- The following fields are stored: --- {i} = list of objects in the module. -classModule = { - _base = classContainer, - type = 'module' -} -settag(classModule,tolua_tag) - --- register module -function classModule:register () - output(' tolua_module(tolua_S,"'..self.name..'");') - local i=1 - while self[i] do - self[i]:register() - i = i+1 - end -end - --- unregister module -function classModule:unregister () - output(' lua_pushnil(tolua_S); lua_setglobal(tolua_S,"'..self.name..'");') -end - --- Print method -function classModule:print (ident,close) - print(ident.."Module{") - print(ident.." name = '"..self.name.."';") - local i=1 - while self[i] do - self[i]:print(ident.." ",",") - i = i+1 - end - print(ident.."}"..close) -end - --- Internal constructor -function _Module (t) - t._base = classModule - settag(t,tolua_tag) - append(t) - return t -end - --- Constructor --- Expects two string representing the module name and body. -function Module (n,b) - local t = _Module(_Container{name=n}) - push(t) - t:parse(strsub(b,2,strlen(b)-1)) -- eliminate braces - pop() - return t -end - - diff --git a/src/lua/operator.lua b/src/lua/operator.lua deleted file mode 100644 index 7a42cf1b..00000000 --- a/src/lua/operator.lua +++ /dev/null @@ -1,111 +0,0 @@ --- tolua: operator class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: operator.lua,v 1.2 2001/11/26 23:00:27 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - --- Operator class --- Represents an operator function or a class operator method. --- It stores the same fields as functions do plus: --- kind = set of character representing the operator (as it appers in C++ code) -classOperator = { - kind = '', - _base = classFunction, -} -settag(classOperator,tolua_tag) - --- table to transform operator kind into the appropriate tag method name -_TM = {['+'] = 'operator_add', - ['-'] = 'operator_sub', - ['*'] = 'operator_mul', - ['/'] = 'operator_div', - ['<'] = 'operator_lt', - ['[]'] = 'operator_get', - ['&[]'] = 'operator_set', - } - - --- Print method -function classOperator:print (ident,close) - print(ident.."Operator{") - print(ident.." kind = '"..self.kind.."',") - print(ident.." mod = '"..self.mod.."',") - print(ident.." type = '"..self.type.."',") - print(ident.." ptr = '"..self.ptr.."',") - print(ident.." name = '"..self.name.."',") - print(ident.." const = '"..self.const.."',") - print(ident.." cname = '"..self.cname.."',") - print(ident.." lname = '"..self.lname.."',") - print(ident.." args = {") - local i=1 - while self.args[i] do - self.args[i]:print(ident.." ",",") - i = i+1 - end - print(ident.." }") - print(ident.."}"..close) -end - --- Internal constructor -function _Operator (t) - t._base = classOperator - settag(t,tolua_tag) - - if t.const ~= 'const' and t.const ~= '' then - error("#invalid 'const' specification") - end - - append(t) - if not t:inclass() then - error("#operator can only be defined as class member") - end - - t.cname = t:cfuncname("toluaI")..t:overload(t) - t.name = t.name..t.kind - return t -end - --- Constructor --- Expects three strings: one representing the function declaration, --- another representing the argument list, and the third representing --- the "const" or empty string. -function Operator (d,k,a,c) - local t = split(strsub(a,2,strlen(a)-1),',') -- eliminate braces - local i=1 - local l = {n=0} - while t[i] do - l.n = l.n+1 - l[l.n] = Declaration(t[i],'var') - i = i+1 - end - if k == '[]' then - d = gsub(d,'&','') - elseif k=='&[]' then - l.n = l.n+1 - l[l.n] = Declaration(d,'var') - l[l.n].name = 'toluaI_value' - end - local f = Declaration(d,'func') - if k == '[]' and (l[1]==nil or isbasic(l[1].type)~='number') then - error('operator[] can only be defined for numeric index.') - end - f.args = l - f.const = c - f.kind = gsub(k,"%s","") - f.lname = _TM[f.kind] - if not f.lname then - error("tolua: no support for operator" .. f.kind) - end - if f.kind == '[]' and not strfind(f.mod,'const') then - Operator(d,'&'..k,a,c) -- create correspoding set operator - end - return _Operator(f) -end - - diff --git a/src/lua/package.lua b/src/lua/package.lua deleted file mode 100644 index 42dbfaac..00000000 --- a/src/lua/package.lua +++ /dev/null @@ -1,222 +0,0 @@ --- tolua: package class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: package.lua,v 1.4 2002/01/03 13:45:08 takkaria Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - - --- Package class --- Represents the whole package being bound. --- The following fields are stored: --- {i} = list of objects in the package. -classPackage = { - _base = classContainer, - type = 'package' -} -settag(classPackage,tolua_tag) - --- Print method -function classPackage:print () - print("Package: "..self.name) - local i=1 - while self[i] do - self[i]:print("","") - i = i+1 - end -end - -function classPackage:preprocess () - self.code = "\n"..self.code -- add a blank sentinel line - -- avoid preprocessing verbatim lines - local V = {} - self.code = gsub(self.code,"\n(%s*%$[^%[%]][^\n]*)",function (v) - tinsert(%V,v) - return "\n$"..getn(%V).."$" - end) - -- avoid preprocessing embedded lua code - local C = {} - self.code = gsub(self.code,"\n%s*%$%[","\1") -- deal with embedded Lua code - self.code = gsub(self.code,"\n%s*%$%]","\2") - self.code = gsub(self.code,"(%b\1\2)", function (c) - tinsert(%C,c) - return "\n$["..getn(%C).."]$" - end) - -- perform global substitution - - self.code = gsub(self.code,"(//[^\n]*)","") -- eliminate C++ comments - self.code = gsub(self.code,"/%*","\1") - self.code = gsub(self.code,"%*/","\2") - self.code = gsub(self.code,"%b\1\2","") - self.code = gsub(self.code,"\1","/%*") - self.code = gsub(self.code,"\2","%*/") - self.code = gsub(self.code,"%s*@%s*","@") -- eliminate spaces beside @ - self.code = gsub(self.code,"%s?inline(%s)","%1") -- eliminate 'inline' keyword - self.code = gsub(self.code,"%s?extern(%s)","%1") -- eliminate 'extern' keyword - self.code = gsub(self.code,"%s?virtual(%s)","%1") -- eliminate 'virtual' keyword - self.code = gsub(self.code,"public:","") -- eliminate 'public:' keyword - self.code = gsub(self.code,"([^%w_])void%s*%*","%1_userdata ") -- substitute 'void*' - self.code = gsub(self.code,"([^%w_])void%s*%*","%1_userdata ") -- substitute 'void*' - self.code = gsub(self.code,"([^%w_])char%s*%*","%1_cstring ") -- substitute 'char*' - - -- restore embedded code - self.code = gsub(self.code,"%$%[(%d+)%]%$",function (n) - return %C[tonumber(n)] - end) - -- restore verbatim lines - self.code = gsub(self.code,"%$(%d+)%$",function (n) - return %V[tonumber(n)] - end) -end - --- translate verbatim -function classPackage:preamble () - output('/*\n') - output('** Lua binding: '..self.name..'\n') - output('** Generated automatically by '..TOLUA_VERSION..'\n') - output('*/\n\n') - - output('#include "lua/tolua.h"\n\n') - - if not flags.h then - output('/* Exported function */') - output('int tolua_'..self.name..'_open (lua_State* tolua_S);') - output('void tolua_'..self.name..'_close (lua_State* tolua_S);') - output('\n') - end - - local i=1 - while self[i] do - self[i]:preamble() - i = i+1 - end - output('\n') - output('/* function to register type */') - output('static void toluaI_reg_types (lua_State* tolua_S)') - output('{') - foreach(_usertype,function(n,v) output(' tolua_usertype(tolua_S,"',v,'");') end) - output('}') - output('\n') - - output('/* error messages */') - output('#define TOLUA_ERR_SELF tolua_error(tolua_S,\"invalid \'self\'\")') - output('#define TOLUA_ERR_ASSIGN tolua_error(tolua_S,\"#vinvalid type in variable assignment.\")') - output('\n') -end - --- register package --- write package open function -function classPackage:register () - output("/* Open function */") - output("int tolua_"..self.name.."_open (lua_State* tolua_S)") - output("{") - output(" tolua_open(tolua_S);") - output(" toluaI_reg_types(tolua_S);") - local i=1 - while self[i] do - self[i]:register() - i = i+1 - end - output(" return 1;") - output("}") -end - --- unregister package --- write package close function -function classPackage:unregister () - output("/* Close function */") - output("void tolua_"..self.name.."_close (lua_State* tolua_S)") - output("{") - local i=1 - while self[i] do - self[i]:unregister() - i = i+1 - end - output("}") -end - --- write header file -function classPackage:header () - output('/*\n') output('** Lua binding: '..self.name..'\n') - output('** Generated automatically by '..TOLUA_VERSION..'.\n') - output('*/\n\n') - - if not flags.h then - output('/* Exported function */') - output('int tolua_'..self.name..'_open (lua_State* tolua_S);') - output('void tolua_'..self.name..'_close (lua_State* tolua_S);') - output('\n') - end -end - --- Internal constructor -function _Package (t) - t._base = classPackage - settag(t,tolua_tag) - return t -end - --- Constructor --- Expects the base file name. --- It assumes the file has extension ".pkg". -function Package (name) - -- read file - local code = read("*a") - code = "\n" .. code -- add sentinel - -- deal with include directive - local nsubst - repeat - code,nsubst = gsub(code,"\n%s*%$<(.-)>%s*\n",function (fn) - local fp,msg = openfile(fn,'r') - if not fp then - error('#'..msg..': '..fn) - end - local s = read(fp,'*a') - closefile(fp) - return "\n" .. s - end) - until nsubst==0 - - -- deal with include directive for C/C++ header files - local nsubst - repeat - code,nsubst = - gsub(code,"\n%s*%${(.-)}%s*\n", - function (fn) - local fp,msg = openfile(fn,'r') - if not fp then - error('#'..msg..': '..fn) - end - local s = read(fp,'*a') - closefile(fp) - -- extract marked code - local T = {code="\n"} - s= "\n" .. s .. "\n" -- add blank lines as sentinels - -- extract one-line statments - gsub(s,"\n(.-)[Tt][Oo][Ll][Uu][Aa]_[Ee][Xx][Pp][Oo][Rr][Tt][^\n]*\n", - function (c) %T.code = %T.code .. c .. "\n" end - ) - -- extract multiline statments - gsub(s,"\n[^\n]*[Tt][Oo][Ll][Uu][Aa]_[Bb][Ee][Gg][Ii][Nn][^\n]*".. - "(.-)" .. - "\n[^\n]*[Tt][Oo][Ll][Uu][Aa]_[Ee][Nn][Dd][^\n]*\n", - function (c) %T.code = %T.code .. c .. "\n" end - ) - return T.code - end) - until nsubst==0 - - local t = _Package(_Container{name=name, code=code}) - push(t) - t:preprocess() - t:parse(t.code) - pop() - return t -end - - diff --git a/src/lua/print.h b/src/lua/print.h deleted file mode 100644 index 49f4c4cb..00000000 --- a/src/lua/print.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -** $Id: print.h,v 1.2 2001/11/26 23:00:27 darkgod Exp $ -** extracted automatically from lopcodes.h by mkprint.lua -- DO NOT EDIT -** See Copyright Notice in lua.h -*/ - - case OP_END: P_OP("END"); P_NONE; break; - case OP_RETURN: P_OP("RETURN"); P_U; break; - case OP_CALL: P_OP("CALL"); P_AB; break; - case OP_TAILCALL: P_OP("TAILCALL"); P_AB; break; - case OP_PUSHNIL: P_OP("PUSHNIL"); P_U; break; - case OP_POP: P_OP("POP"); P_U; break; - case OP_PUSHINT: P_OP("PUSHINT"); P_S; break; - case OP_PUSHSTRING: P_OP("PUSHSTRING"); P_Q; break; - case OP_PUSHNUM: P_OP("PUSHNUM"); P_N; break; - case OP_PUSHNEGNUM: P_OP("PUSHNEGNUM"); P_N; break; - case OP_PUSHUPVALUE: P_OP("PUSHUPVALUE"); P_U; break; - case OP_GETLOCAL: P_OP("GETLOCAL"); P_L; break; - case OP_GETGLOBAL: P_OP("GETGLOBAL"); P_K; break; - case OP_GETTABLE: P_OP("GETTABLE"); P_NONE; break; - case OP_GETDOTTED: P_OP("GETDOTTED"); P_K; break; - case OP_GETINDEXED: P_OP("GETINDEXED"); P_L; break; - case OP_PUSHSELF: P_OP("PUSHSELF"); P_K; break; - case OP_CREATETABLE: P_OP("CREATETABLE"); P_U; break; - case OP_SETLOCAL: P_OP("SETLOCAL"); P_L; break; - case OP_SETGLOBAL: P_OP("SETGLOBAL"); P_K; break; - case OP_SETTABLE: P_OP("SETTABLE"); P_AB; break; - case OP_SETLIST: P_OP("SETLIST"); P_AB; break; - case OP_SETMAP: P_OP("SETMAP"); P_U; break; - case OP_ADD: P_OP("ADD"); P_NONE; break; - case OP_ADDI: P_OP("ADDI"); P_S; break; - case OP_SUB: P_OP("SUB"); P_NONE; break; - case OP_MULT: P_OP("MULT"); P_NONE; break; - case OP_DIV: P_OP("DIV"); P_NONE; break; - case OP_POW: P_OP("POW"); P_NONE; break; - case OP_CONCAT: P_OP("CONCAT"); P_U; break; - case OP_MINUS: P_OP("MINUS"); P_NONE; break; - case OP_NOT: P_OP("NOT"); P_NONE; break; - case OP_JMPNE: P_OP("JMPNE"); P_J; break; - case OP_JMPEQ: P_OP("JMPEQ"); P_J; break; - case OP_JMPLT: P_OP("JMPLT"); P_J; break; - case OP_JMPLE: P_OP("JMPLE"); P_J; break; - case OP_JMPGT: P_OP("JMPGT"); P_J; break; - case OP_JMPGE: P_OP("JMPGE"); P_J; break; - case OP_JMPT: P_OP("JMPT"); P_J; break; - case OP_JMPF: P_OP("JMPF"); P_J; break; - case OP_JMPONT: P_OP("JMPONT"); P_J; break; - case OP_JMPONF: P_OP("JMPONF"); P_J; break; - case OP_JMP: P_OP("JMP"); P_J; break; - case OP_PUSHNILJMP: P_OP("PUSHNILJMP"); P_NONE; break; - case OP_FORPREP: P_OP("FORPREP"); P_J; break; - case OP_FORLOOP: P_OP("FORLOOP"); P_J; break; - case OP_LFORPREP: P_OP("LFORPREP"); P_J; break; - case OP_LFORLOOP: P_OP("LFORLOOP"); P_J; break; - case OP_CLOSURE: P_OP("CLOSURE"); P_F; break; diff --git a/src/lua/tolua.c b/src/lua/tolua.c deleted file mode 100644 index 3cb09291..00000000 --- a/src/lua/tolua.c +++ /dev/null @@ -1,149 +0,0 @@ -/* tolua -** Support code for Lua bindings. -** Written by Waldemar Celes -** TeCGraf/PUC-Rio -** Jul 1998 -** $Id: tolua.c,v 1.4 2004/06/04 13:42:10 neil Exp $ -*/ - -/* This code is free software; you can redistribute it and/or modify it. -** The software provided hereunder is on an "as is" basis, and -** the author has no obligation to provide maintenance, support, updates, -** enhancements, or modifications. -*/ - -#include "tolua.h" -#include "lua.h" -#include "lualib.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -static void help (void) -{ - fprintf(stderr,"\n" - "usage: tolua [options] input_file\n" - "\n" - "Command line options are:\n" - " -v : print version information.\n" - " -o file : set output file; default is stdout.\n" - " -H file : create include file.\n" - " -n name : set package name; default is input file root name.\n" - " -p : parse only.\n" - " -P : parse and print structure information (for debug).\n" - " -h : print this message.\n" - "Should the input file be omitted, stdin is assumed;\n" - "in that case, the package name must be explicitly set.\n\n" - ); -} - -static void version (void) -{ - fprintf(stderr, "%s (written by W. Celes)\n",TOLUA_VERSION); -} - -static void setfield (lua_State* L, int table, char* f, char* v) -{ - lua_pushstring(L,f); - lua_pushstring(L,v); - lua_settable(L,table); -} - -static void error (char* o) -{ - fprintf(stderr,"tolua: unknown option '%s'\n",o); - help(); - exit(1); -} - -int main (int argc, char* argv[]) -{ - lua_State* L = lua_open(0); - lua_baselibopen(L); - lua_iolibopen(L); - lua_strlibopen(L); - lua_pushstring(L,TOLUA_VERSION); lua_setglobal(L,"TOLUA_VERSION"); - - if (argc==1) - { - help(); - return 0; - } - else - { - int i, t; - lua_newtable(L); - lua_pushvalue(L,-1); - lua_setglobal(L,"flags"); - t = lua_gettop(L); - for (i=1; i<argc; ++i) - { - if (*argv[i] == '-') - { - switch (argv[i][1]) - { - case 'v': version(); return 0; - case 'h': help(); return 0; - case 'p': setfield(L,t,"p",""); break; - case 'P': setfield(L,t,"P",""); break; - case 'o': setfield(L,t,"o",argv[++i]); break; - case 'n': setfield(L,t,"n",argv[++i]); break; - case 'H': setfield(L,t,"H",argv[++i]); break; - default: error(argv[i]); break; - } - } - else - { - setfield(L,t,"f",argv[i]); - break; - } - } - lua_pop(L,1); - } - -#if 1 - { - int tolua_tolualua_open(lua_State* L); - tolua_tolualua_open(L); - } -#else - { - int i; - char* p; - char path[BUFSIZ]; - char* files[] = { - "basic.lua", - "feature.lua", - "verbatim.lua", - "code.lua", - "typedef.lua", - "container.lua", - "package.lua", - "module.lua", - "define.lua", - "enumerate.lua", - "declaration.lua", - "variable.lua", - "array.lua", - "function.lua", - "operator.lua", - "class.lua", - "clean.lua", - "doit.lua", - NULL - }; - strcpy(path,argv[0]); - p = strrchr(path,'/'); - p = (p==NULL) ? path : p+1; - for (i=0; files[i]; ++i) - { - sprintf(p,"%s",files[i]); - lua_dofile(L,path); - } - } - -#endif - return 0; -} diff --git a/src/lua/tolua.h b/src/lua/tolua.h deleted file mode 100644 index ab86976c..00000000 --- a/src/lua/tolua.h +++ /dev/null @@ -1,127 +0,0 @@ -/* tolua - Support code for Lua bindings. -** Written by Waldemar Celes (celes@tecgraf.puc-rio.br) -** TeCGraf/PUC-Rio -** http://www.tecgraf.puc-rio.br/~celes/tolua -** Jul 1998 -** $Id: tolua.h,v 1.2 2001/11/26 23:00:27 darkgod Exp $ -*/ - -/* This code is free software; you can redistribute it and/or modify it. -** The software provided hereunder is on an "as is" basis, and -** the author has no obligation to provide maintenance, support, updates, -** enhancements, or modifications. -*/ - - -#ifndef tolua_h -#define tolua_h - -#define TOLUA_VERSION "tolua 4.0a - angband" - - -#include <stdlib.h> /* NULL, malloc, free */ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "lua.h" - -/* Evil hack for C++ bool_ vs. C bool. */ -#ifndef __cplusplus -typedef unsigned char bool; -#endif - -/*************************************** Exported functions */ - -int tolua_open (lua_State* L); -void tolua_using (lua_State* L, int module); -void tolua_class (lua_State* L, int derived, int base); -void tolua_instance (lua_State* L, int instance, int classobj); -void tolua_foreach (lua_State* L, int lo, int f); -int tolua_tag (lua_State* L, char* type); -const char* tolua_type (lua_State* L, int lo); -int tolua_base (lua_State* L, int lo); -int tolua_cast (lua_State* L, int lo, char* type); -void tolua_takeownership (lua_State* L, int lo); - - - -/*************************************** Support functions for binding code */ - -#define LUA_VALUE int -#define LUA_NIL 0 /* TODO */ -/*#define TOLUA_NIL (lua_pushnil(),lua_pop())*/ - -/* Register functions */ -void tolua_globalvar (lua_State* L, char* name, lua_CFunction get, lua_CFunction set); -void tolua_globalarray (lua_State* L, char* name, lua_CFunction get, lua_CFunction set); -void tolua_module (lua_State* L, char* name); -void tolua_cclass (lua_State* L, char* name, char* base); -void tolua_function (lua_State* L, char* parent, char* name, lua_CFunction func); -void tolua_constant (lua_State* L, char* parent, char* name, long value); -void tolua_tablevar -(lua_State* L, char* table, char* name, lua_CFunction get, lua_CFunction set); -void tolua_tablearray -(lua_State* L, char* table, char* name, lua_CFunction get, lua_CFunction set); - - -/* Get and push functions */ -long tolua_getnumber (lua_State* L, int narg, long def); -const char* tolua_getstring (lua_State* L, int narg, const char* def); -void* tolua_getuserdata (lua_State* L, int narg, void* def); -void* tolua_getusertype (lua_State* L, int narg, void* def); -int tolua_getvalue (lua_State* L, int narg, int def); -int tolua_getbool (lua_State* L, int narg, int def); -long tolua_getfieldnumber (lua_State* L, int lo, int index, long def); -const char* tolua_getfieldstring (lua_State* L, int lo, int index, const char* def); -void* tolua_getfielduserdata (lua_State* L, int lo, int index, void* def); -void* tolua_getfieldusertype (lua_State* L, int lo, int index, void* def); -int tolua_getfieldvalue (lua_State* L, int lo, int index, int def); -int tolua_getfieldbool (lua_State* L, int lo, int index, int def); - -void tolua_pushnumber (lua_State* L, long value); -void tolua_pushstring (lua_State* L, const char* value); -void tolua_pushuserdata (lua_State* L, void* value); -void tolua_pushusertype (lua_State* L, void* value, int tag); -void tolua_pushvalue (lua_State* L, int lo); -void tolua_pushbool (lua_State* L, int value); -void tolua_pushfieldnumber (lua_State* L, int lo, int index, long v); -void tolua_pushfieldstring (lua_State* L, int lo, int index, char* v); -void tolua_pushfielduserdata (lua_State* L, int lo, int index, void* v); -void tolua_pushfieldusertype (lua_State* L, int lo, int index, void* v, int tag); -void tolua_pushfieldvalue (lua_State* L, int lo, int index, int v); -void tolua_pushfieldbool (lua_State* L, int lo, int index, int v); - - -/* Type & tag manipulation */ -void tolua_usertype (lua_State* L, char* type); -#if 0 -void tolua_settag (lua_State* L, char* type, int* tag); -#endif -int tolua_istype (lua_State* L, int narg, int tag, int dim); -int tolua_arrayistype (lua_State* L, int narg, int tag, int dim, int def); - -int tolua_isnoobj (lua_State* L, int narg); - -/* Tag method manipulation */ -void* tolua_doclone (lua_State* L, void* value, int tag); -void* tolua_copy (lua_State* L, void* value, unsigned int size); - -/* Error handling */ -void tolua_error (lua_State* L, char* msg); - -/* Exported variables */ -extern int tolua_tag_nil; -extern int tolua_tag_number; -extern int tolua_tag_string; -extern int tolua_tag_userdata; -extern int tolua_tag_table; -extern int tolua_tag_function; - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/src/lua/tolua_bd.c b/src/lua/tolua_bd.c deleted file mode 100644 index d36a5ce9..00000000 --- a/src/lua/tolua_bd.c +++ /dev/null @@ -1,214 +0,0 @@ -/* -** Lua binding: tolua -** Generated automatically by tolua 4.0b on Tue Nov 14 14:18:50 2000. -*/ - -#include "tolua.h" - -/* Exported function */ -int tolua_tolua_open (lua_State* tolua_S); -void tolua_tolua_close (lua_State* tolua_S); - -#define tolua_using(module) (tolua_using)(tolua_S,module) -#define tolua_type(lo) (tolua_type)(tolua_S,lo) -#define tolua_foreach(lo,f) (tolua_foreach)(tolua_S,lo,f) -#define tolua_class(derived,base) (tolua_class)(tolua_S,derived,base) -#define tolua_instance(inst,cobj) (tolua_instance)(tolua_S,inst,cobj) -#define tolua_base(lo) (tolua_base)(tolua_S,lo) -#define tolua_cast(lo,type) (tolua_cast)(tolua_S,lo,type) -#define tolua_takeownership(lo) (tolua_takeownership)(tolua_S,lo) - -/* function to register type */ -static void toluaI_reg_types (lua_State* tolua_S) -{ -} - -/* function: tolua_using */ -static int toluaI_tolua_tolua_using00(lua_State* tolua_S) -{ - if ( - !tolua_isnoobj(tolua_S,2) - ) - goto tolua_lerror; - else - { - LUA_VALUE module = ((LUA_VALUE) tolua_getvalue(tolua_S,1,0)); - { - tolua_using(module); - } - } - return 0; -tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'using'."); - return 0; -} - -/* function: tolua_type */ -static int toluaI_tolua_tolua_type00(lua_State* tolua_S) -{ - if ( - !tolua_isnoobj(tolua_S,2) - ) - goto tolua_lerror; - else - { - LUA_VALUE lo = ((LUA_VALUE) tolua_getvalue(tolua_S,1,0)); - { - char* toluaI_ret = (char*) tolua_type(lo); - tolua_pushstring(tolua_S,toluaI_ret); - } - } - return 1; -tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'type'."); - return 0; -} - -/* function: tolua_foreach */ -static int toluaI_tolua_tolua_foreach00(lua_State* tolua_S) -{ - if ( - !tolua_isnoobj(tolua_S,3) - ) - goto tolua_lerror; - else - { - LUA_VALUE lo = ((LUA_VALUE) tolua_getvalue(tolua_S,1,0)); - LUA_VALUE f = ((LUA_VALUE) tolua_getvalue(tolua_S,2,0)); - { - tolua_foreach(lo,f); - } - } - return 0; -tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'foreach'."); - return 0; -} - -/* function: tolua_class */ -static int toluaI_tolua_tolua_class00(lua_State* tolua_S) -{ - if ( - !tolua_isnoobj(tolua_S,3) - ) - goto tolua_lerror; - else - { - LUA_VALUE derived = ((LUA_VALUE) tolua_getvalue(tolua_S,1,0)); - LUA_VALUE base = ((LUA_VALUE) tolua_getvalue(tolua_S,2,0)); - { - tolua_class(derived,base); - } - } - return 0; -tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'class'."); - return 0; -} - -/* function: tolua_instance */ -static int toluaI_tolua_tolua_instance00(lua_State* tolua_S) -{ - if ( - !tolua_isnoobj(tolua_S,3) - ) - goto tolua_lerror; - else - { - LUA_VALUE instance = ((LUA_VALUE) tolua_getvalue(tolua_S,1,0)); - LUA_VALUE classobj = ((LUA_VALUE) tolua_getvalue(tolua_S,2,0)); - { - tolua_instance(instance,classobj); - } - } - return 0; -tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'instance'."); - return 0; -} - -/* function: tolua_base */ -static int toluaI_tolua_tolua_base00(lua_State* tolua_S) -{ - if ( - !tolua_isnoobj(tolua_S,2) - ) - goto tolua_lerror; - else - { - LUA_VALUE lo = ((LUA_VALUE) tolua_getvalue(tolua_S,1,0)); - { - LUA_VALUE toluaI_ret = (LUA_VALUE) tolua_base(lo); - tolua_pushvalue(tolua_S,toluaI_ret); - } - } - return 1; -tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'base'."); - return 0; -} - -/* function: tolua_cast */ -static int toluaI_tolua_tolua_cast00(lua_State* tolua_S) -{ - if ( - !tolua_istype(tolua_S,2,LUA_TSTRING,0) || - !tolua_isnoobj(tolua_S,3) - ) - goto tolua_lerror; - else - { - LUA_VALUE lo = ((LUA_VALUE) tolua_getvalue(tolua_S,1,0)); - char* type = ((char*) tolua_getstring(tolua_S,2,0)); - { - LUA_VALUE toluaI_ret = (LUA_VALUE) tolua_cast(lo,type); - tolua_pushvalue(tolua_S,toluaI_ret); - } - } - return 1; -tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'cast'."); - return 0; -} - -/* function: tolua_takeownership */ -static int toluaI_tolua_tolua_takeownership00(lua_State* tolua_S) -{ - if ( - !tolua_isnoobj(tolua_S,2) - ) - goto tolua_lerror; - else - { - LUA_VALUE lo = ((LUA_VALUE) tolua_getvalue(tolua_S,1,0)); - { - tolua_takeownership(lo); - } - } - return 0; -tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'takeownership'."); - return 0; -} - -/* Open function */ -int tolua_tolua_open (lua_State* tolua_S) -{ - tolua_open(tolua_S); - toluaI_reg_types(tolua_S); - tolua_module(tolua_S,"tolua"); - tolua_function(tolua_S,"tolua","using",toluaI_tolua_tolua_using00); - tolua_function(tolua_S,"tolua","type",toluaI_tolua_tolua_type00); - tolua_function(tolua_S,"tolua","foreach",toluaI_tolua_tolua_foreach00); - tolua_function(tolua_S,"tolua","class",toluaI_tolua_tolua_class00); - tolua_function(tolua_S,"tolua","instance",toluaI_tolua_tolua_instance00); - tolua_function(tolua_S,"tolua","base",toluaI_tolua_tolua_base00); - tolua_function(tolua_S,"tolua","cast",toluaI_tolua_tolua_cast00); - tolua_function(tolua_S,"tolua","takeownership",toluaI_tolua_tolua_takeownership00); - return 1; -} -/* Close function */ -void tolua_tolua_close (lua_State* tolua_S) -{ - lua_pushnil(tolua_S); lua_setglobal(tolua_S,"tolua"); -} diff --git a/src/lua/tolua_eh.c b/src/lua/tolua_eh.c deleted file mode 100644 index 0709cb4c..00000000 --- a/src/lua/tolua_eh.c +++ /dev/null @@ -1,66 +0,0 @@ -/* tolua: error handling -** Support code for Lua bindings. -** Written by Waldemar Celes -** TeCGraf/PUC-Rio -** Jul 1998 -** $Id: tolua_eh.c,v 1.2 2001/11/26 23:00:27 darkgod Exp $ -*/ - -/* This code is free software; you can redistribute it and/or modify it. -** The software provided hereunder is on an "as is" basis, and -** the author has no obligation to provide maintenance, support, updates, -** enhancements, or modifications. -*/ - -#include "tolua.h" -#include "tolua_eh.h" -#include "tolua_rg.h" - -#include <stdio.h> - -/* registry fiels used to hold current error info - - tolua_err_narg: number of wrong argument - - tolua_err_provided: provided type - - tolua_err_expected: expected type -*/ - -void toluaI_eh_set -(lua_State* L, int narg, const char* provided, const char* expected) -{ - lua_pushnumber(L,narg); - toluaI_setregistry(L,"tolua_err_narg"); - lua_pushstring(L,provided); - toluaI_setregistry(L,"tolua_err_provided"); - lua_pushstring(L,expected); - toluaI_setregistry(L,"tolua_err_expected"); -} - -void tolua_error (lua_State* L, char* msg) -{ - if (msg[0]=='#') - { - static char buffer[BUFSIZ]; - const char* err_provided; - const char* err_expected; - toluaI_getregistry(L,"tolua_err_provided"); - err_provided = lua_tostring(L,-1); - toluaI_getregistry(L,"tolua_err_expected"); - err_expected = lua_tostring(L,-1); - lua_pop(L,2); - if (msg[1]=='f') - { - int err_narg; - toluaI_getregistry(L,"tolua_err_narg"); - err_narg = (int)lua_tonumber(L,-1); - lua_pop(L,1); - sprintf(buffer,"%s\n argument #%d is '%s'; '%s' expected.\n", - msg+2,err_narg,err_provided,err_expected); - } - else if (msg[1]=='v') - sprintf(buffer,"%s\n value is '%s'; '%s' expected.\n", - msg+2,err_provided,err_expected); - lua_error(L,buffer); - } - else - lua_error(L,msg); -} diff --git a/src/lua/tolua_eh.h b/src/lua/tolua_eh.h deleted file mode 100644 index 168ba122..00000000 --- a/src/lua/tolua_eh.h +++ /dev/null @@ -1,24 +0,0 @@ -/* tolua: error handling -** Support code for Lua bindings. -** Written by Waldemar Celes -** TeCGraf/PUC-Rio -** Jul 1998 -** $Id: tolua_eh.h,v 1.2 2001/11/26 23:00:27 darkgod Exp $ -*/ - -/* This code is free software; you can redistribute it and/or modify it. -** The software provided hereunder is on an "as is" basis, and -** the author has no obligation to provide maintenance, support, updates, -** enhancements, or modifications. -*/ - - - -#ifndef tolua_eh_h -#define tolua_eh_h - -void toluaI_eh_set -(lua_State* L, int narg, const char* provided, const char* expected); - - -#endif diff --git a/src/lua/tolua_gp.c b/src/lua/tolua_gp.c deleted file mode 100644 index 77ff0c26..00000000 --- a/src/lua/tolua_gp.c +++ /dev/null @@ -1,197 +0,0 @@ -/* tolua: get & push functions. -** Support code for Lua bindings. -** Written by Waldemar Celes -** TeCGraf/PUC-Rio -** Jul 1998 -** $Id: tolua_gp.c,v 1.2 2001/11/26 23:00:27 darkgod Exp $ -*/ - -/* This code is free software; you can redistribute it and/or modify it. -** The software provided hereunder is on an "as is" basis, and -** the author has no obligation to provide maintenance, support, updates, -** enhancements, or modifications. -*/ - -#include "tolua.h" -#include "tolua_tm.h" - -#include <string.h> -#include <stdlib.h> - -long tolua_getnumber (lua_State* L, int narg, long def) -{ - return lua_gettop(L)<abs(narg) ? def : lua_tonumber(L,narg); -} - -const char* tolua_getstring (lua_State* L, int narg, const char* def) -{ - return lua_gettop(L)<abs(narg) ? def : lua_tostring(L,narg); -} - -void* tolua_getuserdata (lua_State* L, int narg, void* def) -{ - return lua_gettop(L)<abs(narg) ? def : lua_touserdata(L,narg); -} - -void* tolua_getusertype (lua_State* L, int narg, void* def) -{ - return lua_gettop(L)<abs(narg) ? def : lua_touserdata(L,narg); -} - -int tolua_getvalue (lua_State* L, int narg, int def) -{ - return lua_gettop(L)<abs(narg) ? def : narg; -} - -int tolua_getbool (lua_State* L, int narg, int def) -{ - return lua_gettop(L)<abs(narg) ? - def : - lua_isnil(L,narg) ? 0 : lua_tonumber(L,narg)!=0; -} - -long tolua_getfieldnumber (lua_State* L, int lo, int index, long def) -{ - long v; - lua_pushnumber(L,index); - lua_gettable(L,lo); - v = lua_isnil(L,-1) ? def : lua_tonumber(L,-1); - lua_pop(L,1); - return v; -} - -const char* tolua_getfieldstring -(lua_State* L, int lo, int index, const char* def) -{ - const char* v; - lua_pushnumber(L,index); - lua_gettable(L,lo); - v = lua_isnil(L,-1) ? def : lua_tostring(L,-1); - lua_pop(L,1); - return v; -} - -void* tolua_getfielduserdata (lua_State* L, int lo, int index, void* def) -{ - void* v; - lua_pushnumber(L,index); - lua_gettable(L,lo); - v = lua_isnil(L,-1) ? def : lua_touserdata(L,-1); - lua_pop(L,1); - return v; -} - -void* tolua_getfieldusertype (lua_State* L, int lo, int index, void* def) -{ - void* v; - lua_pushnumber(L,index); - lua_gettable(L,lo); - v = lua_isnil(L,-1) ? def : lua_touserdata(L,-1); - lua_pop(L,1); - return v; -} - -int tolua_getfieldvalue (lua_State* L, int lo, int index, int def) -{ - int v; - lua_pushnumber(L,index); - lua_gettable(L,lo); - v = lua_isnil(L,-1) ? def : lo; - lua_pop(L,1); - return v; -} - -int tolua_getfieldbool (lua_State* L, int lo, int index, int def) -{ - int v; - lua_pushnumber(L,index); - lua_gettable(L,lo); - v = lua_isnil(L,-1) ? 0 : lua_tonumber(L,-1)!=0; - lua_pop(L,1); - return v; -} - -void tolua_pushnumber (lua_State* L, long value) -{ - lua_pushnumber(L,value); -} - -void tolua_pushstring (lua_State* L, const char* value) -{ - if (value == NULL) - lua_pushnil(L); - else - lua_pushstring(L,value); -} - -void tolua_pushuserdata (lua_State* L, void* value) -{ - if (value == NULL) - lua_pushnil(L); - else - lua_pushuserdata(L,value); -} - -void tolua_pushusertype (lua_State* L, void* value, int tag) -{ - if (value == NULL) - lua_pushnil(L); - else - lua_pushusertag(L,value,tag); -} - -void tolua_pushvalue (lua_State* L, int lo) -{ - lua_pushvalue(L,lo); -} - -void tolua_pushbool (lua_State* L, int value) -{ - if (value) - lua_pushnumber(L,(long)value); - else - lua_pushnil(L); -} - -void tolua_pushfieldnumber (lua_State* L, int lo, int index, long v) -{ - lua_pushnumber(L,index); - tolua_pushnumber(L,v); - lua_settable(L,lo); -} - -void tolua_pushfieldstring (lua_State* L, int lo, int index, char* v) -{ - lua_pushnumber(L,index); - tolua_pushstring(L,v); - lua_settable(L,lo); -} - -void tolua_pushfielduserdata (lua_State* L, int lo, int index, void* v) -{ - lua_pushnumber(L,index); - tolua_pushuserdata(L,v); - lua_settable(L,lo); -} - -void tolua_pushfieldusertype (lua_State* L, int lo, int index, void* v, int tag) -{ - lua_pushnumber(L,index); - tolua_pushusertype(L,v,tag); - lua_settable(L,lo); -} - -void tolua_pushfieldvalue (lua_State* L, int lo, int index, int v) -{ - lua_pushnumber(L,index); - lua_pushvalue(L,v); - lua_settable(L,lo); -} - -void tolua_pushfieldbool (lua_State* L, int lo, int index, int v) -{ - lua_pushnumber(L,index); - tolua_pushbool(L,v); - lua_settable(L,lo); -} - diff --git a/src/lua/tolua_lb.c b/src/lua/tolua_lb.c deleted file mode 100644 index 5fd4c337..00000000 --- a/src/lua/tolua_lb.c +++ /dev/null @@ -1,160 +0,0 @@ -/* tolua -** Support code for Lua bindings. -** Written by Waldemar Celes -** TeCGraf/PUC-Rio -** Jul 1998 -** $Id: tolua_lb.c,v 1.2 2001/11/26 23:00:27 darkgod Exp $ -*/ - -/* This code is free software; you can redistribute it and/or modify it. -** The software provided hereunder is on an "as is" basis, and -** the author has no obligation to provide maintenance, support, updates, -** enhancements, or modifications. -*/ - -#include "tolua.h" -#include "tolua_rg.h" -#include "tolua_tm.h" -#include "tolua_tt.h" - - -int tolua_open (lua_State* L) -{ - int tolua_tolua_open (lua_State* L); - /* check if alread opened */ - toluaI_getregistry(L,"TOLUA"); - if (lua_isnil(L,-1)) - { - lua_pushnumber(L,1); - toluaI_setregistry(L,"TOLUA"); - toluaI_tt_init(L); - toluaI_tm_init(L); - lua_getglobal(L,"foreach"); - toluaI_setregistry(L,"tolua_orig_foreach"); - tolua_tolua_open(L); /* opens tolua own binding */ - } - lua_pop(L,1); - return 1; -} - -void tolua_using (lua_State* L, int module) -{ - toluaI_tm_using(L,module); -} - -void tolua_class (lua_State* L, int derived, int base) -{ - int tag = lua_newtag(L); /* new tag of instances of that class */ - toluaI_tm_setclass(L,derived); - toluaI_tm_linstance(L,tag,derived); - lua_pushvalue(L,derived); - lua_pushstring(L,".base"); - lua_pushvalue(L,base); - lua_rawset(L,-3); - lua_pushstring(L,".itag"); - lua_pushnumber(L,tag); - lua_rawset(L,-3); - lua_pop(L,1); -} - -void tolua_instance (lua_State* L, int instance, int classobj) -{ - int tag; - lua_pushvalue(L,classobj); - lua_pushstring(L,".itag"); - lua_gettable(L,-2); - tag = (int) lua_tonumber(L,-1); - lua_pop(L,2); /* number and table */ - if (tag==0) - tolua_error(L,"unregistered 'classobj' in function 'tolua_instance'."); - lua_pushvalue(L,instance); - lua_settag(L,tag); - lua_pop(L,1); -} - -static int filter (lua_State* L) -{ - int n = 1; /* name */ - int v = 2; /* value */ - int f = lua_gettop(L); /* function */ - /* do not pass string fields starting with a dot */ - if (!lua_isstring(L,n) || *lua_tostring(L,n)!='.') - { - lua_pushvalue(L,f); - lua_pushvalue(L,n); - lua_pushvalue(L,v); - lua_call(L,2,1); - } - else - lua_pushnil(L); - return 1; -} - -void tolua_foreach (lua_State* L, int lo, int f) -{ - if (toluaI_tt_isusertype(L,lo)) - { - toluaI_tm_pushmate(L,lo); - if (lua_isnil(L,-1)) - return; /* no field in mate table */ - else - lo = lua_gettop(L); - } - toluaI_getregistry(L,"tolua_orig_foreach"); - lua_pushvalue(L,lo); - lua_pushvalue(L,f); - lua_pushcclosure(L,filter,1); - lua_call(L,2,1); -} - -const char* tolua_type (lua_State* L, int lo) -{ - return toluaI_tt_getobjtype(L,lo); -} - -int tolua_tag (lua_State* L, char* type) -{ - return toluaI_tt_gettag(L,type); -} - -int tolua_base (lua_State* L, int lo) -{ - if (toluaI_tt_isusertype(L,lo)) - { - toluaI_tm_pushclass(L,lo); - return lua_gettop(L); - } - else if (lua_istable(L,lo)) - { - lua_pushvalue(L,lo); - lua_pushstring(L,".base"); - lua_rawget(L,-2); - return -1; - } - else - return 0; -} - -int tolua_cast (lua_State* L, int lo, char* type) -{ - if (lua_isuserdata(L,lo)) - { - tolua_pushusertype(L,lua_touserdata(L,lo),toluaI_tt_gettag(L,type)); - return -1; - } - else - return 0; -} - -void tolua_takeownership (lua_State* L, int lo) -{ - if (toluaI_tt_isusertype(L,lo)) - { - /* force garbage collection to avoid C to reuse a to-be-collected address */ - lua_setgcthreshold(L,0); - tolua_doclone(L,lua_touserdata(L,lo),lua_tag(L,lo)); - } - else - tolua_error(L,"cannot take ownership of specified obejct."); -} - diff --git a/src/lua/tolua_rg.c b/src/lua/tolua_rg.c deleted file mode 100644 index 4337e9f9..00000000 --- a/src/lua/tolua_rg.c +++ /dev/null @@ -1,243 +0,0 @@ -/* tolua: register functions -** Support code for Lua bindings. -** Written by Waldemar Celes -** TeCGraf/PUC-Rio -** Jul 1998 -** $Id: tolua_rg.c,v 1.2 2001/11/26 23:00:27 darkgod Exp $ -*/ - -/* This code is free software; you can redistribute it and/or modify it. -** The software provided hereunder is on an "as is" basis, and -** the author has no obligation to provide maintenance, support, updates, -** enhancements, or modifications. -*/ - -#include <stdio.h> - -#include "tolua.h" -#include "tolua_rg.h" -#include "tolua_tm.h" -#include "tolua_tt.h" - -void tolua_globalvar (lua_State* L, char* name, lua_CFunction get, lua_CFunction set) -{ - lua_newtable(L); - lua_pushstring(L,".get"); - lua_pushcfunction(L,get); - lua_settable(L,-3); - if (set) - { - lua_pushstring(L,".set"); - lua_pushcfunction(L,set); - lua_settable(L,-3); - } - lua_pushvalue(L,-1); /* duplicate top */ - lua_setglobal(L,name); - toluaI_tm_global(L,lua_gettop(L)); - lua_pop(L,1); -} - -static int toluaI_const_global_array (lua_State* L) -{ - lua_error(L,"value of const array cannot be changed"); - return 0; -} - - -void tolua_globalarray (lua_State* L,char* name, lua_CFunction get, lua_CFunction set) -{ - int tag = lua_newtag(L); - lua_newtable(L); - lua_settag(L,tag); - lua_setglobal(L,name); - - lua_pushcfunction(L,get); - lua_settagmethod(L,tag,"gettable"); - if (set) - lua_pushcfunction(L,set); - else - lua_pushcfunction(L,toluaI_const_global_array); - lua_settagmethod(L,tag,"settable"); -} - -void tolua_tablevar -(lua_State* L, char* table, char* name, lua_CFunction get, lua_CFunction set) -{ - lua_getglobal(L,table); - - lua_pushstring(L,".get"); - lua_gettable(L,-2); - lua_pushstring(L,name); - lua_pushcfunction(L,get); - lua_settable(L,-3); - lua_pop(L,1); - if (set) - { - lua_pushstring(L,".set"); - lua_gettable(L,-2); - lua_pushstring(L,name); - lua_pushcfunction(L,set); - lua_settable(L,-3); - lua_pop(L,1); - } - - lua_pop(L,1); -} - -static int toluaI_get_array (lua_State* L) -{ - void* self = tolua_getuserdata(L,1,0); - const char* field = tolua_getstring(L,2,0); - - if (!field) - tolua_error(L,"invalid 'field' in accessing array"); - if (!self) - { - static char msg[BUFSIZ]; - sprintf(msg,"invalid 'self' in accessing array '%s'",field); - tolua_error(L,msg); - } - toluaI_getregistry(L,"tolua_tbl_itype"); - lua_pushnumber(L,lua_tag(L,1)); - lua_gettable(L,-2); - lua_getglobal(L,lua_tostring(L,-1)); - lua_pushstring(L,".array"); - lua_gettable(L,-2); - lua_pushvalue(L,2); /* field */ - lua_gettable(L,-2); - lua_pushstring(L,".self"); - lua_pushvalue(L,1); /* self */ - lua_rawset(L,-3); - return 1; -} - -static int toluaI_const_array (lua_State* L) -{ - lua_error(L,"value of const field cannot be changed"); - return 0; -} - -void tolua_tablearray -(lua_State* L, char* table, char* name, lua_CFunction get, lua_CFunction set) -{ - int tag = lua_newtag(L); - lua_getglobal(L,table); - lua_pushstring(L,".array"); - lua_rawget(L,-2); - lua_pushstring(L,name); - lua_newtable(L); - lua_settag(L,tag); - lua_settable(L,-3); - lua_pop(L,2); - - lua_pushcfunction(L,get); - lua_settagmethod(L,tag,"gettable"); - if (set) - lua_pushcfunction(L,set); - else - lua_pushcfunction(L,toluaI_const_array); - lua_settagmethod(L,tag,"settable"); - - tolua_tablevar(L,table,name,toluaI_get_array,NULL); -} - -void tolua_module (lua_State* L, char* name) -{ - lua_getglobal(L,name); - if (!lua_istable(L,-1)) - { - lua_newtable(L); - lua_pushstring(L,".get"); - lua_newtable(L); - lua_settable(L,-3); - lua_pushstring(L,".set"); - lua_newtable(L); - lua_settable(L,-3); - lua_pushvalue(L,-1); /* duplicate top */ - lua_setglobal(L,name); - toluaI_tm_module(L,lua_gettop(L)); - lua_pop(L,1); - } - lua_pop(L,1); -} - -void tolua_cclass (lua_State* L, char* name, char* base) -{ - int t; - lua_newtable(L); - lua_pushstring(L,".get"); - lua_newtable(L); - lua_settable(L,-3); - lua_pushstring(L,".set"); - lua_newtable(L); - lua_settable(L,-3); - lua_pushstring(L,".array"); - lua_newtable(L); - lua_settable(L,-3); - if (*base != 0) - { - lua_pushstring(L,".base"); - lua_getglobal(L,base); - lua_rawset(L,-3); - } - lua_pushvalue(L,-1); /* duplicate top */ - lua_setglobal(L,name); - t = lua_gettop(L); - toluaI_tm_class(L,t,name); - toluaI_tt_class(L,t,name,base); - lua_pop(L,1); -} - - -void tolua_function (lua_State* L, char* parent, char* name, lua_CFunction func) -{ - if (parent==NULL) - { - lua_pushcfunction(L,func); - lua_setglobal(L,name); - } - else - { - lua_getglobal(L,parent); - lua_pushstring(L,name); - lua_pushcfunction(L,func); - lua_settable(L,-3); - lua_pop(L,1); - } -} - -void tolua_constant (lua_State* L, char* parent, char* name, long value) -{ - if (parent==NULL) - { - lua_pushnumber(L,value); - lua_setglobal(L,name); - } - else - { - lua_getglobal(L,parent); - lua_pushstring(L,name); - lua_pushnumber(L,value); - lua_settable(L,-3); - lua_pop(L,1); - } -} - -void toluaI_setregistry (lua_State* L, char* field) -{ - lua_getregistry(L); - lua_insert(L,-2); - lua_pushstring(L,field); - lua_insert(L,-2); - lua_settable(L,-3); - lua_pop(L,1); -} - -void toluaI_getregistry (lua_State* L, char* field) -{ - lua_getregistry(L); - lua_pushstring(L,field); - lua_gettable(L,-2); - lua_insert(L,-2); - lua_pop(L,1); -} diff --git a/src/lua/tolua_rg.h b/src/lua/tolua_rg.h deleted file mode 100644 index 0feb6078..00000000 --- a/src/lua/tolua_rg.h +++ /dev/null @@ -1,22 +0,0 @@ -/* tolua: register functions -** Support code for Lua bindings. -** Written by Waldemar Celes -** TeCGraf/PUC-Rio -** Nov 200 -** $Id: tolua_rg.h,v 1.2 2001/11/26 23:00:27 darkgod Exp $ -*/ - -/* This code is free software; you can redistribute it and/or modify it. -** The software provided hereunder is on an "as is" basis, and -** the author has no obligation to provide maintenance, support, updates, -** enhancements, or modifications. -*/ - - -#ifndef tolua_rg_h -#define tolua_rg_h - -void toluaI_setregistry (lua_State* L, char* field); -void toluaI_getregistry (lua_State* L, char* field); - -#endif diff --git a/src/lua/tolua_tm.c b/src/lua/tolua_tm.c deleted file mode 100644 index 8fd7b28d..00000000 --- a/src/lua/tolua_tm.c +++ /dev/null @@ -1,585 +0,0 @@ -/* tolua: tag methods -** Support code for Lua bindings. -** Written by Waldemar Celes -** TeCGraf/PUC-Rio -** Jul 1998 -** $Id: tolua_tm.c,v 1.2 2001/11/26 23:00:27 darkgod Exp $ -*/ - -/* This code is free software; you can redistribute it and/or modify it. -** The software provided hereunder is on an "as is" basis, and -** the author has no obligation to provide maintenance, support, updates, -** enhancements, or modifications. -*/ - -#include "tolua.h" -#include "tolua_tm.h" -#include "tolua_tt.h" -#include "tolua_rg.h" - -#include <string.h> - - - -/* Global tables created in Lua registry: - tolua_tbl_class: indexed by instance tags, stores the class tables. - tolua_tbl_clone: indexed by memory address, stores the tag indicanting - it is a clone. - tolua_tbl_mate: indexed by memory address, stores the associate instance - table. - - General tags stored in Lua registry: - tolua_tag_global; - tolua_tag_module; - tolua_tag_class; - tolua_tag_instance; - tolua_tag_linstance; - tolua_tag_indirect; -*/ - -/* internal function prototype */ -static void setmethods (lua_State* L); - -static void settag (lua_State* L, int lo, char* tag_registry_field) -{ - toluaI_getregistry(L,tag_registry_field); - lua_pushvalue(L,lo); - lua_settag(L,(int)lua_tonumber(L,-2)); - lua_pop(L,2); -} - -void toluaI_tm_global (lua_State* L, int lo) -{ - settag(L,lo,"tolua_tag_global"); -} - -void toluaI_tm_module (lua_State* L, int lo) -{ - settag(L,lo,"tolua_tag_module"); -} - -void toluaI_tm_setclass (lua_State* L, int lo) -{ - settag(L,lo,"tolua_tag_class"); -} - -void toluaI_tm_class (lua_State* L, int lo, char* name) -{ - int tag_class; - int tag = lua_newtag(L); - char* type = toluaI_tt_concat("class ",name); - toluaI_getregistry(L,"tolua_tag_class"); - tag_class = (int)lua_tonumber(L,-1); - lua_copytagmethods(L,tag,tag_class); - toluaI_tt_register(L,tag,type); - toluaI_tt_sethierarchy(L,tag,tag_class); - lua_pushvalue(L,lo); - lua_settag(L,tag); - lua_pop(L,2); /* tag_class and lo */ -} - -void toluaI_tm_instance (lua_State* L, int tag, int lo) -{ - toluaI_getregistry(L,"tolua_tbl_class"); - lua_pushnumber(L,tag); - lua_pushvalue(L,lo); - lua_settable(L,-3); - toluaI_getregistry(L,"tolua_tag_instance"); - lua_copytagmethods(L,tag,(int)lua_tonumber(L,-1)); - lua_pop(L,2); /* tbl_class and tag_instance */ -} - -void toluaI_tm_linstance (lua_State* L, int tag, int lo) -{ - toluaI_getregistry(L,"tolua_tbl_class"); - lua_pushnumber(L,tag); - lua_pushvalue(L,lo); - lua_settable(L,-3); - toluaI_getregistry(L,"tolua_tag_linstance"); - lua_copytagmethods(L,tag,(int)lua_tonumber(L,-1)); - lua_pop(L,2); /* tbl_class and tag_linstance */ -} - -void* tolua_doclone (lua_State* L, void* value, int tag) -{ - toluaI_getregistry(L,"tolua_tbl_clone"); - lua_pushuserdata(L,value); - lua_pushnumber(L,tag); - lua_settable(L,-3); - lua_pop(L,1); - return value; -} - -void* tolua_copy (lua_State* L, void* value, unsigned int size) -{ - void* clone = (void*)malloc(size); - if (clone) - memcpy(clone,value,size); - else - tolua_error(L,"insuficient memory"); - return clone; -} - -static void toluaI_tm_undoclone (lua_State* L, int tag, void* clone) -{ - toluaI_getregistry(L,"tolua_tbl_clone"); - lua_pushuserdata(L,clone); - lua_gettable(L,-2); - if (lua_isnumber(L,-1) && lua_tonumber(L,-1)==tag) - { - lua_pushuserdata(L,clone); - lua_pushnil(L); - lua_settable(L,-4); - - /* get base class */ - toluaI_getregistry(L,"tolua_tbl_class"); - lua_pushnumber(L,tag); - lua_rawget(L,-2); - - /* look for destructor */ - lua_pushstring(L,"delete"); - lua_gettable(L,-2); - if (lua_iscfunction(L,-1)) - { - lua_pushusertag(L,clone,tag); - lua_call(L,1,0); - } - else - { - free(clone); /* no destructor: use raw free */ - lua_pop(L,1); /* the nil function value */ - } - lua_pop(L,2); /* tbl_class and class method table */ - } - lua_pop(L,2); /* table and value */ -} - -void toluaI_tm_pushmate (lua_State* L, int lo) -{ - toluaI_getregistry(L,"tolua_tbl_mate"); - lua_pushvalue(L,lo); - lua_rawget(L,-2); - lua_insert(L,-2); - lua_pop(L,1); -} - -void toluaI_tm_pushclass (lua_State* L, int lo) -{ - toluaI_getregistry(L,"tolua_tbl_class"); - lua_pushnumber(L,lua_tag(L,lo)); - lua_rawget(L,-2); - lua_insert(L,-2); - lua_pop(L,1); -} - -int toluaI_gettag (lua_State* L, char* tagname) -{ - int tag; - toluaI_getregistry(L,tagname); - tag = (int)lua_tonumber(L,-1); - lua_pop(L,1); - return tag; -} - -void toluaI_tm_init (lua_State* L) -{ - lua_newtable(L); toluaI_setregistry(L,"tolua_tbl_class"); - lua_newtable(L); toluaI_setregistry(L,"tolua_tbl_clone"); - lua_newtable(L); toluaI_setregistry(L,"tolua_tbl_mate"); - - lua_pushnumber(L,lua_newtag(L)); toluaI_setregistry(L,"tolua_tag_global"); - lua_pushnumber(L,lua_newtag(L)); toluaI_setregistry(L,"tolua_tag_module"); - lua_pushnumber(L,lua_newtag(L)); toluaI_setregistry(L,"tolua_tag_class"); - lua_pushnumber(L,lua_newtag(L)); toluaI_setregistry(L,"tolua_tag_instance"); - lua_pushnumber(L,lua_newtag(L)); toluaI_setregistry(L,"tolua_tag_linstance"); - lua_pushnumber(L,lua_newtag(L)); toluaI_setregistry(L,"tolua_tag_indirect"); - - toluaI_tt_register(L,toluaI_gettag(L,"tolua_tag_global"),"generic variable"); - toluaI_tt_register(L,toluaI_gettag(L,"tolua_tag_module"),"generic module"); - toluaI_tt_register(L,toluaI_gettag(L,"tolua_tag_class"),"generic class"); - toluaI_tt_register(L,toluaI_gettag(L,"tolua_tag_indirect"),"generic indirect"); - toluaI_tt_register(L,toluaI_gettag(L,"tolua_tag_instance"),"generic instance"); - toluaI_tt_register(L,toluaI_gettag(L,"tolua_tag_linstance"),"generic lua instance"); - - /* allows modules and classes to be used as ordinary tables */ - toluaI_tt_sethierarchy(L,toluaI_gettag(L,"tolua_tag_module"),tolua_tag_table); - toluaI_tt_sethierarchy(L,toluaI_gettag(L,"tolua_tag_class"),tolua_tag_table); - - setmethods(L); -} - -static int map (lua_State* L) -{ - int m = lua_gettop(L); - /* do not pass string fields starting with a dot */ - if (!lua_isstring(L,1) || *lua_tostring(L,1)!='.') - { - lua_getglobals(L); - lua_pushvalue(L,1); - lua_pushvalue(L,m); - lua_rawset(L,-3); - lua_pop(L,1); - } - return 0; -} - -void toluaI_tm_using (lua_State* L, int module) -{ - lua_newtable(L); - lua_settag(L,toluaI_gettag(L,"tolua_tag_indirect")); - lua_pushstring(L,".module"); - lua_pushvalue(L,module); - lua_settable(L,-3); - - lua_getglobal(L,"foreach"); - lua_pushvalue(L,module); - lua_pushvalue(L,-3); - lua_pushcclosure(L,map,1); - lua_call(L,2,0); - - lua_getglobal(L,"foreach"); - lua_pushvalue(L,module); - lua_pushstring(L,".get"); - lua_gettable(L,-2); - lua_insert(L,-2); - lua_pop(L,1); /* module table */ - lua_pushvalue(L,-3); - lua_pushcclosure(L,map,1); - lua_call(L,2,0); - lua_pop(L,1); /* indirect table */ -} - -/********************************************************** tag methods */ - -/* tag methods coded in C */ - -/* generic gettable */ -static void oo_gettable (lua_State* L, int table, int base, int index) -{ - while (lua_istable(L,base)) - { - lua_pushvalue(L,index); - lua_rawget(L,base); - if (!lua_isnil(L,-1)) - return; /* returned value already on the top */ - else if (lua_isnumber(L,index)) - { - lua_pushstring(L,"operator_get"); - lua_rawget(L,base); - if (!lua_isnil(L,-1)) - { - lua_pushvalue(L,table); - lua_pushvalue(L,index); - lua_call(L,2,1); - return; - } - } - else - { - lua_pushstring(L,".get"); - lua_rawget(L,base); - if (!lua_isnil(L,-1)) - { - lua_pushvalue(L,index); - lua_rawget(L,-2); - if (!lua_isnil(L,-1)) - { - lua_pushvalue(L,table); - lua_pushvalue(L,index); /* need to access array field (?) */ - lua_call(L,2,1); - return; - } - } - } - lua_pushstring(L,".base"); lua_rawget(L,base); - base = lua_gettop(L); - } - lua_pushnil(L); -} - -/* generic settable */ -static int oo_settable (lua_State* L, int table, int base, int index, int value) -{ - while (lua_istable(L,base)) - { - lua_pushstring(L,".set"); - lua_rawget(L,base); - if (!lua_isnil(L,-1)) - { - lua_pushvalue(L,index); - lua_rawget(L,-2); - if (!lua_isnil(L,-1)) - { - lua_pushvalue(L,table); - lua_pushvalue(L,value); - lua_call(L,2,0); - return 1; - } - } - lua_pushstring(L,".base"); lua_rawget(L,base); - base = lua_gettop(L); - } - return 0; -} - -/* class tag methods */ -static int class_index (lua_State* L) -{ - int table = 1; - int index = 2; - oo_gettable(L,table,table,index); - return 1; -} -static int class_settable (lua_State* L) -{ - int table = 1; - int index = 2; - int value = 3; - if (oo_settable(L,table,table,index,value) == 0) - { - lua_pushvalue(L,table); - lua_pushvalue(L,index); - lua_pushvalue(L,value); - lua_rawset(L,-3); - } - return 0; -} - -/* instance tags */ -static int instance_gettable (lua_State* L) -{ - int table = 1; - int index = 2; - toluaI_tm_pushmate(L,table); /* pushes mate */ - if (!lua_isnil(L,-1)) /* if there's a mate table */ - { - lua_pushvalue(L,index); - lua_rawget(L,-2); - if (!lua_isnil(L,-1)) /* if field in mate table exists */ - return 1; - } - toluaI_tm_pushclass(L,table); /* pushes base */ - oo_gettable(L,table,lua_gettop(L),index); - return 1; -} -static int instance_settable (lua_State* L) -{ - int table = 1; - int index = 2; - int value = 3; - toluaI_tm_pushclass(L,table); /* pushes base */ - if (lua_isnumber(L,index)) - { - lua_pushstring(L,"operator_set"); - lua_rawget(L,-2); - if (!lua_isnil(L,-1)) - {/* the stack here is: table,index,value,base,operator */ - /* call operator passing table, index, and value */ - lua_insert(L,1); - lua_pop(L,1); /* base */ - lua_call(L,3,0); - return 0; - } - } - if (oo_settable(L,table,4,index,value) == 0) - { - toluaI_tm_pushmate(L,table); /* pushes mate */ - if (lua_isnil(L,-1)) - { - /* creates mate table */ - lua_newtable(L); - toluaI_getregistry(L,"tolua_tbl_mate"); - lua_pushvalue(L,table); /* that is the userdata */ - lua_pushvalue(L,-3); - lua_rawset(L,-3); - lua_pop(L,1); /* tbl_mate */ - } - /* the mate table is on the top */ - lua_pushvalue(L,index); - lua_pushvalue(L,value); - lua_rawset(L,-3); - } - return 0; -} -static int instance_gc (lua_State* L) -{ - toluaI_tm_undoclone(L,lua_tag(L,1),lua_touserdata(L,1)); - return 0; -} -static int gen_operator (lua_State* L) -{ - int op1 = 1; - int op2 = 2; - int event = 3; - char* name = toluaI_tt_concat("operator_",lua_tostring(L,event)); - lua_pushstring(L,name); - lua_gettable(L,op1); - lua_pushvalue(L,op1); - lua_pushvalue(L,op2); - lua_call(L,2,1); - return 1; -} -static int instance_operator (lua_State* L) -{ - return gen_operator(L); -} -static int instance_relational (lua_State* L) -{ - gen_operator(L); - if ((int)lua_tonumber(L,-1)==0) lua_pushnil(L); - return 1; -} - -/* lua instance tags */ -static int linstance_index (lua_State* L) -{ - toluaI_tm_pushclass(L,1); - oo_gettable(L,1,3,2); /* table,base,index */ - return 1; -} - - -/* module tag methods */ -static int module_index (lua_State* L) -{ - int table = 1; - int index = 2; - lua_pushstring(L,".get"); - lua_rawget(L,table); - if (!lua_isnil(L,-1)) - { - lua_pushvalue(L,index); - lua_rawget(L,-2); - if (!lua_isnil(L,-1)) - { - lua_call(L,0,1); - return 1; - } - } - lua_pushnil(L); - return 1; -} -static int module_settable (lua_State* L) -{ - int table = 1; - int index = 2; - int value = 3; - lua_pushstring(L,".set"); - lua_rawget(L,table); - if (!lua_isnil(L,-1)) - { - lua_pushvalue(L,index); - lua_rawget(L,-2); - if (!lua_isnil(L,-1)) - { - lua_pushvalue(L,value); - lua_call(L,1,0); - return 0; - } - } - lua_pushvalue(L,index); - lua_pushvalue(L,value); - lua_rawset(L,table); - return 0; -} - -/* global variable tag methods */ -static int global_getglobal (lua_State* L) -{ - int value = 2; - lua_pushstring(L,".get"); - lua_rawget(L,value); - lua_call(L,0,1); - return 1; -} -static int global_setglobal (lua_State* L) -{ - int value = 2; - int newvalue = 3; - lua_pushstring(L,".set"); - lua_rawget(L,value); - if (lua_isnil(L,-1)) - lua_error(L,"value of const variable cannot be changed"); - else - { - lua_pushvalue(L,newvalue); - lua_call(L,1,0); - } - return 0; -} - -/* indirect tag methods */ -static int indirect_getglobal (lua_State* L) -{ - int varname = 1; - int value = 2; - lua_pushstring(L,".module"); - lua_gettable(L,value); - lua_pushvalue(L,varname); - lua_gettable(L,-2); - return 1; -} -static int indirect_setglobal (lua_State* L) -{ - int varname = 1; - int value = 2; - int newvalue = 3; - lua_pushstring(L,".module"); - lua_gettable(L,value); - lua_pushvalue(L,varname); - lua_pushvalue(L,newvalue); - lua_settable(L,-3); - return 0; -} - -static void setmethods (lua_State* L) -{ - /* global variable */ - lua_pushcfunction(L,global_getglobal); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_global"),"getglobal"); - lua_pushcfunction(L,global_setglobal); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_global"),"setglobal"); - - /* module */ - lua_pushcfunction(L,module_index); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_module"),"index"); - lua_pushcfunction(L,module_settable); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_module"),"settable"); - - /* class */ - lua_pushcfunction(L,class_index); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_class"),"index"); - lua_pushcfunction(L,class_settable); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_class"),"settable"); - - /* instance */ - lua_pushcfunction(L,instance_gettable); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_instance"),"gettable"); - lua_pushcfunction(L,instance_settable); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_instance"),"settable"); - lua_pushcfunction(L,instance_operator); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_instance"),"add"); - lua_pushcfunction(L,instance_operator); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_instance"),"sub"); - lua_pushcfunction(L,instance_operator); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_instance"),"mul"); - lua_pushcfunction(L,instance_operator); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_instance"),"div"); - lua_pushcfunction(L,instance_relational); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_instance"),"lt"); - lua_pushcfunction(L,instance_gc); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_instance"),"gc"); - - /* lua instance */ - lua_pushcfunction(L,linstance_index); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_linstance"),"index"); - - /* indirect */ - lua_pushcfunction(L,indirect_getglobal); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_indirect"),"getglobal"); - lua_pushcfunction(L,indirect_setglobal); - lua_settagmethod(L,toluaI_gettag(L,"tolua_tag_indirect"),"setglobal"); -} - - - diff --git a/src/lua/tolua_tm.h b/src/lua/tolua_tm.h deleted file mode 100644 index c1bf06dc..00000000 --- a/src/lua/tolua_tm.h +++ /dev/null @@ -1,32 +0,0 @@ -/* tolua: tag methods -** Support code for Lua bindings. -** Written by Waldemar Celes -** TeCGraf/PUC-Rio -** Jul 1998 -** $Id: tolua_tm.h,v 1.2 2001/11/26 23:00:27 darkgod Exp $ -*/ - -/* This code is free software; you can redistribute it and/or modify it. -** The software provided hereunder is on an "as is" basis, and -** the author has no obligation to provide maintenance, support, updates, -** enhancements, or modifications. -*/ - - - -#ifndef tolua_tm_h -#define tolua_tm_h - -void toluaI_tm_init (lua_State* L); -void toluaI_tm_global (lua_State* L, int lo); -void toluaI_tm_module (lua_State* L, int lo); -void toluaI_tm_class (lua_State* L, int lo, char* name); -void toluaI_tm_instance (lua_State* L, int tag, int lo); -void toluaI_tm_linstance (lua_State* L, int tag, int lo); -void toluaI_tm_using (lua_State* L, int module); -void toluaI_tm_setclass (lua_State* L, int lo); -void toluaI_tm_pushmate (lua_State* L, int lo); -void toluaI_tm_pushclass (lua_State* L, int lo); - - -#endif diff --git a/src/lua/tolua_tt.c b/src/lua/tolua_tt.c deleted file mode 100644 index 33c384c6..00000000 --- a/src/lua/tolua_tt.c +++ /dev/null @@ -1,316 +0,0 @@ -/* tolua: type & tag manipulation. -** Support code for Lua bindings. -** Written by Waldemar Celes -** TeCGraf/PUC-Rio -** Jul 1998 -** $Id: tolua_tt.c,v 1.2 2001/11/26 23:00:27 darkgod Exp $ -*/ - -/* This code is free software; you can redistribute it and/or modify it. -** The software provided hereunder is on an "as is" basis, and -** the author has no obligation to provide maintenance, support, updates, -** enhancements, or modifications. -*/ - -#include "tolua.h" -#include "tolua_tt.h" -#include "tolua_tm.h" -#include "tolua_eh.h" -#include "tolua_rg.h" - -#include <stdio.h> -#include <string.h> -#include <assert.h> - -/* Global tables created in Lua registry: - tolua_tbl_itype: indexed by instance tags, stores the instance types. - tolua_tbl_itag: indexed by instance types, stores the instance tags. - tolua_tbl_const: indexed by constant tags, stores the tags. - tolua_tbl_hierarchy: indexed by instance tags, stores the base tags. -*/ - -/* exported basic type tags */ -int tolua_tag_nil; -int tolua_tag_number; -int tolua_tag_string; -int tolua_tag_userdata; -int tolua_tag_table; -int tolua_tag_function; - - -static const char* gettype (lua_State* L, int tag) -{ - const char* type; - toluaI_getregistry(L,"tolua_tbl_itype"); - lua_pushnumber(L,tag); - lua_gettable(L,-2); - type = lua_tostring(L,-1); - if (type==NULL) type = "[undefined]"; - lua_pop(L,2); - return type; -} - -const char* toluaI_tt_getobjtype (lua_State* L, int lo) -{ - if (lua_gettop(L)<abs(lo)) - return "[no object]"; - else - return gettype(L,lua_tag(L,lo)); -} - -int toluaI_tt_gettag (lua_State* L, char* type) -{ - int tag; - toluaI_getregistry(L,"tolua_tbl_itag"); - lua_pushstring(L,type); - lua_gettable(L,-2); - tag = (int)lua_tonumber(L,-1); - lua_pop(L,2); - return tag; -} - -static int basetag (lua_State* L, int hierarchy, int tag) -{ - int btag; - lua_pushnumber(L,tag); - lua_gettable(L,hierarchy); - btag = (int)lua_tonumber(L,-1); - lua_pop(L,1); - return btag; -} - -static int istype (lua_State* L, int lo, int tag) -{ - int otag = lua_tag(L,lo); - if (tag==otag) /* check simplest case */ - return 1; - else if (lua_isnil(L,lo) && - tag!=LUA_TNUMBER && - tag!=LUA_TTABLE && - tag!=LUA_TFUNCTION - ) - return 1; - else if ((tag==LUA_TSTRING && lua_isstring(L,lo)) || /* check convertions */ - (tag==LUA_TNUMBER && lua_isnumber(L,lo)) - ) - return 1; - else if (tag==LUA_TUSERDATA && lua_isuserdata(L,lo)) /* pointer to void* */ - return 1; - else if (tag==toluaI_tt_gettag(L,"bool") && otag==LUA_TNUMBER) - return 1; - else - { - /* if requested type is const, the non-const is an alternative type */ - int tag2; - int tbl_hierarchy; - toluaI_getregistry(L,"tolua_tbl_const"); - lua_pushnumber(L,tag); - lua_gettable(L,-2); - tag2 = (int)lua_tonumber(L,-1); - lua_pop(L,2); - if (tag2 && tag2==otag) - return 1; - /* check for base classes */ - toluaI_getregistry(L,"tolua_tbl_hierarchy"); - tbl_hierarchy = lua_gettop(L); - otag = basetag(L,tbl_hierarchy,otag); - while (otag) - { - if (tag==otag || (tag2 && tag2==otag)) - break; - otag = basetag(L,tbl_hierarchy,otag); - } - lua_pop(L,1); - return otag!=0; - } -} - -void toluaI_tt_init (lua_State* L) -{ - lua_newtable(L); toluaI_setregistry(L,"tolua_tbl_itype"); - lua_newtable(L); toluaI_setregistry(L,"tolua_tbl_itag"); - lua_newtable(L); toluaI_setregistry(L,"tolua_tbl_const"); - lua_newtable(L); toluaI_setregistry(L,"tolua_tbl_hierarchy"); - - /* set and register basic Lua type tag */ -#if 0 - lua_pushnumber(L,LUA_TNIL); toluaI_setregistry(L,"tolua_tag_nil"); - lua_pushnumber(L,LUA_TNUMBER); toluaI_setregistry(L,"tolua_tag_number"); - lua_pushnumber(L,LUA_TSTRING); toluaI_setregistry(L,"tolua_tag_string"); - lua_pushnumber(L,LUA_TUSERDATA); toluaI_setregistry(L,"tolua_tag_userdata"); - lua_pushnumber(L,LUA_TTABLE); toluaI_setregistry(L,"tolua_tag_table"); - lua_pushnumber(L,LUA_TFUNCTION); toluaI_setregistry(L,"tolua_tag_function"); - - toluaI_tt_register(L,toluaI_tt_gettag(L,"tolua_tag_nil"),"nil"); - toluaI_tt_register(L,toluaI_tt_gettag(L,"tolua_tag_number"),"number"); - toluaI_tt_register(L,toluaI_tt_gettag(L,"tolua_tag_string"),"string"); - toluaI_tt_register(L,toluaI_tt_gettag(L,"tolua_tag_userdata"),"userdata"); - toluaI_tt_register(L,toluaI_tt_gettag(L,"tolua_tag_table"),"table"); - toluaI_tt_register(L,toluaI_tt_gettag(L,"tolua_tag_function"),"function"); -#else - toluaI_tt_register(L,LUA_TNIL,"nil"); - toluaI_tt_register(L,LUA_TNUMBER,"number"); - toluaI_tt_register(L,LUA_TSTRING,"string"); - toluaI_tt_register(L,LUA_TUSERDATA,"userdata"); - toluaI_tt_register(L,LUA_TTABLE,"table"); - toluaI_tt_register(L,LUA_TFUNCTION,"function"); - toluaI_tt_register(L,lua_newtag(L),"bool"); -#endif -} - - -void toluaI_tt_register (lua_State* L, int tag, char* type) -{ - toluaI_getregistry(L,"tolua_tbl_itype"); - lua_pushnumber(L,tag); - lua_pushstring(L,type); - lua_settable(L,-3); - - toluaI_getregistry(L,"tolua_tbl_itag"); - lua_pushstring(L,type); - lua_pushnumber(L,tag); - lua_settable(L,-3); - - lua_pop(L,2); -} - - -void toluaI_tt_class (lua_State* L, int lo, char* derived, char* base) -{ - char* cderived = toluaI_tt_concat("const ",derived); - int tag = toluaI_tt_gettag(L,derived); - int ctag = toluaI_tt_gettag(L,cderived); - toluaI_tm_instance(L,tag,lo); - toluaI_tm_instance(L,ctag,lo); - if (*base != 0) - { - char* cbase = toluaI_tt_concat("const ",base); - int btag = toluaI_tt_gettag(L,base); - int cbtag = toluaI_tt_gettag(L,cbase); - toluaI_tt_sethierarchy(L,tag,btag); - toluaI_tt_sethierarchy(L,ctag,cbtag); - } -} - -void toluaI_tt_sethierarchy (lua_State* L, int tag, int btag) -{ - toluaI_getregistry(L,"tolua_tbl_hierarchy"); - lua_pushnumber(L,tag); - lua_pushnumber(L,btag); - lua_settable(L,-3); - lua_pop(L,1); -} - -char* toluaI_tt_concat (const char* s1, const char* s2) -{ - static char s[BUFSIZ]; - assert(strlen(s1)+strlen(s2)<BUFSIZ); - return strcat(strcpy(s,s1),s2); -} - -void tolua_usertype (lua_State* L, char* type) -{ - /* check if type is already registered */ - toluaI_getregistry(L,"tolua_tbl_itag"); - lua_pushstring(L,type); - lua_gettable(L,-2); - if (lua_isnil(L,-1)) - { - char *ctype = toluaI_tt_concat("const ",type); - int tag = lua_newtag(L); - int ctag = lua_newtag(L); - toluaI_tt_register(L,tag,type); - toluaI_tt_register(L,ctag,ctype); - /* set const table */ - toluaI_getregistry(L,"tolua_tbl_const"); - lua_pushnumber(L,ctag); - lua_pushnumber(L,tag); - lua_settable(L,-3); - lua_pop(L,1); - } - lua_pop(L,2); -} - -int toluaI_tt_isusertype (lua_State* L, int lo) -{ - if (lua_isuserdata(L,lo) && - toluaI_tt_gettag(L,"tolua_tag_userdata")!=lua_tag(L,lo) - ) - { - int status; - toluaI_getregistry(L,"tolua_tbl_itype"); - lua_pushnumber(L,lua_tag(L,lo)); - lua_gettable(L,-2); - status = !lua_isnil(L,-1); - lua_pop(L,2); - return status; - } - return 0; -} - -#if 0 -void tolua_settag (lua_State* L, char* type, int* tag) -{ - toluaI_getregistry(L,"tolua_tbl_itag"); - lua_pushstring(L,type); - lua_gettable(L,-2); - *tag = (int) lua_tonumber(L,-1); - lua_pop(L,2); -} -#endif - -int tolua_istype (lua_State* L, int narg, int tag, int def) -{ - if (lua_gettop(L)<abs(narg)) - { - if (def==0) - { - toluaI_eh_set(L,narg,toluaI_tt_getobjtype(L,narg),gettype(L,tag)); - return 0; - } - } - else - { - if (!istype(L,narg,tag)) - { - toluaI_eh_set(L,narg,toluaI_tt_getobjtype(L,narg),gettype(L,tag)); - return 0; - } - } - return 1; -} - -int tolua_arrayistype (lua_State* L, int narg, int tag, int dim, int def) -{ - int i; - for (i=0; i<dim; ++i) - { - int tf; - lua_pushnumber(L,i+1); - lua_gettable(L,narg); - tf = lua_gettop(L); - if (!istype(L,tf,tag) && (!def || !lua_isnil(L,tf))) - { - static char t1[BUFSIZ], t2[BUFSIZ]; - sprintf(t1,"array of %s",toluaI_tt_getobjtype(L,tf)); - sprintf(t2,"array of %s (dimension=%d)",gettype(L,tag),dim); - toluaI_eh_set(L,narg,t1,t2); - return 0; - } - lua_pop(L,1); - } - return 1; -} - -int tolua_isnoobj (lua_State* L, int narg) -{ - if (lua_gettop(L)>=abs(narg)) - { - toluaI_eh_set(L,narg,toluaI_tt_getobjtype(L,narg), - toluaI_tt_getobjtype(L,lua_gettop(L)+1)); - return 0; - } - return 1; -} - - diff --git a/src/lua/tolua_tt.h b/src/lua/tolua_tt.h deleted file mode 100644 index 941a2b02..00000000 --- a/src/lua/tolua_tt.h +++ /dev/null @@ -1,31 +0,0 @@ -/* tolua: type & tag manipulation. -** Support code for Lua bindings. -** Written by Waldemar Celes -** TeCGraf/PUC-Rio -** Jul 1998 -** $Id: tolua_tt.h,v 1.2 2001/11/26 23:00:27 darkgod Exp $ -*/ - -/* This code is free software; you can redistribute it and/or modify it. -** The software provided hereunder is on an "as is" basis, and -** the author has no obligation to provide maintenance, support, updates, -** enhancements, or modifications. -*/ - - -#ifndef tolua_tt_h -#define tolua_tt_h - -void toluaI_tt_init (lua_State* L); -void toluaI_tt_register (lua_State* L, int tag, char* type); -void toluaI_tt_class (lua_State* L, int lo, char* derived, char* base); -void toluaI_tt_sethierarchy (lua_State* L, int tag, int btag); -int toluaI_tt_isusertype (lua_State* L, int lo); -int toluaI_tt_gettag (lua_State* L, char* type); -const char* toluaI_tt_getobjtype (lua_State* L, int lo); -char* toluaI_tt_concat (const char* s1, const char* s2); - - - - -#endif diff --git a/src/lua/tolualua.c b/src/lua/tolualua.c deleted file mode 100644 index adbb8635..00000000 --- a/src/lua/tolualua.c +++ /dev/null @@ -1,2975 +0,0 @@ -/* -** Lua binding: tolualua -** Generated automatically by tolua 4.0a - angband on Sun Nov 11 22:59:08 2001. -*/ - -#include "tolua.h" - -/* Exported function */ -int tolua_tolualua_open (lua_State* tolua_S); -void tolua_tolualua_close (lua_State* tolua_S); - - -/* function to register type */ -static void toluaI_reg_types (lua_State* tolua_S) -{ -} - -/* error messages */ -#define TOLUA_ERR_SELF tolua_error(tolua_S,"invalid 'self'") -#define TOLUA_ERR_ASSIGN tolua_error(tolua_S,"#vinvalid type in variable assignment.") - -/* Open function */ -int tolua_tolualua_open (lua_State* tolua_S) -{ - tolua_open(tolua_S); - toluaI_reg_types(tolua_S); - - { /* begin embedded lua code */ - static unsigned char B[] = { - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 95, 98, 97,115,105, 99, 32, 61, 32,123, 10, 91, 39,118, - 111,105,100, 39, 93, 32, 61, 32, 39, 39, 44, 10, 91, 39, 99, - 104, 97,114, 39, 93, 32, 61, 32, 39,110,117,109, 98,101,114, - 39, 44, 10, 91, 39,105,110,116, 39, 93, 32, 61, 32, 39,110, - 117,109, 98,101,114, 39, 44, 10, 91, 39,115,104,111,114,116, - 39, 93, 32, 61, 32, 39,110,117,109, 98,101,114, 39, 44, 10, - 91, 39,108,111,110,103, 39, 93, 32, 61, 32, 39,110,117,109, - 98,101,114, 39, 44, 10, 91, 39, 95, 99,115,116,114,105,110, - 103, 39, 93, 32, 61, 32, 39,115,116,114,105,110,103, 39, 44, - 10, 91, 39, 95,117,115,101,114,100, 97,116, 97, 39, 93, 32, - 61, 32, 39,117,115,101,114,100, 97,116, 97, 39, 44, 10, 91, - 39, 99,104, 97,114, 42, 39, 93, 32, 61, 32, 39,115,116,114, - 105,110,103, 39, 44, 10, 91, 39,118,111,105,100, 42, 39, 93, - 32, 61, 32, 39,117,115,101,114,100, 97,116, 97, 39, 44, 10, - 91, 39, 98,111,111,108, 39, 93, 32, 61, 32, 39, 98,111,111, - 108, 39, 44, 10, 91, 39, 76, 85, 65, 95, 86, 65, 76, 85, 69, - 39, 93, 32, 61, 32, 39,118, 97,108,117,101, 39, 44, 10, 91, - 39, 98,121,116,101, 39, 93, 32, 61, 32, 39,110,117,109, 98, - 101,114, 39, 44, 10, 91, 39,115, 49, 54, 98, 39, 93, 32, 61, - 32, 39,110,117,109, 98,101,114, 39, 44, 10, 91, 39,117, 49, - 54, 98, 39, 93, 32, 61, 32, 39,110,117,109, 98,101,114, 39, - 44, 10, 91, 39,115, 51, 50, 98, 39, 93, 32, 61, 32, 39,110, - 117,109, 98,101,114, 39, 44, 10, 91, 39,117, 51, 50, 98, 39, - 93, 32, 61, 32, 39,110,117,109, 98,101,114, 39, 44, 10,125, - 10, 10, 95, 98, 97,115,105, 99, 95,116, 97,103, 32, 61, 32, - 123, 10, 91, 39,118,111,105,100, 39, 93, 32, 61, 32, 39, 39, - 44, 10, 91, 39, 99,104, 97,114, 39, 93, 32, 61, 32, 39, 76, - 85, 65, 95, 84, 78, 85, 77, 66, 69, 82, 39, 44, 10, 91, 39, - 105,110,116, 39, 93, 32, 61, 32, 39, 76, 85, 65, 95, 84, 78, - 85, 77, 66, 69, 82, 39, 44, 10, 91, 39,115,104,111,114,116, - 39, 93, 32, 61, 32, 39, 76, 85, 65, 95, 84, 78, 85, 77, 66, - 69, 82, 39, 44, 10, 91, 39,108,111,110,103, 39, 93, 32, 61, - 32, 39, 76, 85, 65, 95, 84, 78, 85, 77, 66, 69, 82, 39, 44, - 10, 91, 39, 95, 99,115,116,114,105,110,103, 39, 93, 32, 61, - 32, 39, 76, 85, 65, 95, 84, 83, 84, 82, 73, 78, 71, 39, 44, - 10, 91, 39, 95,117,115,101,114,100, 97,116, 97, 39, 93, 32, - 61, 32, 39, 76, 85, 65, 95, 84, 85, 83, 69, 82, 68, 65, 84, - 65, 39, 44, 10, 91, 39, 99,104, 97,114, 42, 39, 93, 32, 61, - 32, 39, 76, 85, 65, 95, 84, 83, 84, 82, 73, 78, 71, 39, 44, - 10, 91, 39,118,111,105,100, 42, 39, 93, 32, 61, 32, 39, 76, - 85, 65, 95, 84, 85, 83, 69, 82, 68, 65, 84, 65, 39, 44, 10, - 91, 39, 98,111,111,108, 39, 93, 32, 61, 32, 39,116,111,108, - 117, 97, 95,116, 97,103, 40,116,111,108,117, 97, 95, 83, 44, - 34, 98,111,111,108, 34, 41, 39, 44, 10, 91, 39, 98,121,116, - 101, 39, 93, 32, 61, 32, 39, 76, 85, 65, 95, 84, 78, 85, 77, - 66, 69, 82, 39, 44, 10, 91, 39,115, 49, 54, 98, 39, 93, 32, - 61, 32, 39, 76, 85, 65, 95, 84, 78, 85, 77, 66, 69, 82, 39, - 44, 10, 91, 39,117, 49, 54, 98, 39, 93, 32, 61, 32, 39, 76, - 85, 65, 95, 84, 78, 85, 77, 66, 69, 82, 39, 44, 10, 91, 39, - 115, 51, 50, 98, 39, 93, 32, 61, 32, 39, 76, 85, 65, 95, 84, - 78, 85, 77, 66, 69, 82, 39, 44, 10, 91, 39,117, 51, 50, 98, - 39, 93, 32, 61, 32, 39, 76, 85, 65, 95, 84, 78, 85, 77, 66, - 69, 82, 39, 44, 10,125, 10, 10, 95, 98, 97,115,105, 99, 95, - 99,116,121,112,101, 32, 61, 32,123, 10,110,117,109, 98,101, - 114, 32, 61, 32, 34,108,111,110,103, 34, 44, 10,115,116,114, - 105,110,103, 32, 61, 32, 34, 99,111,110,115,116, 32, 99,104, - 97,114, 42, 34, 44, 10,117,115,101,114,100, 97,116, 97, 32, - 61, 32, 34,118,111,105,100, 42, 34, 44, 10, 98,111,111,108, - 32, 61, 32, 34,105,110,116, 34, 44, 10,125, 10, 10, 10, 10, - 95,117,115,101,114,116,121,112,101, 32, 61, 32,123,125, 10, - 10, 10,102,117,110, 99,116,105,111,110, 32,116,111,108,117, - 97, 95,105,110,100,101,120, 32, 40,116, 44,102, 41, 10,105, - 102, 32,102, 32, 61, 61, 32, 39, 95, 98, 97,115,101, 39, 32, - 116,104,101,110, 10,114,101,116,117,114,110, 32,116,111,108, - 117, 97, 95,111,108,100, 95,105,110,100,101,120, 40,116, 44, - 102, 41, 10,101,108,115,101, 10,114,101,116,117,114,110, 32, - 116, 46, 95, 98, 97,115,101, 91,102, 93, 10,101,110,100, 10, - 101,110,100, 10, 10,116,111,108,117, 97, 95,116, 97,103, 32, - 61, 32,110,101,119,116, 97,103, 40, 41, 10,116,111,108,117, - 97, 95,111,108,100, 95,105,110,100,101,120, 32, 61, 32,115, - 101,116,116, 97,103,109,101,116,104,111,100, 40,116,111,108, - 117, 97, 95,116, 97,103, 44, 34,105,110,100,101,120, 34, 44, - 116,111,108,117, 97, 95,105,110,100,101,120, 41, 10, 10, 10, - 102,117,110, 99,116,105,111,110, 32,116,111,108,117, 97, 95, - 101,114,114,111,114, 32, 40,115, 41, 10,108,111, 99, 97,108, - 32,111,117,116, 32, 61, 32, 95, 79, 85, 84, 80, 85, 84, 10, - 95, 79, 85, 84, 80, 85, 84, 32, 61, 32, 95, 83, 84, 68, 69, - 82, 82, 10,105,102, 32,115,116,114,115,117, 98, 40,115, 44, - 49, 44, 49, 41, 32, 61, 61, 32, 39, 35, 39, 32,116,104,101, - 110, 10,119,114,105,116,101, 40, 34, 92,110, 42, 42, 32,116, - 111,108,117, 97, 58, 32, 34, 46, 46,115,116,114,115,117, 98, - 40,115, 44, 50, 41, 46, 46, 34, 46, 92,110, 92,110, 34, 41, - 10,101,108,115,101, 10,119,114,105,116,101, 40, 34, 92,110, - 42, 42, 32,116,111,108,117, 97, 32,105,110,116,101,114,110, - 97,108, 32,101,114,114,111,114, 58, 32, 34, 46, 46,115, 46, - 46, 34, 46, 92,110, 92,110, 34, 41, 10,114,101,116,117,114, - 110, 10,101,110,100, 10, 10,105,102, 32, 95, 99,117,114,114, - 95, 99,111,100,101, 32,116,104,101,110, 10,108,111, 99, 97, - 108, 32, 95, 44, 95, 44,115, 32, 61, 32,115,116,114,102,105, - 110,100, 40, 95, 99,117,114,114, 95, 99,111,100,101, 44, 34, - 94, 37,115, 42, 40, 46, 45, 92,110, 41, 34, 41, 10,105,102, - 32,115, 61, 61,110,105,108, 32,116,104,101,110, 32,115, 32, - 61, 32, 95, 99,117,114,114, 95, 99,111,100,101, 32,101,110, - 100, 10,115, 32, 61, 32,103,115,117, 98, 40,115, 44, 34, 95, - 117,115,101,114,100, 97,116, 97, 34, 44, 34,118,111,105,100, - 42, 34, 41, 10,115, 32, 61, 32,103,115,117, 98, 40,115, 44, - 34, 95, 99,115,116,114,105,110,103, 34, 44, 34, 99,104, 97, - 114, 42, 34, 41, 10,119,114,105,116,101, 40, 34, 67,111,100, - 101, 32, 98,101,105,110,103, 32,112,114,111, 99,101,115,115, - 101,100, 58, 92,110, 34, 46, 46,115, 46, 46, 34, 92,110, 34, - 41, 10,101,110,100, 10, 95, 79, 85, 84, 80, 85, 84, 32, 61, - 32,111,117,116, 10,101,110,100, 10, 10, 10, 95, 69, 82, 82, - 79, 82, 77, 69, 83, 83, 65, 71, 69, 32, 61, 32,116,111,108, - 117, 97, 95,101,114,114,111,114, 10, 10, 10,102,117,110, 99, - 116,105,111,110, 32,114,101,103,116,121,112,101, 32, 40,116, - 41, 10,105,102, 32,110,111,116, 32,105,115,116,121,112,101, - 40,116, 41, 32,116,104,101,110, 10, 95,117,115,101,114,116, - 121,112,101, 91,116, 93, 32, 61, 32,116, 10,101,110,100, 10, - 114,101,116,117,114,110, 32,116, 10,101,110,100, 10, 10, 10, - 102,117,110, 99,116,105,111,110, 32,116, 97,103,118, 97,114, - 40,116,121,112,101, 44, 99,111,110,115,116, 41, 10,105,102, - 32,116,121,112,101, 32, 61, 61, 32, 39, 39, 32,111,114, 32, - 116,121,112,101, 32, 61, 61, 32, 39,118,111,105,100, 39, 32, - 116,104,101,110, 10,114,101,116,117,114,110, 32,116,121,112, - 101, 44, 48, 10,101,108,115,101, 10,108,111, 99, 97,108, 32, - 109, 44,116, 32, 61, 32,102,105,110,100,116,121,112,101,100, - 101,102, 40,116,121,112,101, 41, 10,105,102, 32,105,115, 98, - 97,115,105, 99, 40,116, 41, 32,116,104,101,110, 10,114,101, - 116,117,114,110, 32,116, 44, 32, 95, 98, 97,115,105, 99, 95, - 116, 97,103, 91,116, 93, 10,101,110,100, 10,105,102, 32,115, - 116,114,102,105,110,100, 40,109, 44, 39, 99,111,110,115,116, - 39, 41, 32,116,104,101,110, 32, 99,111,110,115,116, 32, 61, - 32, 39, 99,111,110,115,116, 39, 32,101,110,100, 10,114,101, - 103,116,121,112,101, 40,116, 41, 10,105,102, 32, 99,111,110, - 115,116, 32, 97,110,100, 32, 99,111,110,115,116, 32,126, 61, - 32, 39, 39, 32,116,104,101,110, 10,116, 32, 61, 32, 39, 99, - 111,110,115,116, 32, 39, 46, 46,116, 10,101,110,100, 10,114, - 101,116,117,114,110, 32,116, 44, 39,116,111,108,117, 97, 95, - 116, 97,103, 40,116,111,108,117, 97, 95, 83, 44, 34, 39, 46, - 46,116, 46, 46, 39, 34, 41, 39, 10,101,110,100, 10,101,110, - 100, 10, 10, 10,102,117,110, 99,116,105,111,110, 32,105,115, - 98, 97,115,105, 99, 32, 40,116,121,112,101, 41, 10,108,111, - 99, 97,108, 32,109, 44,116, 32, 61, 32,102,105,110,100,116, - 121,112,101,100,101,102, 40,116,121,112,101, 41, 10,108,111, - 99, 97,108, 32, 98, 32, 61, 32, 95, 98, 97,115,105, 99, 91, - 116, 93, 10,105,102, 32, 98, 32,116,104,101,110, 10,114,101, - 116,117,114,110, 32, 98, 44, 95, 98, 97,115,105, 99, 95, 99, - 116,121,112,101, 91, 98, 93, 10,101,110,100, 10,114,101,116, - 117,114,110, 32,110,105,108, 10,101,110,100, 10, 10, 10,102, - 117,110, 99,116,105,111,110, 32,105,115,116,121,112,101, 32, - 40,116, 41, 10,114,101,116,117,114,110, 32, 95, 98, 97,115, - 105, 99, 91,116, 93, 32,111,114, 32, 95,117,115,101,114,116, - 121,112,101, 91,116, 93, 32,111,114, 32,105,115,116,121,112, - 101,100,101,102, 40,116, 41, 10,101,110,100, 10, 10, 10, 10, - 102,117,110, 99,116,105,111,110, 32,115,112,108,105,116, 32, - 40,115, 44,116, 41, 10,108,111, 99, 97,108, 32,108, 32, 61, - 32,123,110, 61, 48,125, 10,108,111, 99, 97,108, 32,102, 32, - 61, 32,102,117,110, 99,116,105,111,110, 32, 40,115, 41, 10, - 37,108, 46,110, 32, 61, 32, 37,108, 46,110, 32, 43, 32, 49, - 10, 37,108, 91, 37,108, 46,110, 93, 32, 61, 32,115, 10,101, - 110,100, 10,108,111, 99, 97,108, 32,112, 32, 61, 32, 34, 37, - 115, 42, 40, 46, 45, 41, 37,115, 42, 34, 46, 46,116, 46, 46, - 34, 37,115, 42, 34, 10,115, 32, 61, 32,103,115,117, 98, 40, - 115, 44, 34, 94, 37,115, 43, 34, 44, 34, 34, 41, 10,115, 32, - 61, 32,103,115,117, 98, 40,115, 44, 34, 37,115, 43, 36, 34, - 44, 34, 34, 41, 10,115, 32, 61, 32,103,115,117, 98, 40,115, - 44,112, 44,102, 41, 10,108, 46,110, 32, 61, 32,108, 46,110, - 32, 43, 32, 49, 10,108, 91,108, 46,110, 93, 32, 61, 32,103, - 115,117, 98, 40,115, 44, 34, 40, 37,115, 37,115, 42, 41, 36, - 34, 44, 34, 34, 41, 10,114,101,116,117,114,110, 32,108, 10, - 101,110,100, 10, 10, 10, 10,102,117,110, 99,116,105,111,110, - 32, 99,111,110, 99, 97,116, 32, 40,116, 44,102, 44,108, 41, - 10,108,111, 99, 97,108, 32,115, 32, 61, 32, 39, 39, 10,108, - 111, 99, 97,108, 32,105, 61,102, 10,119,104,105,108,101, 32, - 105, 60, 61,108, 32,100,111, 10,115, 32, 61, 32,115, 46, 46, - 116, 91,105, 93, 10,105, 32, 61, 32,105, 43, 49, 10,105,102, - 32,105, 32, 60, 61, 32,108, 32,116,104,101,110, 32,115, 32, - 61, 32,115, 46, 46, 39, 32, 39, 32,101,110,100, 10,101,110, - 100, 10,114,101,116,117,114,110, 32,115, 10,101,110,100, 10, - 10, 10,102,117,110, 99,116,105,111,110, 32,111,117,116,112, - 117,116, 32, 40, 46, 46, 46, 41, 10,108,111, 99, 97,108, 32, - 105, 61, 49, 10,119,104,105,108,101, 32,105, 60, 61, 97,114, - 103, 46,110, 32,100,111, 10,105,102, 32, 95, 99,111,110,116, - 32, 97,110,100, 32,110,111,116, 32,115,116,114,102,105,110, - 100, 40, 95, 99,111,110,116, 44, 39, 91, 37, 40, 44, 34, 93, - 39, 41, 32, 97,110,100, 10,115,116,114,102,105,110,100, 40, - 97,114,103, 91,105, 93, 44, 34, 94, 91, 37, 97, 95,126, 93, - 34, 41, 32,116,104,101,110, 10,119,114,105,116,101, 40, 39, - 32, 39, 41, 10,101,110,100, 10,119,114,105,116,101, 40, 97, - 114,103, 91,105, 93, 41, 10,105,102, 32, 97,114,103, 91,105, - 93, 32,126, 61, 32, 39, 39, 32,116,104,101,110, 10, 95, 99, - 111,110,116, 32, 61, 32,115,116,114,115,117, 98, 40, 97,114, - 103, 91,105, 93, 44, 45, 49, 44, 45, 49, 41, 10,101,110,100, - 10,105, 32, 61, 32,105, 43, 49, 10,101,110,100, 10,105,102, - 32,115,116,114,102,105,110,100, 40, 97,114,103, 91, 97,114, - 103, 46,110, 93, 44, 34, 91, 37, 47, 37, 41, 37, 59, 37,123, - 37,125, 93, 36, 34, 41, 32,116,104,101,110, 10, 95, 99,111, - 110,116, 61,110,105,108, 32,119,114,105,116,101, 40, 39, 92, - 110, 39, 41, 10,101,110,100, 10,101,110,100, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 99,108, 97,115, - 115, 70,101, 97,116,117,114,101, 32, 61, 32,123, 10,125, 10, - 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97,115, - 115, 70,101, 97,116,117,114,101, 58,115,117,112, 99,111,100, - 101, 32, 40, 41, 10,101,110,100, 10, 10, 10,102,117,110, 99, - 116,105,111,110, 32, 99,108, 97,115,115, 70,101, 97,116,117, - 114,101, 58,100,101, 99,108,116, 97,103, 32, 40, 41, 10,101, - 110,100, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 99, - 108, 97,115,115, 70,101, 97,116,117,114,101, 58,114,101,103, - 105,115,116,101,114, 32, 40, 41, 10,101,110,100, 10, 10, 10, - 102,117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 70, - 101, 97,116,117,114,101, 58,117,110,114,101,103,105,115,116, - 101,114, 32, 40, 41, 10,101,110,100, 10, 10, 10,102,117,110, - 99,116,105,111,110, 32, 99,108, 97,115,115, 70,101, 97,116, - 117,114,101, 58,112,114,101, 97,109, 98,108,101, 32, 40, 41, - 10,101,110,100, 10, 10, 10, 10,102,117,110, 99,116,105,111, - 110, 32, 99,108, 97,115,115, 70,101, 97,116,117,114,101, 58, - 105,110, 99,108, 97,115,115, 32, 40, 41, 10,105,102, 32,115, - 101,108,102, 46,112, 97,114,101,110,116, 32, 97,110,100, 32, - 115,101,108,102, 46,112, 97,114,101,110,116, 46,116,121,112, - 101, 32, 61, 61, 32, 39, 99,108, 97,115,115, 39, 32,116,104, - 101,110, 10,114,101,116,117,114,110, 32,115,101,108,102, 46, - 112, 97,114,101,110,116, 46,110, 97,109,101, 10,101,108,115, - 101, 10,114,101,116,117,114,110, 32,110,105,108, 10,101,110, - 100, 10,101,110,100, 10, 10, 10, 10,102,117,110, 99,116,105, - 111,110, 32, 99,108, 97,115,115, 70,101, 97,116,117,114,101, - 58,105,110,109,111,100,117,108,101, 32, 40, 41, 10,105,102, - 32,115,101,108,102, 46,112, 97,114,101,110,116, 32, 97,110, - 100, 32,115,101,108,102, 46,112, 97,114,101,110,116, 46,116, - 121,112,101, 32, 61, 61, 32, 39,109,111,100,117,108,101, 39, - 32,116,104,101,110, 10,114,101,116,117,114,110, 32,115,101, - 108,102, 46,112, 97,114,101,110,116, 46,110, 97,109,101, 10, - 101,108,115,101, 10,114,101,116,117,114,110, 32,110,105,108, - 10,101,110,100, 10,101,110,100, 10, 10, 10, 10, 10, 10,102, - 117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 70,101, - 97,116,117,114,101, 58, 99,102,117,110, 99,110, 97,109,101, - 32, 40,110, 41, 10,105,102, 32,115,101,108,102, 46,112, 97, - 114,101,110,116, 32,116,104,101,110, 10,110, 32, 61, 32,115, - 101,108,102, 46,112, 97,114,101,110,116, 58, 99,102,117,110, - 99,110, 97,109,101, 40,110, 41, 10,101,110,100, 10,105,102, - 32,115,101,108,102, 46,108,110, 97,109,101, 32,116,104,101, - 110, 10,114,101,116,117,114,110, 32,110, 46, 46, 39, 95, 39, - 46, 46,115,101,108,102, 46,108,110, 97,109,101, 10,101,108, - 115,101, 10,114,101,116,117,114,110, 32,110, 46, 46, 39, 95, - 39, 46, 46,115,101,108,102, 46,110, 97,109,101, 10,101,110, - 100, 10,101,110,100, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 99,108, 97,115,115, 86, - 101,114, 98, 97,116,105,109, 32, 61, 32,123, 10,108,105,110, - 101, 32, 61, 32, 39, 39, 44, 10, 95, 98, 97,115,101, 32, 61, - 32, 99,108, 97,115,115, 70,101, 97,116,117,114,101, 44, 10, - 125, 10,115,101,116,116, 97,103, 40, 99,108, 97,115,115, 86, - 101,114, 98, 97,116,105,109, 44,116,111,108,117, 97, 95,116, - 97,103, 41, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, - 99,108, 97,115,115, 86,101,114, 98, 97,116,105,109, 58,112, - 114,101, 97,109, 98,108,101, 32, 40, 41, 10,105,102, 32,110, - 111,116, 32,115,101,108,102, 46, 99,111,110,100, 32,116,104, - 101,110, 10,119,114,105,116,101, 40,115,101,108,102, 46,108, - 105,110,101, 41, 10,101,110,100, 10,101,110,100, 10, 10, 10, - 102,117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 86, - 101,114, 98, 97,116,105,109, 58,115,117,112, 99,111,100,101, - 32, 40, 41, 10,105,102, 32,115,101,108,102, 46, 99,111,110, - 100, 32,116,104,101,110, 10,119,114,105,116,101, 40,115,101, - 108,102, 46,108,105,110,101, 41, 10,119,114,105,116,101, 40, - 39, 92,110, 39, 41, 10,101,110,100, 10,101,110,100, 10, 10, - 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, - 86,101,114, 98, 97,116,105,109, 58,114,101,103,105,115,116, - 101,114, 32, 40, 41, 10,105,102, 32,115,101,108,102, 46, 99, - 111,110,100, 32,116,104,101,110, 10,119,114,105,116,101, 40, - 115,101,108,102, 46,108,105,110,101, 41, 10,101,110,100, 10, - 101,110,100, 10, 10, 10, 10,102,117,110, 99,116,105,111,110, - 32, 99,108, 97,115,115, 86,101,114, 98, 97,116,105,109, 58, - 112,114,105,110,116, 32, 40,105,100,101,110,116, 44, 99,108, - 111,115,101, 41, 10,112,114,105,110,116, 40,105,100,101,110, - 116, 46, 46, 34, 86,101,114, 98, 97,116,105,109,123, 34, 41, - 10,112,114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, - 32,108,105,110,101, 32, 61, 32, 39, 34, 46, 46,115,101,108, - 102, 46,108,105,110,101, 46, 46, 34, 39, 44, 34, 41, 10,112, - 114,105,110,116, 40,105,100,101,110,116, 46, 46, 34,125, 34, - 46, 46, 99,108,111,115,101, 41, 10,101,110,100, 10, 10, 10, - 10,102,117,110, 99,116,105,111,110, 32, 95, 86,101,114, 98, - 97,116,105,109, 32, 40,116, 41, 10,116, 46, 95, 98, 97,115, - 101, 32, 61, 32, 99,108, 97,115,115, 86,101,114, 98, 97,116, - 105,109, 10,115,101,116,116, 97,103, 40,116, 44,116,111,108, - 117, 97, 95,116, 97,103, 41, 10, 97,112,112,101,110,100, 40, - 116, 41, 10,114,101,116,117,114,110, 32,116, 10,101,110,100, - 10, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 86,101, - 114, 98, 97,116,105,109, 32, 40,108, 41, 10,108,111, 99, 97, - 108, 32, 99, 10,105,102, 32,115,116,114,115,117, 98, 40,108, - 44, 49, 44, 49, 41, 32, 61, 61, 32, 39, 36, 39, 32,116,104, - 101,110, 10, 99, 32, 61, 32, 49, 10,108, 32, 61, 32,115,116, - 114,115,117, 98, 40,108, 44, 50, 41, 10,101,110,100, 10,114, - 101,116,117,114,110, 32, 95, 86,101,114, 98, 97,116,105,109, - 32,123, 10,108,105,110,101, 32, 61, 32,108, 44, 10, 99,111, - 110,100, 32, 61, 32, 99, 10,125, 10,101,110,100, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 99,108, 97,115,115, 67,111,100,101, 32, 61, 32,123, 10,116, - 101,120,116, 32, 61, 32, 39, 39, 44, 10, 95, 98, 97,115,101, - 32, 61, 32, 99,108, 97,115,115, 70,101, 97,116,117,114,101, - 44, 10,125, 10,115,101,116,116, 97,103, 40, 99,108, 97,115, - 115, 67,111,100,101, 44,116,111,108,117, 97, 95,116, 97,103, - 41, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, - 97,115,115, 67,111,100,101, 58,114,101,103,105,115,116,101, - 114, 32, 40, 41, 10, 10,108,111, 99, 97,108, 32,115, 32, 61, - 32, 99,108,101, 97,110, 40,115,101,108,102, 46,116,101,120, - 116, 41, 10,105,102, 32,110,111,116, 32,115, 32,116,104,101, - 110, 10,101,114,114,111,114, 40, 34,112, 97,114,115,101,114, - 32,101,114,114,111,114, 32,105,110, 32,101,109, 98,101,100, - 100,101,100, 32, 99,111,100,101, 34, 41, 10,101,110,100, 10, - 10, 10,111,117,116,112,117,116, 40, 39, 92,110, 32,123, 32, - 47, 42, 32, 98,101,103,105,110, 32,101,109, 98,101,100,100, - 101,100, 32,108,117, 97, 32, 99,111,100,101, 32, 42, 47, 92, - 110, 39, 41, 10,111,117,116,112,117,116, 40, 39, 32,115,116, - 97,116,105, 99, 32,117,110,115,105,103,110,101,100, 32, 99, - 104, 97,114, 32, 66, 91, 93, 32, 61, 32,123, 92,110, 32, 39, - 41, 10,108,111, 99, 97,108, 32,116, 61,123,110, 61, 48,125, - 10,108,111, 99, 97,108, 32, 98, 32, 61, 32,103,115,117, 98, - 40,115, 44, 39, 40, 46, 41, 39, 44,102,117,110, 99,116,105, - 111,110, 32, 40, 99, 41, 10,108,111, 99, 97,108, 32,101, 32, - 61, 32, 39, 39, 10, 37,116, 46,110, 61, 37,116, 46,110, 43, - 49, 32,105,102, 32, 37,116, 46,110, 61, 61, 49, 53, 32,116, - 104,101,110, 32, 37,116, 46,110, 61, 48, 32,101, 61, 39, 92, - 110, 32, 39, 32,101,110,100, 10,114,101,116,117,114,110, 32, - 102,111,114,109, 97,116, 40, 39, 37, 51,117, 44, 37,115, 39, - 44,115,116,114, 98,121,116,101, 40, 99, 41, 44,101, 41, 10, - 101,110,100, 10, 41, 10,111,117,116,112,117,116, 40, 98, 46, - 46,115,116,114, 98,121,116,101, 40, 34, 32, 34, 41, 41, 10, - 111,117,116,112,117,116, 40, 39, 92,110, 32,125, 59, 92,110, - 39, 41, 10,111,117,116,112,117,116, 40, 39, 32,108,117, 97, - 95,100,111, 98,117,102,102,101,114, 40,116,111,108,117, 97, - 95, 83, 44, 40, 99,104, 97,114, 42, 41, 66, 44,115,105,122, - 101,111,102, 40, 66, 41, 44, 34,116,111,108,117, 97, 58, 32, - 101,109, 98,101,100,100,101,100, 32, 76,117, 97, 32, 99,111, - 100,101, 34, 41, 59, 39, 41, 10,111,117,116,112,117,116, 40, - 39, 32,125, 32, 47, 42, 32,101,110,100, 32,111,102, 32,101, - 109, 98,101,100,100,101,100, 32,108,117, 97, 32, 99,111,100, - 101, 32, 42, 47, 92,110, 92,110, 39, 41, 10,101,110,100, 10, - 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97, - 115,115, 67,111,100,101, 58,112,114,105,110,116, 32, 40,105, - 100,101,110,116, 44, 99,108,111,115,101, 41, 10,112,114,105, - 110,116, 40,105,100,101,110,116, 46, 46, 34, 67,111,100,101, - 123, 34, 41, 10,112,114,105,110,116, 40,105,100,101,110,116, - 46, 46, 34, 32,116,101,120,116, 32, 61, 32, 91, 91, 34, 46, - 46,115,101,108,102, 46,116,101,120,116, 46, 46, 34, 93, 93, - 44, 34, 41, 10,112,114,105,110,116, 40,105,100,101,110,116, - 46, 46, 34,125, 34, 46, 46, 99,108,111,115,101, 41, 10,101, - 110,100, 10, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, - 95, 67,111,100,101, 32, 40,116, 41, 10,116, 46, 95, 98, 97, - 115,101, 32, 61, 32, 99,108, 97,115,115, 67,111,100,101, 10, - 115,101,116,116, 97,103, 40,116, 44,116,111,108,117, 97, 95, - 116, 97,103, 41, 10, 97,112,112,101,110,100, 40,116, 41, 10, - 114,101,116,117,114,110, 32,116, 10,101,110,100, 10, 10, 10, - 10,102,117,110, 99,116,105,111,110, 32, 67,111,100,101, 32, - 40,108, 41, 10,114,101,116,117,114,110, 32, 95, 67,111,100, - 101, 32,123, 10,116,101,120,116, 32, 61, 32,108, 10,125, 10, - 101,110,100, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 99,108, 97, - 115,115, 84,121,112,101,100,101,102, 32, 61, 32,123, 10,117, - 116,121,112,101, 32, 61, 32, 39, 39, 44, 10,109,111,100, 32, - 61, 32, 39, 39, 44, 10,116,121,112,101, 32, 61, 32, 39, 39, - 10,125, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 99, - 108, 97,115,115, 84,121,112,101,100,101,102, 58,112,114,105, - 110,116, 32, 40,105,100,101,110,116, 44, 99,108,111,115,101, - 41, 10,112,114,105,110,116, 40,105,100,101,110,116, 46, 46, - 34, 84,121,112,101,100,101,102,123, 34, 41, 10,112,114,105, - 110,116, 40,105,100,101,110,116, 46, 46, 34, 32,117,116,121, - 112,101, 32, 61, 32, 39, 34, 46, 46,115,101,108,102, 46,117, - 116,121,112,101, 46, 46, 34, 39, 44, 34, 41, 10,112,114,105, - 110,116, 40,105,100,101,110,116, 46, 46, 34, 32,109,111,100, - 32, 61, 32, 39, 34, 46, 46,115,101,108,102, 46,109,111,100, - 46, 46, 34, 39, 44, 34, 41, 10,112,114,105,110,116, 40,105, - 100,101,110,116, 46, 46, 34, 32,116,121,112,101, 32, 61, 32, - 39, 34, 46, 46,115,101,108,102, 46,116,121,112,101, 46, 46, - 34, 39, 44, 34, 41, 10,112,114,105,110,116, 40,105,100,101, - 110,116, 46, 46, 34,125, 34, 46, 46, 99,108,111,115,101, 41, - 10,101,110,100, 10, 10, 10,102,117,110, 99,116,105,111,110, - 32, 95, 84,121,112,101,100,101,102, 32, 40,116, 41, 10,116, - 46, 95, 98, 97,115,101, 32, 61, 32, 99,108, 97,115,115, 84, - 121,112,101,100,101,102, 10,115,101,116,116, 97,103, 40,116, - 44,116,111,108,117, 97, 95,116, 97,103, 41, 10, 97,112,112, - 101,110,100,116,121,112,101,100,101,102, 40,116, 41, 10,114, - 101,116,117,114,110, 32,116, 10,101,110,100, 10, 10, 10, 10, - 102,117,110, 99,116,105,111,110, 32, 84,121,112,101,100,101, - 102, 32, 40,115, 41, 10,105,102, 32,115,116,114,102,105,110, - 100, 40,115, 44, 39, 91, 37, 42, 38, 93, 39, 41, 32,116,104, - 101,110, 10,116,111,108,117, 97, 95,101,114,114,111,114, 40, - 34, 35,105,110,118, 97,108,105,100, 32,116,121,112,101,100, - 101,102, 58, 32,112,111,105,110,116,101,114,115, 32, 40, 97, - 110,100, 32,114,101,102,101,114,101,110, 99,101,115, 41, 32, - 97,114,101, 32,110,111,116, 32,115,117,112,112,111,114,116, - 101,100, 34, 41, 10,101,110,100, 10,108,111, 99, 97,108, 32, - 116, 32, 61, 32,115,112,108,105,116, 40,103,115,117, 98, 40, - 115, 44, 34, 37,115, 37,115, 42, 34, 44, 34, 32, 34, 41, 44, - 34, 32, 34, 41, 10,114,101,116,117,114,110, 32, 95, 84,121, - 112,101,100,101,102, 32,123, 10,117,116,121,112,101, 32, 61, - 32,116, 91,116, 46,110, 93, 44, 10,116,121,112,101, 32, 61, - 32,116, 91,116, 46,110, 45, 49, 93, 44, 10,109,111,100, 32, - 61, 32, 99,111,110, 99, 97,116, 40,116, 44, 49, 44,116, 46, - 110, 45, 50, 41, 10,125, 10,101,110,100, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 99,108, 97,115, - 115, 67,111,110,116, 97,105,110,101,114, 32, 61, 10,123, 10, - 99,117,114,114, 32, 61, 32,110,105,108, 44, 10, 95, 98, 97, - 115,101, 32, 61, 32, 99,108, 97,115,115, 70,101, 97,116,117, - 114,101, 44, 10,125, 10,115,101,116,116, 97,103, 40, 99,108, - 97,115,115, 67,111,110,116, 97,105,110,101,114, 44,116,111, - 108,117, 97, 95,116, 97,103, 41, 10, 10, 10,102,117,110, 99, - 116,105,111,110, 32, 99,108, 97,115,115, 67,111,110,116, 97, - 105,110,101,114, 58,100,101, 99,108,116, 97,103, 32, 40, 41, - 10,112,117,115,104, 40,115,101,108,102, 41, 10,108,111, 99, - 97,108, 32,105, 61, 49, 10,119,104,105,108,101, 32,115,101, - 108,102, 91,105, 93, 32,100,111, 10,115,101,108,102, 91,105, - 93, 58,100,101, 99,108,116, 97,103, 40, 41, 10,105, 32, 61, - 32,105, 43, 49, 10,101,110,100, 10,112,111,112, 40, 41, 10, - 101,110,100, 10, 10, 10, 10,102,117,110, 99,116,105,111,110, - 32, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, - 58,115,117,112, 99,111,100,101, 32, 40, 41, 10,112,117,115, - 104, 40,115,101,108,102, 41, 10,108,111, 99, 97,108, 32,105, - 61, 49, 10,119,104,105,108,101, 32,115,101,108,102, 91,105, - 93, 32,100,111, 10,115,101,108,102, 91,105, 93, 58,115,117, - 112, 99,111,100,101, 40, 41, 10,105, 32, 61, 32,105, 43, 49, - 10,101,110,100, 10,112,111,112, 40, 41, 10,101,110,100, 10, - 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 95, 67,111, - 110,116, 97,105,110,101,114, 32, 40,115,101,108,102, 41, 10, - 115,101,108,102, 46, 95, 98, 97,115,101, 32, 61, 32, 99,108, - 97,115,115, 67,111,110,116, 97,105,110,101,114, 10,115,101, - 116,116, 97,103, 40,115,101,108,102, 44,116,111,108,117, 97, - 95,116, 97,103, 41, 10,115,101,108,102, 46,110, 32, 61, 32, - 48, 10,115,101,108,102, 46,116,121,112,101,100,101,102,115, - 32, 61, 32,123,110, 61, 48,125, 10,115,101,108,102, 46,108, - 110, 97,109,101,115, 32, 61, 32,123,125, 10,114,101,116,117, - 114,110, 32,115,101,108,102, 10,101,110,100, 10, 10, 10,102, - 117,110, 99,116,105,111,110, 32,112,117,115,104, 32, 40,116, - 41, 10, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101, - 114, 46, 99,117,114,114, 32, 61, 32,116, 10,101,110,100, 10, - 10, 10,102,117,110, 99,116,105,111,110, 32,112,111,112, 32, - 40, 41, 10, 99,108, 97,115,115, 67,111,110,116, 97,105,110, - 101,114, 46, 99,117,114,114, 32, 61, 32, 99,108, 97,115,115, - 67,111,110,116, 97,105,110,101,114, 46, 99,117,114,114, 46, - 112, 97,114,101,110,116, 10,101,110,100, 10, 10, 10,102,117, - 110, 99,116,105,111,110, 32, 97,112,112,101,110,100, 32, 40, - 116, 41, 10,114,101,116,117,114,110, 32, 99,108, 97,115,115, - 67,111,110,116, 97,105,110,101,114, 46, 99,117,114,114, 58, - 97,112,112,101,110,100, 40,116, 41, 10,101,110,100, 10, 10, - 10,102,117,110, 99,116,105,111,110, 32, 97,112,112,101,110, - 100,116,121,112,101,100,101,102, 32, 40,116, 41, 10,114,101, - 116,117,114,110, 32, 99,108, 97,115,115, 67,111,110,116, 97, - 105,110,101,114, 46, 99,117,114,114, 58, 97,112,112,101,110, - 100,116,121,112,101,100,101,102, 40,116, 41, 10,101,110,100, - 10, 10, 10,102,117,110, 99,116,105,111,110, 32,102,105,110, - 100,116,121,112,101,100,101,102, 32, 40,116,121,112,101, 41, - 10,114,101,116,117,114,110, 32, 99,108, 97,115,115, 67,111, - 110,116, 97,105,110,101,114, 46, 99,117,114,114, 58,102,105, - 110,100,116,121,112,101,100,101,102, 40,116,121,112,101, 41, - 10,101,110,100, 10, 10, 10,102,117,110, 99,116,105,111,110, - 32,105,115,116,121,112,101,100,101,102, 32, 40,116,121,112, - 101, 41, 10,114,101,116,117,114,110, 32, 99,108, 97,115,115, - 67,111,110,116, 97,105,110,101,114, 46, 99,117,114,114, 58, - 105,115,116,121,112,101,100,101,102, 40,116,121,112,101, 41, - 10,101,110,100, 10, 10, 10,102,117,110, 99,116,105,111,110, - 32, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, - 58, 97,112,112,101,110,100, 32, 40,116, 41, 10,115,101,108, - 102, 46,110, 32, 61, 32,115,101,108,102, 46,110, 32, 43, 32, - 49, 10,115,101,108,102, 91,115,101,108,102, 46,110, 93, 32, - 61, 32,116, 10,116, 46,112, 97,114,101,110,116, 32, 61, 32, - 115,101,108,102, 10,101,110,100, 10, 10, 10,102,117,110, 99, - 116,105,111,110, 32, 99,108, 97,115,115, 67,111,110,116, 97, - 105,110,101,114, 58, 97,112,112,101,110,100,116,121,112,101, - 100,101,102, 32, 40,116, 41, 10,115,101,108,102, 46,116,121, - 112,101,100,101,102,115, 46,110, 32, 61, 32,115,101,108,102, - 46,116,121,112,101,100,101,102,115, 46,110, 32, 43, 32, 49, - 10,115,101,108,102, 46,116,121,112,101,100,101,102,115, 91, - 115,101,108,102, 46,116,121,112,101,100,101,102,115, 46,110, - 93, 32, 61, 32,116, 10,101,110,100, 10, 10, 10,102,117,110, - 99,116,105,111,110, 32, 99,108, 97,115,115, 67,111,110,116, - 97,105,110,101,114, 58,111,118,101,114,108,111, 97,100, 32, - 40,108,110, 97,109,101, 41, 10,105,102, 32,110,111,116, 32, - 115,101,108,102, 46,108,110, 97,109,101,115, 91,108,110, 97, - 109,101, 93, 32,116,104,101,110, 10,115,101,108,102, 46,108, - 110, 97,109,101,115, 91,108,110, 97,109,101, 93, 32, 61, 32, - 48, 10,101,108,115,101, 10,115,101,108,102, 46,108,110, 97, - 109,101,115, 91,108,110, 97,109,101, 93, 32, 61, 32,115,101, - 108,102, 46,108,110, 97,109,101,115, 91,108,110, 97,109,101, - 93, 32, 43, 32, 49, 10,101,110,100, 10,114,101,116,117,114, - 110, 32,102,111,114,109, 97,116, 40, 34, 37, 48, 50,100, 34, - 44,115,101,108,102, 46,108,110, 97,109,101,115, 91,108,110, - 97,109,101, 93, 41, 10,101,110,100, 10, 10,102,117,110, 99, - 116,105,111,110, 32, 99,108, 97,115,115, 67,111,110,116, 97, - 105,110,101,114, 58,102,105,110,100,116,121,112,101,100,101, - 102, 32, 40,116,121,112,101, 41, 10,108,111, 99, 97,108, 32, - 101,110,118, 32, 61, 32,115,101,108,102, 10,119,104,105,108, - 101, 32,101,110,118, 32,100,111, 10,105,102, 32,101,110,118, - 46,116,121,112,101,100,101,102,115, 32,116,104,101,110, 10, - 108,111, 99, 97,108, 32,105, 61, 49, 10,119,104,105,108,101, - 32,101,110,118, 46,116,121,112,101,100,101,102,115, 91,105, - 93, 32,100,111, 10,105,102, 32,101,110,118, 46,116,121,112, - 101,100,101,102,115, 91,105, 93, 46,117,116,121,112,101, 32, - 61, 61, 32,116,121,112,101, 32,116,104,101,110, 10,108,111, - 99, 97,108, 32,109,111,100, 49, 44,116,121,112,101, 49, 32, - 61, 32,101,110,118, 46,116,121,112,101,100,101,102,115, 91, - 105, 93, 46,109,111,100, 44,101,110,118, 46,116,121,112,101, - 100,101,102,115, 91,105, 93, 46,116,121,112,101, 10,108,111, - 99, 97,108, 32,109,111,100, 50, 44,116,121,112,101, 50, 32, - 61, 32,102,105,110,100,116,121,112,101,100,101,102, 40,116, - 121,112,101, 49, 41, 10,114,101,116,117,114,110, 32,109,111, - 100, 50, 46, 46, 39, 32, 39, 46, 46,109,111,100, 49, 44,116, - 121,112,101, 50, 10,101,110,100, 10,105, 32, 61, 32,105, 43, - 49, 10,101,110,100, 10,101,110,100, 10,101,110,118, 32, 61, - 32,101,110,118, 46,112, 97,114,101,110,116, 10,101,110,100, - 10,114,101,116,117,114,110, 32, 39, 39, 44,116,121,112,101, - 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32, - 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, 58, - 105,115,116,121,112,101,100,101,102, 32, 40,116,121,112,101, - 41, 10,108,111, 99, 97,108, 32,101,110,118, 32, 61, 32,115, - 101,108,102, 10,119,104,105,108,101, 32,101,110,118, 32,100, - 111, 10,105,102, 32,101,110,118, 46,116,121,112,101,100,101, - 102,115, 32,116,104,101,110, 10,108,111, 99, 97,108, 32,105, - 61, 49, 10,119,104,105,108,101, 32,101,110,118, 46,116,121, - 112,101,100,101,102,115, 91,105, 93, 32,100,111, 10,105,102, - 32,101,110,118, 46,116,121,112,101,100,101,102,115, 91,105, - 93, 46,117,116,121,112,101, 32, 61, 61, 32,116,121,112,101, - 32,116,104,101,110, 10,114,101,116,117,114,110, 32, 49, 10, - 101,110,100, 10,105, 32, 61, 32,105, 43, 49, 10,101,110,100, - 10,101,110,100, 10,101,110,118, 32, 61, 32,101,110,118, 46, - 112, 97,114,101,110,116, 10,101,110,100, 10,114,101,116,117, - 114,110, 32,110,105,108, 10,101,110,100, 10, 10, 10,102,117, - 110, 99,116,105,111,110, 32, 99,108, 97,115,115, 67,111,110, - 116, 97,105,110,101,114, 58,100,111,112, 97,114,115,101, 32, - 40,115, 41, 10, 10, 10,100,111, 10,108,111, 99, 97,108, 32, - 98, 44,101, 44,110, 97,109,101, 44, 98,111,100,121, 32, 61, - 32,115,116,114,102,105,110,100, 40,115, 44, 34, 94, 37,115, - 42,109,111,100,117,108,101, 37,115, 37,115, 42, 40, 91, 95, - 37,119, 93, 91, 95, 37,119, 93, 42, 41, 37,115, 42, 40, 37, - 98,123,125, 41, 37,115, 42, 34, 41, 10,105,102, 32, 98, 32, - 116,104,101,110, 10, 95, 99,117,114,114, 95, 99,111,100,101, - 32, 61, 32,115,116,114,115,117, 98, 40,115, 44, 98, 44,101, - 41, 10, 77,111,100,117,108,101, 40,110, 97,109,101, 44, 98, - 111,100,121, 41, 10,114,101,116,117,114,110, 32,115,116,114, - 115,117, 98, 40,115, 44,101, 43, 49, 41, 10,101,110,100, 10, - 101,110,100, 10, 10, 10,100,111, 10,108,111, 99, 97,108, 32, - 98, 44,101, 44,110, 97,109,101, 32, 61, 32,115,116,114,102, - 105,110,100, 40,115, 44, 34, 94, 37,115, 42, 35,100,101,102, - 105,110,101, 37,115, 37,115, 42, 40, 91, 94, 37,115, 93, 42, - 41, 91, 94, 92,110, 93, 42, 92,110, 37,115, 42, 34, 41, 10, - 105,102, 32, 98, 32,116,104,101,110, 10, 95, 99,117,114,114, - 95, 99,111,100,101, 32, 61, 32,115,116,114,115,117, 98, 40, - 115, 44, 98, 44,101, 41, 10, 68,101,102,105,110,101, 40,110, - 97,109,101, 41, 10,114,101,116,117,114,110, 32,115,116,114, - 115,117, 98, 40,115, 44,101, 43, 49, 41, 10,101,110,100, 10, - 101,110,100, 10, 10, 10,100,111, 10,108,111, 99, 97,108, 32, - 98, 44,101, 44, 98,111,100,121, 32, 61, 32,115,116,114,102, - 105,110,100, 40,115, 44, 34, 94, 37,115, 42,101,110,117,109, - 91, 94,123, 93, 42, 40, 37, 98,123,125, 41, 37,115, 42, 59, - 63, 37,115, 42, 34, 41, 10,105,102, 32, 98, 32,116,104,101, - 110, 10, 95, 99,117,114,114, 95, 99,111,100,101, 32, 61, 32, - 115,116,114,115,117, 98, 40,115, 44, 98, 44,101, 41, 10, 69, - 110,117,109,101,114, 97,116,101, 40, 98,111,100,121, 41, 10, - 114,101,116,117,114,110, 32,115,116,114,115,117, 98, 40,115, - 44,101, 43, 49, 41, 10,101,110,100, 10,101,110,100, 10, 10, - 100,111, 10,108,111, 99, 97,108, 32, 98, 44,101, 44, 98,111, - 100,121, 44,110, 97,109,101, 32, 61, 32,115,116,114,102,105, - 110,100, 40,115, 44, 34, 94, 37,115, 42,116,121,112,101,100, - 101,102, 37,115, 37,115, 42,101,110,117,109, 91, 94,123, 93, - 42, 40, 37, 98,123,125, 41, 37,115, 42, 40, 91, 37,119, 95, - 93, 91, 94, 37,115, 93, 42, 41, 37,115, 42, 59, 37,115, 42, - 34, 41, 10,105,102, 32, 98, 32,116,104,101,110, 10, 95, 99, - 117,114,114, 95, 99,111,100,101, 32, 61, 32,115,116,114,115, - 117, 98, 40,115, 44, 98, 44,101, 41, 10, 69,110,117,109,101, - 114, 97,116,101, 40, 98,111,100,121, 41, 10, 84,121,112,101, - 100,101,102, 40, 34,105,110,116, 32, 34, 46, 46,110, 97,109, - 101, 41, 10,114,101,116,117,114,110, 32,115,116,114,115,117, - 98, 40,115, 44,101, 43, 49, 41, 10,101,110,100, 10,101,110, - 100, 10, 10, 10,100,111, 10,108,111, 99, 97,108, 32, 98, 44, - 101, 44,100,101, 99,108, 44,107,105,110,100, 44, 97,114,103, - 44, 99,111,110,115,116, 32, 61, 32,115,116,114,102,105,110, - 100, 40,115, 44, 34, 94, 37,115, 42, 40, 91, 95, 37,119, 93, - 91, 95, 37,119, 37,115, 37, 42, 38, 93, 42,111,112,101,114, - 97,116,111,114, 41, 37,115, 42, 40, 91, 94, 37,115, 93, 91, - 94, 37,115, 93, 42, 41, 37,115, 42, 40, 37, 98, 40, 41, 41, - 37,115, 42, 40, 99, 63,111, 63,110, 63,115, 63,116, 63, 41, - 37,115, 42, 59, 37,115, 42, 34, 41, 10,105,102, 32, 98, 32, - 116,104,101,110, 10, 95, 99,117,114,114, 95, 99,111,100,101, - 32, 61, 32,115,116,114,115,117, 98, 40,115, 44, 98, 44,101, - 41, 10, 79,112,101,114, 97,116,111,114, 40,100,101, 99,108, - 44,107,105,110,100, 44, 97,114,103, 44, 99,111,110,115,116, - 41, 10,114,101,116,117,114,110, 32,115,116,114,115,117, 98, - 40,115, 44,101, 43, 49, 41, 10,101,110,100, 10,101,110,100, - 10, 10, 10,100,111, 10,108,111, 99, 97,108, 32, 98, 44,101, - 44,100,101, 99,108, 44, 97,114,103, 44, 99,111,110,115,116, - 32, 61, 32,115,116,114,102,105,110,100, 40,115, 44, 34, 94, - 37,115, 42, 40, 91,126, 95, 37,119, 93, 91, 95, 64, 37,119, - 37,115, 37, 42, 38, 93, 42, 91, 95, 37,119, 93, 41, 37,115, - 42, 40, 37, 98, 40, 41, 41, 37,115, 42, 40, 99, 63,111, 63, - 110, 63,115, 63,116, 63, 41, 37,115, 42, 61, 63, 37,115, 42, - 48, 63, 37,115, 42, 59, 37,115, 42, 34, 41, 10,105,102, 32, - 110,111,116, 32, 98, 32,116,104,101,110, 10, 10, 98, 44,101, - 44,100,101, 99,108, 44, 97,114,103, 44, 99,111,110,115,116, - 32, 61, 32,115,116,114,102,105,110,100, 40,115, 44, 34, 94, - 37,115, 42, 40, 91, 95, 37,119, 93, 41, 37,115, 42, 40, 37, - 98, 40, 41, 41, 37,115, 42, 40, 99, 63,111, 63,110, 63,115, - 63,116, 63, 41, 37,115, 42, 59, 37,115, 42, 34, 41, 10,101, - 110,100, 10,105,102, 32, 98, 32,116,104,101,110, 10, 95, 99, - 117,114,114, 95, 99,111,100,101, 32, 61, 32,115,116,114,115, - 117, 98, 40,115, 44, 98, 44,101, 41, 10, 70,117,110, 99,116, - 105,111,110, 40,100,101, 99,108, 44, 97,114,103, 44, 99,111, - 110,115,116, 41, 10,114,101,116,117,114,110, 32,115,116,114, - 115,117, 98, 40,115, 44,101, 43, 49, 41, 10,101,110,100, 10, - 101,110,100, 10, 10, 10,100,111, 10,108,111, 99, 97,108, 32, - 98, 44,101, 44,100,101, 99,108, 44, 97,114,103, 44, 99,111, - 110,115,116, 32, 61, 32,115,116,114,102,105,110,100, 40,115, - 44, 34, 94, 37,115, 42, 40, 91,126, 95, 37,119, 93, 91, 95, - 64, 37,119, 37,115, 37, 42, 38, 93, 42, 91, 95, 37,119, 93, - 41, 37,115, 42, 40, 37, 98, 40, 41, 41, 37,115, 42, 40, 99, - 63,111, 63,110, 63,115, 63,116, 63, 41, 37,115, 42, 37, 98, - 123,125, 37,115, 42, 34, 41, 10,105,102, 32,110,111,116, 32, - 98, 32,116,104,101,110, 10, 10, 98, 44,101, 44,100,101, 99, - 108, 44, 97,114,103, 44, 99,111,110,115,116, 32, 61, 32,115, - 116,114,102,105,110,100, 40,115, 44, 34, 94, 37,115, 42, 40, - 91, 95, 37,119, 93, 41, 37,115, 42, 40, 37, 98, 40, 41, 41, - 37,115, 42, 40, 99, 63,111, 63,110, 63,115, 63,116, 63, 41, - 37,115, 42, 37, 98,123,125, 37,115, 42, 34, 41, 10,101,110, - 100, 10,105,102, 32, 98, 32,116,104,101,110, 10, 95, 99,117, - 114,114, 95, 99,111,100,101, 32, 61, 32,115,116,114,115,117, - 98, 40,115, 44, 98, 44,101, 41, 10, 70,117,110, 99,116,105, - 111,110, 40,100,101, 99,108, 44, 97,114,103, 44, 99,111,110, - 115,116, 41, 10,114,101,116,117,114,110, 32,115,116,114,115, - 117, 98, 40,115, 44,101, 43, 49, 41, 10,101,110,100, 10,101, - 110,100, 10, 10, 10,100,111, 10,108,111, 99, 97,108, 32, 98, - 44,101, 44,110, 97,109,101, 44, 98, 97,115,101, 44, 98,111, - 100,121, 32, 61, 32,115,116,114,102,105,110,100, 40,115, 44, - 34, 94, 37,115, 42, 99,108, 97,115,115, 37,115, 42, 40, 91, - 95, 37,119, 93, 91, 95, 37,119, 93, 42, 41, 37,115, 42, 40, - 46, 45, 41, 37,115, 42, 40, 37, 98,123,125, 41, 37,115, 42, - 59, 37,115, 42, 34, 41, 10,105,102, 32,110,111,116, 32, 98, - 32,116,104,101,110, 10, 98, 44,101, 44,110, 97,109,101, 44, - 98, 97,115,101, 44, 98,111,100,121, 32, 61, 32,115,116,114, - 102,105,110,100, 40,115, 44, 34, 94, 37,115, 42,115,116,114, - 117, 99,116, 37,115, 42, 40, 91, 95, 37,119, 93, 91, 95, 37, - 119, 93, 42, 41, 37,115, 42, 40, 46, 45, 41, 37,115, 42, 40, - 37, 98,123,125, 41, 37,115, 42, 59, 37,115, 42, 34, 41, 10, - 105,102, 32,110,111,116, 32, 98, 32,116,104,101,110, 10, 98, - 97,115,101, 32, 61, 32, 39, 39, 10, 98, 44,101, 44, 98,111, - 100,121, 44,110, 97,109,101, 32, 61, 32,115,116,114,102,105, - 110,100, 40,115, 44, 34, 94, 37,115, 42,116,121,112,101,100, - 101,102, 37,115, 37,115, 42,115,116,114,117, 99,116, 37,115, - 37,115, 42, 91, 95, 37,119, 93, 42, 37,115, 42, 40, 37, 98, - 123,125, 41, 37,115, 42, 40, 91, 95, 37,119, 93, 91, 95, 37, - 119, 93, 42, 41, 37,115, 42, 59, 37,115, 42, 34, 41, 10,101, - 110,100, 10,101,110,100, 10,105,102, 32, 98, 32,116,104,101, - 110, 10,105,102, 32, 98, 97,115,101, 32,126, 61, 32, 39, 39, - 32,116,104,101,110, 10,108,111, 99, 97,108, 32, 98, 44,101, - 10, 98, 44,101, 44, 98, 97,115,101, 32, 61, 32,115,116,114, - 102,105,110,100, 40, 98, 97,115,101, 44, 34, 46, 45, 40, 91, - 95, 37,119, 93, 91, 95, 37,119, 93, 42, 41, 36, 34, 41, 10, - 101,110,100, 10, 95, 99,117,114,114, 95, 99,111,100,101, 32, - 61, 32,115,116,114,115,117, 98, 40,115, 44, 98, 44,101, 41, - 10, 67,108, 97,115,115, 40,110, 97,109,101, 44, 98, 97,115, - 101, 44, 98,111,100,121, 41, 10,114,101,116,117,114,110, 32, - 115,116,114,115,117, 98, 40,115, 44,101, 43, 49, 41, 10,101, - 110,100, 10,101,110,100, 10, 10, 10,100,111, 10,108,111, 99, - 97,108, 32, 98, 44,101, 44,116,121,112,101,115, 32, 61, 32, - 115,116,114,102,105,110,100, 40,115, 44, 34, 94, 37,115, 42, - 116,121,112,101,100,101,102, 37,115, 37,115, 42, 40, 46, 45, - 41, 37,115, 42, 59, 37,115, 42, 34, 41, 10,105,102, 32, 98, - 32,116,104,101,110, 10, 95, 99,117,114,114, 95, 99,111,100, - 101, 32, 61, 32,115,116,114,115,117, 98, 40,115, 44, 98, 44, - 101, 41, 10, 84,121,112,101,100,101,102, 40,116,121,112,101, - 115, 41, 10,114,101,116,117,114,110, 32,115,116,114,115,117, - 98, 40,115, 44,101, 43, 49, 41, 10,101,110,100, 10,101,110, - 100, 10, 10, 10,100,111, 10,108,111, 99, 97,108, 32, 98, 44, - 101, 44,100,101, 99,108, 32, 61, 32,115,116,114,102,105,110, - 100, 40,115, 44, 34, 94, 37,115, 42, 40, 91, 95, 37,119, 93, - 91, 95, 64, 37,115, 37,119, 37,100, 37, 42, 38, 93, 42, 91, - 95, 37,119, 37,100, 93, 41, 37,115, 42, 59, 37,115, 42, 34, - 41, 10,105,102, 32, 98, 32,116,104,101,110, 10, 95, 99,117, - 114,114, 95, 99,111,100,101, 32, 61, 32,115,116,114,115,117, - 98, 40,115, 44, 98, 44,101, 41, 10, 86, 97,114,105, 97, 98, - 108,101, 40,100,101, 99,108, 41, 10,114,101,116,117,114,110, - 32,115,116,114,115,117, 98, 40,115, 44,101, 43, 49, 41, 10, - 101,110,100, 10,101,110,100, 10, 10, 10,100,111, 10,108,111, - 99, 97,108, 32, 98, 44,101, 44,100,101, 99,108, 32, 61, 32, - 115,116,114,102,105,110,100, 40,115, 44, 34, 94, 37,115, 42, - 40, 91, 95, 37,119, 93, 91, 93, 91, 95, 64, 37,115, 37,119, - 37,100, 37, 42, 38, 37, 45, 37, 62, 93, 42, 91, 93, 95, 37, - 119, 37,100, 93, 41, 37,115, 42, 59, 37,115, 42, 34, 41, 10, - 105,102, 32, 98, 32,116,104,101,110, 10, 95, 99,117,114,114, - 95, 99,111,100,101, 32, 61, 32,115,116,114,115,117, 98, 40, - 115, 44, 98, 44,101, 41, 10, 65,114,114, 97,121, 40,100,101, - 99,108, 41, 10,114,101,116,117,114,110, 32,115,116,114,115, - 117, 98, 40,115, 44,101, 43, 49, 41, 10,101,110,100, 10,101, - 110,100, 10, 10, 10,100,111, 10,108,111, 99, 97,108, 32, 98, - 44,101, 44, 99,111,100,101, 32, 61, 32,115,116,114,102,105, - 110,100, 40,115, 44, 34, 94, 37,115, 42, 40, 37, 98, 92, 49, - 92, 50, 41, 34, 41, 10,105,102, 32, 98, 32,116,104,101,110, - 10, 67,111,100,101, 40,115,116,114,115,117, 98, 40, 99,111, - 100,101, 44, 50, 44, 45, 50, 41, 41, 10,114,101,116,117,114, - 110, 32,115,116,114,115,117, 98, 40,115, 44,101, 43, 49, 41, - 10,101,110,100, 10,101,110,100, 10, 10, 10,100,111, 10,108, - 111, 99, 97,108, 32, 98, 44,101, 44,108,105,110,101, 32, 61, - 32,115,116,114,102,105,110,100, 40,115, 44, 34, 94, 37,115, - 42, 37, 36, 40, 46, 45, 92,110, 41, 34, 41, 10,105,102, 32, - 98, 32,116,104,101,110, 10, 86,101,114, 98, 97,116,105,109, - 40,108,105,110,101, 41, 10,114,101,116,117,114,110, 32,115, - 116,114,115,117, 98, 40,115, 44,101, 43, 49, 41, 10,101,110, - 100, 10,101,110,100, 10, 10, 10,105,102, 32,103,115,117, 98, - 40,115, 44, 34, 37,115, 37,115, 42, 34, 44, 34, 34, 41, 32, - 126, 61, 32, 34, 34, 32,116,104,101,110, 10, 95, 99,117,114, - 114, 95, 99,111,100,101, 32, 61, 32,115, 10,101,114,114,111, - 114, 40, 34, 35,112, 97,114,115,101, 32,101,114,114,111,114, - 34, 41, 10,101,108,115,101, 10,114,101,116,117,114,110, 32, - 34, 34, 10,101,110,100, 10,101,110,100, 10, 10,102,117,110, - 99,116,105,111,110, 32, 99,108, 97,115,115, 67,111,110,116, - 97,105,110,101,114, 58,112, 97,114,115,101, 32, 40,115, 41, - 10,119,104,105,108,101, 32,115, 32,126, 61, 32, 39, 39, 32, - 100,111, 10,115, 32, 61, 32,115,101,108,102, 58,100,111,112, - 97,114,115,101, 40,115, 41, 10,101,110,100, 10,101,110,100, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 99,108, 97,115,115, 80, 97, 99,107, 97, - 103,101, 32, 61, 32,123, 10, 95, 98, 97,115,101, 32, 61, 32, - 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, 44, - 10,116,121,112,101, 32, 61, 32, 39,112, 97, 99,107, 97,103, - 101, 39, 10,125, 10,115,101,116,116, 97,103, 40, 99,108, 97, - 115,115, 80, 97, 99,107, 97,103,101, 44,116,111,108,117, 97, - 95,116, 97,103, 41, 10, 10, 10,102,117,110, 99,116,105,111, - 110, 32, 99,108, 97,115,115, 80, 97, 99,107, 97,103,101, 58, - 112,114,105,110,116, 32, 40, 41, 10,112,114,105,110,116, 40, - 34, 80, 97, 99,107, 97,103,101, 58, 32, 34, 46, 46,115,101, - 108,102, 46,110, 97,109,101, 41, 10,108,111, 99, 97,108, 32, - 105, 61, 49, 10,119,104,105,108,101, 32,115,101,108,102, 91, - 105, 93, 32,100,111, 10,115,101,108,102, 91,105, 93, 58,112, - 114,105,110,116, 40, 34, 34, 44, 34, 34, 41, 10,105, 32, 61, - 32,105, 43, 49, 10,101,110,100, 10,101,110,100, 10, 10,102, - 117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 80, 97, - 99,107, 97,103,101, 58,112,114,101,112,114,111, 99,101,115, - 115, 32, 40, 41, 10,115,101,108,102, 46, 99,111,100,101, 32, - 61, 32, 34, 92,110, 34, 46, 46,115,101,108,102, 46, 99,111, - 100,101, 10, 10,108,111, 99, 97,108, 32, 86, 32, 61, 32,123, - 125, 10,115,101,108,102, 46, 99,111,100,101, 32, 61, 32,103, - 115,117, 98, 40,115,101,108,102, 46, 99,111,100,101, 44, 34, - 92,110, 40, 37,115, 42, 37, 36, 91, 94, 37, 91, 37, 93, 93, - 91, 94, 92,110, 93, 42, 41, 34, 44,102,117,110, 99,116,105, - 111,110, 32, 40,118, 41, 10,116,105,110,115,101,114,116, 40, - 37, 86, 44,118, 41, 10,114,101,116,117,114,110, 32, 34, 92, - 110, 36, 34, 46, 46,103,101,116,110, 40, 37, 86, 41, 46, 46, - 34, 36, 34, 10,101,110,100, 41, 10, 10,108,111, 99, 97,108, - 32, 67, 32, 61, 32,123,125, 10,115,101,108,102, 46, 99,111, - 100,101, 32, 61, 32,103,115,117, 98, 40,115,101,108,102, 46, - 99,111,100,101, 44, 34, 92,110, 37,115, 42, 37, 36, 37, 91, - 34, 44, 34, 92, 49, 34, 41, 10,115,101,108,102, 46, 99,111, - 100,101, 32, 61, 32,103,115,117, 98, 40,115,101,108,102, 46, - 99,111,100,101, 44, 34, 92,110, 37,115, 42, 37, 36, 37, 93, - 34, 44, 34, 92, 50, 34, 41, 10,115,101,108,102, 46, 99,111, - 100,101, 32, 61, 32,103,115,117, 98, 40,115,101,108,102, 46, - 99,111,100,101, 44, 34, 40, 37, 98, 92, 49, 92, 50, 41, 34, - 44, 32,102,117,110, 99,116,105,111,110, 32, 40, 99, 41, 10, - 116,105,110,115,101,114,116, 40, 37, 67, 44, 99, 41, 10,114, - 101,116,117,114,110, 32, 34, 92,110, 36, 91, 34, 46, 46,103, - 101,116,110, 40, 37, 67, 41, 46, 46, 34, 93, 36, 34, 10,101, - 110,100, 41, 10, 10, 10,115,101,108,102, 46, 99,111,100,101, - 32, 61, 32,103,115,117, 98, 40,115,101,108,102, 46, 99,111, - 100,101, 44, 34, 40, 47, 47, 91, 94, 92,110, 93, 42, 41, 34, - 44, 34, 34, 41, 10,115,101,108,102, 46, 99,111,100,101, 32, - 61, 32,103,115,117, 98, 40,115,101,108,102, 46, 99,111,100, - 101, 44, 34, 47, 37, 42, 34, 44, 34, 92, 49, 34, 41, 10,115, - 101,108,102, 46, 99,111,100,101, 32, 61, 32,103,115,117, 98, - 40,115,101,108,102, 46, 99,111,100,101, 44, 34, 37, 42, 47, - 34, 44, 34, 92, 50, 34, 41, 10,115,101,108,102, 46, 99,111, - 100,101, 32, 61, 32,103,115,117, 98, 40,115,101,108,102, 46, - 99,111,100,101, 44, 34, 37, 98, 92, 49, 92, 50, 34, 44, 34, - 34, 41, 10,115,101,108,102, 46, 99,111,100,101, 32, 61, 32, - 103,115,117, 98, 40,115,101,108,102, 46, 99,111,100,101, 44, - 34, 92, 49, 34, 44, 34, 47, 37, 42, 34, 41, 10,115,101,108, - 102, 46, 99,111,100,101, 32, 61, 32,103,115,117, 98, 40,115, - 101,108,102, 46, 99,111,100,101, 44, 34, 92, 50, 34, 44, 34, - 37, 42, 47, 34, 41, 10,115,101,108,102, 46, 99,111,100,101, - 32, 61, 32,103,115,117, 98, 40,115,101,108,102, 46, 99,111, - 100,101, 44, 34, 37,115, 42, 64, 37,115, 42, 34, 44, 34, 64, - 34, 41, 10,115,101,108,102, 46, 99,111,100,101, 32, 61, 32, - 103,115,117, 98, 40,115,101,108,102, 46, 99,111,100,101, 44, - 34, 37,115, 63,105,110,108,105,110,101, 40, 37,115, 41, 34, - 44, 34, 37, 49, 34, 41, 10,115,101,108,102, 46, 99,111,100, - 101, 32, 61, 32,103,115,117, 98, 40,115,101,108,102, 46, 99, - 111,100,101, 44, 34, 37,115, 63,101,120,116,101,114,110, 40, - 37,115, 41, 34, 44, 34, 37, 49, 34, 41, 10,115,101,108,102, - 46, 99,111,100,101, 32, 61, 32,103,115,117, 98, 40,115,101, - 108,102, 46, 99,111,100,101, 44, 34, 37,115, 63,118,105,114, - 116,117, 97,108, 40, 37,115, 41, 34, 44, 34, 37, 49, 34, 41, - 10,115,101,108,102, 46, 99,111,100,101, 32, 61, 32,103,115, - 117, 98, 40,115,101,108,102, 46, 99,111,100,101, 44, 34,112, - 117, 98,108,105, 99, 58, 34, 44, 34, 34, 41, 10,115,101,108, - 102, 46, 99,111,100,101, 32, 61, 32,103,115,117, 98, 40,115, - 101,108,102, 46, 99,111,100,101, 44, 34, 40, 91, 94, 37,119, - 95, 93, 41,118,111,105,100, 37,115, 42, 37, 42, 34, 44, 34, - 37, 49, 95,117,115,101,114,100, 97,116, 97, 32, 34, 41, 10, - 115,101,108,102, 46, 99,111,100,101, 32, 61, 32,103,115,117, - 98, 40,115,101,108,102, 46, 99,111,100,101, 44, 34, 40, 91, - 94, 37,119, 95, 93, 41,118,111,105,100, 37,115, 42, 37, 42, - 34, 44, 34, 37, 49, 95,117,115,101,114,100, 97,116, 97, 32, - 34, 41, 10,115,101,108,102, 46, 99,111,100,101, 32, 61, 32, - 103,115,117, 98, 40,115,101,108,102, 46, 99,111,100,101, 44, - 34, 40, 91, 94, 37,119, 95, 93, 41, 99,104, 97,114, 37,115, - 42, 37, 42, 34, 44, 34, 37, 49, 95, 99,115,116,114,105,110, - 103, 32, 34, 41, 10, 10, 10,115,101,108,102, 46, 99,111,100, - 101, 32, 61, 32,103,115,117, 98, 40,115,101,108,102, 46, 99, - 111,100,101, 44, 34, 37, 36, 37, 91, 40, 37,100, 43, 41, 37, - 93, 37, 36, 34, 44,102,117,110, 99,116,105,111,110, 32, 40, - 110, 41, 10,114,101,116,117,114,110, 32, 37, 67, 91,116,111, - 110,117,109, 98,101,114, 40,110, 41, 93, 10,101,110,100, 41, - 10, 10,115,101,108,102, 46, 99,111,100,101, 32, 61, 32,103, - 115,117, 98, 40,115,101,108,102, 46, 99,111,100,101, 44, 34, - 37, 36, 40, 37,100, 43, 41, 37, 36, 34, 44,102,117,110, 99, - 116,105,111,110, 32, 40,110, 41, 10,114,101,116,117,114,110, - 32, 37, 86, 91,116,111,110,117,109, 98,101,114, 40,110, 41, - 93, 10,101,110,100, 41, 10,101,110,100, 10, 10, 10,102,117, - 110, 99,116,105,111,110, 32, 99,108, 97,115,115, 80, 97, 99, - 107, 97,103,101, 58,112,114,101, 97,109, 98,108,101, 32, 40, - 41, 10,111,117,116,112,117,116, 40, 39, 47, 42, 92,110, 39, - 41, 10,111,117,116,112,117,116, 40, 39, 42, 42, 32, 76,117, - 97, 32, 98,105,110,100,105,110,103, 58, 32, 39, 46, 46,115, - 101,108,102, 46,110, 97,109,101, 46, 46, 39, 92,110, 39, 41, - 10,111,117,116,112,117,116, 40, 39, 42, 42, 32, 71,101,110, - 101,114, 97,116,101,100, 32, 97,117,116,111,109, 97,116,105, - 99, 97,108,108,121, 32, 98,121, 32, 39, 46, 46, 84, 79, 76, - 85, 65, 95, 86, 69, 82, 83, 73, 79, 78, 46, 46, 39, 32,111, - 110, 32, 39, 46, 46,100, 97,116,101, 40, 41, 46, 46, 39, 46, - 92,110, 39, 41, 10,111,117,116,112,117,116, 40, 39, 42, 47, - 92,110, 92,110, 39, 41, 10, 10,111,117,116,112,117,116, 40, - 39, 35,105,110, 99,108,117,100,101, 32, 34,108,117, 97, 47, - 116,111,108,117, 97, 46,104, 34, 92,110, 92,110, 39, 41, 10, - 10,105,102, 32,110,111,116, 32,102,108, 97,103,115, 46,104, - 32,116,104,101,110, 10,111,117,116,112,117,116, 40, 39, 47, - 42, 32, 69,120,112,111,114,116,101,100, 32,102,117,110, 99, - 116,105,111,110, 32, 42, 47, 39, 41, 10,111,117,116,112,117, - 116, 40, 39,105,110,116, 32,116,111,108,117, 97, 95, 39, 46, - 46,115,101,108,102, 46,110, 97,109,101, 46, 46, 39, 95,111, - 112,101,110, 32, 40,108,117, 97, 95, 83,116, 97,116,101, 42, - 32,116,111,108,117, 97, 95, 83, 41, 59, 39, 41, 10,111,117, - 116,112,117,116, 40, 39,118,111,105,100, 32,116,111,108,117, - 97, 95, 39, 46, 46,115,101,108,102, 46,110, 97,109,101, 46, - 46, 39, 95, 99,108,111,115,101, 32, 40,108,117, 97, 95, 83, - 116, 97,116,101, 42, 32,116,111,108,117, 97, 95, 83, 41, 59, - 39, 41, 10,111,117,116,112,117,116, 40, 39, 92,110, 39, 41, - 10,101,110,100, 10, 10,108,111, 99, 97,108, 32,105, 61, 49, - 10,119,104,105,108,101, 32,115,101,108,102, 91,105, 93, 32, - 100,111, 10,115,101,108,102, 91,105, 93, 58,112,114,101, 97, - 109, 98,108,101, 40, 41, 10,105, 32, 61, 32,105, 43, 49, 10, - 101,110,100, 10,111,117,116,112,117,116, 40, 39, 92,110, 39, - 41, 10,111,117,116,112,117,116, 40, 39, 47, 42, 32,102,117, - 110, 99,116,105,111,110, 32,116,111, 32,114,101,103,105,115, - 116,101,114, 32,116,121,112,101, 32, 42, 47, 39, 41, 10,111, - 117,116,112,117,116, 40, 39,115,116, 97,116,105, 99, 32,118, - 111,105,100, 32,116,111,108,117, 97, 73, 95,114,101,103, 95, - 116,121,112,101,115, 32, 40,108,117, 97, 95, 83,116, 97,116, - 101, 42, 32,116,111,108,117, 97, 95, 83, 41, 39, 41, 10,111, - 117,116,112,117,116, 40, 39,123, 39, 41, 10,102,111,114,101, - 97, 99,104, 40, 95,117,115,101,114,116,121,112,101, 44,102, - 117,110, 99,116,105,111,110, 40,110, 44,118, 41, 32,111,117, - 116,112,117,116, 40, 39, 32,116,111,108,117, 97, 95,117,115, - 101,114,116,121,112,101, 40,116,111,108,117, 97, 95, 83, 44, - 34, 39, 44,118, 44, 39, 34, 41, 59, 39, 41, 32,101,110,100, - 41, 10,111,117,116,112,117,116, 40, 39,125, 39, 41, 10,111, - 117,116,112,117,116, 40, 39, 92,110, 39, 41, 10, 10,111,117, - 116,112,117,116, 40, 39, 47, 42, 32,101,114,114,111,114, 32, - 109,101,115,115, 97,103,101,115, 32, 42, 47, 39, 41, 10,111, - 117,116,112,117,116, 40, 39, 35,100,101,102,105,110,101, 32, - 84, 79, 76, 85, 65, 95, 69, 82, 82, 95, 83, 69, 76, 70, 32, - 116,111,108,117, 97, 95,101,114,114,111,114, 40,116,111,108, - 117, 97, 95, 83, 44, 92, 34,105,110,118, 97,108,105,100, 32, - 92, 39,115,101,108,102, 92, 39, 92, 34, 41, 39, 41, 10,111, - 117,116,112,117,116, 40, 39, 35,100,101,102,105,110,101, 32, - 84, 79, 76, 85, 65, 95, 69, 82, 82, 95, 65, 83, 83, 73, 71, - 78, 32,116,111,108,117, 97, 95,101,114,114,111,114, 40,116, - 111,108,117, 97, 95, 83, 44, 92, 34, 35,118,105,110,118, 97, - 108,105,100, 32,116,121,112,101, 32,105,110, 32,118, 97,114, - 105, 97, 98,108,101, 32, 97,115,115,105,103,110,109,101,110, - 116, 46, 92, 34, 41, 39, 41, 10,111,117,116,112,117,116, 40, - 39, 92,110, 39, 41, 10,101,110,100, 10, 10, 10, 10,102,117, - 110, 99,116,105,111,110, 32, 99,108, 97,115,115, 80, 97, 99, - 107, 97,103,101, 58,114,101,103,105,115,116,101,114, 32, 40, - 41, 10,111,117,116,112,117,116, 40, 34, 47, 42, 32, 79,112, - 101,110, 32,102,117,110, 99,116,105,111,110, 32, 42, 47, 34, - 41, 10,111,117,116,112,117,116, 40, 34,105,110,116, 32,116, - 111,108,117, 97, 95, 34, 46, 46,115,101,108,102, 46,110, 97, - 109,101, 46, 46, 34, 95,111,112,101,110, 32, 40,108,117, 97, - 95, 83,116, 97,116,101, 42, 32,116,111,108,117, 97, 95, 83, - 41, 34, 41, 10,111,117,116,112,117,116, 40, 34,123, 34, 41, - 10,111,117,116,112,117,116, 40, 34, 32,116,111,108,117, 97, - 95,111,112,101,110, 40,116,111,108,117, 97, 95, 83, 41, 59, - 34, 41, 10,111,117,116,112,117,116, 40, 34, 32,116,111,108, - 117, 97, 73, 95,114,101,103, 95,116,121,112,101,115, 40,116, - 111,108,117, 97, 95, 83, 41, 59, 34, 41, 10,108,111, 99, 97, - 108, 32,105, 61, 49, 10,119,104,105,108,101, 32,115,101,108, - 102, 91,105, 93, 32,100,111, 10,115,101,108,102, 91,105, 93, - 58,114,101,103,105,115,116,101,114, 40, 41, 10,105, 32, 61, - 32,105, 43, 49, 10,101,110,100, 10,111,117,116,112,117,116, - 40, 34, 32,114,101,116,117,114,110, 32, 49, 59, 34, 41, 10, - 111,117,116,112,117,116, 40, 34,125, 34, 41, 10,101,110,100, - 10, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, - 97,115,115, 80, 97, 99,107, 97,103,101, 58,117,110,114,101, - 103,105,115,116,101,114, 32, 40, 41, 10,111,117,116,112,117, - 116, 40, 34, 47, 42, 32, 67,108,111,115,101, 32,102,117,110, - 99,116,105,111,110, 32, 42, 47, 34, 41, 10,111,117,116,112, - 117,116, 40, 34,118,111,105,100, 32,116,111,108,117, 97, 95, - 34, 46, 46,115,101,108,102, 46,110, 97,109,101, 46, 46, 34, - 95, 99,108,111,115,101, 32, 40,108,117, 97, 95, 83,116, 97, - 116,101, 42, 32,116,111,108,117, 97, 95, 83, 41, 34, 41, 10, - 111,117,116,112,117,116, 40, 34,123, 34, 41, 10,108,111, 99, - 97,108, 32,105, 61, 49, 10,119,104,105,108,101, 32,115,101, - 108,102, 91,105, 93, 32,100,111, 10,115,101,108,102, 91,105, - 93, 58,117,110,114,101,103,105,115,116,101,114, 40, 41, 10, - 105, 32, 61, 32,105, 43, 49, 10,101,110,100, 10,111,117,116, - 112,117,116, 40, 34,125, 34, 41, 10,101,110,100, 10, 10, 10, - 102,117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 80, - 97, 99,107, 97,103,101, 58,104,101, 97,100,101,114, 32, 40, - 41, 10,111,117,116,112,117,116, 40, 39, 47, 42, 92,110, 39, - 41, 32,111,117,116,112,117,116, 40, 39, 42, 42, 32, 76,117, - 97, 32, 98,105,110,100,105,110,103, 58, 32, 39, 46, 46,115, - 101,108,102, 46,110, 97,109,101, 46, 46, 39, 92,110, 39, 41, - 10,111,117,116,112,117,116, 40, 39, 42, 42, 32, 71,101,110, - 101,114, 97,116,101,100, 32, 97,117,116,111,109, 97,116,105, - 99, 97,108,108,121, 32, 98,121, 32, 39, 46, 46, 84, 79, 76, - 85, 65, 95, 86, 69, 82, 83, 73, 79, 78, 46, 46, 39, 32,111, - 110, 32, 39, 46, 46,100, 97,116,101, 40, 41, 46, 46, 39, 46, - 92,110, 39, 41, 10,111,117,116,112,117,116, 40, 39, 42, 47, - 92,110, 92,110, 39, 41, 10, 10,105,102, 32,110,111,116, 32, - 102,108, 97,103,115, 46,104, 32,116,104,101,110, 10,111,117, - 116,112,117,116, 40, 39, 47, 42, 32, 69,120,112,111,114,116, - 101,100, 32,102,117,110, 99,116,105,111,110, 32, 42, 47, 39, - 41, 10,111,117,116,112,117,116, 40, 39,105,110,116, 32,116, - 111,108,117, 97, 95, 39, 46, 46,115,101,108,102, 46,110, 97, - 109,101, 46, 46, 39, 95,111,112,101,110, 32, 40,108,117, 97, - 95, 83,116, 97,116,101, 42, 32,116,111,108,117, 97, 95, 83, - 41, 59, 39, 41, 10,111,117,116,112,117,116, 40, 39,118,111, - 105,100, 32,116,111,108,117, 97, 95, 39, 46, 46,115,101,108, - 102, 46,110, 97,109,101, 46, 46, 39, 95, 99,108,111,115,101, - 32, 40,108,117, 97, 95, 83,116, 97,116,101, 42, 32,116,111, - 108,117, 97, 95, 83, 41, 59, 39, 41, 10,111,117,116,112,117, - 116, 40, 39, 92,110, 39, 41, 10,101,110,100, 10,101,110,100, - 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 95, 80, 97, - 99,107, 97,103,101, 32, 40,116, 41, 10,116, 46, 95, 98, 97, - 115,101, 32, 61, 32, 99,108, 97,115,115, 80, 97, 99,107, 97, - 103,101, 10,115,101,116,116, 97,103, 40,116, 44,116,111,108, - 117, 97, 95,116, 97,103, 41, 10,114,101,116,117,114,110, 32, - 116, 10,101,110,100, 10, 10, 10, 10, 10,102,117,110, 99,116, - 105,111,110, 32, 80, 97, 99,107, 97,103,101, 32, 40,110, 97, - 109,101, 41, 10, 10,108,111, 99, 97,108, 32, 99,111,100,101, - 32, 61, 32,114,101, 97,100, 40, 34, 42, 97, 34, 41, 10, 99, - 111,100,101, 32, 61, 32, 34, 92,110, 34, 32, 46, 46, 32, 99, - 111,100,101, 10, 10,108,111, 99, 97,108, 32,110,115,117, 98, - 115,116, 10,114,101,112,101, 97,116, 10, 99,111,100,101, 44, - 110,115,117, 98,115,116, 32, 61, 32,103,115,117, 98, 40, 99, - 111,100,101, 44, 34, 92,110, 37,115, 42, 37, 36, 60, 40, 46, - 45, 41, 62, 37,115, 42, 92,110, 34, 44,102,117,110, 99,116, - 105,111,110, 32, 40,102,110, 41, 10,108,111, 99, 97,108, 32, - 102,112, 44,109,115,103, 32, 61, 32,111,112,101,110,102,105, - 108,101, 40,102,110, 44, 39,114, 39, 41, 10,105,102, 32,110, - 111,116, 32,102,112, 32,116,104,101,110, 10,101,114,114,111, - 114, 40, 39, 35, 39, 46, 46,109,115,103, 46, 46, 39, 58, 32, - 39, 46, 46,102,110, 41, 10,101,110,100, 10,108,111, 99, 97, - 108, 32,115, 32, 61, 32,114,101, 97,100, 40,102,112, 44, 39, - 42, 97, 39, 41, 10, 99,108,111,115,101,102,105,108,101, 40, - 102,112, 41, 10,114,101,116,117,114,110, 32, 34, 92,110, 34, - 32, 46, 46, 32,115, 10,101,110,100, 41, 10,117,110,116,105, - 108, 32,110,115,117, 98,115,116, 61, 61, 48, 10, 10, 10,108, - 111, 99, 97,108, 32,110,115,117, 98,115,116, 10,114,101,112, - 101, 97,116, 10, 99,111,100,101, 44,110,115,117, 98,115,116, - 32, 61, 10,103,115,117, 98, 40, 99,111,100,101, 44, 34, 92, - 110, 37,115, 42, 37, 36,123, 40, 46, 45, 41,125, 37,115, 42, - 92,110, 34, 44, 10,102,117,110, 99,116,105,111,110, 32, 40, - 102,110, 41, 10,108,111, 99, 97,108, 32,102,112, 44,109,115, - 103, 32, 61, 32,111,112,101,110,102,105,108,101, 40,102,110, - 44, 39,114, 39, 41, 10,105,102, 32,110,111,116, 32,102,112, - 32,116,104,101,110, 10,101,114,114,111,114, 40, 39, 35, 39, - 46, 46,109,115,103, 46, 46, 39, 58, 32, 39, 46, 46,102,110, - 41, 10,101,110,100, 10,108,111, 99, 97,108, 32,115, 32, 61, - 32,114,101, 97,100, 40,102,112, 44, 39, 42, 97, 39, 41, 10, - 99,108,111,115,101,102,105,108,101, 40,102,112, 41, 10, 10, - 108,111, 99, 97,108, 32, 84, 32, 61, 32,123, 99,111,100,101, - 61, 34, 92,110, 34,125, 10,115, 61, 32, 34, 92,110, 34, 32, - 46, 46, 32,115, 32, 46, 46, 32, 34, 92,110, 34, 10, 10,103, - 115,117, 98, 40,115, 44, 34, 92,110, 40, 46, 45, 41, 91, 84, - 116, 93, 91, 79,111, 93, 91, 76,108, 93, 91, 85,117, 93, 91, - 65, 97, 93, 95, 91, 69,101, 93, 91, 88,120, 93, 91, 80,112, - 93, 91, 79,111, 93, 91, 82,114, 93, 91, 84,116, 93, 91, 94, - 92,110, 93, 42, 92,110, 34, 44, 10,102,117,110, 99,116,105, - 111,110, 32, 40, 99, 41, 32, 37, 84, 46, 99,111,100,101, 32, - 61, 32, 37, 84, 46, 99,111,100,101, 32, 46, 46, 32, 99, 32, - 46, 46, 32, 34, 92,110, 34, 32,101,110,100, 10, 41, 10, 10, - 103,115,117, 98, 40,115, 44, 34, 92,110, 91, 94, 92,110, 93, - 42, 91, 84,116, 93, 91, 79,111, 93, 91, 76,108, 93, 91, 85, - 117, 93, 91, 65, 97, 93, 95, 91, 66, 98, 93, 91, 69,101, 93, - 91, 71,103, 93, 91, 73,105, 93, 91, 78,110, 93, 91, 94, 92, - 110, 93, 42, 34, 46, 46, 10, 34, 40, 46, 45, 41, 34, 32, 46, - 46, 10, 34, 92,110, 91, 94, 92,110, 93, 42, 91, 84,116, 93, - 91, 79,111, 93, 91, 76,108, 93, 91, 85,117, 93, 91, 65, 97, - 93, 95, 91, 69,101, 93, 91, 78,110, 93, 91, 68,100, 93, 91, - 94, 92,110, 93, 42, 92,110, 34, 44, 10,102,117,110, 99,116, - 105,111,110, 32, 40, 99, 41, 32, 37, 84, 46, 99,111,100,101, - 32, 61, 32, 37, 84, 46, 99,111,100,101, 32, 46, 46, 32, 99, - 32, 46, 46, 32, 34, 92,110, 34, 32,101,110,100, 10, 41, 10, - 114,101,116,117,114,110, 32, 84, 46, 99,111,100,101, 10,101, - 110,100, 41, 10,117,110,116,105,108, 32,110,115,117, 98,115, - 116, 61, 61, 48, 10, 10,108,111, 99, 97,108, 32,116, 32, 61, - 32, 95, 80, 97, 99,107, 97,103,101, 40, 95, 67,111,110,116, - 97,105,110,101,114,123,110, 97,109,101, 61,110, 97,109,101, - 44, 32, 99,111,100,101, 61, 99,111,100,101,125, 41, 10,112, - 117,115,104, 40,116, 41, 10,116, 58,112,114,101,112,114,111, - 99,101,115,115, 40, 41, 10,116, 58,112, 97,114,115,101, 40, - 116, 46, 99,111,100,101, 41, 10,112,111,112, 40, 41, 10,114, - 101,116,117,114,110, 32,116, 10,101,110,100, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 99, - 108, 97,115,115, 77,111,100,117,108,101, 32, 61, 32,123, 10, - 95, 98, 97,115,101, 32, 61, 32, 99,108, 97,115,115, 67,111, - 110,116, 97,105,110,101,114, 44, 10,116,121,112,101, 32, 61, - 32, 39,109,111,100,117,108,101, 39, 10,125, 10,115,101,116, - 116, 97,103, 40, 99,108, 97,115,115, 77,111,100,117,108,101, - 44,116,111,108,117, 97, 95,116, 97,103, 41, 10, 10, 10,102, - 117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 77,111, - 100,117,108,101, 58,114,101,103,105,115,116,101,114, 32, 40, - 41, 10,111,117,116,112,117,116, 40, 39, 32,116,111,108,117, - 97, 95,109,111,100,117,108,101, 40,116,111,108,117, 97, 95, - 83, 44, 34, 39, 46, 46,115,101,108,102, 46,110, 97,109,101, - 46, 46, 39, 34, 41, 59, 39, 41, 10,108,111, 99, 97,108, 32, - 105, 61, 49, 10,119,104,105,108,101, 32,115,101,108,102, 91, - 105, 93, 32,100,111, 10,115,101,108,102, 91,105, 93, 58,114, - 101,103,105,115,116,101,114, 40, 41, 10,105, 32, 61, 32,105, - 43, 49, 10,101,110,100, 10,101,110,100, 10, 10, 10,102,117, - 110, 99,116,105,111,110, 32, 99,108, 97,115,115, 77,111,100, - 117,108,101, 58,117,110,114,101,103,105,115,116,101,114, 32, - 40, 41, 10,111,117,116,112,117,116, 40, 39, 32,108,117, 97, - 95,112,117,115,104,110,105,108, 40,116,111,108,117, 97, 95, - 83, 41, 59, 32,108,117, 97, 95,115,101,116,103,108,111, 98, - 97,108, 40,116,111,108,117, 97, 95, 83, 44, 34, 39, 46, 46, - 115,101,108,102, 46,110, 97,109,101, 46, 46, 39, 34, 41, 59, - 39, 41, 10,101,110,100, 10, 10, 10,102,117,110, 99,116,105, - 111,110, 32, 99,108, 97,115,115, 77,111,100,117,108,101, 58, - 112,114,105,110,116, 32, 40,105,100,101,110,116, 44, 99,108, - 111,115,101, 41, 10,112,114,105,110,116, 40,105,100,101,110, - 116, 46, 46, 34, 77,111,100,117,108,101,123, 34, 41, 10,112, - 114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 32,110, - 97,109,101, 32, 61, 32, 39, 34, 46, 46,115,101,108,102, 46, - 110, 97,109,101, 46, 46, 34, 39, 59, 34, 41, 10,108,111, 99, - 97,108, 32,105, 61, 49, 10,119,104,105,108,101, 32,115,101, - 108,102, 91,105, 93, 32,100,111, 10,115,101,108,102, 91,105, - 93, 58,112,114,105,110,116, 40,105,100,101,110,116, 46, 46, - 34, 32, 34, 44, 34, 44, 34, 41, 10,105, 32, 61, 32,105, 43, - 49, 10,101,110,100, 10,112,114,105,110,116, 40,105,100,101, - 110,116, 46, 46, 34,125, 34, 46, 46, 99,108,111,115,101, 41, - 10,101,110,100, 10, 10, 10,102,117,110, 99,116,105,111,110, - 32, 95, 77,111,100,117,108,101, 32, 40,116, 41, 10,116, 46, - 95, 98, 97,115,101, 32, 61, 32, 99,108, 97,115,115, 77,111, - 100,117,108,101, 10,115,101,116,116, 97,103, 40,116, 44,116, - 111,108,117, 97, 95,116, 97,103, 41, 10, 97,112,112,101,110, - 100, 40,116, 41, 10,114,101,116,117,114,110, 32,116, 10,101, - 110,100, 10, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, - 77,111,100,117,108,101, 32, 40,110, 44, 98, 41, 10,108,111, - 99, 97,108, 32,116, 32, 61, 32, 95, 77,111,100,117,108,101, - 40, 95, 67,111,110,116, 97,105,110,101,114,123,110, 97,109, - 101, 61,110,125, 41, 10,112,117,115,104, 40,116, 41, 10,116, - 58,112, 97,114,115,101, 40,115,116,114,115,117, 98, 40, 98, - 44, 50, 44,115,116,114,108,101,110, 40, 98, 41, 45, 49, 41, - 41, 10,112,111,112, 40, 41, 10,114,101,116,117,114,110, 32, - 116, 10,101,110,100, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 99,108, 97,115,115, 68, - 101,102,105,110,101, 32, 61, 32,123, 10,110, 97,109,101, 32, - 61, 32, 39, 39, 44, 10, 95, 98, 97,115,101, 32, 61, 32, 99, - 108, 97,115,115, 70,101, 97,116,117,114,101, 44, 10,125, 10, - 115,101,116,116, 97,103, 40, 99,108, 97,115,115, 68,101,102, - 105,110,101, 44,116,111,108,117, 97, 95,116, 97,103, 41, 10, - 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97,115, - 115, 68,101,102,105,110,101, 58,114,101,103,105,115,116,101, - 114, 32, 40, 41, 10,108,111, 99, 97,108, 32,112, 32, 61, 32, - 115,101,108,102, 58,105,110,109,111,100,117,108,101, 40, 41, - 10,105,102, 32,112, 32,116,104,101,110, 10,111,117,116,112, - 117,116, 40, 39, 32,116,111,108,117, 97, 95, 99,111,110,115, - 116, 97,110,116, 40,116,111,108,117, 97, 95, 83, 44, 34, 39, - 46, 46,112, 46, 46, 39, 34, 44, 34, 39, 46, 46,115,101,108, - 102, 46,108,110, 97,109,101, 46, 46, 39, 34, 44, 39, 46, 46, - 115,101,108,102, 46,110, 97,109,101, 46, 46, 39, 41, 59, 39, - 41, 10,101,108,115,101, 10,111,117,116,112,117,116, 40, 39, - 32,116,111,108,117, 97, 95, 99,111,110,115,116, 97,110,116, - 40,116,111,108,117, 97, 95, 83, 44, 78, 85, 76, 76, 44, 34, - 39, 46, 46,115,101,108,102, 46,108,110, 97,109,101, 46, 46, - 39, 34, 44, 39, 46, 46,115,101,108,102, 46,110, 97,109,101, - 46, 46, 39, 41, 59, 39, 41, 10,101,110,100, 10,101,110,100, - 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97, - 115,115, 68,101,102,105,110,101, 58,117,110,114,101,103,105, - 115,116,101,114, 32, 40, 41, 10,105,102, 32,110,111,116, 32, - 115,101,108,102, 58,105,110,109,111,100,117,108,101, 40, 41, - 32,116,104,101,110, 10,111,117,116,112,117,116, 40, 39, 32, - 108,117, 97, 95,112,117,115,104,110,105,108, 40,116,111,108, - 117, 97, 95, 83, 41, 59, 32,108,117, 97, 95,115,101,116,103, - 108,111, 98, 97,108, 40,116,111,108,117, 97, 95, 83, 44, 34, - 39, 46, 46,115,101,108,102, 46,108,110, 97,109,101, 46, 46, - 39, 34, 41, 59, 39, 41, 10,101,110,100, 10,101,110,100, 10, - 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97,115, - 115, 68,101,102,105,110,101, 58,112,114,105,110,116, 32, 40, - 105,100,101,110,116, 44, 99,108,111,115,101, 41, 10,112,114, - 105,110,116, 40,105,100,101,110,116, 46, 46, 34, 68,101,102, - 105,110,101,123, 34, 41, 10,112,114,105,110,116, 40,105,100, - 101,110,116, 46, 46, 34, 32,110, 97,109,101, 32, 61, 32, 39, - 34, 46, 46,115,101,108,102, 46,110, 97,109,101, 46, 46, 34, - 39, 44, 34, 41, 10,112,114,105,110,116, 40,105,100,101,110, - 116, 46, 46, 34, 32,108,110, 97,109,101, 32, 61, 32, 39, 34, - 46, 46,115,101,108,102, 46,108,110, 97,109,101, 46, 46, 34, - 39, 44, 34, 41, 10,112,114,105,110,116, 40,105,100,101,110, - 116, 46, 46, 34,125, 34, 46, 46, 99,108,111,115,101, 41, 10, - 101,110,100, 10, 10, 10, 10,102,117,110, 99,116,105,111,110, - 32, 95, 68,101,102,105,110,101, 32, 40,116, 41, 10,116, 46, - 95, 98, 97,115,101, 32, 61, 32, 99,108, 97,115,115, 68,101, - 102,105,110,101, 10,115,101,116,116, 97,103, 40,116, 44,116, - 111,108,117, 97, 95,116, 97,103, 41, 10, 10,105,102, 32,116, - 46,110, 97,109,101, 32, 61, 61, 32, 39, 39, 32,116,104,101, - 110, 10,101,114,114,111,114, 40, 34, 35,105,110,118, 97,108, - 105,100, 32,100,101,102,105,110,101, 34, 41, 10,101,110,100, - 10, 10, 97,112,112,101,110,100, 40,116, 41, 10,114,101,116, - 117,114,110, 32,116, 10,101,110,100, 10, 10, 10, 10,102,117, - 110, 99,116,105,111,110, 32, 68,101,102,105,110,101, 32, 40, - 110, 41, 10,108,111, 99, 97,108, 32,116, 32, 61, 32,115,112, - 108,105,116, 40,110, 44, 39, 64, 39, 41, 10,114,101,116,117, - 114,110, 32, 95, 68,101,102,105,110,101, 32,123, 10,110, 97, - 109,101, 32, 61, 32,116, 91, 49, 93, 44, 10,108,110, 97,109, - 101, 32, 61, 32,116, 91, 50, 93, 32,111,114, 32,116, 91, 49, - 93, 10,125, 10,101,110,100, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 99,108, 97,115,115, 69, - 110,117,109,101,114, 97,116,101, 32, 61, 32,123, 10, 95, 98, - 97,115,101, 32, 61, 32, 99,108, 97,115,115, 70,101, 97,116, - 117,114,101, 44, 10,125, 10,115,101,116,116, 97,103, 40, 99, - 108, 97,115,115, 69,110,117,109,101,114, 97,116,101, 44,116, - 111,108,117, 97, 95,116, 97,103, 41, 10, 10, 10,102,117,110, - 99,116,105,111,110, 32, 99,108, 97,115,115, 69,110,117,109, - 101,114, 97,116,101, 58,114,101,103,105,115,116,101,114, 32, - 40, 41, 10,108,111, 99, 97,108, 32,112, 32, 61, 32,115,101, - 108,102, 58,105,110, 99,108, 97,115,115, 40, 41, 32,111,114, - 32,115,101,108,102, 58,105,110,109,111,100,117,108,101, 40, - 41, 10,108,111, 99, 97,108, 32,105, 61, 49, 10,119,104,105, - 108,101, 32,115,101,108,102, 91,105, 93, 32,100,111, 10,105, - 102, 32,112, 32,116,104,101,110, 10,105,102, 32,115,101,108, - 102, 58,105,110, 99,108, 97,115,115, 40, 41, 32,116,104,101, - 110, 10,111,117,116,112,117,116, 40, 39, 32,116,111,108,117, - 97, 95, 99,111,110,115,116, 97,110,116, 40,116,111,108,117, - 97, 95, 83, 44, 34, 39, 46, 46,112, 46, 46, 39, 34, 44, 34, - 39, 46, 46,115,101,108,102, 46,108,110, 97,109,101,115, 91, - 105, 93, 46, 46, 39, 34, 44, 39, 46, 46,112, 46, 46, 39, 58, - 58, 39, 46, 46,115,101,108,102, 91,105, 93, 46, 46, 39, 41, - 59, 39, 41, 10,101,108,115,101, 10,111,117,116,112,117,116, - 40, 39, 32,116,111,108,117, 97, 95, 99,111,110,115,116, 97, - 110,116, 40,116,111,108,117, 97, 95, 83, 44, 34, 39, 46, 46, - 112, 46, 46, 39, 34, 44, 34, 39, 46, 46,115,101,108,102, 46, - 108,110, 97,109,101,115, 91,105, 93, 46, 46, 39, 34, 44, 39, - 46, 46,115,101,108,102, 91,105, 93, 46, 46, 39, 41, 59, 39, - 41, 10,101,110,100, 10,101,108,115,101, 10,111,117,116,112, - 117,116, 40, 39, 32,116,111,108,117, 97, 95, 99,111,110,115, - 116, 97,110,116, 40,116,111,108,117, 97, 95, 83, 44, 78, 85, - 76, 76, 44, 34, 39, 46, 46,115,101,108,102, 46,108,110, 97, - 109,101,115, 91,105, 93, 46, 46, 39, 34, 44, 39, 46, 46,115, - 101,108,102, 91,105, 93, 46, 46, 39, 41, 59, 39, 41, 10,101, - 110,100, 10,105, 32, 61, 32,105, 43, 49, 10,101,110,100, 10, - 101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32, 99, - 108, 97,115,115, 69,110,117,109,101,114, 97,116,101, 58,117, - 110,114,101,103,105,115,116,101,114, 32, 40, 41, 10,105,102, - 32,115,101,108,102, 58,105,110, 99,108, 97,115,115, 40, 41, - 61, 61,110,105,108, 32, 97,110,100, 32,115,101,108,102, 58, - 105,110,109,111,100,117,108,101, 40, 41, 61, 61,110,105,108, - 32,116,104,101,110, 10,108,111, 99, 97,108, 32,105, 61, 49, - 10,119,104,105,108,101, 32,115,101,108,102, 91,105, 93, 32, - 100,111, 10,111,117,116,112,117,116, 40, 39, 32,108,117, 97, - 95,112,117,115,104,110,105,108, 40,116,111,108,117, 97, 95, - 83, 41, 59, 32,108,117, 97, 95,115,101,116,103,108,111, 98, - 97,108, 40,116,111,108,117, 97, 95, 83, 44, 34, 39, 46, 46, - 115,101,108,102, 46,108,110, 97,109,101,115, 91,105, 93, 46, - 46, 39, 34, 41, 59, 39, 41, 10,105, 32, 61, 32,105, 43, 49, - 10,101,110,100, 10,101,110,100, 10,101,110,100, 10, 10, 10, - 102,117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 69, - 110,117,109,101,114, 97,116,101, 58,112,114,105,110,116, 32, - 40,105,100,101,110,116, 44, 99,108,111,115,101, 41, 10,112, - 114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 69,110, - 117,109,101,114, 97,116,101,123, 34, 41, 10,108,111, 99, 97, - 108, 32,105, 61, 49, 10,119,104,105,108,101, 32,115,101,108, - 102, 91,105, 93, 32,100,111, 10,112,114,105,110,116, 40,105, - 100,101,110,116, 46, 46, 34, 32, 39, 34, 46, 46,115,101,108, - 102, 91,105, 93, 46, 46, 34, 39, 40, 34, 46, 46,115,101,108, - 102, 46,108,110, 97,109,101,115, 91,105, 93, 46, 46, 34, 41, - 44, 34, 41, 10,105, 32, 61, 32,105, 43, 49, 10,101,110,100, - 10,112,114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, - 125, 34, 46, 46, 99,108,111,115,101, 41, 10,101,110,100, 10, - 10, 10,102,117,110, 99,116,105,111,110, 32, 95, 69,110,117, - 109,101,114, 97,116,101, 32, 40,116, 41, 10,116, 46, 95, 98, - 97,115,101, 32, 61, 32, 99,108, 97,115,115, 69,110,117,109, - 101,114, 97,116,101, 10,115,101,116,116, 97,103, 40,116, 44, - 116,111,108,117, 97, 95,116, 97,103, 41, 10, 97,112,112,101, - 110,100, 40,116, 41, 10,114,101,116,117,114,110, 32,116, 10, - 101,110,100, 10, 10, 10, 10,102,117,110, 99,116,105,111,110, - 32, 69,110,117,109,101,114, 97,116,101, 32, 40, 98, 41, 10, - 108,111, 99, 97,108, 32,116, 32, 61, 32,115,112,108,105,116, - 40,115,116,114,115,117, 98, 40, 98, 44, 50, 44, 45, 50, 41, - 44, 39, 44, 39, 41, 10,108,111, 99, 97,108, 32,105, 32, 61, - 32, 49, 10,108,111, 99, 97,108, 32,101, 32, 61, 32,123,110, - 61, 48,125, 10,119,104,105,108,101, 32,116, 91,105, 93, 32, - 100,111, 10,108,111, 99, 97,108, 32,116,116, 32, 61, 32,115, - 112,108,105,116, 40,116, 91,105, 93, 44, 39, 61, 39, 41, 10, - 101, 46,110, 32, 61, 32,101, 46,110, 32, 43, 32, 49, 10,101, - 91,101, 46,110, 93, 32, 61, 32,116,116, 91, 49, 93, 10,105, - 32, 61, 32,105, 43, 49, 10,101,110,100, 10, 10,105, 32, 61, - 32, 49, 10,101, 46,108,110, 97,109,101,115, 32, 61, 32,123, - 125, 10,119,104,105,108,101, 32,101, 91,105, 93, 32,100,111, - 10,108,111, 99, 97,108, 32,116, 32, 61, 32,115,112,108,105, - 116, 40,101, 91,105, 93, 44, 39, 64, 39, 41, 10,101, 91,105, - 93, 32, 61, 32,116, 91, 49, 93, 10,101, 46,108,110, 97,109, - 101,115, 91,105, 93, 32, 61, 32,116, 91, 50, 93, 32,111,114, - 32,116, 91, 49, 93, 10,105, 32, 61, 32,105, 43, 49, 10,101, - 110,100, 10,114,101,116,117,114,110, 32, 95, 69,110,117,109, - 101,114, 97,116,101, 40,101, 41, 10,101,110,100, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 99,108, 97,115,115, 68,101, 99, - 108, 97,114, 97,116,105,111,110, 32, 61, 32,123, 10, 95, 98, - 97,115,101, 32, 61, 32, 99,108, 97,115,115, 70,101, 97,116, - 117,114,101, 44, 10,109,111,100, 32, 61, 32, 39, 39, 44, 10, - 116,121,112,101, 32, 61, 32, 39, 39, 44, 10,112,116,114, 32, - 61, 32, 39, 39, 44, 10,110, 97,109,101, 32, 61, 32, 39, 39, - 44, 10,100,105,109, 32, 61, 32, 39, 39, 44, 10,114,101,116, - 32, 61, 32, 39, 39, 44, 10,100,101,102, 32, 61, 32, 39, 39, - 10,125, 10,115,101,116,116, 97,103, 40, 99,108, 97,115,115, - 68,101, 99,108, 97,114, 97,116,105,111,110, 44,116,111,108, - 117, 97, 95,116, 97,103, 41, 10, 10, 10,102,117,110, 99,116, - 105,111,110, 32, 99,114,101, 97,116,101, 95,118, 97,114,110, - 97,109,101, 32, 40, 41, 10,105,102, 32,110,111,116, 32, 95, - 118, 97,114,110,117,109, 98,101,114, 32,116,104,101,110, 32, - 95,118, 97,114,110,117,109, 98,101,114, 32, 61, 32, 48, 32, - 101,110,100, 10, 95,118, 97,114,110,117,109, 98,101,114, 32, - 61, 32, 95,118, 97,114,110,117,109, 98,101,114, 32, 43, 32, - 49, 10,114,101,116,117,114,110, 32, 34,116,111,108,117, 97, - 95,118, 97,114, 95, 34, 46, 46, 95,118, 97,114,110,117,109, - 98,101,114, 10,101,110,100, 10, 10, 10, 10,102,117,110, 99, - 116,105,111,110, 32, 99,108, 97,115,115, 68,101, 99,108, 97, - 114, 97,116,105,111,110, 58, 99,104,101, 99,107,110, 97,109, - 101, 32, 40, 41, 10, 10,105,102, 32,115,116,114,115,117, 98, - 40,115,101,108,102, 46,110, 97,109,101, 44, 49, 44, 49, 41, - 32, 61, 61, 32, 39, 91, 39, 32, 97,110,100, 32,110,111,116, - 32,105,115,116,121,112,101, 40,115,101,108,102, 46,116,121, - 112,101, 41, 32,116,104,101,110, 10,115,101,108,102, 46,110, - 97,109,101, 32, 61, 32,115,101,108,102, 46,116,121,112,101, - 46, 46,115,101,108,102, 46,110, 97,109,101, 10,108,111, 99, - 97,108, 32,109, 32, 61, 32,115,112,108,105,116, 40,115,101, - 108,102, 46,109,111,100, 44, 39, 37,115, 37,115, 42, 39, 41, - 10,115,101,108,102, 46,116,121,112,101, 32, 61, 32,109, 91, - 109, 46,110, 93, 10,115,101,108,102, 46,109,111,100, 32, 61, - 32, 99,111,110, 99, 97,116, 40,109, 44, 49, 44,109, 46,110, - 45, 49, 41, 10,101,110,100, 10, 10,108,111, 99, 97,108, 32, - 116, 32, 61, 32,115,112,108,105,116, 40,115,101,108,102, 46, - 110, 97,109,101, 44, 39, 61, 39, 41, 10,105,102, 32,116, 46, - 110, 61, 61, 50, 32,116,104,101,110, 10,115,101,108,102, 46, - 110, 97,109,101, 32, 61, 32,116, 91, 49, 93, 10,115,101,108, - 102, 46,100,101,102, 32, 61, 32,116, 91,116, 46,110, 93, 10, - 101,110,100, 10, 10,108,111, 99, 97,108, 32, 98, 44,101, 44, - 100, 32, 61, 32,115,116,114,102,105,110,100, 40,115,101,108, - 102, 46,110, 97,109,101, 44, 34, 37, 91, 40, 46, 45, 41, 37, - 93, 34, 41, 10,105,102, 32, 98, 32,116,104,101,110, 10,115, - 101,108,102, 46,110, 97,109,101, 32, 61, 32,115,116,114,115, - 117, 98, 40,115,101,108,102, 46,110, 97,109,101, 44, 49, 44, - 98, 45, 49, 41, 10,115,101,108,102, 46,100,105,109, 32, 61, - 32,100, 10,101,110,100, 10, 10, 10,105,102, 32,115,101,108, - 102, 46,116,121,112,101, 32,126, 61, 32, 39, 39, 32, 97,110, - 100, 32,115,101,108,102, 46,116,121,112,101, 32,126, 61, 32, - 39,118,111,105,100, 39, 32, 97,110,100, 32,115,101,108,102, - 46,110, 97,109,101, 32, 61, 61, 32, 39, 39, 32,116,104,101, - 110, 10,115,101,108,102, 46,110, 97,109,101, 32, 61, 32, 99, - 114,101, 97,116,101, 95,118, 97,114,110, 97,109,101, 40, 41, - 10,101,108,115,101,105,102, 32,115,101,108,102, 46,107,105, - 110,100, 61, 61, 39,118, 97,114, 39, 32,116,104,101,110, 10, - 105,102, 32,115,101,108,102, 46,116,121,112,101, 61, 61, 39, - 39, 32, 97,110,100, 32,115,101,108,102, 46,110, 97,109,101, - 126, 61, 39, 39, 32,116,104,101,110, 10,115,101,108,102, 46, - 116,121,112,101, 32, 61, 32,115,101,108,102, 46,116,121,112, - 101, 46, 46,115,101,108,102, 46,110, 97,109,101, 10,115,101, - 108,102, 46,110, 97,109,101, 32, 61, 32, 99,114,101, 97,116, - 101, 95,118, 97,114,110, 97,109,101, 40, 41, 10,101,108,115, - 101,105,102, 32,105,115,116,121,112,101, 40,115,101,108,102, - 46,110, 97,109,101, 41, 32,116,104,101,110, 10,105,102, 32, - 115,101,108,102, 46,116,121,112,101, 61, 61, 39, 39, 32,116, - 104,101,110, 32,115,101,108,102, 46,116,121,112,101, 32, 61, - 32,115,101,108,102, 46,110, 97,109,101, 10,101,108,115,101, - 32,115,101,108,102, 46,116,121,112,101, 32, 61, 32,115,101, - 108,102, 46,116,121,112,101, 46, 46, 39, 32, 39, 46, 46,115, - 101,108,102, 46,110, 97,109,101, 32,101,110,100, 10,115,101, - 108,102, 46,110, 97,109,101, 32, 61, 32, 99,114,101, 97,116, - 101, 95,118, 97,114,110, 97,109,101, 40, 41, 10,101,110,100, - 10,101,110,100, 10, 10,101,110,100, 10, 10, 10, 10,102,117, - 110, 99,116,105,111,110, 32, 99,108, 97,115,115, 68,101, 99, - 108, 97,114, 97,116,105,111,110, 58, 99,104,101, 99,107,116, - 121,112,101, 32, 40, 41, 10, 10, 10,105,102, 32,105,115, 98, - 97,115,105, 99, 40,115,101,108,102, 46,116,121,112,101, 41, - 32, 97,110,100, 32,115,101,108,102, 46,112,116,114,126, 61, - 39, 39, 32,116,104,101,110, 10,115,101,108,102, 46,114,101, - 116, 32, 61, 32,115,101,108,102, 46,112,116,114, 10,115,101, - 108,102, 46,112,116,114, 32, 61, 32,110,105,108, 10,101,110, - 100, 10, 10, 10,105,102, 32,115,101,108,102, 46,100,105,109, - 126, 61, 39, 39, 32, 97,110,100, 32,115,101,108,102, 46,114, - 101,116,126, 61, 39, 39, 32,116,104,101,110, 10,101,114,114, - 111,114, 40, 39, 35,105,110,118, 97,108,105,100, 32,112, 97, - 114, 97,109,101,116,101,114, 58, 32, 99, 97,110,110,111,116, - 32,114,101,116,117,114,110, 32, 97,110, 32, 97,114,114, 97, - 121, 32,111,102, 32,118, 97,108,117,101,115, 39, 41, 10,101, - 110,100, 10, 10, 10,105,102, 32,115,101,108,102, 46,116,121, - 112,101,126, 61, 39, 39, 32,116,104,101,110, 10,114,101,103, - 116,121,112,101, 40,115,101,108,102, 46,116,121,112,101, 41, - 10,101,110,100, 10, 10, 10,105,102, 32,115,101,108,102, 46, - 116,121,112,101, 32, 61, 61, 32, 39, 95,117,115,101,114,100, - 97,116, 97, 39, 32,116,104,101,110, 32,115,101,108,102, 46, - 116,121,112,101, 32, 61, 32, 39,118,111,105,100, 42, 39, 10, - 101,108,115,101,105,102, 32,115,101,108,102, 46,116,121,112, - 101, 32, 61, 61, 32, 39, 95, 99,115,116,114,105,110,103, 39, - 32,116,104,101,110, 32,115,101,108,102, 46,116,121,112,101, - 32, 61, 32, 39, 99,104, 97,114, 42, 39, 10,101,110,100, 10, - 10, 10, 10, 10, 10, 10, 10, 10,101,110,100, 10, 10, 10,102, - 117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 68,101, - 99,108, 97,114, 97,116,105,111,110, 58,112,114,105,110,116, - 32, 40,105,100,101,110,116, 44, 99,108,111,115,101, 41, 10, - 112,114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 68, - 101, 99,108, 97,114, 97,116,105,111,110,123, 34, 41, 10,112, - 114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 32,109, - 111,100, 32, 61, 32, 39, 34, 46, 46,115,101,108,102, 46,109, - 111,100, 46, 46, 34, 39, 44, 34, 41, 10,112,114,105,110,116, - 40,105,100,101,110,116, 46, 46, 34, 32,116,121,112,101, 32, - 61, 32, 39, 34, 46, 46,115,101,108,102, 46,116,121,112,101, - 46, 46, 34, 39, 44, 34, 41, 10,112,114,105,110,116, 40,105, - 100,101,110,116, 46, 46, 34, 32,112,116,114, 32, 61, 32, 39, - 34, 46, 46,115,101,108,102, 46,112,116,114, 46, 46, 34, 39, - 44, 34, 41, 10,112,114,105,110,116, 40,105,100,101,110,116, - 46, 46, 34, 32,110, 97,109,101, 32, 61, 32, 39, 34, 46, 46, - 115,101,108,102, 46,110, 97,109,101, 46, 46, 34, 39, 44, 34, - 41, 10,112,114,105,110,116, 40,105,100,101,110,116, 46, 46, - 34, 32,100,105,109, 32, 61, 32, 39, 34, 46, 46,115,101,108, - 102, 46,100,105,109, 46, 46, 34, 39, 44, 34, 41, 10,112,114, - 105,110,116, 40,105,100,101,110,116, 46, 46, 34, 32,100,101, - 102, 32, 61, 32, 39, 34, 46, 46,115,101,108,102, 46,100,101, - 102, 46, 46, 34, 39, 44, 34, 41, 10,112,114,105,110,116, 40, - 105,100,101,110,116, 46, 46, 34, 32,114,101,116, 32, 61, 32, - 39, 34, 46, 46,115,101,108,102, 46,114,101,116, 46, 46, 34, - 39, 44, 34, 41, 10,112,114,105,110,116, 40,105,100,101,110, - 116, 46, 46, 34,125, 34, 46, 46, 99,108,111,115,101, 41, 10, - 101,110,100, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, - 99,108, 97,115,115, 68,101, 99,108, 97,114, 97,116,105,111, - 110, 58,100,101, 99,108,116, 97,103, 32, 40, 41, 10,115,101, - 108,102, 46,105,116,121,112,101, 44, 32,115,101,108,102, 46, - 116, 97,103, 32, 61, 32,116, 97,103,118, 97,114, 40,115,101, - 108,102, 46,116,121,112,101, 44,115,116,114,102,105,110,100, - 40,115,101,108,102, 46,109,111,100, 44, 39, 99,111,110,115, - 116, 39, 41, 41, 10,101,110,100, 10, 10, 10, 10,102,117,110, - 99,116,105,111,110, 32, 99,108, 97,115,115, 68,101, 99,108, - 97,114, 97,116,105,111,110, 58,111,117,116, 99,104,101, 99, - 107,116,121,112,101, 32, 40,110, 97,114,103, 41, 10,108,111, - 99, 97,108, 32,116, 97,103, 44, 32,100,101,102, 10,105,102, - 32,115,101,108,102, 46,100,105,109, 32,126, 61, 32, 39, 39, - 32,116,104,101,110, 10,116, 97,103, 32, 61, 32, 39, 76, 85, - 65, 95, 84, 84, 65, 66, 76, 69, 39, 10,100,101,102, 32, 61, - 32, 48, 10,101,108,115,101, 10,116, 97,103, 32, 61, 32,115, - 101,108,102, 46,116, 97,103, 10,100,101,102, 32, 61, 32,115, - 101,108,102, 46,100,101,102,126, 61, 39, 39, 32,111,114, 32, - 48, 10,101,110,100, 10,114,101,116,117,114,110, 32, 39,116, - 111,108,117, 97, 95,105,115,116,121,112,101, 40,116,111,108, - 117, 97, 95, 83, 44, 39, 46, 46,110, 97,114,103, 46, 46, 39, - 44, 39, 46, 46,116, 97,103, 46, 46, 39, 44, 39, 46, 46,100, - 101,102, 46, 46, 39, 41, 39, 10,101,110,100, 10, 10, 10,102, - 117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 68,101, - 99,108, 97,114, 97,116,105,111,110, 58,100,101, 99,108, 97, - 114,101, 32, 40,110, 97,114,103, 41, 10,108,111, 99, 97,108, - 32,112,116,114, 32, 61, 32, 39, 39, 10,105,102, 32,115,101, - 108,102, 46,112,116,114,126, 61, 39, 39, 32,116,104,101,110, - 32,112,116,114, 32, 61, 32, 39, 42, 39, 32,101,110,100, 10, - 111,117,116,112,117,116, 40, 34, 32, 34, 44,115,101,108,102, - 46,109,111,100, 44,115,101,108,102, 46,116,121,112,101, 44, - 112,116,114, 41, 10,105,102, 32,115,101,108,102, 46,100,105, - 109, 32,126, 61, 32, 39, 39, 32, 97,110,100, 32,116,111,110, - 117,109, 98,101,114, 40,115,101,108,102, 46,100,105,109, 41, - 61, 61,110,105,108, 32,116,104,101,110, 10,111,117,116,112, - 117,116, 40, 39, 42, 39, 41, 10,101,110,100, 10,111,117,116, - 112,117,116, 40,115,101,108,102, 46,110, 97,109,101, 41, 10, - 105,102, 32,115,101,108,102, 46,100,105,109, 32,126, 61, 32, - 39, 39, 32,116,104,101,110, 10,105,102, 32,116,111,110,117, - 109, 98,101,114, 40,115,101,108,102, 46,100,105,109, 41,126, - 61,110,105,108, 32,116,104,101,110, 10,111,117,116,112,117, - 116, 40, 39, 91, 39, 44,115,101,108,102, 46,100,105,109, 44, - 39, 93, 59, 39, 41, 10,101,108,115,101, 10,111,117,116,112, - 117,116, 40, 39, 32, 61, 32, 40, 39, 44,115,101,108,102, 46, - 109,111,100, 44,115,101,108,102, 46,116,121,112,101, 44,112, - 116,114, 44, 39, 42, 41, 39, 44, 10, 39,109, 97,108,108,111, - 99, 40, 39, 44,115,101,108,102, 46,100,105,109, 44, 39, 42, - 115,105,122,101,111,102, 40, 39, 44,115,101,108,102, 46,116, - 121,112,101, 44,112,116,114, 44, 39, 41, 41, 59, 39, 41, 10, - 101,110,100, 10,101,108,115,101, 10,108,111, 99, 97,108, 32, - 116, 32, 61, 32,105,115, 98, 97,115,105, 99, 40,115,101,108, - 102, 46,116,121,112,101, 41, 10,111,117,116,112,117,116, 40, - 39, 32, 61, 32, 39, 41, 10,105,102, 32,110,111,116, 32,116, - 32, 97,110,100, 32,112,116,114, 61, 61, 39, 39, 32,116,104, - 101,110, 32,111,117,116,112,117,116, 40, 39, 42, 39, 41, 32, - 101,110,100, 10,111,117,116,112,117,116, 40, 39, 40, 40, 39, - 44,115,101,108,102, 46,109,111,100, 44,115,101,108,102, 46, - 116,121,112,101, 41, 10,105,102, 32,110,111,116, 32,116, 32, - 116,104,101,110, 10,111,117,116,112,117,116, 40, 39, 42, 39, - 41, 10,101,110,100, 10,111,117,116,112,117,116, 40, 39, 41, - 32, 39, 41, 10,108,111, 99, 97,108, 32,100,101,102, 32, 61, - 32, 48, 10,105,102, 32,115,101,108,102, 46,100,101,102, 32, - 126, 61, 32, 39, 39, 32,116,104,101,110, 32,100,101,102, 32, - 61, 32,115,101,108,102, 46,100,101,102, 32,101,110,100, 10, - 105,102, 32,116, 32,116,104,101,110, 10,111,117,116,112,117, - 116, 40, 39,116,111,108,117, 97, 95,103,101,116, 39, 46, 46, - 116, 44, 39, 40,116,111,108,117, 97, 95, 83, 44, 39, 44,110, - 97,114,103, 44, 39, 44, 39, 44,100,101,102, 44, 39, 41, 41, - 59, 39, 41, 10,101,108,115,101, 10,111,117,116,112,117,116, - 40, 39,116,111,108,117, 97, 95,103,101,116,117,115,101,114, - 116,121,112,101, 40,116,111,108,117, 97, 95, 83, 44, 39, 44, - 110, 97,114,103, 44, 39, 44, 39, 44,100,101,102, 44, 39, 41, - 41, 59, 39, 41, 10,101,110,100, 10,101,110,100, 10,101,110, - 100, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, - 97,115,115, 68,101, 99,108, 97,114, 97,116,105,111,110, 58, - 103,101,116, 97,114,114, 97,121, 32, 40,110, 97,114,103, 41, - 10,105,102, 32,115,101,108,102, 46,100,105,109, 32,126, 61, - 32, 39, 39, 32,116,104,101,110, 10,111,117,116,112,117,116, - 40, 39, 32,123, 39, 41, 10,108,111, 99, 97,108, 32,100,101, - 102, 32, 61, 32,115,101,108,102, 46,100,101,102,126, 61, 39, - 39, 32,111,114, 32, 48, 10,111,117,116,112,117,116, 40, 39, - 32,105,102, 32, 40, 33,116,111,108,117, 97, 95, 97,114,114, - 97,121,105,115,116,121,112,101, 40,116,111,108,117, 97, 95, - 83, 44, 39, 44,110, 97,114,103, 44, 39, 44, 39, 44,115,101, - 108,102, 46,116, 97,103, 44, 39, 44, 39, 44,115,101,108,102, - 46,100,105,109, 44, 39, 44, 39, 44,100,101,102, 44, 39, 41, - 41, 39, 41, 10,111,117,116,112,117,116, 40, 39, 32,103,111, - 116,111, 32,116,111,108,117, 97, 95,108,101,114,114,111,114, - 59, 39, 41, 10,111,117,116,112,117,116, 40, 39, 32,101,108, - 115,101, 92,110, 39, 41, 10,111,117,116,112,117,116, 40, 39, - 32,123, 39, 41, 10,111,117,116,112,117,116, 40, 39, 32,105, - 110,116, 32,105, 59, 39, 41, 10,111,117,116,112,117,116, 40, - 39, 32,102,111,114, 40,105, 61, 48, 59, 32,105, 60, 39, 46, - 46,115,101,108,102, 46,100,105,109, 46, 46, 39, 59,105, 43, - 43, 41, 39, 41, 10,108,111, 99, 97,108, 32,116, 32, 61, 32, - 105,115, 98, 97,115,105, 99, 40,115,101,108,102, 46,116,121, - 112,101, 41, 10,108,111, 99, 97,108, 32,112,116,114, 32, 61, - 32, 39, 39, 10,105,102, 32,115,101,108,102, 46,112,116,114, - 126, 61, 39, 39, 32,116,104,101,110, 32,112,116,114, 32, 61, - 32, 39, 42, 39, 32,101,110,100, 10,111,117,116,112,117,116, - 40, 39, 32, 39, 44,115,101,108,102, 46,110, 97,109,101, 46, - 46, 39, 91,105, 93, 32, 61, 32, 39, 41, 10,105,102, 32,110, - 111,116, 32,116, 32, 97,110,100, 32,112,116,114, 61, 61, 39, - 39, 32,116,104,101,110, 32,111,117,116,112,117,116, 40, 39, - 42, 39, 41, 32,101,110,100, 10,111,117,116,112,117,116, 40, - 39, 40, 40, 39, 44,115,101,108,102, 46,109,111,100, 44,115, - 101,108,102, 46,116,121,112,101, 41, 10,105,102, 32,110,111, - 116, 32,116, 32,116,104,101,110, 10,111,117,116,112,117,116, - 40, 39, 42, 39, 41, 10,101,110,100, 10,111,117,116,112,117, - 116, 40, 39, 41, 32, 39, 41, 10,108,111, 99, 97,108, 32,100, - 101,102, 32, 61, 32, 48, 10,105,102, 32,115,101,108,102, 46, - 100,101,102, 32,126, 61, 32, 39, 39, 32,116,104,101,110, 32, - 100,101,102, 32, 61, 32,115,101,108,102, 46,100,101,102, 32, - 101,110,100, 10,105,102, 32,116, 32,116,104,101,110, 10,111, - 117,116,112,117,116, 40, 39,116,111,108,117, 97, 95,103,101, - 116,102,105,101,108,100, 39, 46, 46,116, 46, 46, 39, 40,116, - 111,108,117, 97, 95, 83, 44, 39, 44,110, 97,114,103, 44, 39, - 44,105, 43, 49, 44, 39, 44,100,101,102, 44, 39, 41, 41, 59, - 39, 41, 10,101,108,115,101, 10,111,117,116,112,117,116, 40, - 39,116,111,108,117, 97, 95,103,101,116,102,105,101,108,100, - 117,115,101,114,116,121,112,101, 40,116,111,108,117, 97, 95, - 83, 44, 39, 44,110, 97,114,103, 44, 39, 44,105, 43, 49, 44, - 39, 44,100,101,102, 44, 39, 41, 41, 59, 39, 41, 10,101,110, - 100, 10,111,117,116,112,117,116, 40, 39, 32,125, 39, 41, 10, - 111,117,116,112,117,116, 40, 39, 32,125, 39, 41, 10,101,110, - 100, 10,101,110,100, 10, 10, 10,102,117,110, 99,116,105,111, - 110, 32, 99,108, 97,115,115, 68,101, 99,108, 97,114, 97,116, - 105,111,110, 58,115,101,116, 97,114,114, 97,121, 32, 40,110, - 97,114,103, 41, 10,105,102, 32,115,101,108,102, 46,100,105, - 109, 32,126, 61, 32, 39, 39, 32,116,104,101,110, 10,111,117, - 116,112,117,116, 40, 39, 32,123, 39, 41, 10,111,117,116,112, - 117,116, 40, 39, 32,105,110,116, 32,105, 59, 39, 41, 10,111, - 117,116,112,117,116, 40, 39, 32,102,111,114, 40,105, 61, 48, - 59, 32,105, 60, 39, 46, 46,115,101,108,102, 46,100,105,109, - 46, 46, 39, 59,105, 43, 43, 41, 39, 41, 10,108,111, 99, 97, - 108, 32,116, 44, 99,116, 32, 61, 32,105,115, 98, 97,115,105, - 99, 40,115,101,108,102, 46,116,121,112,101, 41, 10,105,102, - 32,116, 32,116,104,101,110, 10,111,117,116,112,117,116, 40, - 39, 32,116,111,108,117, 97, 95,112,117,115,104,102,105,101, - 108,100, 39, 46, 46,116, 46, 46, 39, 40,116,111,108,117, 97, - 95, 83, 44, 39, 44,110, 97,114,103, 44, 39, 44,105, 43, 49, - 44, 40, 39, 44, 99,116, 44, 39, 41, 39, 44,115,101,108,102, - 46,110, 97,109,101, 44, 39, 91,105, 93, 41, 59, 39, 41, 10, - 101,108,115,101, 10,105,102, 32,115,101,108,102, 46,112,116, - 114, 32, 61, 61, 32, 39, 39, 32,116,104,101,110, 10,111,117, - 116,112,117,116, 40, 39, 32,123, 39, 41, 10,111,117,116,112, - 117,116, 40, 39, 35,105,102,100,101,102, 32, 95, 95, 99,112, - 108,117,115,112,108,117,115, 92,110, 39, 41, 10,111,117,116, - 112,117,116, 40, 39, 32,118,111,105,100, 42, 32,116,111,108, - 117, 97, 73, 95, 99,108,111,110,101, 32, 61, 32,110,101,119, - 39, 44,115,101,108,102, 46,116,121,112,101, 44, 39, 40, 39, - 44,115,101,108,102, 46,110, 97,109,101, 44, 39, 91,105, 93, - 41, 59, 39, 41, 10,111,117,116,112,117,116, 40, 39, 35,101, - 108,115,101, 92,110, 39, 41, 10,111,117,116,112,117,116, 40, - 39, 32,118,111,105,100, 42, 32,116,111,108,117, 97, 73, 95, - 99,108,111,110,101, 32, 61, 32,116,111,108,117, 97, 95, 99, - 111,112,121, 40,116,111,108,117, 97, 95, 83, 44, 40,118,111, - 105,100, 42, 41, 38, 39, 44,115,101,108,102, 46,110, 97,109, - 101, 44, 39, 91,105, 93, 44,115,105,122,101,111,102, 40, 39, - 44,115,101,108,102, 46,116,121,112,101, 44, 39, 41, 41, 59, - 39, 41, 10,111,117,116,112,117,116, 40, 39, 35,101,110,100, - 105,102, 92,110, 39, 41, 10,111,117,116,112,117,116, 40, 39, - 32,116,111,108,117, 97, 95,112,117,115,104,102,105,101,108, - 100,117,115,101,114,116,121,112,101, 40,116,111,108,117, 97, - 95, 83, 44, 39, 44,110, 97,114,103, 44, 39, 44,105, 43, 49, - 44,116,111,108,117, 97, 95,100,111, 99,108,111,110,101, 40, - 116,111,108,117, 97, 95, 83, 44,116,111,108,117, 97, 73, 95, - 99,108,111,110,101, 44, 39, 44,115,101,108,102, 46,116, 97, - 103, 44, 39, 41, 44, 39, 44,115,101,108,102, 46,116, 97,103, - 44, 39, 41, 59, 39, 41, 10,111,117,116,112,117,116, 40, 39, - 32,125, 39, 41, 10, 10, 10,101,108,115,101, 10,111,117,116, - 112,117,116, 40, 39, 32,116,111,108,117, 97, 95,112,117,115, - 104,102,105,101,108,100,117,115,101,114,116,121,112,101, 40, - 116,111,108,117, 97, 95, 83, 44, 39, 44,110, 97,114,103, 44, - 39, 44,105, 43, 49, 44, 40,118,111,105,100, 42, 41, 39, 44, - 115,101,108,102, 46,110, 97,109,101, 44, 39, 91,105, 93, 44, - 39, 44,115,101,108,102, 46,116, 97,103, 44, 39, 41, 59, 39, - 41, 10,101,110,100, 10,101,110,100, 10,111,117,116,112,117, - 116, 40, 39, 32,125, 39, 41, 10,101,110,100, 10,101,110,100, - 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97, - 115,115, 68,101, 99,108, 97,114, 97,116,105,111,110, 58,102, - 114,101,101, 97,114,114, 97,121, 32, 40, 41, 10,105,102, 32, - 115,101,108,102, 46,100,105,109, 32,126, 61, 32, 39, 39, 32, - 97,110,100, 32,116,111,110,117,109, 98,101,114, 40,115,101, - 108,102, 46,100,105,109, 41, 61, 61,110,105,108, 32,116,104, - 101,110, 10,111,117,116,112,117,116, 40, 39, 32,102,114,101, - 101, 40, 39, 44,115,101,108,102, 46,110, 97,109,101, 44, 39, - 41, 59, 39, 41, 10,101,110,100, 10,101,110,100, 10, 10, 10, - 102,117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 68, - 101, 99,108, 97,114, 97,116,105,111,110, 58,112, 97,115,115, - 112, 97,114, 32, 40, 41, 10,105,102, 32,115,101,108,102, 46, - 112,116,114, 61, 61, 39, 38, 39, 32,116,104,101,110, 10,111, - 117,116,112,117,116, 40, 39, 42, 39, 46, 46,115,101,108,102, - 46,110, 97,109,101, 41, 10,101,108,115,101,105,102, 32,115, - 101,108,102, 46,114,101,116, 61, 61, 39, 42, 39, 32,116,104, - 101,110, 10,111,117,116,112,117,116, 40, 39, 38, 39, 46, 46, - 115,101,108,102, 46,110, 97,109,101, 41, 10,101,108,115,101, - 10,111,117,116,112,117,116, 40,115,101,108,102, 46,110, 97, - 109,101, 41, 10,101,110,100, 10,101,110,100, 10, 10, 10,102, - 117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 68,101, - 99,108, 97,114, 97,116,105,111,110, 58,114,101,116,118, 97, - 108,117,101, 32, 40, 41, 10,105,102, 32,115,101,108,102, 46, - 114,101,116, 32,126, 61, 32, 39, 39, 32,116,104,101,110, 10, - 108,111, 99, 97,108, 32,116, 44, 99,116, 32, 61, 32,105,115, - 98, 97,115,105, 99, 40,115,101,108,102, 46,116,121,112,101, - 41, 10,105,102, 32,116, 32,116,104,101,110, 10,111,117,116, - 112,117,116, 40, 39, 32,116,111,108,117, 97, 95,112,117,115, - 104, 39, 46, 46,116, 46, 46, 39, 40,116,111,108,117, 97, 95, - 83, 44, 40, 39, 44, 99,116, 44, 39, 41, 39, 46, 46,115,101, - 108,102, 46,110, 97,109,101, 46, 46, 39, 41, 59, 39, 41, 10, - 101,108,115,101, 10,111,117,116,112,117,116, 40, 39, 32,116, - 111,108,117, 97, 95,112,117,115,104,117,115,101,114,116,121, - 112,101, 40,116,111,108,117, 97, 95, 83, 44, 40,118,111,105, - 100, 42, 41, 39, 46, 46,115,101,108,102, 46,110, 97,109,101, - 46, 46, 39, 44, 39, 44,115,101,108,102, 46,116, 97,103, 44, - 39, 41, 59, 39, 41, 10,101,110,100, 10,114,101,116,117,114, - 110, 32, 49, 10,101,110,100, 10,114,101,116,117,114,110, 32, - 48, 10,101,110,100, 10, 10, 10,102,117,110, 99,116,105,111, - 110, 32, 95, 68,101, 99,108, 97,114, 97,116,105,111,110, 32, - 40,116, 41, 10,105,102, 32,116, 46,110, 97,109,101, 32, 97, - 110,100, 32,116, 46,110, 97,109,101,126, 61, 39, 39, 32,116, - 104,101,110, 10,108,111, 99, 97,108, 32,110, 32, 61, 32,115, - 112,108,105,116, 40,116, 46,110, 97,109,101, 44, 39, 64, 39, - 41, 10,116, 46,110, 97,109,101, 32, 61, 32,110, 91, 49, 93, - 10,116, 46,108,110, 97,109,101, 32, 61, 32,103,115,117, 98, - 40,110, 91, 50, 93, 32,111,114, 32,110, 91, 49, 93, 44, 34, - 37, 91, 46, 45, 37, 93, 34, 44, 34, 34, 41, 10,101,110,100, - 10,116, 46, 95, 98, 97,115,101, 32, 61, 32, 99,108, 97,115, - 115, 68,101, 99,108, 97,114, 97,116,105,111,110, 10,115,101, - 116,116, 97,103, 40,116, 44,116,111,108,117, 97, 95,116, 97, - 103, 41, 10,116, 58, 99,104,101, 99,107,110, 97,109,101, 40, - 41, 10,116, 58, 99,104,101, 99,107,116,121,112,101, 40, 41, - 10,114,101,116,117,114,110, 32,116, 10,101,110,100, 10, 10, - 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 68,101, 99, - 108, 97,114, 97,116,105,111,110, 32, 40,115, 44,107,105,110, - 100, 41, 10, 10,115, 32, 61, 32,103,115,117, 98, 40,115, 44, - 34, 37,115, 42, 61, 37,115, 42, 34, 44, 34, 61, 34, 41, 10, - 10,105,102, 32,107,105,110,100, 32, 61, 61, 32, 34,118, 97, - 114, 34, 32,116,104,101,110, 10, 10,105,102, 32,115, 32, 61, - 61, 32, 39, 39, 32,111,114, 32,115, 32, 61, 61, 32, 39,118, - 111,105,100, 39, 32,116,104,101,110, 10,114,101,116,117,114, - 110, 32, 95, 68,101, 99,108, 97,114, 97,116,105,111,110,123, - 116,121,112,101, 32, 61, 32, 39,118,111,105,100, 39, 44, 32, - 107,105,110,100, 32, 61, 32,107,105,110,100,125, 10,101,110, - 100, 10,101,110,100, 10, 10, 10,108,111, 99, 97,108, 32,116, - 32, 61, 32,115,112,108,105,116, 40,115, 44, 39, 37, 42, 37, - 115, 42, 38, 39, 41, 10,105,102, 32,116, 46,110, 32, 61, 61, - 32, 50, 32,116,104,101,110, 10,105,102, 32,107,105,110,100, - 32, 61, 61, 32, 39,102,117,110, 99, 39, 32,116,104,101,110, - 10,101,114,114,111,114, 40, 34, 35,105,110,118, 97,108,105, - 100, 32,102,117,110, 99,116,105,111,110, 32,114,101,116,117, - 114,110, 32,116,121,112,101, 58, 32, 34, 46, 46,115, 41, 10, - 101,110,100, 10,108,111, 99, 97,108, 32,109, 32, 61, 32,115, - 112,108,105,116, 40,116, 91, 49, 93, 44, 39, 37,115, 37,115, - 42, 39, 41, 10,114,101,116,117,114,110, 32, 95, 68,101, 99, - 108, 97,114, 97,116,105,111,110,123, 10,110, 97,109,101, 32, - 61, 32,116, 91, 50, 93, 44, 10,112,116,114, 32, 61, 32, 39, - 42, 39, 44, 10,114,101,116, 32, 61, 32, 39, 38, 39, 44, 10, - 116,121,112,101, 32, 61, 32,109, 91,109, 46,110, 93, 44, 10, - 109,111,100, 32, 61, 32, 99,111,110, 99, 97,116, 40,109, 44, - 49, 44,109, 46,110, 45, 49, 41, 44, 10,107,105,110,100, 32, - 61, 32,107,105,110,100, 10,125, 10,101,110,100, 10, 10, 10, - 116, 32, 61, 32,115,112,108,105,116, 40,115, 44, 39, 37, 42, - 37,115, 42, 37, 42, 39, 41, 10,105,102, 32,116, 46,110, 32, - 61, 61, 32, 50, 32,116,104,101,110, 10,105,102, 32,107,105, - 110,100, 32, 61, 61, 32, 39,102,117,110, 99, 39, 32,116,104, - 101,110, 10,101,114,114,111,114, 40, 34, 35,105,110,118, 97, - 108,105,100, 32,102,117,110, 99,116,105,111,110, 32,114,101, - 116,117,114,110, 32,116,121,112,101, 58, 32, 34, 46, 46,115, - 41, 10,101,110,100, 10,108,111, 99, 97,108, 32,109, 32, 61, - 32,115,112,108,105,116, 40,116, 91, 49, 93, 44, 39, 37,115, - 37,115, 42, 39, 41, 10,114,101,116,117,114,110, 32, 95, 68, - 101, 99,108, 97,114, 97,116,105,111,110,123, 10,110, 97,109, - 101, 32, 61, 32,116, 91, 50, 93, 44, 10,112,116,114, 32, 61, - 32, 39, 42, 39, 44, 10,114,101,116, 32, 61, 32, 39, 42, 39, - 44, 10,116,121,112,101, 32, 61, 32,109, 91,109, 46,110, 93, - 44, 10,109,111,100, 32, 61, 32, 99,111,110, 99, 97,116, 40, - 109, 44, 49, 44,109, 46,110, 45, 49, 41, 44, 10,107,105,110, - 100, 32, 61, 32,107,105,110,100, 10,125, 10,101,110,100, 10, - 10, 10,116, 32, 61, 32,115,112,108,105,116, 40,115, 44, 39, - 38, 39, 41, 10,105,102, 32,116, 46,110, 32, 61, 61, 32, 50, - 32,116,104,101,110, 10,108,111, 99, 97,108, 32,109, 32, 61, - 32,115,112,108,105,116, 40,116, 91, 49, 93, 44, 39, 37,115, - 37,115, 42, 39, 41, 10,114,101,116,117,114,110, 32, 95, 68, - 101, 99,108, 97,114, 97,116,105,111,110,123, 10,110, 97,109, - 101, 32, 61, 32,116, 91, 50, 93, 44, 10,112,116,114, 32, 61, - 32, 39, 38, 39, 44, 10,116,121,112,101, 32, 61, 32,109, 91, - 109, 46,110, 93, 44, 10,109,111,100, 32, 61, 32, 99,111,110, - 99, 97,116, 40,109, 44, 49, 44,109, 46,110, 45, 49, 41, 32, - 44, 10,107,105,110,100, 32, 61, 32,107,105,110,100, 10,125, - 10,101,110,100, 10, 10, 10,108,111, 99, 97,108, 32,115, 49, - 32, 61, 32,103,115,117, 98, 40,115, 44, 34, 40, 37, 98, 92, - 91, 92, 93, 41, 34, 44,102,117,110, 99,116,105,111,110, 32, - 40,110, 41, 32,114,101,116,117,114,110, 32,103,115,117, 98, - 40,110, 44, 39, 37, 42, 39, 44, 39, 92, 49, 39, 41, 32,101, - 110,100, 41, 10,116, 32, 61, 32,115,112,108,105,116, 40,115, - 49, 44, 39, 37, 42, 39, 41, 10,105,102, 32,116, 46,110, 32, - 61, 61, 32, 50, 32,116,104,101,110, 10,116, 91, 50, 93, 32, - 61, 32,103,115,117, 98, 40,116, 91, 50, 93, 44, 39, 92, 49, - 39, 44, 39, 37, 42, 39, 41, 10,108,111, 99, 97,108, 32,109, - 32, 61, 32,115,112,108,105,116, 40,116, 91, 49, 93, 44, 39, - 37,115, 37,115, 42, 39, 41, 10,114,101,116,117,114,110, 32, - 95, 68,101, 99,108, 97,114, 97,116,105,111,110,123, 10,110, - 97,109,101, 32, 61, 32,116, 91, 50, 93, 44, 10,112,116,114, - 32, 61, 32, 39, 42, 39, 44, 10,116,121,112,101, 32, 61, 32, - 109, 91,109, 46,110, 93, 44, 10,109,111,100, 32, 61, 32, 99, - 111,110, 99, 97,116, 40,109, 44, 49, 44,109, 46,110, 45, 49, - 41, 32, 44, 10,107,105,110,100, 32, 61, 32,107,105,110,100, - 10,125, 10,101,110,100, 10, 10,105,102, 32,107,105,110,100, - 32, 61, 61, 32, 39,118, 97,114, 39, 32,116,104,101,110, 10, - 10,116, 32, 61, 32,115,112,108,105,116, 40,115, 44, 39, 37, - 115, 37,115, 42, 39, 41, 10,108,111, 99, 97,108, 32,118, 10, - 105,102, 32,105,115,116,121,112,101, 40,116, 91,116, 46,110, - 93, 41, 32,116,104,101,110, 32,118, 32, 61, 32, 39, 39, 32, - 101,108,115,101, 32,118, 32, 61, 32,116, 91,116, 46,110, 93, - 59, 32,116, 46,110, 32, 61, 32,116, 46,110, 45, 49, 32,101, - 110,100, 10,114,101,116,117,114,110, 32, 95, 68,101, 99,108, - 97,114, 97,116,105,111,110,123, 10,110, 97,109,101, 32, 61, - 32,118, 44, 10,116,121,112,101, 32, 61, 32,116, 91,116, 46, - 110, 93, 44, 10,109,111,100, 32, 61, 32, 99,111,110, 99, 97, - 116, 40,116, 44, 49, 44,116, 46,110, 45, 49, 41, 44, 10,107, - 105,110,100, 32, 61, 32,107,105,110,100, 10,125, 10, 10,101, - 108,115,101, 10, 10, 10,116, 32, 61, 32,115,112,108,105,116, - 40,115, 44, 39, 37,115, 37,115, 42, 39, 41, 10,108,111, 99, - 97,108, 32,118, 32, 61, 32,116, 91,116, 46,110, 93, 10,108, - 111, 99, 97,108, 32,116,112, 44,109,100, 10,105,102, 32,116, - 46,110, 62, 49, 32,116,104,101,110, 10,116,112, 32, 61, 32, - 116, 91,116, 46,110, 45, 49, 93, 10,109,100, 32, 61, 32, 99, - 111,110, 99, 97,116, 40,116, 44, 49, 44,116, 46,110, 45, 50, - 41, 10,101,110,100, 10,114,101,116,117,114,110, 32, 95, 68, - 101, 99,108, 97,114, 97,116,105,111,110,123, 10,110, 97,109, - 101, 32, 61, 32,118, 44, 10,116,121,112,101, 32, 61, 32,116, - 112, 44, 10,109,111,100, 32, 61, 32,109,100, 44, 10,107,105, - 110,100, 32, 61, 32,107,105,110,100, 10,125, 10,101,110,100, - 10, 10,101,110,100, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 99,108, 97,115,115, 86, 97,114,105, - 97, 98,108,101, 32, 61, 32,123, 10, 95, 98, 97,115,101, 32, - 61, 32, 99,108, 97,115,115, 68,101, 99,108, 97,114, 97,116, - 105,111,110, 44, 10,125, 10, 10,115,101,116,116, 97,103, 40, - 99,108, 97,115,115, 86, 97,114,105, 97, 98,108,101, 44,116, - 111,108,117, 97, 95,116, 97,103, 41, 10, 10, 10,102,117,110, - 99,116,105,111,110, 32, 99,108, 97,115,115, 86, 97,114,105, - 97, 98,108,101, 58,112,114,105,110,116, 32, 40,105,100,101, - 110,116, 44, 99,108,111,115,101, 41, 10,112,114,105,110,116, - 40,105,100,101,110,116, 46, 46, 34, 86, 97,114,105, 97, 98, - 108,101,123, 34, 41, 10,112,114,105,110,116, 40,105,100,101, - 110,116, 46, 46, 34, 32,109,111,100, 32, 61, 32, 39, 34, 46, - 46,115,101,108,102, 46,109,111,100, 46, 46, 34, 39, 44, 34, - 41, 10,112,114,105,110,116, 40,105,100,101,110,116, 46, 46, - 34, 32,116,121,112,101, 32, 61, 32, 39, 34, 46, 46,115,101, - 108,102, 46,116,121,112,101, 46, 46, 34, 39, 44, 34, 41, 10, - 112,114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 32, - 112,116,114, 32, 61, 32, 39, 34, 46, 46,115,101,108,102, 46, - 112,116,114, 46, 46, 34, 39, 44, 34, 41, 10,112,114,105,110, - 116, 40,105,100,101,110,116, 46, 46, 34, 32,110, 97,109,101, - 32, 61, 32, 39, 34, 46, 46,115,101,108,102, 46,110, 97,109, - 101, 46, 46, 34, 39, 44, 34, 41, 10,112,114,105,110,116, 40, - 105,100,101,110,116, 46, 46, 34, 32,100,101,102, 32, 61, 32, - 39, 34, 46, 46,115,101,108,102, 46,100,101,102, 46, 46, 34, - 39, 44, 34, 41, 10,112,114,105,110,116, 40,105,100,101,110, - 116, 46, 46, 34, 32,114,101,116, 32, 61, 32, 39, 34, 46, 46, - 115,101,108,102, 46,114,101,116, 46, 46, 34, 39, 44, 34, 41, - 10,112,114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, - 125, 34, 46, 46, 99,108,111,115,101, 41, 10,101,110,100, 10, - 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97,115, - 115, 86, 97,114,105, 97, 98,108,101, 58,103,101,116,118, 97, - 108,117,101, 32, 40, 99,108, 97,115,115, 44,115,116, 97,116, - 105, 99, 41, 10,105,102, 32, 99,108, 97,115,115, 32, 97,110, - 100, 32,115,116, 97,116,105, 99, 32,116,104,101,110, 10,114, - 101,116,117,114,110, 32, 99,108, 97,115,115, 46, 46, 39, 58, - 58, 39, 46, 46,115,101,108,102, 46,110, 97,109,101, 10,101, - 108,115,101,105,102, 32, 99,108, 97,115,115, 32,116,104,101, - 110, 10,114,101,116,117,114,110, 32, 39,115,101,108,102, 45, - 62, 39, 46, 46,115,101,108,102, 46,110, 97,109,101, 10,101, - 108,115,101, 10,114,101,116,117,114,110, 32,115,101,108,102, - 46,110, 97,109,101, 10,101,110,100, 10,101,110,100, 10, 10, - 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, - 86, 97,114,105, 97, 98,108,101, 58,115,117,112, 99,111,100, - 101, 32, 40, 41, 10,108,111, 99, 97,108, 32, 99,108, 97,115, - 115, 32, 61, 32,115,101,108,102, 58,105,110, 99,108, 97,115, - 115, 40, 41, 10, 10, 10,105,102, 32, 99,108, 97,115,115, 32, - 116,104,101,110, 10,111,117,116,112,117,116, 40, 34, 47, 42, - 32,103,101,116, 32,102,117,110, 99,116,105,111,110, 58, 34, - 44,115,101,108,102, 46,110, 97,109,101, 44, 34, 32,111,102, - 32, 99,108, 97,115,115, 32, 34, 44, 99,108, 97,115,115, 44, - 34, 32, 42, 47, 34, 41, 10,101,108,115,101, 10,111,117,116, - 112,117,116, 40, 34, 47, 42, 32,103,101,116, 32,102,117,110, - 99,116,105,111,110, 58, 34, 44,115,101,108,102, 46,110, 97, - 109,101, 44, 34, 32, 42, 47, 34, 41, 10,101,110,100, 10,115, - 101,108,102, 46, 99,103,101,116,110, 97,109,101, 32, 61, 32, - 115,101,108,102, 58, 99,102,117,110, 99,110, 97,109,101, 40, - 34,116,111,108,117, 97, 73, 95,103,101,116, 34, 41, 10,111, - 117,116,112,117,116, 40, 34,115,116, 97,116,105, 99, 32,105, - 110,116, 34, 44,115,101,108,102, 46, 99,103,101,116,110, 97, - 109,101, 44, 34, 40,108,117, 97, 95, 83,116, 97,116,101, 42, - 32,116,111,108,117, 97, 95, 83, 41, 34, 41, 10,111,117,116, - 112,117,116, 40, 34,123, 34, 41, 10, 10, 10,108,111, 99, 97, - 108, 32, 95, 44, 95, 44,115,116, 97,116,105, 99, 32, 61, 32, - 115,116,114,102,105,110,100, 40,115,101,108,102, 46,109,111, - 100, 44, 39, 94, 37,115, 42, 40,115,116, 97,116,105, 99, 41, - 39, 41, 10,105,102, 32, 99,108, 97,115,115, 32, 97,110,100, - 32,115,116, 97,116,105, 99, 61, 61,110,105,108, 32,116,104, - 101,110, 10,111,117,116,112,117,116, 40, 39, 32, 39, 44, 99, - 108, 97,115,115, 44, 39, 42, 39, 44, 39,115,101,108,102, 32, - 61, 32, 39, 41, 10,111,117,116,112,117,116, 40, 39, 40, 39, - 44, 99,108, 97,115,115, 44, 39, 42, 41, 32, 39, 41, 10,111, - 117,116,112,117,116, 40, 39,116,111,108,117, 97, 95,103,101, - 116,117,115,101,114,116,121,112,101, 40,116,111,108,117, 97, - 95, 83, 44, 49, 44, 48, 41, 59, 39, 41, 10,101,108,115,101, - 105,102, 32,115,116, 97,116,105, 99, 32,116,104,101,110, 10, - 95, 44, 95, 44,115,101,108,102, 46,109,111,100, 32, 61, 32, - 115,116,114,102,105,110,100, 40,115,101,108,102, 46,109,111, - 100, 44, 39, 94, 37,115, 42,115,116, 97,116,105, 99, 37,115, - 37,115, 42, 40, 46, 42, 41, 39, 41, 10,101,110,100, 10, 10, - 10, 10,105,102, 32, 99,108, 97,115,115, 32, 97,110,100, 32, - 115,116, 97,116,105, 99, 61, 61,110,105,108, 32,116,104,101, - 110, 10,111,117,116,112,117,116, 40, 39, 32,105,102, 32, 40, - 33,115,101,108,102, 41, 32, 84, 79, 76, 85, 65, 95, 69, 82, - 82, 95, 83, 69, 76, 70, 59, 39, 41, 59, 10,101,110,100, 10, - 10, 10,108,111, 99, 97,108, 32,116, 44, 99,116, 32, 61, 32, - 105,115, 98, 97,115,105, 99, 40,115,101,108,102, 46,116,121, - 112,101, 41, 10,105,102, 32,116, 32,116,104,101,110, 10,111, - 117,116,112,117,116, 40, 39, 32,116,111,108,117, 97, 95,112, - 117,115,104, 39, 46, 46,116, 46, 46, 39, 40,116,111,108,117, - 97, 95, 83, 44, 40, 39, 44, 99,116, 44, 39, 41, 39, 46, 46, - 115,101,108,102, 58,103,101,116,118, 97,108,117,101, 40, 99, - 108, 97,115,115, 44,115,116, 97,116,105, 99, 41, 46, 46, 39, - 41, 59, 39, 41, 10,101,108,115,101, 10,105,102, 32,115,101, - 108,102, 46,112,116,114, 32, 61, 61, 32, 39, 38, 39, 32,111, - 114, 32,115,101,108,102, 46,112,116,114, 32, 61, 61, 32, 39, - 39, 32,116,104,101,110, 10,111,117,116,112,117,116, 40, 39, - 32,116,111,108,117, 97, 95,112,117,115,104,117,115,101,114, - 116,121,112,101, 40,116,111,108,117, 97, 95, 83, 44, 40,118, - 111,105,100, 42, 41, 38, 39, 46, 46,115,101,108,102, 58,103, - 101,116,118, 97,108,117,101, 40, 99,108, 97,115,115, 44,115, - 116, 97,116,105, 99, 41, 46, 46, 39, 44, 39, 44,115,101,108, - 102, 46,116, 97,103, 44, 39, 41, 59, 39, 41, 10,101,108,115, - 101, 10,111,117,116,112,117,116, 40, 39, 32,116,111,108,117, - 97, 95,112,117,115,104,117,115,101,114,116,121,112,101, 40, - 116,111,108,117, 97, 95, 83, 44, 40,118,111,105,100, 42, 41, - 39, 46, 46,115,101,108,102, 58,103,101,116,118, 97,108,117, - 101, 40, 99,108, 97,115,115, 44,115,116, 97,116,105, 99, 41, - 46, 46, 39, 44, 39, 44,115,101,108,102, 46,116, 97,103, 44, - 39, 41, 59, 39, 41, 10,101,110,100, 10,101,110,100, 10,111, - 117,116,112,117,116, 40, 39, 32,114,101,116,117,114,110, 32, - 49, 59, 39, 41, 10,111,117,116,112,117,116, 40, 39,125, 39, - 41, 10,111,117,116,112,117,116, 40, 39, 92,110, 39, 41, 10, - 10, 10,105,102, 32,110,111,116, 32,115,116,114,102,105,110, - 100, 40,115,101,108,102, 46,109,111,100, 44, 39, 99,111,110, - 115,116, 39, 41, 32,116,104,101,110, 10,105,102, 32, 99,108, - 97,115,115, 32,116,104,101,110, 10,111,117,116,112,117,116, - 40, 34, 47, 42, 32,115,101,116, 32,102,117,110, 99,116,105, - 111,110, 58, 34, 44,115,101,108,102, 46,110, 97,109,101, 44, - 34, 32,111,102, 32, 99,108, 97,115,115, 32, 34, 44, 99,108, - 97,115,115, 44, 34, 32, 42, 47, 34, 41, 10,101,108,115,101, - 10,111,117,116,112,117,116, 40, 34, 47, 42, 32,115,101,116, - 32,102,117,110, 99,116,105,111,110, 58, 34, 44,115,101,108, - 102, 46,110, 97,109,101, 44, 34, 32, 42, 47, 34, 41, 10,101, - 110,100, 10,115,101,108,102, 46, 99,115,101,116,110, 97,109, - 101, 32, 61, 32,115,101,108,102, 58, 99,102,117,110, 99,110, - 97,109,101, 40, 34,116,111,108,117, 97, 73, 95,115,101,116, - 34, 41, 10,111,117,116,112,117,116, 40, 34,115,116, 97,116, - 105, 99, 32,105,110,116, 34, 44,115,101,108,102, 46, 99,115, - 101,116,110, 97,109,101, 44, 34, 40,108,117, 97, 95, 83,116, - 97,116,101, 42, 32,116,111,108,117, 97, 95, 83, 41, 34, 41, - 10,111,117,116,112,117,116, 40, 34,123, 34, 41, 10, 10, 10, - 108,111, 99, 97,108, 32,110, 97,114,103, 61, 49, 10,105,102, - 32, 99,108, 97,115,115, 32, 97,110,100, 32,115,116, 97,116, - 105, 99, 61, 61,110,105,108, 32,116,104,101,110, 10,111,117, - 116,112,117,116, 40, 39, 32, 39, 44, 99,108, 97,115,115, 44, - 39, 42, 39, 44, 39,115,101,108,102, 32, 61, 32, 39, 41, 10, - 111,117,116,112,117,116, 40, 39, 40, 39, 44, 99,108, 97,115, - 115, 44, 39, 42, 41, 32, 39, 41, 10,111,117,116,112,117,116, - 40, 39,116,111,108,117, 97, 95,103,101,116,117,115,101,114, - 116,121,112,101, 40,116,111,108,117, 97, 95, 83, 44, 49, 44, - 48, 41, 59, 39, 41, 10, 10,111,117,116,112,117,116, 40, 39, - 32,105,102, 32, 40, 33,115,101,108,102, 41, 32, 84, 79, 76, - 85, 65, 95, 69, 82, 82, 95, 83, 69, 76, 70, 59, 39, 41, 59, - 10,110, 97,114,103, 32, 61, 32,110, 97,114,103, 43, 49, 10, - 101,108,115,101,105,102, 32,115,116, 97,116,105, 99, 32,116, - 104,101,110, 10, 95, 44, 95, 44,115,101,108,102, 46,109,111, - 100, 32, 61, 32,115,116,114,102,105,110,100, 40,115,101,108, - 102, 46,109,111,100, 44, 39, 94, 37,115, 42,115,116, 97,116, - 105, 99, 37,115, 37,115, 42, 40, 46, 42, 41, 39, 41, 10,110, - 97,114,103, 32, 61, 32,110, 97,114,103, 43, 49, 10,101,110, - 100, 10, 10, 10,111,117,116,112,117,116, 40, 39, 32,105,102, - 32, 40, 33, 39, 46, 46,115,101,108,102, 58,111,117,116, 99, - 104,101, 99,107,116,121,112,101, 40,110, 97,114,103, 41, 46, - 46, 39, 41, 39, 41, 10,111,117,116,112,117,116, 40, 39, 32, - 84, 79, 76, 85, 65, 95, 69, 82, 82, 95, 65, 83, 83, 73, 71, - 78, 59, 39, 41, 10, 10, 10,108,111, 99, 97,108, 32,112,116, - 114, 32, 61, 32, 39, 39, 10,105,102, 32,115,101,108,102, 46, - 112,116,114,126, 61, 39, 39, 32,116,104,101,110, 32,112,116, - 114, 32, 61, 32, 39, 42, 39, 32,101,110,100, 10,111,117,116, - 112,117,116, 40, 39, 32, 39, 41, 10,105,102, 32, 99,108, 97, - 115,115, 32, 97,110,100, 32,115,116, 97,116,105, 99, 32,116, - 104,101,110, 10,111,117,116,112,117,116, 40, 99,108, 97,115, - 115, 46, 46, 39, 58, 58, 39, 46, 46,115,101,108,102, 46,110, - 97,109,101, 41, 10,101,108,115,101,105,102, 32, 99,108, 97, - 115,115, 32,116,104,101,110, 10,111,117,116,112,117,116, 40, - 39,115,101,108,102, 45, 62, 39, 46, 46,115,101,108,102, 46, - 110, 97,109,101, 41, 10,101,108,115,101, 10,111,117,116,112, - 117,116, 40,115,101,108,102, 46,110, 97,109,101, 41, 10,101, - 110,100, 10,108,111, 99, 97,108, 32,116, 32, 61, 32,105,115, - 98, 97,115,105, 99, 40,115,101,108,102, 46,116,121,112,101, - 41, 10,111,117,116,112,117,116, 40, 39, 32, 61, 32, 39, 41, - 10,105,102, 32,110,111,116, 32,116, 32, 97,110,100, 32,112, - 116,114, 61, 61, 39, 39, 32,116,104,101,110, 32,111,117,116, - 112,117,116, 40, 39, 42, 39, 41, 32,101,110,100, 10,111,117, - 116,112,117,116, 40, 39, 40, 40, 39, 44,115,101,108,102, 46, - 109,111,100, 44,115,101,108,102, 46,116,121,112,101, 41, 10, - 105,102, 32,110,111,116, 32,116, 32,116,104,101,110, 10,111, - 117,116,112,117,116, 40, 39, 42, 39, 41, 10,101,110,100, 10, - 111,117,116,112,117,116, 40, 39, 41, 32, 39, 41, 10,108,111, - 99, 97,108, 32,100,101,102, 32, 61, 32, 48, 10,105,102, 32, - 115,101,108,102, 46,100,101,102, 32,126, 61, 32, 39, 39, 32, - 116,104,101,110, 32,100,101,102, 32, 61, 32,115,101,108,102, - 46,100,101,102, 32,101,110,100, 10,105,102, 32,116, 32,116, - 104,101,110, 10,111,117,116,112,117,116, 40, 39,116,111,108, - 117, 97, 95,103,101,116, 39, 46, 46,116, 44, 39, 40,116,111, - 108,117, 97, 95, 83, 44, 39, 44,110, 97,114,103, 44, 39, 44, - 39, 44,100,101,102, 44, 39, 41, 41, 59, 39, 41, 10,101,108, - 115,101, 10,111,117,116,112,117,116, 40, 39,116,111,108,117, - 97, 95,103,101,116,117,115,101,114,116,121,112,101, 40,116, - 111,108,117, 97, 95, 83, 44, 39, 44,110, 97,114,103, 44, 39, - 44, 39, 44,100,101,102, 44, 39, 41, 41, 59, 39, 41, 10,101, - 110,100, 10,111,117,116,112,117,116, 40, 39, 32,114,101,116, - 117,114,110, 32, 48, 59, 39, 41, 10,111,117,116,112,117,116, - 40, 39,125, 39, 41, 10,111,117,116,112,117,116, 40, 39, 92, - 110, 39, 41, 10,101,110,100, 10, 10,101,110,100, 10, 10,102, - 117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 86, 97, - 114,105, 97, 98,108,101, 58,114,101,103,105,115,116,101,114, - 32, 40, 41, 10,108,111, 99, 97,108, 32,112, 97,114,101,110, - 116, 32, 61, 32,115,101,108,102, 58,105,110, 99,108, 97,115, - 115, 40, 41, 32,111,114, 32,115,101,108,102, 58,105,110,109, - 111,100,117,108,101, 40, 41, 10,105,102, 32,112, 97,114,101, - 110,116, 32,116,104,101,110, 10,105,102, 32,115,101,108,102, - 46, 99,115,101,116,110, 97,109,101, 32,116,104,101,110, 10, - 111,117,116,112,117,116, 40, 39, 32,116,111,108,117, 97, 95, - 116, 97, 98,108,101,118, 97,114, 40,116,111,108,117, 97, 95, - 83, 44, 34, 39, 46, 46,112, 97,114,101,110,116, 46, 46, 39, - 34, 44, 34, 39, 46, 46,115,101,108,102, 46,108,110, 97,109, - 101, 46, 46, 39, 34, 44, 39, 46, 46,115,101,108,102, 46, 99, - 103,101,116,110, 97,109,101, 46, 46, 39, 44, 39, 46, 46,115, - 101,108,102, 46, 99,115,101,116,110, 97,109,101, 46, 46, 39, - 41, 59, 39, 41, 10,101,108,115,101, 10,111,117,116,112,117, - 116, 40, 39, 32,116,111,108,117, 97, 95,116, 97, 98,108,101, - 118, 97,114, 40,116,111,108,117, 97, 95, 83, 44, 34, 39, 46, - 46,112, 97,114,101,110,116, 46, 46, 39, 34, 44, 34, 39, 46, - 46,115,101,108,102, 46,108,110, 97,109,101, 46, 46, 39, 34, - 44, 39, 46, 46,115,101,108,102, 46, 99,103,101,116,110, 97, - 109,101, 46, 46, 39, 44, 78, 85, 76, 76, 41, 59, 39, 41, 10, - 101,110,100, 10,101,108,115,101, 10,105,102, 32,115,101,108, - 102, 46, 99,115,101,116,110, 97,109,101, 32,116,104,101,110, - 10,111,117,116,112,117,116, 40, 39, 32,116,111,108,117, 97, - 95,103,108,111, 98, 97,108,118, 97,114, 40,116,111,108,117, - 97, 95, 83, 44, 34, 39, 46, 46,115,101,108,102, 46,108,110, - 97,109,101, 46, 46, 39, 34, 44, 39, 46, 46,115,101,108,102, - 46, 99,103,101,116,110, 97,109,101, 46, 46, 39, 44, 39, 46, - 46,115,101,108,102, 46, 99,115,101,116,110, 97,109,101, 46, - 46, 39, 41, 59, 39, 41, 10,101,108,115,101, 10,111,117,116, - 112,117,116, 40, 39, 32,116,111,108,117, 97, 95,103,108,111, - 98, 97,108,118, 97,114, 40,116,111,108,117, 97, 95, 83, 44, - 34, 39, 46, 46,115,101,108,102, 46,108,110, 97,109,101, 46, - 46, 39, 34, 44, 39, 46, 46,115,101,108,102, 46, 99,103,101, - 116,110, 97,109,101, 46, 46, 39, 44, 78, 85, 76, 76, 41, 59, - 39, 41, 10,101,110,100, 10,101,110,100, 10,101,110,100, 10, - 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, - 86, 97,114,105, 97, 98,108,101, 58,117,110,114,101,103,105, - 115,116,101,114, 32, 40, 41, 10,105,102, 32,115,101,108,102, - 58,105,110, 99,108, 97,115,115, 40, 41, 61, 61,110,105,108, - 32, 97,110,100, 32,115,101,108,102, 58,105,110,109,111,100, - 117,108,101, 40, 41, 61, 61,110,105,108, 32,116,104,101,110, - 10,111,117,116,112,117,116, 40, 39, 32,108,117, 97, 95,103, - 101,116,103,108,111, 98, 97,108,115, 40,116,111,108,117, 97, - 95, 83, 41, 59, 39, 41, 10,111,117,116,112,117,116, 40, 39, - 32,108,117, 97, 95,112,117,115,104,115,116,114,105,110,103, - 40,116,111,108,117, 97, 95, 83, 44, 34, 39, 44,115,101,108, - 102, 46,108,110, 97,109,101, 44, 39, 34, 41, 59, 32,108,117, - 97, 95,112,117,115,104,110,105,108, 40,116,111,108,117, 97, - 95, 83, 41, 59, 32,108,117, 97, 95,114, 97,119,115,101,116, - 40,116,111,108,117, 97, 95, 83, 44, 45, 51, 41, 59, 39, 41, - 10,111,117,116,112,117,116, 40, 39, 32,108,117, 97, 95,112, - 111,112, 40,116,111,108,117, 97, 95, 83, 44, 49, 41, 59, 39, - 41, 10,101,110,100, 10,101,110,100, 10, 10, 10, 10,102,117, - 110, 99,116,105,111,110, 32, 95, 86, 97,114,105, 97, 98,108, - 101, 32, 40,116, 41, 10,116, 46, 95, 98, 97,115,101, 32, 61, - 32, 99,108, 97,115,115, 86, 97,114,105, 97, 98,108,101, 10, - 115,101,116,116, 97,103, 40,116, 44,116,111,108,117, 97, 95, - 116, 97,103, 41, 10, 97,112,112,101,110,100, 40,116, 41, 10, - 114,101,116,117,114,110, 32,116, 10,101,110,100, 10, 10, 10, - 10,102,117,110, 99,116,105,111,110, 32, 86, 97,114,105, 97, - 98,108,101, 32, 40,115, 41, 10,114,101,116,117,114,110, 32, - 95, 86, 97,114,105, 97, 98,108,101, 32, 40, 68,101, 99,108, - 97,114, 97,116,105,111,110, 40,115, 44, 39,118, 97,114, 39, - 41, 41, 10,101,110,100, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 99,108, 97,115,115, 65, - 114,114, 97,121, 32, 61, 32,123, 10, 95, 98, 97,115,101, 32, - 61, 32, 99,108, 97,115,115, 68,101, 99,108, 97,114, 97,116, - 105,111,110, 44, 10,125, 10, 10,115,101,116,116, 97,103, 40, - 99,108, 97,115,115, 65,114,114, 97,121, 44,116,111,108,117, - 97, 95,116, 97,103, 41, 10, 10, 10,102,117,110, 99,116,105, - 111,110, 32, 99,108, 97,115,115, 65,114,114, 97,121, 58,112, - 114,105,110,116, 32, 40,105,100,101,110,116, 44, 99,108,111, - 115,101, 41, 10,112,114,105,110,116, 40,105,100,101,110,116, - 46, 46, 34, 65,114,114, 97,121,123, 34, 41, 10,112,114,105, - 110,116, 40,105,100,101,110,116, 46, 46, 34, 32,109,111,100, - 32, 61, 32, 39, 34, 46, 46,115,101,108,102, 46,109,111,100, - 46, 46, 34, 39, 44, 34, 41, 10,112,114,105,110,116, 40,105, - 100,101,110,116, 46, 46, 34, 32,116,121,112,101, 32, 61, 32, - 39, 34, 46, 46,115,101,108,102, 46,116,121,112,101, 46, 46, - 34, 39, 44, 34, 41, 10,112,114,105,110,116, 40,105,100,101, - 110,116, 46, 46, 34, 32,112,116,114, 32, 61, 32, 39, 34, 46, - 46,115,101,108,102, 46,112,116,114, 46, 46, 34, 39, 44, 34, - 41, 10,112,114,105,110,116, 40,105,100,101,110,116, 46, 46, - 34, 32,110, 97,109,101, 32, 61, 32, 39, 34, 46, 46,115,101, - 108,102, 46,110, 97,109,101, 46, 46, 34, 39, 44, 34, 41, 10, - 112,114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 32, - 100,101,102, 32, 61, 32, 39, 34, 46, 46,115,101,108,102, 46, - 100,101,102, 46, 46, 34, 39, 44, 34, 41, 10,112,114,105,110, - 116, 40,105,100,101,110,116, 46, 46, 34, 32,100,105,109, 32, - 61, 32, 39, 34, 46, 46,115,101,108,102, 46,100,105,109, 46, - 46, 34, 39, 44, 34, 41, 10,112,114,105,110,116, 40,105,100, - 101,110,116, 46, 46, 34, 32,114,101,116, 32, 61, 32, 39, 34, - 46, 46,115,101,108,102, 46,114,101,116, 46, 46, 34, 39, 44, - 34, 41, 10,112,114,105,110,116, 40,105,100,101,110,116, 46, - 46, 34,125, 34, 46, 46, 99,108,111,115,101, 41, 10,101,110, - 100, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, - 97,115,115, 65,114,114, 97,121, 58,103,101,116,118, 97,108, - 117,101, 32, 40, 99,108, 97,115,115, 44,115,116, 97,116,105, - 99, 41, 10,105,102, 32, 99,108, 97,115,115, 32, 97,110,100, - 32,115,116, 97,116,105, 99, 32,116,104,101,110, 10,114,101, - 116,117,114,110, 32, 99,108, 97,115,115, 46, 46, 39, 58, 58, - 39, 46, 46,115,101,108,102, 46,110, 97,109,101, 46, 46, 39, - 91,116,111,108,117, 97, 73, 95,105,110,100,101,120, 93, 39, - 10,101,108,115,101,105,102, 32, 99,108, 97,115,115, 32,116, - 104,101,110, 10,114,101,116,117,114,110, 32, 39,115,101,108, - 102, 45, 62, 39, 46, 46,115,101,108,102, 46,110, 97,109,101, - 46, 46, 39, 91,116,111,108,117, 97, 73, 95,105,110,100,101, - 120, 93, 39, 10,101,108,115,101, 10,114,101,116,117,114,110, - 32,115,101,108,102, 46,110, 97,109,101, 46, 46, 39, 91,116, - 111,108,117, 97, 73, 95,105,110,100,101,120, 93, 39, 10,101, - 110,100, 10,101,110,100, 10, 10, 10,102,117,110, 99,116,105, - 111,110, 32, 99,108, 97,115,115, 65,114,114, 97,121, 58,115, - 117,112, 99,111,100,101, 32, 40, 41, 10,108,111, 99, 97,108, - 32, 99,108, 97,115,115, 32, 61, 32,115,101,108,102, 58,105, - 110, 99,108, 97,115,115, 40, 41, 10, 10, 10,105,102, 32, 99, - 108, 97,115,115, 32,116,104,101,110, 10,111,117,116,112,117, - 116, 40, 34, 47, 42, 32,103,101,116, 32,102,117,110, 99,116, - 105,111,110, 58, 34, 44,115,101,108,102, 46,110, 97,109,101, - 44, 34, 32,111,102, 32, 99,108, 97,115,115, 32, 34, 44, 99, - 108, 97,115,115, 44, 34, 32, 42, 47, 34, 41, 10,101,108,115, - 101, 10,111,117,116,112,117,116, 40, 34, 47, 42, 32,103,101, - 116, 32,102,117,110, 99,116,105,111,110, 58, 34, 44,115,101, - 108,102, 46,110, 97,109,101, 44, 34, 32, 42, 47, 34, 41, 10, - 101,110,100, 10,115,101,108,102, 46, 99,103,101,116,110, 97, - 109,101, 32, 61, 32,115,101,108,102, 58, 99,102,117,110, 99, - 110, 97,109,101, 40, 34,116,111,108,117, 97, 73, 95,103,101, - 116, 34, 41, 10,111,117,116,112,117,116, 40, 34,115,116, 97, - 116,105, 99, 32,105,110,116, 34, 44,115,101,108,102, 46, 99, - 103,101,116,110, 97,109,101, 44, 34, 40,108,117, 97, 95, 83, - 116, 97,116,101, 42, 32,116,111,108,117, 97, 95, 83, 41, 34, - 41, 10,111,117,116,112,117,116, 40, 34,123, 34, 41, 10, 10, - 10,111,117,116,112,117,116, 40, 39, 32,105,110,116, 32,116, - 111,108,117, 97, 73, 95,105,110,100,101,120, 59, 39, 41, 10, - 10, 10,108,111, 99, 97,108, 32, 95, 44, 95, 44,115,116, 97, - 116,105, 99, 32, 61, 32,115,116,114,102,105,110,100, 40,115, - 101,108,102, 46,109,111,100, 44, 39, 94, 37,115, 42, 40,115, - 116, 97,116,105, 99, 41, 39, 41, 10,105,102, 32, 99,108, 97, - 115,115, 32, 97,110,100, 32,115,116, 97,116,105, 99, 61, 61, - 110,105,108, 32,116,104,101,110, 10,111,117,116,112,117,116, - 40, 39, 32, 39, 44, 99,108, 97,115,115, 44, 39, 42, 39, 44, - 39,115,101,108,102, 59, 39, 41, 10,111,117,116,112,117,116, - 40, 39, 32,108,117, 97, 95,112,117,115,104,115,116,114,105, - 110,103, 40,116,111,108,117, 97, 95, 83, 44, 34, 46,115,101, - 108,102, 34, 41, 59, 39, 41, 10,111,117,116,112,117,116, 40, - 39, 32,108,117, 97, 95,114, 97,119,103,101,116, 40,116,111, - 108,117, 97, 95, 83, 44, 49, 41, 59, 39, 41, 10,111,117,116, - 112,117,116, 40, 39, 32,115,101,108,102, 32, 61, 32, 39, 41, - 10,111,117,116,112,117,116, 40, 39, 40, 39, 44, 99,108, 97, - 115,115, 44, 39, 42, 41, 32, 39, 41, 10,111,117,116,112,117, - 116, 40, 39,108,117, 97, 95,116,111,117,115,101,114,100, 97, - 116, 97, 40,116,111,108,117, 97, 95, 83, 44, 45, 49, 41, 59, - 39, 41, 10,101,108,115,101,105,102, 32,115,116, 97,116,105, - 99, 32,116,104,101,110, 10, 95, 44, 95, 44,115,101,108,102, - 46,109,111,100, 32, 61, 32,115,116,114,102,105,110,100, 40, - 115,101,108,102, 46,109,111,100, 44, 39, 94, 37,115, 42,115, - 116, 97,116,105, 99, 37,115, 37,115, 42, 40, 46, 42, 41, 39, - 41, 10,101,110,100, 10, 10, 10,111,117,116,112,117,116, 40, - 39, 32,105,102, 32, 40, 33,116,111,108,117, 97, 95,105,115, - 116,121,112,101, 40,116,111,108,117, 97, 95, 83, 44, 50, 44, - 76, 85, 65, 95, 84, 78, 85, 77, 66, 69, 82, 44, 48, 41, 41, - 39, 41, 10,111,117,116,112,117,116, 40, 39, 32,116,111,108, - 117, 97, 95,101,114,114,111,114, 40,116,111,108,117, 97, 95, - 83, 44, 34,105,110,118, 97,108,105,100, 32,116,121,112,101, - 32,105,110, 32, 97,114,114, 97,121, 32,105,110,100,101,120, - 105,110,103, 46, 34, 41, 59, 39, 41, 10,111,117,116,112,117, - 116, 40, 39, 32,116,111,108,117, 97, 73, 95,105,110,100,101, - 120, 32, 61, 32, 40,105,110,116, 41,116,111,108,117, 97, 95, - 103,101,116,110,117,109, 98,101,114, 40,116,111,108,117, 97, - 95, 83, 44, 50, 44, 48, 41, 45, 49, 59, 39, 41, 10,111,117, - 116,112,117,116, 40, 39, 32,105,102, 32, 40,116,111,108,117, - 97, 73, 95,105,110,100,101,120, 60, 48, 32,124,124, 32,116, - 111,108,117, 97, 73, 95,105,110,100,101,120, 62, 61, 39, 46, - 46,115,101,108,102, 46,100,105,109, 46, 46, 39, 41, 39, 41, - 10,111,117,116,112,117,116, 40, 39, 32,116,111,108,117, 97, - 95,101,114,114,111,114, 40,116,111,108,117, 97, 95, 83, 44, - 34, 97,114,114, 97,121, 32,105,110,100,101,120,105,110,103, - 32,111,117,116, 32,111,102, 32,114, 97,110,103,101, 46, 34, - 41, 59, 39, 41, 10, 10, 10,108,111, 99, 97,108, 32,116, 44, - 99,116, 32, 61, 32,105,115, 98, 97,115,105, 99, 40,115,101, - 108,102, 46,116,121,112,101, 41, 10,105,102, 32,116, 32,116, - 104,101,110, 10,111,117,116,112,117,116, 40, 39, 32,116,111, - 108,117, 97, 95,112,117,115,104, 39, 46, 46,116, 46, 46, 39, - 40,116,111,108,117, 97, 95, 83, 44, 40, 39, 44, 99,116, 44, - 39, 41, 39, 46, 46,115,101,108,102, 58,103,101,116,118, 97, - 108,117,101, 40, 99,108, 97,115,115, 44,115,116, 97,116,105, - 99, 41, 46, 46, 39, 41, 59, 39, 41, 10,101,108,115,101, 10, - 105,102, 32,115,101,108,102, 46,112,116,114, 32, 61, 61, 32, - 39, 38, 39, 32,111,114, 32,115,101,108,102, 46,112,116,114, - 32, 61, 61, 32, 39, 39, 32,116,104,101,110, 10,111,117,116, - 112,117,116, 40, 39, 32,116,111,108,117, 97, 95,112,117,115, - 104,117,115,101,114,116,121,112,101, 40,116,111,108,117, 97, - 95, 83, 44, 40,118,111,105,100, 42, 41, 38, 39, 46, 46,115, - 101,108,102, 58,103,101,116,118, 97,108,117,101, 40, 99,108, - 97,115,115, 44,115,116, 97,116,105, 99, 41, 46, 46, 39, 44, - 39, 44,115,101,108,102, 46,116, 97,103, 44, 39, 41, 59, 39, - 41, 10,101,108,115,101, 10,111,117,116,112,117,116, 40, 39, - 32,116,111,108,117, 97, 95,112,117,115,104,117,115,101,114, - 116,121,112,101, 40,116,111,108,117, 97, 95, 83, 44, 40,118, - 111,105,100, 42, 41, 39, 46, 46,115,101,108,102, 58,103,101, - 116,118, 97,108,117,101, 40, 99,108, 97,115,115, 44,115,116, - 97,116,105, 99, 41, 46, 46, 39, 44, 39, 44,115,101,108,102, - 46,116, 97,103, 44, 39, 41, 59, 39, 41, 10,101,110,100, 10, - 101,110,100, 10,111,117,116,112,117,116, 40, 39, 32,114,101, - 116,117,114,110, 32, 49, 59, 39, 41, 10,111,117,116,112,117, - 116, 40, 39,125, 39, 41, 10,111,117,116,112,117,116, 40, 39, - 92,110, 39, 41, 10, 10, 10,105,102, 32,110,111,116, 32,115, - 116,114,102,105,110,100, 40,115,101,108,102, 46,109,111,100, - 44, 39, 99,111,110,115,116, 39, 41, 32,116,104,101,110, 10, - 105,102, 32, 99,108, 97,115,115, 32,116,104,101,110, 10,111, - 117,116,112,117,116, 40, 34, 47, 42, 32,115,101,116, 32,102, - 117,110, 99,116,105,111,110, 58, 34, 44,115,101,108,102, 46, - 110, 97,109,101, 44, 34, 32,111,102, 32, 99,108, 97,115,115, - 32, 34, 44, 99,108, 97,115,115, 44, 34, 32, 42, 47, 34, 41, - 10,101,108,115,101, 10,111,117,116,112,117,116, 40, 34, 47, - 42, 32,115,101,116, 32,102,117,110, 99,116,105,111,110, 58, - 34, 44,115,101,108,102, 46,110, 97,109,101, 44, 34, 32, 42, - 47, 34, 41, 10,101,110,100, 10,115,101,108,102, 46, 99,115, - 101,116,110, 97,109,101, 32, 61, 32,115,101,108,102, 58, 99, - 102,117,110, 99,110, 97,109,101, 40, 34,116,111,108,117, 97, - 73, 95,115,101,116, 34, 41, 10,111,117,116,112,117,116, 40, - 34,115,116, 97,116,105, 99, 32,105,110,116, 34, 44,115,101, - 108,102, 46, 99,115,101,116,110, 97,109,101, 44, 34, 40,108, - 117, 97, 95, 83,116, 97,116,101, 42, 32,116,111,108,117, 97, - 95, 83, 41, 34, 41, 10,111,117,116,112,117,116, 40, 34,123, - 34, 41, 10, 10, 10,111,117,116,112,117,116, 40, 39, 32,105, - 110,116, 32,116,111,108,117, 97, 73, 95,105,110,100,101,120, - 59, 39, 41, 10, 10, 10,108,111, 99, 97,108, 32, 95, 44, 95, - 44,115,116, 97,116,105, 99, 32, 61, 32,115,116,114,102,105, - 110,100, 40,115,101,108,102, 46,109,111,100, 44, 39, 94, 37, - 115, 42, 40,115,116, 97,116,105, 99, 41, 39, 41, 10,105,102, - 32, 99,108, 97,115,115, 32, 97,110,100, 32,115,116, 97,116, - 105, 99, 61, 61,110,105,108, 32,116,104,101,110, 10,111,117, - 116,112,117,116, 40, 39, 32, 39, 44, 99,108, 97,115,115, 44, - 39, 42, 39, 44, 39,115,101,108,102, 59, 39, 41, 10,111,117, - 116,112,117,116, 40, 39, 32,108,117, 97, 95,112,117,115,104, - 115,116,114,105,110,103, 40,116,111,108,117, 97, 95, 83, 44, - 34, 46,115,101,108,102, 34, 41, 59, 39, 41, 10,111,117,116, - 112,117,116, 40, 39, 32,108,117, 97, 95,114, 97,119,103,101, - 116, 40,116,111,108,117, 97, 95, 83, 44, 49, 41, 59, 39, 41, - 10,111,117,116,112,117,116, 40, 39, 32,115,101,108,102, 32, - 61, 32, 39, 41, 10,111,117,116,112,117,116, 40, 39, 40, 39, - 44, 99,108, 97,115,115, 44, 39, 42, 41, 32, 39, 41, 10,111, - 117,116,112,117,116, 40, 39,108,117, 97, 95,116,111,117,115, - 101,114,100, 97,116, 97, 40,116,111,108,117, 97, 95, 83, 44, - 45, 49, 41, 59, 39, 41, 10,101,108,115,101,105,102, 32,115, - 116, 97,116,105, 99, 32,116,104,101,110, 10, 95, 44, 95, 44, - 115,101,108,102, 46,109,111,100, 32, 61, 32,115,116,114,102, - 105,110,100, 40,115,101,108,102, 46,109,111,100, 44, 39, 94, - 37,115, 42,115,116, 97,116,105, 99, 37,115, 37,115, 42, 40, - 46, 42, 41, 39, 41, 10,101,110,100, 10, 10, 10,111,117,116, - 112,117,116, 40, 39, 32,105,102, 32, 40, 33,116,111,108,117, - 97, 95,105,115,116,121,112,101, 40,116,111,108,117, 97, 95, - 83, 44, 50, 44, 76, 85, 65, 95, 84, 78, 85, 77, 66, 69, 82, - 44, 48, 41, 41, 39, 41, 10,111,117,116,112,117,116, 40, 39, - 32,116,111,108,117, 97, 95,101,114,114,111,114, 40,116,111, - 108,117, 97, 95, 83, 44, 34,105,110,118, 97,108,105,100, 32, - 116,121,112,101, 32,105,110, 32, 97,114,114, 97,121, 32,105, - 110,100,101,120,105,110,103, 46, 34, 41, 59, 39, 41, 10,111, - 117,116,112,117,116, 40, 39, 32,116,111,108,117, 97, 73, 95, - 105,110,100,101,120, 32, 61, 32, 40,105,110,116, 41,116,111, - 108,117, 97, 95,103,101,116,110,117,109, 98,101,114, 40,116, - 111,108,117, 97, 95, 83, 44, 50, 44, 48, 41, 45, 49, 59, 39, - 41, 10,111,117,116,112,117,116, 40, 39, 32,105,102, 32, 40, - 116,111,108,117, 97, 73, 95,105,110,100,101,120, 60, 48, 32, - 124,124, 32,116,111,108,117, 97, 73, 95,105,110,100,101,120, - 62, 61, 39, 46, 46,115,101,108,102, 46,100,105,109, 46, 46, - 39, 41, 39, 41, 10,111,117,116,112,117,116, 40, 39, 32,116, - 111,108,117, 97, 95,101,114,114,111,114, 40,116,111,108,117, - 97, 95, 83, 44, 34, 97,114,114, 97,121, 32,105,110,100,101, - 120,105,110,103, 32,111,117,116, 32,111,102, 32,114, 97,110, - 103,101, 46, 34, 41, 59, 39, 41, 10, 10, 10,108,111, 99, 97, - 108, 32,112,116,114, 32, 61, 32, 39, 39, 10,105,102, 32,115, - 101,108,102, 46,112,116,114,126, 61, 39, 39, 32,116,104,101, - 110, 32,112,116,114, 32, 61, 32, 39, 42, 39, 32,101,110,100, - 10,111,117,116,112,117,116, 40, 39, 32, 39, 41, 10,105,102, - 32, 99,108, 97,115,115, 32, 97,110,100, 32,115,116, 97,116, - 105, 99, 32,116,104,101,110, 10,111,117,116,112,117,116, 40, - 99,108, 97,115,115, 46, 46, 39, 58, 58, 39, 46, 46,115,101, - 108,102, 46,110, 97,109,101, 46, 46, 39, 91,116,111,108,117, - 97, 73, 95,105,110,100,101,120, 93, 39, 41, 10,101,108,115, - 101,105,102, 32, 99,108, 97,115,115, 32,116,104,101,110, 10, - 111,117,116,112,117,116, 40, 39,115,101,108,102, 45, 62, 39, - 46, 46,115,101,108,102, 46,110, 97,109,101, 46, 46, 39, 91, - 116,111,108,117, 97, 73, 95,105,110,100,101,120, 93, 39, 41, - 10,101,108,115,101, 10,111,117,116,112,117,116, 40,115,101, - 108,102, 46,110, 97,109,101, 46, 46, 39, 91,116,111,108,117, - 97, 73, 95,105,110,100,101,120, 93, 39, 41, 10,101,110,100, - 10,108,111, 99, 97,108, 32,116, 32, 61, 32,105,115, 98, 97, - 115,105, 99, 40,115,101,108,102, 46,116,121,112,101, 41, 10, - 111,117,116,112,117,116, 40, 39, 32, 61, 32, 39, 41, 10,105, - 102, 32,110,111,116, 32,116, 32, 97,110,100, 32,112,116,114, - 61, 61, 39, 39, 32,116,104,101,110, 32,111,117,116,112,117, - 116, 40, 39, 42, 39, 41, 32,101,110,100, 10,111,117,116,112, - 117,116, 40, 39, 40, 40, 39, 44,115,101,108,102, 46,109,111, - 100, 44,115,101,108,102, 46,116,121,112,101, 41, 10,105,102, - 32,110,111,116, 32,116, 32,116,104,101,110, 10,111,117,116, - 112,117,116, 40, 39, 42, 39, 41, 10,101,110,100, 10,111,117, - 116,112,117,116, 40, 39, 41, 32, 39, 41, 10,108,111, 99, 97, - 108, 32,100,101,102, 32, 61, 32, 48, 10,105,102, 32,115,101, - 108,102, 46,100,101,102, 32,126, 61, 32, 39, 39, 32,116,104, - 101,110, 32,100,101,102, 32, 61, 32,115,101,108,102, 46,100, - 101,102, 32,101,110,100, 10,105,102, 32,116, 32,116,104,101, - 110, 10,111,117,116,112,117,116, 40, 39,116,111,108,117, 97, - 95,103,101,116, 39, 46, 46,116, 44, 39, 40,116,111,108,117, - 97, 95, 83, 44, 51, 44, 39, 44,100,101,102, 44, 39, 41, 41, - 59, 39, 41, 10,101,108,115,101, 10,111,117,116,112,117,116, - 40, 39,116,111,108,117, 97, 95,103,101,116,117,115,101,114, - 116,121,112,101, 40,116,111,108,117, 97, 95, 83, 44, 51, 44, - 39, 44,100,101,102, 44, 39, 41, 41, 59, 39, 41, 10,101,110, - 100, 10,111,117,116,112,117,116, 40, 39, 32,114,101,116,117, - 114,110, 32, 48, 59, 39, 41, 10,111,117,116,112,117,116, 40, - 39,125, 39, 41, 10,111,117,116,112,117,116, 40, 39, 92,110, - 39, 41, 10,101,110,100, 10, 10,101,110,100, 10, 10,102,117, - 110, 99,116,105,111,110, 32, 99,108, 97,115,115, 65,114,114, - 97,121, 58,114,101,103,105,115,116,101,114, 32, 40, 41, 10, - 108,111, 99, 97,108, 32,112, 97,114,101,110,116, 32, 61, 32, - 115,101,108,102, 58,105,110, 99,108, 97,115,115, 40, 41, 32, - 111,114, 32,115,101,108,102, 58,105,110,109,111,100,117,108, - 101, 40, 41, 10,105,102, 32,112, 97,114,101,110,116, 32,116, - 104,101,110, 10,105,102, 32,115,101,108,102, 46, 99,115,101, - 116,110, 97,109,101, 32,116,104,101,110, 10,111,117,116,112, - 117,116, 40, 39, 32,116,111,108,117, 97, 95,116, 97, 98,108, - 101, 97,114,114, 97,121, 40,116,111,108,117, 97, 95, 83, 44, - 34, 39, 46, 46,112, 97,114,101,110,116, 46, 46, 39, 34, 44, - 34, 39, 46, 46,115,101,108,102, 46,108,110, 97,109,101, 46, - 46, 39, 34, 44, 39, 46, 46,115,101,108,102, 46, 99,103,101, - 116,110, 97,109,101, 46, 46, 39, 44, 39, 46, 46,115,101,108, - 102, 46, 99,115,101,116,110, 97,109,101, 46, 46, 39, 41, 59, - 39, 41, 10,101,108,115,101, 10,111,117,116,112,117,116, 40, - 39, 32,116,111,108,117, 97, 95,116, 97, 98,108,101, 97,114, - 114, 97,121, 40,116,111,108,117, 97, 95, 83, 44, 34, 39, 46, - 46,112, 97,114,101,110,116, 46, 46, 39, 34, 44, 34, 39, 46, - 46,115,101,108,102, 46,108,110, 97,109,101, 46, 46, 39, 34, - 44, 39, 46, 46,115,101,108,102, 46, 99,103,101,116,110, 97, - 109,101, 46, 46, 39, 44, 78, 85, 76, 76, 41, 59, 39, 41, 10, - 101,110,100, 10,101,108,115,101, 10,105,102, 32,115,101,108, - 102, 46, 99,115,101,116,110, 97,109,101, 32,116,104,101,110, - 10,111,117,116,112,117,116, 40, 39, 32,116,111,108,117, 97, - 95,103,108,111, 98, 97,108, 97,114,114, 97,121, 40,116,111, - 108,117, 97, 95, 83, 44, 34, 39, 46, 46,115,101,108,102, 46, - 108,110, 97,109,101, 46, 46, 39, 34, 44, 39, 46, 46,115,101, - 108,102, 46, 99,103,101,116,110, 97,109,101, 46, 46, 39, 44, - 39, 46, 46,115,101,108,102, 46, 99,115,101,116,110, 97,109, - 101, 46, 46, 39, 41, 59, 39, 41, 10,101,108,115,101, 10,111, - 117,116,112,117,116, 40, 39, 32,116,111,108,117, 97, 95,103, - 108,111, 98, 97,108, 97,114,114, 97,121, 40,116,111,108,117, - 97, 95, 83, 44, 34, 39, 46, 46,115,101,108,102, 46,108,110, - 97,109,101, 46, 46, 39, 34, 44, 39, 46, 46,115,101,108,102, - 46, 99,103,101,116,110, 97,109,101, 46, 46, 39, 44, 78, 85, - 76, 76, 41, 59, 39, 41, 10,101,110,100, 10,101,110,100, 10, - 101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32, 99, - 108, 97,115,115, 65,114,114, 97,121, 58,117,110,114,101,103, - 105,115,116,101,114, 32, 40, 41, 10,105,102, 32,115,101,108, - 102, 58,105,110, 99,108, 97,115,115, 40, 41, 61, 61,110,105, - 108, 32, 97,110,100, 32,115,101,108,102, 58,105,110,109,111, - 100,117,108,101, 40, 41, 61, 61,110,105,108, 32,116,104,101, - 110, 10,111,117,116,112,117,116, 40, 39, 32,108,117, 97, 95, - 112,117,115,104,110,105,108, 40,116,111,108,117, 97, 95, 83, - 41, 59, 32,108,117, 97, 95,115,101,116,103,108,111, 98, 97, - 108, 40,116,111,108,117, 97, 95, 83, 44, 34, 39, 46, 46,115, - 101,108,102, 46,108,110, 97,109,101, 46, 46, 39, 34, 41, 59, - 39, 41, 10,101,110,100, 10,101,110,100, 10, 10, 10, 10,102, - 117,110, 99,116,105,111,110, 32, 95, 65,114,114, 97,121, 32, - 40,116, 41, 10,116, 46, 95, 98, 97,115,101, 32, 61, 32, 99, - 108, 97,115,115, 65,114,114, 97,121, 10,115,101,116,116, 97, - 103, 40,116, 44,116,111,108,117, 97, 95,116, 97,103, 41, 10, - 97,112,112,101,110,100, 40,116, 41, 10,114,101,116,117,114, - 110, 32,116, 10,101,110,100, 10, 10, 10, 10,102,117,110, 99, - 116,105,111,110, 32, 65,114,114, 97,121, 32, 40,115, 41, 10, - 114,101,116,117,114,110, 32, 95, 65,114,114, 97,121, 32, 40, - 68,101, 99,108, 97,114, 97,116,105,111,110, 40,115, 44, 39, - 118, 97,114, 39, 41, 41, 10,101,110,100, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 99,108, 97,115,115, 70,117,110, 99,116,105,111, - 110, 32, 61, 32,123, 10,109,111,100, 32, 61, 32, 39, 39, 44, - 10,116,121,112,101, 32, 61, 32, 39, 39, 44, 10,112,116,114, - 32, 61, 32, 39, 39, 44, 10,110, 97,109,101, 32, 61, 32, 39, - 39, 44, 10, 97,114,103,115, 32, 61, 32,123,110, 61, 48,125, - 44, 10, 99,111,110,115,116, 32, 61, 32, 39, 39, 44, 10, 95, - 98, 97,115,101, 32, 61, 32, 99,108, 97,115,115, 70,101, 97, - 116,117,114,101, 44, 10,125, 10,115,101,116,116, 97,103, 40, - 99,108, 97,115,115, 70,117,110, 99,116,105,111,110, 44,116, - 111,108,117, 97, 95,116, 97,103, 41, 10, 10, 10,102,117,110, - 99,116,105,111,110, 32, 99,108, 97,115,115, 70,117,110, 99, - 116,105,111,110, 58,100,101, 99,108,116, 97,103, 32, 40, 41, - 10,115,101,108,102, 46,105,116,121,112,101, 44,115,101,108, - 102, 46,116, 97,103, 32, 61, 32,116, 97,103,118, 97,114, 40, - 115,101,108,102, 46,116,121,112,101, 44,115,116,114,102,105, - 110,100, 40,115,101,108,102, 46,109,111,100, 44, 39, 99,111, - 110,115,116, 39, 41, 41, 10,108,111, 99, 97,108, 32,105, 61, - 49, 10,119,104,105,108,101, 32,115,101,108,102, 46, 97,114, - 103,115, 91,105, 93, 32,100,111, 10,115,101,108,102, 46, 97, - 114,103,115, 91,105, 93, 58,100,101, 99,108,116, 97,103, 40, - 41, 10,105, 32, 61, 32,105, 43, 49, 10,101,110,100, 10,101, - 110,100, 10, 10, 10, 10, 10,102,117,110, 99,116,105,111,110, - 32, 99,108, 97,115,115, 70,117,110, 99,116,105,111,110, 58, - 115,117,112, 99,111,100,101, 32, 40, 41, 10,108,111, 99, 97, - 108, 32,110,114,101,116, 32, 61, 32, 48, 10,108,111, 99, 97, - 108, 32, 99,108, 97,115,115, 32, 61, 32,115,101,108,102, 58, - 105,110, 99,108, 97,115,115, 40, 41, 10,108,111, 99, 97,108, - 32, 95, 44, 95, 44,115,116, 97,116,105, 99, 32, 61, 32,115, - 116,114,102,105,110,100, 40,115,101,108,102, 46,109,111,100, - 44, 39, 94, 37,115, 42, 40,115,116, 97,116,105, 99, 41, 39, - 41, 10, 10,105,102, 32, 99,108, 97,115,115, 32,116,104,101, - 110, 10,111,117,116,112,117,116, 40, 34, 47, 42, 32,109,101, - 116,104,111,100, 58, 34, 44,115,101,108,102, 46,110, 97,109, - 101, 44, 34, 32,111,102, 32, 99,108, 97,115,115, 32, 34, 44, - 99,108, 97,115,115, 44, 34, 32, 42, 47, 34, 41, 10,101,108, - 115,101, 10,111,117,116,112,117,116, 40, 34, 47, 42, 32,102, - 117,110, 99,116,105,111,110, 58, 34, 44,115,101,108,102, 46, - 110, 97,109,101, 44, 34, 32, 42, 47, 34, 41, 10,101,110,100, - 10,111,117,116,112,117,116, 40, 34,115,116, 97,116,105, 99, - 32,105,110,116, 34, 44,115,101,108,102, 46, 99,110, 97,109, - 101, 44, 34, 40,108,117, 97, 95, 83,116, 97,116,101, 42, 32, - 116,111,108,117, 97, 95, 83, 41, 34, 41, 10,111,117,116,112, - 117,116, 40, 34,123, 34, 41, 10, 10, 10,111,117,116,112,117, - 116, 40, 39, 32,105,102, 32, 40, 92,110, 39, 41, 10, 10,108, - 111, 99, 97,108, 32,110, 97,114,103, 10,105,102, 32, 99,108, - 97,115,115, 32,116,104,101,110, 32,110, 97,114,103, 61, 50, - 32,101,108,115,101, 32,110, 97,114,103, 61, 49, 32,101,110, - 100, 10,105,102, 32, 99,108, 97,115,115, 32, 97,110,100, 32, - 115,101,108,102, 46,110, 97,109,101,126, 61, 39,110,101,119, - 39, 32, 97,110,100, 32,115,116, 97,116,105, 99, 61, 61,110, - 105,108, 32,116,104,101,110, 10,105,102, 32,115,101,108,102, - 46, 99,111,110,115,116, 32, 61, 61, 32, 39, 99,111,110,115, - 116, 39, 32,116,104,101,110, 10,111,117,116,112,117,116, 40, - 39, 32, 33,116,111,108,117, 97, 95,105,115,116,121,112,101, - 40,116,111,108,117, 97, 95, 83, 44, 49, 44, 39, 44,115,101, - 108,102, 46,112, 97,114,101,110,116, 46, 99,116, 97,103, 44, - 39, 44, 48, 41, 32,124,124, 92,110, 39, 41, 10,101,108,115, - 101, 10,111,117,116,112,117,116, 40, 39, 32, 33,116,111,108, - 117, 97, 95,105,115,116,121,112,101, 40,116,111,108,117, 97, - 95, 83, 44, 49, 44, 39, 44,115,101,108,102, 46,112, 97,114, - 101,110,116, 46,116, 97,103, 44, 39, 44, 48, 41, 32,124,124, - 92,110, 39, 41, 10,101,110,100, 10,101,110,100, 10, 10,105, - 102, 32,115,101,108,102, 46, 97,114,103,115, 91, 49, 93, 46, - 116,121,112,101, 32,126, 61, 32, 39,118,111,105,100, 39, 32, - 116,104,101,110, 10,108,111, 99, 97,108, 32,105, 61, 49, 10, - 119,104,105,108,101, 32,115,101,108,102, 46, 97,114,103,115, - 91,105, 93, 32,100,111, 10,105,102, 32,105,115, 98, 97,115, - 105, 99, 40,115,101,108,102, 46, 97,114,103,115, 91,105, 93, - 46,116,121,112,101, 41, 32,126, 61, 32, 39,118, 97,108,117, - 101, 39, 32,116,104,101,110, 10,111,117,116,112,117,116, 40, - 39, 32, 33, 39, 46, 46,115,101,108,102, 46, 97,114,103,115, - 91,105, 93, 58,111,117,116, 99,104,101, 99,107,116,121,112, - 101, 40,110, 97,114,103, 41, 46, 46, 39, 32,124,124, 92,110, - 39, 41, 10,101,110,100, 10,110, 97,114,103, 32, 61, 32,110, - 97,114,103, 43, 49, 10,105, 32, 61, 32,105, 43, 49, 10,101, - 110,100, 10,101,110,100, 10, 10,111,117,116,112,117,116, 40, - 39, 32, 33,116,111,108,117, 97, 95,105,115,110,111,111, 98, - 106, 40,116,111,108,117, 97, 95, 83, 44, 39, 46, 46,110, 97, - 114,103, 46, 46, 39, 41, 92,110, 32, 41, 92,110, 32,103,111, - 116,111, 32,116,111,108,117, 97, 95,108,101,114,114,111,114, - 59, 39, 41, 10, 10,111,117,116,112,117,116, 40, 39, 32,101, - 108,115,101, 92,110, 32,123, 39, 41, 10, 10, 10,108,111, 99, - 97,108, 32,110, 97,114,103, 10,105,102, 32, 99,108, 97,115, - 115, 32,116,104,101,110, 32,110, 97,114,103, 61, 50, 32,101, - 108,115,101, 32,110, 97,114,103, 61, 49, 32,101,110,100, 10, - 105,102, 32, 99,108, 97,115,115, 32, 97,110,100, 32,115,101, - 108,102, 46,110, 97,109,101,126, 61, 39,110,101,119, 39, 32, - 97,110,100, 32,115,116, 97,116,105, 99, 61, 61,110,105,108, - 32,116,104,101,110, 10,111,117,116,112,117,116, 40, 39, 32, - 39, 44,115,101,108,102, 46, 99,111,110,115,116, 44, 99,108, - 97,115,115, 44, 39, 42, 39, 44, 39,115,101,108,102, 32, 61, - 32, 39, 41, 10,111,117,116,112,117,116, 40, 39, 40, 39, 44, - 115,101,108,102, 46, 99,111,110,115,116, 44, 99,108, 97,115, - 115, 44, 39, 42, 41, 32, 39, 41, 10,111,117,116,112,117,116, - 40, 39,116,111,108,117, 97, 95,103,101,116,117,115,101,114, - 116,121,112,101, 40,116,111,108,117, 97, 95, 83, 44, 49, 44, - 48, 41, 59, 39, 41, 10,101,108,115,101,105,102, 32,115,116, - 97,116,105, 99, 32,116,104,101,110, 10, 95, 44, 95, 44,115, - 101,108,102, 46,109,111,100, 32, 61, 32,115,116,114,102,105, - 110,100, 40,115,101,108,102, 46,109,111,100, 44, 39, 94, 37, - 115, 42,115,116, 97,116,105, 99, 37,115, 37,115, 42, 40, 46, - 42, 41, 39, 41, 10,101,110,100, 10, 10,105,102, 32,115,101, - 108,102, 46, 97,114,103,115, 91, 49, 93, 46,116,121,112,101, - 32,126, 61, 32, 39,118,111,105,100, 39, 32,116,104,101,110, - 10,108,111, 99, 97,108, 32,105, 61, 49, 10,119,104,105,108, - 101, 32,115,101,108,102, 46, 97,114,103,115, 91,105, 93, 32, - 100,111, 10,115,101,108,102, 46, 97,114,103,115, 91,105, 93, - 58,100,101, 99,108, 97,114,101, 40,110, 97,114,103, 41, 10, - 110, 97,114,103, 32, 61, 32,110, 97,114,103, 43, 49, 10,105, - 32, 61, 32,105, 43, 49, 10,101,110,100, 10,101,110,100, 10, - 10, 10,105,102, 32, 99,108, 97,115,115, 32, 97,110,100, 32, - 115,101,108,102, 46,110, 97,109,101,126, 61, 39,110,101,119, - 39, 32, 97,110,100, 32,115,116, 97,116,105, 99, 61, 61,110, - 105,108, 32,116,104,101,110, 10,111,117,116,112,117,116, 40, - 39, 32,105,102, 32, 40, 33,115,101,108,102, 41, 32,116,111, - 108,117, 97, 95,101,114,114,111,114, 40,116,111,108,117, 97, - 95, 83, 44, 34,105,110,118, 97,108,105,100, 32, 92, 39,115, - 101,108,102, 92, 39, 32,105,110, 32,102,117,110, 99,116,105, - 111,110, 32, 92, 39, 39, 46, 46,115,101,108,102, 46,110, 97, - 109,101, 46, 46, 39, 92, 39, 34, 41, 59, 39, 41, 59, 10,101, - 110,100, 10, 10, 10,105,102, 32, 99,108, 97,115,115, 32,116, - 104,101,110, 32,110, 97,114,103, 61, 50, 32,101,108,115,101, - 32,110, 97,114,103, 61, 49, 32,101,110,100, 10,105,102, 32, - 115,101,108,102, 46, 97,114,103,115, 91, 49, 93, 46,116,121, - 112,101, 32,126, 61, 32, 39,118,111,105,100, 39, 32,116,104, - 101,110, 10,108,111, 99, 97,108, 32,105, 61, 49, 10,119,104, - 105,108,101, 32,115,101,108,102, 46, 97,114,103,115, 91,105, - 93, 32,100,111, 10,115,101,108,102, 46, 97,114,103,115, 91, - 105, 93, 58,103,101,116, 97,114,114, 97,121, 40,110, 97,114, - 103, 41, 10,110, 97,114,103, 32, 61, 32,110, 97,114,103, 43, - 49, 10,105, 32, 61, 32,105, 43, 49, 10,101,110,100, 10,101, - 110,100, 10, 10, 10,105,102, 32, 99,108, 97,115,115, 32, 97, - 110,100, 32,115,101,108,102, 46,110, 97,109,101, 61, 61, 39, - 100,101,108,101,116,101, 39, 32,116,104,101,110, 10,111,117, - 116,112,117,116, 40, 39, 32,100,101,108,101,116,101, 32,115, - 101,108,102, 59, 39, 41, 10,101,108,115,101,105,102, 32, 99, - 108, 97,115,115, 32, 97,110,100, 32,115,101,108,102, 46,110, - 97,109,101, 32, 61, 61, 32, 39,111,112,101,114, 97,116,111, - 114, 38, 91, 93, 39, 32,116,104,101,110, 10,111,117,116,112, - 117,116, 40, 39, 32,115,101,108,102, 45, 62,111,112,101,114, - 97,116,111,114, 91, 93, 40, 39, 44,115,101,108,102, 46, 97, - 114,103,115, 91, 49, 93, 46,110, 97,109,101, 44, 39, 41, 32, - 61, 32, 39, 44,115,101,108,102, 46, 97,114,103,115, 91, 50, - 93, 46,110, 97,109,101, 44, 39, 59, 39, 41, 10,101,108,115, - 101, 10,111,117,116,112,117,116, 40, 39, 32,123, 39, 41, 10, - 105,102, 32,115,101,108,102, 46,116,121,112,101, 32,126, 61, - 32, 39, 39, 32, 97,110,100, 32,115,101,108,102, 46,116,121, - 112,101, 32,126, 61, 32, 39,118,111,105,100, 39, 32,116,104, - 101,110, 10,111,117,116,112,117,116, 40, 39, 32, 39, 44,115, - 101,108,102, 46,109,111,100, 44,115,101,108,102, 46,116,121, - 112,101, 44,115,101,108,102, 46,112,116,114, 44, 39,116,111, - 108,117, 97, 73, 95,114,101,116, 32, 61, 32, 39, 41, 10,111, - 117,116,112,117,116, 40, 39, 40, 39, 44,115,101,108,102, 46, - 109,111,100, 44,115,101,108,102, 46,116,121,112,101, 44,115, - 101,108,102, 46,112,116,114, 44, 39, 41, 32, 39, 41, 10,101, - 108,115,101, 10,111,117,116,112,117,116, 40, 39, 32, 39, 41, - 10,101,110,100, 10,105,102, 32, 99,108, 97,115,115, 32, 97, - 110,100, 32,115,101,108,102, 46,110, 97,109,101, 61, 61, 39, - 110,101,119, 39, 32,116,104,101,110, 10,111,117,116,112,117, - 116, 40, 39,110,101,119, 39, 44, 99,108, 97,115,115, 44, 39, - 40, 39, 41, 10,101,108,115,101,105,102, 32, 99,108, 97,115, - 115, 32, 97,110,100, 32,115,116, 97,116,105, 99, 32,116,104, - 101,110, 10,111,117,116,112,117,116, 40, 99,108, 97,115,115, - 46, 46, 39, 58, 58, 39, 46, 46,115,101,108,102, 46,110, 97, - 109,101, 44, 39, 40, 39, 41, 10,101,108,115,101,105,102, 32, - 99,108, 97,115,115, 32,116,104,101,110, 10,111,117,116,112, - 117,116, 40, 39,115,101,108,102, 45, 62, 39, 46, 46,115,101, - 108,102, 46,110, 97,109,101, 44, 39, 40, 39, 41, 10,101,108, - 115,101, 10,111,117,116,112,117,116, 40,115,101,108,102, 46, - 110, 97,109,101, 44, 39, 40, 39, 41, 10,101,110,100, 10, 10, - 10,108,111, 99, 97,108, 32,105, 61, 49, 10,119,104,105,108, - 101, 32,115,101,108,102, 46, 97,114,103,115, 91,105, 93, 32, - 100,111, 10,115,101,108,102, 46, 97,114,103,115, 91,105, 93, - 58,112, 97,115,115,112, 97,114, 40, 41, 10,105, 32, 61, 32, - 105, 43, 49, 10,105,102, 32,115,101,108,102, 46, 97,114,103, - 115, 91,105, 93, 32,116,104,101,110, 10,111,117,116,112,117, - 116, 40, 39, 44, 39, 41, 10,101,110,100, 10,101,110,100, 10, - 10,111,117,116,112,117,116, 40, 39, 41, 59, 39, 41, 10, 10, - 10,105,102, 32,115,101,108,102, 46,116,121,112,101, 32,126, - 61, 32, 39, 39, 32, 97,110,100, 32,115,101,108,102, 46,116, - 121,112,101, 32,126, 61, 32, 39,118,111,105,100, 39, 32,116, - 104,101,110, 10,110,114,101,116, 32, 61, 32,110,114,101,116, - 32, 43, 32, 49, 10,108,111, 99, 97,108, 32,116, 44, 99,116, - 32, 61, 32,105,115, 98, 97,115,105, 99, 40,115,101,108,102, - 46,116,121,112,101, 41, 10,105,102, 32,116, 32,116,104,101, - 110, 10,111,117,116,112,117,116, 40, 39, 32,116,111,108,117, - 97, 95,112,117,115,104, 39, 46, 46,116, 46, 46, 39, 40,116, - 111,108,117, 97, 95, 83, 44, 40, 39, 44, 99,116, 44, 39, 41, - 116,111,108,117, 97, 73, 95,114,101,116, 41, 59, 39, 41, 10, - 101,108,115,101, 10,105,102, 32,115,101,108,102, 46,112,116, - 114, 32, 61, 61, 32, 39, 39, 32,116,104,101,110, 10,111,117, - 116,112,117,116, 40, 39, 32,123, 39, 41, 10,111,117,116,112, - 117,116, 40, 39, 35,105,102,100,101,102, 32, 95, 95, 99,112, - 108,117,115,112,108,117,115, 92,110, 39, 41, 10,111,117,116, - 112,117,116, 40, 39, 32,118,111,105,100, 42, 32,116,111,108, - 117, 97, 73, 95, 99,108,111,110,101, 32, 61, 32,110,101,119, - 39, 44,115,101,108,102, 46,116,121,112,101, 44, 39, 40,116, - 111,108,117, 97, 73, 95,114,101,116, 41, 59, 39, 41, 10,111, - 117,116,112,117,116, 40, 39, 35,101,108,115,101, 92,110, 39, - 41, 10,111,117,116,112,117,116, 40, 39, 32,118,111,105,100, - 42, 32,116,111,108,117, 97, 73, 95, 99,108,111,110,101, 32, - 61, 32,116,111,108,117, 97, 95, 99,111,112,121, 40,116,111, - 108,117, 97, 95, 83, 44, 40,118,111,105,100, 42, 41, 38,116, - 111,108,117, 97, 73, 95,114,101,116, 44,115,105,122,101,111, - 102, 40, 39, 44,115,101,108,102, 46,116,121,112,101, 44, 39, - 41, 41, 59, 39, 41, 10,111,117,116,112,117,116, 40, 39, 35, - 101,110,100,105,102, 92,110, 39, 41, 10,111,117,116,112,117, - 116, 40, 39, 32,116,111,108,117, 97, 95,112,117,115,104,117, - 115,101,114,116,121,112,101, 40,116,111,108,117, 97, 95, 83, - 44,116,111,108,117, 97, 95,100,111, 99,108,111,110,101, 40, - 116,111,108,117, 97, 95, 83, 44,116,111,108,117, 97, 73, 95, - 99,108,111,110,101, 44, 39, 44,115,101,108,102, 46,116, 97, - 103, 44, 39, 41, 44, 39, 44,115,101,108,102, 46,116, 97,103, - 44, 39, 41, 59, 39, 41, 10,111,117,116,112,117,116, 40, 39, - 32,125, 39, 41, 10, 10,101,108,115,101,105,102, 32,115,101, - 108,102, 46,112,116,114, 32, 61, 61, 32, 39, 38, 39, 32,116, - 104,101,110, 10,111,117,116,112,117,116, 40, 39, 32,116,111, - 108,117, 97, 95,112,117,115,104,117,115,101,114,116,121,112, - 101, 40,116,111,108,117, 97, 95, 83, 44, 40,118,111,105,100, - 42, 41, 38,116,111,108,117, 97, 73, 95,114,101,116, 44, 39, - 44,115,101,108,102, 46,116, 97,103, 44, 39, 41, 59, 39, 41, - 10,101,108,115,101, 10,111,117,116,112,117,116, 40, 39, 32, - 116,111,108,117, 97, 95,112,117,115,104,117,115,101,114,116, - 121,112,101, 40,116,111,108,117, 97, 95, 83, 44, 40,118,111, - 105,100, 42, 41,116,111,108,117, 97, 73, 95,114,101,116, 44, - 39, 44,115,101,108,102, 46,116, 97,103, 44, 39, 41, 59, 39, - 41, 10,101,110,100, 10,101,110,100, 10,101,110,100, 10,108, - 111, 99, 97,108, 32,105, 61, 49, 10,119,104,105,108,101, 32, - 115,101,108,102, 46, 97,114,103,115, 91,105, 93, 32,100,111, - 10,110,114,101,116, 32, 61, 32,110,114,101,116, 32, 43, 32, - 115,101,108,102, 46, 97,114,103,115, 91,105, 93, 58,114,101, - 116,118, 97,108,117,101, 40, 41, 10,105, 32, 61, 32,105, 43, - 49, 10,101,110,100, 10,111,117,116,112,117,116, 40, 39, 32, - 125, 39, 41, 10, 10, 10,105,102, 32, 99,108, 97,115,115, 32, - 116,104,101,110, 32,110, 97,114,103, 61, 50, 32,101,108,115, - 101, 32,110, 97,114,103, 61, 49, 32,101,110,100, 10,105,102, - 32,115,101,108,102, 46, 97,114,103,115, 91, 49, 93, 46,116, - 121,112,101, 32,126, 61, 32, 39,118,111,105,100, 39, 32,116, - 104,101,110, 10,108,111, 99, 97,108, 32,105, 61, 49, 10,119, - 104,105,108,101, 32,115,101,108,102, 46, 97,114,103,115, 91, - 105, 93, 32,100,111, 10,115,101,108,102, 46, 97,114,103,115, - 91,105, 93, 58,115,101,116, 97,114,114, 97,121, 40,110, 97, - 114,103, 41, 10,110, 97,114,103, 32, 61, 32,110, 97,114,103, - 43, 49, 10,105, 32, 61, 32,105, 43, 49, 10,101,110,100, 10, - 101,110,100, 10, 10, 10,105,102, 32,115,101,108,102, 46, 97, - 114,103,115, 91, 49, 93, 46,116,121,112,101, 32,126, 61, 32, - 39,118,111,105,100, 39, 32,116,104,101,110, 10,108,111, 99, - 97,108, 32,105, 61, 49, 10,119,104,105,108,101, 32,115,101, - 108,102, 46, 97,114,103,115, 91,105, 93, 32,100,111, 10,115, - 101,108,102, 46, 97,114,103,115, 91,105, 93, 58,102,114,101, - 101, 97,114,114, 97,121, 40, 41, 10,105, 32, 61, 32,105, 43, - 49, 10,101,110,100, 10,101,110,100, 10,101,110,100, 10, 10, - 111,117,116,112,117,116, 40, 39, 32,125, 39, 41, 10,111,117, - 116,112,117,116, 40, 39, 32,114,101,116,117,114,110, 32, 39, - 46, 46,110,114,101,116, 46, 46, 39, 59, 39, 41, 10, 10, 10, - 111,117,116,112,117,116, 40, 39,116,111,108,117, 97, 95,108, - 101,114,114,111,114, 58, 92,110, 39, 41, 10,108,111, 99, 97, - 108, 32,111,118,101,114,108,111, 97,100, 32, 61, 32,115,116, - 114,115,117, 98, 40,115,101,108,102, 46, 99,110, 97,109,101, - 44, 45, 50, 44, 45, 49, 41, 32, 45, 32, 49, 10,105,102, 32, - 111,118,101,114,108,111, 97,100, 32, 62, 61, 32, 48, 32,116, - 104,101,110, 10,111,117,116,112,117,116, 40, 39, 32,114,101, - 116,117,114,110, 32, 39, 46, 46,115,116,114,115,117, 98, 40, - 115,101,108,102, 46, 99,110, 97,109,101, 44, 49, 44, 45, 51, - 41, 46, 46,102,111,114,109, 97,116, 40, 34, 37, 48, 50,100, - 34, 44,111,118,101,114,108,111, 97,100, 41, 46, 46, 39, 40, - 116,111,108,117, 97, 95, 83, 41, 59, 39, 41, 10,101,108,115, - 101, 10,111,117,116,112,117,116, 40, 39, 32,116,111,108,117, - 97, 95,101,114,114,111,114, 40,116,111,108,117, 97, 95, 83, - 44, 34, 35,102,101,114,114,111,114, 32,105,110, 32,102,117, - 110, 99,116,105,111,110, 32, 92, 39, 39, 46, 46,115,101,108, - 102, 46,108,110, 97,109,101, 46, 46, 39, 92, 39, 46, 34, 41, - 59, 39, 41, 10,111,117,116,112,117,116, 40, 39, 32,114,101, - 116,117,114,110, 32, 48, 59, 39, 41, 10,101,110,100, 10, 10, - 111,117,116,112,117,116, 40, 39,125, 39, 41, 10,111,117,116, - 112,117,116, 40, 39, 92,110, 39, 41, 10,101,110,100, 10, 10, - 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, - 70,117,110, 99,116,105,111,110, 58,114,101,103,105,115,116, - 101,114, 32, 40, 41, 10,108,111, 99, 97,108, 32,112, 97,114, - 101,110,116, 32, 61, 32,115,101,108,102, 58,105,110, 99,108, - 97,115,115, 40, 41, 32,111,114, 32,115,101,108,102, 58,105, - 110,109,111,100,117,108,101, 40, 41, 10,105,102, 32,112, 97, - 114,101,110,116, 32,116,104,101,110, 10,111,117,116,112,117, - 116, 40, 39, 32,116,111,108,117, 97, 95,102,117,110, 99,116, - 105,111,110, 40,116,111,108,117, 97, 95, 83, 44, 34, 39, 46, - 46,112, 97,114,101,110,116, 46, 46, 39, 34, 44, 34, 39, 46, - 46,115,101,108,102, 46,108,110, 97,109,101, 46, 46, 39, 34, - 44, 39, 46, 46,115,101,108,102, 46, 99,110, 97,109,101, 46, - 46, 39, 41, 59, 39, 41, 10,101,108,115,101, 10,111,117,116, - 112,117,116, 40, 39, 32,116,111,108,117, 97, 95,102,117,110, - 99,116,105,111,110, 40,116,111,108,117, 97, 95, 83, 44, 78, - 85, 76, 76, 44, 34, 39, 46, 46,115,101,108,102, 46,108,110, - 97,109,101, 46, 46, 39, 34, 44, 39, 46, 46,115,101,108,102, - 46, 99,110, 97,109,101, 46, 46, 39, 41, 59, 39, 41, 10,101, - 110,100, 10,101,110,100, 10, 10, 10,102,117,110, 99,116,105, - 111,110, 32, 99,108, 97,115,115, 70,117,110, 99,116,105,111, - 110, 58,117,110,114,101,103,105,115,116,101,114, 32, 40, 41, - 10,105,102, 32,115,101,108,102, 58,105,110, 99,108, 97,115, - 115, 40, 41, 61, 61,110,105,108, 32, 97,110,100, 32,115,101, - 108,102, 58,105,110,109,111,100,117,108,101, 40, 41, 61, 61, - 110,105,108, 32,116,104,101,110, 10,111,117,116,112,117,116, - 40, 39, 32,108,117, 97, 95,112,117,115,104,110,105,108, 40, - 116,111,108,117, 97, 95, 83, 41, 59, 32,108,117, 97, 95,115, - 101,116,103,108,111, 98, 97,108, 40,116,111,108,117, 97, 95, - 83, 44, 34, 39, 46, 46,115,101,108,102, 46,108,110, 97,109, - 101, 46, 46, 39, 34, 41, 59, 39, 41, 10,101,110,100, 10,101, - 110,100, 10, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, - 99,108, 97,115,115, 70,117,110, 99,116,105,111,110, 58,112, - 114,105,110,116, 32, 40,105,100,101,110,116, 44, 99,108,111, - 115,101, 41, 10,112,114,105,110,116, 40,105,100,101,110,116, - 46, 46, 34, 70,117,110, 99,116,105,111,110,123, 34, 41, 10, - 112,114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 32, - 109,111,100, 32, 61, 32, 39, 34, 46, 46,115,101,108,102, 46, - 109,111,100, 46, 46, 34, 39, 44, 34, 41, 10,112,114,105,110, - 116, 40,105,100,101,110,116, 46, 46, 34, 32,116,121,112,101, - 32, 61, 32, 39, 34, 46, 46,115,101,108,102, 46,116,121,112, - 101, 46, 46, 34, 39, 44, 34, 41, 10,112,114,105,110,116, 40, - 105,100,101,110,116, 46, 46, 34, 32,112,116,114, 32, 61, 32, - 39, 34, 46, 46,115,101,108,102, 46,112,116,114, 46, 46, 34, - 39, 44, 34, 41, 10,112,114,105,110,116, 40,105,100,101,110, - 116, 46, 46, 34, 32,110, 97,109,101, 32, 61, 32, 39, 34, 46, - 46,115,101,108,102, 46,110, 97,109,101, 46, 46, 34, 39, 44, - 34, 41, 10,112,114,105,110,116, 40,105,100,101,110,116, 46, - 46, 34, 32, 99,111,110,115,116, 32, 61, 32, 39, 34, 46, 46, - 115,101,108,102, 46, 99,111,110,115,116, 46, 46, 34, 39, 44, - 34, 41, 10,112,114,105,110,116, 40,105,100,101,110,116, 46, - 46, 34, 32, 99,110, 97,109,101, 32, 61, 32, 39, 34, 46, 46, - 115,101,108,102, 46, 99,110, 97,109,101, 46, 46, 34, 39, 44, - 34, 41, 10,112,114,105,110,116, 40,105,100,101,110,116, 46, - 46, 34, 32,108,110, 97,109,101, 32, 61, 32, 39, 34, 46, 46, - 115,101,108,102, 46,108,110, 97,109,101, 46, 46, 34, 39, 44, - 34, 41, 10,112,114,105,110,116, 40,105,100,101,110,116, 46, - 46, 34, 32, 97,114,103,115, 32, 61, 32,123, 34, 41, 10,108, - 111, 99, 97,108, 32,105, 61, 49, 10,119,104,105,108,101, 32, - 115,101,108,102, 46, 97,114,103,115, 91,105, 93, 32,100,111, - 10,115,101,108,102, 46, 97,114,103,115, 91,105, 93, 58,112, - 114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 32, 34, - 44, 34, 44, 34, 41, 10,105, 32, 61, 32,105, 43, 49, 10,101, - 110,100, 10,112,114,105,110,116, 40,105,100,101,110,116, 46, - 46, 34, 32,125, 34, 41, 10,112,114,105,110,116, 40,105,100, - 101,110,116, 46, 46, 34,125, 34, 46, 46, 99,108,111,115,101, - 41, 10,101,110,100, 10, 10, 10,102,117,110, 99,116,105,111, - 110, 32, 99,108, 97,115,115, 70,117,110, 99,116,105,111,110, - 58,111,118,101,114,108,111, 97,100, 32, 40, 41, 10,114,101, - 116,117,114,110, 32,115,101,108,102, 46,112, 97,114,101,110, - 116, 58,111,118,101,114,108,111, 97,100, 40,115,101,108,102, - 46,108,110, 97,109,101, 41, 10,101,110,100, 10, 10, 10, 10, - 10,102,117,110, 99,116,105,111,110, 32, 95, 70,117,110, 99, - 116,105,111,110, 32, 40,116, 41, 10,116, 46, 95, 98, 97,115, - 101, 32, 61, 32, 99,108, 97,115,115, 70,117,110, 99,116,105, - 111,110, 10,115,101,116,116, 97,103, 40,116, 44,116,111,108, - 117, 97, 95,116, 97,103, 41, 10, 10,105,102, 32,116, 46, 99, - 111,110,115,116, 32,126, 61, 32, 39, 99,111,110,115,116, 39, - 32, 97,110,100, 32,116, 46, 99,111,110,115,116, 32,126, 61, - 32, 39, 39, 32,116,104,101,110, 10,101,114,114,111,114, 40, - 34, 35,105,110,118, 97,108,105,100, 32, 39, 99,111,110,115, - 116, 39, 32,115,112,101, 99,105,102,105, 99, 97,116,105,111, - 110, 34, 41, 10,101,110,100, 10, 10, 97,112,112,101,110,100, - 40,116, 41, 10,105,102, 32,116, 58,105,110, 99,108, 97,115, - 115, 40, 41, 32,116,104,101,110, 10,105,102, 32,116, 46,110, - 97,109,101, 32, 61, 61, 32,116, 46,112, 97,114,101,110,116, - 46,110, 97,109,101, 32,116,104,101,110, 10,116, 46,110, 97, - 109,101, 32, 61, 32, 39,110,101,119, 39, 10,116, 46,108,110, - 97,109,101, 32, 61, 32, 39,110,101,119, 39, 10,116, 46,116, - 121,112,101, 32, 61, 32,116, 46,112, 97,114,101,110,116, 46, - 110, 97,109,101, 10,116, 46,112,116,114, 32, 61, 32, 39, 42, - 39, 10,101,108,115,101,105,102, 32,116, 46,110, 97,109,101, - 32, 61, 61, 32, 39,126, 39, 46, 46,116, 46,112, 97,114,101, - 110,116, 46,110, 97,109,101, 32,116,104,101,110, 10,116, 46, - 110, 97,109,101, 32, 61, 32, 39,100,101,108,101,116,101, 39, - 10,116, 46,108,110, 97,109,101, 32, 61, 32, 39,100,101,108, - 101,116,101, 39, 10,101,110,100, 10,101,110,100, 10,116, 46, - 99,110, 97,109,101, 32, 61, 32,116, 58, 99,102,117,110, 99, - 110, 97,109,101, 40, 34,116,111,108,117, 97, 73, 34, 41, 46, - 46,116, 58,111,118,101,114,108,111, 97,100, 40,116, 41, 10, - 114,101,116,117,114,110, 32,116, 10,101,110,100, 10, 10, 10, - 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 70,117,110, - 99,116,105,111,110, 32, 40,100, 44, 97, 44, 99, 41, 10,108, - 111, 99, 97,108, 32,116, 32, 61, 32,115,112,108,105,116, 40, - 115,116,114,115,117, 98, 40, 97, 44, 50, 44, 45, 50, 41, 44, - 39, 44, 39, 41, 10,108,111, 99, 97,108, 32,105, 61, 49, 10, - 108,111, 99, 97,108, 32,108, 32, 61, 32,123,110, 61, 48,125, - 10,119,104,105,108,101, 32,116, 91,105, 93, 32,100,111, 10, - 108, 46,110, 32, 61, 32,108, 46,110, 43, 49, 10,108, 91,108, - 46,110, 93, 32, 61, 32, 68,101, 99,108, 97,114, 97,116,105, - 111,110, 40,116, 91,105, 93, 44, 39,118, 97,114, 39, 41, 10, - 105, 32, 61, 32,105, 43, 49, 10,101,110,100, 10,108,111, 99, - 97,108, 32,102, 32, 61, 32, 68,101, 99,108, 97,114, 97,116, - 105,111,110, 40,100, 44, 39,102,117,110, 99, 39, 41, 10,102, - 46, 97,114,103,115, 32, 61, 32,108, 10,102, 46, 99,111,110, - 115,116, 32, 61, 32, 99, 10,114,101,116,117,114,110, 32, 95, - 70,117,110, 99,116,105,111,110, 40,102, 41, 10,101,110,100, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 99,108, 97,115,115, 79,112,101,114, 97,116, - 111,114, 32, 61, 32,123, 10,107,105,110,100, 32, 61, 32, 39, - 39, 44, 10, 95, 98, 97,115,101, 32, 61, 32, 99,108, 97,115, - 115, 70,117,110, 99,116,105,111,110, 44, 10,125, 10,115,101, - 116,116, 97,103, 40, 99,108, 97,115,115, 79,112,101,114, 97, - 116,111,114, 44,116,111,108,117, 97, 95,116, 97,103, 41, 10, - 10, 10, 95, 84, 77, 32, 61, 32,123, 91, 39, 43, 39, 93, 32, - 61, 32, 39,111,112,101,114, 97,116,111,114, 95, 97,100,100, - 39, 44, 10, 91, 39, 45, 39, 93, 32, 61, 32, 39,111,112,101, - 114, 97,116,111,114, 95,115,117, 98, 39, 44, 10, 91, 39, 42, - 39, 93, 32, 61, 32, 39,111,112,101,114, 97,116,111,114, 95, - 109,117,108, 39, 44, 10, 91, 39, 47, 39, 93, 32, 61, 32, 39, - 111,112,101,114, 97,116,111,114, 95,100,105,118, 39, 44, 10, - 91, 39, 60, 39, 93, 32, 61, 32, 39,111,112,101,114, 97,116, - 111,114, 95,108,116, 39, 44, 10, 91, 39, 91, 93, 39, 93, 32, - 61, 32, 39,111,112,101,114, 97,116,111,114, 95,103,101,116, - 39, 44, 10, 91, 39, 38, 91, 93, 39, 93, 32, 61, 32, 39,111, - 112,101,114, 97,116,111,114, 95,115,101,116, 39, 44, 10,125, - 10, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, - 97,115,115, 79,112,101,114, 97,116,111,114, 58,112,114,105, - 110,116, 32, 40,105,100,101,110,116, 44, 99,108,111,115,101, - 41, 10,112,114,105,110,116, 40,105,100,101,110,116, 46, 46, - 34, 79,112,101,114, 97,116,111,114,123, 34, 41, 10,112,114, - 105,110,116, 40,105,100,101,110,116, 46, 46, 34, 32,107,105, - 110,100, 32, 61, 32, 39, 34, 46, 46,115,101,108,102, 46,107, - 105,110,100, 46, 46, 34, 39, 44, 34, 41, 10,112,114,105,110, - 116, 40,105,100,101,110,116, 46, 46, 34, 32,109,111,100, 32, - 61, 32, 39, 34, 46, 46,115,101,108,102, 46,109,111,100, 46, - 46, 34, 39, 44, 34, 41, 10,112,114,105,110,116, 40,105,100, - 101,110,116, 46, 46, 34, 32,116,121,112,101, 32, 61, 32, 39, - 34, 46, 46,115,101,108,102, 46,116,121,112,101, 46, 46, 34, - 39, 44, 34, 41, 10,112,114,105,110,116, 40,105,100,101,110, - 116, 46, 46, 34, 32,112,116,114, 32, 61, 32, 39, 34, 46, 46, - 115,101,108,102, 46,112,116,114, 46, 46, 34, 39, 44, 34, 41, - 10,112,114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, - 32,110, 97,109,101, 32, 61, 32, 39, 34, 46, 46,115,101,108, - 102, 46,110, 97,109,101, 46, 46, 34, 39, 44, 34, 41, 10,112, - 114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 32, 99, - 111,110,115,116, 32, 61, 32, 39, 34, 46, 46,115,101,108,102, - 46, 99,111,110,115,116, 46, 46, 34, 39, 44, 34, 41, 10,112, - 114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 32, 99, - 110, 97,109,101, 32, 61, 32, 39, 34, 46, 46,115,101,108,102, - 46, 99,110, 97,109,101, 46, 46, 34, 39, 44, 34, 41, 10,112, - 114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 32,108, - 110, 97,109,101, 32, 61, 32, 39, 34, 46, 46,115,101,108,102, - 46,108,110, 97,109,101, 46, 46, 34, 39, 44, 34, 41, 10,112, - 114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 32, 97, - 114,103,115, 32, 61, 32,123, 34, 41, 10,108,111, 99, 97,108, - 32,105, 61, 49, 10,119,104,105,108,101, 32,115,101,108,102, - 46, 97,114,103,115, 91,105, 93, 32,100,111, 10,115,101,108, - 102, 46, 97,114,103,115, 91,105, 93, 58,112,114,105,110,116, - 40,105,100,101,110,116, 46, 46, 34, 32, 34, 44, 34, 44, 34, - 41, 10,105, 32, 61, 32,105, 43, 49, 10,101,110,100, 10,112, - 114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 32,125, - 34, 41, 10,112,114,105,110,116, 40,105,100,101,110,116, 46, - 46, 34,125, 34, 46, 46, 99,108,111,115,101, 41, 10,101,110, - 100, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 95, 79, - 112,101,114, 97,116,111,114, 32, 40,116, 41, 10,116, 46, 95, - 98, 97,115,101, 32, 61, 32, 99,108, 97,115,115, 79,112,101, - 114, 97,116,111,114, 10,115,101,116,116, 97,103, 40,116, 44, - 116,111,108,117, 97, 95,116, 97,103, 41, 10, 10,105,102, 32, - 116, 46, 99,111,110,115,116, 32,126, 61, 32, 39, 99,111,110, - 115,116, 39, 32, 97,110,100, 32,116, 46, 99,111,110,115,116, - 32,126, 61, 32, 39, 39, 32,116,104,101,110, 10,101,114,114, - 111,114, 40, 34, 35,105,110,118, 97,108,105,100, 32, 39, 99, - 111,110,115,116, 39, 32,115,112,101, 99,105,102,105, 99, 97, - 116,105,111,110, 34, 41, 10,101,110,100, 10, 10, 97,112,112, - 101,110,100, 40,116, 41, 10,105,102, 32,110,111,116, 32,116, - 58,105,110, 99,108, 97,115,115, 40, 41, 32,116,104,101,110, - 10,101,114,114,111,114, 40, 34, 35,111,112,101,114, 97,116, - 111,114, 32, 99, 97,110, 32,111,110,108,121, 32, 98,101, 32, - 100,101,102,105,110,101,100, 32, 97,115, 32, 99,108, 97,115, - 115, 32,109,101,109, 98,101,114, 34, 41, 10,101,110,100, 10, - 10,116, 46, 99,110, 97,109,101, 32, 61, 32,116, 58, 99,102, - 117,110, 99,110, 97,109,101, 40, 34,116,111,108,117, 97, 73, - 34, 41, 46, 46,116, 58,111,118,101,114,108,111, 97,100, 40, - 116, 41, 10,116, 46,110, 97,109,101, 32, 61, 32,116, 46,110, - 97,109,101, 46, 46,116, 46,107,105,110,100, 10,114,101,116, - 117,114,110, 32,116, 10,101,110,100, 10, 10, 10, 10, 10, 10, - 102,117,110, 99,116,105,111,110, 32, 79,112,101,114, 97,116, - 111,114, 32, 40,100, 44,107, 44, 97, 44, 99, 41, 10,108,111, - 99, 97,108, 32,116, 32, 61, 32,115,112,108,105,116, 40,115, - 116,114,115,117, 98, 40, 97, 44, 50, 44,115,116,114,108,101, - 110, 40, 97, 41, 45, 49, 41, 44, 39, 44, 39, 41, 10,108,111, - 99, 97,108, 32,105, 61, 49, 10,108,111, 99, 97,108, 32,108, - 32, 61, 32,123,110, 61, 48,125, 10,119,104,105,108,101, 32, - 116, 91,105, 93, 32,100,111, 10,108, 46,110, 32, 61, 32,108, - 46,110, 43, 49, 10,108, 91,108, 46,110, 93, 32, 61, 32, 68, - 101, 99,108, 97,114, 97,116,105,111,110, 40,116, 91,105, 93, - 44, 39,118, 97,114, 39, 41, 10,105, 32, 61, 32,105, 43, 49, - 10,101,110,100, 10,105,102, 32,107, 32, 61, 61, 32, 39, 91, - 93, 39, 32,116,104,101,110, 10,100, 32, 61, 32,103,115,117, - 98, 40,100, 44, 39, 38, 39, 44, 39, 39, 41, 10,101,108,115, - 101,105,102, 32,107, 61, 61, 39, 38, 91, 93, 39, 32,116,104, - 101,110, 10,108, 46,110, 32, 61, 32,108, 46,110, 43, 49, 10, - 108, 91,108, 46,110, 93, 32, 61, 32, 68,101, 99,108, 97,114, - 97,116,105,111,110, 40,100, 44, 39,118, 97,114, 39, 41, 10, - 108, 91,108, 46,110, 93, 46,110, 97,109,101, 32, 61, 32, 39, - 116,111,108,117, 97, 73, 95,118, 97,108,117,101, 39, 10,101, - 110,100, 10,108,111, 99, 97,108, 32,102, 32, 61, 32, 68,101, - 99,108, 97,114, 97,116,105,111,110, 40,100, 44, 39,102,117, - 110, 99, 39, 41, 10,105,102, 32,107, 32, 61, 61, 32, 39, 91, - 93, 39, 32, 97,110,100, 32, 40,108, 91, 49, 93, 61, 61,110, - 105,108, 32,111,114, 32,105,115, 98, 97,115,105, 99, 40,108, - 91, 49, 93, 46,116,121,112,101, 41,126, 61, 39,110,117,109, - 98,101,114, 39, 41, 32,116,104,101,110, 10,101,114,114,111, - 114, 40, 39,111,112,101,114, 97,116,111,114, 91, 93, 32, 99, - 97,110, 32,111,110,108,121, 32, 98,101, 32,100,101,102,105, - 110,101,100, 32,102,111,114, 32,110,117,109,101,114,105, 99, - 32,105,110,100,101,120, 46, 39, 41, 10,101,110,100, 10,102, - 46, 97,114,103,115, 32, 61, 32,108, 10,102, 46, 99,111,110, - 115,116, 32, 61, 32, 99, 10,102, 46,107,105,110,100, 32, 61, - 32,103,115,117, 98, 40,107, 44, 34, 37,115, 34, 44, 34, 34, - 41, 10,102, 46,108,110, 97,109,101, 32, 61, 32, 95, 84, 77, - 91,102, 46,107,105,110,100, 93, 10,105,102, 32,110,111,116, - 32,102, 46,108,110, 97,109,101, 32,116,104,101,110, 10,101, - 114,114,111,114, 40, 34,116,111,108,117, 97, 58, 32,110,111, - 32,115,117,112,112,111,114,116, 32,102,111,114, 32,111,112, - 101,114, 97,116,111,114, 34, 32, 46, 46, 32,102, 46,107,105, - 110,100, 41, 10,101,110,100, 10,105,102, 32,102, 46,107,105, - 110,100, 32, 61, 61, 32, 39, 91, 93, 39, 32, 97,110,100, 32, - 110,111,116, 32,115,116,114,102,105,110,100, 40,102, 46,109, - 111,100, 44, 39, 99,111,110,115,116, 39, 41, 32,116,104,101, - 110, 10, 79,112,101,114, 97,116,111,114, 40,100, 44, 39, 38, - 39, 46, 46,107, 44, 97, 44, 99, 41, 10,101,110,100, 10,114, - 101,116,117,114,110, 32, 95, 79,112,101,114, 97,116,111,114, - 40,102, 41, 10,101,110,100, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 99,108, 97,115, - 115, 67,108, 97,115,115, 32, 61, 32,123, 10, 95, 98, 97,115, - 101, 32, 61, 32, 99,108, 97,115,115, 67,111,110,116, 97,105, - 110,101,114, 44, 10,116,121,112,101, 32, 61, 32, 39, 99,108, - 97,115,115, 39, 44, 10,110, 97,109,101, 32, 61, 32, 39, 39, - 44, 10, 98, 97,115,101, 32, 61, 32, 39, 39, 44, 10,125, 10, - 115,101,116,116, 97,103, 40, 99,108, 97,115,115, 67,108, 97, - 115,115, 44,116,111,108,117, 97, 95,116, 97,103, 41, 10, 10, - 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97,115, - 115, 67,108, 97,115,115, 58,114,101,103,105,115,116,101,114, - 32, 40, 41, 10,111,117,116,112,117,116, 40, 39, 32,116,111, - 108,117, 97, 95, 99, 99,108, 97,115,115, 40,116,111,108,117, - 97, 95, 83, 44, 34, 39, 46, 46,115,101,108,102, 46,110, 97, - 109,101, 46, 46, 39, 34, 44, 34, 39, 46, 46,115,101,108,102, - 46, 98, 97,115,101, 46, 46, 39, 34, 41, 59, 39, 41, 10,108, - 111, 99, 97,108, 32,105, 61, 49, 10,119,104,105,108,101, 32, - 115,101,108,102, 91,105, 93, 32,100,111, 10,115,101,108,102, - 91,105, 93, 58,114,101,103,105,115,116,101,114, 40, 41, 10, - 105, 32, 61, 32,105, 43, 49, 10,101,110,100, 10,101,110,100, - 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97, - 115,115, 67,108, 97,115,115, 58,117,110,114,101,103,105,115, - 116,101,114, 32, 40, 41, 10,111,117,116,112,117,116, 40, 39, - 32,108,117, 97, 95,112,117,115,104,110,105,108, 40,116,111, - 108,117, 97, 95, 83, 41, 59, 32,108,117, 97, 95,115,101,116, - 103,108,111, 98, 97,108, 40,116,111,108,117, 97, 95, 83, 44, - 34, 39, 46, 46,115,101,108,102, 46,110, 97,109,101, 46, 46, - 39, 34, 41, 59, 39, 41, 10,101,110,100, 10, 10, 10,102,117, - 110, 99,116,105,111,110, 32, 99,108, 97,115,115, 67,108, 97, - 115,115, 58,100,101, 99,108,116, 97,103, 32, 40, 41, 10,115, - 101,108,102, 46,105,116,121,112,101, 44,115,101,108,102, 46, - 116, 97,103, 32, 61, 32,116, 97,103,118, 97,114, 40,115,101, - 108,102, 46,110, 97,109,101, 41, 59, 10,115,101,108,102, 46, - 99,105,116,121,112,101, 44,115,101,108,102, 46, 99,116, 97, - 103, 32, 61, 32,116, 97,103,118, 97,114, 40,115,101,108,102, - 46,110, 97,109,101, 44, 39, 99,111,110,115,116, 39, 41, 59, - 10,108,111, 99, 97,108, 32,105, 61, 49, 10,119,104,105,108, - 101, 32,115,101,108,102, 91,105, 93, 32,100,111, 10,115,101, - 108,102, 91,105, 93, 58,100,101, 99,108,116, 97,103, 40, 41, - 10,105, 32, 61, 32,105, 43, 49, 10,101,110,100, 10,101,110, - 100, 10, 10, 10, 10,102,117,110, 99,116,105,111,110, 32, 99, - 108, 97,115,115, 67,108, 97,115,115, 58,112,114,105,110,116, - 32, 40,105,100,101,110,116, 44, 99,108,111,115,101, 41, 10, - 112,114,105,110,116, 40,105,100,101,110,116, 46, 46, 34, 67, - 108, 97,115,115,123, 34, 41, 10,112,114,105,110,116, 40,105, - 100,101,110,116, 46, 46, 34, 32,110, 97,109,101, 32, 61, 32, - 39, 34, 46, 46,115,101,108,102, 46,110, 97,109,101, 46, 46, - 34, 39, 44, 34, 41, 10,112,114,105,110,116, 40,105,100,101, - 110,116, 46, 46, 34, 32, 98, 97,115,101, 32, 61, 32, 39, 34, - 46, 46,115,101,108,102, 46, 98, 97,115,101, 46, 46, 34, 39, - 59, 34, 41, 10,108,111, 99, 97,108, 32,105, 61, 49, 10,119, - 104,105,108,101, 32,115,101,108,102, 91,105, 93, 32,100,111, - 10,115,101,108,102, 91,105, 93, 58,112,114,105,110,116, 40, - 105,100,101,110,116, 46, 46, 34, 32, 34, 44, 34, 44, 34, 41, - 10,105, 32, 61, 32,105, 43, 49, 10,101,110,100, 10,112,114, - 105,110,116, 40,105,100,101,110,116, 46, 46, 34,125, 34, 46, - 46, 99,108,111,115,101, 41, 10,101,110,100, 10, 10, 10,102, - 117,110, 99,116,105,111,110, 32, 95, 67,108, 97,115,115, 32, - 40,116, 41, 10,116, 46, 95, 98, 97,115,101, 32, 61, 32, 99, - 108, 97,115,115, 67,108, 97,115,115, 10,115,101,116,116, 97, - 103, 40,116, 44,116,111,108,117, 97, 95,116, 97,103, 41, 10, - 97,112,112,101,110,100, 40,116, 41, 10,114,101,116,117,114, - 110, 32,116, 10,101,110,100, 10, 10, 10, 10,102,117,110, 99, - 116,105,111,110, 32, 67,108, 97,115,115, 32, 40,110, 44,112, - 44, 98, 41, 10,108,111, 99, 97,108, 32, 99, 32, 61, 32, 95, - 67,108, 97,115,115, 40, 95, 67,111,110,116, 97,105,110,101, - 114,123,110, 97,109,101, 61,110, 44, 32, 98, 97,115,101, 61, - 112,125, 41, 10,112,117,115,104, 40, 99, 41, 10, 99, 58,112, - 97,114,115,101, 40,115,116,114,115,117, 98, 40, 98, 44, 50, - 44,115,116,114,108,101,110, 40, 98, 41, 45, 49, 41, 41, 10, - 112,111,112, 40, 41, 10,101,110,100, 10, 10, 10, 10, 83, 84, - 82, 49, 32, 61, 32, 34, 92, 48, 48, 49, 34, 10, 83, 84, 82, - 50, 32, 61, 32, 34, 92, 48, 48, 50, 34, 10, 83, 84, 82, 51, - 32, 61, 32, 34, 92, 48, 48, 51, 34, 10, 83, 84, 82, 52, 32, - 61, 32, 34, 92, 48, 48, 52, 34, 10, 82, 69, 77, 32, 61, 32, - 34, 92, 48, 48, 53, 34, 10, 65, 78, 89, 32, 61, 32, 34, 40, - 91, 92, 48, 48, 49, 45, 92, 48, 48, 53, 93, 41, 34, 10, 69, - 83, 67, 49, 32, 61, 32, 34, 92, 48, 48, 54, 34, 10, 69, 83, - 67, 50, 32, 61, 32, 34, 92, 48, 48, 55, 34, 10, 10, 77, 65, - 83, 75, 32, 61, 32,123, 10,123, 69, 83, 67, 49, 44, 32, 34, - 92, 92, 39, 34,125, 44, 10,123, 69, 83, 67, 50, 44, 32, 39, - 92, 92, 34, 39,125, 44, 10,123, 83, 84, 82, 49, 44, 32, 34, - 39, 34,125, 44, 10,123, 83, 84, 82, 50, 44, 32, 39, 34, 39, - 125, 44, 10,123, 83, 84, 82, 51, 44, 32, 34, 37, 91, 37, 91, - 34,125, 44, 10,123, 83, 84, 82, 52, 44, 32, 34, 37, 93, 37, - 93, 34,125, 44, 10,123, 82, 69, 77, 32, 44, 32, 34, 37, 45, - 37, 45, 34,125, 44, 10,125, 10, 10,102,117,110, 99,116,105, - 111,110, 32,109, 97,115,107, 32, 40,115, 41, 10,102,111,114, - 32,105, 32, 61, 32, 49, 44,103,101,116,110, 40, 77, 65, 83, - 75, 41, 32,100,111, 10,115, 32, 61, 32,103,115,117, 98, 40, - 115, 44, 77, 65, 83, 75, 91,105, 93, 91, 50, 93, 44, 77, 65, - 83, 75, 91,105, 93, 91, 49, 93, 41, 10,101,110,100, 10,114, - 101,116,117,114,110, 32,115, 10,101,110,100, 10, 10,102,117, - 110, 99,116,105,111,110, 32,117,110,109, 97,115,107, 32, 40, - 115, 41, 10,102,111,114, 32,105, 32, 61, 32, 49, 44,103,101, - 116,110, 40, 77, 65, 83, 75, 41, 32,100,111, 10,115, 32, 61, - 32,103,115,117, 98, 40,115, 44, 77, 65, 83, 75, 91,105, 93, - 91, 49, 93, 44, 77, 65, 83, 75, 91,105, 93, 91, 50, 93, 41, - 10,101,110,100, 10,114,101,116,117,114,110, 32,115, 10,101, - 110,100, 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, - 101, 97,110, 32, 40,115, 41, 10, 10,108,111, 99, 97,108, 32, - 99,111,100,101, 32, 61, 32, 34,114,101,116,117,114,110, 32, - 102,117,110, 99,116,105,111,110, 32, 40, 41, 32, 34, 32, 46, - 46, 32,115, 32, 46, 46, 32, 34, 32,101,110,100, 34, 10,105, - 102, 32,110,111,116, 32,100,111,115,116,114,105,110,103, 40, - 99,111,100,101, 41, 32,116,104,101,110, 10,114,101,116,117, - 114,110, 32,110,105,108, 10,101,110,100, 10, 10,108,111, 99, - 97,108, 32, 83, 32, 61, 32, 34, 34, 10, 10,115, 32, 61, 32, - 109, 97,115,107, 40,115, 41, 10, 10, 10,119,104,105,108,101, - 32, 49, 32,100,111, 10,108,111, 99, 97,108, 32, 98, 44,101, - 44,100, 32, 61, 32,115,116,114,102,105,110,100, 40,115, 44, - 65, 78, 89, 41, 10,105,102, 32, 98, 32,116,104,101,110, 10, - 83, 32, 61, 32, 83, 46, 46,115,116,114,115,117, 98, 40,115, - 44, 49, 44, 98, 45, 49, 41, 10,115, 32, 61, 32,115,116,114, - 115,117, 98, 40,115, 44, 98, 43, 49, 41, 10,105,102, 32,100, - 61, 61, 83, 84, 82, 49, 32,111,114, 32,100, 61, 61, 83, 84, - 82, 50, 32,116,104,101,110, 10,101, 32, 61, 32,115,116,114, - 102,105,110,100, 40,115, 44,100, 41, 10, 83, 32, 61, 32, 83, - 32, 46, 46,100, 46, 46,115,116,114,115,117, 98, 40,115, 44, - 49, 44,101, 41, 10,115, 32, 61, 32,115,116,114,115,117, 98, - 40,115, 44,101, 43, 49, 41, 10,101,108,115,101,105,102, 32, - 100, 61, 61, 83, 84, 82, 51, 32,116,104,101,110, 10,101, 32, - 61, 32,115,116,114,102,105,110,100, 40,115, 44, 83, 84, 82, - 52, 41, 10, 83, 32, 61, 32, 83, 46, 46,100, 46, 46,115,116, - 114,115,117, 98, 40,115, 44, 49, 44,101, 41, 10,115, 32, 61, - 32,115,116,114,115,117, 98, 40,115, 44,101, 43, 49, 41, 10, - 101,108,115,101,105,102, 32,100, 61, 61, 82, 69, 77, 32,116, - 104,101,110, 10,115, 32, 61, 32,103,115,117, 98, 40,115, 44, - 34, 91, 94, 92,110, 93, 42, 40, 92,110, 63, 41, 34, 44, 34, - 37, 49, 34, 44, 49, 41, 10,101,110,100, 10,101,108,115,101, - 10, 83, 32, 61, 32, 83, 46, 46,115, 10, 98,114,101, 97,107, - 10,101,110,100, 10,101,110,100, 10, 10, 83, 32, 61, 32,103, - 115,117, 98, 40, 83, 44, 34, 91, 32, 92,116, 93, 43, 34, 44, - 34, 32, 34, 41, 10, 83, 32, 61, 32,103,115,117, 98, 40, 83, - 44, 34, 91, 32, 92,116, 93, 42, 92,110, 91, 32, 92,116, 93, - 42, 34, 44, 34, 92,110, 34, 41, 10, 83, 32, 61, 32,117,110, - 109, 97,115,107, 40, 83, 41, 10,114,101,116,117,114,110, 32, - 83, 10,101,110,100, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10,105,102, 32,102,108, 97,103,115, 46,102, - 32,116,104,101,110, 10,108,111, 99, 97,108, 32,115,116, 44, - 32,109,115,103, 32, 61, 32,114,101, 97,100,102,114,111,109, - 40,102,108, 97,103,115, 46,102, 41, 10,105,102, 32,110,111, - 116, 32,115,116, 32,116,104,101,110, 10,101,114,114,111,114, - 40, 39, 35, 39, 46, 46,109,115,103, 41, 10,101,110,100, 10, - 101,110,100, 10, 10, 10,105,102, 32,110,111,116, 32,102,108, - 97,103,115, 46,110, 32,116,104,101,110, 10,105,102, 32,102, - 108, 97,103,115, 46,102, 32,116,104,101,110, 10,102,108, 97, - 103,115, 46,110, 32, 61, 32,103,115,117, 98, 40,102,108, 97, - 103,115, 46,102, 44, 34, 37, 46, 46, 42, 34, 44, 34, 34, 41, - 10,101,108,115,101, 10,101,114,114,111,114, 40, 34, 35,110, - 111, 32,112, 97, 99,107, 97,103,101, 32,110, 97,109,101, 32, - 110,111,114, 32,105,110,112,117,116, 32,102,105,108,101, 32, - 112,114,111,118,105,100,101,100, 34, 41, 10,101,110,100, 10, - 101,110,100, 10, 10,108,111, 99, 97,108, 32,112, 32, 61, 32, - 80, 97, 99,107, 97,103,101, 40,102,108, 97,103,115, 46,110, - 41, 10, 10,105,102, 32,102,108, 97,103,115, 46,102, 32,116, - 104,101,110, 10,114,101, 97,100,102,114,111,109, 40, 41, 10, - 101,110,100, 10, 10,105,102, 32,102,108, 97,103,115, 46,112, - 32,116,104,101,110, 10,114,101,116,117,114,110, 10,101,110, - 100, 10, 10,105,102, 32,102,108, 97,103,115, 46,111, 32,116, - 104,101,110, 10,108,111, 99, 97,108, 32,115,116, 44,109,115, - 103, 32, 61, 32,119,114,105,116,101,116,111, 40,102,108, 97, - 103,115, 46,111, 41, 10,105,102, 32,110,111,116, 32,115,116, - 32,116,104,101,110, 10,101,114,114,111,114, 40, 39, 35, 39, - 46, 46,109,115,103, 41, 10,101,110,100, 10,101,110,100, 10, - 10,105,102, 32,102,108, 97,103,115, 46, 80, 32,116,104,101, - 110, 10,112, 58,112,114,105,110,116, 40, 41, 10,101,108,115, - 101, 10,112, 58,100,101, 99,108,116, 97,103, 40, 41, 10,112, - 58,112,114,101, 97,109, 98,108,101, 40, 41, 10,112, 58,115, - 117,112, 99,111,100,101, 40, 41, 10,112, 58,114,101,103,105, - 115,116,101,114, 40, 41, 10,112, 58,117,110,114,101,103,105, - 115,116,101,114, 40, 41, 10,101,110,100, 10, 10,105,102, 32, - 102,108, 97,103,115, 46,111, 32,116,104,101,110, 10,119,114, - 105,116,101,116,111, 40, 41, 10,101,110,100, 10, 10, 10,105, - 102, 32,110,111,116, 32,102,108, 97,103,115, 46, 80, 32,116, - 104,101,110, 10,105,102, 32,102,108, 97,103,115, 46, 72, 32, - 116,104,101,110, 10,108,111, 99, 97,108, 32,115,116, 44,109, - 115,103, 32, 61, 32,119,114,105,116,101,116,111, 40,102,108, - 97,103,115, 46, 72, 41, 10,105,102, 32,110,111,116, 32,115, - 116, 32,116,104,101,110, 10,101,114,114,111,114, 40, 39, 35, - 39, 46, 46,109,115,103, 41, 10,101,110,100, 10,112, 58,104, - 101, 97,100,101,114, 40, 41, 10,119,114,105,116,101,116,111, - 40, 41, 10,101,110,100, 10,101,110,100,32 - }; - lua_dobuffer(tolua_S,(char*)B,sizeof(B),"tolua: embedded Lua code"); - } /* end of embedded lua code */ - - return 1; -} -/* Close function */ -void tolua_tolualua_close (lua_State* tolua_S) -{ -} diff --git a/src/lua/tolualua.h b/src/lua/tolualua.h deleted file mode 100644 index b380dcef..00000000 --- a/src/lua/tolualua.h +++ /dev/null @@ -1,2713 +0,0 @@ -/* code automatically generated by bin2c -- DO NOT EDIT */ -{ -/* #include'ing this file in a C program is equivalent to calling - lua_dofile("basic.lo"); - lua_dofile("feature.lo"); - lua_dofile("declaration.lo"); - lua_dofile("container.lo"); - lua_dofile("package.lo"); - lua_dofile("module.lo"); - lua_dofile("class.lo"); - lua_dofile("typedef.lo"); - lua_dofile("define.lo"); - lua_dofile("enumerate.lo"); - lua_dofile("variable.lo"); - lua_dofile("array.lo"); - lua_dofile("function.lo"); - lua_dofile("operator.lo"); - lua_dofile("verbatim.lo"); - lua_dofile("code.lo"); - lua_dofile("doit.lo"); -*/ -/* basic.lo */ -static char B1[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 11, 64, 98, 97,115,105, 99, - 46,108,117, 97, 0, 0, 0, 0,190, 25, 0, 60, 17, 22, 12, 60, 18, 11, 1, 11, - 2, 60, 19, 11, 3, 11, 4, 60, 20, 11, 5, 11, 4, 60, 21, 11, 6, 11, 4, 60, - 22, 11, 7, 11, 4, 60, 23, 11, 8, 11, 4, 60, 24, 11, 9, 11, 4, 60, 25, 11, - 10, 11, 11, 60, 26, 11, 12, 11, 13, 60, 27, 11, 14, 11, 11, 60, 28, 11, 15, 11, - 13, 60, 29, 11, 16, 11, 17, 30, 11, 60, 30, 25, 0, 60, 34, 22, 0, 25, 18, 60, - 37, 11, 20, 25, 19, 60, 45, 15, 22, 2, 1, 0, 25, 21, 60, 46, 15, 24, 15, 21, - 11, 25, 15, 19, 2, 1, 3, 25, 23, 60, 49, 11, 27, 25, 26, 60, 69, 15, 28, 15, - 26, 2, 0, 1, 60, 72, 11, 30, 25, 29, 60, 80, 22, 0, 25, 31, 60, 81, 11, 33, - 25, 32, 60, 89, 11, 35, 25, 34, 60,109, 11, 37, 25, 36, 60,115, 11, 39, 25, 38, - 60,121, 11, 41, 25, 40, 60,138, 11, 43, 25, 42, 60,150, 11, 45, 25, 44, 0, 0, - 0, 0, 0, 0, 0, 0, 46, 2, 0, 0, 0, 7, 95, 98, 97,115,105, 99, 0, 2, - 0, 0, 0, 5,118,111,105,100, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 5, - 99,104, 97,114, 0, 2, 0, 0, 0, 7,110,117,109, 98,101,114, 0, 2, 0, 0, - 0, 4,105,110,116, 0, 2, 0, 0, 0, 6,115,104,111,114,116, 0, 2, 0, 0, - 0, 5,108,111,110,103, 0, 2, 0, 0, 0, 6,102,108,111, 97,116, 0, 2, 0, - 0, 0, 7,100,111,117, 98,108,101, 0, 2, 0, 0, 0, 9, 95, 99,115,116,114, -105,110,103, 0, 2, 0, 0, 0, 7,115,116,114,105,110,103, 0, 2, 0, 0, 0, - 10, 95,117,115,101,114,100, 97,116, 97, 0, 2, 0, 0, 0, 9,117,115,101,114, -100, 97,116, 97, 0, 2, 0, 0, 0, 6, 99,104, 97,114, 42, 0, 2, 0, 0, 0, - 6,118,111,105,100, 42, 0, 2, 0, 0, 0, 11,108,117, 97, 95, 79, 98,106,101, - 99,116, 0, 2, 0, 0, 0, 7,111, 98,106,101, 99,116, 0, 2, 0, 0, 0, 10, - 95,117,115,101,114,116,121,112,101, 0, 2, 0, 0, 0, 12,116,111,108,117, 97, - 95,105,110,100,101,120, 0, 4, 0, 0, 0, 37, 0, 0, 0, 11, 64, 98, 97,115, -105, 99, 46,108,117, 97, 0, 0, 0, 0, 40, 5, 2, 60, 38, 13, 1, 11, 2, 32, - 52, 13, 60, 39, 15, 3, 13, 0, 13, 1, 3, 2, 2, 50, 13, 60, 41, 13, 0, 18, - 2, 13, 1, 16, 1, 2, 60, 42, 60, 43, 0, 0, 0, 0, 2, 0, 0, 0, 37, 0, - 0, 0, 2,116, 0, 0, 0, 0, 37, 0, 0, 0, 2,102, 0, 0, 0, 0, 4, 2, - 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 2,102, 0, 2, 0, 0, 0, 6, 95, 98, - 97,115,101, 0, 2, 0, 0, 0, 16,116,111,108,117, 97, 95,111,108,100, 95,105, -110,100,101,120, 0, 2, 0, 0, 0, 10,116,111,108,117, 97, 95,116, 97,103, 0, - 2, 0, 0, 0, 7,110,101,119,116, 97,103, 0, 2, 0, 0, 0, 16,116,111,108, -117, 97, 95,111,108,100, 95,105,110,100,101,120, 0, 2, 0, 0, 0, 13,115,101, -116,116, 97,103,109,101,116,104,111,100, 0, 2, 0, 0, 0, 6,105,110,100,101, -120, 0, 2, 0, 0, 0, 12,116,111,108,117, 97, 95,101,114,114,111,114, 0, 4, - 0, 0, 0, 49, 0, 0, 0, 11, 64, 98, 97,115,105, 99, 46,108,117, 97, 0, 0, - 0, 0,163, 9, 1, 60, 50, 15, 2, 60, 51, 15, 3, 25, 2, 60, 52, 15, 4, 13, - 0, 7, 1, 7, 1, 2, 1, 3, 11, 5, 32, 52, 24, 60, 53, 15, 6, 11, 7, 15, - 4, 13, 0, 7, 2, 2, 1, 2, 42, 11, 8, 42, 2, 0, 1, 50, 19, 60, 55, 15, - 6, 11, 9, 13, 0, 42, 11, 8, 42, 2, 0, 1, 60, 57, 1, 2, 60, 59, 15, 10, - 52, 73, 60, 60, 15, 12, 15, 10, 11, 13, 2, 3, 2, 60, 61, 13, 4, 4, 0, 32, - 52, 4, 15, 10, 23, 4, 60, 62, 15, 14, 13, 4, 11, 15, 11, 16, 2, 1, 3, 23, - 4, 60, 63, 15, 14, 13, 4, 11, 17, 11, 18, 2, 1, 3, 23, 4, 60, 64, 15, 6, - 11, 19, 13, 4, 42, 11, 20, 42, 2, 0, 1, 5, 3, 50, 2, 60, 65, 60, 66, 13, - 1, 25, 2, 60, 67, 0, 0, 0, 0, 8, 0, 0, 0, 49, 0, 0, 0, 2,115, 0, - 0, 0, 0, 50, 0, 0, 0, 4,111,117,116, 0, 0, 0, 0, 60, 0, 0, 0, 2, - 95, 0, 0, 0, 0, 60, 0, 0, 0, 2, 95, 0, 0, 0, 0, 60, 0, 0, 0, 2, -115, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, - 0, 64, 0, 0, 0, 0, 0, 0, 0, 21, 2, 0, 0, 0, 2,115, 0, 2, 0, 0, - 0, 4,111,117,116, 0, 2, 0, 0, 0, 8, 95, 79, 85, 84, 80, 85, 84, 0, 2, - 0, 0, 0, 8, 95, 83, 84, 68, 69, 82, 82, 0, 2, 0, 0, 0, 7,115,116,114, -115,117, 98, 0, 2, 0, 0, 0, 2, 35, 0, 2, 0, 0, 0, 6,119,114,105,116, -101, 0, 2, 0, 0, 0, 12, 10, 42, 42, 32,116,111,108,117, 97, 58, 32, 0, 2, - 0, 0, 0, 4, 46, 10, 10, 0, 2, 0, 0, 0, 27, 10, 42, 42, 32,116,111,108, -117, 97, 32,105,110,116,101,114,110, 97,108, 32,101,114,114,111,114, 58, 32, 0, - 2, 0, 0, 0, 11, 95, 99,117,114,114, 95, 99,111,100,101, 0, 2, 0, 0, 0, - 2, 95, 0, 2, 0, 0, 0, 8,115,116,114,102,105,110,100, 0, 2, 0, 0, 0, - 10, 94, 37,115, 42, 40, 46, 45, 10, 41, 0, 2, 0, 0, 0, 5,103,115,117, 98, - 0, 2, 0, 0, 0, 10, 95,117,115,101,114,100, 97,116, 97, 0, 2, 0, 0, 0, - 6,118,111,105,100, 42, 0, 2, 0, 0, 0, 9, 95, 99,115,116,114,105,110,103, - 0, 2, 0, 0, 0, 6, 99,104, 97,114, 42, 0, 2, 0, 0, 0, 23, 67,111,100, -101, 32, 98,101,105,110,103, 32,112,114,111, 99,101,115,115,101,100, 58, 10, 0, - 2, 0, 0, 0, 2, 10, 0, 2, 0, 0, 0, 15,115,101,116,101,114,114,111,114, -109,101,116,104,111,100, 0, 2, 0, 0, 0, 8,114,101,103,116,121,112,101, 0, - 4, 0, 0, 0, 72, 0, 0, 0, 11, 64, 98, 97,115,105, 99, 46,108,117, 97, 0, - 0, 0, 0, 36, 4, 1, 60, 73, 15, 1, 13, 0, 2, 1, 1, 44, 52, 11, 60, 74, - 15, 2, 13, 0, 13, 0, 26, 50, 2, 60, 75, 60, 76, 13, 0, 1, 1, 60, 77, 0, - 0, 0, 0, 1, 0, 0, 0, 72, 0, 0, 0, 2,116, 0, 0, 0, 0, 3, 2, 0, - 0, 0, 2,116, 0, 2, 0, 0, 0, 7,105,115,116,121,112,101, 0, 2, 0, 0, - 0, 10, 95,117,115,101,114,116,121,112,101, 0, 2, 0, 0, 0, 10, 95,116, 97, -103,110, 97,109,101,115, 0, 2, 0, 0, 0, 8,100,101, 99,108,116, 97,103, 0, - 4, 0, 0, 0, 81, 0, 0, 0, 11, 64, 98, 97,115,105, 99, 46,108,117, 97, 0, - 0, 0, 0, 67, 5, 2, 60, 82, 13, 0, 11, 2, 31, 48, 5, 13, 1, 7, 0, 31, - 48, 8, 15, 3, 13, 0, 2, 1, 1, 44, 48, 6, 15, 4, 13, 1, 16, 44, 52, 26, - 60, 83, 15, 4, 13, 1, 13, 0, 26, 60, 84, 15, 5, 11, 6, 13, 1, 42, 11, 7, - 42, 2, 0, 1, 50, 2, 60, 85, 60, 86, 0, 0, 0, 0, 2, 0, 0, 0, 81, 0, - 0, 0, 6,105,116,121,112,101, 0, 0, 0, 0, 81, 0, 0, 0, 4,116, 97,103, - 0, 0, 0, 0, 8, 2, 0, 0, 0, 6,105,116,121,112,101, 0, 2, 0, 0, 0, - 4,116, 97,103, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 8,105,115, 98, 97, -115,105, 99, 0, 2, 0, 0, 0, 10, 95,116, 97,103,110, 97,109,101,115, 0, 2, - 0, 0, 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 12,115,116, 97,116, -105, 99, 32,105,110,116, 32, 0, 2, 0, 0, 0, 2, 59, 0, 2, 0, 0, 0, 7, -116, 97,103,118, 97,114, 0, 4, 0, 0, 0, 89, 0, 0, 0, 11, 64, 98, 97,115, -105, 99, 46,108,117, 97, 0, 0, 0, 0,155, 8, 2, 60, 90, 13, 0, 11, 2, 32, - 46, 5, 13, 0, 11, 3, 32, 52, 10, 60, 91, 13, 0, 7, 0, 1, 2, 50,124, 60, - 92, 15, 4, 13, 0, 2, 1, 1, 52, 18, 60, 93, 13, 0, 11, 5, 15, 4, 13, 0, - 2, 1, 1, 42, 1, 2, 50, 95, 60, 95, 15, 8, 13, 0, 2, 2, 1, 60, 96, 15, - 9, 13, 2, 11, 1, 2, 1, 2, 52, 4, 11, 1, 23, 1, 60, 97, 13, 3, 23, 0, - 60, 98, 15, 10, 13, 3, 2, 0, 1, 60, 99, 11, 5, 60,100, 13, 1, 48, 5, 13, - 1, 11, 2, 31, 52, 20, 60,101, 11, 12, 13, 3, 42, 23, 3, 60,102, 13, 4, 11, - 13, 42, 23, 4, 50, 2, 60,103, 60,104, 13, 3, 13, 4, 13, 0, 42, 1, 5, 5, - 3, 60,105, 60,106, 0, 0, 0, 0, 8, 0, 0, 0, 89, 0, 0, 0, 5,116,121, -112,101, 0, 0, 0, 0, 89, 0, 0, 0, 6, 99,111,110,115,116, 0, 0, 0, 0, - 95, 0, 0, 0, 2,109, 0, 0, 0, 0, 95, 0, 0, 0, 2,116, 0, 0, 0, 0, - 99, 0, 0, 0, 2,118, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,104, 0, - 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0, 14, 2, 0, 0, 0, 5, -116,121,112,101, 0, 2, 0, 0, 0, 6, 99,111,110,115,116, 0, 2, 0, 0, 0, - 1, 0, 2, 0, 0, 0, 5,118,111,105,100, 0, 2, 0, 0, 0, 8,105,115, 98, - 97,115,105, 99, 0, 2, 0, 0, 0, 11,116,111,108,117, 97, 95,116, 97,103, 95, - 0, 2, 0, 0, 0, 2,109, 0, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 12, -102,105,110,100,116,121,112,101,100,101,102, 0, 2, 0, 0, 0, 8,115,116,114, -102,105,110,100, 0, 2, 0, 0, 0, 8,114,101,103,116,121,112,101, 0, 2, 0, - 0, 0, 2,118, 0, 2, 0, 0, 0, 7, 99,111,110,115,116, 32, 0, 2, 0, 0, - 0, 7, 99,111,110,115,116, 95, 0, 2, 0, 0, 0, 8,105,115, 98, 97,115,105, - 99, 0, 4, 0, 0, 0,109, 0, 0, 0, 11, 64, 98, 97,115,105, 99, 46,108,117, - 97, 0, 0, 0, 0, 23, 5, 1, 60,110, 15, 3, 13, 0, 2, 2, 1, 60,111, 15, - 4, 13, 2, 16, 1, 3, 60,112, 0, 0, 0, 0, 3, 0, 0, 0,109, 0, 0, 0, - 5,116,121,112,101, 0, 0, 0, 0,110, 0, 0, 0, 2,109, 0, 0, 0, 0,110, - 0, 0, 0, 2,116, 0, 0, 0, 0, 5, 2, 0, 0, 0, 5,116,121,112,101, 0, - 2, 0, 0, 0, 2,109, 0, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 12,102, -105,110,100,116,121,112,101,100,101,102, 0, 2, 0, 0, 0, 7, 95, 98, 97,115, -105, 99, 0, 2, 0, 0, 0, 7,105,115,116,121,112,101, 0, 4, 0, 0, 0,115, - 0, 0, 0, 11, 64, 98, 97,115,105, 99, 46,108,117, 97, 0, 0, 0, 0, 30, 3, - 1, 60,116, 15, 1, 13, 0, 16, 46, 5, 15, 2, 13, 0, 16, 46, 7, 15, 3, 13, - 0, 2, 1, 1, 1, 1, 60,117, 0, 0, 0, 0, 1, 0, 0, 0,115, 0, 0, 0, - 2,116, 0, 0, 0, 0, 4, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 7, 95, - 98, 97,115,105, 99, 0, 2, 0, 0, 0, 10, 95,117,115,101,114,116,121,112,101, - 0, 2, 0, 0, 0, 10,105,115,116,121,112,101,100,101,102, 0, 2, 0, 0, 0, - 6,115,112,108,105,116, 0, 4, 0, 0, 0,121, 0, 0, 0, 11, 64, 98, 97,115, -105, 99, 46,108,117, 97, 0, 0, 0, 0,117, 11, 2, 60,122, 22, 1, 11, 3, 7, - 0, 30, 0, 60,123, 13, 2, 58, 5, 1, 60,127, 11, 7, 13, 1, 42, 11, 8, 42, - 60,128, 15, 9, 13, 0, 11, 10, 11, 11, 2, 1, 3, 23, 0, 60,129, 15, 9, 13, - 0, 11, 12, 11, 11, 2, 1, 3, 23, 0, 60,130, 15, 9, 13, 0, 13, 4, 13, 3, - 2, 1, 3, 23, 0, 60,131, 13, 2, 11, 14, 13, 2, 18, 14, 7, 1, 37, 26, 60, -132, 13, 2, 13, 2, 18, 14, 15, 9, 13, 0, 11, 15, 11, 11, 2, 1, 3, 26, 60, -133, 13, 2, 1, 5, 60,134, 0, 0, 0, 0, 5, 0, 0, 0,121, 0, 0, 0, 2, -115, 0, 0, 0, 0,121, 0, 0, 0, 2,116, 0, 0, 0, 0,122, 0, 0, 0, 2, -108, 0, 0, 0, 0,123, 0, 0, 0, 2,102, 0, 0, 0, 0,127, 0, 0, 0, 2, -112, 0, 0, 0, 0, 16, 2, 0, 0, 0, 2,115, 0, 2, 0, 0, 0, 2,116, 0, - 2, 0, 0, 0, 2,108, 0, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 2,102, - 0, 4, 0, 0, 0,123, 0, 0, 0, 11, 64, 98, 97,115,105, 99, 46,108,117, 97, - 0, 0, 0, 0, 30, 5, 1, 60,124, 12, 0, 11, 2, 12, 0, 18, 2, 7, 1, 37, - 26, 60,125, 12, 0, 12, 0, 18, 2, 13, 0, 26, 60,126, 0, 0, 0, 0, 1, 0, - 0, 0,123, 0, 0, 0, 2,115, 0, 0, 0, 0, 3, 2, 0, 0, 0, 2,115, 0, - 2, 0, 0, 0, 2,108, 0, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 2,112, - 0, 2, 0, 0, 0, 11, 37,115, 42, 40, 46, 45, 41, 37,115, 42, 0, 2, 0, 0, - 0, 4, 37,115, 42, 0, 2, 0, 0, 0, 5,103,115,117, 98, 0, 2, 0, 0, 0, - 5, 94, 37,115, 43, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 5, 37,115, 43, - 36, 0, 2, 0, 0, 0, 2,108, 0, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, - 9, 40, 37,115, 37,115, 42, 41, 36, 0, 2, 0, 0, 0, 7, 99,111,110, 99, 97, -116, 0, 4, 0, 0, 0,138, 0, 0, 0, 11, 64, 98, 97,115,105, 99, 46,108,117, - 97, 0, 0, 0, 0, 69, 8, 3, 60,139, 11, 4, 60,140, 13, 1, 50, 39, 60,142, - 13, 3, 13, 0, 13, 4, 16, 42, 23, 3, 60,143, 13, 4, 7, 1, 37, 23, 4, 60, -144, 13, 4, 13, 2, 34, 52, 7, 13, 3, 11, 6, 42, 23, 3, 60,145, 60,141, 13, - 4, 13, 2, 34, 54, 48, 60,146, 13, 3, 1, 5, 60,147, 0, 0, 0, 0, 5, 0, - 0, 0,138, 0, 0, 0, 2,116, 0, 0, 0, 0,138, 0, 0, 0, 2,102, 0, 0, - 0, 0,138, 0, 0, 0, 2,108, 0, 0, 0, 0,139, 0, 0, 0, 2,115, 0, 0, - 0, 0,140, 0, 0, 0, 2,105, 0, 0, 0, 0, 7, 2, 0, 0, 0, 2,116, 0, - 2, 0, 0, 0, 2,102, 0, 2, 0, 0, 0, 2,108, 0, 2, 0, 0, 0, 2,115, - 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 2,105, 0, 2, 0, 0, 0, 2, 32, - 0, 2, 0, 0, 0, 7,111,117,116,112,117,116, 0, 4, 0, 0, 0,150, 0, 0, - 0, 11, 64, 98, 97,115,105, 99, 46,108,117, 97, 0, 0, 0, 0,161, 6,128, 60, -151, 7, 1, 50,104, 60,153, 15, 3, 48, 10, 15, 4, 15, 3, 11, 5, 2, 1, 2, - 44, 48, 14, 60,154, 15, 4, 13, 0, 13, 1, 16, 11, 6, 2, 1, 2, 52, 11, 60, -155, 15, 7, 11, 8, 2, 0, 1, 50, 2, 60,156, 60,157, 15, 7, 13, 0, 13, 1, - 16, 2, 0, 1, 60,158, 13, 0, 13, 1, 16, 11, 9, 31, 52, 20, 60,159, 15, 10, - 13, 0, 13, 1, 16, 9, 1, 9, 1, 2, 1, 3, 25, 3, 50, 2, 60,160, 60,161, - 13, 1, 7, 1, 37, 23, 1, 60,162, 60,152, 13, 1, 13, 0, 18, 2, 34, 54,115, - 60,163, 15, 4, 13, 0, 13, 0, 18, 2, 16, 11, 11, 2, 1, 2, 52, 15, 60,164, - 4, 0, 25, 3, 15, 7, 11, 12, 2, 0, 1, 50, 2, 60,165, 60,166, 0, 0, 0, - 0, 2, 0, 0, 0,150, 0, 0, 0, 4, 97,114,103, 0, 0, 0, 0,151, 0, 0, - 0, 2,105, 0, 0, 0, 0, 13, 2, 0, 0, 0, 2,105, 0, 2, 0, 0, 0, 4, - 97,114,103, 0, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 6, 95, 99,111,110, -116, 0, 2, 0, 0, 0, 8,115,116,114,102,105,110,100, 0, 2, 0, 0, 0, 7, - 91, 37, 40, 44, 34, 93, 0, 2, 0, 0, 0, 8, 94, 91, 37, 97, 95,126, 93, 0, - 2, 0, 0, 0, 6,119,114,105,116,101, 0, 2, 0, 0, 0, 2, 32, 0, 2, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 7,115,116,114,115,117, 98, 0, 2, 0, 0, 0, - 14, 91, 37, 47, 37, 41, 37, 59, 37,123, 37,125, 93, 36, 0, 2, 0, 0, 0, 2, - 10, 0, -}; - -/* feature.lo */ -static char B2[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 13, 64,102,101, 97,116,117, -114,101, 46,108,117, 97, 0, 0, 0, 0, 83, 3, 0, 60, 16, 22, 0, 60, 17, 25, - 0, 60, 20, 15, 0, 11, 1, 11, 2, 26, 60, 24, 15, 0, 11, 3, 11, 4, 26, 60, - 28, 15, 0, 11, 5, 11, 6, 26, 60, 32, 15, 0, 11, 7, 11, 8, 26, 60, 36, 15, - 0, 11, 9, 11, 10, 26, 60, 40, 15, 0, 11, 11, 11, 12, 26, 60, 49, 15, 0, 11, - 13, 11, 14, 26, 60, 59, 15, 0, 11, 15, 11, 16, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 2, 0, 0, 0, 13, 99,108, 97,115,115, 70,101, 97,116,117,114,101, 0, - 2, 0, 0, 0, 8,115,117,112, 99,111,100,101, 0, 4, 0, 0, 0, 20, 0, 0, - 0, 13, 64,102,101, 97,116,117,114,101, 46,108,117, 97, 0, 0, 0, 0, 5, 1, - 1, 60, 21, 0, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 5,115,101,108,102, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 8,100,101, 99,108,116, 97,103, 0, 4, 0, - 0, 0, 24, 0, 0, 0, 13, 64,102,101, 97,116,117,114,101, 46,108,117, 97, 0, - 0, 0, 0, 5, 1, 1, 60, 25, 0, 0, 0, 0, 1, 0, 0, 0, 24, 0, 0, 0, - 5,115,101,108,102, 0, 0, 0, 0, 0, 2, 0, 0, 0, 9,114,101,103,105,115, -116,101,114, 0, 4, 0, 0, 0, 28, 0, 0, 0, 13, 64,102,101, 97,116,117,114, -101, 46,108,117, 97, 0, 0, 0, 0, 5, 1, 1, 60, 29, 0, 0, 0, 0, 1, 0, - 0, 0, 28, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 11,117,110,114,101,103,105,115,116,101,114, 0, 4, 0, 0, 0, 32, 0, 0, 0, - 13, 64,102,101, 97,116,117,114,101, 46,108,117, 97, 0, 0, 0, 0, 5, 1, 1, - 60, 33, 0, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 5,115,101,108,102, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 9,112,114,101, 97,109, 98,108,101, 0, 4, 0, - 0, 0, 36, 0, 0, 0, 13, 64,102,101, 97,116,117,114,101, 46,108,117, 97, 0, - 0, 0, 0, 5, 1, 1, 60, 37, 0, 0, 0, 0, 1, 0, 0, 0, 36, 0, 0, 0, - 5,115,101,108,102, 0, 0, 0, 0, 0, 2, 0, 0, 0, 8,105,110, 99,108, 97, -115,115, 0, 4, 0, 0, 0, 40, 0, 0, 0, 13, 64,102,101, 97,116,117,114,101, - 46,108,117, 97, 0, 0, 0, 0, 44, 3, 1, 60, 41, 13, 0, 18, 1, 48, 9, 13, - 0, 18, 1, 18, 2, 11, 3, 32, 52, 12, 60, 42, 13, 0, 18, 1, 18, 4, 1, 1, - 50, 8, 60, 44, 4, 0, 1, 1, 60, 45, 60, 46, 0, 0, 0, 0, 1, 0, 0, 0, - 40, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 5, 2, 0, 0, 0, 5,115, -101,108,102, 0, 2, 0, 0, 0, 7,112, 97,114,101,110,116, 0, 2, 0, 0, 0, - 5,116,121,112,101, 0, 2, 0, 0, 0, 6, 99,108, 97,115,115, 0, 2, 0, 0, - 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 9,105,110,109,111,100,117,108,101, - 0, 4, 0, 0, 0, 49, 0, 0, 0, 13, 64,102,101, 97,116,117,114,101, 46,108, -117, 97, 0, 0, 0, 0, 44, 3, 1, 60, 50, 13, 0, 18, 1, 48, 9, 13, 0, 18, - 1, 18, 2, 11, 3, 32, 52, 12, 60, 51, 13, 0, 18, 1, 18, 4, 1, 1, 50, 8, - 60, 53, 4, 0, 1, 1, 60, 54, 60, 55, 0, 0, 0, 0, 1, 0, 0, 0, 49, 0, - 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 5, 2, 0, 0, 0, 5,115,101,108, -102, 0, 2, 0, 0, 0, 7,112, 97,114,101,110,116, 0, 2, 0, 0, 0, 5,116, -121,112,101, 0, 2, 0, 0, 0, 7,109,111,100,117,108,101, 0, 2, 0, 0, 0, - 5,110, 97,109,101, 0, 2, 0, 0, 0, 10, 99,102,117,110, 99,110, 97,109,101, - 0, 4, 0, 0, 0, 59, 0, 0, 0, 13, 64,102,101, 97,116,117,114,101, 46,108, -117, 97, 0, 0, 0, 0, 72, 5, 2, 60, 60, 13, 0, 18, 2, 52, 17, 60, 61, 13, - 0, 18, 2, 20, 3, 13, 1, 2, 1, 2, 23, 1, 50, 2, 60, 62, 60, 63, 13, 0, - 18, 4, 52, 16, 60, 64, 13, 1, 11, 5, 42, 13, 0, 18, 4, 42, 1, 2, 50, 16, - 60, 66, 13, 1, 11, 5, 42, 13, 0, 18, 6, 42, 1, 2, 60, 67, 60, 68, 0, 0, - 0, 0, 2, 0, 0, 0, 59, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 59, - 0, 0, 0, 2,110, 0, 0, 0, 0, 7, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, - 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 7,112, 97,114,101,110,116, 0, 2, - 0, 0, 0, 10, 99,102,117,110, 99,110, 97,109,101, 0, 2, 0, 0, 0, 6,108, -110, 97,109,101, 0, 2, 0, 0, 0, 2, 95, 0, 2, 0, 0, 0, 5,110, 97,109, -101, 0, -}; - -/* declaration.lo */ -static char B3[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 17, 64,100,101, 99,108, 97, -114, 97,116,105,111,110, 46,108,117, 97, 0, 0, 0, 0,193, 17, 0, 60, 24, 22, - 8, 60, 25, 11, 1, 15, 2, 11, 3, 60, 26, 11, 4, 11, 5, 60, 27, 11, 4, 11, - 6, 60, 28, 11, 4, 11, 7, 60, 29, 11, 4, 11, 8, 60, 30, 11, 4, 11, 9, 60, - 31, 11, 4, 11, 10, 60, 32, 11, 4, 30, 7, 60, 33, 25, 0, 60, 34, 15, 11, 15, - 0, 15, 12, 2, 0, 2, 60, 37, 11, 14, 25, 13, 60, 45, 15, 0, 11, 15, 11, 16, - 26, 60, 84, 15, 0, 11, 17, 11, 18, 26, 60,117, 15, 0, 11, 19, 11, 20, 26, 60, -130, 15, 0, 11, 21, 11, 22, 26, 60,136, 15, 0, 11, 23, 11, 24, 26, 60,149, 15, - 0, 11, 25, 11, 26, 26, 60,184, 15, 0, 11, 27, 11, 28, 26, 60,218, 15, 0, 11, - 29, 11, 30, 26, 60,250, 15, 0, 11, 31, 11, 32, 26, 59, 1, 1, 15, 0, 11, 33, - 11, 34, 26, 59, 1, 12, 15, 0, 11, 35, 11, 36, 26, 59, 1, 26, 11, 38, 25, 37, - 59, 1, 42, 11, 40, 25, 39, 0, 0, 0, 0, 0, 0, 0, 0, 41, 2, 0, 0, 0, - 17, 99,108, 97,115,115, 68,101, 99,108, 97,114, 97,116,105,111,110, 0, 2, 0, - 0, 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, 0, 13, 99,108, 97,115,115, 70, -101, 97,116,117,114,101, 0, 2, 0, 0, 0, 4,109,111,100, 0, 2, 0, 0, 0, - 1, 0, 2, 0, 0, 0, 5,116,121,112,101, 0, 2, 0, 0, 0, 4,112,116,114, - 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 4,100,105,109, 0, - 2, 0, 0, 0, 4,114,101,116, 0, 2, 0, 0, 0, 4,100,101,102, 0, 2, 0, - 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, 10,116,111,108,117, 97, - 95,116, 97,103, 0, 2, 0, 0, 0, 15, 99,114,101, 97,116,101, 95,118, 97,114, -110, 97,109,101, 0, 4, 0, 0, 0, 37, 0, 0, 0, 17, 64,100,101, 99,108, 97, -114, 97,116,105,111,110, 46,108,117, 97, 0, 0, 0, 0, 34, 2, 0, 60, 38, 15, - 0, 44, 52, 4, 7, 0, 25, 0, 60, 39, 15, 0, 7, 1, 37, 25, 0, 60, 40, 11, - 1, 15, 0, 42, 1, 0, 60, 41, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, - 0, 11, 95,118, 97,114,110,117,109, 98,101,114, 0, 2, 0, 0, 0, 11,116,111, -108,117, 97, 95,118, 97,114, 95, 0, 2, 0, 0, 0, 10, 99,104,101, 99,107,110, - 97,109,101, 0, 4, 0, 0, 0, 45, 0, 0, 0, 17, 64,100,101, 99,108, 97,114, - 97,116,105,111,110, 46,108,117, 97, 0, 0, 0, 1,140, 12, 1, 60, 47, 15, 0, - 13, 0, 18, 2, 7, 1, 7, 1, 2, 1, 3, 11, 3, 32, 48, 10, 15, 4, 13, 0, - 18, 5, 2, 1, 1, 44, 52, 70, 60, 48, 13, 0, 11, 2, 13, 0, 18, 5, 13, 0, - 18, 2, 42, 26, 60, 49, 15, 7, 13, 0, 18, 8, 11, 9, 2, 1, 2, 60, 50, 13, - 0, 11, 5, 13, 1, 13, 1, 18, 10, 16, 26, 60, 51, 13, 0, 11, 8, 15, 11, 13, - 1, 7, 1, 13, 1, 18, 10, 7, 1, 38, 2, 1, 3, 26, 5, 1, 50, 2, 60, 52, - 60, 54, 15, 7, 13, 0, 18, 2, 11, 13, 2, 1, 2, 60, 55, 13, 1, 18, 10, 7, - 2, 32, 52, 28, 60, 56, 13, 0, 11, 2, 13, 1, 7, 1, 16, 26, 60, 57, 13, 0, - 11, 14, 13, 1, 13, 1, 18, 10, 16, 26, 50, 2, 60, 58, 60, 60, 15, 18, 13, 0, - 18, 2, 11, 19, 2, 3, 2, 60, 61, 13, 2, 52, 34, 60, 62, 13, 0, 11, 2, 15, - 0, 13, 0, 18, 2, 7, 1, 13, 2, 7, 1, 38, 2, 1, 3, 26, 60, 63, 13, 0, - 11, 20, 13, 4, 26, 50, 2, 60, 64, 60, 67, 13, 0, 18, 5, 11, 21, 31, 48, 7, - 13, 0, 18, 5, 11, 22, 31, 48, 7, 13, 0, 18, 2, 11, 21, 32, 52, 14, 60, 68, - 13, 0, 11, 2, 15, 23, 2, 1, 0, 26, 50,135, 60, 69, 13, 0, 18, 24, 11, 25, - 32, 52,122, 60, 70, 13, 0, 18, 5, 11, 21, 32, 48, 7, 13, 0, 18, 2, 11, 21, - 31, 52, 30, 60, 71, 13, 0, 11, 5, 13, 0, 18, 5, 13, 0, 18, 2, 42, 26, 60, - 72, 13, 0, 11, 2, 15, 23, 2, 1, 0, 26, 50, 70, 60, 73, 15, 4, 13, 0, 18, - 2, 2, 1, 1, 52, 55, 60, 74, 13, 0, 18, 5, 11, 21, 32, 52, 11, 13, 0, 11, - 5, 13, 0, 18, 2, 26, 50, 19, 60, 75, 13, 0, 11, 5, 13, 0, 18, 5, 11, 26, - 42, 13, 0, 18, 2, 42, 26, 60, 76, 13, 0, 11, 2, 15, 23, 2, 1, 0, 26, 50, - 2, 60, 77, 50, 2, 60, 78, 60, 80, 0, 0, 0, 0, 7, 0, 0, 0, 45, 0, 0, - 0, 5,115,101,108,102, 0, 0, 0, 0, 49, 0, 0, 0, 2,109, 0, 0, 0, 0, - 51, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 2,116, 0, 0, 0, 0, 60, 0, - 0, 0, 2, 98, 0, 0, 0, 0, 60, 0, 0, 0, 2,101, 0, 0, 0, 0, 60, 0, - 0, 0, 2,100, 0, 0, 0, 0, 27, 2, 0, 0, 0, 7,115,116,114,115,117, 98, - 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 5,110, 97,109,101, - 0, 2, 0, 0, 0, 2, 91, 0, 2, 0, 0, 0, 7,105,115,116,121,112,101, 0, - 2, 0, 0, 0, 5,116,121,112,101, 0, 2, 0, 0, 0, 2,109, 0, 2, 0, 0, - 0, 6,115,112,108,105,116, 0, 2, 0, 0, 0, 4,109,111,100, 0, 2, 0, 0, - 0, 6, 37,115, 37,115, 42, 0, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 7, - 99,111,110, 99, 97,116, 0, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 2, 61, - 0, 2, 0, 0, 0, 4,100,101,102, 0, 2, 0, 0, 0, 2, 98, 0, 2, 0, 0, - 0, 2,101, 0, 2, 0, 0, 0, 2,100, 0, 2, 0, 0, 0, 8,115,116,114,102, -105,110,100, 0, 2, 0, 0, 0, 9, 37, 91, 40, 46, 45, 41, 37, 93, 0, 2, 0, - 0, 0, 4,100,105,109, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 5,118,111, -105,100, 0, 2, 0, 0, 0, 15, 99,114,101, 97,116,101, 95,118, 97,114,110, 97, -109,101, 0, 2, 0, 0, 0, 5,107,105,110,100, 0, 2, 0, 0, 0, 4,118, 97, -114, 0, 2, 0, 0, 0, 2, 32, 0, 2, 0, 0, 0, 10, 99,104,101, 99,107,116, -121,112,101, 0, 4, 0, 0, 0, 84, 0, 0, 0, 17, 64,100,101, 99,108, 97,114, - 97,116,105,111,110, 46,108,117, 97, 0, 0, 0, 0,152, 4, 1, 60, 87, 15, 0, - 13, 0, 18, 2, 2, 1, 1, 48, 7, 13, 0, 18, 3, 11, 4, 31, 52, 22, 60, 88, - 13, 0, 11, 5, 13, 0, 18, 3, 26, 60, 89, 13, 0, 11, 3, 4, 0, 26, 50, 2, - 60, 90, 60, 93, 13, 0, 18, 6, 11, 4, 31, 48, 7, 13, 0, 18, 5, 11, 4, 31, - 52, 11, 60, 94, 15, 7, 11, 8, 2, 0, 1, 50, 2, 60, 95, 60, 98, 13, 0, 18, - 2, 11, 4, 31, 52, 13, 60, 99, 15, 9, 13, 0, 18, 2, 2, 0, 1, 50, 2, 60, -100, 60,103, 13, 0, 18, 2, 11, 10, 32, 52, 9, 13, 0, 11, 2, 11, 11, 26, 50, - 22, 60,104, 13, 0, 18, 2, 11, 12, 32, 52, 9, 13, 0, 11, 2, 11, 13, 26, 50, - 2, 60,105, 60,114, 0, 0, 0, 0, 1, 0, 0, 0, 84, 0, 0, 0, 5,115,101, -108,102, 0, 0, 0, 0, 14, 2, 0, 0, 0, 8,105,115, 98, 97,115,105, 99, 0, - 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 5,116,121,112,101, 0, - 2, 0, 0, 0, 4,112,116,114, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 4, -114,101,116, 0, 2, 0, 0, 0, 4,100,105,109, 0, 2, 0, 0, 0, 6,101,114, -114,111,114, 0, 2, 0, 0, 0, 53, 35,105,110,118, 97,108,105,100, 32,112, 97, -114, 97,109,101,116,101,114, 58, 32, 99, 97,110,110,111,116, 32,114,101,116,117, -114,110, 32, 97,110, 32, 97,114,114, 97,121, 32,111,102, 32,118, 97,108,117,101, -115, 0, 2, 0, 0, 0, 8,114,101,103,116,121,112,101, 0, 2, 0, 0, 0, 10, - 95,117,115,101,114,100, 97,116, 97, 0, 2, 0, 0, 0, 6,118,111,105,100, 42, - 0, 2, 0, 0, 0, 9, 95, 99,115,116,114,105,110,103, 0, 2, 0, 0, 0, 6, - 99,104, 97,114, 42, 0, 2, 0, 0, 0, 6,112,114,105,110,116, 0, 4, 0, 0, - 0,117, 0, 0, 0, 17, 64,100,101, 99,108, 97,114, 97,116,105,111,110, 46,108, -117, 97, 0, 0, 0, 0,172, 6, 3, 60,118, 15, 2, 13, 1, 11, 3, 42, 2, 0, - 1, 60,119, 15, 2, 13, 1, 11, 4, 42, 13, 0, 18, 6, 42, 11, 7, 42, 2, 0, - 1, 60,120, 15, 2, 13, 1, 11, 8, 42, 13, 0, 18, 9, 42, 11, 7, 42, 2, 0, - 1, 60,121, 15, 2, 13, 1, 11, 10, 42, 13, 0, 18, 11, 42, 11, 7, 42, 2, 0, - 1, 60,122, 15, 2, 13, 1, 11, 12, 42, 13, 0, 18, 13, 42, 11, 7, 42, 2, 0, - 1, 60,123, 15, 2, 13, 1, 11, 14, 42, 13, 0, 18, 15, 42, 11, 7, 42, 2, 0, - 1, 60,124, 15, 2, 13, 1, 11, 16, 42, 13, 0, 18, 17, 42, 11, 7, 42, 2, 0, - 1, 60,125, 15, 2, 13, 1, 11, 18, 42, 13, 0, 18, 19, 42, 11, 7, 42, 2, 0, - 1, 60,126, 15, 2, 13, 1, 11, 20, 42, 13, 2, 42, 2, 0, 1, 60,127, 0, 0, - 0, 0, 3, 0, 0, 0,117, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0,117, - 0, 0, 0, 6,105,100,101,110,116, 0, 0, 0, 0,117, 0, 0, 0, 6, 99,108, -111,115,101, 0, 0, 0, 0, 21, 2, 0, 0, 0, 6,105,100,101,110,116, 0, 2, - 0, 0, 0, 6, 99,108,111,115,101, 0, 2, 0, 0, 0, 6,112,114,105,110,116, - 0, 2, 0, 0, 0, 13, 68,101, 99,108, 97,114, 97,116,105,111,110,123, 0, 2, - 0, 0, 0, 10, 32,109,111,100, 32, 32, 61, 32, 39, 0, 2, 0, 0, 0, 5,115, -101,108,102, 0, 2, 0, 0, 0, 4,109,111,100, 0, 2, 0, 0, 0, 3, 39, 44, - 0, 2, 0, 0, 0, 10, 32,116,121,112,101, 32, 61, 32, 39, 0, 2, 0, 0, 0, - 5,116,121,112,101, 0, 2, 0, 0, 0, 10, 32,112,116,114, 32, 32, 61, 32, 39, - 0, 2, 0, 0, 0, 4,112,116,114, 0, 2, 0, 0, 0, 10, 32,110, 97,109,101, - 32, 61, 32, 39, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 10, - 32,100,105,109, 32, 32, 61, 32, 39, 0, 2, 0, 0, 0, 4,100,105,109, 0, 2, - 0, 0, 0, 10, 32,100,101,102, 32, 32, 61, 32, 39, 0, 2, 0, 0, 0, 4,100, -101,102, 0, 2, 0, 0, 0, 10, 32,114,101,116, 32, 32, 61, 32, 39, 0, 2, 0, - 0, 0, 4,114,101,116, 0, 2, 0, 0, 0, 2,125, 0, 2, 0, 0, 0, 8,100, -101, 99,108,116, 97,103, 0, 4, 0, 0, 0,130, 0, 0, 0, 17, 64,100,101, 99, -108, 97,114, 97,116,105,111,110, 46,108,117, 97, 0, 0, 0, 0, 56, 10, 1, 60, -131, 13, 0, 11, 1, 13, 0, 11, 2, 15, 3, 13, 0, 18, 4, 15, 5, 13, 0, 18, - 6, 11, 7, 2, 1, 2, 2, 2, 2, 27, 1, 27, 2, 5, 4, 60,132, 15, 8, 13, - 0, 18, 1, 13, 0, 18, 2, 2, 0, 2, 60,133, 0, 0, 0, 0, 1, 0, 0, 0, -130, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 9, 2, 0, 0, 0, 5,115, -101,108,102, 0, 2, 0, 0, 0, 6,105,116,121,112,101, 0, 2, 0, 0, 0, 4, -116, 97,103, 0, 2, 0, 0, 0, 7,116, 97,103,118, 97,114, 0, 2, 0, 0, 0, - 5,116,121,112,101, 0, 2, 0, 0, 0, 8,115,116,114,102,105,110,100, 0, 2, - 0, 0, 0, 4,109,111,100, 0, 2, 0, 0, 0, 6, 99,111,110,115,116, 0, 2, - 0, 0, 0, 8,100,101, 99,108,116, 97,103, 0, 2, 0, 0, 0, 13,111,117,116, - 99,104,101, 99,107,116,121,112,101, 0, 4, 0, 0, 0,136, 0, 0, 0, 17, 64, -100,101, 99,108, 97,114, 97,116,105,111,110, 46,108,117, 97, 0, 0, 0, 0, 83, - 6, 2, 60,137, 4, 1, 60,138, 13, 0, 18, 4, 11, 5, 31, 52, 14, 60,139, 11, - 6, 23, 2, 60,140, 7, 0, 23, 3, 50, 25, 60,142, 13, 0, 18, 1, 23, 2, 60, -143, 13, 0, 18, 2, 11, 5, 31, 46, 2, 7, 0, 23, 3, 60,144, 60,145, 11, 7, - 13, 1, 42, 11, 8, 42, 13, 2, 42, 11, 8, 42, 13, 3, 42, 11, 9, 42, 1, 4, - 60,146, 0, 0, 0, 0, 4, 0, 0, 0,136, 0, 0, 0, 5,115,101,108,102, 0, - 0, 0, 0,136, 0, 0, 0, 5,110, 97,114,103, 0, 0, 0, 0,137, 0, 0, 0, - 4,116, 97,103, 0, 0, 0, 0,137, 0, 0, 0, 4,100,101,102, 0, 0, 0, 0, - 10, 2, 0, 0, 0, 5,110, 97,114,103, 0, 2, 0, 0, 0, 4,116, 97,103, 0, - 2, 0, 0, 0, 4,100,101,102, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, - 0, 0, 0, 4,100,105,109, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 16,116, -111,108,117, 97, 95,116, 97,103, 95,116, 97, 98,108,101, 0, 2, 0, 0, 0, 14, -116,111,108,117, 97, 95,105,115,116,121,112,101, 40, 0, 2, 0, 0, 0, 2, 44, - 0, 2, 0, 0, 0, 2, 41, 0, 2, 0, 0, 0, 8,100,101, 99,108, 97,114,101, - 0, 4, 0, 0, 0,149, 0, 0, 0, 17, 64,100,101, 99,108, 97,114, 97,116,105, -111,110, 46,108,117, 97, 0, 0, 0, 1, 84, 15, 2, 60,150, 11, 2, 60,151, 13, - 0, 18, 1, 11, 2, 31, 52, 4, 11, 4, 23, 2, 60,152, 15, 5, 11, 6, 13, 0, - 18, 7, 13, 0, 18, 8, 13, 2, 2, 0, 4, 60,153, 13, 0, 18, 9, 11, 2, 31, - 48, 12, 15, 10, 13, 0, 18, 9, 2, 1, 1, 4, 0, 32, 52, 11, 60,154, 15, 5, - 11, 4, 2, 0, 1, 50, 2, 60,155, 60,156, 15, 5, 13, 0, 18, 11, 2, 0, 1, - 60,157, 13, 0, 18, 9, 11, 2, 31, 52, 76, 60,158, 15, 10, 13, 0, 18, 9, 2, - 1, 1, 4, 0, 31, 52, 17, 60,159, 15, 5, 11, 12, 13, 0, 18, 9, 11, 13, 2, - 0, 3, 50, 41, 60,161, 15, 5, 11, 14, 13, 0, 18, 7, 13, 0, 18, 8, 13, 2, - 11, 15, 60,162, 11, 16, 13, 0, 18, 9, 11, 17, 13, 0, 18, 8, 13, 2, 11, 18, - 2, 0, 11, 60,163, 50,161, 60,165, 15, 20, 13, 0, 18, 8, 2, 1, 1, 60,166, - 15, 5, 11, 21, 2, 0, 1, 60,167, 13, 3, 44, 48, 5, 13, 2, 11, 2, 32, 52, - 7, 15, 5, 11, 4, 2, 0, 1, 60,168, 15, 5, 11, 22, 13, 0, 18, 7, 13, 0, - 18, 8, 2, 0, 3, 60,169, 13, 3, 44, 52, 11, 60,170, 15, 5, 11, 4, 2, 0, - 1, 50, 2, 60,171, 60,172, 15, 5, 11, 23, 2, 0, 1, 60,173, 7, 0, 60,174, - 13, 0, 18, 24, 11, 2, 31, 52, 6, 13, 0, 18, 24, 23, 4, 60,175, 13, 3, 52, - 24, 60,176, 15, 5, 11, 25, 13, 3, 42, 11, 26, 13, 1, 11, 27, 13, 4, 11, 18, - 2, 0, 6, 50, 19, 60,178, 15, 5, 11, 28, 13, 1, 11, 27, 13, 4, 11, 18, 2, - 0, 5, 60,179, 5, 2, 60,180, 60,181, 0, 0, 0, 0, 7, 0, 0, 0,149, 0, - 0, 0, 5,115,101,108,102, 0, 0, 0, 0,149, 0, 0, 0, 5,110, 97,114,103, - 0, 0, 0, 0,150, 0, 0, 0, 4,112,116,114, 0, 0, 0, 0,165, 0, 0, 0, - 2,116, 0, 0, 0, 0,173, 0, 0, 0, 4,100,101,102, 0, 0, 0, 0,179, 0, - 0, 0, 0, 0, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 29, 2, 0, 0, 0, 5, -110, 97,114,103, 0, 2, 0, 0, 0, 4,112,116,114, 0, 2, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 2, 42, 0, 2, 0, 0, - 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 2, 32, 0, 2, 0, 0, 0, - 4,109,111,100, 0, 2, 0, 0, 0, 5,116,121,112,101, 0, 2, 0, 0, 0, 4, -100,105,109, 0, 2, 0, 0, 0, 9,116,111,110,117,109, 98,101,114, 0, 2, 0, - 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 2, 91, 0, 2, 0, 0, 0, 3, - 93, 59, 0, 2, 0, 0, 0, 5, 32, 61, 32, 40, 0, 2, 0, 0, 0, 3, 42, 41, - 0, 2, 0, 0, 0, 8,109, 97,108,108,111, 99, 40, 0, 2, 0, 0, 0, 9, 42, -115,105,122,101,111,102, 40, 0, 2, 0, 0, 0, 4, 41, 41, 59, 0, 2, 0, 0, - 0, 2,116, 0, 2, 0, 0, 0, 8,105,115, 98, 97,115,105, 99, 0, 2, 0, 0, - 0, 4, 32, 61, 32, 0, 2, 0, 0, 0, 3, 40, 40, 0, 2, 0, 0, 0, 3, 41, - 32, 0, 2, 0, 0, 0, 4,100,101,102, 0, 2, 0, 0, 0, 10,116,111,108,117, - 97, 95,103,101,116, 0, 2, 0, 0, 0, 2, 40, 0, 2, 0, 0, 0, 2, 44, 0, - 2, 0, 0, 0, 19,116,111,108,117, 97, 95,103,101,116,117,115,101,114,116,121, -112,101, 40, 0, 2, 0, 0, 0, 9,103,101,116, 97,114,114, 97,121, 0, 4, 0, - 0, 0,184, 0, 0, 0, 17, 64,100,101, 99,108, 97,114, 97,116,105,111,110, 46, -108,117, 97, 0, 0, 0, 1, 78, 13, 2, 60,185, 13, 0, 18, 2, 11, 3, 31, 51, - 1, 59, 60,186, 15, 4, 11, 5, 2, 0, 1, 60,187, 13, 0, 18, 6, 11, 3, 31, - 46, 2, 7, 0, 60,188, 15, 4, 11, 7, 13, 1, 11, 8, 13, 0, 18, 9, 11, 8, - 13, 0, 18, 2, 11, 8, 13, 2, 11, 10, 2, 0, 9, 60,189, 15, 4, 11, 11, 2, - 0, 1, 60,190, 15, 4, 11, 12, 2, 0, 1, 60,191, 15, 4, 11, 13, 2, 0, 1, - 60,192, 15, 4, 11, 14, 2, 0, 1, 60,193, 15, 4, 11, 15, 13, 1, 11, 16, 2, - 0, 3, 60,194, 15, 4, 11, 17, 13, 0, 18, 2, 42, 11, 18, 42, 2, 0, 1, 60, -195, 15, 20, 13, 0, 18, 21, 2, 1, 1, 60,196, 11, 3, 60,197, 13, 0, 18, 22, - 11, 3, 31, 52, 4, 11, 23, 23, 4, 60,198, 15, 4, 11, 24, 13, 0, 18, 25, 11, - 26, 42, 2, 0, 2, 60,199, 13, 3, 44, 48, 5, 13, 4, 11, 3, 32, 52, 7, 15, - 4, 11, 23, 2, 0, 1, 60,200, 15, 4, 11, 27, 13, 0, 18, 28, 13, 0, 18, 21, - 2, 0, 3, 60,201, 13, 3, 44, 52, 11, 60,202, 15, 4, 11, 23, 2, 0, 1, 50, - 2, 60,203, 60,204, 15, 4, 11, 29, 2, 0, 1, 60,205, 7, 0, 60,206, 13, 0, - 18, 6, 11, 3, 31, 52, 6, 13, 0, 18, 6, 23, 5, 60,207, 13, 3, 52, 21, 60, -208, 15, 4, 11, 30, 13, 3, 42, 11, 31, 42, 13, 5, 11, 32, 2, 0, 3, 50, 15, - 60,210, 15, 4, 11, 33, 13, 5, 11, 32, 2, 0, 3, 60,211, 60,212, 15, 4, 11, - 34, 2, 0, 1, 60,213, 15, 4, 11, 35, 2, 0, 1, 5, 4, 50, 2, 60,214, 60, -215, 0, 0, 0, 0, 10, 0, 0, 0,184, 0, 0, 0, 5,115,101,108,102, 0, 0, - 0, 0,184, 0, 0, 0, 5,110, 97,114,103, 0, 0, 0, 0,187, 0, 0, 0, 4, -100,101,102, 0, 0, 0, 0,195, 0, 0, 0, 2,116, 0, 0, 0, 0,196, 0, 0, - 0, 4,112,116,114, 0, 0, 0, 0,205, 0, 0, 0, 4,100,101,102, 0, 0, 0, - 0,213, 0, 0, 0, 0, 0, 0, 0,213, 0, 0, 0, 0, 0, 0, 0,213, 0, 0, - 0, 0, 0, 0, 0,213, 0, 0, 0, 0, 0, 0, 0, 36, 2, 0, 0, 0, 5,110, - 97,114,103, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 4,100, -105,109, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 7,111,117,116,112,117,116, - 0, 2, 0, 0, 0, 4, 32, 32,123, 0, 2, 0, 0, 0, 4,100,101,102, 0, 2, - 0, 0, 0, 27, 32, 32, 32,105,102, 32, 40, 33,116,111,108,117, 97, 95, 97,114, -114, 97,121,105,115,116,121,112,101, 40, 0, 2, 0, 0, 0, 2, 44, 0, 2, 0, - 0, 0, 4,116, 97,103, 0, 2, 0, 0, 0, 3, 41, 41, 0, 2, 0, 0, 0, 16, - 32, 32, 32, 32,103,111,116,111, 32,101,114,114,111,114, 59, 0, 2, 0, 0, 0, - 9, 32, 32, 32,101,108,115,101, 10, 0, 2, 0, 0, 0, 5, 32, 32, 32,123, 0, - 2, 0, 0, 0, 11, 32, 32, 32, 32,105,110,116, 32,105, 59, 0, 2, 0, 0, 0, - 34, 32, 32, 32, 32,108,117, 97, 95, 79, 98,106,101, 99,116, 32,108,111, 32, 61, - 32,108,117, 97, 95,103,101,116,112, 97,114, 97,109, 40, 0, 2, 0, 0, 0, 3, - 41, 59, 0, 2, 0, 0, 0, 16, 32, 32, 32, 32,102,111,114, 40,105, 61, 48, 59, - 32,105, 60, 0, 2, 0, 0, 0, 6, 59,105, 43, 43, 41, 0, 2, 0, 0, 0, 2, -116, 0, 2, 0, 0, 0, 8,105,115, 98, 97,115,105, 99, 0, 2, 0, 0, 0, 5, -116,121,112,101, 0, 2, 0, 0, 0, 4,112,116,114, 0, 2, 0, 0, 0, 2, 42, - 0, 2, 0, 0, 0, 4, 32, 32, 32, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, - 2, 0, 0, 0, 7, 91,105, 93, 32, 61, 32, 0, 2, 0, 0, 0, 3, 40, 40, 0, - 2, 0, 0, 0, 4,109,111,100, 0, 2, 0, 0, 0, 3, 41, 32, 0, 2, 0, 0, - 0, 15,116,111,108,117, 97, 95,103,101,116,102,105,101,108,100, 0, 2, 0, 0, - 0, 9, 40,108,111, 44,105, 43, 49, 44, 0, 2, 0, 0, 0, 4, 41, 41, 59, 0, - 2, 0, 0, 0, 31,116,111,108,117, 97, 95,103,101,116,102,105,101,108,100,117, -115,101,114,116,121,112,101, 40,108,111, 44,105, 43, 49, 44, 0, 2, 0, 0, 0, - 5, 32, 32, 32,125, 0, 2, 0, 0, 0, 4, 32, 32,125, 0, 2, 0, 0, 0, 9, -115,101,116, 97,114,114, 97,121, 0, 4, 0, 0, 0,218, 0, 0, 0, 17, 64,100, -101, 99,108, 97,114, 97,116,105,111,110, 46,108,117, 97, 0, 0, 0, 1, 42, 9, - 2, 60,219, 13, 0, 18, 2, 11, 3, 31, 51, 1, 23, 60,220, 15, 4, 11, 5, 2, - 0, 1, 60,221, 15, 4, 11, 6, 2, 0, 1, 60,222, 15, 4, 11, 7, 13, 1, 11, - 8, 2, 0, 3, 60,223, 15, 4, 11, 9, 13, 0, 18, 2, 42, 11, 10, 42, 2, 0, - 1, 60,224, 15, 12, 13, 0, 18, 13, 2, 1, 1, 60,225, 13, 2, 11, 14, 32, 52, - 23, 60,226, 15, 4, 11, 15, 13, 2, 42, 11, 16, 42, 13, 0, 18, 17, 11, 18, 2, - 0, 3, 50,175, 60,227, 13, 2, 52, 23, 60,228, 15, 4, 11, 15, 13, 2, 42, 11, - 19, 42, 13, 0, 18, 17, 11, 18, 2, 0, 3, 50,146, 60,230, 13, 0, 18, 20, 11, - 3, 32, 52,110, 60,231, 15, 4, 11, 21, 2, 0, 1, 60,232, 15, 4, 11, 22, 2, - 0, 1, 60,233, 15, 4, 11, 23, 13, 0, 18, 13, 11, 24, 13, 0, 18, 17, 11, 18, - 2, 0, 5, 60,234, 15, 4, 11, 25, 2, 0, 1, 60,235, 15, 4, 11, 26, 13, 0, - 18, 17, 11, 27, 13, 0, 18, 13, 11, 28, 2, 0, 5, 60,236, 15, 4, 11, 29, 2, - 0, 1, 60,237, 15, 4, 11, 30, 13, 0, 18, 31, 11, 32, 13, 0, 18, 31, 11, 8, - 2, 0, 5, 60,238, 15, 4, 11, 33, 2, 0, 1, 50, 23, 60,242, 15, 4, 11, 34, - 13, 0, 18, 17, 11, 35, 13, 0, 18, 31, 11, 8, 2, 0, 5, 60,243, 60,244, 60, -245, 15, 4, 11, 36, 2, 0, 1, 5, 1, 50, 2, 60,246, 60,247, 0, 0, 0, 0, - 4, 0, 0, 0,218, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0,218, 0, 0, - 0, 5,110, 97,114,103, 0, 0, 0, 0,224, 0, 0, 0, 2,116, 0, 0, 0, 0, -245, 0, 0, 0, 0, 0, 0, 0, 37, 2, 0, 0, 0, 5,110, 97,114,103, 0, 2, - 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 4,100,105,109, 0, 2, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, - 4, 32, 32,123, 0, 2, 0, 0, 0, 10, 32, 32, 32,105,110,116, 32,105, 59, 0, - 2, 0, 0, 0, 33, 32, 32, 32,108,117, 97, 95, 79, 98,106,101, 99,116, 32,108, -111, 32, 61, 32,108,117, 97, 95,103,101,116,112, 97,114, 97,109, 40, 0, 2, 0, - 0, 0, 3, 41, 59, 0, 2, 0, 0, 0, 15, 32, 32, 32,102,111,114, 40,105, 61, - 48, 59, 32,105, 60, 0, 2, 0, 0, 0, 6, 59,105, 43, 43, 41, 0, 2, 0, 0, - 0, 2,116, 0, 2, 0, 0, 0, 8,105,115, 98, 97,115,105, 99, 0, 2, 0, 0, - 0, 5,116,121,112,101, 0, 2, 0, 0, 0, 7,110,117,109, 98,101,114, 0, 2, - 0, 0, 0, 19, 32, 32, 32,116,111,108,117, 97, 95,112,117,115,104,102,105,101, -108,100, 0, 2, 0, 0, 0, 17, 40,108,111, 44,105, 43, 49, 44, 40,100,111,117, - 98,108,101, 41, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 6, - 91,105, 93, 41, 59, 0, 2, 0, 0, 0, 9, 40,108,111, 44,105, 43, 49, 44, 0, - 2, 0, 0, 0, 4,112,116,114, 0, 2, 0, 0, 0, 5, 32, 32, 32,123, 0, 2, - 0, 0, 0, 20, 35,105,102,100,101,102, 32, 95, 95, 99,112,108,117,115,112,108, -117,115, 10, 0, 2, 0, 0, 0, 29, 32, 32, 32, 32,118,111,105,100, 42, 32,116, -111,108,117, 97, 73, 95, 99,108,111,110,101, 32, 61, 32,110,101,119, 0, 2, 0, - 0, 0, 2, 40, 0, 2, 0, 0, 0, 7, 35,101,108,115,101, 10, 0, 2, 0, 0, - 0, 45, 32, 32, 32, 32,118,111,105,100, 42, 32,116,111,108,117, 97, 73, 95, 99, -108,111,110,101, 32, 61, 32,116,111,108,117, 97, 95, 99,111,112,121, 40, 40,118, -111,105,100, 42, 41, 38, 0, 2, 0, 0, 0, 12, 91,105, 93, 44,115,105,122,101, -111,102, 40, 0, 2, 0, 0, 0, 4, 41, 41, 59, 0, 2, 0, 0, 0, 8, 35,101, -110,100,105,102, 10, 0, 2, 0, 0, 0, 63, 32, 32, 32, 32,116,111,108,117, 97, - 95,112,117,115,104,102,105,101,108,100,117,115,101,114,116,121,112,101, 40,108, -111, 44,105, 43, 49, 44,116,111,108,117, 97, 95,100,111, 99,108,111,110,101, 40, -116,111,108,117, 97, 73, 95, 99,108,111,110,101, 44, 0, 2, 0, 0, 0, 4,116, - 97,103, 0, 2, 0, 0, 0, 3, 41, 44, 0, 2, 0, 0, 0, 5, 32, 32, 32,125, - 0, 2, 0, 0, 0, 42, 32, 32, 32,116,111,108,117, 97, 95,112,117,115,104,102, -105,101,108,100,117,115,101,114,116,121,112,101, 40,108,111, 44,105, 43, 49, 44, - 40,118,111,105,100, 42, 41, 0, 2, 0, 0, 0, 5, 91,105, 93, 44, 0, 2, 0, - 0, 0, 4, 32, 32,125, 0, 2, 0, 0, 0, 10,102,114,101,101, 97,114,114, 97, -121, 0, 4, 0, 0, 0,250, 0, 0, 0, 17, 64,100,101, 99,108, 97,114, 97,116, -105,111,110, 46,108,117, 97, 0, 0, 0, 0, 49, 5, 1, 60,251, 13, 0, 18, 1, - 11, 2, 31, 48, 12, 15, 3, 13, 0, 18, 1, 2, 1, 1, 4, 0, 32, 52, 17, 60, -252, 15, 4, 11, 5, 13, 0, 18, 6, 11, 7, 2, 0, 3, 50, 2, 60,253, 60,254, - 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, - 0, 8, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 4,100,105,109, - 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 9,116,111,110,117,109, 98,101,114, - 0, 2, 0, 0, 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 8, 32, 32, -102,114,101,101, 40, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, - 3, 41, 59, 0, 2, 0, 0, 0, 8,112, 97,115,115,112, 97,114, 0, 4, 0, 0, - 1, 1, 0, 0, 0, 17, 64,100,101, 99,108, 97,114, 97,116,105,111,110, 46,108, -117, 97, 0, 0, 0, 0, 79, 4, 1, 59, 1, 2, 13, 0, 18, 1, 11, 2, 32, 52, - 17, 59, 1, 3, 15, 3, 11, 4, 13, 0, 18, 5, 42, 2, 0, 1, 50, 44, 59, 1, - 4, 13, 0, 18, 6, 11, 4, 32, 52, 17, 59, 1, 5, 15, 3, 11, 2, 13, 0, 18, - 5, 42, 2, 0, 1, 50, 15, 59, 1, 7, 15, 3, 13, 0, 18, 5, 2, 0, 1, 59, - 1, 8, 59, 1, 9, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 5,115,101, -108,102, 0, 0, 0, 0, 7, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, - 0, 4,112,116,114, 0, 2, 0, 0, 0, 2, 38, 0, 2, 0, 0, 0, 7,111,117, -116,112,117,116, 0, 2, 0, 0, 0, 2, 42, 0, 2, 0, 0, 0, 5,110, 97,109, -101, 0, 2, 0, 0, 0, 4,114,101,116, 0, 2, 0, 0, 0, 9,114,101,116,118, - 97,108,117,101, 0, 4, 0, 0, 1, 12, 0, 0, 0, 17, 64,100,101, 99,108, 97, -114, 97,116,105,111,110, 46,108,117, 97, 0, 0, 0, 0,133, 6, 1, 59, 1, 13, - 13, 0, 18, 1, 11, 2, 31, 52,112, 59, 1, 14, 15, 4, 13, 0, 18, 5, 2, 1, - 1, 59, 1, 15, 13, 1, 11, 6, 32, 52, 26, 59, 1, 16, 15, 7, 11, 8, 13, 1, - 42, 11, 9, 42, 13, 0, 18, 10, 42, 11, 11, 42, 2, 0, 1, 50, 60, 59, 1, 17, - 13, 1, 52, 26, 59, 1, 18, 15, 7, 11, 8, 13, 1, 42, 11, 12, 42, 13, 0, 18, - 10, 42, 11, 11, 42, 2, 0, 1, 50, 27, 59, 1, 20, 15, 7, 11, 13, 13, 0, 18, - 10, 42, 11, 14, 42, 13, 0, 18, 15, 11, 11, 2, 0, 3, 59, 1, 21, 5, 1, 50, - 3, 59, 1, 22, 59, 1, 23, 0, 0, 0, 0, 3, 0, 0, 1, 12, 0, 0, 0, 5, -115,101,108,102, 0, 0, 0, 1, 14, 0, 0, 0, 2,116, 0, 0, 0, 1, 21, 0, - 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, - 0, 4,114,101,116, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 2,116, 0, 2, - 0, 0, 0, 8,105,115, 98, 97,115,105, 99, 0, 2, 0, 0, 0, 5,116,121,112, -101, 0, 2, 0, 0, 0, 7,110,117,109, 98,101,114, 0, 2, 0, 0, 0, 7,111, -117,116,112,117,116, 0, 2, 0, 0, 0, 14, 32, 32, 32,116,111,108,117, 97, 95, -112,117,115,104, 0, 2, 0, 0, 0, 10, 40, 40,100,111,117, 98,108,101, 41, 0, - 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 3, 41, 59, 0, 2, 0, - 0, 0, 2, 40, 0, 2, 0, 0, 0, 30, 32, 32, 32,116,111,108,117, 97, 95,112, -117,115,104,117,115,101,114,116,121,112,101, 40, 40,118,111,105,100, 42, 41, 0, - 2, 0, 0, 0, 2, 44, 0, 2, 0, 0, 0, 4,116, 97,103, 0, 2, 0, 0, 0, - 13, 95, 68,101, 99,108, 97,114, 97,116,105,111,110, 0, 4, 0, 0, 1, 26, 0, - 0, 0, 17, 64,100,101, 99,108, 97,114, 97,116,105,111,110, 46,108,117, 97, 0, - 0, 0, 0,136, 8, 1, 59, 1, 27, 13, 0, 18, 1, 48, 7, 13, 0, 18, 1, 11, - 2, 31, 52, 60, 59, 1, 28, 15, 4, 13, 0, 18, 1, 11, 5, 2, 1, 2, 59, 1, - 29, 13, 0, 11, 1, 13, 1, 7, 1, 16, 26, 59, 1, 30, 13, 0, 11, 6, 15, 7, - 13, 1, 7, 2, 16, 46, 5, 13, 1, 7, 1, 16, 11, 8, 11, 2, 2, 1, 3, 26, - 5, 1, 50, 3, 59, 1, 31, 59, 1, 32, 13, 0, 11, 9, 15, 10, 26, 59, 1, 33, - 15, 11, 13, 0, 15, 12, 2, 0, 2, 59, 1, 34, 13, 0, 20, 13, 2, 0, 1, 59, - 1, 35, 13, 0, 20, 14, 2, 0, 1, 59, 1, 36, 13, 0, 1, 1, 59, 1, 37, 0, - 0, 0, 0, 3, 0, 0, 1, 26, 0, 0, 0, 2,116, 0, 0, 0, 1, 28, 0, 0, - 0, 2,110, 0, 0, 0, 1, 30, 0, 0, 0, 0, 0, 0, 0, 15, 2, 0, 0, 0, - 2,116, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 1, 0, 2, - 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 6,115,112,108,105,116, 0, 2, 0, 0, - 0, 2, 64, 0, 2, 0, 0, 0, 6,108,110, 97,109,101, 0, 2, 0, 0, 0, 5, -103,115,117, 98, 0, 2, 0, 0, 0, 7, 37, 91, 46, 45, 37, 93, 0, 2, 0, 0, - 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, 0, 17, 99,108, 97,115,115, 68,101, - 99,108, 97,114, 97,116,105,111,110, 0, 2, 0, 0, 0, 7,115,101,116,116, 97, -103, 0, 2, 0, 0, 0, 10,116,111,108,117, 97, 95,116, 97,103, 0, 2, 0, 0, - 0, 10, 99,104,101, 99,107,110, 97,109,101, 0, 2, 0, 0, 0, 10, 99,104,101, - 99,107,116,121,112,101, 0, 2, 0, 0, 0, 12, 68,101, 99,108, 97,114, 97,116, -105,111,110, 0, 4, 0, 0, 1, 42, 0, 0, 0, 17, 64,100,101, 99,108, 97,114, - 97,116,105,111,110, 46,108,117, 97, 0, 0, 0, 3,164, 20, 2, 59, 1, 44, 15, - 2, 13, 0, 11, 3, 11, 4, 2, 1, 3, 23, 0, 59, 1, 46, 13, 1, 11, 5, 32, - 52, 44, 59, 1, 48, 13, 0, 11, 6, 32, 46, 5, 13, 0, 11, 7, 32, 52, 22, 59, - 1, 49, 15, 8, 22, 2, 11, 9, 11, 7, 11, 1, 13, 1, 30, 1, 3, 2, 1, 50, - 3, 59, 1, 50, 50, 3, 59, 1, 51, 59, 1, 54, 15, 11, 13, 0, 11, 12, 2, 1, - 2, 59, 1, 55, 13, 2, 18, 13, 7, 2, 32, 52,126, 59, 1, 56, 13, 1, 11, 14, - 32, 52, 15, 59, 1, 57, 15, 15, 11, 16, 13, 0, 42, 2, 0, 1, 50, 3, 59, 1, - 58, 59, 1, 59, 15, 11, 13, 2, 7, 1, 16, 11, 18, 2, 1, 2, 59, 1, 60, 15, - 8, 22, 6, 59, 1, 61, 11, 19, 13, 2, 7, 2, 16, 11, 20, 59, 1, 62, 11, 21, - 11, 22, 59, 1, 63, 11, 23, 11, 9, 59, 1, 64, 13, 3, 13, 3, 18, 13, 16, 11, - 24, 59, 1, 65, 15, 25, 13, 3, 7, 1, 13, 3, 18, 13, 7, 1, 38, 2, 1, 3, - 11, 1, 59, 1, 66, 13, 1, 30, 5, 59, 1, 67, 3, 4, 1, 5, 1, 50, 3, 59, - 1, 68, 59, 1, 71, 15, 11, 13, 0, 11, 26, 2, 1, 2, 23, 2, 59, 1, 72, 13, - 2, 18, 13, 7, 2, 32, 52,126, 59, 1, 73, 13, 1, 11, 14, 32, 52, 15, 59, 1, - 74, 15, 15, 11, 16, 13, 0, 42, 2, 0, 1, 50, 3, 59, 1, 75, 59, 1, 76, 15, - 11, 13, 2, 7, 1, 16, 11, 18, 2, 1, 2, 59, 1, 77, 15, 8, 22, 6, 59, 1, - 78, 11, 19, 13, 2, 7, 2, 16, 11, 20, 59, 1, 79, 11, 21, 11, 22, 59, 1, 80, - 11, 21, 11, 9, 59, 1, 81, 13, 3, 13, 3, 18, 13, 16, 11, 24, 59, 1, 82, 15, - 25, 13, 3, 7, 1, 13, 3, 18, 13, 7, 1, 38, 2, 1, 3, 11, 1, 59, 1, 83, - 13, 1, 30, 5, 59, 1, 84, 3, 4, 1, 5, 1, 50, 3, 59, 1, 85, 59, 1, 88, - 15, 11, 13, 0, 11, 23, 2, 1, 2, 23, 2, 59, 1, 89, 13, 2, 18, 13, 7, 2, - 32, 52, 91, 59, 1, 90, 15, 11, 13, 2, 7, 1, 16, 11, 18, 2, 1, 2, 59, 1, - 91, 15, 8, 22, 5, 59, 1, 92, 11, 19, 13, 2, 7, 2, 16, 11, 20, 59, 1, 93, - 11, 23, 11, 9, 59, 1, 94, 13, 3, 13, 3, 18, 13, 16, 11, 24, 59, 1, 95, 15, - 25, 13, 3, 7, 1, 13, 3, 18, 13, 7, 1, 38, 2, 1, 3, 11, 1, 59, 1, 96, - 13, 1, 30, 4, 59, 1, 97, 3, 4, 1, 5, 1, 50, 3, 59, 1, 98, 59, 1,101, - 15, 2, 13, 0, 11, 28, 11, 29, 2, 1, 3, 59, 1,102, 15, 11, 13, 3, 11, 30, - 2, 1, 2, 23, 2, 59, 1,103, 13, 2, 18, 31, 7, 2, 32, 52,113, 59, 1,104, - 13, 2, 7, 2, 15, 32, 13, 2, 7, 2, 16, 11, 33, 11, 30, 2, 1, 3, 26, 59, - 1,105, 15, 11, 13, 2, 7, 1, 16, 11, 18, 2, 1, 2, 59, 1,106, 15, 8, 22, - 5, 59, 1,107, 11, 19, 13, 2, 7, 2, 16, 11, 20, 59, 1,108, 11, 21, 11, 9, - 59, 1,109, 13, 4, 13, 4, 18, 31, 16, 11, 24, 59, 1,110, 15, 25, 13, 4, 7, - 1, 13, 4, 18, 31, 7, 1, 38, 2, 1, 3, 11, 1, 59, 1,111, 13, 1, 30, 4, - 59, 1,112, 3, 5, 1, 5, 1, 50, 3, 59, 1,113, 59, 1,115, 13, 1, 11, 5, - 32, 52,129, 59, 1,117, 15, 11, 13, 0, 11, 18, 2, 1, 2, 23, 2, 59, 1,118, - 4, 0, 59, 1,119, 15, 35, 13, 2, 13, 2, 18, 31, 16, 2, 1, 1, 52, 6, 11, - 6, 23, 4, 50, 21, 13, 2, 13, 2, 18, 31, 16, 23, 4, 13, 2, 11, 31, 13, 2, - 18, 31, 7, 1, 38, 26, 59, 1,120, 15, 8, 22, 4, 59, 1,121, 11, 19, 13, 4, - 11, 9, 59, 1,122, 13, 2, 13, 2, 18, 31, 16, 11, 24, 59, 1,123, 15, 25, 13, - 2, 7, 1, 13, 2, 18, 31, 7, 1, 38, 2, 1, 3, 11, 1, 59, 1,124, 13, 1, - 30, 3, 59, 1,125, 3, 5, 1, 5, 1, 50,130, 59, 1,130, 15, 11, 13, 0, 11, - 18, 2, 1, 2, 23, 2, 59, 1,131, 13, 2, 13, 2, 18, 31, 16, 59, 1,132, 4, - 1, 59, 1,133, 13, 2, 18, 31, 7, 1, 35, 52, 38, 59, 1,134, 13, 2, 13, 2, - 18, 31, 7, 1, 38, 16, 23, 5, 59, 1,135, 15, 25, 13, 2, 7, 1, 13, 2, 18, - 31, 7, 2, 38, 2, 1, 3, 23, 6, 50, 3, 59, 1,136, 59, 1,137, 15, 8, 22, - 4, 59, 1,138, 11, 19, 13, 4, 11, 9, 59, 1,139, 13, 5, 11, 24, 59, 1,140, - 13, 6, 11, 1, 59, 1,141, 13, 1, 30, 3, 59, 1,142, 3, 7, 1, 5, 3, 59, - 1,143, 59, 1,145, 0, 0, 0, 0, 20, 0, 0, 1, 42, 0, 0, 0, 2,115, 0, - 0, 0, 1, 42, 0, 0, 0, 5,107,105,110,100, 0, 0, 0, 1, 54, 0, 0, 0, - 2,116, 0, 0, 0, 1, 59, 0, 0, 0, 2,109, 0, 0, 0, 1, 67, 0, 0, 0, - 0, 0, 0, 1, 76, 0, 0, 0, 2,109, 0, 0, 0, 1, 84, 0, 0, 0, 0, 0, - 0, 1, 90, 0, 0, 0, 2,109, 0, 0, 0, 1, 97, 0, 0, 0, 0, 0, 0, 1, -101, 0, 0, 0, 3,115, 49, 0, 0, 0, 1,105, 0, 0, 0, 2,109, 0, 0, 0, - 1,112, 0, 0, 0, 0, 0, 0, 1,118, 0, 0, 0, 2,118, 0, 0, 0, 1,125, - 0, 0, 0, 0, 0, 0, 1,131, 0, 0, 0, 2,118, 0, 0, 0, 1,132, 0, 0, - 0, 3,116,112, 0, 0, 0, 1,132, 0, 0, 0, 3,109,100, 0, 0, 0, 1,142, - 0, 0, 0, 0, 0, 0, 1,142, 0, 0, 0, 0, 0, 0, 1,142, 0, 0, 0, 0, - 0, 0, 0, 38, 2, 0, 0, 0, 2,115, 0, 2, 0, 0, 0, 5,107,105,110,100, - 0, 2, 0, 0, 0, 5,103,115,117, 98, 0, 2, 0, 0, 0, 8, 37,115, 42, 61, - 37,115, 42, 0, 2, 0, 0, 0, 2, 61, 0, 2, 0, 0, 0, 4,118, 97,114, 0, - 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 5,118,111,105,100, 0, 2, 0, 0, 0, - 13, 95, 68,101, 99,108, 97,114, 97,116,105,111,110, 0, 2, 0, 0, 0, 5,116, -121,112,101, 0, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 6,115,112,108,105, -116, 0, 2, 0, 0, 0, 7, 37, 42, 37,115, 42, 38, 0, 2, 0, 0, 0, 2,110, - 0, 2, 0, 0, 0, 5,102,117,110, 99, 0, 2, 0, 0, 0, 6,101,114,114,111, -114, 0, 2, 0, 0, 0, 32, 35,105,110,118, 97,108,105,100, 32,102,117,110, 99, -116,105,111,110, 32,114,101,116,117,114,110, 32,116,121,112,101, 58, 32, 0, 2, - 0, 0, 0, 2,109, 0, 2, 0, 0, 0, 6, 37,115, 37,115, 42, 0, 2, 0, 0, - 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 4,112,116,114, 0, 2, 0, 0, 0, - 2, 42, 0, 2, 0, 0, 0, 4,114,101,116, 0, 2, 0, 0, 0, 2, 38, 0, 2, - 0, 0, 0, 4,109,111,100, 0, 2, 0, 0, 0, 7, 99,111,110, 99, 97,116, 0, - 2, 0, 0, 0, 8, 37, 42, 37,115, 42, 37, 42, 0, 2, 0, 0, 0, 3,115, 49, - 0, 2, 0, 0, 0, 7, 40, 37, 98, 91, 93, 41, 0, 4, 0, 0, 1,101, 0, 0, - 0, 17, 64,100,101, 99,108, 97,114, 97,116,105,111,110, 46,108,117, 97, 0, 0, - 0, 0, 17, 5, 1, 59, 1,101, 15, 1, 13, 0, 11, 2, 11, 3, 3, 1, 3, 0, - 0, 0, 0, 1, 0, 0, 1,101, 0, 0, 0, 2,110, 0, 0, 0, 0, 4, 2, 0, - 0, 0, 2,110, 0, 2, 0, 0, 0, 5,103,115,117, 98, 0, 2, 0, 0, 0, 3, - 37, 42, 0, 2, 0, 0, 0, 2, 1, 0, 2, 0, 0, 0, 3, 37, 42, 0, 2, 0, - 0, 0, 2,110, 0, 2, 0, 0, 0, 5,103,115,117, 98, 0, 2, 0, 0, 0, 2, - 1, 0, 2, 0, 0, 0, 2,118, 0, 2, 0, 0, 0, 7,105,115,116,121,112,101, - 0, 2, 0, 0, 0, 3,116,112, 0, 2, 0, 0, 0, 3,109,100, 0, -}; - -/* container.lo */ -static char B4[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 15, 64, 99,111,110,116, 97, -105,110,101,114, 46,108,117, 97, 0, 0, 0, 0,162, 5, 0, 60, 17, 60, 18, 22, - 2, 60, 19, 11, 1, 4, 0, 11, 2, 60, 20, 15, 3, 30, 1, 60, 21, 25, 0, 60, - 22, 15, 4, 15, 0, 15, 5, 2, 0, 2, 60, 25, 15, 0, 11, 6, 11, 7, 26, 60, - 36, 15, 0, 11, 8, 11, 9, 26, 60, 48, 11, 11, 25, 10, 60, 58, 11, 13, 25, 12, - 60, 63, 11, 15, 25, 14, 60, 68, 11, 17, 25, 16, 60, 73, 11, 19, 25, 18, 60, 78, - 11, 21, 25, 20, 60, 83, 11, 23, 25, 22, 60, 88, 15, 24, 11, 25, 11, 26, 26, 60, - 95, 15, 24, 11, 27, 11, 28, 26, 60,101, 15, 24, 11, 29, 11, 30, 26, 60,110, 15, - 24, 11, 31, 11, 32, 26, 60,129, 15, 24, 11, 33, 11, 34, 26, 60,147, 15, 24, 11, - 35, 11, 36, 26, 59, 1, 49, 15, 24, 11, 37, 11, 38, 26, 0, 0, 0, 0, 0, 0, - 0, 0, 39, 2, 0, 0, 0, 15, 99,108, 97,115,115, 67,111,110,116, 97,105,110, -101,114, 0, 2, 0, 0, 0, 5, 99,117,114,114, 0, 2, 0, 0, 0, 6, 95, 98, - 97,115,101, 0, 2, 0, 0, 0, 13, 99,108, 97,115,115, 70,101, 97,116,117,114, -101, 0, 2, 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, 10,116, -111,108,117, 97, 95,116, 97,103, 0, 2, 0, 0, 0, 8,100,101, 99,108,116, 97, -103, 0, 4, 0, 0, 0, 25, 0, 0, 0, 15, 64, 99,111,110,116, 97,105,110,101, -114, 46,108,117, 97, 0, 0, 0, 0, 59, 4, 1, 60, 26, 15, 0, 13, 0, 2, 0, - 1, 60, 27, 7, 1, 50, 23, 60, 29, 13, 0, 13, 1, 16, 20, 3, 2, 0, 1, 60, - 30, 13, 1, 7, 1, 37, 23, 1, 60, 31, 60, 28, 13, 0, 13, 1, 16, 54, 32, 60, - 32, 15, 4, 2, 0, 0, 60, 33, 0, 0, 0, 0, 2, 0, 0, 0, 25, 0, 0, 0, - 5,115,101,108,102, 0, 0, 0, 0, 27, 0, 0, 0, 2,105, 0, 0, 0, 0, 5, - 2, 0, 0, 0, 5,112,117,115,104, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, - 2, 0, 0, 0, 2,105, 0, 2, 0, 0, 0, 8,100,101, 99,108,116, 97,103, 0, - 2, 0, 0, 0, 4,112,111,112, 0, 2, 0, 0, 0, 8,115,117,112, 99,111,100, -101, 0, 4, 0, 0, 0, 36, 0, 0, 0, 15, 64, 99,111,110,116, 97,105,110,101, -114, 46,108,117, 97, 0, 0, 0, 0, 59, 4, 1, 60, 37, 15, 0, 13, 0, 2, 0, - 1, 60, 38, 7, 1, 50, 23, 60, 40, 13, 0, 13, 1, 16, 20, 3, 2, 0, 1, 60, - 41, 13, 1, 7, 1, 37, 23, 1, 60, 42, 60, 39, 13, 0, 13, 1, 16, 54, 32, 60, - 43, 15, 4, 2, 0, 0, 60, 44, 0, 0, 0, 0, 2, 0, 0, 0, 36, 0, 0, 0, - 5,115,101,108,102, 0, 0, 0, 0, 38, 0, 0, 0, 2,105, 0, 0, 0, 0, 5, - 2, 0, 0, 0, 5,112,117,115,104, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, - 2, 0, 0, 0, 2,105, 0, 2, 0, 0, 0, 8,115,117,112, 99,111,100,101, 0, - 2, 0, 0, 0, 4,112,111,112, 0, 2, 0, 0, 0, 11, 95, 67,111,110,116, 97, -105,110,101,114, 0, 4, 0, 0, 0, 48, 0, 0, 0, 15, 64, 99,111,110,116, 97, -105,110,101,114, 46,108,117, 97, 0, 0, 0, 0, 64, 6, 1, 60, 49, 13, 0, 11, - 1, 15, 2, 26, 60, 50, 15, 3, 13, 0, 15, 4, 2, 0, 2, 60, 51, 13, 0, 11, - 5, 7, 0, 26, 60, 52, 13, 0, 11, 6, 22, 1, 11, 5, 7, 0, 30, 0, 26, 60, - 53, 13, 0, 11, 7, 22, 0, 26, 60, 54, 13, 0, 1, 1, 60, 55, 0, 0, 0, 0, - 1, 0, 0, 0, 48, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 8, 2, 0, - 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 6, 95, 98, 97,115,101, 0, 2, - 0, 0, 0, 15, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, 0, 2, - 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, 10,116,111,108,117, - 97, 95,116, 97,103, 0, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 9,116,121, -112,101,100,101,102,115, 0, 2, 0, 0, 0, 7,108,110, 97,109,101,115, 0, 2, - 0, 0, 0, 5,112,117,115,104, 0, 4, 0, 0, 0, 58, 0, 0, 0, 15, 64, 99, -111,110,116, 97,105,110,101,114, 46,108,117, 97, 0, 0, 0, 0, 14, 4, 1, 60, - 59, 15, 1, 11, 2, 13, 0, 26, 60, 60, 0, 0, 0, 0, 1, 0, 0, 0, 58, 0, - 0, 0, 2,116, 0, 0, 0, 0, 3, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, - 15, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, 0, 2, 0, 0, 0, - 5, 99,117,114,114, 0, 2, 0, 0, 0, 4,112,111,112, 0, 4, 0, 0, 0, 63, - 0, 0, 0, 15, 64, 99,111,110,116, 97,105,110,101,114, 46,108,117, 97, 0, 0, - 0, 0, 18, 3, 0, 60, 64, 15, 0, 11, 1, 15, 0, 18, 1, 18, 2, 26, 60, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0, 15, 99,108, 97,115,115, 67, -111,110,116, 97,105,110,101,114, 0, 2, 0, 0, 0, 5, 99,117,114,114, 0, 2, - 0, 0, 0, 7,112, 97,114,101,110,116, 0, 2, 0, 0, 0, 7, 97,112,112,101, -110,100, 0, 4, 0, 0, 0, 68, 0, 0, 0, 15, 64, 99,111,110,116, 97,105,110, -101,114, 46,108,117, 97, 0, 0, 0, 0, 18, 4, 1, 60, 69, 15, 1, 18, 2, 20, - 3, 13, 0, 3, 1, 2, 60, 70, 0, 0, 0, 0, 1, 0, 0, 0, 68, 0, 0, 0, - 2,116, 0, 0, 0, 0, 4, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 15, 99, -108, 97,115,115, 67,111,110,116, 97,105,110,101,114, 0, 2, 0, 0, 0, 5, 99, -117,114,114, 0, 2, 0, 0, 0, 7, 97,112,112,101,110,100, 0, 2, 0, 0, 0, - 14, 97,112,112,101,110,100,116,121,112,101,100,101,102, 0, 4, 0, 0, 0, 73, - 0, 0, 0, 15, 64, 99,111,110,116, 97,105,110,101,114, 46,108,117, 97, 0, 0, - 0, 0, 18, 4, 1, 60, 74, 15, 1, 18, 2, 20, 3, 13, 0, 3, 1, 2, 60, 75, - 0, 0, 0, 0, 1, 0, 0, 0, 73, 0, 0, 0, 2,116, 0, 0, 0, 0, 4, 2, - 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 15, 99,108, 97,115,115, 67,111,110,116, - 97,105,110,101,114, 0, 2, 0, 0, 0, 5, 99,117,114,114, 0, 2, 0, 0, 0, - 14, 97,112,112,101,110,100,116,121,112,101,100,101,102, 0, 2, 0, 0, 0, 12, -102,105,110,100,116,121,112,101,100,101,102, 0, 4, 0, 0, 0, 78, 0, 0, 0, - 15, 64, 99,111,110,116, 97,105,110,101,114, 46,108,117, 97, 0, 0, 0, 0, 18, - 4, 1, 60, 79, 15, 1, 18, 2, 20, 3, 13, 0, 3, 1, 2, 60, 80, 0, 0, 0, - 0, 1, 0, 0, 0, 78, 0, 0, 0, 5,116,121,112,101, 0, 0, 0, 0, 4, 2, - 0, 0, 0, 5,116,121,112,101, 0, 2, 0, 0, 0, 15, 99,108, 97,115,115, 67, -111,110,116, 97,105,110,101,114, 0, 2, 0, 0, 0, 5, 99,117,114,114, 0, 2, - 0, 0, 0, 12,102,105,110,100,116,121,112,101,100,101,102, 0, 2, 0, 0, 0, - 10,105,115,116,121,112,101,100,101,102, 0, 4, 0, 0, 0, 83, 0, 0, 0, 15, - 64, 99,111,110,116, 97,105,110,101,114, 46,108,117, 97, 0, 0, 0, 0, 18, 4, - 1, 60, 84, 15, 1, 18, 2, 20, 3, 13, 0, 3, 1, 2, 60, 85, 0, 0, 0, 0, - 1, 0, 0, 0, 83, 0, 0, 0, 5,116,121,112,101, 0, 0, 0, 0, 4, 2, 0, - 0, 0, 5,116,121,112,101, 0, 2, 0, 0, 0, 15, 99,108, 97,115,115, 67,111, -110,116, 97,105,110,101,114, 0, 2, 0, 0, 0, 5, 99,117,114,114, 0, 2, 0, - 0, 0, 10,105,115,116,121,112,101,100,101,102, 0, 2, 0, 0, 0, 15, 99,108, - 97,115,115, 67,111,110,116, 97,105,110,101,114, 0, 2, 0, 0, 0, 7, 97,112, -112,101,110,100, 0, 4, 0, 0, 0, 88, 0, 0, 0, 15, 64, 99,111,110,116, 97, -105,110,101,114, 46,108,117, 97, 0, 0, 0, 0, 39, 6, 2, 60, 89, 13, 0, 11, - 2, 13, 0, 18, 2, 7, 1, 37, 26, 60, 90, 13, 0, 13, 0, 18, 2, 13, 1, 26, - 60, 91, 13, 1, 11, 3, 13, 0, 26, 60, 92, 0, 0, 0, 0, 2, 0, 0, 0, 88, - 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 88, 0, 0, 0, 2,116, 0, 0, - 0, 0, 4, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, - 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 7,112, 97,114,101,110,116, 0, 2, - 0, 0, 0, 14, 97,112,112,101,110,100,116,121,112,101,100,101,102, 0, 4, 0, - 0, 0, 95, 0, 0, 0, 15, 64, 99,111,110,116, 97,105,110,101,114, 46,108,117, - 97, 0, 0, 0, 0, 38, 6, 2, 60, 96, 13, 0, 18, 2, 11, 3, 13, 0, 18, 2, - 18, 3, 7, 1, 37, 26, 60, 97, 13, 0, 18, 2, 13, 0, 18, 2, 18, 3, 13, 1, - 26, 60, 98, 0, 0, 0, 0, 2, 0, 0, 0, 95, 0, 0, 0, 5,115,101,108,102, - 0, 0, 0, 0, 95, 0, 0, 0, 2,116, 0, 0, 0, 0, 4, 2, 0, 0, 0, 2, -116, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 9,116,121,112, -101,100,101,102,115, 0, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 9,111,118, -101,114,108,111, 97,100, 0, 4, 0, 0, 0,101, 0, 0, 0, 15, 64, 99,111,110, -116, 97,105,110,101,114, 46,108,117, 97, 0, 0, 0, 0, 67, 6, 2, 60,102, 13, - 0, 18, 2, 13, 1, 16, 44, 52, 13, 60,103, 13, 0, 18, 2, 13, 1, 7, 0, 26, - 50, 21, 60,105, 13, 0, 18, 2, 13, 1, 13, 0, 18, 2, 13, 1, 16, 7, 1, 37, - 26, 60,106, 60,107, 15, 3, 11, 4, 13, 0, 18, 2, 13, 1, 16, 3, 2, 2, 60, -108, 0, 0, 0, 0, 2, 0, 0, 0,101, 0, 0, 0, 5,115,101,108,102, 0, 0, - 0, 0,101, 0, 0, 0, 6,108,110, 97,109,101, 0, 0, 0, 0, 5, 2, 0, 0, - 0, 6,108,110, 97,109,101, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, - 0, 0, 7,108,110, 97,109,101,115, 0, 2, 0, 0, 0, 7,102,111,114,109, 97, -116, 0, 2, 0, 0, 0, 5, 37, 48, 50,100, 0, 2, 0, 0, 0, 12,102,105,110, -100,116,121,112,101,100,101,102, 0, 4, 0, 0, 0,110, 0, 0, 0, 15, 64, 99, -111,110,116, 97,105,110,101,114, 46,108,117, 97, 0, 0, 0, 0,142, 10, 2, 60, -111, 13, 0, 50,117, 60,113, 13, 2, 18, 3, 52, 97, 60,114, 7, 1, 50, 76, 60, -116, 13, 2, 18, 3, 13, 3, 16, 18, 5, 13, 1, 32, 52, 47, 60,117, 13, 2, 18, - 3, 13, 3, 16, 18, 8, 13, 2, 18, 3, 13, 3, 16, 18, 0, 60,118, 15, 11, 13, - 5, 2, 2, 1, 60,119, 13, 6, 11, 12, 42, 13, 4, 42, 13, 7, 1, 8, 5, 4, - 50, 2, 60,120, 60,121, 13, 3, 7, 1, 37, 23, 3, 60,122, 60,115, 13, 2, 18, - 3, 13, 3, 16, 54, 87, 5, 1, 50, 2, 60,123, 60,124, 13, 2, 18, 13, 23, 2, - 60,125, 60,112, 13, 2, 54,123, 60,126, 11, 14, 13, 1, 1, 3, 60,127, 0, 0, - 0, 0, 13, 0, 0, 0,110, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0,110, - 0, 0, 0, 5,116,121,112,101, 0, 0, 0, 0,111, 0, 0, 0, 4,101,110,118, - 0, 0, 0, 0,114, 0, 0, 0, 2,105, 0, 0, 0, 0,117, 0, 0, 0, 5,109, -111,100, 49, 0, 0, 0, 0,117, 0, 0, 0, 6,116,121,112,101, 49, 0, 0, 0, - 0,118, 0, 0, 0, 5,109,111,100, 50, 0, 0, 0, 0,118, 0, 0, 0, 6,116, -121,112,101, 50, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, - 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, -122, 0, 0, 0, 0, 0, 0, 0, 15, 2, 0, 0, 0, 5,116,121,112,101, 0, 2, - 0, 0, 0, 4,101,110,118, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, - 0, 0, 9,116,121,112,101,100,101,102,115, 0, 2, 0, 0, 0, 2,105, 0, 2, - 0, 0, 0, 6,117,116,121,112,101, 0, 2, 0, 0, 0, 5,109,111,100, 49, 0, - 2, 0, 0, 0, 6,116,121,112,101, 49, 0, 2, 0, 0, 0, 4,109,111,100, 0, - 2, 0, 0, 0, 5,109,111,100, 50, 0, 2, 0, 0, 0, 6,116,121,112,101, 50, - 0, 2, 0, 0, 0, 12,102,105,110,100,116,121,112,101,100,101,102, 0, 2, 0, - 0, 0, 2, 32, 0, 2, 0, 0, 0, 7,112, 97,114,101,110,116, 0, 2, 0, 0, - 0, 1, 0, 2, 0, 0, 0, 10,105,115,116,121,112,101,100,101,102, 0, 4, 0, - 0, 0,129, 0, 0, 0, 15, 64, 99,111,110,116, 97,105,110,101,114, 46,108,117, - 97, 0, 0, 0, 0,101, 6, 2, 60,130, 13, 0, 50, 78, 60,132, 13, 2, 18, 3, - 52, 58, 60,133, 7, 1, 50, 37, 60,135, 13, 2, 18, 3, 13, 3, 16, 18, 5, 13, - 1, 32, 52, 8, 60,136, 7, 1, 1, 4, 50, 2, 60,137, 60,138, 13, 3, 7, 1, - 37, 23, 3, 60,139, 60,134, 13, 2, 18, 3, 13, 3, 16, 54, 48, 5, 1, 50, 2, - 60,140, 60,141, 13, 2, 18, 6, 23, 2, 60,142, 60,131, 13, 2, 54, 84, 60,143, - 4, 0, 1, 3, 60,144, 0, 0, 0, 0, 5, 0, 0, 0,129, 0, 0, 0, 5,115, -101,108,102, 0, 0, 0, 0,129, 0, 0, 0, 5,116,121,112,101, 0, 0, 0, 0, -130, 0, 0, 0, 4,101,110,118, 0, 0, 0, 0,133, 0, 0, 0, 2,105, 0, 0, - 0, 0,139, 0, 0, 0, 0, 0, 0, 0, 7, 2, 0, 0, 0, 5,116,121,112,101, - 0, 2, 0, 0, 0, 4,101,110,118, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, - 2, 0, 0, 0, 9,116,121,112,101,100,101,102,115, 0, 2, 0, 0, 0, 2,105, - 0, 2, 0, 0, 0, 6,117,116,121,112,101, 0, 2, 0, 0, 0, 7,112, 97,114, -101,110,116, 0, 2, 0, 0, 0, 8,100,111,112, 97,114,115,101, 0, 4, 0, 0, - 0,147, 0, 0, 0, 15, 64, 99,111,110,116, 97,105,110,101,114, 46,108,117, 97, - 0, 0, 0, 4, 55, 13, 2, 60,151, 15, 5, 13, 1, 11, 6, 2, 4, 2, 60,152, - 13, 2, 52, 42, 60,153, 15, 8, 13, 1, 13, 2, 13, 3, 2, 1, 3, 25, 7, 60, -154, 15, 9, 13, 4, 13, 5, 2, 0, 2, 60,155, 15, 8, 13, 1, 13, 3, 7, 1, - 37, 3, 6, 2, 50, 2, 60,156, 5, 4, 60,157, 60,161, 15, 5, 13, 1, 11, 10, - 2, 3, 2, 60,162, 13, 2, 52, 40, 60,163, 15, 8, 13, 1, 13, 2, 13, 3, 2, - 1, 3, 25, 7, 60,164, 15, 11, 13, 4, 2, 0, 1, 60,165, 15, 8, 13, 1, 13, - 3, 7, 1, 37, 3, 5, 2, 50, 2, 60,166, 5, 3, 60,167, 60,171, 15, 5, 13, - 1, 11, 12, 2, 3, 2, 60,172, 13, 2, 52, 40, 60,173, 15, 8, 13, 1, 13, 2, - 13, 3, 2, 1, 3, 25, 7, 60,174, 15, 13, 13, 4, 2, 0, 1, 60,175, 15, 8, - 13, 1, 13, 3, 7, 1, 37, 3, 5, 2, 50, 2, 60,176, 5, 3, 60,177, 60,180, - 15, 5, 13, 1, 11, 14, 2, 4, 2, 60,181, 13, 2, 52, 52, 60,182, 15, 8, 13, - 1, 13, 2, 13, 3, 2, 1, 3, 25, 7, 60,183, 15, 13, 13, 4, 2, 0, 1, 60, -184, 15, 15, 11, 16, 13, 5, 42, 2, 0, 1, 60,185, 15, 8, 13, 1, 13, 3, 7, - 1, 37, 3, 6, 2, 50, 2, 60,186, 5, 4, 60,187, 60,191, 15, 5, 13, 1, 11, - 21, 2, 6, 2, 60,192, 13, 2, 52, 46, 60,193, 15, 8, 13, 1, 13, 2, 13, 3, - 2, 1, 3, 25, 7, 60,194, 15, 22, 13, 4, 13, 5, 13, 6, 13, 7, 2, 0, 4, - 60,195, 15, 8, 13, 1, 13, 3, 7, 1, 37, 3, 8, 2, 50, 2, 60,196, 5, 6, - 60,197, 60,201, 15, 5, 13, 1, 11, 23, 2, 5, 2, 60,202, 13, 2, 44, 52, 23, - 60,204, 15, 5, 13, 1, 11, 24, 2, 5, 2, 23, 6, 23, 5, 23, 4, 23, 3, 23, - 2, 50, 2, 60,205, 60,206, 13, 2, 52, 44, 60,207, 15, 8, 13, 1, 13, 2, 13, - 3, 2, 1, 3, 25, 7, 60,208, 15, 25, 13, 4, 13, 5, 13, 6, 2, 0, 3, 60, -209, 15, 8, 13, 1, 13, 3, 7, 1, 37, 3, 7, 2, 50, 2, 60,210, 5, 5, 60, -211, 60,215, 15, 5, 13, 1, 11, 26, 2, 5, 2, 60,216, 13, 2, 44, 52, 23, 60, -218, 15, 5, 13, 1, 11, 27, 2, 5, 2, 23, 6, 23, 5, 23, 4, 23, 3, 23, 2, - 50, 2, 60,219, 60,220, 13, 2, 52, 44, 60,221, 15, 8, 13, 1, 13, 2, 13, 3, - 2, 1, 3, 25, 7, 60,222, 15, 25, 13, 4, 13, 5, 13, 6, 2, 0, 3, 60,223, - 15, 8, 13, 1, 13, 3, 7, 1, 37, 3, 7, 2, 50, 2, 60,224, 5, 5, 60,225, - 60,229, 15, 5, 13, 1, 11, 29, 2, 5, 2, 60,230, 13, 2, 44, 52, 59, 60,231, - 15, 5, 13, 1, 11, 30, 2, 5, 2, 23, 6, 23, 5, 23, 4, 23, 3, 23, 2, 60, -232, 13, 2, 44, 52, 27, 60,233, 11, 31, 23, 5, 60,234, 15, 5, 13, 1, 11, 32, - 2, 4, 2, 23, 4, 23, 6, 23, 3, 23, 2, 50, 2, 60,235, 50, 2, 60,236, 60, -237, 13, 2, 52, 80, 60,238, 13, 5, 11, 31, 31, 52, 25, 60,239, 4, 1, 60,240, - 15, 5, 13, 5, 11, 33, 2, 3, 2, 23, 5, 23, 8, 23, 7, 5, 2, 50, 2, 60, -241, 60,242, 15, 8, 13, 1, 13, 2, 13, 3, 2, 1, 3, 25, 7, 60,243, 15, 34, - 13, 4, 13, 5, 13, 6, 2, 0, 3, 60,244, 15, 8, 13, 1, 13, 3, 7, 1, 37, - 3, 7, 2, 50, 2, 60,245, 5, 5, 60,246, 60,250, 15, 5, 13, 1, 11, 36, 2, - 3, 2, 60,251, 13, 2, 52, 40, 60,252, 15, 8, 13, 1, 13, 2, 13, 3, 2, 1, - 3, 25, 7, 60,253, 15, 15, 13, 4, 2, 0, 1, 60,254, 15, 8, 13, 1, 13, 3, - 7, 1, 37, 3, 5, 2, 50, 2, 60,255, 5, 3, 59, 1, 0, 59, 1, 4, 15, 5, - 13, 1, 11, 37, 2, 3, 2, 59, 1, 5, 13, 2, 52, 43, 59, 1, 6, 15, 8, 13, - 1, 13, 2, 13, 3, 2, 1, 3, 25, 7, 59, 1, 7, 15, 38, 13, 4, 2, 0, 1, - 59, 1, 8, 15, 8, 13, 1, 13, 3, 7, 1, 37, 3, 5, 2, 50, 3, 59, 1, 9, - 5, 3, 59, 1, 10, 59, 1, 14, 15, 5, 13, 1, 11, 39, 2, 3, 2, 59, 1, 15, - 13, 2, 52, 43, 59, 1, 16, 15, 8, 13, 1, 13, 2, 13, 3, 2, 1, 3, 25, 7, - 59, 1, 17, 15, 40, 13, 4, 2, 0, 1, 59, 1, 18, 15, 8, 13, 1, 13, 3, 7, - 1, 37, 3, 5, 2, 50, 3, 59, 1, 19, 5, 3, 59, 1, 20, 59, 1, 24, 15, 5, - 13, 1, 11, 42, 2, 3, 2, 59, 1, 25, 13, 2, 52, 36, 59, 1, 26, 15, 43, 15, - 8, 13, 4, 7, 2, 9, 2, 2, 1, 3, 2, 0, 1, 59, 1, 27, 15, 8, 13, 1, - 13, 3, 7, 1, 37, 3, 5, 2, 50, 3, 59, 1, 28, 5, 3, 59, 1, 29, 59, 1, - 33, 15, 5, 13, 1, 11, 45, 2, 3, 2, 59, 1, 34, 13, 2, 52, 27, 59, 1, 35, - 15, 46, 13, 4, 2, 0, 1, 59, 1, 36, 15, 8, 13, 1, 13, 3, 7, 1, 37, 3, - 5, 2, 50, 3, 59, 1, 37, 5, 3, 59, 1, 38, 59, 1, 41, 15, 47, 13, 1, 11, - 48, 11, 31, 2, 1, 3, 11, 31, 31, 52, 19, 59, 1, 42, 13, 1, 25, 7, 59, 1, - 43, 15, 49, 11, 50, 2, 0, 1, 50, 10, 59, 1, 45, 11, 31, 1, 2, 59, 1, 46, - 59, 1, 47, 0, 0, 0, 0,106, 0, 0, 0,147, 0, 0, 0, 5,115,101,108,102, - 0, 0, 0, 0,147, 0, 0, 0, 2,115, 0, 0, 0, 0,151, 0, 0, 0, 2, 98, - 0, 0, 0, 0,151, 0, 0, 0, 2,101, 0, 0, 0, 0,151, 0, 0, 0, 5,110, - 97,109,101, 0, 0, 0, 0,151, 0, 0, 0, 5, 98,111,100,121, 0, 0, 0, 0, -156, 0, 0, 0, 0, 0, 0, 0,156, 0, 0, 0, 0, 0, 0, 0,156, 0, 0, 0, - 0, 0, 0, 0,156, 0, 0, 0, 0, 0, 0, 0,161, 0, 0, 0, 2, 98, 0, 0, - 0, 0,161, 0, 0, 0, 2,101, 0, 0, 0, 0,161, 0, 0, 0, 5,110, 97,109, -101, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, - 0,166, 0, 0, 0, 0, 0, 0, 0,171, 0, 0, 0, 2, 98, 0, 0, 0, 0,171, - 0, 0, 0, 2,101, 0, 0, 0, 0,171, 0, 0, 0, 5, 98,111,100,121, 0, 0, - 0, 0,176, 0, 0, 0, 0, 0, 0, 0,176, 0, 0, 0, 0, 0, 0, 0,176, 0, - 0, 0, 0, 0, 0, 0,180, 0, 0, 0, 2, 98, 0, 0, 0, 0,180, 0, 0, 0, - 2,101, 0, 0, 0, 0,180, 0, 0, 0, 5, 98,111,100,121, 0, 0, 0, 0,180, - 0, 0, 0, 5,110, 97,109,101, 0, 0, 0, 0,186, 0, 0, 0, 0, 0, 0, 0, -186, 0, 0, 0, 0, 0, 0, 0,186, 0, 0, 0, 0, 0, 0, 0,186, 0, 0, 0, - 0, 0, 0, 0,191, 0, 0, 0, 2, 98, 0, 0, 0, 0,191, 0, 0, 0, 2,101, - 0, 0, 0, 0,191, 0, 0, 0, 5,100,101, 99,108, 0, 0, 0, 0,191, 0, 0, - 0, 5,107,105,110,100, 0, 0, 0, 0,191, 0, 0, 0, 4, 97,114,103, 0, 0, - 0, 0,191, 0, 0, 0, 6, 99,111,110,115,116, 0, 0, 0, 0,196, 0, 0, 0, - 0, 0, 0, 0,196, 0, 0, 0, 0, 0, 0, 0,196, 0, 0, 0, 0, 0, 0, 0, -196, 0, 0, 0, 0, 0, 0, 0,196, 0, 0, 0, 0, 0, 0, 0,196, 0, 0, 0, - 0, 0, 0, 0,201, 0, 0, 0, 2, 98, 0, 0, 0, 0,201, 0, 0, 0, 2,101, - 0, 0, 0, 0,201, 0, 0, 0, 5,100,101, 99,108, 0, 0, 0, 0,201, 0, 0, - 0, 4, 97,114,103, 0, 0, 0, 0,201, 0, 0, 0, 6, 99,111,110,115,116, 0, - 0, 0, 0,210, 0, 0, 0, 0, 0, 0, 0,210, 0, 0, 0, 0, 0, 0, 0,210, - 0, 0, 0, 0, 0, 0, 0,210, 0, 0, 0, 0, 0, 0, 0,210, 0, 0, 0, 0, - 0, 0, 0,215, 0, 0, 0, 2, 98, 0, 0, 0, 0,215, 0, 0, 0, 2,101, 0, - 0, 0, 0,215, 0, 0, 0, 5,100,101, 99,108, 0, 0, 0, 0,215, 0, 0, 0, - 4, 97,114,103, 0, 0, 0, 0,215, 0, 0, 0, 6, 99,111,110,115,116, 0, 0, - 0, 0,224, 0, 0, 0, 0, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0,224, 0, - 0, 0, 0, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0,224, 0, 0, 0, 0, 0, - 0, 0,229, 0, 0, 0, 2, 98, 0, 0, 0, 0,229, 0, 0, 0, 2,101, 0, 0, - 0, 0,229, 0, 0, 0, 5,110, 97,109,101, 0, 0, 0, 0,229, 0, 0, 0, 5, - 98, 97,115,101, 0, 0, 0, 0,229, 0, 0, 0, 5, 98,111,100,121, 0, 0, 0, - 0,239, 0, 0, 0, 2, 98, 0, 0, 0, 0,239, 0, 0, 0, 2,101, 0, 0, 0, - 0,240, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0,245, 0, 0, - 0, 0, 0, 0, 0,245, 0, 0, 0, 0, 0, 0, 0,245, 0, 0, 0, 0, 0, 0, - 0,245, 0, 0, 0, 0, 0, 0, 0,245, 0, 0, 0, 0, 0, 0, 0,250, 0, 0, - 0, 2, 98, 0, 0, 0, 0,250, 0, 0, 0, 2,101, 0, 0, 0, 0,250, 0, 0, - 0, 6,116,121,112,101,115, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0,255, - 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 2, - 98, 0, 0, 0, 1, 4, 0, 0, 0, 2,101, 0, 0, 0, 1, 4, 0, 0, 0, 5, -100,101, 99,108, 0, 0, 0, 1, 9, 0, 0, 0, 0, 0, 0, 1, 9, 0, 0, 0, - 0, 0, 0, 1, 9, 0, 0, 0, 0, 0, 0, 1, 14, 0, 0, 0, 2, 98, 0, 0, - 0, 1, 14, 0, 0, 0, 2,101, 0, 0, 0, 1, 14, 0, 0, 0, 5,100,101, 99, -108, 0, 0, 0, 1, 19, 0, 0, 0, 0, 0, 0, 1, 19, 0, 0, 0, 0, 0, 0, - 1, 19, 0, 0, 0, 0, 0, 0, 1, 24, 0, 0, 0, 2, 98, 0, 0, 0, 1, 24, - 0, 0, 0, 2,101, 0, 0, 0, 1, 24, 0, 0, 0, 5, 99,111,100,101, 0, 0, - 0, 1, 28, 0, 0, 0, 0, 0, 0, 1, 28, 0, 0, 0, 0, 0, 0, 1, 28, 0, - 0, 0, 0, 0, 0, 1, 33, 0, 0, 0, 2, 98, 0, 0, 0, 1, 33, 0, 0, 0, - 2,101, 0, 0, 0, 1, 33, 0, 0, 0, 5,108,105,110,101, 0, 0, 0, 1, 37, - 0, 0, 0, 0, 0, 0, 1, 37, 0, 0, 0, 0, 0, 0, 1, 37, 0, 0, 0, 0, - 0, 0, 0, 51, 2, 0, 0, 0, 2,115, 0, 2, 0, 0, 0, 2, 98, 0, 2, 0, - 0, 0, 2,101, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 5, - 98,111,100,121, 0, 2, 0, 0, 0, 8,115,116,114,102,105,110,100, 0, 2, 0, - 0, 0, 41, 94, 37,115, 42,109,111,100,117,108,101, 37,115, 37,115, 42, 40, 91, - 95, 37,119, 93, 91, 95, 37,119, 93, 42, 41, 37,115, 42, 40, 37, 98,123,125, 41, - 37,115, 42, 0, 2, 0, 0, 0, 11, 95, 99,117,114,114, 95, 99,111,100,101, 0, - 2, 0, 0, 0, 7,115,116,114,115,117, 98, 0, 2, 0, 0, 0, 7, 77,111,100, -117,108,101, 0, 2, 0, 0, 0, 34, 94, 37,115, 42, 35,100,101,102,105,110,101, - 37,115, 37,115, 42, 40, 91, 94, 37,115, 93, 42, 41, 91, 94, 10, 93, 42, 10, 37, -115, 42, 0, 2, 0, 0, 0, 7, 68,101,102,105,110,101, 0, 2, 0, 0, 0, 28, - 94, 37,115, 42,101,110,117,109, 91, 94,123, 93, 42, 40, 37, 98,123,125, 41, 37, -115, 42, 59, 63, 37,115, 42, 0, 2, 0, 0, 0, 10, 69,110,117,109,101,114, 97, -116,101, 0, 2, 0, 0, 0, 55, 94, 37,115, 42,116,121,112,101,100,101,102, 37, -115, 37,115, 42,101,110,117,109, 91, 94,123, 93, 42, 40, 37, 98,123,125, 41, 37, -115, 42, 40, 91, 37,119, 95, 93, 91, 94, 37,115, 93, 42, 41, 37,115, 42, 59, 37, -115, 42, 0, 2, 0, 0, 0, 8, 84,121,112,101,100,101,102, 0, 2, 0, 0, 0, - 5,105,110,116, 32, 0, 2, 0, 0, 0, 5,100,101, 99,108, 0, 2, 0, 0, 0, - 5,107,105,110,100, 0, 2, 0, 0, 0, 4, 97,114,103, 0, 2, 0, 0, 0, 6, - 99,111,110,115,116, 0, 2, 0, 0, 0, 78, 94, 37,115, 42, 40, 91, 95, 37,119, - 93, 91, 95, 37,119, 37,115, 37, 42, 38, 93, 42,111,112,101,114, 97,116,111,114, - 41, 37,115, 42, 40, 91, 94, 37,115, 93, 91, 94, 37,115, 93, 42, 41, 37,115, 42, - 40, 37, 98, 40, 41, 41, 37,115, 42, 40, 99, 63,111, 63,110, 63,115, 63,116, 63, - 41, 37,115, 42, 59, 37,115, 42, 0, 2, 0, 0, 0, 9, 79,112,101,114, 97,116, -111,114, 0, 2, 0, 0, 0, 71, 94, 37,115, 42, 40, 91,126, 95, 37,119, 93, 91, - 95, 64, 37,119, 37,115, 37, 42, 38, 93, 42, 91, 95, 37,119, 93, 41, 37,115, 42, - 40, 37, 98, 40, 41, 41, 37,115, 42, 40, 99, 63,111, 63,110, 63,115, 63,116, 63, - 41, 37,115, 42, 61, 63, 37,115, 42, 48, 63, 37,115, 42, 59, 37,115, 42, 0, 2, - 0, 0, 0, 43, 94, 37,115, 42, 40, 91, 95, 37,119, 93, 41, 37,115, 42, 40, 37, - 98, 40, 41, 41, 37,115, 42, 40, 99, 63,111, 63,110, 63,115, 63,116, 63, 41, 37, -115, 42, 59, 37,115, 42, 0, 2, 0, 0, 0, 9, 70,117,110, 99,116,105,111,110, - 0, 2, 0, 0, 0, 64, 94, 37,115, 42, 40, 91,126, 95, 37,119, 93, 91, 95, 64, - 37,119, 37,115, 37, 42, 38, 93, 42, 91, 95, 37,119, 93, 41, 37,115, 42, 40, 37, - 98, 40, 41, 41, 37,115, 42, 40, 99, 63,111, 63,110, 63,115, 63,116, 63, 41, 37, -115, 42, 37, 98,123,125, 37,115, 42, 0, 2, 0, 0, 0, 46, 94, 37,115, 42, 40, - 91, 95, 37,119, 93, 41, 37,115, 42, 40, 37, 98, 40, 41, 41, 37,115, 42, 40, 99, - 63,111, 63,110, 63,115, 63,116, 63, 41, 37,115, 42, 37, 98,123,125, 37,115, 42, - 0, 2, 0, 0, 0, 5, 98, 97,115,101, 0, 2, 0, 0, 0, 49, 94, 37,115, 42, - 99,108, 97,115,115, 37,115, 42, 40, 91, 95, 37,119, 93, 91, 95, 37,119, 93, 42, - 41, 37,115, 42, 40, 46, 45, 41, 37,115, 42, 40, 37, 98,123,125, 41, 37,115, 42, - 59, 37,115, 42, 0, 2, 0, 0, 0, 50, 94, 37,115, 42,115,116,114,117, 99,116, - 37,115, 42, 40, 91, 95, 37,119, 93, 91, 95, 37,119, 93, 42, 41, 37,115, 42, 40, - 46, 45, 41, 37,115, 42, 40, 37, 98,123,125, 41, 37,115, 42, 59, 37,115, 42, 0, - 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 66, 94, 37,115, 42,116,121,112,101,100, -101,102, 37,115, 37,115, 42,115,116,114,117, 99,116, 37,115, 37,115, 42, 91, 95, - 37,119, 93, 42, 37,115, 42, 40, 37, 98,123,125, 41, 37,115, 42, 40, 91, 95, 37, -119, 93, 91, 95, 37,119, 93, 42, 41, 37,115, 42, 59, 37,115, 42, 0, 2, 0, 0, - 0, 17, 46, 45, 40, 91, 95, 37,119, 93, 91, 95, 37,119, 93, 42, 41, 36, 0, 2, - 0, 0, 0, 6, 67,108, 97,115,115, 0, 2, 0, 0, 0, 6,116,121,112,101,115, - 0, 2, 0, 0, 0, 28, 94, 37,115, 42,116,121,112,101,100,101,102, 37,115, 37, -115, 42, 40, 46, 45, 41, 37,115, 42, 59, 37,115, 42, 0, 2, 0, 0, 0, 40, 94, - 37,115, 42, 40, 91, 95, 37,119, 93, 91, 95, 64, 37,115, 37,119, 37,100, 37, 42, - 38, 93, 42, 91, 95, 37,119, 37,100, 93, 41, 37,115, 42, 59, 37,115, 42, 0, 2, - 0, 0, 0, 9, 86, 97,114,105, 97, 98,108,101, 0, 2, 0, 0, 0, 43, 94, 37, -115, 42, 40, 91, 95, 37,119, 93, 91, 93, 91, 95, 64, 37,115, 37,119, 37,100, 37, - 42, 38, 93, 42, 91, 93, 95, 37,119, 37,100, 93, 41, 37,115, 42, 59, 37,115, 42, - 0, 2, 0, 0, 0, 6, 65,114,114, 97,121, 0, 2, 0, 0, 0, 5, 99,111,100, -101, 0, 2, 0, 0, 0, 11, 94, 37,115, 42, 40, 37, 98, 1, 2, 41, 0, 2, 0, - 0, 0, 5, 67,111,100,101, 0, 2, 0, 0, 0, 5,108,105,110,101, 0, 2, 0, - 0, 0, 12, 94, 37,115, 42, 37, 36, 40, 46, 45, 10, 41, 0, 2, 0, 0, 0, 9, - 86,101,114, 98, 97,116,105,109, 0, 2, 0, 0, 0, 5,103,115,117, 98, 0, 2, - 0, 0, 0, 6, 37,115, 37,115, 42, 0, 2, 0, 0, 0, 6,101,114,114,111,114, - 0, 2, 0, 0, 0, 13, 35,112, 97,114,115,101, 32,101,114,114,111,114, 0, 2, - 0, 0, 0, 6,112, 97,114,115,101, 0, 4, 0, 0, 1, 49, 0, 0, 0, 15, 64, - 99,111,110,116, 97,105,110,101,114, 46,108,117, 97, 0, 0, 0, 0, 35, 5, 2, - 50, 17, 59, 1, 51, 13, 0, 20, 3, 13, 1, 2, 1, 2, 23, 1, 59, 1, 52, 59, - 1, 50, 13, 1, 11, 1, 31, 54, 27, 59, 1, 53, 0, 0, 0, 0, 2, 0, 0, 1, - 49, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 1, 49, 0, 0, 0, 2,115, 0, - 0, 0, 0, 4, 2, 0, 0, 0, 2,115, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, - 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 8,100,111,112, 97,114,115,101, 0, - -}; - -/* package.lo */ -static char B5[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 13, 64,112, 97, 99,107, 97, -103,101, 46,108,117, 97, 0, 0, 0, 0,102, 5, 0, 60, 20, 22, 2, 60, 21, 11, - 1, 15, 2, 11, 3, 60, 22, 11, 4, 30, 1, 60, 23, 25, 0, 60, 24, 15, 5, 15, - 0, 15, 6, 2, 0, 2, 60, 27, 15, 0, 11, 7, 11, 8, 26, 60, 36, 15, 0, 11, - 9, 11, 10, 26, 60, 60, 15, 0, 11, 11, 11, 12, 26, 60,100, 15, 0, 11, 13, 11, - 14, 26, 60,119, 15, 0, 11, 15, 11, 16, 26, 60,132, 15, 0, 11, 17, 11, 18, 26, - 60,146, 11, 20, 25, 19, 60,155, 11, 22, 25, 21, 0, 0, 0, 0, 0, 0, 0, 0, - 23, 2, 0, 0, 0, 13, 99,108, 97,115,115, 80, 97, 99,107, 97,103,101, 0, 2, - 0, 0, 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, 0, 15, 99,108, 97,115,115, - 67,111,110,116, 97,105,110,101,114, 0, 2, 0, 0, 0, 5,116,121,112,101, 0, - 2, 0, 0, 0, 8,112, 97, 99,107, 97,103,101, 0, 2, 0, 0, 0, 7,115,101, -116,116, 97,103, 0, 2, 0, 0, 0, 10,116,111,108,117, 97, 95,116, 97,103, 0, - 2, 0, 0, 0, 6,112,114,105,110,116, 0, 4, 0, 0, 0, 27, 0, 0, 0, 13, - 64,112, 97, 99,107, 97,103,101, 46,108,117, 97, 0, 0, 0, 0, 61, 6, 1, 60, - 28, 15, 0, 11, 1, 13, 0, 18, 3, 42, 2, 0, 1, 60, 29, 7, 1, 50, 27, 60, - 31, 13, 0, 13, 1, 16, 20, 0, 11, 5, 11, 5, 2, 0, 3, 60, 32, 13, 1, 7, - 1, 37, 23, 1, 60, 33, 60, 30, 13, 0, 13, 1, 16, 54, 36, 60, 34, 0, 0, 0, - 0, 2, 0, 0, 0, 27, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 29, 0, - 0, 0, 2,105, 0, 0, 0, 0, 6, 2, 0, 0, 0, 6,112,114,105,110,116, 0, - 2, 0, 0, 0, 10, 80, 97, 99,107, 97,103,101, 58, 32, 0, 2, 0, 0, 0, 5, -115,101,108,102, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 2, -105, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 11,112,114,101,112,114,111, 99, -101,115,115, 0, 4, 0, 0, 0, 36, 0, 0, 0, 13, 64,112, 97, 99,107, 97,103, -101, 46,108,117, 97, 0, 0, 0, 1, 83, 7, 1, 60, 38, 13, 0, 11, 1, 11, 2, - 13, 0, 18, 1, 42, 26, 60, 40, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 4, - 11, 5, 2, 1, 3, 26, 60, 41, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 6, - 11, 7, 2, 1, 3, 26, 60, 42, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 8, - 11, 9, 2, 1, 3, 26, 60, 43, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 10, - 11, 5, 2, 1, 3, 26, 60, 44, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 7, - 11, 6, 2, 1, 3, 26, 60, 45, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 9, - 11, 8, 2, 1, 3, 26, 60, 46, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 11, - 11, 12, 2, 1, 3, 26, 60, 47, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 13, - 11, 14, 2, 1, 3, 26, 60, 48, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 15, - 11, 14, 2, 1, 3, 26, 60, 49, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 16, - 11, 14, 2, 1, 3, 26, 60, 50, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 17, - 11, 5, 2, 1, 3, 26, 60, 51, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 18, - 11, 19, 2, 1, 3, 26, 60, 52, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 18, - 11, 19, 2, 1, 3, 26, 60, 53, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 20, - 11, 21, 2, 1, 3, 26, 60, 55, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 22, - 11, 7, 2, 1, 3, 26, 60, 56, 13, 0, 11, 1, 15, 3, 13, 0, 18, 1, 11, 23, - 11, 9, 2, 1, 3, 26, 60, 57, 0, 0, 0, 0, 1, 0, 0, 0, 36, 0, 0, 0, - 5,115,101,108,102, 0, 0, 0, 0, 24, 2, 0, 0, 0, 5,115,101,108,102, 0, - 2, 0, 0, 0, 5, 99,111,100,101, 0, 2, 0, 0, 0, 2, 32, 0, 2, 0, 0, - 0, 5,103,115,117, 98, 0, 2, 0, 0, 0, 10, 40, 47, 47, 91, 94, 10, 93, 42, - 41, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 4, 47, 37, 42, 0, 2, 0, 0, - 0, 2, 1, 0, 2, 0, 0, 0, 4, 37, 42, 47, 0, 2, 0, 0, 0, 2, 2, 0, - 2, 0, 0, 0, 5, 37, 98, 1, 2, 0, 2, 0, 0, 0, 8, 37,115, 42, 64, 37, -115, 42, 0, 2, 0, 0, 0, 2, 64, 0, 2, 0, 0, 0, 14, 37,115, 63,105,110, -108,105,110,101, 40, 37,115, 41, 0, 2, 0, 0, 0, 3, 37, 49, 0, 2, 0, 0, - 0, 14, 37,115, 63,101,120,116,101,114,110, 40, 37,115, 41, 0, 2, 0, 0, 0, - 15, 37,115, 63,118,105,114,116,117, 97,108, 40, 37,115, 41, 0, 2, 0, 0, 0, - 8,112,117, 98,108,105, 99, 58, 0, 2, 0, 0, 0, 18, 40, 91, 94, 37,119, 95, - 93, 41,118,111,105,100, 37,115, 42, 37, 42, 0, 2, 0, 0, 0, 13, 37, 49, 95, -117,115,101,114,100, 97,116, 97, 32, 0, 2, 0, 0, 0, 18, 40, 91, 94, 37,119, - 95, 93, 41, 99,104, 97,114, 37,115, 42, 37, 42, 0, 2, 0, 0, 0, 12, 37, 49, - 95, 99,115,116,114,105,110,103, 32, 0, 2, 0, 0, 0, 5, 37, 36, 37, 91, 0, - 2, 0, 0, 0, 5, 37, 36, 37, 93, 0, 2, 0, 0, 0, 9,112,114,101, 97,109, - 98,108,101, 0, 4, 0, 0, 0, 60, 0, 0, 0, 13, 64,112, 97, 99,107, 97,103, -101, 46,108,117, 97, 0, 0, 0, 1, 79, 5, 1, 60, 61, 15, 0, 11, 1, 2, 0, - 1, 60, 62, 15, 0, 11, 2, 13, 0, 18, 4, 42, 11, 5, 42, 2, 0, 1, 60, 63, - 15, 0, 11, 6, 15, 7, 42, 11, 8, 42, 15, 9, 2, 1, 0, 42, 11, 10, 42, 2, - 0, 1, 60, 64, 15, 0, 11, 11, 2, 0, 1, 60, 66, 15, 12, 18, 13, 44, 52, 54, - 60, 67, 15, 0, 11, 14, 2, 0, 1, 60, 68, 15, 0, 11, 15, 13, 0, 18, 4, 42, - 11, 16, 42, 2, 0, 1, 60, 69, 15, 0, 11, 17, 13, 0, 18, 4, 42, 11, 18, 42, - 2, 0, 1, 60, 70, 15, 0, 11, 5, 2, 0, 1, 50, 2, 60, 71, 60, 73, 15, 12, - 18, 19, 52, 46, 60, 74, 15, 0, 11, 20, 2, 0, 1, 60, 75, 15, 0, 11, 21, 2, - 0, 1, 60, 76, 15, 0, 11, 22, 13, 0, 18, 4, 42, 11, 23, 42, 2, 0, 1, 60, - 77, 15, 0, 11, 24, 2, 0, 1, 50, 2, 60, 78, 60, 79, 15, 0, 11, 25, 2, 0, - 1, 60, 80, 7, 1, 50, 23, 60, 82, 13, 0, 13, 1, 16, 20, 27, 2, 0, 1, 60, - 83, 13, 1, 7, 1, 37, 23, 1, 60, 84, 60, 81, 13, 0, 13, 1, 16, 54, 32, 60, - 85, 15, 0, 11, 5, 2, 0, 1, 60, 86, 15, 0, 11, 28, 2, 0, 1, 60, 87, 13, - 0, 20, 29, 2, 0, 1, 60, 88, 15, 0, 11, 5, 2, 0, 1, 60, 89, 15, 0, 11, - 30, 2, 0, 1, 60, 90, 15, 0, 11, 31, 2, 0, 1, 60, 91, 15, 0, 11, 32, 2, - 0, 1, 60, 92, 15, 33, 15, 34, 11, 35, 2, 0, 2, 60, 93, 15, 33, 15, 36, 11, - 37, 2, 0, 2, 60, 94, 15, 38, 11, 39, 2, 0, 1, 60, 95, 15, 38, 11, 5, 2, - 0, 1, 60, 96, 0, 0, 0, 0, 2, 0, 0, 0, 60, 0, 0, 0, 5,115,101,108, -102, 0, 0, 0, 0, 80, 0, 0, 0, 2,105, 0, 0, 0, 0, 40, 2, 0, 0, 0, - 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 4, 47, 42, 10, 0, 2, 0, 0, - 0, 17, 42, 42, 32, 76,117, 97, 32, 98,105,110,100,105,110,103, 58, 32, 0, 2, - 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, - 0, 0, 0, 2, 10, 0, 2, 0, 0, 0, 31, 42, 42, 32, 71,101,110,101,114, 97, -116,101,100, 32, 97,117,116,111,109, 97,116,105, 99, 97,108,108,121, 32, 98,121, - 32, 0, 2, 0, 0, 0, 14, 84, 79, 76, 85, 65, 95, 86, 69, 82, 83, 73, 79, 78, - 0, 2, 0, 0, 0, 5, 32,111,110, 32, 0, 2, 0, 0, 0, 5,100, 97,116,101, - 0, 2, 0, 0, 0, 3, 46, 10, 0, 2, 0, 0, 0, 5, 42, 47, 10, 10, 0, 2, - 0, 0, 0, 6,102,108, 97,103,115, 0, 2, 0, 0, 0, 2,104, 0, 2, 0, 0, - 0, 24, 47, 42, 32, 69,120,112,111,114,116,101,100, 32,102,117,110, 99,116,105, -111,110, 32, 42, 47, 0, 2, 0, 0, 0, 12,105,110,116, 32, 32,116,111,108,117, - 97, 95, 0, 2, 0, 0, 0, 14, 95,111,112,101,110, 32, 40,118,111,105,100, 41, - 59, 0, 2, 0, 0, 0, 12,118,111,105,100, 32,116,111,108,117, 97, 95, 0, 2, - 0, 0, 0, 15, 95, 99,108,111,115,101, 32, 40,118,111,105,100, 41, 59, 0, 2, - 0, 0, 0, 2, 97, 0, 2, 0, 0, 0, 45, 47, 42, 32, 65,117,116,111,109, 97, -116,105, 99, 32,105,110,105,116,105, 97,108,105,122, 97,116,105,111,110, 32,102, -111,114, 32, 67, 43, 43, 32, 99,111,100,101, 32, 42, 47, 10, 0, 2, 0, 0, 0, - 20, 35,105,102,100,101,102, 32, 95, 95, 99,112,108,117,115,112,108,117,115, 10, - 0, 2, 0, 0, 0, 26,115,116, 97,116,105, 99, 32,105,110,116, 32,100,117,109, -109,121, 32, 61, 32,116,111,108,117, 97, 95, 0, 2, 0, 0, 0, 10, 95,111,112, -101,110, 32, 40, 41, 59, 0, 2, 0, 0, 0, 9, 35,101,110,100,105,102, 10, 10, - 0, 2, 0, 0, 0, 21, 35,105,110, 99,108,117,100,101, 32, 34,116,111,108,117, - 97, 46,104, 34, 10, 10, 0, 2, 0, 0, 0, 2,105, 0, 2, 0, 0, 0, 9,112, -114,101, 97,109, 98,108,101, 0, 2, 0, 0, 0, 20, 47, 42, 32,116, 97,103, 32, -118, 97,114,105, 97, 98,108,101,115, 32, 42, 47, 0, 2, 0, 0, 0, 8,100,101, - 99,108,116, 97,103, 0, 2, 0, 0, 0, 51, 47, 42, 32,102,117,110, 99,116,105, -111,110, 32,116,111, 32,114,101,103,105,115,116,101,114, 32,116,121,112,101, 32, - 97,110,100, 32,105,110,105,116,105, 97,108,105,122,101, 32,116, 97,103, 32, 42, - 47, 0, 2, 0, 0, 0, 35,115,116, 97,116,105, 99, 32,118,111,105,100, 32,116, -111,108,117, 97, 73, 95,105,110,105,116, 95,116, 97,103, 32, 40,118,111,105,100, - 41, 0, 2, 0, 0, 0, 2,123, 0, 2, 0, 0, 0, 8,102,111,114,101, 97, 99, -104, 0, 2, 0, 0, 0, 10, 95,117,115,101,114,116,121,112,101, 0, 4, 0, 0, - 0, 92, 0, 0, 0, 13, 64,112, 97, 99,107, 97,103,101, 46,108,117, 97, 0, 0, - 0, 0, 16, 6, 2, 60, 92, 15, 2, 11, 3, 13, 1, 11, 4, 2, 0, 3, 0, 0, - 0, 0, 2, 0, 0, 0, 92, 0, 0, 0, 2,110, 0, 0, 0, 0, 92, 0, 0, 0, - 2,118, 0, 0, 0, 0, 5, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 2,118, - 0, 2, 0, 0, 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 18, 32,116, -111,108,117, 97, 95,117,115,101,114,116,121,112,101, 40, 34, 0, 2, 0, 0, 0, - 4, 34, 41, 59, 0, 2, 0, 0, 0, 10, 95,116, 97,103,110, 97,109,101,115, 0, - 4, 0, 0, 0, 93, 0, 0, 0, 13, 64,112, 97, 99,107, 97,103,101, 46,108,117, - 97, 0, 0, 0, 0, 21, 7, 2, 60, 93, 15, 2, 11, 3, 13, 1, 11, 4, 13, 0, - 42, 11, 5, 2, 0, 4, 0, 0, 0, 0, 2, 0, 0, 0, 93, 0, 0, 0, 2,110, - 0, 0, 0, 0, 93, 0, 0, 0, 2,118, 0, 0, 0, 0, 6, 2, 0, 0, 0, 2, -110, 0, 2, 0, 0, 0, 2,118, 0, 2, 0, 0, 0, 7,111,117,116,112,117,116, - 0, 2, 0, 0, 0, 16, 32,116,111,108,117, 97, 95,115,101,116,116, 97,103, 40, - 34, 0, 2, 0, 0, 0, 4, 34, 44, 38, 0, 2, 0, 0, 0, 3, 41, 59, 0, 2, - 0, 0, 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 2,125, 0, 2, 0, - 0, 0, 9,114,101,103,105,115,116,101,114, 0, 4, 0, 0, 0,100, 0, 0, 0, - 13, 64,112, 97, 99,107, 97,103,101, 46,108,117, 97, 0, 0, 0, 0,132, 4, 1, - 60,101, 15, 0, 11, 1, 2, 0, 1, 60,102, 15, 0, 11, 2, 13, 0, 18, 4, 42, - 11, 5, 42, 2, 0, 1, 60,103, 15, 0, 11, 6, 2, 0, 1, 60,104, 15, 0, 11, - 7, 2, 0, 1, 60,105, 15, 0, 11, 8, 2, 0, 1, 60,106, 15, 0, 11, 9, 2, - 0, 1, 60,107, 7, 1, 50, 23, 60,109, 13, 0, 13, 1, 16, 20, 11, 2, 0, 1, - 60,110, 13, 1, 7, 1, 37, 23, 1, 60,111, 60,108, 13, 0, 13, 1, 16, 54, 32, - 60,112, 15, 0, 11, 12, 2, 0, 1, 60,113, 15, 0, 11, 13, 2, 0, 1, 60,114, - 15, 0, 11, 14, 2, 0, 1, 60,115, 0, 0, 0, 0, 2, 0, 0, 0,100, 0, 0, - 0, 5,115,101,108,102, 0, 0, 0, 0,107, 0, 0, 0, 2,105, 0, 0, 0, 0, - 15, 2, 0, 0, 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 20, 47, 42, - 32, 79,112,101,110, 32,102,117,110, 99,116,105,111,110, 32, 42, 47, 0, 2, 0, - 0, 0, 11,105,110,116, 32,116,111,108,117, 97, 95, 0, 2, 0, 0, 0, 5,115, -101,108,102, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 13, 95, -111,112,101,110, 32, 40,118,111,105,100, 41, 0, 2, 0, 0, 0, 2,123, 0, 2, - 0, 0, 0, 15, 32,116,111,108,117, 97, 95,111,112,101,110, 40, 41, 59, 0, 2, - 0, 0, 0, 19, 32,108,117, 97, 95, 98,101,103,105,110, 98,108,111, 99,107, 40, - 41, 59, 0, 2, 0, 0, 0, 20, 32,116,111,108,117, 97, 73, 95,105,110,105,116, - 95,116, 97,103, 40, 41, 59, 0, 2, 0, 0, 0, 2,105, 0, 2, 0, 0, 0, 9, -114,101,103,105,115,116,101,114, 0, 2, 0, 0, 0, 17, 32,108,117, 97, 95,101, -110,100, 98,108,111, 99,107, 40, 41, 59, 0, 2, 0, 0, 0, 11, 32,114,101,116, -117,114,110, 32, 49, 59, 0, 2, 0, 0, 0, 2,125, 0, 2, 0, 0, 0, 11,117, -110,114,101,103,105,115,116,101,114, 0, 4, 0, 0, 0,119, 0, 0, 0, 13, 64, -112, 97, 99,107, 97,103,101, 46,108,117, 97, 0, 0, 0, 0, 87, 4, 1, 60,120, - 15, 0, 11, 1, 2, 0, 1, 60,121, 15, 0, 11, 2, 13, 0, 18, 4, 42, 11, 5, - 42, 2, 0, 1, 60,122, 15, 0, 11, 6, 2, 0, 1, 60,123, 7, 1, 50, 23, 60, -125, 13, 0, 13, 1, 16, 20, 8, 2, 0, 1, 60,126, 13, 1, 7, 1, 37, 23, 1, - 60,127, 60,124, 13, 0, 13, 1, 16, 54, 32, 60,128, 15, 0, 11, 9, 2, 0, 1, - 60,129, 0, 0, 0, 0, 2, 0, 0, 0,119, 0, 0, 0, 5,115,101,108,102, 0, - 0, 0, 0,123, 0, 0, 0, 2,105, 0, 0, 0, 0, 10, 2, 0, 0, 0, 7,111, -117,116,112,117,116, 0, 2, 0, 0, 0, 21, 47, 42, 32, 67,108,111,115,101, 32, -102,117,110, 99,116,105,111,110, 32, 42, 47, 0, 2, 0, 0, 0, 12,118,111,105, -100, 32,116,111,108,117, 97, 95, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, - 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 14, 95, 99,108,111,115,101, - 32, 40,118,111,105,100, 41, 0, 2, 0, 0, 0, 2,123, 0, 2, 0, 0, 0, 2, -105, 0, 2, 0, 0, 0, 11,117,110,114,101,103,105,115,116,101,114, 0, 2, 0, - 0, 0, 2,125, 0, 2, 0, 0, 0, 7,104,101, 97,100,101,114, 0, 4, 0, 0, - 0,132, 0, 0, 0, 13, 64,112, 97, 99,107, 97,103,101, 46,108,117, 97, 0, 0, - 0, 0,127, 4, 1, 60,133, 15, 0, 11, 1, 2, 0, 1, 15, 0, 11, 2, 13, 0, - 18, 4, 42, 11, 5, 42, 2, 0, 1, 60,134, 15, 0, 11, 6, 15, 7, 42, 11, 8, - 42, 15, 9, 2, 1, 0, 42, 11, 10, 42, 2, 0, 1, 60,135, 15, 0, 11, 11, 2, - 0, 1, 60,137, 15, 12, 18, 13, 44, 52, 54, 60,138, 15, 0, 11, 14, 2, 0, 1, - 60,139, 15, 0, 11, 15, 13, 0, 18, 4, 42, 11, 16, 42, 2, 0, 1, 60,140, 15, - 0, 11, 17, 13, 0, 18, 4, 42, 11, 18, 42, 2, 0, 1, 60,141, 15, 0, 11, 5, - 2, 0, 1, 50, 2, 60,142, 60,143, 0, 0, 0, 0, 1, 0, 0, 0,132, 0, 0, - 0, 5,115,101,108,102, 0, 0, 0, 0, 19, 2, 0, 0, 0, 7,111,117,116,112, -117,116, 0, 2, 0, 0, 0, 4, 47, 42, 10, 0, 2, 0, 0, 0, 17, 42, 42, 32, - 76,117, 97, 32, 98,105,110,100,105,110,103, 58, 32, 0, 2, 0, 0, 0, 5,115, -101,108,102, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 2, 10, - 0, 2, 0, 0, 0, 31, 42, 42, 32, 71,101,110,101,114, 97,116,101,100, 32, 97, -117,116,111,109, 97,116,105, 99, 97,108,108,121, 32, 98,121, 32, 0, 2, 0, 0, - 0, 14, 84, 79, 76, 85, 65, 95, 86, 69, 82, 83, 73, 79, 78, 0, 2, 0, 0, 0, - 5, 32,111,110, 32, 0, 2, 0, 0, 0, 5,100, 97,116,101, 0, 2, 0, 0, 0, - 3, 46, 10, 0, 2, 0, 0, 0, 5, 42, 47, 10, 10, 0, 2, 0, 0, 0, 6,102, -108, 97,103,115, 0, 2, 0, 0, 0, 2,104, 0, 2, 0, 0, 0, 24, 47, 42, 32, - 69,120,112,111,114,116,101,100, 32,102,117,110, 99,116,105,111,110, 32, 42, 47, - 0, 2, 0, 0, 0, 12,105,110,116, 32, 32,116,111,108,117, 97, 95, 0, 2, 0, - 0, 0, 14, 95,111,112,101,110, 32, 40,118,111,105,100, 41, 59, 0, 2, 0, 0, - 0, 12,118,111,105,100, 32,116,111,108,117, 97, 95, 0, 2, 0, 0, 0, 15, 95, - 99,108,111,115,101, 32, 40,118,111,105,100, 41, 59, 0, 2, 0, 0, 0, 9, 95, - 80, 97, 99,107, 97,103,101, 0, 4, 0, 0, 0,146, 0, 0, 0, 13, 64,112, 97, - 99,107, 97,103,101, 46,108,117, 97, 0, 0, 0, 0, 31, 4, 1, 60,147, 13, 0, - 11, 1, 15, 2, 26, 60,148, 15, 3, 13, 0, 15, 4, 2, 0, 2, 60,149, 13, 0, - 1, 1, 60,150, 0, 0, 0, 0, 1, 0, 0, 0,146, 0, 0, 0, 2,116, 0, 0, - 0, 0, 5, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 6, 95, 98, 97,115,101, - 0, 2, 0, 0, 0, 13, 99,108, 97,115,115, 80, 97, 99,107, 97,103,101, 0, 2, - 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, 10,116,111,108,117, - 97, 95,116, 97,103, 0, 2, 0, 0, 0, 8, 80, 97, 99,107, 97,103,101, 0, 4, - 0, 0, 0,155, 0, 0, 0, 13, 64,112, 97, 99,107, 97,103,101, 46,108,117, 97, - 0, 0, 0, 0,114, 10, 1, 60,157, 15, 2, 11, 3, 2, 1, 1, 60,159, 4, 0, - 60,161, 15, 5, 13, 1, 11, 6, 11, 7, 60,169, 2, 2, 3, 23, 2, 23, 1, 60, -170, 13, 2, 7, 0, 32, 56, 28, 60,172, 15, 9, 15, 10, 22, 2, 11, 0, 13, 0, - 11, 1, 13, 1, 30, 1, 2, 1, 1, 2, 1, 1, 60,173, 15, 11, 13, 3, 2, 0, - 1, 60,174, 13, 3, 20, 12, 2, 0, 1, 60,175, 13, 3, 20, 13, 13, 3, 18, 1, - 2, 0, 2, 60,176, 15, 14, 2, 0, 0, 60,177, 13, 3, 1, 4, 60,178, 0, 0, - 0, 0, 4, 0, 0, 0,155, 0, 0, 0, 5,110, 97,109,101, 0, 0, 0, 0,157, - 0, 0, 0, 5, 99,111,100,101, 0, 0, 0, 0,159, 0, 0, 0, 7,110,115,117, - 98,115,116, 0, 0, 0, 0,172, 0, 0, 0, 2,116, 0, 0, 0, 0, 15, 2, 0, - 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 5, 99,111,100,101, 0, 2, 0, - 0, 0, 5,114,101, 97,100, 0, 2, 0, 0, 0, 3, 46, 42, 0, 2, 0, 0, 0, - 7,110,115,117, 98,115,116, 0, 2, 0, 0, 0, 5,103,115,117, 98, 0, 2, 0, - 0, 0, 13, 37, 36, 60, 40, 46, 45, 41, 62, 37,115, 42, 10, 0, 4, 0, 0, 0, -161, 0, 0, 0, 13, 64,112, 97, 99,107, 97,103,101, 46,108,117, 97, 0, 0, 0, - 0, 71, 6, 1, 60,162, 15, 3, 13, 0, 11, 4, 2, 2, 2, 60,163, 13, 1, 44, - 52, 20, 60,164, 15, 5, 11, 6, 13, 2, 42, 11, 7, 42, 13, 0, 42, 2, 0, 1, - 50, 2, 60,165, 60,166, 15, 9, 13, 1, 11, 10, 2, 1, 2, 60,167, 15, 11, 13, - 1, 2, 0, 1, 60,168, 13, 3, 1, 4, 60,169, 0, 0, 0, 0, 4, 0, 0, 0, -161, 0, 0, 0, 3,102,110, 0, 0, 0, 0,162, 0, 0, 0, 3,102,112, 0, 0, - 0, 0,162, 0, 0, 0, 4,109,115,103, 0, 0, 0, 0,166, 0, 0, 0, 2,115, - 0, 0, 0, 0, 12, 2, 0, 0, 0, 3,102,110, 0, 2, 0, 0, 0, 3,102,112, - 0, 2, 0, 0, 0, 4,109,115,103, 0, 2, 0, 0, 0, 9,111,112,101,110,102, -105,108,101, 0, 2, 0, 0, 0, 2,114, 0, 2, 0, 0, 0, 6,101,114,114,111, -114, 0, 2, 0, 0, 0, 2, 35, 0, 2, 0, 0, 0, 3, 58, 32, 0, 2, 0, 0, - 0, 2,115, 0, 2, 0, 0, 0, 5,114,101, 97,100, 0, 2, 0, 0, 0, 3, 46, - 42, 0, 2, 0, 0, 0, 10, 99,108,111,115,101,102,105,108,101, 0, 2, 0, 0, - 0, 2,116, 0, 2, 0, 0, 0, 9, 95, 80, 97, 99,107, 97,103,101, 0, 2, 0, - 0, 0, 11, 95, 67,111,110,116, 97,105,110,101,114, 0, 2, 0, 0, 0, 5,112, -117,115,104, 0, 2, 0, 0, 0, 11,112,114,101,112,114,111, 99,101,115,115, 0, - 2, 0, 0, 0, 6,112, 97,114,115,101, 0, 2, 0, 0, 0, 4,112,111,112, 0, - -}; - -/* module.lo */ -static char B6[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 12, 64,109,111,100,117,108, -101, 46,108,117, 97, 0, 0, 0, 0, 75, 5, 0, 60, 19, 22, 2, 60, 20, 11, 1, - 15, 2, 11, 3, 60, 21, 11, 4, 30, 1, 60, 22, 25, 0, 60, 23, 15, 5, 15, 0, - 15, 6, 2, 0, 2, 60, 26, 15, 0, 11, 7, 11, 8, 26, 60, 36, 15, 0, 11, 9, - 11, 10, 26, 60, 41, 15, 0, 11, 11, 11, 12, 26, 60, 53, 11, 14, 25, 13, 60, 62, - 11, 16, 25, 15, 0, 0, 0, 0, 0, 0, 0, 0, 17, 2, 0, 0, 0, 12, 99,108, - 97,115,115, 77,111,100,117,108,101, 0, 2, 0, 0, 0, 6, 95, 98, 97,115,101, - 0, 2, 0, 0, 0, 15, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, - 0, 2, 0, 0, 0, 5,116,121,112,101, 0, 2, 0, 0, 0, 7,109,111,100,117, -108,101, 0, 2, 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, 10, -116,111,108,117, 97, 95,116, 97,103, 0, 2, 0, 0, 0, 9,114,101,103,105,115, -116,101,114, 0, 4, 0, 0, 0, 26, 0, 0, 0, 12, 64,109,111,100,117,108,101, - 46,108,117, 97, 0, 0, 0, 0, 60, 4, 1, 60, 27, 15, 0, 11, 1, 13, 0, 18, - 3, 42, 11, 4, 42, 2, 0, 1, 60, 28, 7, 1, 50, 23, 60, 30, 13, 0, 13, 1, - 16, 20, 6, 2, 0, 1, 60, 31, 13, 1, 7, 1, 37, 23, 1, 60, 32, 60, 29, 13, - 0, 13, 1, 16, 54, 32, 60, 33, 0, 0, 0, 0, 2, 0, 0, 0, 26, 0, 0, 0, - 5,115,101,108,102, 0, 0, 0, 0, 28, 0, 0, 0, 2,105, 0, 0, 0, 0, 7, - 2, 0, 0, 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 16, 32,116,111, -108,117, 97, 95,109,111,100,117,108,101, 40, 34, 0, 2, 0, 0, 0, 5,115,101, -108,102, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 4, 34, 41, - 59, 0, 2, 0, 0, 0, 2,105, 0, 2, 0, 0, 0, 9,114,101,103,105,115,116, -101,114, 0, 2, 0, 0, 0, 11,117,110,114,101,103,105,115,116,101,114, 0, 4, - 0, 0, 0, 36, 0, 0, 0, 12, 64,109,111,100,117,108,101, 46,108,117, 97, 0, - 0, 0, 0, 22, 4, 1, 60, 37, 15, 0, 11, 1, 13, 0, 18, 3, 42, 11, 4, 42, - 2, 0, 1, 60, 38, 0, 0, 0, 0, 1, 0, 0, 0, 36, 0, 0, 0, 5,115,101, -108,102, 0, 0, 0, 0, 5, 2, 0, 0, 0, 7,111,117,116,112,117,116, 0, 2, - 0, 0, 0, 32, 32,108,117, 97, 95,112,117,115,104,110,105,108, 40, 41, 59, 32, -108,117, 97, 95,115,101,116,103,108,111, 98, 97,108, 40, 34, 0, 2, 0, 0, 0, - 5,115,101,108,102, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, - 4, 34, 41, 59, 0, 2, 0, 0, 0, 6,112,114,105,110,116, 0, 4, 0, 0, 0, - 41, 0, 0, 0, 12, 64,109,111,100,117,108,101, 46,108,117, 97, 0, 0, 0, 0, - 97, 8, 3, 60, 42, 15, 2, 13, 1, 11, 3, 42, 2, 0, 1, 60, 43, 15, 2, 13, - 1, 11, 4, 42, 13, 0, 18, 6, 42, 11, 7, 42, 2, 0, 1, 60, 44, 7, 1, 50, - 30, 60, 46, 13, 0, 13, 3, 16, 20, 2, 13, 1, 11, 9, 42, 11, 10, 2, 0, 3, - 60, 47, 13, 3, 7, 1, 37, 23, 3, 60, 48, 60, 45, 13, 0, 13, 3, 16, 54, 39, - 60, 49, 15, 2, 13, 1, 11, 11, 42, 13, 2, 42, 2, 0, 1, 60, 50, 0, 0, 0, - 0, 4, 0, 0, 0, 41, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 41, 0, - 0, 0, 6,105,100,101,110,116, 0, 0, 0, 0, 41, 0, 0, 0, 6, 99,108,111, -115,101, 0, 0, 0, 0, 44, 0, 0, 0, 2,105, 0, 0, 0, 0, 12, 2, 0, 0, - 0, 6,105,100,101,110,116, 0, 2, 0, 0, 0, 6, 99,108,111,115,101, 0, 2, - 0, 0, 0, 6,112,114,105,110,116, 0, 2, 0, 0, 0, 8, 77,111,100,117,108, -101,123, 0, 2, 0, 0, 0, 10, 32,110, 97,109,101, 32, 61, 32, 39, 0, 2, 0, - 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, - 0, 0, 3, 39, 59, 0, 2, 0, 0, 0, 2,105, 0, 2, 0, 0, 0, 2, 32, 0, - 2, 0, 0, 0, 2, 44, 0, 2, 0, 0, 0, 2,125, 0, 2, 0, 0, 0, 8, 95, - 77,111,100,117,108,101, 0, 4, 0, 0, 0, 53, 0, 0, 0, 12, 64,109,111,100, -117,108,101, 46,108,117, 97, 0, 0, 0, 0, 40, 4, 1, 60, 54, 13, 0, 11, 1, - 15, 2, 26, 60, 55, 15, 3, 13, 0, 15, 4, 2, 0, 2, 60, 56, 15, 5, 13, 0, - 2, 0, 1, 60, 57, 13, 0, 1, 1, 60, 58, 0, 0, 0, 0, 1, 0, 0, 0, 53, - 0, 0, 0, 2,116, 0, 0, 0, 0, 6, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, - 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, 0, 12, 99,108, 97,115,115, 77,111, -100,117,108,101, 0, 2, 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, - 0, 10,116,111,108,117, 97, 95,116, 97,103, 0, 2, 0, 0, 0, 7, 97,112,112, -101,110,100, 0, 2, 0, 0, 0, 7, 77,111,100,117,108,101, 0, 4, 0, 0, 0, - 62, 0, 0, 0, 12, 64,109,111,100,117,108,101, 46,108,117, 97, 0, 0, 0, 0, - 75, 10, 2, 60, 63, 15, 3, 15, 4, 22, 1, 11, 5, 13, 0, 30, 0, 2, 1, 1, - 2, 1, 1, 60, 64, 15, 6, 13, 2, 2, 0, 1, 60, 65, 13, 2, 20, 7, 15, 8, - 13, 1, 7, 2, 15, 9, 13, 1, 2, 1, 1, 7, 1, 38, 2, 1, 3, 2, 0, 2, - 60, 66, 15, 10, 2, 0, 0, 60, 67, 13, 2, 1, 3, 60, 68, 0, 0, 0, 0, 3, - 0, 0, 0, 62, 0, 0, 0, 2,110, 0, 0, 0, 0, 62, 0, 0, 0, 2, 98, 0, - 0, 0, 0, 63, 0, 0, 0, 2,116, 0, 0, 0, 0, 11, 2, 0, 0, 0, 2,110, - 0, 2, 0, 0, 0, 2, 98, 0, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 8, - 95, 77,111,100,117,108,101, 0, 2, 0, 0, 0, 11, 95, 67,111,110,116, 97,105, -110,101,114, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 5,112, -117,115,104, 0, 2, 0, 0, 0, 6,112, 97,114,115,101, 0, 2, 0, 0, 0, 7, -115,116,114,115,117, 98, 0, 2, 0, 0, 0, 7,115,116,114,108,101,110, 0, 2, - 0, 0, 0, 4,112,111,112, 0, -}; - -/* class.lo */ -static char B7[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 11, 64, 99,108, 97,115,115, - 46,108,117, 97, 0, 0, 0, 0, 96, 9, 0, 60, 20, 22, 4, 60, 21, 11, 1, 15, - 2, 11, 3, 60, 22, 11, 4, 11, 5, 60, 23, 11, 6, 11, 7, 60, 24, 11, 6, 30, - 3, 60, 25, 25, 0, 60, 26, 15, 8, 15, 0, 15, 9, 2, 0, 2, 60, 30, 15, 0, - 11, 10, 11, 11, 26, 60, 40, 15, 0, 11, 12, 11, 13, 26, 60, 45, 15, 0, 11, 14, - 11, 15, 26, 60, 57, 15, 0, 11, 16, 11, 17, 26, 60, 70, 11, 19, 25, 18, 60, 79, - 11, 21, 25, 20, 0, 0, 0, 0, 0, 0, 0, 0, 22, 2, 0, 0, 0, 11, 99,108, - 97,115,115, 67,108, 97,115,115, 0, 2, 0, 0, 0, 6, 95, 98, 97,115,101, 0, - 2, 0, 0, 0, 15, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, 0, - 2, 0, 0, 0, 5,116,121,112,101, 0, 2, 0, 0, 0, 6, 99,108, 97,115,115, - 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, - 0, 5, 98, 97,115,101, 0, 2, 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, - 0, 0, 0, 10,116,111,108,117, 97, 95,116, 97,103, 0, 2, 0, 0, 0, 9,114, -101,103,105,115,116,101,114, 0, 4, 0, 0, 0, 30, 0, 0, 0, 11, 64, 99,108, - 97,115,115, 46,108,117, 97, 0, 0, 0, 0, 68, 4, 1, 60, 31, 15, 0, 11, 1, - 13, 0, 18, 3, 42, 11, 4, 42, 13, 0, 18, 5, 42, 11, 6, 42, 2, 0, 1, 60, - 32, 7, 1, 50, 23, 60, 34, 13, 0, 13, 1, 16, 20, 8, 2, 0, 1, 60, 35, 13, - 1, 7, 1, 37, 23, 1, 60, 36, 60, 33, 13, 0, 13, 1, 16, 54, 32, 60, 37, 0, - 0, 0, 0, 2, 0, 0, 0, 30, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, - 32, 0, 0, 0, 2,105, 0, 0, 0, 0, 9, 2, 0, 0, 0, 7,111,117,116,112, -117,116, 0, 2, 0, 0, 0, 16, 32,116,111,108,117, 97, 95, 99, 99,108, 97,115, -115, 40, 34, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 5,110, - 97,109,101, 0, 2, 0, 0, 0, 4, 34, 44, 34, 0, 2, 0, 0, 0, 5, 98, 97, -115,101, 0, 2, 0, 0, 0, 4, 34, 41, 59, 0, 2, 0, 0, 0, 2,105, 0, 2, - 0, 0, 0, 9,114,101,103,105,115,116,101,114, 0, 2, 0, 0, 0, 11,117,110, -114,101,103,105,115,116,101,114, 0, 4, 0, 0, 0, 40, 0, 0, 0, 11, 64, 99, -108, 97,115,115, 46,108,117, 97, 0, 0, 0, 0, 22, 4, 1, 60, 41, 15, 0, 11, - 1, 13, 0, 18, 3, 42, 11, 4, 42, 2, 0, 1, 60, 42, 0, 0, 0, 0, 1, 0, - 0, 0, 40, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 5, 2, 0, 0, 0, - 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 32, 32,108,117, 97, 95,112,117, -115,104,110,105,108, 40, 41, 59, 32,108,117, 97, 95,115,101,116,103,108,111, 98, - 97,108, 40, 34, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 5, -110, 97,109,101, 0, 2, 0, 0, 0, 4, 34, 41, 59, 0, 2, 0, 0, 0, 8,100, -101, 99,108,116, 97,103, 0, 4, 0, 0, 0, 45, 0, 0, 0, 11, 64, 99,108, 97, -115,115, 46,108,117, 97, 0, 0, 0, 0,128, 8, 1, 60, 46, 13, 0, 11, 1, 13, - 0, 11, 2, 15, 3, 13, 0, 18, 4, 2, 2, 1, 27, 1, 27, 2, 5, 4, 15, 5, - 13, 0, 18, 1, 13, 0, 18, 2, 2, 0, 2, 60, 47, 13, 0, 11, 6, 13, 0, 11, - 7, 15, 3, 13, 0, 18, 4, 11, 8, 2, 2, 2, 27, 1, 27, 2, 5, 4, 60, 48, - 15, 3, 13, 0, 18, 10, 2, 2, 1, 15, 5, 13, 1, 13, 2, 2, 0, 2, 60, 49, - 7, 1, 50, 23, 60, 51, 13, 0, 13, 3, 16, 20, 5, 2, 0, 1, 60, 52, 13, 3, - 7, 1, 37, 23, 3, 60, 53, 60, 50, 13, 0, 13, 3, 16, 54, 32, 60, 54, 0, 0, - 0, 0, 4, 0, 0, 0, 45, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 48, - 0, 0, 0, 5,116,121,112,101, 0, 0, 0, 0, 48, 0, 0, 0, 4,116, 97,103, - 0, 0, 0, 0, 49, 0, 0, 0, 2,105, 0, 0, 0, 0, 12, 2, 0, 0, 0, 5, -115,101,108,102, 0, 2, 0, 0, 0, 6,105,116,121,112,101, 0, 2, 0, 0, 0, - 4,116, 97,103, 0, 2, 0, 0, 0, 7,116, 97,103,118, 97,114, 0, 2, 0, 0, - 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 8,100,101, 99,108,116, 97,103, 0, - 2, 0, 0, 0, 7, 99,105,116,121,112,101, 0, 2, 0, 0, 0, 5, 99,116, 97, -103, 0, 2, 0, 0, 0, 6, 99,111,110,115,116, 0, 2, 0, 0, 0, 5,116,121, -112,101, 0, 2, 0, 0, 0, 5, 98, 97,115,101, 0, 2, 0, 0, 0, 2,105, 0, - 2, 0, 0, 0, 6,112,114,105,110,116, 0, 4, 0, 0, 0, 57, 0, 0, 0, 11, - 64, 99,108, 97,115,115, 46,108,117, 97, 0, 0, 0, 0,117, 8, 3, 60, 58, 15, - 2, 13, 1, 11, 3, 42, 2, 0, 1, 60, 59, 15, 2, 13, 1, 11, 4, 42, 13, 0, - 18, 6, 42, 11, 7, 42, 2, 0, 1, 60, 60, 15, 2, 13, 1, 11, 8, 42, 13, 0, - 18, 9, 42, 11, 10, 42, 2, 0, 1, 60, 61, 7, 1, 50, 30, 60, 63, 13, 0, 13, - 3, 16, 20, 2, 13, 1, 11, 12, 42, 11, 13, 2, 0, 3, 60, 64, 13, 3, 7, 1, - 37, 23, 3, 60, 65, 60, 62, 13, 0, 13, 3, 16, 54, 39, 60, 66, 15, 2, 13, 1, - 11, 14, 42, 13, 2, 42, 2, 0, 1, 60, 67, 0, 0, 0, 0, 4, 0, 0, 0, 57, - 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 57, 0, 0, 0, 6,105,100,101, -110,116, 0, 0, 0, 0, 57, 0, 0, 0, 6, 99,108,111,115,101, 0, 0, 0, 0, - 61, 0, 0, 0, 2,105, 0, 0, 0, 0, 15, 2, 0, 0, 0, 6,105,100,101,110, -116, 0, 2, 0, 0, 0, 6, 99,108,111,115,101, 0, 2, 0, 0, 0, 6,112,114, -105,110,116, 0, 2, 0, 0, 0, 7, 67,108, 97,115,115,123, 0, 2, 0, 0, 0, - 10, 32,110, 97,109,101, 32, 61, 32, 39, 0, 2, 0, 0, 0, 5,115,101,108,102, - 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 3, 39, 44, 0, 2, - 0, 0, 0, 10, 32, 98, 97,115,101, 32, 61, 32, 39, 0, 2, 0, 0, 0, 5, 98, - 97,115,101, 0, 2, 0, 0, 0, 3, 39, 59, 0, 2, 0, 0, 0, 2,105, 0, 2, - 0, 0, 0, 2, 32, 0, 2, 0, 0, 0, 2, 44, 0, 2, 0, 0, 0, 2,125, 0, - 2, 0, 0, 0, 7, 95, 67,108, 97,115,115, 0, 4, 0, 0, 0, 70, 0, 0, 0, - 11, 64, 99,108, 97,115,115, 46,108,117, 97, 0, 0, 0, 0, 40, 4, 1, 60, 71, - 13, 0, 11, 1, 15, 2, 26, 60, 72, 15, 3, 13, 0, 15, 4, 2, 0, 2, 60, 73, - 15, 5, 13, 0, 2, 0, 1, 60, 74, 13, 0, 1, 1, 60, 75, 0, 0, 0, 0, 1, - 0, 0, 0, 70, 0, 0, 0, 2,116, 0, 0, 0, 0, 6, 2, 0, 0, 0, 2,116, - 0, 2, 0, 0, 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, 0, 11, 99,108, 97, -115,115, 67,108, 97,115,115, 0, 2, 0, 0, 0, 7,115,101,116,116, 97,103, 0, - 2, 0, 0, 0, 10,116,111,108,117, 97, 95,116, 97,103, 0, 2, 0, 0, 0, 7, - 97,112,112,101,110,100, 0, 2, 0, 0, 0, 6, 67,108, 97,115,115, 0, 4, 0, - 0, 0, 79, 0, 0, 0, 11, 64, 99,108, 97,115,115, 46,108,117, 97, 0, 0, 0, - 0, 73, 11, 3, 60, 80, 15, 4, 15, 5, 22, 2, 11, 6, 13, 0, 11, 7, 13, 1, - 30, 1, 2, 1, 1, 2, 1, 1, 60, 81, 15, 8, 13, 3, 2, 0, 1, 60, 82, 13, - 3, 20, 9, 15, 10, 13, 2, 7, 2, 15, 11, 13, 2, 2, 1, 1, 7, 1, 38, 2, - 1, 3, 2, 0, 2, 60, 83, 15, 12, 2, 0, 0, 60, 84, 0, 0, 0, 0, 4, 0, - 0, 0, 79, 0, 0, 0, 2,110, 0, 0, 0, 0, 79, 0, 0, 0, 2,112, 0, 0, - 0, 0, 79, 0, 0, 0, 2, 98, 0, 0, 0, 0, 80, 0, 0, 0, 2, 99, 0, 0, - 0, 0, 13, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 2,112, 0, 2, 0, 0, - 0, 2, 98, 0, 2, 0, 0, 0, 2, 99, 0, 2, 0, 0, 0, 7, 95, 67,108, 97, -115,115, 0, 2, 0, 0, 0, 11, 95, 67,111,110,116, 97,105,110,101,114, 0, 2, - 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 5, 98, 97,115,101, 0, 2, - 0, 0, 0, 5,112,117,115,104, 0, 2, 0, 0, 0, 6,112, 97,114,115,101, 0, - 2, 0, 0, 0, 7,115,116,114,115,117, 98, 0, 2, 0, 0, 0, 7,115,116,114, -108,101,110, 0, 2, 0, 0, 0, 4,112,111,112, 0, -}; - -/* typedef.lo */ -static char B8[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 13, 64,116,121,112,101,100, -101,102, 46,108,117, 97, 0, 0, 0, 0, 52, 7, 0, 60, 24, 22, 3, 60, 25, 11, - 1, 11, 2, 11, 3, 60, 26, 11, 2, 11, 4, 60, 27, 11, 2, 30, 2, 60, 28, 25, - 0, 60, 31, 15, 0, 11, 5, 11, 6, 26, 60, 40, 11, 8, 25, 7, 60, 49, 11, 10, - 25, 9, 0, 0, 0, 0, 0, 0, 0, 0, 11, 2, 0, 0, 0, 13, 99,108, 97,115, -115, 84,121,112,101,100,101,102, 0, 2, 0, 0, 0, 6,117,116,121,112,101, 0, - 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 4,109,111,100, 0, 2, 0, 0, 0, 5, -116,121,112,101, 0, 2, 0, 0, 0, 6,112,114,105,110,116, 0, 4, 0, 0, 0, - 31, 0, 0, 0, 13, 64,116,121,112,101,100,101,102, 46,108,117, 97, 0, 0, 0, - 0, 92, 6, 3, 60, 32, 15, 2, 13, 1, 11, 3, 42, 2, 0, 1, 60, 33, 15, 2, - 13, 1, 11, 4, 42, 13, 0, 18, 6, 42, 11, 7, 42, 2, 0, 1, 60, 34, 15, 2, - 13, 1, 11, 8, 42, 13, 0, 18, 9, 42, 11, 7, 42, 2, 0, 1, 60, 35, 15, 2, - 13, 1, 11, 10, 42, 13, 0, 18, 11, 42, 11, 7, 42, 2, 0, 1, 60, 36, 15, 2, - 13, 1, 11, 12, 42, 13, 2, 42, 2, 0, 1, 60, 37, 0, 0, 0, 0, 3, 0, 0, - 0, 31, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 31, 0, 0, 0, 6,105, -100,101,110,116, 0, 0, 0, 0, 31, 0, 0, 0, 6, 99,108,111,115,101, 0, 0, - 0, 0, 13, 2, 0, 0, 0, 6,105,100,101,110,116, 0, 2, 0, 0, 0, 6, 99, -108,111,115,101, 0, 2, 0, 0, 0, 6,112,114,105,110,116, 0, 2, 0, 0, 0, - 9, 84,121,112,101,100,101,102,123, 0, 2, 0, 0, 0, 11, 32,117,116,121,112, -101, 32, 61, 32, 39, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, - 6,117,116,121,112,101, 0, 2, 0, 0, 0, 3, 39, 44, 0, 2, 0, 0, 0, 9, - 32,109,111,100, 32, 61, 32, 39, 0, 2, 0, 0, 0, 4,109,111,100, 0, 2, 0, - 0, 0, 10, 32,116,121,112,101, 32, 61, 32, 39, 0, 2, 0, 0, 0, 5,116,121, -112,101, 0, 2, 0, 0, 0, 2,125, 0, 2, 0, 0, 0, 9, 95, 84,121,112,101, -100,101,102, 0, 4, 0, 0, 0, 40, 0, 0, 0, 13, 64,116,121,112,101,100,101, -102, 46,108,117, 97, 0, 0, 0, 0, 40, 4, 1, 60, 41, 13, 0, 11, 1, 15, 2, - 26, 60, 42, 15, 3, 13, 0, 15, 4, 2, 0, 2, 60, 43, 15, 5, 13, 0, 2, 0, - 1, 60, 44, 13, 0, 1, 1, 60, 45, 0, 0, 0, 0, 1, 0, 0, 0, 40, 0, 0, - 0, 2,116, 0, 0, 0, 0, 6, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 6, - 95, 98, 97,115,101, 0, 2, 0, 0, 0, 13, 99,108, 97,115,115, 84,121,112,101, -100,101,102, 0, 2, 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, - 10,116,111,108,117, 97, 95,116, 97,103, 0, 2, 0, 0, 0, 14, 97,112,112,101, -110,100,116,121,112,101,100,101,102, 0, 2, 0, 0, 0, 8, 84,121,112,101,100, -101,102, 0, 4, 0, 0, 0, 49, 0, 0, 0, 13, 64,116,121,112,101,100,101,102, - 46,108,117, 97, 0, 0, 0, 0,109, 14, 1, 60, 50, 15, 1, 13, 0, 11, 2, 2, - 1, 2, 52, 11, 60, 51, 15, 3, 11, 4, 2, 0, 1, 50, 2, 60, 52, 60, 53, 15, - 6, 15, 7, 13, 0, 11, 8, 11, 9, 2, 1, 3, 11, 9, 2, 1, 2, 60, 54, 15, - 10, 22, 3, 60, 55, 11, 11, 13, 1, 13, 1, 18, 12, 16, 11, 13, 60, 56, 13, 1, - 13, 1, 18, 12, 7, 1, 38, 16, 11, 14, 60, 57, 15, 15, 13, 1, 7, 1, 13, 1, - 18, 12, 7, 2, 38, 2, 1, 3, 30, 2, 60, 58, 3, 2, 1, 60, 59, 0, 0, 0, - 0, 2, 0, 0, 0, 49, 0, 0, 0, 2,115, 0, 0, 0, 0, 53, 0, 0, 0, 2, -116, 0, 0, 0, 0, 16, 2, 0, 0, 0, 2,115, 0, 2, 0, 0, 0, 8,115,116, -114,102,105,110,100, 0, 2, 0, 0, 0, 6, 91, 37, 42, 38, 93, 0, 2, 0, 0, - 0, 12,116,111,108,117, 97, 95,101,114,114,111,114, 0, 2, 0, 0, 0, 62, 35, -105,110,118, 97,108,105,100, 32,116,121,112,101,100,101,102, 58, 32,112,111,105, -110,116,101,114,115, 32, 40, 97,110,100, 32,114,101,102,101,114,101,110, 99,101, -115, 41, 32, 97,114,101, 32,110,111,116, 32,115,117,112,112,111,114,116,101,100, - 0, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 6,115,112,108,105,116, 0, 2, - 0, 0, 0, 5,103,115,117, 98, 0, 2, 0, 0, 0, 6, 37,115, 37,115, 42, 0, - 2, 0, 0, 0, 2, 32, 0, 2, 0, 0, 0, 9, 95, 84,121,112,101,100,101,102, - 0, 2, 0, 0, 0, 6,117,116,121,112,101, 0, 2, 0, 0, 0, 2,110, 0, 2, - 0, 0, 0, 5,116,121,112,101, 0, 2, 0, 0, 0, 4,109,111,100, 0, 2, 0, - 0, 0, 7, 99,111,110, 99, 97,116, 0, -}; - -/* define.lo */ -static char B9[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 12, 64,100,101,102,105,110, -101, 46,108,117, 97, 0, 0, 0, 0, 75, 5, 0, 60, 18, 22, 2, 60, 19, 11, 1, - 11, 2, 11, 3, 60, 20, 15, 4, 30, 1, 60, 21, 25, 0, 60, 22, 15, 5, 15, 0, - 15, 6, 2, 0, 2, 60, 25, 15, 0, 11, 7, 11, 8, 26, 60, 35, 15, 0, 11, 9, - 11, 10, 26, 60, 42, 15, 0, 11, 11, 11, 12, 26, 60, 51, 11, 14, 25, 13, 60, 65, - 11, 16, 25, 15, 0, 0, 0, 0, 0, 0, 0, 0, 17, 2, 0, 0, 0, 12, 99,108, - 97,115,115, 68,101,102,105,110,101, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, - 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, - 0, 13, 99,108, 97,115,115, 70,101, 97,116,117,114,101, 0, 2, 0, 0, 0, 7, -115,101,116,116, 97,103, 0, 2, 0, 0, 0, 10,116,111,108,117, 97, 95,116, 97, -103, 0, 2, 0, 0, 0, 9,114,101,103,105,115,116,101,114, 0, 4, 0, 0, 0, - 25, 0, 0, 0, 12, 64,100,101,102,105,110,101, 46,108,117, 97, 0, 0, 0, 0, - 80, 5, 1, 60, 26, 13, 0, 20, 2, 2, 1, 1, 60, 27, 13, 1, 52, 33, 60, 28, - 15, 3, 11, 4, 13, 1, 42, 11, 5, 42, 13, 0, 18, 6, 42, 11, 7, 42, 13, 0, - 18, 8, 42, 11, 9, 42, 2, 0, 1, 50, 27, 60, 30, 15, 3, 11, 10, 13, 0, 18, - 6, 42, 11, 7, 42, 13, 0, 18, 8, 42, 11, 9, 42, 2, 0, 1, 60, 31, 60, 32, - 0, 0, 0, 0, 2, 0, 0, 0, 25, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, - 0, 26, 0, 0, 0, 2,112, 0, 0, 0, 0, 11, 2, 0, 0, 0, 2,112, 0, 2, - 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 9,105,110,109,111,100,117, -108,101, 0, 2, 0, 0, 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 18, - 32,116,111,108,117, 97, 95, 99,111,110,115,116, 97,110,116, 40, 34, 0, 2, 0, - 0, 0, 4, 34, 44, 34, 0, 2, 0, 0, 0, 6,108,110, 97,109,101, 0, 2, 0, - 0, 0, 3, 34, 44, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, - 3, 41, 59, 0, 2, 0, 0, 0, 23, 32,116,111,108,117, 97, 95, 99,111,110,115, -116, 97,110,116, 40, 78, 85, 76, 76, 44, 34, 0, 2, 0, 0, 0, 11,117,110,114, -101,103,105,115,116,101,114, 0, 4, 0, 0, 0, 35, 0, 0, 0, 12, 64,100,101, -102,105,110,101, 46,108,117, 97, 0, 0, 0, 0, 38, 4, 1, 60, 36, 13, 0, 20, - 1, 2, 1, 1, 44, 52, 19, 60, 37, 15, 2, 11, 3, 13, 0, 18, 4, 42, 11, 5, - 42, 2, 0, 1, 50, 2, 60, 38, 60, 39, 0, 0, 0, 0, 1, 0, 0, 0, 35, 0, - 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 6, 2, 0, 0, 0, 5,115,101,108, -102, 0, 2, 0, 0, 0, 9,105,110,109,111,100,117,108,101, 0, 2, 0, 0, 0, - 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 32, 32,108,117, 97, 95,112,117, -115,104,110,105,108, 40, 41, 59, 32,108,117, 97, 95,115,101,116,103,108,111, 98, - 97,108, 40, 34, 0, 2, 0, 0, 0, 6,108,110, 97,109,101, 0, 2, 0, 0, 0, - 4, 34, 41, 59, 0, 2, 0, 0, 0, 6,112,114,105,110,116, 0, 4, 0, 0, 0, - 42, 0, 0, 0, 12, 64,100,101,102,105,110,101, 46,108,117, 97, 0, 0, 0, 0, - 72, 6, 3, 60, 43, 15, 2, 13, 1, 11, 3, 42, 2, 0, 1, 60, 44, 15, 2, 13, - 1, 11, 4, 42, 13, 0, 18, 6, 42, 11, 7, 42, 2, 0, 1, 60, 45, 15, 2, 13, - 1, 11, 8, 42, 13, 0, 18, 9, 42, 11, 7, 42, 2, 0, 1, 60, 46, 15, 2, 13, - 1, 11, 10, 42, 13, 2, 42, 2, 0, 1, 60, 47, 0, 0, 0, 0, 3, 0, 0, 0, - 42, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 42, 0, 0, 0, 6,105,100, -101,110,116, 0, 0, 0, 0, 42, 0, 0, 0, 6, 99,108,111,115,101, 0, 0, 0, - 0, 11, 2, 0, 0, 0, 6,105,100,101,110,116, 0, 2, 0, 0, 0, 6, 99,108, -111,115,101, 0, 2, 0, 0, 0, 6,112,114,105,110,116, 0, 2, 0, 0, 0, 8, - 68,101,102,105,110,101,123, 0, 2, 0, 0, 0, 10, 32,110, 97,109,101, 32, 61, - 32, 39, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 5,110, 97, -109,101, 0, 2, 0, 0, 0, 3, 39, 44, 0, 2, 0, 0, 0, 11, 32,108,110, 97, -109,101, 32, 61, 32, 39, 0, 2, 0, 0, 0, 6,108,110, 97,109,101, 0, 2, 0, - 0, 0, 2,125, 0, 2, 0, 0, 0, 8, 95, 68,101,102,105,110,101, 0, 4, 0, - 0, 0, 51, 0, 0, 0, 12, 64,100,101,102,105,110,101, 46,108,117, 97, 0, 0, - 0, 0, 64, 4, 1, 60, 52, 13, 0, 11, 1, 15, 2, 26, 60, 53, 15, 3, 13, 0, - 15, 4, 2, 0, 2, 60, 55, 13, 0, 18, 5, 11, 6, 32, 52, 11, 60, 56, 15, 7, - 11, 8, 2, 0, 1, 50, 2, 60, 57, 60, 59, 15, 9, 13, 0, 2, 0, 1, 60, 60, - 13, 0, 1, 1, 60, 61, 0, 0, 0, 0, 1, 0, 0, 0, 51, 0, 0, 0, 2,116, - 0, 0, 0, 0, 10, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 6, 95, 98, 97, -115,101, 0, 2, 0, 0, 0, 12, 99,108, 97,115,115, 68,101,102,105,110,101, 0, - 2, 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, 10,116,111,108, -117, 97, 95,116, 97,103, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, - 0, 1, 0, 2, 0, 0, 0, 6,101,114,114,111,114, 0, 2, 0, 0, 0, 16, 35, -105,110,118, 97,108,105,100, 32,100,101,102,105,110,101, 0, 2, 0, 0, 0, 7, - 97,112,112,101,110,100, 0, 2, 0, 0, 0, 7, 68,101,102,105,110,101, 0, 4, - 0, 0, 0, 65, 0, 0, 0, 12, 64,100,101,102,105,110,101, 46,108,117, 97, 0, - 0, 0, 0, 54, 9, 1, 60, 66, 15, 2, 13, 0, 11, 3, 2, 1, 2, 60, 67, 15, - 4, 22, 2, 60, 68, 11, 5, 13, 1, 7, 1, 16, 11, 6, 60, 69, 13, 1, 7, 2, - 16, 46, 5, 13, 1, 7, 1, 16, 30, 1, 60, 70, 3, 2, 1, 60, 71, 0, 0, 0, - 0, 2, 0, 0, 0, 65, 0, 0, 0, 2,110, 0, 0, 0, 0, 66, 0, 0, 0, 2, -116, 0, 0, 0, 0, 7, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 2,116, 0, - 2, 0, 0, 0, 6,115,112,108,105,116, 0, 2, 0, 0, 0, 2, 64, 0, 2, 0, - 0, 0, 8, 95, 68,101,102,105,110,101, 0, 2, 0, 0, 0, 5,110, 97,109,101, - 0, 2, 0, 0, 0, 6,108,110, 97,109,101, 0, -}; - -/* enumerate.lo */ -static char B10[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 15, 64,101,110,117,109,101, -114, 97,116,101, 46,108,117, 97, 0, 0, 0, 0, 69, 3, 0, 60, 19, 22, 1, 60, - 20, 11, 1, 15, 2, 30, 0, 60, 21, 25, 0, 60, 22, 15, 3, 15, 0, 15, 4, 2, - 0, 2, 60, 25, 15, 0, 11, 5, 11, 6, 26, 60, 42, 15, 0, 11, 7, 11, 8, 26, - 60, 53, 15, 0, 11, 9, 11, 10, 26, 60, 64, 11, 12, 25, 11, 60, 73, 11, 14, 25, - 13, 0, 0, 0, 0, 0, 0, 0, 0, 15, 2, 0, 0, 0, 15, 99,108, 97,115,115, - 69,110,117,109,101,114, 97,116,101, 0, 2, 0, 0, 0, 6, 95, 98, 97,115,101, - 0, 2, 0, 0, 0, 13, 99,108, 97,115,115, 70,101, 97,116,117,114,101, 0, 2, - 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, 10,116,111,108,117, - 97, 95,116, 97,103, 0, 2, 0, 0, 0, 9,114,101,103,105,115,116,101,114, 0, - 4, 0, 0, 0, 25, 0, 0, 0, 15, 64,101,110,117,109,101,114, 97,116,101, 46, -108,117, 97, 0, 0, 0, 0,179, 7, 1, 60, 26, 13, 0, 20, 2, 2, 1, 1, 46, - 7, 13, 0, 20, 3, 2, 1, 1, 60, 27, 7, 1, 50,141, 60, 29, 13, 1, 52, 93, - 60, 30, 13, 0, 20, 2, 2, 1, 1, 52, 43, 60, 31, 15, 5, 11, 6, 13, 1, 42, - 11, 7, 42, 13, 0, 18, 8, 13, 2, 16, 42, 11, 9, 42, 13, 1, 42, 11, 10, 42, - 13, 0, 13, 2, 16, 42, 11, 11, 42, 2, 0, 1, 50, 37, 60, 33, 15, 5, 11, 6, - 13, 1, 42, 11, 7, 42, 13, 0, 18, 8, 13, 2, 16, 42, 11, 9, 42, 13, 0, 13, - 2, 16, 42, 11, 11, 42, 2, 0, 1, 60, 34, 50, 31, 60, 36, 15, 5, 11, 12, 13, - 0, 18, 8, 13, 2, 16, 42, 11, 9, 42, 13, 0, 13, 2, 16, 42, 11, 11, 42, 2, - 0, 1, 60, 37, 60, 38, 13, 2, 7, 1, 37, 23, 2, 60, 39, 60, 28, 13, 0, 13, - 2, 16, 54,150, 60, 40, 0, 0, 0, 0, 3, 0, 0, 0, 25, 0, 0, 0, 5,115, -101,108,102, 0, 0, 0, 0, 26, 0, 0, 0, 2,112, 0, 0, 0, 0, 27, 0, 0, - 0, 2,105, 0, 0, 0, 0, 13, 2, 0, 0, 0, 2,112, 0, 2, 0, 0, 0, 5, -115,101,108,102, 0, 2, 0, 0, 0, 8,105,110, 99,108, 97,115,115, 0, 2, 0, - 0, 0, 9,105,110,109,111,100,117,108,101, 0, 2, 0, 0, 0, 2,105, 0, 2, - 0, 0, 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 18, 32,116,111,108, -117, 97, 95, 99,111,110,115,116, 97,110,116, 40, 34, 0, 2, 0, 0, 0, 4, 34, - 44, 34, 0, 2, 0, 0, 0, 7,108,110, 97,109,101,115, 0, 2, 0, 0, 0, 3, - 34, 44, 0, 2, 0, 0, 0, 3, 58, 58, 0, 2, 0, 0, 0, 3, 41, 59, 0, 2, - 0, 0, 0, 23, 32,116,111,108,117, 97, 95, 99,111,110,115,116, 97,110,116, 40, - 78, 85, 76, 76, 44, 34, 0, 2, 0, 0, 0, 11,117,110,114,101,103,105,115,116, -101,114, 0, 4, 0, 0, 0, 42, 0, 0, 0, 15, 64,101,110,117,109,101,114, 97, -116,101, 46,108,117, 97, 0, 0, 0, 0, 83, 6, 1, 60, 43, 13, 0, 20, 1, 2, - 1, 1, 4, 0, 32, 48, 10, 13, 0, 20, 2, 2, 1, 1, 4, 0, 32, 52, 50, 60, - 44, 7, 1, 50, 31, 60, 46, 15, 4, 11, 5, 13, 0, 18, 6, 13, 1, 16, 42, 11, - 7, 42, 2, 0, 1, 60, 47, 13, 1, 7, 1, 37, 23, 1, 60, 48, 60, 45, 13, 0, - 13, 1, 16, 54, 40, 5, 1, 50, 2, 60, 49, 60, 50, 0, 0, 0, 0, 3, 0, 0, - 0, 42, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 44, 0, 0, 0, 2,105, - 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 5,115,101, -108,102, 0, 2, 0, 0, 0, 8,105,110, 99,108, 97,115,115, 0, 2, 0, 0, 0, - 9,105,110,109,111,100,117,108,101, 0, 2, 0, 0, 0, 2,105, 0, 2, 0, 0, - 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 32, 32,108,117, 97, 95,112, -117,115,104,110,105,108, 40, 41, 59, 32,108,117, 97, 95,115,101,116,103,108,111, - 98, 97,108, 40, 34, 0, 2, 0, 0, 0, 7,108,110, 97,109,101,115, 0, 2, 0, - 0, 0, 4, 34, 41, 59, 0, 2, 0, 0, 0, 6,112,114,105,110,116, 0, 4, 0, - 0, 0, 53, 0, 0, 0, 15, 64,101,110,117,109,101,114, 97,116,101, 46,108,117, - 97, 0, 0, 0, 0, 90, 8, 3, 60, 54, 15, 2, 13, 1, 11, 3, 42, 2, 0, 1, - 60, 55, 7, 1, 50, 43, 60, 57, 15, 2, 13, 1, 11, 6, 42, 13, 0, 13, 3, 16, - 42, 11, 7, 42, 13, 0, 18, 8, 13, 3, 16, 42, 11, 9, 42, 2, 0, 1, 60, 58, - 13, 3, 7, 1, 37, 23, 3, 60, 59, 60, 56, 13, 0, 13, 3, 16, 54, 52, 60, 60, - 15, 2, 13, 1, 11, 10, 42, 13, 2, 42, 2, 0, 1, 60, 61, 0, 0, 0, 0, 4, - 0, 0, 0, 53, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 53, 0, 0, 0, - 6,105,100,101,110,116, 0, 0, 0, 0, 53, 0, 0, 0, 6, 99,108,111,115,101, - 0, 0, 0, 0, 55, 0, 0, 0, 2,105, 0, 0, 0, 0, 11, 2, 0, 0, 0, 6, -105,100,101,110,116, 0, 2, 0, 0, 0, 6, 99,108,111,115,101, 0, 2, 0, 0, - 0, 6,112,114,105,110,116, 0, 2, 0, 0, 0, 11, 69,110,117,109,101,114, 97, -116,101,123, 0, 2, 0, 0, 0, 2,105, 0, 2, 0, 0, 0, 5,115,101,108,102, - 0, 2, 0, 0, 0, 3, 32, 39, 0, 2, 0, 0, 0, 3, 39, 40, 0, 2, 0, 0, - 0, 7,108,110, 97,109,101,115, 0, 2, 0, 0, 0, 3, 41, 44, 0, 2, 0, 0, - 0, 2,125, 0, 2, 0, 0, 0, 11, 95, 69,110,117,109,101,114, 97,116,101, 0, - 4, 0, 0, 0, 64, 0, 0, 0, 15, 64,101,110,117,109,101,114, 97,116,101, 46, -108,117, 97, 0, 0, 0, 0, 40, 4, 1, 60, 65, 13, 0, 11, 1, 15, 2, 26, 60, - 66, 15, 3, 13, 0, 15, 4, 2, 0, 2, 60, 67, 15, 5, 13, 0, 2, 0, 1, 60, - 68, 13, 0, 1, 1, 60, 69, 0, 0, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, 2, -116, 0, 0, 0, 0, 6, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 6, 95, 98, - 97,115,101, 0, 2, 0, 0, 0, 15, 99,108, 97,115,115, 69,110,117,109,101,114, - 97,116,101, 0, 2, 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, - 10,116,111,108,117, 97, 95,116, 97,103, 0, 2, 0, 0, 0, 7, 97,112,112,101, -110,100, 0, 2, 0, 0, 0, 10, 69,110,117,109,101,114, 97,116,101, 0, 4, 0, - 0, 0, 73, 0, 0, 0, 15, 64,101,110,117,109,101,114, 97,116,101, 46,108,117, - 97, 0, 0, 0, 0,200, 9, 1, 60, 74, 15, 2, 15, 3, 13, 0, 7, 2, 9, 2, - 2, 1, 3, 11, 4, 2, 1, 2, 60, 75, 7, 1, 60, 76, 22, 1, 11, 7, 7, 0, - 30, 0, 50, 55, 60, 78, 15, 2, 13, 1, 13, 2, 16, 11, 9, 2, 1, 2, 60, 79, - 13, 3, 11, 7, 13, 3, 18, 7, 7, 1, 37, 26, 60, 80, 13, 3, 13, 3, 18, 7, - 13, 4, 7, 1, 16, 26, 60, 81, 13, 2, 7, 1, 37, 23, 2, 5, 1, 60, 82, 60, - 77, 13, 1, 13, 2, 16, 54, 64, 60, 84, 7, 1, 23, 2, 60, 85, 13, 3, 11, 10, - 22, 0, 26, 50, 60, 60, 87, 15, 2, 13, 3, 13, 2, 16, 11, 11, 2, 1, 2, 60, - 88, 13, 3, 13, 2, 13, 4, 7, 1, 16, 26, 60, 89, 13, 3, 18, 10, 13, 2, 13, - 4, 7, 2, 16, 46, 5, 13, 4, 7, 1, 16, 26, 60, 90, 13, 2, 7, 1, 37, 23, - 2, 5, 1, 60, 91, 60, 86, 13, 3, 13, 2, 16, 54, 69, 60, 92, 15, 12, 13, 3, - 3, 4, 1, 60, 93, 0, 0, 0, 0, 8, 0, 0, 0, 73, 0, 0, 0, 2, 98, 0, - 0, 0, 0, 74, 0, 0, 0, 2,116, 0, 0, 0, 0, 75, 0, 0, 0, 2,105, 0, - 0, 0, 0, 76, 0, 0, 0, 2,101, 0, 0, 0, 0, 78, 0, 0, 0, 3,116,116, - 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 2,116, 0, 0, - 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 13, 2, 0, 0, 0, 2, 98, 0, 2, 0, - 0, 0, 2,116, 0, 2, 0, 0, 0, 6,115,112,108,105,116, 0, 2, 0, 0, 0, - 7,115,116,114,115,117, 98, 0, 2, 0, 0, 0, 2, 44, 0, 2, 0, 0, 0, 2, -105, 0, 2, 0, 0, 0, 2,101, 0, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, - 3,116,116, 0, 2, 0, 0, 0, 2, 61, 0, 2, 0, 0, 0, 7,108,110, 97,109, -101,115, 0, 2, 0, 0, 0, 2, 64, 0, 2, 0, 0, 0, 11, 95, 69,110,117,109, -101,114, 97,116,101, 0, -}; - -/* variable.lo */ -static char B11[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 14, 64,118, 97,114,105, 97, - 98,108,101, 46,108,117, 97, 0, 0, 0, 0, 87, 3, 0, 60, 18, 22, 1, 60, 19, - 11, 1, 15, 2, 30, 0, 60, 20, 25, 0, 60, 22, 15, 3, 15, 0, 15, 4, 2, 0, - 2, 60, 25, 15, 0, 11, 5, 11, 6, 26, 60, 37, 15, 0, 11, 7, 11, 8, 26, 60, - 48, 15, 0, 11, 9, 11, 10, 26, 60,154, 15, 0, 11, 11, 11, 12, 26, 60,171, 15, - 0, 11, 13, 11, 14, 26, 60,179, 11, 16, 25, 15, 60,188, 11, 18, 25, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 19, 2, 0, 0, 0, 14, 99,108, 97,115,115, 86, 97,114, -105, 97, 98,108,101, 0, 2, 0, 0, 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, - 0, 17, 99,108, 97,115,115, 68,101, 99,108, 97,114, 97,116,105,111,110, 0, 2, - 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, 10,116,111,108,117, - 97, 95,116, 97,103, 0, 2, 0, 0, 0, 6,112,114,105,110,116, 0, 4, 0, 0, - 0, 25, 0, 0, 0, 14, 64,118, 97,114,105, 97, 98,108,101, 46,108,117, 97, 0, - 0, 0, 0,152, 6, 3, 60, 26, 15, 2, 13, 1, 11, 3, 42, 2, 0, 1, 60, 27, - 15, 2, 13, 1, 11, 4, 42, 13, 0, 18, 6, 42, 11, 7, 42, 2, 0, 1, 60, 28, - 15, 2, 13, 1, 11, 8, 42, 13, 0, 18, 9, 42, 11, 7, 42, 2, 0, 1, 60, 29, - 15, 2, 13, 1, 11, 10, 42, 13, 0, 18, 11, 42, 11, 7, 42, 2, 0, 1, 60, 30, - 15, 2, 13, 1, 11, 12, 42, 13, 0, 18, 13, 42, 11, 7, 42, 2, 0, 1, 60, 31, - 15, 2, 13, 1, 11, 14, 42, 13, 0, 18, 15, 42, 11, 7, 42, 2, 0, 1, 60, 32, - 15, 2, 13, 1, 11, 16, 42, 13, 0, 18, 17, 42, 11, 7, 42, 2, 0, 1, 60, 33, - 15, 2, 13, 1, 11, 18, 42, 13, 2, 42, 2, 0, 1, 60, 34, 0, 0, 0, 0, 3, - 0, 0, 0, 25, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 25, 0, 0, 0, - 6,105,100,101,110,116, 0, 0, 0, 0, 25, 0, 0, 0, 6, 99,108,111,115,101, - 0, 0, 0, 0, 19, 2, 0, 0, 0, 6,105,100,101,110,116, 0, 2, 0, 0, 0, - 6, 99,108,111,115,101, 0, 2, 0, 0, 0, 6,112,114,105,110,116, 0, 2, 0, - 0, 0, 10, 86, 97,114,105, 97, 98,108,101,123, 0, 2, 0, 0, 0, 10, 32,109, -111,100, 32, 32, 61, 32, 39, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, - 0, 0, 4,109,111,100, 0, 2, 0, 0, 0, 3, 39, 44, 0, 2, 0, 0, 0, 10, - 32,116,121,112,101, 32, 61, 32, 39, 0, 2, 0, 0, 0, 5,116,121,112,101, 0, - 2, 0, 0, 0, 10, 32,112,116,114, 32, 32, 61, 32, 39, 0, 2, 0, 0, 0, 4, -112,116,114, 0, 2, 0, 0, 0, 10, 32,110, 97,109,101, 32, 61, 32, 39, 0, 2, - 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 10, 32,100,101,102, 32, 32, - 61, 32, 39, 0, 2, 0, 0, 0, 4,100,101,102, 0, 2, 0, 0, 0, 10, 32,114, -101,116, 32, 32, 61, 32, 39, 0, 2, 0, 0, 0, 4,114,101,116, 0, 2, 0, 0, - 0, 2,125, 0, 2, 0, 0, 0, 9,103,101,116,118, 97,108,117,101, 0, 4, 0, - 0, 0, 37, 0, 0, 0, 14, 64,118, 97,114,105, 97, 98,108,101, 46,108,117, 97, - 0, 0, 0, 0, 60, 5, 3, 60, 38, 13, 1, 48, 2, 13, 2, 52, 16, 60, 39, 13, - 1, 11, 2, 42, 13, 0, 18, 4, 42, 1, 3, 50, 29, 60, 40, 13, 1, 52, 13, 60, - 41, 11, 5, 13, 0, 18, 4, 42, 1, 3, 50, 10, 60, 43, 13, 0, 18, 4, 1, 3, - 60, 44, 60, 45, 0, 0, 0, 0, 3, 0, 0, 0, 37, 0, 0, 0, 5,115,101,108, -102, 0, 0, 0, 0, 37, 0, 0, 0, 6, 99,108, 97,115,115, 0, 0, 0, 0, 37, - 0, 0, 0, 7,115,116, 97,116,105, 99, 0, 0, 0, 0, 6, 2, 0, 0, 0, 6, - 99,108, 97,115,115, 0, 2, 0, 0, 0, 7,115,116, 97,116,105, 99, 0, 2, 0, - 0, 0, 3, 58, 58, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, - 5,110, 97,109,101, 0, 2, 0, 0, 0, 7,115,101,108,102, 45, 62, 0, 2, 0, - 0, 0, 8,115,117,112, 99,111,100,101, 0, 4, 0, 0, 0, 48, 0, 0, 0, 14, - 64,118, 97,114,105, 97, 98,108,101, 46,108,117, 97, 0, 0, 0, 3,189, 17, 1, - 60, 49, 13, 0, 20, 2, 2, 1, 1, 60, 52, 13, 1, 52, 21, 60, 53, 15, 3, 11, - 4, 13, 0, 18, 5, 11, 6, 13, 1, 11, 7, 2, 0, 5, 50, 17, 60, 55, 15, 3, - 11, 4, 13, 0, 18, 5, 11, 7, 2, 0, 3, 60, 56, 60, 57, 13, 0, 11, 8, 13, - 0, 20, 9, 11, 10, 2, 1, 2, 26, 60, 58, 15, 3, 11, 11, 13, 0, 18, 8, 11, - 12, 2, 0, 3, 60, 59, 15, 3, 11, 13, 2, 0, 1, 60, 62, 15, 16, 13, 0, 18, - 17, 11, 18, 2, 3, 2, 60, 63, 13, 1, 48, 5, 13, 4, 4, 0, 32, 52, 39, 60, - 64, 15, 3, 11, 19, 13, 1, 11, 20, 11, 21, 2, 0, 4, 60, 65, 15, 3, 11, 22, - 13, 1, 11, 23, 2, 0, 3, 60, 66, 15, 3, 11, 24, 2, 0, 1, 50, 35, 60, 67, - 13, 4, 52, 27, 60, 68, 13, 0, 11, 17, 15, 16, 13, 0, 18, 17, 11, 25, 2, 3, - 2, 27, 2, 23, 3, 23, 3, 5, 2, 50, 2, 60, 69, 60, 73, 13, 1, 48, 5, 13, - 4, 4, 0, 32, 52, 19, 60, 74, 15, 3, 11, 26, 13, 0, 18, 5, 42, 11, 27, 42, - 2, 0, 1, 50, 2, 60, 75, 60, 78, 15, 29, 13, 0, 18, 30, 2, 1, 1, 60, 79, - 13, 5, 11, 31, 32, 52, 32, 60, 80, 15, 3, 11, 32, 13, 5, 42, 11, 33, 42, 13, - 0, 20, 34, 13, 1, 13, 4, 2, 1, 3, 42, 11, 35, 42, 2, 0, 1, 50,124, 60, - 81, 13, 5, 52, 32, 60, 82, 15, 3, 11, 32, 13, 5, 42, 11, 22, 42, 13, 0, 20, - 34, 13, 1, 13, 4, 2, 1, 3, 42, 11, 35, 42, 2, 0, 1, 50, 86, 60, 84, 13, - 0, 18, 36, 11, 37, 32, 46, 7, 13, 0, 18, 36, 11, 38, 32, 52, 32, 60, 85, 15, - 3, 11, 39, 13, 0, 20, 34, 13, 1, 13, 4, 2, 1, 3, 42, 11, 40, 42, 13, 0, - 18, 41, 11, 35, 2, 0, 3, 50, 32, 60, 87, 15, 3, 11, 42, 13, 0, 20, 34, 13, - 1, 13, 4, 2, 1, 3, 42, 11, 40, 42, 13, 0, 18, 41, 11, 35, 2, 0, 3, 60, - 88, 60, 89, 60, 90, 15, 3, 11, 43, 2, 0, 1, 60, 91, 15, 3, 11, 44, 2, 0, - 1, 60, 94, 15, 16, 13, 0, 18, 17, 11, 45, 2, 1, 2, 44, 51, 2, 0, 60, 95, - 13, 1, 52, 21, 60, 96, 15, 3, 11, 46, 13, 0, 18, 5, 11, 6, 13, 1, 11, 7, - 2, 0, 5, 50, 17, 60, 98, 15, 3, 11, 46, 13, 0, 18, 5, 11, 7, 2, 0, 3, - 60, 99, 60,100, 13, 0, 11, 47, 13, 0, 20, 9, 11, 48, 2, 1, 2, 26, 60,101, - 15, 3, 11, 11, 13, 0, 18, 47, 11, 12, 2, 0, 3, 60,102, 15, 3, 11, 13, 2, - 0, 1, 60,105, 7, 1, 60,106, 13, 1, 48, 5, 13, 4, 4, 0, 32, 52, 65, 60, -107, 15, 3, 11, 19, 13, 1, 11, 20, 11, 21, 2, 0, 4, 60,108, 15, 3, 11, 22, - 13, 1, 11, 23, 2, 0, 3, 60,109, 15, 3, 11, 24, 2, 0, 1, 60,111, 15, 3, - 11, 26, 13, 0, 18, 5, 42, 11, 27, 42, 2, 0, 1, 60,112, 13, 6, 7, 1, 37, - 23, 6, 50, 44, 60,113, 13, 4, 52, 36, 60,114, 13, 0, 11, 17, 15, 16, 13, 0, - 18, 17, 11, 25, 2, 3, 2, 27, 2, 23, 3, 23, 3, 5, 2, 60,115, 13, 6, 7, - 1, 37, 23, 6, 50, 2, 60,116, 60,119, 15, 3, 11, 50, 13, 0, 20, 51, 13, 6, - 2, 1, 2, 42, 11, 52, 42, 2, 0, 1, 60,120, 15, 3, 11, 53, 2, 0, 1, 60, -123, 11, 38, 60,124, 13, 0, 18, 36, 11, 38, 31, 52, 4, 11, 20, 23, 7, 60,125, - 15, 3, 11, 19, 2, 0, 1, 60,126, 13, 1, 48, 2, 13, 4, 52, 19, 60,127, 15, - 3, 13, 1, 11, 54, 42, 13, 0, 18, 5, 42, 2, 0, 1, 50, 35, 60,128, 13, 1, - 52, 16, 60,129, 15, 3, 11, 55, 13, 0, 18, 5, 42, 2, 0, 1, 50, 13, 60,131, - 15, 3, 13, 0, 18, 5, 2, 0, 1, 60,132, 60,133, 15, 29, 13, 0, 18, 30, 2, - 1, 1, 60,134, 15, 3, 11, 56, 2, 0, 1, 60,135, 13, 8, 44, 48, 5, 13, 7, - 11, 38, 32, 52, 7, 15, 3, 11, 20, 2, 0, 1, 60,136, 15, 3, 11, 57, 13, 0, - 18, 17, 13, 0, 18, 30, 2, 0, 3, 60,137, 13, 8, 44, 52, 11, 60,138, 15, 3, - 11, 20, 2, 0, 1, 50, 2, 60,139, 60,140, 15, 3, 11, 58, 2, 0, 1, 60,141, - 7, 0, 60,142, 13, 0, 18, 59, 11, 38, 31, 52, 6, 13, 0, 18, 59, 23, 9, 60, -143, 13, 8, 52, 24, 60,144, 15, 3, 11, 60, 13, 8, 42, 11, 22, 13, 6, 11, 40, - 13, 9, 11, 61, 2, 0, 6, 50, 19, 60,146, 15, 3, 11, 62, 13, 6, 11, 40, 13, - 9, 11, 61, 2, 0, 5, 60,147, 60,148, 15, 3, 11, 43, 2, 0, 1, 60,149, 15, - 3, 11, 44, 2, 0, 1, 5, 4, 50, 2, 60,150, 60,152, 0, 0, 0, 0, 14, 0, - 0, 0, 48, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 49, 0, 0, 0, 6, - 99,108, 97,115,115, 0, 0, 0, 0, 62, 0, 0, 0, 2, 95, 0, 0, 0, 0, 62, - 0, 0, 0, 2, 95, 0, 0, 0, 0, 62, 0, 0, 0, 7,115,116, 97,116,105, 99, - 0, 0, 0, 0, 78, 0, 0, 0, 2,116, 0, 0, 0, 0,105, 0, 0, 0, 5,110, - 97,114,103, 0, 0, 0, 0,123, 0, 0, 0, 4,112,116,114, 0, 0, 0, 0,133, - 0, 0, 0, 2,116, 0, 0, 0, 0,141, 0, 0, 0, 4,100,101,102, 0, 0, 0, - 0,149, 0, 0, 0, 0, 0, 0, 0,149, 0, 0, 0, 0, 0, 0, 0,149, 0, 0, - 0, 0, 0, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, 63, 2, 0, 0, 0, 6, 99, -108, 97,115,115, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 8, -105,110, 99,108, 97,115,115, 0, 2, 0, 0, 0, 7,111,117,116,112,117,116, 0, - 2, 0, 0, 0, 17, 47, 42, 32,103,101,116, 32,102,117,110, 99,116,105,111,110, - 58, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 11, 32,111,102, - 32, 99,108, 97,115,115, 32, 0, 2, 0, 0, 0, 4, 32, 42, 47, 0, 2, 0, 0, - 0, 9, 99,103,101,116,110, 97,109,101, 0, 2, 0, 0, 0, 10, 99,102,117,110, - 99,110, 97,109,101, 0, 2, 0, 0, 0, 11,116,111,108,117, 97, 73, 95,103,101, -116, 0, 2, 0, 0, 0, 12,115,116, 97,116,105, 99, 32,118,111,105,100, 0, 2, - 0, 0, 0, 7, 40,118,111,105,100, 41, 0, 2, 0, 0, 0, 2,123, 0, 2, 0, - 0, 0, 2, 95, 0, 2, 0, 0, 0, 7,115,116, 97,116,105, 99, 0, 2, 0, 0, - 0, 8,115,116,114,102,105,110,100, 0, 2, 0, 0, 0, 4,109,111,100, 0, 2, - 0, 0, 0, 13, 94, 37,115, 42, 40,115,116, 97,116,105, 99, 41, 0, 2, 0, 0, - 0, 2, 32, 0, 2, 0, 0, 0, 2, 42, 0, 2, 0, 0, 0, 8,115,101,108,102, - 32, 61, 32, 0, 2, 0, 0, 0, 2, 40, 0, 2, 0, 0, 0, 4, 42, 41, 32, 0, - 2, 0, 0, 0, 24,116,111,108,117, 97, 95,103,101,116,117,115,101,114,116,121, -112,101, 40, 49, 44, 48, 41, 59, 0, 2, 0, 0, 0, 20, 94, 37,115, 42,115,116, - 97,116,105, 99, 37,115, 37,115, 42, 40, 46, 42, 41, 0, 2, 0, 0, 0, 65, 32, - 32,105,102, 32, 40, 33,115,101,108,102, 41, 32,116,111,108,117, 97, 95,101,114, -114,111,114, 40, 34,105,110,118, 97,108,105,100, 32, 39,115,101,108,102, 39, 32, -105,110, 32, 97, 99, 99,101,115,115,105,110,103, 32,118, 97,114,105, 97, 98,108, -101, 32, 39, 0, 2, 0, 0, 0, 5, 39, 34, 41, 59, 0, 2, 0, 0, 0, 2,116, - 0, 2, 0, 0, 0, 8,105,115, 98, 97,115,105, 99, 0, 2, 0, 0, 0, 5,116, -121,112,101, 0, 2, 0, 0, 0, 7,110,117,109, 98,101,114, 0, 2, 0, 0, 0, - 13, 32, 32,116,111,108,117, 97, 95,112,117,115,104, 0, 2, 0, 0, 0, 10, 40, - 40,100,111,117, 98,108,101, 41, 0, 2, 0, 0, 0, 9,103,101,116,118, 97,108, -117,101, 0, 2, 0, 0, 0, 3, 41, 59, 0, 2, 0, 0, 0, 4,112,116,114, 0, - 2, 0, 0, 0, 2, 38, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 30, 32, 32, -116,111,108,117, 97, 95,112,117,115,104,117,115,101,114,116,121,112,101, 40, 40, -118,111,105,100, 42, 41, 38, 0, 2, 0, 0, 0, 2, 44, 0, 2, 0, 0, 0, 4, -116, 97,103, 0, 2, 0, 0, 0, 29, 32, 32,116,111,108,117, 97, 95,112,117,115, -104,117,115,101,114,116,121,112,101, 40, 40,118,111,105,100, 42, 41, 0, 2, 0, - 0, 0, 2,125, 0, 2, 0, 0, 0, 2, 10, 0, 2, 0, 0, 0, 6, 99,111,110, -115,116, 0, 2, 0, 0, 0, 17, 47, 42, 32,115,101,116, 32,102,117,110, 99,116, -105,111,110, 58, 0, 2, 0, 0, 0, 9, 99,115,101,116,110, 97,109,101, 0, 2, - 0, 0, 0, 11,116,111,108,117, 97, 73, 95,115,101,116, 0, 2, 0, 0, 0, 5, -110, 97,114,103, 0, 2, 0, 0, 0, 8, 32, 32,105,102, 32, 40, 33, 0, 2, 0, - 0, 0, 13,111,117,116, 99,104,101, 99,107,116,121,112,101, 0, 2, 0, 0, 0, - 2, 41, 0, 2, 0, 0, 0, 58, 32, 32, 32,116,111,108,117, 97, 95,101,114,114, -111,114, 40, 34, 35,118,105,110,118, 97,108,105,100, 32,116,121,112,101, 32,105, -110, 32,118, 97,114,105, 97, 98,108,101, 32, 97,115,115,105,103,110,109,101,110, -116, 46, 34, 41, 59, 0, 2, 0, 0, 0, 3, 58, 58, 0, 2, 0, 0, 0, 7,115, -101,108,102, 45, 62, 0, 2, 0, 0, 0, 4, 32, 61, 32, 0, 2, 0, 0, 0, 3, - 40, 40, 0, 2, 0, 0, 0, 3, 41, 32, 0, 2, 0, 0, 0, 4,100,101,102, 0, - 2, 0, 0, 0, 10,116,111,108,117, 97, 95,103,101,116, 0, 2, 0, 0, 0, 4, - 41, 41, 59, 0, 2, 0, 0, 0, 19,116,111,108,117, 97, 95,103,101,116,117,115, -101,114,116,121,112,101, 40, 0, 2, 0, 0, 0, 9,114,101,103,105,115,116,101, -114, 0, 4, 0, 0, 0,154, 0, 0, 0, 14, 64,118, 97,114,105, 97, 98,108,101, - 46,108,117, 97, 0, 0, 0, 0,185, 5, 1, 60,155, 13, 0, 20, 2, 2, 1, 1, - 46, 7, 13, 0, 20, 3, 2, 1, 1, 60,156, 13, 1, 52, 84, 60,157, 13, 0, 18, - 4, 52, 41, 60,158, 15, 5, 11, 6, 13, 1, 42, 11, 7, 42, 13, 0, 18, 8, 42, - 11, 9, 42, 13, 0, 18, 10, 42, 11, 11, 42, 13, 0, 18, 4, 42, 11, 12, 42, 2, - 0, 1, 50, 33, 60,160, 15, 5, 11, 6, 13, 1, 42, 11, 7, 42, 13, 0, 18, 8, - 42, 11, 9, 42, 13, 0, 18, 10, 42, 11, 13, 42, 2, 0, 1, 60,161, 50, 72, 60, -163, 13, 0, 18, 4, 52, 35, 60,164, 15, 5, 11, 14, 13, 0, 18, 8, 42, 11, 9, - 42, 13, 0, 18, 10, 42, 11, 11, 42, 13, 0, 18, 4, 42, 11, 12, 42, 2, 0, 1, - 50, 27, 60,166, 15, 5, 11, 14, 13, 0, 18, 8, 42, 11, 9, 42, 13, 0, 18, 10, - 42, 11, 13, 42, 2, 0, 1, 60,167, 60,168, 60,169, 0, 0, 0, 0, 2, 0, 0, - 0,154, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0,155, 0, 0, 0, 7,112, - 97,114,101,110,116, 0, 0, 0, 0, 15, 2, 0, 0, 0, 7,112, 97,114,101,110, -116, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 8,105,110, 99, -108, 97,115,115, 0, 2, 0, 0, 0, 9,105,110,109,111,100,117,108,101, 0, 2, - 0, 0, 0, 9, 99,115,101,116,110, 97,109,101, 0, 2, 0, 0, 0, 7,111,117, -116,112,117,116, 0, 2, 0, 0, 0, 18, 32,116,111,108,117, 97, 95,116, 97, 98, -108,101,118, 97,114, 40, 34, 0, 2, 0, 0, 0, 4, 34, 44, 34, 0, 2, 0, 0, - 0, 6,108,110, 97,109,101, 0, 2, 0, 0, 0, 3, 34, 44, 0, 2, 0, 0, 0, - 9, 99,103,101,116,110, 97,109,101, 0, 2, 0, 0, 0, 2, 44, 0, 2, 0, 0, - 0, 3, 41, 59, 0, 2, 0, 0, 0, 8, 44, 78, 85, 76, 76, 41, 59, 0, 2, 0, - 0, 0, 19, 32,116,111,108,117, 97, 95,103,108,111, 98, 97,108,118, 97,114, 40, - 34, 0, 2, 0, 0, 0, 11,117,110,114,101,103,105,115,116,101,114, 0, 4, 0, - 0, 0,171, 0, 0, 0, 14, 64,118, 97,114,105, 97, 98,108,101, 46,108,117, 97, - 0, 0, 0, 0, 52, 4, 1, 60,172, 13, 0, 20, 1, 2, 1, 1, 4, 0, 32, 48, - 10, 13, 0, 20, 2, 2, 1, 1, 4, 0, 32, 52, 19, 60,173, 15, 3, 11, 4, 13, - 0, 18, 5, 42, 11, 6, 42, 2, 0, 1, 50, 2, 60,174, 60,175, 0, 0, 0, 0, - 1, 0, 0, 0,171, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 7, 2, 0, - 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 8,105,110, 99,108, 97,115,115, - 0, 2, 0, 0, 0, 9,105,110,109,111,100,117,108,101, 0, 2, 0, 0, 0, 7, -111,117,116,112,117,116, 0, 2, 0, 0, 0, 35, 32,108,117, 97, 95,112,117,115, -104,110,105,108, 40, 41, 59, 32,108,117, 97, 95,114, 97,119,115,101,116,103,108, -111, 98, 97,108, 40, 34, 0, 2, 0, 0, 0, 6,108,110, 97,109,101, 0, 2, 0, - 0, 0, 4, 34, 41, 59, 0, 2, 0, 0, 0, 10, 95, 86, 97,114,105, 97, 98,108, -101, 0, 4, 0, 0, 0,179, 0, 0, 0, 14, 64,118, 97,114,105, 97, 98,108,101, - 46,108,117, 97, 0, 0, 0, 0, 40, 4, 1, 60,180, 13, 0, 11, 1, 15, 2, 26, - 60,181, 15, 3, 13, 0, 15, 4, 2, 0, 2, 60,182, 15, 5, 13, 0, 2, 0, 1, - 60,183, 13, 0, 1, 1, 60,184, 0, 0, 0, 0, 1, 0, 0, 0,179, 0, 0, 0, - 2,116, 0, 0, 0, 0, 6, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 6, 95, - 98, 97,115,101, 0, 2, 0, 0, 0, 14, 99,108, 97,115,115, 86, 97,114,105, 97, - 98,108,101, 0, 2, 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, - 10,116,111,108,117, 97, 95,116, 97,103, 0, 2, 0, 0, 0, 7, 97,112,112,101, -110,100, 0, 2, 0, 0, 0, 9, 86, 97,114,105, 97, 98,108,101, 0, 4, 0, 0, - 0,188, 0, 0, 0, 14, 64,118, 97,114,105, 97, 98,108,101, 46,108,117, 97, 0, - 0, 0, 0, 21, 5, 1, 60,189, 15, 1, 15, 2, 13, 0, 11, 3, 2, 1, 2, 3, - 1, 1, 60,190, 0, 0, 0, 0, 1, 0, 0, 0,188, 0, 0, 0, 2,115, 0, 0, - 0, 0, 4, 2, 0, 0, 0, 2,115, 0, 2, 0, 0, 0, 10, 95, 86, 97,114,105, - 97, 98,108,101, 0, 2, 0, 0, 0, 12, 68,101, 99,108, 97,114, 97,116,105,111, -110, 0, 2, 0, 0, 0, 4,118, 97,114, 0, -}; - -/* array.lo */ -static char B12[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 11, 64, 97,114,114, 97,121, - 46,108,117, 97, 0, 0, 0, 0, 87, 3, 0, 60, 18, 22, 1, 60, 19, 11, 1, 15, - 2, 30, 0, 60, 20, 25, 0, 60, 22, 15, 3, 15, 0, 15, 4, 2, 0, 2, 60, 25, - 15, 0, 11, 5, 11, 6, 26, 60, 38, 15, 0, 11, 7, 11, 8, 26, 60, 49, 15, 0, - 11, 9, 11, 10, 26, 60,167, 15, 0, 11, 11, 11, 12, 26, 60,184, 15, 0, 11, 13, - 11, 14, 26, 60,192, 11, 16, 25, 15, 60,201, 11, 18, 25, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 2, 0, 0, 0, 11, 99,108, 97,115,115, 65,114,114, 97,121, 0, - 2, 0, 0, 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, 0, 17, 99,108, 97,115, -115, 68,101, 99,108, 97,114, 97,116,105,111,110, 0, 2, 0, 0, 0, 7,115,101, -116,116, 97,103, 0, 2, 0, 0, 0, 10,116,111,108,117, 97, 95,116, 97,103, 0, - 2, 0, 0, 0, 6,112,114,105,110,116, 0, 4, 0, 0, 0, 25, 0, 0, 0, 11, - 64, 97,114,114, 97,121, 46,108,117, 97, 0, 0, 0, 0,172, 6, 3, 60, 26, 15, - 2, 13, 1, 11, 3, 42, 2, 0, 1, 60, 27, 15, 2, 13, 1, 11, 4, 42, 13, 0, - 18, 6, 42, 11, 7, 42, 2, 0, 1, 60, 28, 15, 2, 13, 1, 11, 8, 42, 13, 0, - 18, 9, 42, 11, 7, 42, 2, 0, 1, 60, 29, 15, 2, 13, 1, 11, 10, 42, 13, 0, - 18, 11, 42, 11, 7, 42, 2, 0, 1, 60, 30, 15, 2, 13, 1, 11, 12, 42, 13, 0, - 18, 13, 42, 11, 7, 42, 2, 0, 1, 60, 31, 15, 2, 13, 1, 11, 14, 42, 13, 0, - 18, 15, 42, 11, 7, 42, 2, 0, 1, 60, 32, 15, 2, 13, 1, 11, 16, 42, 13, 0, - 18, 17, 42, 11, 7, 42, 2, 0, 1, 60, 33, 15, 2, 13, 1, 11, 18, 42, 13, 0, - 18, 19, 42, 11, 7, 42, 2, 0, 1, 60, 34, 15, 2, 13, 1, 11, 20, 42, 13, 2, - 42, 2, 0, 1, 60, 35, 0, 0, 0, 0, 3, 0, 0, 0, 25, 0, 0, 0, 5,115, -101,108,102, 0, 0, 0, 0, 25, 0, 0, 0, 6,105,100,101,110,116, 0, 0, 0, - 0, 25, 0, 0, 0, 6, 99,108,111,115,101, 0, 0, 0, 0, 21, 2, 0, 0, 0, - 6,105,100,101,110,116, 0, 2, 0, 0, 0, 6, 99,108,111,115,101, 0, 2, 0, - 0, 0, 6,112,114,105,110,116, 0, 2, 0, 0, 0, 7, 65,114,114, 97,121,123, - 0, 2, 0, 0, 0, 10, 32,109,111,100, 32, 32, 61, 32, 39, 0, 2, 0, 0, 0, - 5,115,101,108,102, 0, 2, 0, 0, 0, 4,109,111,100, 0, 2, 0, 0, 0, 3, - 39, 44, 0, 2, 0, 0, 0, 10, 32,116,121,112,101, 32, 61, 32, 39, 0, 2, 0, - 0, 0, 5,116,121,112,101, 0, 2, 0, 0, 0, 10, 32,112,116,114, 32, 32, 61, - 32, 39, 0, 2, 0, 0, 0, 4,112,116,114, 0, 2, 0, 0, 0, 10, 32,110, 97, -109,101, 32, 61, 32, 39, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, - 0, 10, 32,100,101,102, 32, 32, 61, 32, 39, 0, 2, 0, 0, 0, 4,100,101,102, - 0, 2, 0, 0, 0, 10, 32,100,105,109, 32, 32, 61, 32, 39, 0, 2, 0, 0, 0, - 4,100,105,109, 0, 2, 0, 0, 0, 10, 32,114,101,116, 32, 32, 61, 32, 39, 0, - 2, 0, 0, 0, 4,114,101,116, 0, 2, 0, 0, 0, 2,125, 0, 2, 0, 0, 0, - 9,103,101,116,118, 97,108,117,101, 0, 4, 0, 0, 0, 38, 0, 0, 0, 11, 64, - 97,114,114, 97,121, 46,108,117, 97, 0, 0, 0, 0, 69, 5, 3, 60, 39, 13, 1, - 48, 2, 13, 2, 52, 19, 60, 40, 13, 1, 11, 2, 42, 13, 0, 18, 4, 42, 11, 5, - 42, 1, 3, 50, 35, 60, 41, 13, 1, 52, 16, 60, 42, 11, 6, 13, 0, 18, 4, 42, - 11, 5, 42, 1, 3, 50, 13, 60, 44, 13, 0, 18, 4, 11, 5, 42, 1, 3, 60, 45, - 60, 46, 0, 0, 0, 0, 3, 0, 0, 0, 38, 0, 0, 0, 5,115,101,108,102, 0, - 0, 0, 0, 38, 0, 0, 0, 6, 99,108, 97,115,115, 0, 0, 0, 0, 38, 0, 0, - 0, 7,115,116, 97,116,105, 99, 0, 0, 0, 0, 7, 2, 0, 0, 0, 6, 99,108, - 97,115,115, 0, 2, 0, 0, 0, 7,115,116, 97,116,105, 99, 0, 2, 0, 0, 0, - 3, 58, 58, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 5,110, - 97,109,101, 0, 2, 0, 0, 0, 15, 91,116,111,108,117, 97, 73, 95,105,110,100, -101,120, 93, 0, 2, 0, 0, 0, 7,115,101,108,102, 45, 62, 0, 2, 0, 0, 0, - 8,115,117,112, 99,111,100,101, 0, 4, 0, 0, 0, 49, 0, 0, 0, 11, 64, 97, -114,114, 97,121, 46,108,117, 97, 0, 0, 0, 4, 21, 17, 1, 60, 50, 13, 0, 20, - 2, 2, 1, 1, 60, 53, 13, 1, 52, 21, 60, 54, 15, 3, 11, 4, 13, 0, 18, 5, - 11, 6, 13, 1, 11, 7, 2, 0, 5, 50, 17, 60, 56, 15, 3, 11, 4, 13, 0, 18, - 5, 11, 7, 2, 0, 3, 60, 57, 60, 58, 13, 0, 11, 8, 13, 0, 20, 9, 11, 10, - 2, 1, 2, 26, 60, 59, 15, 3, 11, 11, 13, 0, 18, 8, 11, 12, 2, 0, 3, 60, - 60, 15, 3, 11, 13, 2, 0, 1, 60, 63, 15, 3, 11, 14, 2, 0, 1, 60, 66, 15, - 17, 13, 0, 18, 18, 11, 19, 2, 3, 2, 60, 67, 13, 1, 48, 5, 13, 4, 4, 0, - 32, 52, 66, 60, 68, 15, 3, 11, 20, 13, 1, 11, 21, 11, 22, 2, 0, 4, 60, 69, - 15, 3, 11, 23, 2, 0, 1, 60, 70, 15, 3, 11, 24, 2, 0, 1, 60, 71, 15, 3, - 11, 25, 2, 0, 1, 60, 72, 15, 3, 11, 26, 13, 1, 11, 27, 2, 0, 3, 60, 73, - 15, 3, 11, 28, 2, 0, 1, 50, 35, 60, 74, 13, 4, 52, 27, 60, 75, 13, 0, 11, - 18, 15, 17, 13, 0, 18, 18, 11, 29, 2, 3, 2, 27, 2, 23, 3, 23, 3, 5, 2, - 50, 2, 60, 76, 60, 79, 15, 3, 11, 30, 2, 0, 1, 60, 80, 15, 3, 11, 31, 2, - 0, 1, 60, 81, 15, 3, 11, 32, 2, 0, 1, 60, 82, 15, 3, 11, 33, 13, 0, 18, - 34, 42, 11, 35, 42, 2, 0, 1, 60, 83, 15, 3, 11, 36, 2, 0, 1, 60, 86, 15, - 38, 13, 0, 18, 39, 2, 1, 1, 60, 87, 13, 5, 11, 40, 32, 52, 32, 60, 88, 15, - 3, 11, 41, 13, 5, 42, 11, 42, 42, 13, 0, 20, 43, 13, 1, 13, 4, 2, 1, 3, - 42, 11, 44, 42, 2, 0, 1, 50,124, 60, 89, 13, 5, 52, 32, 60, 90, 15, 3, 11, - 41, 13, 5, 42, 11, 26, 42, 13, 0, 20, 43, 13, 1, 13, 4, 2, 1, 3, 42, 11, - 44, 42, 2, 0, 1, 50, 86, 60, 92, 13, 0, 18, 45, 11, 46, 32, 46, 7, 13, 0, - 18, 45, 11, 47, 32, 52, 32, 60, 93, 15, 3, 11, 48, 13, 0, 20, 43, 13, 1, 13, - 4, 2, 1, 3, 42, 11, 49, 42, 13, 0, 18, 50, 11, 44, 2, 0, 3, 50, 32, 60, - 95, 15, 3, 11, 51, 13, 0, 20, 43, 13, 1, 13, 4, 2, 1, 3, 42, 11, 49, 42, - 13, 0, 18, 50, 11, 44, 2, 0, 3, 60, 96, 60, 97, 60, 98, 15, 3, 11, 52, 2, - 0, 1, 60, 99, 15, 3, 11, 53, 2, 0, 1, 60,102, 15, 17, 13, 0, 18, 18, 11, - 54, 2, 1, 2, 44, 51, 2, 33, 60,103, 13, 1, 52, 21, 60,104, 15, 3, 11, 55, - 13, 0, 18, 5, 11, 6, 13, 1, 11, 7, 2, 0, 5, 50, 17, 60,106, 15, 3, 11, - 55, 13, 0, 18, 5, 11, 7, 2, 0, 3, 60,107, 60,108, 13, 0, 11, 56, 13, 0, - 20, 9, 11, 57, 2, 1, 2, 26, 60,109, 15, 3, 11, 11, 13, 0, 18, 56, 11, 12, - 2, 0, 3, 60,110, 15, 3, 11, 13, 2, 0, 1, 60,113, 15, 3, 11, 14, 2, 0, - 1, 60,116, 15, 17, 13, 0, 18, 18, 11, 19, 2, 3, 2, 60,117, 13, 1, 48, 5, - 13, 8, 4, 0, 32, 52, 66, 60,118, 15, 3, 11, 20, 13, 1, 11, 21, 11, 22, 2, - 0, 4, 60,119, 15, 3, 11, 23, 2, 0, 1, 60,120, 15, 3, 11, 24, 2, 0, 1, - 60,121, 15, 3, 11, 25, 2, 0, 1, 60,122, 15, 3, 11, 26, 13, 1, 11, 27, 2, - 0, 3, 60,123, 15, 3, 11, 28, 2, 0, 1, 50, 35, 60,124, 13, 8, 52, 27, 60, -125, 13, 0, 11, 18, 15, 17, 13, 0, 18, 18, 11, 29, 2, 3, 2, 27, 2, 23, 7, - 23, 7, 5, 2, 50, 2, 60,126, 60,129, 15, 3, 11, 30, 2, 0, 1, 60,130, 15, - 3, 11, 31, 2, 0, 1, 60,131, 15, 3, 11, 32, 2, 0, 1, 60,132, 15, 3, 11, - 33, 13, 0, 18, 34, 42, 11, 35, 42, 2, 0, 1, 60,133, 15, 3, 11, 36, 2, 0, - 1, 60,136, 11, 47, 60,137, 13, 0, 18, 45, 11, 47, 31, 52, 4, 11, 21, 23, 9, - 60,138, 15, 3, 11, 20, 2, 0, 1, 60,139, 13, 1, 48, 2, 13, 8, 52, 22, 60, -140, 15, 3, 13, 1, 11, 58, 42, 13, 0, 18, 5, 42, 11, 59, 42, 2, 0, 1, 50, - 41, 60,141, 13, 1, 52, 19, 60,142, 15, 3, 11, 60, 13, 0, 18, 5, 42, 11, 59, - 42, 2, 0, 1, 50, 16, 60,144, 15, 3, 13, 0, 18, 5, 11, 59, 42, 2, 0, 1, - 60,145, 60,146, 15, 38, 13, 0, 18, 39, 2, 1, 1, 60,147, 15, 3, 11, 61, 2, - 0, 1, 60,148, 13, 10, 44, 48, 5, 13, 9, 11, 47, 32, 52, 7, 15, 3, 11, 21, - 2, 0, 1, 60,149, 15, 3, 11, 62, 13, 0, 18, 18, 13, 0, 18, 39, 2, 0, 3, - 60,150, 13, 10, 44, 52, 11, 60,151, 15, 3, 11, 21, 2, 0, 1, 50, 2, 60,152, - 60,153, 15, 3, 11, 63, 2, 0, 1, 60,154, 7, 0, 60,155, 13, 0, 18, 64, 11, - 47, 31, 52, 6, 13, 0, 18, 64, 23, 11, 60,156, 13, 10, 52, 20, 60,157, 15, 3, - 11, 65, 13, 10, 42, 11, 66, 13, 11, 11, 67, 2, 0, 4, 50, 15, 60,159, 15, 3, - 11, 68, 13, 11, 11, 67, 2, 0, 3, 60,160, 60,161, 15, 3, 11, 52, 2, 0, 1, - 60,162, 15, 3, 11, 53, 2, 0, 1, 5, 6, 50, 2, 60,163, 60,165, 0, 0, 0, - 0, 18, 0, 0, 0, 49, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 50, 0, - 0, 0, 6, 99,108, 97,115,115, 0, 0, 0, 0, 66, 0, 0, 0, 2, 95, 0, 0, - 0, 0, 66, 0, 0, 0, 2, 95, 0, 0, 0, 0, 66, 0, 0, 0, 7,115,116, 97, -116,105, 99, 0, 0, 0, 0, 86, 0, 0, 0, 2,116, 0, 0, 0, 0,116, 0, 0, - 0, 2, 95, 0, 0, 0, 0,116, 0, 0, 0, 2, 95, 0, 0, 0, 0,116, 0, 0, - 0, 7,115,116, 97,116,105, 99, 0, 0, 0, 0,136, 0, 0, 0, 4,112,116,114, - 0, 0, 0, 0,146, 0, 0, 0, 2,116, 0, 0, 0, 0,154, 0, 0, 0, 4,100, -101,102, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, - 0, 0,162, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,162, 0, - 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 69, 2, 0, 0, 0, 6, - 99,108, 97,115,115, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, - 8,105,110, 99,108, 97,115,115, 0, 2, 0, 0, 0, 7,111,117,116,112,117,116, - 0, 2, 0, 0, 0, 17, 47, 42, 32,103,101,116, 32,102,117,110, 99,116,105,111, -110, 58, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 11, 32,111, -102, 32, 99,108, 97,115,115, 32, 0, 2, 0, 0, 0, 4, 32, 42, 47, 0, 2, 0, - 0, 0, 9, 99,103,101,116,110, 97,109,101, 0, 2, 0, 0, 0, 10, 99,102,117, -110, 99,110, 97,109,101, 0, 2, 0, 0, 0, 11,116,111,108,117, 97, 73, 95,103, -101,116, 0, 2, 0, 0, 0, 12,115,116, 97,116,105, 99, 32,118,111,105,100, 0, - 2, 0, 0, 0, 7, 40,118,111,105,100, 41, 0, 2, 0, 0, 0, 2,123, 0, 2, - 0, 0, 0, 19, 32,105,110,116, 32,116,111,108,117, 97, 73, 95,105,110,100,101, -120, 59, 0, 2, 0, 0, 0, 2, 95, 0, 2, 0, 0, 0, 7,115,116, 97,116,105, - 99, 0, 2, 0, 0, 0, 8,115,116,114,102,105,110,100, 0, 2, 0, 0, 0, 4, -109,111,100, 0, 2, 0, 0, 0, 13, 94, 37,115, 42, 40,115,116, 97,116,105, 99, - 41, 0, 2, 0, 0, 0, 2, 32, 0, 2, 0, 0, 0, 2, 42, 0, 2, 0, 0, 0, - 6,115,101,108,102, 59, 0, 2, 0, 0, 0, 34, 32,108,117, 97, 95,112,117,115, -104,111, 98,106,101, 99,116, 40,108,117, 97, 95,103,101,116,112, 97,114, 97,109, - 40, 49, 41, 41, 59, 0, 2, 0, 0, 0, 26, 32,108,117, 97, 95,112,117,115,104, -115,116,114,105,110,103, 40, 34, 46,115,101,108,102, 34, 41, 59, 0, 2, 0, 0, - 0, 9, 32,115,101,108,102, 32, 61, 32, 0, 2, 0, 0, 0, 2, 40, 0, 2, 0, - 0, 0, 4, 42, 41, 32, 0, 2, 0, 0, 0, 36,108,117, 97, 95,103,101,116,117, -115,101,114,100, 97,116, 97, 40,108,117, 97, 95,114, 97,119,103,101,116,116, 97, - 98,108,101, 40, 41, 41, 59, 0, 2, 0, 0, 0, 20, 94, 37,115, 42,115,116, 97, -116,105, 99, 37,115, 37,115, 42, 40, 46, 42, 41, 0, 2, 0, 0, 0, 42, 32,105, -102, 32, 40, 33,116,111,108,117, 97, 95,105,115,116,121,112,101, 40, 50, 44,116, -111,108,117, 97, 95,116, 97,103, 95,110,117,109, 98,101,114, 44, 48, 41, 41, 0, - 2, 0, 0, 0, 50, 32, 32,116,111,108,117, 97, 95,101,114,114,111,114, 40, 34, -105,110,118, 97,108,105,100, 32,116,121,112,101, 32,105,110, 32, 97,114,114, 97, -121, 32,105,110,100,101,120,105,110,103, 46, 34, 41, 59, 0, 2, 0, 0, 0, 45, - 32,116,111,108,117, 97, 73, 95,105,110,100,101,120, 32, 61, 32, 40,105,110,116, - 41,116,111,108,117, 97, 95,103,101,116,110,117,109, 98,101,114, 40, 50, 44, 48, - 41, 45, 49, 59, 0, 2, 0, 0, 0, 38, 32,105,102, 32, 40,116,111,108,117, 97, - 73, 95,105,110,100,101,120, 60, 48, 32,124,124, 32,116,111,108,117, 97, 73, 95, -105,110,100,101,120, 62, 61, 0, 2, 0, 0, 0, 4,100,105,109, 0, 2, 0, 0, - 0, 2, 41, 0, 2, 0, 0, 0, 47, 32, 32,116,111,108,117, 97, 95,101,114,114, -111,114, 40, 34, 97,114,114, 97,121, 32,105,110,100,101,120,105,110,103, 32,111, -117,116, 32,111,102, 32,114, 97,110,103,101, 46, 34, 41, 59, 0, 2, 0, 0, 0, - 2,116, 0, 2, 0, 0, 0, 8,105,115, 98, 97,115,105, 99, 0, 2, 0, 0, 0, - 5,116,121,112,101, 0, 2, 0, 0, 0, 7,110,117,109, 98,101,114, 0, 2, 0, - 0, 0, 13, 32, 32,116,111,108,117, 97, 95,112,117,115,104, 0, 2, 0, 0, 0, - 10, 40, 40,100,111,117, 98,108,101, 41, 0, 2, 0, 0, 0, 9,103,101,116,118, - 97,108,117,101, 0, 2, 0, 0, 0, 3, 41, 59, 0, 2, 0, 0, 0, 4,112,116, -114, 0, 2, 0, 0, 0, 2, 38, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 30, - 32, 32,116,111,108,117, 97, 95,112,117,115,104,117,115,101,114,116,121,112,101, - 40, 40,118,111,105,100, 42, 41, 38, 0, 2, 0, 0, 0, 2, 44, 0, 2, 0, 0, - 0, 4,116, 97,103, 0, 2, 0, 0, 0, 29, 32, 32,116,111,108,117, 97, 95,112, -117,115,104,117,115,101,114,116,121,112,101, 40, 40,118,111,105,100, 42, 41, 0, - 2, 0, 0, 0, 2,125, 0, 2, 0, 0, 0, 2, 10, 0, 2, 0, 0, 0, 6, 99, -111,110,115,116, 0, 2, 0, 0, 0, 17, 47, 42, 32,115,101,116, 32,102,117,110, - 99,116,105,111,110, 58, 0, 2, 0, 0, 0, 9, 99,115,101,116,110, 97,109,101, - 0, 2, 0, 0, 0, 11,116,111,108,117, 97, 73, 95,115,101,116, 0, 2, 0, 0, - 0, 3, 58, 58, 0, 2, 0, 0, 0, 15, 91,116,111,108,117, 97, 73, 95,105,110, -100,101,120, 93, 0, 2, 0, 0, 0, 7,115,101,108,102, 45, 62, 0, 2, 0, 0, - 0, 4, 32, 61, 32, 0, 2, 0, 0, 0, 3, 40, 40, 0, 2, 0, 0, 0, 3, 41, - 32, 0, 2, 0, 0, 0, 4,100,101,102, 0, 2, 0, 0, 0, 10,116,111,108,117, - 97, 95,103,101,116, 0, 2, 0, 0, 0, 4, 40, 51, 44, 0, 2, 0, 0, 0, 4, - 41, 41, 59, 0, 2, 0, 0, 0, 21,116,111,108,117, 97, 95,103,101,116,117,115, -101,114,116,121,112,101, 40, 51, 44, 0, 2, 0, 0, 0, 9,114,101,103,105,115, -116,101,114, 0, 4, 0, 0, 0,167, 0, 0, 0, 11, 64, 97,114,114, 97,121, 46, -108,117, 97, 0, 0, 0, 0,185, 5, 1, 60,168, 13, 0, 20, 2, 2, 1, 1, 46, - 7, 13, 0, 20, 3, 2, 1, 1, 60,169, 13, 1, 52, 84, 60,170, 13, 0, 18, 4, - 52, 41, 60,171, 15, 5, 11, 6, 13, 1, 42, 11, 7, 42, 13, 0, 18, 8, 42, 11, - 9, 42, 13, 0, 18, 10, 42, 11, 11, 42, 13, 0, 18, 4, 42, 11, 12, 42, 2, 0, - 1, 50, 33, 60,173, 15, 5, 11, 6, 13, 1, 42, 11, 7, 42, 13, 0, 18, 8, 42, - 11, 9, 42, 13, 0, 18, 10, 42, 11, 13, 42, 2, 0, 1, 60,174, 50, 72, 60,176, - 13, 0, 18, 4, 52, 35, 60,177, 15, 5, 11, 14, 13, 0, 18, 8, 42, 11, 9, 42, - 13, 0, 18, 10, 42, 11, 11, 42, 13, 0, 18, 4, 42, 11, 12, 42, 2, 0, 1, 50, - 27, 60,179, 15, 5, 11, 14, 13, 0, 18, 8, 42, 11, 9, 42, 13, 0, 18, 10, 42, - 11, 13, 42, 2, 0, 1, 60,180, 60,181, 60,182, 0, 0, 0, 0, 2, 0, 0, 0, -167, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0,168, 0, 0, 0, 7,112, 97, -114,101,110,116, 0, 0, 0, 0, 15, 2, 0, 0, 0, 7,112, 97,114,101,110,116, - 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 8,105,110, 99,108, - 97,115,115, 0, 2, 0, 0, 0, 9,105,110,109,111,100,117,108,101, 0, 2, 0, - 0, 0, 9, 99,115,101,116,110, 97,109,101, 0, 2, 0, 0, 0, 7,111,117,116, -112,117,116, 0, 2, 0, 0, 0, 20, 32,116,111,108,117, 97, 95,116, 97, 98,108, -101, 97,114,114, 97,121, 40, 34, 0, 2, 0, 0, 0, 4, 34, 44, 34, 0, 2, 0, - 0, 0, 6,108,110, 97,109,101, 0, 2, 0, 0, 0, 3, 34, 44, 0, 2, 0, 0, - 0, 9, 99,103,101,116,110, 97,109,101, 0, 2, 0, 0, 0, 2, 44, 0, 2, 0, - 0, 0, 3, 41, 59, 0, 2, 0, 0, 0, 8, 44, 78, 85, 76, 76, 41, 59, 0, 2, - 0, 0, 0, 21, 32,116,111,108,117, 97, 95,103,108,111, 98, 97,108, 97,114,114, - 97,121, 40, 34, 0, 2, 0, 0, 0, 11,117,110,114,101,103,105,115,116,101,114, - 0, 4, 0, 0, 0,184, 0, 0, 0, 11, 64, 97,114,114, 97,121, 46,108,117, 97, - 0, 0, 0, 0, 52, 4, 1, 60,185, 13, 0, 20, 1, 2, 1, 1, 4, 0, 32, 48, - 10, 13, 0, 20, 2, 2, 1, 1, 4, 0, 32, 52, 19, 60,186, 15, 3, 11, 4, 13, - 0, 18, 5, 42, 11, 6, 42, 2, 0, 1, 50, 2, 60,187, 60,188, 0, 0, 0, 0, - 1, 0, 0, 0,184, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 7, 2, 0, - 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 8,105,110, 99,108, 97,115,115, - 0, 2, 0, 0, 0, 9,105,110,109,111,100,117,108,101, 0, 2, 0, 0, 0, 7, -111,117,116,112,117,116, 0, 2, 0, 0, 0, 32, 32,108,117, 97, 95,112,117,115, -104,110,105,108, 40, 41, 59, 32,108,117, 97, 95,115,101,116,103,108,111, 98, 97, -108, 40, 34, 0, 2, 0, 0, 0, 6,108,110, 97,109,101, 0, 2, 0, 0, 0, 4, - 34, 41, 59, 0, 2, 0, 0, 0, 7, 95, 65,114,114, 97,121, 0, 4, 0, 0, 0, -192, 0, 0, 0, 11, 64, 97,114,114, 97,121, 46,108,117, 97, 0, 0, 0, 0, 40, - 4, 1, 60,193, 13, 0, 11, 1, 15, 2, 26, 60,194, 15, 3, 13, 0, 15, 4, 2, - 0, 2, 60,195, 15, 5, 13, 0, 2, 0, 1, 60,196, 13, 0, 1, 1, 60,197, 0, - 0, 0, 0, 1, 0, 0, 0,192, 0, 0, 0, 2,116, 0, 0, 0, 0, 6, 2, 0, - 0, 0, 2,116, 0, 2, 0, 0, 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, 0, - 11, 99,108, 97,115,115, 65,114,114, 97,121, 0, 2, 0, 0, 0, 7,115,101,116, -116, 97,103, 0, 2, 0, 0, 0, 10,116,111,108,117, 97, 95,116, 97,103, 0, 2, - 0, 0, 0, 7, 97,112,112,101,110,100, 0, 2, 0, 0, 0, 6, 65,114,114, 97, -121, 0, 4, 0, 0, 0,201, 0, 0, 0, 11, 64, 97,114,114, 97,121, 46,108,117, - 97, 0, 0, 0, 0, 21, 5, 1, 60,202, 15, 1, 15, 2, 13, 0, 11, 3, 2, 1, - 2, 3, 1, 1, 60,203, 0, 0, 0, 0, 1, 0, 0, 0,201, 0, 0, 0, 2,115, - 0, 0, 0, 0, 4, 2, 0, 0, 0, 2,115, 0, 2, 0, 0, 0, 7, 95, 65,114, -114, 97,121, 0, 2, 0, 0, 0, 12, 68,101, 99,108, 97,114, 97,116,105,111,110, - 0, 2, 0, 0, 0, 4,118, 97,114, 0, -}; - -/* function.lo */ -static char B13[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 14, 64,102,117,110, 99,116, -105,111,110, 46,108,117, 97, 0, 0, 0, 0,141, 15, 0, 60, 24, 22, 7, 60, 25, - 11, 1, 11, 2, 11, 3, 60, 26, 11, 2, 11, 4, 60, 27, 11, 2, 11, 5, 60, 28, - 11, 2, 11, 6, 60, 29, 22, 1, 11, 7, 7, 0, 30, 0, 11, 8, 60, 30, 11, 2, - 11, 9, 60, 31, 15, 10, 30, 6, 60, 32, 25, 0, 60, 33, 15, 11, 15, 0, 15, 12, - 2, 0, 2, 60, 36, 15, 0, 11, 13, 11, 14, 26, 60, 51, 15, 0, 11, 15, 11, 16, - 26, 60,232, 15, 0, 11, 17, 11, 18, 26, 60,242, 15, 0, 11, 19, 11, 20, 26, 60, -250, 15, 0, 11, 21, 11, 22, 26, 59, 1, 14, 15, 0, 11, 23, 11, 24, 26, 59, 1, - 21, 11, 26, 25, 25, 59, 1, 49, 11, 28, 25, 27, 0, 0, 0, 0, 0, 0, 0, 0, - 29, 2, 0, 0, 0, 14, 99,108, 97,115,115, 70,117,110, 99,116,105,111,110, 0, - 2, 0, 0, 0, 4,109,111,100, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 5, -116,121,112,101, 0, 2, 0, 0, 0, 4,112,116,114, 0, 2, 0, 0, 0, 5,110, - 97,109,101, 0, 2, 0, 0, 0, 5, 97,114,103,115, 0, 2, 0, 0, 0, 2,110, - 0, 2, 0, 0, 0, 6, 99,111,110,115,116, 0, 2, 0, 0, 0, 6, 95, 98, 97, -115,101, 0, 2, 0, 0, 0, 13, 99,108, 97,115,115, 70,101, 97,116,117,114,101, - 0, 2, 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, 10,116,111, -108,117, 97, 95,116, 97,103, 0, 2, 0, 0, 0, 8,100,101, 99,108,116, 97,103, - 0, 4, 0, 0, 0, 36, 0, 0, 0, 14, 64,102,117,110, 99,116,105,111,110, 46, -108,117, 97, 0, 0, 0, 0,141, 10, 1, 60, 37, 13, 0, 20, 1, 2, 1, 1, 48, - 7, 13, 0, 18, 2, 11, 2, 32, 52, 21, 60, 38, 15, 3, 13, 0, 18, 4, 18, 5, - 13, 0, 18, 4, 18, 6, 2, 0, 2, 50, 2, 60, 39, 60, 40, 13, 0, 11, 7, 13, - 0, 11, 8, 15, 9, 13, 0, 18, 10, 15, 11, 13, 0, 18, 12, 11, 2, 2, 1, 2, - 2, 2, 2, 27, 1, 27, 2, 5, 4, 60, 41, 15, 3, 13, 0, 18, 7, 13, 0, 18, - 8, 2, 0, 2, 60, 42, 7, 1, 50, 25, 60, 44, 13, 0, 18, 14, 13, 1, 16, 20, - 3, 2, 0, 1, 60, 45, 13, 1, 7, 1, 37, 23, 1, 60, 46, 60, 43, 13, 0, 18, - 14, 13, 1, 16, 54, 36, 60, 47, 0, 0, 0, 0, 2, 0, 0, 0, 36, 0, 0, 0, - 5,115,101,108,102, 0, 0, 0, 0, 42, 0, 0, 0, 2,105, 0, 0, 0, 0, 15, - 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 8,105,110, 99,108, 97, -115,115, 0, 2, 0, 0, 0, 6, 99,111,110,115,116, 0, 2, 0, 0, 0, 8,100, -101, 99,108,116, 97,103, 0, 2, 0, 0, 0, 7,112, 97,114,101,110,116, 0, 2, - 0, 0, 0, 7, 99,105,116,121,112,101, 0, 2, 0, 0, 0, 5, 99,116, 97,103, - 0, 2, 0, 0, 0, 6,105,116,121,112,101, 0, 2, 0, 0, 0, 4,116, 97,103, - 0, 2, 0, 0, 0, 7,116, 97,103,118, 97,114, 0, 2, 0, 0, 0, 5,116,121, -112,101, 0, 2, 0, 0, 0, 8,115,116,114,102,105,110,100, 0, 2, 0, 0, 0, - 4,109,111,100, 0, 2, 0, 0, 0, 2,105, 0, 2, 0, 0, 0, 5, 97,114,103, -115, 0, 2, 0, 0, 0, 8,115,117,112, 99,111,100,101, 0, 4, 0, 0, 0, 51, - 0, 0, 0, 14, 64,102,117,110, 99,116,105,111,110, 46,108,117, 97, 0, 0, 0, - 6, 51, 15, 1, 60, 52, 13, 0, 20, 2, 2, 1, 1, 60, 53, 15, 5, 13, 0, 18, - 6, 11, 7, 2, 3, 2, 60, 55, 13, 1, 52, 21, 60, 56, 15, 8, 11, 9, 13, 0, - 18, 10, 11, 11, 13, 1, 11, 12, 2, 0, 5, 50, 17, 60, 58, 15, 8, 11, 13, 13, - 0, 18, 10, 11, 12, 2, 0, 3, 60, 59, 60, 60, 15, 8, 11, 14, 13, 0, 18, 15, - 11, 16, 2, 0, 3, 60, 61, 15, 8, 11, 17, 2, 0, 1, 60, 64, 15, 8, 11, 18, - 2, 0, 1, 60, 66, 4, 0, 60, 67, 13, 1, 52, 6, 7, 2, 23, 5, 50, 4, 7, - 1, 23, 5, 60, 68, 13, 1, 48, 7, 13, 0, 18, 10, 11, 20, 31, 48, 5, 13, 4, - 4, 0, 32, 52, 51, 60, 69, 13, 0, 18, 21, 11, 21, 32, 52, 19, 60, 70, 15, 8, - 11, 22, 13, 0, 18, 23, 18, 24, 11, 25, 2, 0, 3, 50, 19, 60, 72, 15, 8, 11, - 22, 13, 0, 18, 23, 18, 26, 11, 25, 2, 0, 3, 60, 73, 50, 2, 60, 74, 60, 76, - 13, 0, 18, 27, 7, 1, 16, 18, 28, 11, 29, 31, 52, 93, 60, 77, 7, 1, 50, 72, - 60, 79, 15, 31, 13, 0, 18, 27, 13, 6, 16, 18, 28, 2, 1, 1, 11, 32, 31, 52, - 29, 60, 80, 15, 8, 11, 33, 13, 0, 18, 27, 13, 6, 16, 20, 34, 13, 5, 2, 1, - 2, 42, 11, 35, 42, 2, 0, 1, 50, 2, 60, 81, 60, 82, 13, 5, 7, 1, 37, 23, - 5, 60, 83, 13, 6, 7, 1, 37, 23, 6, 60, 84, 60, 78, 13, 0, 18, 27, 13, 6, - 16, 54, 83, 5, 1, 50, 2, 60, 85, 60, 87, 15, 8, 11, 36, 13, 5, 42, 11, 37, - 42, 2, 0, 1, 60, 89, 15, 8, 11, 38, 2, 0, 1, 60, 92, 4, 0, 60, 93, 13, - 1, 52, 6, 7, 2, 23, 6, 50, 4, 7, 1, 23, 6, 60, 94, 13, 1, 48, 7, 13, - 0, 18, 10, 11, 20, 31, 48, 5, 13, 4, 4, 0, 32, 52, 47, 60, 95, 15, 8, 11, - 39, 13, 0, 18, 21, 13, 1, 11, 40, 11, 41, 2, 0, 5, 60, 96, 15, 8, 11, 42, - 13, 0, 18, 21, 13, 1, 11, 43, 2, 0, 4, 60, 97, 15, 8, 11, 44, 2, 0, 1, - 50, 35, 60, 98, 13, 4, 52, 27, 60, 99, 13, 0, 11, 6, 15, 5, 13, 0, 18, 6, - 11, 45, 2, 3, 2, 27, 2, 23, 3, 23, 3, 5, 2, 50, 2, 60,100, 60,102, 13, - 0, 18, 27, 7, 1, 16, 18, 28, 11, 29, 31, 52, 57, 60,103, 7, 1, 50, 36, 60, -105, 13, 0, 18, 27, 13, 7, 16, 20, 46, 13, 6, 2, 0, 2, 60,106, 13, 6, 7, - 1, 37, 23, 6, 60,107, 13, 7, 7, 1, 37, 23, 7, 60,108, 60,104, 13, 0, 18, - 27, 13, 7, 16, 54, 47, 5, 1, 50, 2, 60,109, 60,112, 13, 1, 48, 7, 13, 0, - 18, 10, 11, 20, 31, 48, 5, 13, 4, 4, 0, 32, 52, 19, 60,113, 15, 8, 11, 47, - 13, 0, 18, 10, 42, 11, 48, 42, 2, 0, 1, 50, 2, 60,114, 60,117, 13, 1, 52, - 6, 7, 2, 23, 6, 50, 4, 7, 1, 23, 6, 60,118, 13, 0, 18, 27, 7, 1, 16, - 18, 28, 11, 29, 31, 52, 57, 60,119, 7, 1, 50, 36, 60,121, 13, 0, 18, 27, 13, - 7, 16, 20, 49, 13, 6, 2, 0, 2, 60,122, 13, 6, 7, 1, 37, 23, 6, 60,123, - 13, 7, 7, 1, 37, 23, 7, 60,124, 60,120, 13, 0, 18, 27, 13, 7, 16, 54, 47, - 5, 1, 50, 2, 60,125, 60,128, 13, 1, 48, 7, 13, 0, 18, 10, 11, 50, 32, 52, - 12, 60,129, 15, 8, 11, 51, 2, 0, 1, 49, 2,252, 60,130, 13, 1, 48, 7, 13, - 0, 18, 10, 11, 52, 32, 52, 34, 60,131, 15, 8, 11, 53, 13, 0, 18, 27, 7, 1, - 16, 18, 10, 11, 54, 13, 0, 18, 27, 7, 2, 16, 18, 10, 11, 55, 2, 0, 5, 49, - 2,203, 60,133, 15, 8, 11, 56, 2, 0, 1, 60,134, 13, 0, 18, 28, 11, 57, 31, - 48, 7, 13, 0, 18, 28, 11, 29, 31, 52, 48, 60,135, 15, 8, 11, 58, 13, 0, 18, - 6, 13, 0, 18, 28, 13, 0, 18, 59, 11, 60, 2, 0, 5, 60,136, 15, 8, 11, 42, - 13, 0, 18, 6, 13, 0, 18, 28, 13, 0, 18, 59, 11, 61, 2, 0, 5, 50, 11, 60, -138, 15, 8, 11, 58, 2, 0, 1, 60,139, 60,140, 13, 1, 48, 7, 13, 0, 18, 10, - 11, 20, 32, 52, 15, 60,141, 15, 8, 11, 20, 13, 1, 11, 42, 2, 0, 3, 50, 70, - 60,142, 13, 1, 48, 2, 13, 4, 52, 21, 60,143, 15, 8, 13, 1, 11, 62, 42, 13, - 0, 18, 10, 42, 11, 42, 2, 0, 2, 50, 39, 60,144, 13, 1, 52, 18, 60,145, 15, - 8, 11, 63, 13, 0, 18, 10, 42, 11, 42, 2, 0, 2, 50, 15, 60,147, 15, 8, 13, - 0, 18, 10, 11, 42, 2, 0, 2, 60,148, 60,151, 7, 1, 50, 49, 60,153, 13, 0, - 18, 27, 13, 7, 16, 20, 64, 2, 0, 1, 60,154, 13, 7, 7, 1, 37, 23, 7, 60, -155, 13, 0, 18, 27, 13, 7, 16, 52, 11, 60,156, 15, 8, 11, 65, 2, 0, 1, 50, - 2, 60,157, 60,158, 60,152, 13, 0, 18, 27, 13, 7, 16, 54, 60, 60,160, 15, 8, - 11, 66, 2, 0, 1, 60,163, 13, 0, 18, 28, 11, 57, 31, 48, 7, 13, 0, 18, 28, - 11, 29, 31, 52,220, 60,164, 15, 31, 13, 0, 18, 28, 2, 1, 1, 60,165, 13, 8, - 11, 68, 32, 52, 17, 60,166, 15, 8, 11, 69, 13, 8, 42, 11, 70, 42, 2, 0, 1, - 50,179, 60,167, 13, 8, 52, 17, 60,168, 15, 8, 11, 69, 13, 8, 42, 11, 71, 42, - 2, 0, 1, 50,156, 60,170, 13, 0, 18, 59, 11, 57, 32, 52, 98, 60,171, 15, 8, - 11, 72, 2, 0, 1, 60,172, 15, 8, 11, 73, 2, 0, 1, 60,173, 15, 8, 11, 74, - 13, 0, 18, 28, 11, 71, 2, 0, 3, 60,174, 15, 8, 11, 75, 2, 0, 1, 60,175, - 15, 8, 11, 76, 13, 0, 18, 28, 11, 77, 2, 0, 3, 60,176, 15, 8, 11, 78, 2, - 0, 1, 60,177, 15, 8, 11, 79, 13, 0, 18, 26, 11, 80, 13, 0, 18, 26, 11, 66, - 2, 0, 5, 60,178, 15, 8, 11, 81, 2, 0, 1, 50, 45, 60,180, 13, 0, 18, 59, - 11, 82, 32, 52, 17, 60,181, 15, 8, 11, 83, 13, 0, 18, 26, 11, 66, 2, 0, 3, - 50, 17, 60,183, 15, 8, 11, 84, 13, 0, 18, 26, 11, 66, 2, 0, 3, 60,184, 60, -185, 5, 1, 50, 2, 60,186, 60,187, 7, 1, 50, 25, 60,189, 13, 0, 18, 27, 13, - 8, 16, 20, 85, 2, 0, 1, 60,190, 13, 8, 7, 1, 37, 23, 8, 60,191, 60,188, - 13, 0, 18, 27, 13, 8, 16, 54, 36, 60,192, 15, 8, 11, 86, 2, 0, 1, 60,195, - 13, 1, 52, 6, 7, 2, 23, 6, 50, 4, 7, 1, 23, 6, 60,196, 13, 0, 18, 27, - 7, 1, 16, 18, 28, 11, 29, 31, 52, 57, 60,197, 7, 1, 50, 36, 60,199, 13, 0, - 18, 27, 13, 9, 16, 20, 87, 13, 6, 2, 0, 2, 60,200, 13, 6, 7, 1, 37, 23, - 6, 60,201, 13, 9, 7, 1, 37, 23, 9, 60,202, 60,198, 13, 0, 18, 27, 13, 9, - 16, 54, 47, 5, 1, 50, 2, 60,203, 60,206, 13, 0, 18, 27, 7, 1, 16, 18, 28, - 11, 29, 31, 52, 46, 60,207, 7, 1, 50, 25, 60,209, 13, 0, 18, 27, 13, 9, 16, - 20, 88, 2, 0, 1, 60,210, 13, 9, 7, 1, 37, 23, 9, 60,211, 60,208, 13, 0, - 18, 27, 13, 9, 16, 54, 36, 5, 1, 50, 2, 60,212, 5, 2, 60,213, 60,215, 15, - 8, 11, 89, 2, 0, 1, 60,216, 15, 8, 11, 90, 2, 0, 1, 60,219, 15, 8, 11, - 91, 2, 0, 1, 60,220, 15, 93, 13, 0, 18, 15, 9, 2, 9, 1, 2, 1, 3, 7, - 1, 38, 60,221, 13, 7, 7, 0, 36, 52, 38, 60,222, 15, 8, 11, 39, 15, 93, 13, - 0, 18, 15, 7, 1, 9, 3, 2, 1, 3, 42, 15, 94, 11, 95, 13, 7, 2, 1, 2, - 42, 11, 96, 42, 2, 0, 1, 50, 19, 60,224, 15, 8, 11, 97, 13, 0, 18, 98, 42, - 11, 99, 42, 2, 0, 1, 60,225, 60,227, 15, 8, 11,100, 2, 0, 1, 60,228, 15, - 8, 11,101, 2, 0, 1, 60,229, 0, 0, 0, 0, 24, 0, 0, 0, 51, 0, 0, 0, - 5,115,101,108,102, 0, 0, 0, 0, 52, 0, 0, 0, 6, 99,108, 97,115,115, 0, - 0, 0, 0, 53, 0, 0, 0, 2, 95, 0, 0, 0, 0, 53, 0, 0, 0, 2, 95, 0, - 0, 0, 0, 53, 0, 0, 0, 7,115,116, 97,116,105, 99, 0, 0, 0, 0, 66, 0, - 0, 0, 5,110, 97,114,103, 0, 0, 0, 0, 77, 0, 0, 0, 2,105, 0, 0, 0, - 0, 84, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 5,110, 97,114,103, 0, 0, - 0, 0,103, 0, 0, 0, 2,105, 0, 0, 0, 0,108, 0, 0, 0, 0, 0, 0, 0, -119, 0, 0, 0, 2,105, 0, 0, 0, 0,124, 0, 0, 0, 0, 0, 0, 0,151, 0, - 0, 0, 2,105, 0, 0, 0, 0,164, 0, 0, 0, 2,116, 0, 0, 0, 0,185, 0, - 0, 0, 0, 0, 0, 0,187, 0, 0, 0, 2,105, 0, 0, 0, 0,197, 0, 0, 0, - 2,105, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,207, 0, 0, 0, 2,105, - 0, 0, 0, 0,211, 0, 0, 0, 0, 0, 0, 0,212, 0, 0, 0, 0, 0, 0, 0, -212, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 9,111,118,101,114,108,111, 97, -100, 0, 0, 0, 0,102, 2, 0, 0, 0, 6, 99,108, 97,115,115, 0, 2, 0, 0, - 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 8,105,110, 99,108, 97,115,115, 0, - 2, 0, 0, 0, 2, 95, 0, 2, 0, 0, 0, 7,115,116, 97,116,105, 99, 0, 2, - 0, 0, 0, 8,115,116,114,102,105,110,100, 0, 2, 0, 0, 0, 4,109,111,100, - 0, 2, 0, 0, 0, 13, 94, 37,115, 42, 40,115,116, 97,116,105, 99, 41, 0, 2, - 0, 0, 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 11, 47, 42, 32,109, -101,116,104,111,100, 58, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, - 0, 11, 32,111,102, 32, 99,108, 97,115,115, 32, 0, 2, 0, 0, 0, 4, 32, 42, - 47, 0, 2, 0, 0, 0, 13, 47, 42, 32,102,117,110, 99,116,105,111,110, 58, 0, - 2, 0, 0, 0, 12,115,116, 97,116,105, 99, 32,118,111,105,100, 0, 2, 0, 0, - 0, 6, 99,110, 97,109,101, 0, 2, 0, 0, 0, 7, 40,118,111,105,100, 41, 0, - 2, 0, 0, 0, 2,123, 0, 2, 0, 0, 0, 7, 32,105,102, 32, 40, 10, 0, 2, - 0, 0, 0, 5,110, 97,114,103, 0, 2, 0, 0, 0, 4,110,101,119, 0, 2, 0, - 0, 0, 6, 99,111,110,115,116, 0, 2, 0, 0, 0, 22, 32, 32, 32, 32, 32, 33, -116,111,108,117, 97, 95,105,115,116,121,112,101, 40, 49, 44, 0, 2, 0, 0, 0, - 7,112, 97,114,101,110,116, 0, 2, 0, 0, 0, 5, 99,116, 97,103, 0, 2, 0, - 0, 0, 8, 44, 48, 41, 32,124,124, 10, 0, 2, 0, 0, 0, 4,116, 97,103, 0, - 2, 0, 0, 0, 5, 97,114,103,115, 0, 2, 0, 0, 0, 5,116,121,112,101, 0, - 2, 0, 0, 0, 5,118,111,105,100, 0, 2, 0, 0, 0, 2,105, 0, 2, 0, 0, - 0, 8,105,115, 98, 97,115,105, 99, 0, 2, 0, 0, 0, 7,111, 98,106,101, 99, -116, 0, 2, 0, 0, 0, 7, 32, 32, 32, 32, 32, 33, 0, 2, 0, 0, 0, 13,111, -117,116, 99,104,101, 99,107,116,121,112,101, 0, 2, 0, 0, 0, 5, 32,124,124, - 10, 0, 2, 0, 0, 0, 21, 32, 32, 32, 32, 32, 33,116,111,108,117, 97, 95,105, -115,110,111,111, 98,106, 40, 0, 2, 0, 0, 0, 19, 41, 10, 32, 41, 10, 32, 32, -103,111,116,111, 32,101,114,114,111,114, 59, 0, 2, 0, 0, 0, 9, 32,101,108, -115,101, 10, 32,123, 0, 2, 0, 0, 0, 2, 32, 0, 2, 0, 0, 0, 2, 42, 0, - 2, 0, 0, 0, 8,115,101,108,102, 32, 61, 32, 0, 2, 0, 0, 0, 2, 40, 0, - 2, 0, 0, 0, 3, 42, 41, 0, 2, 0, 0, 0, 24,116,111,108,117, 97, 95,103, -101,116,117,115,101,114,116,121,112,101, 40, 49, 44, 48, 41, 59, 0, 2, 0, 0, - 0, 20, 94, 37,115, 42,115,116, 97,116,105, 99, 37,115, 37,115, 42, 40, 46, 42, - 41, 0, 2, 0, 0, 0, 8,100,101, 99,108, 97,114,101, 0, 2, 0, 0, 0, 55, - 32, 32,105,102, 32, 40, 33,115,101,108,102, 41, 32,116,111,108,117, 97, 95,101, -114,114,111,114, 40, 34,105,110,118, 97,108,105,100, 32, 39,115,101,108,102, 39, - 32,105,110, 32,102,117,110, 99,116,105,111,110, 32, 39, 0, 2, 0, 0, 0, 5, - 39, 34, 41, 59, 0, 2, 0, 0, 0, 9,103,101,116, 97,114,114, 97,121, 0, 2, - 0, 0, 0, 7,100,101,108,101,116,101, 0, 2, 0, 0, 0, 15, 32, 32,100,101, -108,101,116,101, 32,115,101,108,102, 59, 0, 2, 0, 0, 0, 12,111,112,101,114, - 97,116,111,114, 38, 91, 93, 0, 2, 0, 0, 0, 20, 32, 32,115,101,108,102, 45, - 62,111,112,101,114, 97,116,111,114, 91, 93, 40, 0, 2, 0, 0, 0, 5, 41, 32, - 61, 32, 0, 2, 0, 0, 0, 2, 59, 0, 2, 0, 0, 0, 4, 32, 32,123, 0, 2, - 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 32, 32, 0, 2, 0, 0, 0, 4,112,116, -114, 0, 2, 0, 0, 0, 14,116,111,108,117, 97, 73, 95,114,101,116, 32, 61, 32, - 0, 2, 0, 0, 0, 3, 41, 32, 0, 2, 0, 0, 0, 3, 58, 58, 0, 2, 0, 0, - 0, 7,115,101,108,102, 45, 62, 0, 2, 0, 0, 0, 8,112, 97,115,115,112, 97, -114, 0, 2, 0, 0, 0, 2, 44, 0, 2, 0, 0, 0, 3, 41, 59, 0, 2, 0, 0, - 0, 2,116, 0, 2, 0, 0, 0, 7,110,117,109, 98,101,114, 0, 2, 0, 0, 0, - 14, 32, 32, 32,116,111,108,117, 97, 95,112,117,115,104, 0, 2, 0, 0, 0, 22, - 40, 40,100,111,117, 98,108,101, 41,116,111,108,117, 97, 73, 95,114,101,116, 41, - 59, 0, 2, 0, 0, 0, 14, 40,116,111,108,117, 97, 73, 95,114,101,116, 41, 59, - 0, 2, 0, 0, 0, 5, 32, 32, 32,123, 0, 2, 0, 0, 0, 20, 35,105,102,100, -101,102, 32, 95, 95, 99,112,108,117,115,112,108,117,115, 10, 0, 2, 0, 0, 0, - 29, 32, 32, 32, 32,118,111,105,100, 42, 32,116,111,108,117, 97, 73, 95, 99,108, -111,110,101, 32, 61, 32,110,101,119, 0, 2, 0, 0, 0, 7, 35,101,108,115,101, - 10, 0, 2, 0, 0, 0, 63, 32, 32, 32, 32,118,111,105,100, 42, 32,116,111,108, -117, 97, 73, 95, 99,108,111,110,101, 32, 61, 32,116,111,108,117, 97, 95, 99,111, -112,121, 40, 40,118,111,105,100, 42, 41, 38,116,111,108,117, 97, 73, 95,114,101, -116, 44,115,105,122,101,111,102, 40, 0, 2, 0, 0, 0, 4, 41, 41, 59, 0, 2, - 0, 0, 0, 8, 35,101,110,100,105,102, 10, 0, 2, 0, 0, 0, 51, 32, 32, 32, - 32,116,111,108,117, 97, 95,112,117,115,104,117,115,101,114,116,121,112,101, 40, -116,111,108,117, 97, 95,100,111, 99,108,111,110,101, 40,116,111,108,117, 97, 73, - 95, 99,108,111,110,101, 44, 0, 2, 0, 0, 0, 3, 41, 44, 0, 2, 0, 0, 0, - 5, 32, 32, 32,125, 0, 2, 0, 0, 0, 2, 38, 0, 2, 0, 0, 0, 42, 32, 32, - 32,116,111,108,117, 97, 95,112,117,115,104,117,115,101,114,116,121,112,101, 40, - 40,118,111,105,100, 42, 41, 38,116,111,108,117, 97, 73, 95,114,101,116, 44, 0, - 2, 0, 0, 0, 41, 32, 32, 32,116,111,108,117, 97, 95,112,117,115,104,117,115, -101,114,116,121,112,101, 40, 40,118,111,105,100, 42, 41,116,111,108,117, 97, 73, - 95,114,101,116, 44, 0, 2, 0, 0, 0, 9,114,101,116,118, 97,108,117,101, 0, - 2, 0, 0, 0, 4, 32, 32,125, 0, 2, 0, 0, 0, 9,115,101,116, 97,114,114, - 97,121, 0, 2, 0, 0, 0, 10,102,114,101,101, 97,114,114, 97,121, 0, 2, 0, - 0, 0, 3, 32,125, 0, 2, 0, 0, 0, 9, 32,114,101,116,117,114,110, 59, 0, - 2, 0, 0, 0, 8,101,114,114,111,114, 58, 10, 0, 2, 0, 0, 0, 9,111,118, -101,114,108,111, 97,100, 0, 2, 0, 0, 0, 7,115,116,114,115,117, 98, 0, 2, - 0, 0, 0, 7,102,111,114,109, 97,116, 0, 2, 0, 0, 0, 5, 37, 48, 50,100, - 0, 2, 0, 0, 0, 4, 40, 41, 59, 0, 2, 0, 0, 0, 36, 32,116,111,108,117, - 97, 95,101,114,114,111,114, 40, 34, 35,102,101,114,114,111,114, 32,105,110, 32, -102,117,110, 99,116,105,111,110, 32, 39, 0, 2, 0, 0, 0, 6,108,110, 97,109, -101, 0, 2, 0, 0, 0, 6, 39, 46, 34, 41, 59, 0, 2, 0, 0, 0, 2,125, 0, - 2, 0, 0, 0, 2, 10, 0, 2, 0, 0, 0, 9,114,101,103,105,115,116,101,114, - 0, 4, 0, 0, 0,232, 0, 0, 0, 14, 64,102,117,110, 99,116,105,111,110, 46, -108,117, 97, 0, 0, 0, 0, 89, 5, 1, 60,233, 13, 0, 20, 2, 2, 1, 1, 46, - 7, 13, 0, 20, 3, 2, 1, 1, 60,234, 13, 1, 52, 33, 60,235, 15, 4, 11, 5, - 13, 1, 42, 11, 6, 42, 13, 0, 18, 7, 42, 11, 8, 42, 13, 0, 18, 9, 42, 11, - 10, 42, 2, 0, 1, 50, 27, 60,237, 15, 4, 11, 11, 13, 0, 18, 7, 42, 11, 8, - 42, 13, 0, 18, 9, 42, 11, 10, 42, 2, 0, 1, 60,238, 60,239, 0, 0, 0, 0, - 2, 0, 0, 0,232, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0,233, 0, 0, - 0, 7,112, 97,114,101,110,116, 0, 0, 0, 0, 12, 2, 0, 0, 0, 7,112, 97, -114,101,110,116, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 8, -105,110, 99,108, 97,115,115, 0, 2, 0, 0, 0, 9,105,110,109,111,100,117,108, -101, 0, 2, 0, 0, 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, 0, 18, 32, -116,111,108,117, 97, 95,102,117,110, 99,116,105,111,110, 40, 34, 0, 2, 0, 0, - 0, 4, 34, 44, 34, 0, 2, 0, 0, 0, 6,108,110, 97,109,101, 0, 2, 0, 0, - 0, 3, 34, 44, 0, 2, 0, 0, 0, 6, 99,110, 97,109,101, 0, 2, 0, 0, 0, - 3, 41, 59, 0, 2, 0, 0, 0, 23, 32,116,111,108,117, 97, 95,102,117,110, 99, -116,105,111,110, 40, 78, 85, 76, 76, 44, 34, 0, 2, 0, 0, 0, 11,117,110,114, -101,103,105,115,116,101,114, 0, 4, 0, 0, 0,242, 0, 0, 0, 14, 64,102,117, -110, 99,116,105,111,110, 46,108,117, 97, 0, 0, 0, 0, 52, 4, 1, 60,243, 13, - 0, 20, 1, 2, 1, 1, 4, 0, 32, 48, 10, 13, 0, 20, 2, 2, 1, 1, 4, 0, - 32, 52, 19, 60,244, 15, 3, 11, 4, 13, 0, 18, 5, 42, 11, 6, 42, 2, 0, 1, - 50, 2, 60,245, 60,246, 0, 0, 0, 0, 1, 0, 0, 0,242, 0, 0, 0, 5,115, -101,108,102, 0, 0, 0, 0, 7, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, - 0, 0, 8,105,110, 99,108, 97,115,115, 0, 2, 0, 0, 0, 9,105,110,109,111, -100,117,108,101, 0, 2, 0, 0, 0, 7,111,117,116,112,117,116, 0, 2, 0, 0, - 0, 32, 32,108,117, 97, 95,112,117,115,104,110,105,108, 40, 41, 59, 32,108,117, - 97, 95,115,101,116,103,108,111, 98, 97,108, 40, 34, 0, 2, 0, 0, 0, 6,108, -110, 97,109,101, 0, 2, 0, 0, 0, 4, 34, 41, 59, 0, 2, 0, 0, 0, 6,112, -114,105,110,116, 0, 4, 0, 0, 0,250, 0, 0, 0, 14, 64,102,117,110, 99,116, -105,111,110, 46,108,117, 97, 0, 0, 0, 1, 1, 8, 3, 60,251, 15, 2, 13, 1, - 11, 3, 42, 2, 0, 1, 60,252, 15, 2, 13, 1, 11, 4, 42, 13, 0, 18, 6, 42, - 11, 7, 42, 2, 0, 1, 60,253, 15, 2, 13, 1, 11, 8, 42, 13, 0, 18, 9, 42, - 11, 7, 42, 2, 0, 1, 60,254, 15, 2, 13, 1, 11, 10, 42, 13, 0, 18, 11, 42, - 11, 7, 42, 2, 0, 1, 60,255, 15, 2, 13, 1, 11, 12, 42, 13, 0, 18, 13, 42, - 11, 7, 42, 2, 0, 1, 59, 1, 0, 15, 2, 13, 1, 11, 14, 42, 13, 0, 18, 15, - 42, 11, 7, 42, 2, 0, 1, 59, 1, 1, 15, 2, 13, 1, 11, 16, 42, 13, 0, 18, - 17, 42, 11, 7, 42, 2, 0, 1, 59, 1, 2, 15, 2, 13, 1, 11, 18, 42, 13, 0, - 18, 19, 42, 11, 7, 42, 2, 0, 1, 59, 1, 3, 15, 2, 13, 1, 11, 20, 42, 2, - 0, 1, 59, 1, 4, 7, 1, 50, 35, 59, 1, 6, 13, 0, 18, 22, 13, 3, 16, 20, - 2, 13, 1, 11, 23, 42, 11, 24, 2, 0, 3, 59, 1, 7, 13, 3, 7, 1, 37, 23, - 3, 59, 1, 8, 59, 1, 5, 13, 0, 18, 22, 13, 3, 16, 54, 47, 59, 1, 9, 15, - 2, 13, 1, 11, 25, 42, 2, 0, 1, 59, 1, 10, 15, 2, 13, 1, 11, 26, 42, 13, - 2, 42, 2, 0, 1, 59, 1, 11, 0, 0, 0, 0, 4, 0, 0, 0,250, 0, 0, 0, - 5,115,101,108,102, 0, 0, 0, 0,250, 0, 0, 0, 6,105,100,101,110,116, 0, - 0, 0, 0,250, 0, 0, 0, 6, 99,108,111,115,101, 0, 0, 0, 1, 4, 0, 0, - 0, 2,105, 0, 0, 0, 0, 27, 2, 0, 0, 0, 6,105,100,101,110,116, 0, 2, - 0, 0, 0, 6, 99,108,111,115,101, 0, 2, 0, 0, 0, 6,112,114,105,110,116, - 0, 2, 0, 0, 0, 10, 70,117,110, 99,116,105,111,110,123, 0, 2, 0, 0, 0, - 10, 32,109,111,100, 32, 32, 61, 32, 39, 0, 2, 0, 0, 0, 5,115,101,108,102, - 0, 2, 0, 0, 0, 4,109,111,100, 0, 2, 0, 0, 0, 3, 39, 44, 0, 2, 0, - 0, 0, 10, 32,116,121,112,101, 32, 61, 32, 39, 0, 2, 0, 0, 0, 5,116,121, -112,101, 0, 2, 0, 0, 0, 10, 32,112,116,114, 32, 32, 61, 32, 39, 0, 2, 0, - 0, 0, 4,112,116,114, 0, 2, 0, 0, 0, 10, 32,110, 97,109,101, 32, 61, 32, - 39, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 11, 32, 99,111, -110,115,116, 32, 61, 32, 39, 0, 2, 0, 0, 0, 6, 99,111,110,115,116, 0, 2, - 0, 0, 0, 11, 32, 99,110, 97,109,101, 32, 61, 32, 39, 0, 2, 0, 0, 0, 6, - 99,110, 97,109,101, 0, 2, 0, 0, 0, 11, 32,108,110, 97,109,101, 32, 61, 32, - 39, 0, 2, 0, 0, 0, 6,108,110, 97,109,101, 0, 2, 0, 0, 0, 10, 32, 97, -114,103,115, 32, 61, 32,123, 0, 2, 0, 0, 0, 2,105, 0, 2, 0, 0, 0, 5, - 97,114,103,115, 0, 2, 0, 0, 0, 3, 32, 32, 0, 2, 0, 0, 0, 2, 44, 0, - 2, 0, 0, 0, 3, 32,125, 0, 2, 0, 0, 0, 2,125, 0, 2, 0, 0, 0, 9, -111,118,101,114,108,111, 97,100, 0, 4, 0, 0, 1, 14, 0, 0, 0, 14, 64,102, -117,110, 99,116,105,111,110, 46,108,117, 97, 0, 0, 0, 0, 22, 4, 1, 59, 1, - 15, 13, 0, 18, 1, 20, 2, 13, 0, 18, 3, 3, 1, 2, 59, 1, 16, 0, 0, 0, - 0, 1, 0, 0, 1, 14, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 4, 2, - 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 7,112, 97,114,101,110,116, - 0, 2, 0, 0, 0, 9,111,118,101,114,108,111, 97,100, 0, 2, 0, 0, 0, 6, -108,110, 97,109,101, 0, 2, 0, 0, 0, 10, 95, 70,117,110, 99,116,105,111,110, - 0, 4, 0, 0, 1, 21, 0, 0, 0, 14, 64,102,117,110, 99,116,105,111,110, 46, -108,117, 97, 0, 0, 0, 0,231, 7, 1, 59, 1, 22, 13, 0, 11, 1, 15, 2, 26, - 59, 1, 23, 15, 3, 13, 0, 15, 4, 2, 0, 2, 59, 1, 25, 13, 0, 18, 5, 11, - 5, 31, 48, 7, 13, 0, 18, 5, 11, 6, 31, 52, 12, 59, 1, 26, 15, 7, 11, 8, - 2, 0, 1, 50, 3, 59, 1, 27, 59, 1, 29, 15, 9, 13, 0, 2, 0, 1, 59, 1, - 30, 13, 0, 20, 10, 2, 1, 1, 52,108, 59, 1, 31, 13, 0, 18, 11, 13, 0, 18, - 12, 18, 11, 32, 52, 46, 59, 1, 32, 13, 0, 11, 11, 11, 13, 26, 59, 1, 33, 13, - 0, 11, 14, 11, 13, 26, 59, 1, 34, 13, 0, 11, 15, 13, 0, 18, 12, 18, 11, 26, - 59, 1, 35, 13, 0, 11, 16, 11, 17, 26, 50, 44, 59, 1, 36, 13, 0, 18, 11, 11, - 18, 13, 0, 18, 12, 18, 11, 42, 32, 52, 22, 59, 1, 37, 13, 0, 11, 11, 11, 19, - 26, 59, 1, 38, 13, 0, 11, 14, 11, 19, 26, 50, 3, 59, 1, 39, 50, 3, 59, 1, - 40, 59, 1, 41, 13, 0, 11, 20, 13, 0, 20, 21, 11, 22, 2, 1, 2, 13, 0, 20, - 23, 13, 0, 2, 1, 2, 42, 26, 59, 1, 42, 13, 0, 1, 1, 59, 1, 43, 0, 0, - 0, 0, 1, 0, 0, 1, 21, 0, 0, 0, 2,116, 0, 0, 0, 0, 24, 2, 0, 0, - 0, 2,116, 0, 2, 0, 0, 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, 0, 14, - 99,108, 97,115,115, 70,117,110, 99,116,105,111,110, 0, 2, 0, 0, 0, 7,115, -101,116,116, 97,103, 0, 2, 0, 0, 0, 10,116,111,108,117, 97, 95,116, 97,103, - 0, 2, 0, 0, 0, 6, 99,111,110,115,116, 0, 2, 0, 0, 0, 1, 0, 2, 0, - 0, 0, 6,101,114,114,111,114, 0, 2, 0, 0, 0, 31, 35,105,110,118, 97,108, -105,100, 32, 39, 99,111,110,115,116, 39, 32,115,112,101, 99,105,102,105, 99, 97, -116,105,111,110, 0, 2, 0, 0, 0, 7, 97,112,112,101,110,100, 0, 2, 0, 0, - 0, 8,105,110, 99,108, 97,115,115, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, - 2, 0, 0, 0, 7,112, 97,114,101,110,116, 0, 2, 0, 0, 0, 4,110,101,119, - 0, 2, 0, 0, 0, 6,108,110, 97,109,101, 0, 2, 0, 0, 0, 5,116,121,112, -101, 0, 2, 0, 0, 0, 4,112,116,114, 0, 2, 0, 0, 0, 2, 42, 0, 2, 0, - 0, 0, 2,126, 0, 2, 0, 0, 0, 7,100,101,108,101,116,101, 0, 2, 0, 0, - 0, 6, 99,110, 97,109,101, 0, 2, 0, 0, 0, 10, 99,102,117,110, 99,110, 97, -109,101, 0, 2, 0, 0, 0, 7,116,111,108,117, 97, 73, 0, 2, 0, 0, 0, 9, -111,118,101,114,108,111, 97,100, 0, 2, 0, 0, 0, 9, 70,117,110, 99,116,105, -111,110, 0, 4, 0, 0, 1, 49, 0, 0, 0, 14, 64,102,117,110, 99,116,105,111, -110, 46,108,117, 97, 0, 0, 0, 0,147, 11, 3, 59, 1, 50, 15, 4, 15, 5, 13, - 1, 7, 2, 9, 2, 2, 1, 3, 11, 6, 2, 1, 2, 59, 1, 51, 7, 1, 59, 1, - 52, 22, 1, 11, 9, 7, 0, 30, 0, 50, 50, 59, 1, 54, 13, 5, 11, 9, 13, 5, - 18, 9, 7, 1, 37, 26, 59, 1, 55, 13, 5, 13, 5, 18, 9, 15, 10, 13, 3, 13, - 4, 16, 11, 11, 2, 1, 2, 26, 59, 1, 56, 13, 4, 7, 1, 37, 23, 4, 59, 1, - 57, 59, 1, 53, 13, 3, 13, 4, 16, 54, 60, 59, 1, 58, 15, 10, 13, 0, 11, 13, - 2, 1, 2, 59, 1, 59, 13, 6, 11, 14, 13, 5, 26, 59, 1, 60, 13, 6, 11, 15, - 13, 2, 26, 59, 1, 61, 15, 16, 13, 6, 3, 7, 1, 59, 1, 62, 0, 0, 0, 0, - 7, 0, 0, 1, 49, 0, 0, 0, 2,100, 0, 0, 0, 1, 49, 0, 0, 0, 2, 97, - 0, 0, 0, 1, 49, 0, 0, 0, 2, 99, 0, 0, 0, 1, 50, 0, 0, 0, 2,116, - 0, 0, 0, 1, 51, 0, 0, 0, 2,105, 0, 0, 0, 1, 52, 0, 0, 0, 2,108, - 0, 0, 0, 1, 58, 0, 0, 0, 2,102, 0, 0, 0, 0, 17, 2, 0, 0, 0, 2, -100, 0, 2, 0, 0, 0, 2, 97, 0, 2, 0, 0, 0, 2, 99, 0, 2, 0, 0, 0, - 2,116, 0, 2, 0, 0, 0, 6,115,112,108,105,116, 0, 2, 0, 0, 0, 7,115, -116,114,115,117, 98, 0, 2, 0, 0, 0, 2, 44, 0, 2, 0, 0, 0, 2,105, 0, - 2, 0, 0, 0, 2,108, 0, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 12, 68, -101, 99,108, 97,114, 97,116,105,111,110, 0, 2, 0, 0, 0, 4,118, 97,114, 0, - 2, 0, 0, 0, 2,102, 0, 2, 0, 0, 0, 5,102,117,110, 99, 0, 2, 0, 0, - 0, 5, 97,114,103,115, 0, 2, 0, 0, 0, 6, 99,111,110,115,116, 0, 2, 0, - 0, 0, 10, 95, 70,117,110, 99,116,105,111,110, 0, -}; - -/* operator.lo */ -static char B14[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 14, 64,111,112,101,114, 97, -116,111,114, 46,108,117, 97, 0, 0, 0, 0,125, 21, 0, 60, 18, 22, 2, 60, 19, - 11, 1, 11, 2, 11, 3, 60, 20, 15, 4, 30, 1, 60, 21, 25, 0, 60, 22, 15, 5, - 15, 0, 15, 6, 2, 0, 2, 60, 25, 22, 10, 11, 8, 11, 9, 60, 26, 11, 10, 11, - 11, 60, 27, 11, 12, 11, 13, 60, 28, 11, 14, 11, 15, 60, 29, 11, 16, 11, 17, 60, - 30, 11, 18, 11, 19, 60, 31, 11, 20, 11, 21, 60, 32, 11, 22, 11, 23, 60, 33, 11, - 24, 11, 25, 60, 34, 11, 26, 11, 27, 30, 9, 60, 35, 25, 7, 60, 39, 15, 0, 11, - 28, 11, 29, 26, 60, 60, 11, 31, 25, 30, 60, 82, 11, 33, 25, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 34, 2, 0, 0, 0, 14, 99,108, 97,115,115, 79,112,101,114, 97, -116,111,114, 0, 2, 0, 0, 0, 5,107,105,110,100, 0, 2, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, 0, 14, 99,108, 97,115, -115, 70,117,110, 99,116,105,111,110, 0, 2, 0, 0, 0, 7,115,101,116,116, 97, -103, 0, 2, 0, 0, 0, 10,116,111,108,117, 97, 95,116, 97,103, 0, 2, 0, 0, - 0, 4, 95, 84, 77, 0, 2, 0, 0, 0, 2, 43, 0, 2, 0, 0, 0, 13,111,112, -101,114, 97,116,111,114, 95, 97,100,100, 0, 2, 0, 0, 0, 2, 45, 0, 2, 0, - 0, 0, 13,111,112,101,114, 97,116,111,114, 95,115,117, 98, 0, 2, 0, 0, 0, - 2, 42, 0, 2, 0, 0, 0, 13,111,112,101,114, 97,116,111,114, 95,109,117,108, - 0, 2, 0, 0, 0, 2, 47, 0, 2, 0, 0, 0, 13,111,112,101,114, 97,116,111, -114, 95,100,105,118, 0, 2, 0, 0, 0, 2, 60, 0, 2, 0, 0, 0, 12,111,112, -101,114, 97,116,111,114, 95,108,116, 0, 2, 0, 0, 0, 2, 62, 0, 2, 0, 0, - 0, 12,111,112,101,114, 97,116,111,114, 95,103,116, 0, 2, 0, 0, 0, 3, 60, - 61, 0, 2, 0, 0, 0, 12,111,112,101,114, 97,116,111,114, 95,108,101, 0, 2, - 0, 0, 0, 3, 62, 61, 0, 2, 0, 0, 0, 12,111,112,101,114, 97,116,111,114, - 95,103,101, 0, 2, 0, 0, 0, 3, 91, 93, 0, 2, 0, 0, 0, 13,111,112,101, -114, 97,116,111,114, 95,103,101,116, 0, 2, 0, 0, 0, 4, 38, 91, 93, 0, 2, - 0, 0, 0, 13,111,112,101,114, 97,116,111,114, 95,115,101,116, 0, 2, 0, 0, - 0, 6,112,114,105,110,116, 0, 4, 0, 0, 0, 39, 0, 0, 0, 14, 64,111,112, -101,114, 97,116,111,114, 46,108,117, 97, 0, 0, 0, 1, 9, 8, 3, 60, 40, 15, - 2, 13, 1, 11, 3, 42, 2, 0, 1, 60, 41, 15, 2, 13, 1, 11, 4, 42, 13, 0, - 18, 6, 42, 11, 7, 42, 2, 0, 1, 60, 42, 15, 2, 13, 1, 11, 8, 42, 13, 0, - 18, 9, 42, 11, 7, 42, 2, 0, 1, 60, 43, 15, 2, 13, 1, 11, 10, 42, 13, 0, - 18, 11, 42, 11, 7, 42, 2, 0, 1, 60, 44, 15, 2, 13, 1, 11, 12, 42, 13, 0, - 18, 13, 42, 11, 7, 42, 2, 0, 1, 60, 45, 15, 2, 13, 1, 11, 14, 42, 13, 0, - 18, 15, 42, 11, 7, 42, 2, 0, 1, 60, 46, 15, 2, 13, 1, 11, 16, 42, 13, 0, - 18, 17, 42, 11, 7, 42, 2, 0, 1, 60, 47, 15, 2, 13, 1, 11, 18, 42, 13, 0, - 18, 19, 42, 11, 7, 42, 2, 0, 1, 60, 48, 15, 2, 13, 1, 11, 20, 42, 13, 0, - 18, 21, 42, 11, 7, 42, 2, 0, 1, 60, 49, 15, 2, 13, 1, 11, 22, 42, 2, 0, - 1, 60, 50, 7, 1, 50, 32, 60, 52, 13, 0, 18, 24, 13, 3, 16, 20, 2, 13, 1, - 11, 25, 42, 11, 26, 2, 0, 3, 60, 53, 13, 3, 7, 1, 37, 23, 3, 60, 54, 60, - 51, 13, 0, 18, 24, 13, 3, 16, 54, 43, 60, 55, 15, 2, 13, 1, 11, 27, 42, 2, - 0, 1, 60, 56, 15, 2, 13, 1, 11, 28, 42, 13, 2, 42, 2, 0, 1, 60, 57, 0, - 0, 0, 0, 4, 0, 0, 0, 39, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, - 39, 0, 0, 0, 6,105,100,101,110,116, 0, 0, 0, 0, 39, 0, 0, 0, 6, 99, -108,111,115,101, 0, 0, 0, 0, 50, 0, 0, 0, 2,105, 0, 0, 0, 0, 29, 2, - 0, 0, 0, 6,105,100,101,110,116, 0, 2, 0, 0, 0, 6, 99,108,111,115,101, - 0, 2, 0, 0, 0, 6,112,114,105,110,116, 0, 2, 0, 0, 0, 10, 79,112,101, -114, 97,116,111,114,123, 0, 2, 0, 0, 0, 11, 32,107,105,110,100, 32, 32, 61, - 32, 39, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 5,107,105, -110,100, 0, 2, 0, 0, 0, 3, 39, 44, 0, 2, 0, 0, 0, 10, 32,109,111,100, - 32, 32, 61, 32, 39, 0, 2, 0, 0, 0, 4,109,111,100, 0, 2, 0, 0, 0, 10, - 32,116,121,112,101, 32, 61, 32, 39, 0, 2, 0, 0, 0, 5,116,121,112,101, 0, - 2, 0, 0, 0, 10, 32,112,116,114, 32, 32, 61, 32, 39, 0, 2, 0, 0, 0, 4, -112,116,114, 0, 2, 0, 0, 0, 10, 32,110, 97,109,101, 32, 61, 32, 39, 0, 2, - 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, 0, 0, 11, 32, 99,111,110,115,116, - 32, 61, 32, 39, 0, 2, 0, 0, 0, 6, 99,111,110,115,116, 0, 2, 0, 0, 0, - 11, 32, 99,110, 97,109,101, 32, 61, 32, 39, 0, 2, 0, 0, 0, 6, 99,110, 97, -109,101, 0, 2, 0, 0, 0, 11, 32,108,110, 97,109,101, 32, 61, 32, 39, 0, 2, - 0, 0, 0, 6,108,110, 97,109,101, 0, 2, 0, 0, 0, 10, 32, 97,114,103,115, - 32, 61, 32,123, 0, 2, 0, 0, 0, 2,105, 0, 2, 0, 0, 0, 5, 97,114,103, -115, 0, 2, 0, 0, 0, 3, 32, 32, 0, 2, 0, 0, 0, 2, 44, 0, 2, 0, 0, - 0, 3, 32,125, 0, 2, 0, 0, 0, 2,125, 0, 2, 0, 0, 0, 10, 95, 79,112, -101,114, 97,116,111,114, 0, 4, 0, 0, 0, 60, 0, 0, 0, 14, 64,111,112,101, -114, 97,116,111,114, 46,108,117, 97, 0, 0, 0, 0,140, 7, 1, 60, 61, 13, 0, - 11, 1, 15, 2, 26, 60, 62, 15, 3, 13, 0, 15, 4, 2, 0, 2, 60, 64, 13, 0, - 18, 5, 11, 5, 31, 48, 7, 13, 0, 18, 5, 11, 6, 31, 52, 11, 60, 65, 15, 7, - 11, 8, 2, 0, 1, 50, 2, 60, 66, 60, 68, 15, 9, 13, 0, 2, 0, 1, 60, 69, - 13, 0, 20, 10, 2, 1, 1, 44, 52, 11, 60, 70, 15, 7, 11, 11, 2, 0, 1, 50, - 2, 60, 71, 60, 73, 13, 0, 11, 12, 13, 0, 20, 13, 11, 14, 2, 1, 2, 13, 0, - 20, 15, 13, 0, 2, 1, 2, 42, 26, 60, 74, 13, 0, 11, 16, 13, 0, 18, 16, 13, - 0, 18, 17, 42, 26, 60, 75, 13, 0, 1, 1, 60, 76, 0, 0, 0, 0, 1, 0, 0, - 0, 60, 0, 0, 0, 2,116, 0, 0, 0, 0, 18, 2, 0, 0, 0, 2,116, 0, 2, - 0, 0, 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, 0, 14, 99,108, 97,115,115, - 79,112,101,114, 97,116,111,114, 0, 2, 0, 0, 0, 7,115,101,116,116, 97,103, - 0, 2, 0, 0, 0, 10,116,111,108,117, 97, 95,116, 97,103, 0, 2, 0, 0, 0, - 6, 99,111,110,115,116, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 6,101,114, -114,111,114, 0, 2, 0, 0, 0, 31, 35,105,110,118, 97,108,105,100, 32, 39, 99, -111,110,115,116, 39, 32,115,112,101, 99,105,102,105, 99, 97,116,105,111,110, 0, - 2, 0, 0, 0, 7, 97,112,112,101,110,100, 0, 2, 0, 0, 0, 8,105,110, 99, -108, 97,115,115, 0, 2, 0, 0, 0, 46, 35,111,112,101,114, 97,116,111,114, 32, - 99, 97,110, 32,111,110,108,121, 32, 98,101, 32,100,101,102,105,110,101,100, 32, - 97,115, 32, 99,108, 97,115,115, 32,109,101,109, 98,101,114, 0, 2, 0, 0, 0, - 6, 99,110, 97,109,101, 0, 2, 0, 0, 0, 10, 99,102,117,110, 99,110, 97,109, -101, 0, 2, 0, 0, 0, 7,116,111,108,117, 97, 73, 0, 2, 0, 0, 0, 9,111, -118,101,114,108,111, 97,100, 0, 2, 0, 0, 0, 5,110, 97,109,101, 0, 2, 0, - 0, 0, 5,107,105,110,100, 0, 2, 0, 0, 0, 9, 79,112,101,114, 97,116,111, -114, 0, 4, 0, 0, 0, 82, 0, 0, 0, 14, 64,111,112,101,114, 97,116,111,114, - 46,108,117, 97, 0, 0, 0, 1, 99, 14, 4, 60, 83, 15, 5, 15, 6, 13, 2, 7, - 2, 15, 7, 13, 2, 2, 1, 1, 7, 1, 38, 2, 1, 3, 11, 8, 2, 1, 2, 60, - 84, 7, 1, 60, 85, 22, 1, 11, 11, 7, 0, 30, 0, 50, 46, 60, 87, 13, 6, 11, - 11, 13, 6, 18, 11, 7, 1, 37, 26, 60, 88, 13, 6, 13, 6, 18, 11, 15, 12, 13, - 4, 13, 5, 16, 11, 13, 2, 1, 2, 26, 60, 89, 13, 5, 7, 1, 37, 23, 5, 60, - 90, 60, 86, 13, 4, 13, 5, 16, 54, 55, 60, 91, 13, 1, 11, 14, 32, 52, 17, 60, - 92, 15, 15, 13, 0, 11, 16, 11, 17, 2, 1, 3, 23, 0, 50, 59, 60, 93, 13, 1, - 11, 18, 32, 52, 48, 60, 94, 13, 6, 11, 11, 13, 6, 18, 11, 7, 1, 37, 26, 60, - 95, 13, 6, 13, 6, 18, 11, 15, 12, 13, 0, 11, 13, 2, 1, 2, 26, 60, 96, 13, - 6, 13, 6, 18, 11, 16, 11, 19, 11, 20, 26, 50, 2, 60, 97, 60, 98, 15, 12, 13, - 0, 11, 22, 2, 1, 2, 60, 99, 13, 1, 11, 14, 32, 48, 25, 13, 6, 7, 1, 16, - 4, 0, 32, 46, 15, 15, 23, 13, 6, 7, 1, 16, 18, 24, 2, 1, 1, 11, 25, 31, - 52, 11, 60,100, 15, 26, 11, 27, 2, 0, 1, 50, 2, 60,101, 60,102, 13, 7, 11, - 28, 13, 6, 26, 60,103, 13, 7, 11, 29, 13, 3, 26, 60,104, 13, 7, 11, 30, 15, - 15, 13, 1, 11, 31, 11, 17, 2, 1, 3, 26, 60,105, 13, 7, 11, 32, 15, 33, 13, - 7, 18, 30, 16, 26, 60,106, 13, 7, 18, 30, 11, 14, 32, 48, 12, 15, 34, 13, 7, - 18, 35, 11, 29, 2, 1, 2, 44, 52, 20, 60,107, 15, 36, 13, 0, 11, 16, 13, 1, - 42, 13, 2, 13, 3, 2, 0, 4, 50, 2, 60,108, 60,109, 15, 37, 13, 7, 3, 8, - 1, 60,110, 0, 0, 0, 0, 8, 0, 0, 0, 82, 0, 0, 0, 2,100, 0, 0, 0, - 0, 82, 0, 0, 0, 2,107, 0, 0, 0, 0, 82, 0, 0, 0, 2, 97, 0, 0, 0, - 0, 82, 0, 0, 0, 2, 99, 0, 0, 0, 0, 83, 0, 0, 0, 2,116, 0, 0, 0, - 0, 84, 0, 0, 0, 2,105, 0, 0, 0, 0, 85, 0, 0, 0, 2,108, 0, 0, 0, - 0, 98, 0, 0, 0, 2,102, 0, 0, 0, 0, 38, 2, 0, 0, 0, 2,100, 0, 2, - 0, 0, 0, 2,107, 0, 2, 0, 0, 0, 2, 97, 0, 2, 0, 0, 0, 2, 99, 0, - 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 6,115,112,108,105,116, 0, 2, 0, - 0, 0, 7,115,116,114,115,117, 98, 0, 2, 0, 0, 0, 7,115,116,114,108,101, -110, 0, 2, 0, 0, 0, 2, 44, 0, 2, 0, 0, 0, 2,105, 0, 2, 0, 0, 0, - 2,108, 0, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 12, 68,101, 99,108, 97, -114, 97,116,105,111,110, 0, 2, 0, 0, 0, 4,118, 97,114, 0, 2, 0, 0, 0, - 3, 91, 93, 0, 2, 0, 0, 0, 5,103,115,117, 98, 0, 2, 0, 0, 0, 2, 38, - 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 4, 38, 91, 93, 0, 2, 0, 0, 0, - 5,110, 97,109,101, 0, 2, 0, 0, 0, 13,116,111,108,117, 97, 73, 95,118, 97, -108,117,101, 0, 2, 0, 0, 0, 2,102, 0, 2, 0, 0, 0, 5,102,117,110, 99, - 0, 2, 0, 0, 0, 8,105,115, 98, 97,115,105, 99, 0, 2, 0, 0, 0, 5,116, -121,112,101, 0, 2, 0, 0, 0, 7,110,117,109, 98,101,114, 0, 2, 0, 0, 0, - 6,101,114,114,111,114, 0, 2, 0, 0, 0, 50,111,112,101,114, 97,116,111,114, - 91, 93, 32, 99, 97,110, 32,111,110,108,121, 32, 98,101, 32,100,101,102,105,110, -101,100, 32,102,111,114, 32,110,117,109,101,114,105, 99, 32,105,110,100,101,120, - 46, 0, 2, 0, 0, 0, 5, 97,114,103,115, 0, 2, 0, 0, 0, 6, 99,111,110, -115,116, 0, 2, 0, 0, 0, 5,107,105,110,100, 0, 2, 0, 0, 0, 3, 37,115, - 0, 2, 0, 0, 0, 6,108,110, 97,109,101, 0, 2, 0, 0, 0, 4, 95, 84, 77, - 0, 2, 0, 0, 0, 8,115,116,114,102,105,110,100, 0, 2, 0, 0, 0, 4,109, -111,100, 0, 2, 0, 0, 0, 9, 79,112,101,114, 97,116,111,114, 0, 2, 0, 0, - 0, 10, 95, 79,112,101,114, 97,116,111,114, 0, -}; - -/* verbatim.lo */ -static char B15[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 14, 64,118,101,114, 98, 97, -116,105,109, 46,108,117, 97, 0, 0, 0, 0, 84, 5, 0, 60, 20, 22, 2, 60, 21, - 11, 1, 11, 2, 11, 3, 60, 22, 15, 4, 30, 1, 60, 23, 25, 0, 60, 24, 15, 5, - 15, 0, 15, 6, 2, 0, 2, 60, 27, 15, 0, 11, 7, 11, 8, 26, 60, 34, 15, 0, - 11, 9, 11, 10, 26, 60, 42, 15, 0, 11, 11, 11, 12, 26, 60, 50, 15, 0, 11, 13, - 11, 14, 26, 60, 58, 11, 16, 25, 15, 60, 67, 11, 18, 25, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 2, 0, 0, 0, 14, 99,108, 97,115,115, 86,101,114, 98, 97,116, -105,109, 0, 2, 0, 0, 0, 5,108,105,110,101, 0, 2, 0, 0, 0, 1, 0, 2, - 0, 0, 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, 0, 13, 99,108, 97,115,115, - 70,101, 97,116,117,114,101, 0, 2, 0, 0, 0, 7,115,101,116,116, 97,103, 0, - 2, 0, 0, 0, 10,116,111,108,117, 97, 95,116, 97,103, 0, 2, 0, 0, 0, 9, -112,114,101, 97,109, 98,108,101, 0, 4, 0, 0, 0, 27, 0, 0, 0, 14, 64,118, -101,114, 98, 97,116,105,109, 46,108,117, 97, 0, 0, 0, 0, 29, 3, 1, 60, 28, - 13, 0, 18, 1, 44, 52, 13, 60, 29, 15, 2, 13, 0, 18, 3, 2, 0, 1, 50, 2, - 60, 30, 60, 31, 0, 0, 0, 0, 1, 0, 0, 0, 27, 0, 0, 0, 5,115,101,108, -102, 0, 0, 0, 0, 4, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, - 5, 99,111,110,100, 0, 2, 0, 0, 0, 6,119,114,105,116,101, 0, 2, 0, 0, - 0, 5,108,105,110,101, 0, 2, 0, 0, 0, 8,115,117,112, 99,111,100,101, 0, - 4, 0, 0, 0, 34, 0, 0, 0, 14, 64,118,101,114, 98, 97,116,105,109, 46,108, -117, 97, 0, 0, 0, 0, 37, 3, 1, 60, 35, 13, 0, 18, 1, 52, 22, 60, 36, 15, - 2, 13, 0, 18, 3, 2, 0, 1, 60, 37, 15, 2, 11, 4, 2, 0, 1, 50, 2, 60, - 38, 60, 39, 0, 0, 0, 0, 1, 0, 0, 0, 34, 0, 0, 0, 5,115,101,108,102, - 0, 0, 0, 0, 5, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 5, - 99,111,110,100, 0, 2, 0, 0, 0, 6,119,114,105,116,101, 0, 2, 0, 0, 0, - 5,108,105,110,101, 0, 2, 0, 0, 0, 2, 10, 0, 2, 0, 0, 0, 9,114,101, -103,105,115,116,101,114, 0, 4, 0, 0, 0, 42, 0, 0, 0, 14, 64,118,101,114, - 98, 97,116,105,109, 46,108,117, 97, 0, 0, 0, 0, 28, 3, 1, 60, 43, 13, 0, - 18, 1, 52, 13, 60, 44, 15, 2, 13, 0, 18, 3, 2, 0, 1, 50, 2, 60, 45, 60, - 46, 0, 0, 0, 0, 1, 0, 0, 0, 42, 0, 0, 0, 5,115,101,108,102, 0, 0, - 0, 0, 4, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, 5, 99,111, -110,100, 0, 2, 0, 0, 0, 6,119,114,105,116,101, 0, 2, 0, 0, 0, 5,108, -105,110,101, 0, 2, 0, 0, 0, 6,112,114,105,110,116, 0, 4, 0, 0, 0, 50, - 0, 0, 0, 14, 64,118,101,114, 98, 97,116,105,109, 46,108,117, 97, 0, 0, 0, - 0, 52, 6, 3, 60, 51, 15, 2, 13, 1, 11, 3, 42, 2, 0, 1, 60, 52, 15, 2, - 13, 1, 11, 4, 42, 13, 0, 18, 6, 42, 11, 7, 42, 2, 0, 1, 60, 53, 15, 2, - 13, 1, 11, 8, 42, 13, 2, 42, 2, 0, 1, 60, 54, 0, 0, 0, 0, 3, 0, 0, - 0, 50, 0, 0, 0, 5,115,101,108,102, 0, 0, 0, 0, 50, 0, 0, 0, 6,105, -100,101,110,116, 0, 0, 0, 0, 50, 0, 0, 0, 6, 99,108,111,115,101, 0, 0, - 0, 0, 9, 2, 0, 0, 0, 6,105,100,101,110,116, 0, 2, 0, 0, 0, 6, 99, -108,111,115,101, 0, 2, 0, 0, 0, 6,112,114,105,110,116, 0, 2, 0, 0, 0, - 10, 86,101,114, 98, 97,116,105,109,123, 0, 2, 0, 0, 0, 10, 32,108,105,110, -101, 32, 61, 32, 39, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, 2, 0, 0, 0, - 5,108,105,110,101, 0, 2, 0, 0, 0, 3, 39, 44, 0, 2, 0, 0, 0, 2,125, - 0, 2, 0, 0, 0, 10, 95, 86,101,114, 98, 97,116,105,109, 0, 4, 0, 0, 0, - 58, 0, 0, 0, 14, 64,118,101,114, 98, 97,116,105,109, 46,108,117, 97, 0, 0, - 0, 0, 40, 4, 1, 60, 59, 13, 0, 11, 1, 15, 2, 26, 60, 60, 15, 3, 13, 0, - 15, 4, 2, 0, 2, 60, 61, 15, 5, 13, 0, 2, 0, 1, 60, 62, 13, 0, 1, 1, - 60, 63, 0, 0, 0, 0, 1, 0, 0, 0, 58, 0, 0, 0, 2,116, 0, 0, 0, 0, - 6, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 6, 95, 98, 97,115,101, 0, 2, - 0, 0, 0, 14, 99,108, 97,115,115, 86,101,114, 98, 97,116,105,109, 0, 2, 0, - 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, 10,116,111,108,117, 97, - 95,116, 97,103, 0, 2, 0, 0, 0, 7, 97,112,112,101,110,100, 0, 2, 0, 0, - 0, 9, 86,101,114, 98, 97,116,105,109, 0, 4, 0, 0, 0, 67, 0, 0, 0, 14, - 64,118,101,114, 98, 97,116,105,109, 46,108,117, 97, 0, 0, 0, 0, 75, 8, 1, - 60, 68, 4, 0, 60, 69, 15, 2, 13, 0, 7, 1, 7, 1, 2, 1, 3, 11, 3, 32, - 52, 21, 60, 70, 7, 1, 23, 1, 60, 71, 15, 2, 13, 0, 7, 2, 2, 1, 2, 23, - 0, 50, 2, 60, 72, 60, 73, 15, 4, 22, 2, 60, 74, 11, 5, 13, 0, 11, 6, 60, - 75, 13, 1, 30, 1, 60, 76, 3, 2, 1, 60, 77, 0, 0, 0, 0, 2, 0, 0, 0, - 67, 0, 0, 0, 2,108, 0, 0, 0, 0, 68, 0, 0, 0, 2, 99, 0, 0, 0, 0, - 7, 2, 0, 0, 0, 2,108, 0, 2, 0, 0, 0, 2, 99, 0, 2, 0, 0, 0, 7, -115,116,114,115,117, 98, 0, 2, 0, 0, 0, 2, 36, 0, 2, 0, 0, 0, 10, 95, - 86,101,114, 98, 97,116,105,109, 0, 2, 0, 0, 0, 5,108,105,110,101, 0, 2, - 0, 0, 0, 5, 99,111,110,100, 0, -}; - -/* code.lo */ -static char B16[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 10, 64, 99,111,100,101, 46, -108,117, 97, 0, 0, 0, 0, 66, 5, 0, 60, 19, 22, 2, 60, 20, 11, 1, 11, 2, - 11, 3, 60, 21, 15, 4, 30, 1, 60, 22, 25, 0, 60, 23, 15, 5, 15, 0, 15, 6, - 2, 0, 2, 60, 26, 15, 0, 11, 7, 11, 8, 26, 60, 63, 15, 0, 11, 9, 11, 10, - 26, 60, 71, 11, 12, 25, 11, 60, 80, 11, 14, 25, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 15, 2, 0, 0, 0, 10, 99,108, 97,115,115, 67,111,100,101, 0, 2, 0, 0, - 0, 5,116,101,120,116, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 6, 95, 98, - 97,115,101, 0, 2, 0, 0, 0, 13, 99,108, 97,115,115, 70,101, 97,116,117,114, -101, 0, 2, 0, 0, 0, 7,115,101,116,116, 97,103, 0, 2, 0, 0, 0, 10,116, -111,108,117, 97, 95,116, 97,103, 0, 2, 0, 0, 0, 9,114,101,103,105,115,116, -101,114, 0, 4, 0, 0, 0, 26, 0, 0, 0, 10, 64, 99,111,100,101, 46,108,117, - 97, 0, 0, 0, 0,239, 13, 1, 60, 27, 15, 1, 2, 1, 0, 60, 28, 15, 1, 2, - 1, 0, 60, 29, 15, 4, 13, 2, 11, 5, 2, 1, 2, 60, 30, 13, 3, 44, 52, 11, - 60, 31, 15, 6, 11, 7, 2, 0, 1, 50, 2, 60, 32, 60, 34, 15, 8, 13, 3, 13, - 0, 18, 10, 2, 0, 2, 60, 35, 15, 11, 13, 3, 2, 0, 1, 60, 36, 15, 12, 11, - 13, 13, 1, 42, 11, 14, 42, 13, 2, 42, 2, 0, 1, 60, 37, 15, 15, 13, 2, 2, - 0, 1, 60, 40, 15, 4, 13, 1, 11, 17, 2, 1, 2, 60, 41, 13, 4, 4, 0, 32, - 52, 11, 60, 42, 15, 6, 11, 7, 2, 0, 1, 50, 2, 60, 43, 60, 44, 15, 19, 13, - 4, 11, 20, 2, 1, 2, 60, 45, 15, 11, 13, 4, 2, 0, 1, 60, 46, 15, 15, 13, - 1, 2, 0, 1, 60, 48, 15, 21, 11, 22, 2, 0, 1, 60, 49, 15, 21, 11, 23, 2, - 0, 1, 60, 50, 22, 1, 11, 2, 7, 0, 30, 0, 60, 51, 15, 21, 15, 25, 13, 5, - 11, 26, 13, 6, 58, 27, 1, 60, 55, 2, 1, 3, 2, 0, 1, 60, 56, 15, 21, 11, - 28, 2, 0, 1, 60, 57, 15, 21, 11, 29, 2, 0, 1, 60, 58, 15, 21, 11, 30, 2, - 0, 1, 60, 59, 0, 0, 0, 0, 7, 0, 0, 0, 26, 0, 0, 0, 5,115,101,108, -102, 0, 0, 0, 0, 27, 0, 0, 0, 2,111, 0, 0, 0, 0, 28, 0, 0, 0, 2, -110, 0, 0, 0, 0, 29, 0, 0, 0, 2,102, 0, 0, 0, 0, 40, 0, 0, 0, 3, -102,112, 0, 0, 0, 0, 44, 0, 0, 0, 2,115, 0, 0, 0, 0, 50, 0, 0, 0, - 2,116, 0, 0, 0, 0, 31, 2, 0, 0, 0, 2,111, 0, 2, 0, 0, 0, 8,116, -109,112,110, 97,109,101, 0, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, 2,102, - 0, 2, 0, 0, 0, 9,111,112,101,110,102,105,108,101, 0, 2, 0, 0, 0, 2, -119, 0, 2, 0, 0, 0, 6,101,114,114,111,114, 0, 2, 0, 0, 0, 61, 10, 32, - 32, 32, 99, 97,110,110,111,116, 32,111,112,101,110, 32,116,101,109,112,111,114, - 97,114,121, 32,102,105,108,101, 32,116,111, 32,112,114,111, 99, 99,101,115,115, - 32,101,109, 98,101,100,100,101,100, 32, 76,117, 97, 32, 99,111,100,101, 0, 2, - 0, 0, 0, 6,119,114,105,116,101, 0, 2, 0, 0, 0, 5,115,101,108,102, 0, - 2, 0, 0, 0, 5,116,101,120,116, 0, 2, 0, 0, 0, 10, 99,108,111,115,101, -102,105,108,101, 0, 2, 0, 0, 0, 8,101,120,101, 99,117,116,101, 0, 2, 0, - 0, 0, 9,108,117, 97, 99, 32, 45,111, 32, 0, 2, 0, 0, 0, 2, 32, 0, 2, - 0, 0, 0, 7,114,101,109,111,118,101, 0, 2, 0, 0, 0, 3,102,112, 0, 2, - 0, 0, 0, 3,114, 98, 0, 2, 0, 0, 0, 2,115, 0, 2, 0, 0, 0, 5,114, -101, 97,100, 0, 2, 0, 0, 0, 3, 46, 42, 0, 2, 0, 0, 0, 7,111,117,116, -112,117,116, 0, 2, 0, 0, 0, 35, 10, 32,123, 32, 47, 42, 32, 98,101,103,105, -110, 32,101,109, 98,101,100,100,101,100, 32,108,117, 97, 32, 99,111,100,101, 32, - 42, 47, 10, 0, 2, 0, 0, 0, 35, 32, 32,115,116, 97,116,105, 99, 32,117,110, -115,105,103,110,101,100, 32, 99,104, 97,114, 32, 66, 91, 93, 32, 61, 32,123, 10, - 32, 32, 32, 0, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 5,103,115,117, 98, - 0, 2, 0, 0, 0, 4, 40, 46, 41, 0, 4, 0, 0, 0, 51, 0, 0, 0, 10, 64, - 99,111,100,101, 46,108,117, 97, 0, 0, 0, 0, 61, 6, 1, 60, 52, 11, 2, 60, - 53, 12, 0, 11, 4, 12, 0, 18, 4, 7, 1, 37, 26, 12, 0, 18, 4, 7, 20, 32, - 52, 11, 12, 0, 11, 4, 7, 0, 26, 11, 5, 23, 1, 60, 54, 15, 6, 11, 7, 15, - 8, 13, 0, 2, 1, 1, 13, 1, 3, 2, 3, 60, 55, 0, 0, 0, 0, 2, 0, 0, - 0, 51, 0, 0, 0, 2, 99, 0, 0, 0, 0, 52, 0, 0, 0, 2,101, 0, 0, 0, - 0, 9, 2, 0, 0, 0, 2, 99, 0, 2, 0, 0, 0, 2,101, 0, 2, 0, 0, 0, - 1, 0, 2, 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 2,110, 0, 2, 0, 0, 0, - 5, 10, 32, 32, 32, 0, 2, 0, 0, 0, 7,102,111,114,109, 97,116, 0, 2, 0, - 0, 0, 7, 37, 51,117, 44, 37,115, 0, 2, 0, 0, 0, 8,115,116,114, 98,121, -116,101, 0, 2, 0, 0, 0, 6, 32, 32,125, 59, 10, 0, 2, 0, 0, 0, 56, 32, - 32,108,117, 97, 95,100,111, 98,117,102,102,101,114, 40, 66, 44,115,105,122,101, -111,102, 40, 66, 41, 44, 34,116,111,108,117, 97, 58, 32,101,109, 98,101,100,100, -101,100, 32, 76,117, 97, 32, 99,111,100,101, 34, 41, 59, 0, 2, 0, 0, 0, 36, - 32,125, 32, 47, 42, 32,101,110,100, 32,111,102, 32,101,109, 98,101,100,100,101, -100, 32,108,117, 97, 32, 99,111,100,101, 32, 42, 47, 10, 10, 0, 2, 0, 0, 0, - 6,112,114,105,110,116, 0, 4, 0, 0, 0, 63, 0, 0, 0, 10, 64, 99,111,100, -101, 46,108,117, 97, 0, 0, 0, 0, 52, 6, 3, 60, 64, 15, 2, 13, 1, 11, 3, - 42, 2, 0, 1, 60, 65, 15, 2, 13, 1, 11, 4, 42, 13, 0, 18, 6, 42, 11, 7, - 42, 2, 0, 1, 60, 66, 15, 2, 13, 1, 11, 8, 42, 13, 2, 42, 2, 0, 1, 60, - 67, 0, 0, 0, 0, 3, 0, 0, 0, 63, 0, 0, 0, 5,115,101,108,102, 0, 0, - 0, 0, 63, 0, 0, 0, 6,105,100,101,110,116, 0, 0, 0, 0, 63, 0, 0, 0, - 6, 99,108,111,115,101, 0, 0, 0, 0, 9, 2, 0, 0, 0, 6,105,100,101,110, -116, 0, 2, 0, 0, 0, 6, 99,108,111,115,101, 0, 2, 0, 0, 0, 6,112,114, -105,110,116, 0, 2, 0, 0, 0, 6, 67,111,100,101,123, 0, 2, 0, 0, 0, 11, - 32,116,101,120,116, 32, 61, 32, 91, 91, 0, 2, 0, 0, 0, 5,115,101,108,102, - 0, 2, 0, 0, 0, 5,116,101,120,116, 0, 2, 0, 0, 0, 4, 93, 93, 44, 0, - 2, 0, 0, 0, 2,125, 0, 2, 0, 0, 0, 6, 95, 67,111,100,101, 0, 4, 0, - 0, 0, 71, 0, 0, 0, 10, 64, 99,111,100,101, 46,108,117, 97, 0, 0, 0, 0, - 40, 4, 1, 60, 72, 13, 0, 11, 1, 15, 2, 26, 60, 73, 15, 3, 13, 0, 15, 4, - 2, 0, 2, 60, 74, 15, 5, 13, 0, 2, 0, 1, 60, 75, 13, 0, 1, 1, 60, 76, - 0, 0, 0, 0, 1, 0, 0, 0, 71, 0, 0, 0, 2,116, 0, 0, 0, 0, 6, 2, - 0, 0, 0, 2,116, 0, 2, 0, 0, 0, 6, 95, 98, 97,115,101, 0, 2, 0, 0, - 0, 10, 99,108, 97,115,115, 67,111,100,101, 0, 2, 0, 0, 0, 7,115,101,116, -116, 97,103, 0, 2, 0, 0, 0, 10,116,111,108,117, 97, 95,116, 97,103, 0, 2, - 0, 0, 0, 7, 97,112,112,101,110,100, 0, 2, 0, 0, 0, 5, 67,111,100,101, - 0, 4, 0, 0, 0, 80, 0, 0, 0, 10, 64, 99,111,100,101, 46,108,117, 97, 0, - 0, 0, 0, 24, 5, 1, 60, 81, 15, 1, 22, 1, 60, 82, 11, 2, 13, 0, 30, 0, - 60, 83, 3, 1, 1, 60, 84, 0, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 2, -108, 0, 0, 0, 0, 3, 2, 0, 0, 0, 2,108, 0, 2, 0, 0, 0, 6, 95, 67, -111,100,101, 0, 2, 0, 0, 0, 5,116,101,120,116, 0, -}; - -/* doit.lo */ -static char B17[]={ - 27, 76,117, 97, 50, 0, 0, 0, 0, 0, 0, 0, 0, 10, 64,100,111,105,116, 46, -108,117, 97, 0, 0, 0, 1, 92, 6, 0, 60, 17, 15, 0, 18, 1, 52, 38, 60, 18, - 15, 4, 15, 0, 18, 1, 2, 2, 1, 60, 19, 13, 0, 44, 52, 14, 60, 20, 15, 5, - 11, 6, 13, 1, 42, 2, 0, 1, 50, 2, 60, 21, 5, 2, 50, 2, 60, 22, 60, 25, - 15, 0, 18, 7, 44, 52, 43, 60, 26, 15, 0, 18, 1, 52, 22, 60, 27, 15, 0, 11, - 7, 15, 8, 15, 0, 18, 1, 11, 9, 11, 10, 2, 1, 3, 26, 50, 11, 60, 29, 15, - 5, 11, 11, 2, 0, 1, 60, 30, 50, 2, 60, 31, 60, 33, 15, 13, 15, 0, 18, 7, - 2, 1, 1, 60, 35, 15, 0, 18, 1, 52, 9, 60, 36, 15, 4, 2, 0, 0, 50, 2, - 60, 37, 60, 39, 15, 0, 18, 12, 52, 4, 60, 41, 1, 1, 60, 43, 15, 0, 18, 14, - 52, 38, 60, 44, 15, 15, 15, 0, 18, 14, 2, 2, 1, 60, 45, 13, 1, 44, 52, 14, - 60, 46, 15, 5, 11, 6, 13, 2, 42, 2, 0, 1, 50, 2, 60, 47, 5, 2, 50, 2, - 60, 48, 60, 50, 15, 0, 18, 16, 52, 11, 60, 51, 13, 0, 20, 17, 2, 0, 1, 50, - 38, 60, 53, 13, 0, 20, 18, 2, 0, 1, 60, 54, 13, 0, 20, 19, 2, 0, 1, 60, - 55, 13, 0, 20, 20, 2, 0, 1, 60, 56, 13, 0, 20, 21, 2, 0, 1, 60, 57, 60, - 59, 15, 0, 18, 14, 52, 9, 60, 60, 15, 15, 2, 0, 0, 50, 2, 60, 61, 60, 64, - 15, 0, 18, 16, 44, 52, 66, 60, 65, 15, 0, 18, 22, 52, 54, 60, 66, 15, 15, 15, - 0, 18, 22, 2, 2, 1, 60, 67, 13, 1, 44, 52, 14, 60, 68, 15, 5, 11, 6, 13, - 2, 42, 2, 0, 1, 50, 2, 60, 69, 60, 70, 13, 0, 20, 23, 2, 0, 1, 60, 71, - 15, 15, 2, 0, 0, 5, 2, 50, 2, 60, 72, 50, 2, 60, 73, 0, 0, 0, 0, 0, - 0, 0, 0, 24, 2, 0, 0, 0, 6,102,108, 97,103,115, 0, 2, 0, 0, 0, 2, -102, 0, 2, 0, 0, 0, 3,115,116, 0, 2, 0, 0, 0, 4,109,115,103, 0, 2, - 0, 0, 0, 9,114,101, 97,100,102,114,111,109, 0, 2, 0, 0, 0, 6,101,114, -114,111,114, 0, 2, 0, 0, 0, 2, 35, 0, 2, 0, 0, 0, 2,110, 0, 2, 0, - 0, 0, 5,103,115,117, 98, 0, 2, 0, 0, 0, 5, 37, 46, 46, 42, 0, 2, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 41, 35,110,111, 32,112, 97, 99,107, 97,103,101, - 32,110, 97,109,101, 32,110,111,114, 32,105,110,112,117,116, 32,102,105,108,101, - 32,112,114,111,118,105,100,101,100, 0, 2, 0, 0, 0, 2,112, 0, 2, 0, 0, - 0, 8, 80, 97, 99,107, 97,103,101, 0, 2, 0, 0, 0, 2,111, 0, 2, 0, 0, - 0, 8,119,114,105,116,101,116,111, 0, 2, 0, 0, 0, 2, 80, 0, 2, 0, 0, - 0, 6,112,114,105,110,116, 0, 2, 0, 0, 0, 9,112,114,101, 97,109, 98,108, -101, 0, 2, 0, 0, 0, 8,115,117,112, 99,111,100,101, 0, 2, 0, 0, 0, 9, -114,101,103,105,115,116,101,114, 0, 2, 0, 0, 0, 11,117,110,114,101,103,105, -115,116,101,114, 0, 2, 0, 0, 0, 2, 72, 0, 2, 0, 0, 0, 7,104,101, 97, -100,101,114, 0, -}; - - lua_dobuffer(B1,sizeof(B1),"basic.lo"); - lua_dobuffer(B2,sizeof(B2),"feature.lo"); - lua_dobuffer(B3,sizeof(B3),"declaration.lo"); - lua_dobuffer(B4,sizeof(B4),"container.lo"); - lua_dobuffer(B5,sizeof(B5),"package.lo"); - lua_dobuffer(B6,sizeof(B6),"module.lo"); - lua_dobuffer(B7,sizeof(B7),"class.lo"); - lua_dobuffer(B8,sizeof(B8),"typedef.lo"); - lua_dobuffer(B9,sizeof(B9),"define.lo"); - lua_dobuffer(B10,sizeof(B10),"enumerate.lo"); - lua_dobuffer(B11,sizeof(B11),"variable.lo"); - lua_dobuffer(B12,sizeof(B12),"array.lo"); - lua_dobuffer(B13,sizeof(B13),"function.lo"); - lua_dobuffer(B14,sizeof(B14),"operator.lo"); - lua_dobuffer(B15,sizeof(B15),"verbatim.lo"); - lua_dobuffer(B16,sizeof(B16),"code.lo"); - lua_dobuffer(B17,sizeof(B17),"doit.lo"); -} diff --git a/src/lua/tolualua.pkg b/src/lua/tolualua.pkg deleted file mode 100644 index 1694c2c1..00000000 --- a/src/lua/tolualua.pkg +++ /dev/null @@ -1,21 +0,0 @@ -$[ -$<basic.lua> -$<feature.lua> -$<verbatim.lua> -$<code.lua> -$<typedef.lua> -$<container.lua> -$<package.lua> -$<module.lua> -$<define.lua> -$<enumerate.lua> -$<declaration.lua> -$<variable.lua> -$<array.lua> -$<function.lua> -$<operator.lua> -$<class.lua> -$<clean.lua> -$<doit.lua> -$] - diff --git a/src/lua/typedef.lua b/src/lua/typedef.lua deleted file mode 100644 index 1633f3e6..00000000 --- a/src/lua/typedef.lua +++ /dev/null @@ -1,59 +0,0 @@ --- tolua: typedef class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: typedef.lua,v 1.2 2001/11/26 23:00:27 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - - --- Typedef class --- Represents a type synonym. --- The 'de facto' type replaces the typedef before the --- remaining code is parsed. --- The following fields are stored: --- utype = typedef name --- type = 'de facto' type --- mod = modifiers to the 'de facto' type -classTypedef = { - utype = '', - mod = '', - type = '' -} - --- Print method -function classTypedef:print (ident,close) - print(ident.."Typedef{") - print(ident.." utype = '"..self.utype.."',") - print(ident.." mod = '"..self.mod.."',") - print(ident.." type = '"..self.type.."',") - print(ident.."}"..close) -end - --- Internal constructor -function _Typedef (t) - t._base = classTypedef - settag(t,tolua_tag) - appendtypedef(t) - return t -end - --- Constructor --- Expects one string representing the type definition. -function Typedef (s) - if strfind(s,'[%*&]') then - tolua_error("#invalid typedef: pointers (and references) are not supported") - end - local t = split(gsub(s,"%s%s*"," ")," ") - return _Typedef { - utype = t[t.n], - type = t[t.n-1], - mod = concat(t,1,t.n-2) - } -end - - diff --git a/src/lua/variable.lua b/src/lua/variable.lua deleted file mode 100644 index 310808b8..00000000 --- a/src/lua/variable.lua +++ /dev/null @@ -1,192 +0,0 @@ --- tolua: variable class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: variable.lua,v 1.4 2004/06/04 13:42:10 neil Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - --- Variable class --- Represents a extern variable or a public member of a class. --- Stores all fields present in a declaration. -classVariable = { - _base = classDeclaration, -} - -settag(classVariable,tolua_tag) - --- Print method -function classVariable:print (ident,close) - print(ident.."Variable{") - print(ident.." mod = '"..self.mod.."',") - print(ident.." type = '"..self.type.."',") - print(ident.." ptr = '"..self.ptr.."',") - print(ident.." name = '"..self.name.."',") - print(ident.." def = '"..self.def.."',") - print(ident.." ret = '"..self.ret.."',") - print(ident.."}"..close) -end - --- get variable value -function classVariable:getvalue (class,static) - if class and static then - return class..'::'..self.name - elseif class then - return 'self->'..self.name - else - return self.name - end -end - --- Write binding functions -function classVariable:supcode () - local class = self:inclass() - - -- get function ------------------------------------------------ - if class then - output("/* get function:",self.name," of class ",class," */") - else - output("/* get function:",self.name," */") - end - self.cgetname = self:cfuncname("toluaI_get") - output("static int",self.cgetname,"(lua_State* tolua_S)") - output("{") - - -- declare self, if the case - local _,_,static = strfind(self.mod,'^%s*(static)') - if class and static==nil then - output(' ',class,'*','self = ') - output('(',class,'*) ') - output('tolua_getusertype(tolua_S,1,0);') - elseif static then - _,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)') - end - - - -- check self value - if class and static==nil then - output(' if (!self) TOLUA_ERR_SELF;'); - end - - -- return value - local t,ct = isbasic(self.type) - if t then - output(' tolua_push'..t..'(tolua_S,(',ct,')'..self:getvalue(class,static)..');') - else - if self.ptr == '&' or self.ptr == '' then - output(' tolua_pushusertype(tolua_S,(void*)&'..self:getvalue(class,static)..',',self.tag,');') - else - output(' tolua_pushusertype(tolua_S,(void*)'..self:getvalue(class,static)..',',self.tag,');') - end - end - output(' return 1;') - output('}') - output('\n') - - -- set function ------------------------------------------------ - if not strfind(self.mod,'const') then - if class then - output("/* set function:",self.name," of class ",class," */") - else - output("/* set function:",self.name," */") - end - self.csetname = self:cfuncname("toluaI_set") - output("static int",self.csetname,"(lua_State* tolua_S)") - output("{") - - -- declare self, if the case - local narg=1 - if class and static==nil then - output(' ',class,'*','self = ') - output('(',class,'*) ') - output('tolua_getusertype(tolua_S,1,0);') - -- check self value - output(' if (!self) TOLUA_ERR_SELF;'); - narg = narg+1 - elseif static then - _,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)') - narg = narg+1 - end - - -- check type - output(' if (!'..self:outchecktype(narg)..')') - output(' TOLUA_ERR_ASSIGN;') - - -- assign value - local ptr = '' - if self.ptr~='' then ptr = '*' end - output(' ') - if class and static then - output(class..'::'..self.name) - elseif class then - output('self->'..self.name) - else - output(self.name) - end - local t = isbasic(self.type) - output(' = ') - if not t and ptr=='' then output('*') end - output('((',self.mod,self.type) - if not t then - output('*') - end - output(') ') - local def = 0 - if self.def ~= '' then def = self.def end - if t then - output('tolua_get'..t,'(tolua_S,',narg,',',def,'));') - else - output('tolua_getusertype(tolua_S,',narg,',',def,'));') - end - output(' return 0;') - output('}') - output('\n') - end - -end - -function classVariable:register () - local parent = self:inclass() or self:inmodule() - if parent then - if self.csetname then - output(' tolua_tablevar(tolua_S,"'..parent..'","'..self.lname..'",'..self.cgetname..','..self.csetname..');') - else - output(' tolua_tablevar(tolua_S,"'..parent..'","'..self.lname..'",'..self.cgetname..',NULL);') - end - else - if self.csetname then - output(' tolua_globalvar(tolua_S,"'..self.lname..'",'..self.cgetname..','..self.csetname..');') - else - output(' tolua_globalvar(tolua_S,"'..self.lname..'",'..self.cgetname..',NULL);') - end - end -end - -function classVariable:unregister () - if self:inclass()==nil and self:inmodule()==nil then - output(' lua_getglobals(tolua_S);') - output(' lua_pushstring(tolua_S,"',self.lname,'"); lua_pushnil(tolua_S); lua_rawset(tolua_S,-3);') - output(' lua_pop(tolua_S,1);') - end -end - - --- Internal constructor -function _Variable (t) - t._base = classVariable - settag(t,tolua_tag) - append(t) - return t -end - --- Constructor --- Expects a string representing the variable declaration. -function Variable (s) - return _Variable (Declaration(s,'var')) -end - - diff --git a/src/lua/verbatim.lua b/src/lua/verbatim.lua deleted file mode 100644 index 9dae0dc3..00000000 --- a/src/lua/verbatim.lua +++ /dev/null @@ -1,77 +0,0 @@ --- tolua: verbatim class --- Written by Waldemar Celes --- TeCGraf/PUC-Rio --- Jul 1998 --- $Id: verbatim.lua,v 1.2 2001/11/26 23:00:27 darkgod Exp $ - --- This code is free software; you can redistribute it and/or modify it. --- The software provided hereunder is on an "as is" basis, and --- the author has no obligation to provide maintenance, support, updates, --- enhancements, or modifications. - - - --- Verbatim class --- Represents a line translated directed to the binding file. --- The following filds are stored: --- line = line text -classVerbatim = { - line = '', - _base = classFeature, -} -settag(classVerbatim,tolua_tag) - --- preamble verbatim -function classVerbatim:preamble () - if not self.cond then - write(self.line) - end -end - --- support code -function classVerbatim:supcode () - if self.cond then - write(self.line) - write('\n') - end -end - --- register code -function classVerbatim:register () - if self.cond then - write(self.line) - end -end - - --- Print method -function classVerbatim:print (ident,close) - print(ident.."Verbatim{") - print(ident.." line = '"..self.line.."',") - print(ident.."}"..close) -end - - --- Internal constructor -function _Verbatim (t) - t._base = classVerbatim - settag(t,tolua_tag) - append(t) - return t -end - --- Constructor --- Expects a string representing the text line -function Verbatim (l) - local c - if strsub(l,1,1) == '$' then - c = 1 - l = strsub(l,2) - end - return _Verbatim { - line = l, - cond = c - } -end - - diff --git a/src/lua_bind.c b/src/lua_bind.c index 3d9038d1..076404cf 100644 --- a/src/lua_bind.c +++ b/src/lua_bind.c @@ -13,10 +13,6 @@ #include "angband.h" #include <assert.h> -#include "lua.h" -#include "tolua.h" -extern lua_State *L; - s16b can_spell_random(s16b spell_idx) { return spell_at(spell_idx)->random_type; @@ -397,7 +397,8 @@ int main(int argc, char *argv[]) char *s; int j; - init_lua(); + init_lua_init(); + for (j = i + 1; j < argc; j++) { s = argv[j]; diff --git a/src/modules.c b/src/modules.c index 9376cc3d..60128f79 100644 --- a/src/modules.c +++ b/src/modules.c @@ -202,9 +202,6 @@ bool_ select_module() { s32b k, sel, max; - /* Init some lua */ - init_lua(); - /* How many modules? */ max = MAX_MODULES; diff --git a/src/monster.pkg b/src/monster.pkg deleted file mode 100644 index bf0f4661..00000000 --- a/src/monster.pkg +++ /dev/null @@ -1,2301 +0,0 @@ -/* File: monster.pkg */ - -/* - * Purpose: Lua interface defitions for monsters. - * To be processed by tolua to generate C source code. - */ - -$#include "angband.h" - -/** @typedef cptr - * @note String - */ -typedef char* cptr; -/** @typedef errr - * @note Number - */ -typedef int errr; -/** @typedef bool - * @note Boolean - */ -typedef unsigned char bool; -/** @typedef byte - * @note Number - */ -typedef unsigned char byte; -/** @typedef s16b - * @note Number - */ -typedef signed short s16b; -/** @typedef u16b - * @note Number - */ -typedef unsigned short u16b; -/** @typedef s32b - * @note Number - */ -typedef signed int s32b; -/** @typedef u32b - * @note Number - */ -typedef unsigned int u32b; - -/* To make easy object creations */ -$static monster_type lua_monster_forge; -/** @var monster_forge; - * @brief monster_type - */ -static monster_type lua_monster_forge @ monster_forge; - -/** @name Monster status - * @note Player POV - * @{ */ -/** @def MSTATUS_ENEMY */ -#define MSTATUS_ENEMY -2 - -/** @def MSTATUS_NEUTRAL_M */ -#define MSTATUS_NEUTRAL_M -1 - -/** @def MSTATUS_NEUTRAL */ -#define MSTATUS_NEUTRAL 0 - -/** @def MSTATUS_NEUTRAL_P */ -#define MSTATUS_NEUTRAL_P 1 - -/** @def MSTATUS_FRIEND */ -#define MSTATUS_FRIEND 2 - -/** @def MSTATUS_PET */ -#define MSTATUS_PET 3 - -/** @def MSTATUS_COMPANION */ -#define MSTATUS_COMPANION 4 -/** @} */ - -/** @name Race flags #1 - * @{ */ -/** @def RF1_UNIQUE - * @note Unique Monster - */ -#define RF1_UNIQUE 0x00000001 -/** @def RF1_QUESTOR - * @note Quest Monster - */ -#define RF1_QUESTOR 0x00000002 -/** @def RF1_MALE - * @note Male gender - */ -#define RF1_MALE 0x00000004 -/** @def RF1_FEMALE - * @note Female gender - */ -#define RF1_FEMALE 0x00000008 -/** @def RF1_CHAR_CLEAR - * @note Absorbs symbol - */ -#define RF1_CHAR_CLEAR 0x00000010 -/** @def RF1_CHAR_MULTI - * @note Changes symbol - */ -#define RF1_CHAR_MULTI 0x00000020 -/** @def RF1_ATTR_CLEAR - * @note Absorbs color - */ -#define RF1_ATTR_CLEAR 0x00000040 -/** @def RF1_ATTR_MULTI - * @note Changes color - */ -#define RF1_ATTR_MULTI 0x00000080 -/** @def RF1_FORCE_DEPTH - * @note Start at "correct" depth - */ -#define RF1_FORCE_DEPTH 0x00000100 -/** @def RF1_FORCE_MAXHP - * @note Start with max hitpoints - */ -#define RF1_FORCE_MAXHP 0x00000200 -/** @def RF1_FORCE_SLEEP - * @note Start out sleeping - */ -#define RF1_FORCE_SLEEP 0x00000400 -/** @def RF1_FORCE_EXTRA - * @note Start out something - */ -#define RF1_FORCE_EXTRA 0x00000800 -/** @def RF1_FRIEND - * @note Arrive with a friend - */ -#define RF1_FRIEND 0x00001000 -/** @def RF1_FRIENDS - * @note Arrive with some friends - */ -#define RF1_FRIENDS 0x00002000 -/** @def RF1_ESCORT - * @note Arrive with an escort - */ -#define RF1_ESCORT 0x00004000 -/** @def RF1_ESCORTS - * @note Arrive with some escorts - */ -#define RF1_ESCORTS 0x00008000 -/** @def RF1_NEVER_BLOW - * @note Never make physical blow - */ -#define RF1_NEVER_BLOW 0x00010000 -/** @def RF1_NEVER_MOVE - * @note Never make physical move - */ -#define RF1_NEVER_MOVE 0x00020000 -/** @def RF1_RAND_25 - * @note Moves randomly (25%) - */ -#define RF1_RAND_25 0x00040000 -/** @def RF1_RAND_50 - * @note Moves randomly (50%) - */ -#define RF1_RAND_50 0x00080000 -/** @def RF1_ONLY_GOLD - * @note Drop only gold - */ -#define RF1_ONLY_GOLD 0x00100000 -/** @def RF1_ONLY_ITEM - * @note Drop only items - */ -#define RF1_ONLY_ITEM 0x00200000 -/** @def RF1_DROP_60 - * @note Drop an item/gold (60%) - */ -#define RF1_DROP_60 0x00400000 -/** @def RF1_DROP_90 - * @note Drop an item/gold (90%) - */ -#define RF1_DROP_90 0x00800000 -/** @def RF1_DROP_1D2 - * @note Drop 1d2 items/gold - */ -#define RF1_DROP_1D2 0x01000000 -/** @def RF1_DROP_2D2 - * @note Drop 2d2 items/gold - */ -#define RF1_DROP_2D2 0x02000000 -/** @def RF1_DROP_3D2 - * @note Drop 3d2 items/gold - */ -#define RF1_DROP_3D2 0x04000000 -/** @def RF1_DROP_4D2 - * @note Drop 4d2 items/gold - */ -#define RF1_DROP_4D2 0x08000000 -/** @def RF1_DROP_GOOD - * @note Drop good items - */ -#define RF1_DROP_GOOD 0x10000000 -/** @def RF1_DROP_GREAT - * @note Drop great items - */ -#define RF1_DROP_GREAT 0x20000000 -/** @def RF1_DROP_USEFUL - * @note Drop "useful" items - */ -#define RF1_DROP_USEFUL 0x40000000 -/** @def RF1_DROP_CHOSEN - * @note Drop "chosen" items - */ -#define RF1_DROP_CHOSEN 0x80000000 -/** @} */ - -/** @name Race flags #2 - * @note New monster race bit flags - * @{ */ -/** @def RF2_STUPID - * @note Monster is stupid - */ -#define RF2_STUPID 0x00000001 -/** @def RF2_SMART - * @note Monster is smart - */ -#define RF2_SMART 0x00000002 -/** @def RF2_CAN_SPEAK - * @note TY: can speak - */ -#define RF2_CAN_SPEAK 0x00000004 -/** @def RF2_REFLECTING - * @note Reflects bolts - */ -#define RF2_REFLECTING 0x00000008 -/** @def RF2_INVISIBLE - * @note Monster avoids vision - */ -#define RF2_INVISIBLE 0x00000010 -/** @def RF2_COLD_BLOOD - * @note Monster avoids infra - */ -#define RF2_COLD_BLOOD 0x00000020 -/** @def RF2_EMPTY_MIND - * @note Monster avoids telepathy - */ -#define RF2_EMPTY_MIND 0x00000040 -/** @def RF2_WEIRD_MIND - * @note Monster avoids telepathy? - */ -#define RF2_WEIRD_MIND 0x00000080 -/** @def RF2_DEATH_ORB - * @note Death Orb - */ -#define RF2_DEATH_ORB 0x00000100 -/** @def RF2_REGENERATE - * @note Monster regenerates - */ -#define RF2_REGENERATE 0x00000200 -/** @def RF2_SHAPECHANGER - * @note TY: shapechanger - */ -#define RF2_SHAPECHANGER 0x00000400 -/** @def RF2_ATTR_ANY - * @note TY: Attr_any - */ -#define RF2_ATTR_ANY 0x00000800 -/** @def RF2_POWERFUL - * @note Monster has strong breath - */ -#define RF2_POWERFUL 0x00001000 -/** @def RF2_ELDRITCH_HORROR - * @note Sanity-blasting horror - */ -#define RF2_ELDRITCH_HORROR 0x00002000 -/** @def RF2_AURA_FIRE - * @note Burns in melee - */ -#define RF2_AURA_FIRE 0x00004000 -/** @def RF2_AURA_ELEC - * @note Shocks in melee - */ -#define RF2_AURA_ELEC 0x00008000 -/** @def RF2_OPEN_DOOR - * @note Monster can open doors - */ -#define RF2_OPEN_DOOR 0x00010000 -/** @def RF2_BASH_DOOR - * @note Monster can bash doors - */ -#define RF2_BASH_DOOR 0x00020000 -/** @def RF2_PASS_WALL - * @note Monster can pass walls - */ -#define RF2_PASS_WALL 0x00040000 -/** @def RF2_KILL_WALL - * @note Monster can destroy walls - */ -#define RF2_KILL_WALL 0x00080000 -/** @def RF2_MOVE_BODY - * @note Monster can move monsters - */ -#define RF2_MOVE_BODY 0x00100000 -/** @def RF2_KILL_BODY - * @note Monster can kill monsters - */ -#define RF2_KILL_BODY 0x00200000 -/** @def RF2_TAKE_ITEM - * @note Monster can pick up items - */ -#define RF2_TAKE_ITEM 0x00400000 -/** @def RF2_KILL_ITEM - * @note Monster can crush items - */ -#define RF2_KILL_ITEM 0x00800000 -/** @def RF2_BRAIN_1 */ -#define RF2_BRAIN_1 0x01000000 - -/** @def RF2_BRAIN_2 */ -#define RF2_BRAIN_2 0x02000000 - -/** @def RF2_BRAIN_3 */ -#define RF2_BRAIN_3 0x04000000 - -/** @def RF2_BRAIN_4 */ -#define RF2_BRAIN_4 0x08000000 - -/** @def RF2_BRAIN_5 */ -#define RF2_BRAIN_5 0x10000000 - -/** @def RF2_BRAIN_6 */ -#define RF2_BRAIN_6 0x20000000 - -/** @def RF2_BRAIN_7 */ -#define RF2_BRAIN_7 0x40000000 - -/** @def RF2_BRAIN_8 */ -#define RF2_BRAIN_8 0x80000000 -/** @} */ - -/** @name Race flags #3 - * @note New monster race bit flags - * @{ */ -/** @def RF3_ORC - * @note Orc - */ -#define RF3_ORC 0x00000001 -/** @def RF3_TROLL - * @note Troll - */ -#define RF3_TROLL 0x00000002 -/** @def RF3_GIANT - * @note Giant - */ -#define RF3_GIANT 0x00000004 -/** @def RF3_DRAGON - * @note Dragon - */ -#define RF3_DRAGON 0x00000008 -/** @def RF3_DEMON - * @note Demon - */ -#define RF3_DEMON 0x00000010 -/** @def RF3_UNDEAD - * @note Undead - */ -#define RF3_UNDEAD 0x00000020 -/** @def RF3_EVIL - * @note Evil - */ -#define RF3_EVIL 0x00000040 -/** @def RF3_ANIMAL - * @note Animal - */ -#define RF3_ANIMAL 0x00000080 -/** @def RF3_THUNDERLORD - * @note DG: Thunderlord - */ -#define RF3_THUNDERLORD 0x00000100 -/** @def RF3_GOOD - * @note Good - */ -#define RF3_GOOD 0x00000200 -/** @def RF3_AURA_COLD - * @note Freezes in melee - */ -#define RF3_AURA_COLD 0x00000400 -/** @def RF3_NONLIVING - * @note TY: Non-Living (?) - */ -#define RF3_NONLIVING 0x00000800 -/** @def RF3_HURT_LITE - * @note Hurt by lite - */ -#define RF3_HURT_LITE 0x00001000 -/** @def RF3_HURT_ROCK - * @note Hurt by rock remover - */ -#define RF3_HURT_ROCK 0x00002000 -/** @def RF3_SUSCEP_FIRE - * @note Hurt badly by fire - */ -#define RF3_SUSCEP_FIRE 0x00004000 -/** @def RF3_SUSCEP_COLD - * @note Hurt badly by cold - */ -#define RF3_SUSCEP_COLD 0x00008000 -/** @def RF3_IM_ACID - * @note Resist acid a lot - */ -#define RF3_IM_ACID 0x00010000 -/** @def RF3_IM_ELEC - * @note Resist elec a lot - */ -#define RF3_IM_ELEC 0x00020000 -/** @def RF3_IM_FIRE - * @note Resist fire a lot - */ -#define RF3_IM_FIRE 0x00040000 -/** @def RF3_IM_COLD - * @note Resist cold a lot - */ -#define RF3_IM_COLD 0x00080000 -/** @def RF3_IM_POIS - * @note Resist poison a lot - */ -#define RF3_IM_POIS 0x00100000 -/** @def RF3_RES_TELE - * @note Resist teleportation - */ -#define RF3_RES_TELE 0x00200000 -/** @def RF3_RES_NETH - * @note Resist nether a lot - */ -#define RF3_RES_NETH 0x00400000 -/** @def RF3_RES_WATE - * @note Resist water - */ -#define RF3_RES_WATE 0x00800000 -/** @def RF3_RES_PLAS - * @note Resist plasma - */ -#define RF3_RES_PLAS 0x01000000 -/** @def RF3_RES_NEXU - * @note Resist nexus - */ -#define RF3_RES_NEXU 0x02000000 -/** @def RF3_RES_DISE - * @note Resist disenchantment - */ -#define RF3_RES_DISE 0x04000000 -/** @def RF3_UNIQUE_4 - * @note Is a "Nazgul" unique - */ -#define RF3_UNIQUE_4 0x08000000 -/** @def RF3_NO_FEAR - * @note Cannot be scared - */ -#define RF3_NO_FEAR 0x10000000 -/** @def RF3_NO_STUN - * @note Cannot be stunned - */ -#define RF3_NO_STUN 0x20000000 -/** @def RF3_NO_CONF - * @note Cannot be confused - */ -#define RF3_NO_CONF 0x40000000 -/** @def RF3_NO_SLEEP - * @note Cannot be slept - */ -#define RF3_NO_SLEEP 0x80000000 -/** @} */ - -/** @name Race flags #4 - * @note New monster race bit flags - * @{ */ -/** @def RF4_SHRIEK - * @note Shriek for help - */ -#define RF4_SHRIEK 0x00000001 -/** @def RF4_MULTIPLY - * @note Monster reproduces - */ -#define RF4_MULTIPLY 0x00000002 -/** @def RF4_S_ANIMAL - * @note Summon animals - */ -#define RF4_S_ANIMAL 0x00000004 -/** @def RF4_ROCKET - * @note TY: Rocket - */ -#define RF4_ROCKET 0x00000008 -/** @def RF4_ARROW_1 - * @note Fire an arrow (light) - */ -#define RF4_ARROW_1 0x00000010 -/** @def RF4_ARROW_2 - * @note Fire an arrow (heavy) - */ -#define RF4_ARROW_2 0x00000020 -/** @def RF4_ARROW_3 - * @note Fire missiles (light) - */ -#define RF4_ARROW_3 0x00000040 -/** @def RF4_ARROW_4 - * @note Fire missiles (heavy) - */ -#define RF4_ARROW_4 0x00000080 -/** @def RF4_BR_ACID - * @note Breathe Acid - */ -#define RF4_BR_ACID 0x00000100 -/** @def RF4_BR_ELEC - * @note Breathe Elec - */ -#define RF4_BR_ELEC 0x00000200 -/** @def RF4_BR_FIRE - * @note Breathe Fire - */ -#define RF4_BR_FIRE 0x00000400 -/** @def RF4_BR_COLD - * @note Breathe Cold - */ -#define RF4_BR_COLD 0x00000800 -/** @def RF4_BR_POIS - * @note Breathe Poison - */ -#define RF4_BR_POIS 0x00001000 -/** @def RF4_BR_NETH - * @note Breathe Nether - */ -#define RF4_BR_NETH 0x00002000 -/** @def RF4_BR_LITE - * @note Breathe Lite - */ -#define RF4_BR_LITE 0x00004000 -/** @def RF4_BR_DARK - * @note Breathe Dark - */ -#define RF4_BR_DARK 0x00008000 -/** @def RF4_BR_CONF - * @note Breathe Confusion - */ -#define RF4_BR_CONF 0x00010000 -/** @def RF4_BR_SOUN - * @note Breathe Sound - */ -#define RF4_BR_SOUN 0x00020000 -/** @def RF4_BR_CHAO - * @note Breathe Chaos - */ -#define RF4_BR_CHAO 0x00040000 -/** @def RF4_BR_DISE - * @note Breathe Disenchant - */ -#define RF4_BR_DISE 0x00080000 -/** @def RF4_BR_NEXU - * @note Breathe Nexus - */ -#define RF4_BR_NEXU 0x00100000 -/** @def RF4_BR_TIME - * @note Breathe Time - */ -#define RF4_BR_TIME 0x00200000 -/** @def RF4_BR_INER - * @note Breathe Inertia - */ -#define RF4_BR_INER 0x00400000 -/** @def RF4_BR_GRAV - * @note Breathe Gravity - */ -#define RF4_BR_GRAV 0x00800000 -/** @def RF4_BR_SHAR - * @note Breathe Shards - */ -#define RF4_BR_SHAR 0x01000000 -/** @def RF4_BR_PLAS - * @note Breathe Plasma - */ -#define RF4_BR_PLAS 0x02000000 -/** @def RF4_BR_WALL - * @note Breathe Force - */ -#define RF4_BR_WALL 0x04000000 -/** @def RF4_BR_MANA - * @note Breathe Mana - */ -#define RF4_BR_MANA 0x08000000 -/** @def RF4_BA_NUKE - * @note TY: Nuke Ball - */ -#define RF4_BA_NUKE 0x10000000 -/** @def RF4_BR_NUKE - * @note TY: Toxic Breath - */ -#define RF4_BR_NUKE 0x20000000 -/** @def RF4_BA_CHAO - * @note Chaos Ball - */ -#define RF4_BA_CHAO 0x40000000 -/** @def RF4_BR_DISI - * @note Breathe Disintegration - */ -#define RF4_BR_DISI 0x80000000 -/** @} */ - -/** @name Race flags #5 - * @note New monster race bit flags - * @{ */ -/** @def RF5_BA_ACID - * @note Acid Ball - */ -#define RF5_BA_ACID 0x00000001 -/** @def RF5_BA_ELEC - * @note Elec Ball - */ -#define RF5_BA_ELEC 0x00000002 -/** @def RF5_BA_FIRE - * @note Fire Ball - */ -#define RF5_BA_FIRE 0x00000004 -/** @def RF5_BA_COLD - * @note Cold Ball - */ -#define RF5_BA_COLD 0x00000008 -/** @def RF5_BA_POIS - * @note Poison Ball - */ -#define RF5_BA_POIS 0x00000010 -/** @def RF5_BA_NETH - * @note Nether Ball - */ -#define RF5_BA_NETH 0x00000020 -/** @def RF5_BA_WATE - * @note Water Ball - */ -#define RF5_BA_WATE 0x00000040 -/** @def RF5_BA_MANA - * @note Mana Storm - */ -#define RF5_BA_MANA 0x00000080 -/** @def RF5_BA_DARK - * @note Darkness Storm - */ -#define RF5_BA_DARK 0x00000100 -/** @def RF5_DRAIN_MANA - * @note Drain Mana - */ -#define RF5_DRAIN_MANA 0x00000200 -/** @def RF5_MIND_BLAST - * @note Blast Mind - */ -#define RF5_MIND_BLAST 0x00000400 -/** @def RF5_BRAIN_SMASH - * @note Smash Brain - */ -#define RF5_BRAIN_SMASH 0x00000800 -/** @def RF5_CAUSE_1 - * @note Cause Light Wound - */ -#define RF5_CAUSE_1 0x00001000 -/** @def RF5_CAUSE_2 - * @note Cause Serious Wound - */ -#define RF5_CAUSE_2 0x00002000 -/** @def RF5_CAUSE_3 - * @note Cause Critical Wound - */ -#define RF5_CAUSE_3 0x00004000 -/** @def RF5_CAUSE_4 - * @note Cause Mortal Wound - */ -#define RF5_CAUSE_4 0x00008000 -/** @def RF5_BO_ACID - * @note Acid Bolt - */ -#define RF5_BO_ACID 0x00010000 -/** @def RF5_BO_ELEC - * @note Elec Bolt (unused) - */ -#define RF5_BO_ELEC 0x00020000 -/** @def RF5_BO_FIRE - * @note Fire Bolt - */ -#define RF5_BO_FIRE 0x00040000 -/** @def RF5_BO_COLD - * @note Cold Bolt - */ -#define RF5_BO_COLD 0x00080000 -/** @def RF5_BO_POIS - * @note Poison Bolt (unused) - */ -#define RF5_BO_POIS 0x00100000 -/** @def RF5_BO_NETH - * @note Nether Bolt - */ -#define RF5_BO_NETH 0x00200000 -/** @def RF5_BO_WATE - * @note Water Bolt - */ -#define RF5_BO_WATE 0x00400000 -/** @def RF5_BO_MANA - * @note Mana Bolt - */ -#define RF5_BO_MANA 0x00800000 -/** @def RF5_BO_PLAS - * @note Plasma Bolt - */ -#define RF5_BO_PLAS 0x01000000 -/** @def RF5_BO_ICEE - * @note Ice Bolt - */ -#define RF5_BO_ICEE 0x02000000 -/** @def RF5_MISSILE - * @note Magic Missile - */ -#define RF5_MISSILE 0x04000000 -/** @def RF5_SCARE - * @note Frighten Player - */ -#define RF5_SCARE 0x08000000 -/** @def RF5_BLIND - * @note Blind Player - */ -#define RF5_BLIND 0x10000000 -/** @def RF5_CONF - * @note Confuse Player - */ -#define RF5_CONF 0x20000000 -/** @def RF5_SLOW - * @note Slow Player - */ -#define RF5_SLOW 0x40000000 -/** @def RF5_HOLD - * @note Paralyze Player - */ -#define RF5_HOLD 0x80000000 -/** @} */ - -/** @name Race flags #6 - * @note New monster race bit flags - * @{ */ -/** @def RF6_HASTE - * @note Speed self - */ -#define RF6_HASTE 0x00000001 -/** @def RF6_HAND_DOOM - * @note Hand of Doom - */ -#define RF6_HAND_DOOM 0x00000002 -/** @def RF6_HEAL - * @note Heal self - */ -#define RF6_HEAL 0x00000004 -/** @def RF6_S_ANIMALS - * @note Summon animals - */ -#define RF6_S_ANIMALS 0x00000008 -/** @def RF6_BLINK - * @note Teleport Short - */ -#define RF6_BLINK 0x00000010 -/** @def RF6_TPORT - * @note Teleport Long - */ -#define RF6_TPORT 0x00000020 -/** @def RF6_TELE_TO - * @note Move player to monster - */ -#define RF6_TELE_TO 0x00000040 -/** @def RF6_TELE_AWAY - * @note Move player far away - */ -#define RF6_TELE_AWAY 0x00000080 -/** @def RF6_TELE_LEVEL - * @note Move player vertically - */ -#define RF6_TELE_LEVEL 0x00000100 -/** @def RF6_DARKNESS - * @note Create Darkness - */ -#define RF6_DARKNESS 0x00000200 -/** @def RF6_TRAPS - * @note Create Traps - */ -#define RF6_TRAPS 0x00000400 -/** @def RF6_FORGET - * @note Cause amnesia - */ -#define RF6_FORGET 0x00000800 -/** @def RF6_RAISE_DEAD - * @note Raise Dead - */ -#define RF6_RAISE_DEAD 0x00001000 -/** @def RF6_S_BUG - * @note Summon Software bug - */ -#define RF6_S_BUG 0x00002000 -/** @def RF6_S_RNG - * @note Summon RNG - */ -#define RF6_S_RNG 0x00004000 -/** @def RF6_S_THUNDERLORD - * @note Summon Thunderlords - */ -#define RF6_S_THUNDERLORD 0x00008000 -/** @def RF6_S_KIN - * @note Summon "kin" - */ -#define RF6_S_KIN 0x00010000 -/** @def RF6_S_HI_DEMON - * @note Summon greater demons! - */ -#define RF6_S_HI_DEMON 0x00020000 -/** @def RF6_S_MONSTER - * @note Summon Monster - */ -#define RF6_S_MONSTER 0x00040000 -/** @def RF6_S_MONSTERS - * @note Summon Monsters - */ -#define RF6_S_MONSTERS 0x00080000 -/** @def RF6_S_ANT - * @note Summon Ants - */ -#define RF6_S_ANT 0x00100000 -/** @def RF6_S_SPIDER - * @note Summon Spiders - */ -#define RF6_S_SPIDER 0x00200000 -/** @def RF6_S_HOUND - * @note Summon Hounds - */ -#define RF6_S_HOUND 0x00400000 -/** @def RF6_S_HYDRA - * @note Summon Hydras - */ -#define RF6_S_HYDRA 0x00800000 -/** @def RF6_S_ANGEL - * @note Summon Angel - */ -#define RF6_S_ANGEL 0x01000000 -/** @def RF6_S_DEMON - * @note Summon Demon - */ -#define RF6_S_DEMON 0x02000000 -/** @def RF6_S_UNDEAD - * @note Summon Undead - */ -#define RF6_S_UNDEAD 0x04000000 -/** @def RF6_S_DRAGON - * @note Summon Dragon - */ -#define RF6_S_DRAGON 0x08000000 -/** @def RF6_S_HI_UNDEAD - * @note Summon Greater Undead - */ -#define RF6_S_HI_UNDEAD 0x10000000 -/** @def RF6_S_HI_DRAGON - * @note Summon Ancient Dragon - */ -#define RF6_S_HI_DRAGON 0x20000000 -/** @def RF6_S_WRAITH - * @note Summon Unique Wraith - */ -#define RF6_S_WRAITH 0x40000000 -/** @def RF6_S_UNIQUE - * @note Summon Unique Monster - */ -#define RF6_S_UNIQUE 0x80000000 -/** @} */ - -/** @name Race flags #7 - * @note New monster race bit flags - * @{ */ -/** @def RF7_AQUATIC - * @note Aquatic monster - */ -#define RF7_AQUATIC 0x00000001 -/** @def RF7_CAN_SWIM - * @note Monster can swim - */ -#define RF7_CAN_SWIM 0x00000002 -/** @def RF7_CAN_FLY - * @note Monster can fly - */ -#define RF7_CAN_FLY 0x00000004 -/** @def RF7_FRIENDLY - * @note Monster is friendly - */ -#define RF7_FRIENDLY 0x00000008 -/** @def RF7_PET - * @note Monster is a pet - */ -#define RF7_PET 0x00000010 -/** @def RF7_MORTAL - * @note Monster is a mortal being - */ -#define RF7_MORTAL 0x00000020 -/** @def RF7_SPIDER - * @note Monster is a spider (can pass webs) - */ -#define RF7_SPIDER 0x00000040 -/** @def RF7_NAZGUL - * @note Monster is a Nazgul - */ -#define RF7_NAZGUL 0x00000080 -/** @def RF7_DG_CURSE - * @note If killed the monster grant a DG Curse to the player - */ -#define RF7_DG_CURSE 0x00000100 -/** @def RF7_POSSESSOR - * @note Is it a dreaded possessor monster ? - */ -#define RF7_POSSESSOR 0x00000200 -/** @def RF7_NO_DEATH - * @note Cannot be killed - */ -#define RF7_NO_DEATH 0x00000400 -/** @def RF7_NO_TARGET - * @note Cannot be targeted - */ -#define RF7_NO_TARGET 0x00000800 -/** @def RF7_AI_ANNOY - * @note Try to tease the player - */ -#define RF7_AI_ANNOY 0x00001000 -/** @def RF7_AI_SPECIAL - * @note For quests - */ -#define RF7_AI_SPECIAL 0x00002000 -/** @def RF7_NO_THEFT - * @note Monster is immune to theft - */ -#define RF7_NO_THEFT 0x00040000 -/** @def RF7_SPIRIT - * @note This is a Spirit, coming from the Void - */ -#define RF7_SPIRIT 0x00080000 -/** @def RF7_IM_MELEE - * @note IM melee - */ -#define RF7_IM_MELEE 0x00100000 -/** @} */ - -/** @name Race flags #8 - * @note New monster race bit flags - * @{ */ -/** @def RF8_DUNGEON */ -#define RF8_DUNGEON 0x00000001 - -/** @def RF8_WILD_TOWN */ -#define RF8_WILD_TOWN 0x00000002 - -/** @def RF8_XXX8X02 */ -#define RF8_XXX8X02 0x00000004 - -/** @def RF8_WILD_SHORE */ -#define RF8_WILD_SHORE 0x00000008 - -/** @def RF8_WILD_OCEAN */ -#define RF8_WILD_OCEAN 0x00000010 - -/** @def RF8_WILD_WASTE */ -#define RF8_WILD_WASTE 0x00000020 - -/** @def RF8_WILD_WOOD */ -#define RF8_WILD_WOOD 0x00000040 - -/** @def RF8_WILD_VOLCANO */ -#define RF8_WILD_VOLCANO 0x00000080 - -/** @def RF8_XXX8X08 */ -#define RF8_XXX8X08 0x00000100 - -/** @def RF8_WILD_MOUNTAIN */ -#define RF8_WILD_MOUNTAIN 0x00000200 - -/** @def RF8_WILD_GRASS */ -#define RF8_WILD_GRASS 0x00000400 - -/********* FREE *********/ -/** @def RF8_CTHANGBAND */ -#define RF8_CTHANGBAND 0x00001000 - -/********* FREE *********/ -/** @def RF8_ZANGBAND */ -#define RF8_ZANGBAND 0x00004000 - -/** @def RF8_JOKEANGBAND */ -#define RF8_JOKEANGBAND 0x00008000 - -/** @def RF8_ANGBAND */ -#define RF8_ANGBAND 0x00010000 - - -/** @def RF8_WILD_TOO */ -#define RF8_WILD_TOO 0x80000000 -/** @} */ - -/** @name Race flags #9 - * @note New monster race bit flags - * @{ */ -/** @def RF9_DROP_CORPSE */ -#define RF9_DROP_CORPSE 0x00000001 - -/** @def RF9_DROP_SKELETON */ -#define RF9_DROP_SKELETON 0x00000002 - -/** @def RF9_HAS_LITE - * @note Carries a lite - */ -#define RF9_HAS_LITE 0x00000004 -/** @def RF9_MIMIC - * @note *REALLY* looks like an object ... only nastier - */ -#define RF9_MIMIC 0x00000008 -/** @def RF9_HAS_EGG - * @note Can be monster's eggs - */ -#define RF9_HAS_EGG 0x00000010 -/** @def RF9_IMPRESED - * @note The monster can follow you on each level until he dies - */ -#define RF9_IMPRESED 0x00000020 -/** @def RF9_SUSCEP_ACID - * @note Susceptible to acid - */ -#define RF9_SUSCEP_ACID 0x00000040 -/** @def RF9_SUSCEP_ELEC - * @note Susceptible to lightning - */ -#define RF9_SUSCEP_ELEC 0x00000080 -/** @def RF9_SUSCEP_POIS - * @note Susceptible to poison - */ -#define RF9_SUSCEP_POIS 0x00000100 -/** @def RF9_KILL_TREES - * @note Monster can eat trees - */ -#define RF9_KILL_TREES 0x00000200 -/** @def RF9_WYRM_PROTECT - * @note The monster is protected by great wyrms of power: They'll be summoned if it's killed - */ -#define RF9_WYRM_PROTECT 0x00000400 -/** @def RF9_DOPPLEGANGER - * @note The monster looks like you - */ -#define RF9_DOPPLEGANGER 0x00000800 -/** @def RF9_ONLY_DEPTH - * @note The monster can only be generated at the GIVEN depth - */ -#define RF9_ONLY_DEPTH 0x00001000 -/** @def RF9_SPECIAL_GENE - * @note The monster can only be generated in special conditions like quests, special dungeons, ... - */ -#define RF9_SPECIAL_GENE 0x00002000 -/** @def RF9_NEVER_GENE - * @note The monster cannot be normaly generated - */ -#define RF9_NEVER_GENE 0x00004000 -/** @} */ - -/** @name Monster flags - * @{ */ -/** @def MFLAG_VIEW - * @note Monster is in line of sight - */ -#define MFLAG_VIEW 0x00000001 -/** @def MFLAG_QUEST - * @note Monster is subject to a quest - */ -#define MFLAG_QUEST 0x00000002 -/** @def MFLAG_PARTIAL - * @note Monster is a partial summon - */ -#define MFLAG_PARTIAL 0x00000004 -/** @def MFLAG_CONTROL - * @note Monster is controlled - */ -#define MFLAG_CONTROL 0x00000008 -/** @def MFLAG_BORN - * @note Monster is still being born - */ -#define MFLAG_BORN 0x00000010 -/** @def MFLAG_NICE - * @note Monster is still being nice - */ -#define MFLAG_NICE 0x00000020 -/** @def MFLAG_SHOW - * @note Monster is recently memorized - */ -#define MFLAG_SHOW 0x00000040 -/** @def MFLAG_MARK - * @note Monster is currently memorized - */ -#define MFLAG_MARK 0x00000080 -/** @def MFLAG_NO_DROP - * @note Monster wont drop obj/corpse - */ -#define MFLAG_NO_DROP 0x00000100 -/** @def MFLAG_QUEST2 - * @note Monster is subject to a quest - */ -#define MFLAG_QUEST2 0x00000200 -/** @} */ - -/** @struct monster_blow - * @brief Monster blows (attacks) - */ -struct monster_blow -{ - /** @structvar method - * @brief Number - */ - byte method; - /** @structvar effect - * @brief Number - */ - byte effect; - /** @structvar d_dice - * @brief Number - */ - byte d_dice; - /** @structvar d_side - * @brief Number - */ - byte d_side; -}; - -/** @struct monster_race - * @brief Monster race - */ -struct monster_race -{ - /** @structvar name - * @brief Number - * @note Name (offset) - */ - u32b name; - /** @structvar text - * @brief Number - * @note Text (offset) - */ - u32b text; - - /** @structvar hdice - * @brief Number - * @note Creatures hit dice count - */ - byte hdice; - /** @structvar hside - * @brief Number - * @note Creatures hit dice sides - */ - byte hside; - - /** @structvar ac - * @brief Number - * @note Armour Class - */ - s16b ac; - - /** @structvar sleep - * @brief Number - * @note Inactive counter (base) - */ - s16b sleep; - /** @structvar aaf - * @brief Number - * @note Area affect radius (1-100) - */ - byte aaf; - /** @structvar speed - * @brief Number - * @note Speed (normally 110) - */ - byte speed; - - /** @structvar mexp - * @brief Number - * @note Exp value for kill - */ - s32b mexp; - - /** @structvar weight - * @brief Number - * @note Weight of the monster - */ - s32b weight; - - /** @structvar freq_inate - * @brief Number - * @note Inate spell frequency - */ - byte freq_inate; - /** @structvar freq_spell - * @brief Number - * @note Other spell frequency - */ - byte freq_spell; - - /** @structvar flags1 - * @brief Number - * @note Flags 1 (general) - */ - u32b flags1; - /** @structvar flags2 - * @brief Number - * @note Flags 2 (abilities) - */ - u32b flags2; - /** @structvar flags3 - * @brief Number - * @note Flags 3 (race/resist) - */ - u32b flags3; - /** @structvar flags4 - * @brief Number - * @note Flags 4 (inate/breath) - */ - u32b flags4; - /** @structvar flags5 - * @brief Number - * @note Flags 5 (normal spells) - */ - u32b flags5; - /** @structvar flags6 - * @brief Number - * @note Flags 6 (special spells) - */ - u32b flags6; - /** @structvar flags7 - * @brief Number - * @note Flags 7 (movement related abilities) - */ - u32b flags7; - /** @structvar flags8 - * @brief Number - * @note Flags 8 (wilderness info) - */ - u32b flags8; - /** @structvar flags9 - * @brief Number - * @note Flags 9 (drops info) - */ - u32b flags9; - - /** @structvar blow[4] - * @brief magic_power - * @note Up to four blows per round - */ - monster_blow blow[4]; - - /** @structvar body_parts[BODY_MAX] - * @brief Number - * @note To help to decide what to use when body changing - */ - byte body_parts[BODY_MAX]; - - /** @structvar level - * @brief Number - * @note Level of creature - */ - byte level; - /** @structvar rarity - * @brief Number - * @note Rarity of creature - */ - byte rarity; - - - /** @structvar d_attr - * @brief Number - * @note Default monster attribute - */ - byte d_attr; - /** @structvar d_char - * @brief String - * @note Default monster character - */ - char d_char; - - - /** @structvar x_attr - * @brief Number - * @note Desired monster attribute - */ - byte x_attr; - /** @structvar x_char - * @brief String - * @note Desired monster character - */ - char x_char; - - - /** @structvar max_num - * @brief Number - * @note Maximum population allowed per level - */ - s16b max_num; - - /** @structvar cur_num - * @brief Number - * @note Monster population on current level - */ - byte cur_num; - - - /** @structvar r_sights - * @brief Number - * @note Count sightings of this monster - */ - s16b r_sights; - /** @structvar r_deaths - * @brief Number - * @note Count deaths from this monster - */ - s16b r_deaths; - - /** @structvar r_pkills - * @brief Number - * @note Count monsters killed in this life - */ - s16b r_pkills; - /** @structvar r_tkills - * @brief Number - * @note Count monsters killed in all lives - */ - s16b r_tkills; - - /** @structvar r_wake - * @brief Number - * @note Number of times woken up (?) - */ - byte r_wake; - /** @structvar r_ignore - * @brief Number - * @note Number of times ignored (?) - */ - byte r_ignore; - - /** @structvar r_xtra1 - * @brief Number - * @note Something (unused) - */ - byte r_xtra1; - /** @structvar r_xtra2 - * @brief Number - * @note Something (unused) - */ - byte r_xtra2; - - /** @structvar r_drop_gold - * @brief Number - * @note Max number of gold dropped at once - */ - byte r_drop_gold; - /** @structvar r_drop_item - * @brief Number - * @note Max number of item dropped at once - */ - byte r_drop_item; - - /** @structvar r_cast_inate - * @brief Number - * @note Max number of inate spells seen - */ - byte r_cast_inate; - /** @structvar r_cast_spell - * @brief Number - * @note Max number of other spells seen - */ - byte r_cast_spell; - - /** @structvar r_blows[4] - * @brief Number - * @note Number of times each blow type was seen - */ - byte r_blows[4]; - - /** @structvar r_flags1 - * @brief Number - * @note Observed racial flags - */ - u32b r_flags1; - /** @structvar r_flags2 - * @brief Number - * @note Observed racial flags - */ - u32b r_flags2; - /** @structvar r_flags3 - * @brief Number - * @note Observed racial flags - */ - u32b r_flags3; - /** @structvar r_flags4 - * @brief Number - * @note Observed racial flags - */ - u32b r_flags4; - /** @structvar r_flags5 - * @brief Number - * @note Observed racial flags - */ - u32b r_flags5; - /** @structvar r_flags6 - * @brief Number - * @note Observed racial flags - */ - u32b r_flags6; - /** @structvar r_flags7 - * @brief Number - * @note Observed racial flags - */ - u32b r_flags7; - /** @structvar r_flags8 - * @brief Number - * @note Observed racial flags - */ - u32b r_flags8; - /** @structvar r_flags9 - * @brief Number - * @note Observed racial flags - */ - u32b r_flags9; - - /** @structvar on_saved - * @brief Boolean - * @note Is the (unique) on a saved level ? - */ - bool on_saved; - - /** @structvar total_visible - * @brief Number - * @note Amount of this race that are visible - */ - byte total_visible; - - /** @structvar drops - * @brief obj_theme - * @note The drops type - */ - obj_theme drops; -}; - -/** @struct monster_type - * @brief Monster type - */ -struct monster_type -{ - /** @structvar r_idx - * @brief Number - * @note Monster race index - */ - s16b r_idx; - - /** @structvar ego - * @brief Number - * @note Ego monster type - */ - u16b ego; - - /** @structvar fy - * @brief Number - * @note Y location on map - */ - byte fy; - /** @structvar fx - * @brief Number - * @note X location on map - */ - byte fx; - - /** @structvar hp - * @brief Number - * @note Current Hit points - */ - s16b hp; - /** @structvar maxhp - * @brief Number - * @note Max Hit points - */ - s16b maxhp; - - /** @structvar blow[4] - * @brief magic_power - * @note Up to four blows per round - */ - monster_blow blow[4]; - - /** @structvar speed - * @brief Number - * @note Speed (normally 110) - */ - byte speed; - /** @structvar level - * @brief Number - * @note Level of creature - */ - byte level; - /** @structvar ac - * @brief Number - * @note Armour Class - */ - s16b ac; - /** @structvar exp - * @brief Number - * @note Experience - */ - u32b exp; - - /** @structvar csleep - * @brief Number - * @note Inactive counter - */ - s16b csleep; - - /** @structvar mspeed - * @brief Number - * @note Monster "speed" - */ - byte mspeed; - /** @structvar energy - * @brief Number - * @note Monster "energy" - */ - byte energy; - - /** @structvar stunned - * @brief Number - * @note Monster is stunned - */ - byte stunned; - /** @structvar confused - * @brief Number - * @note Monster is confused - */ - byte confused; - /** @structvar monfear - * @brief Number - * @note Monster is afraid - */ - byte monfear; - - /** @structvar bleeding - * @brief Number - * @note Monster is bleeding - */ - s16b bleeding; - /** @structvar poisoned - * @brief Number - * @note Monster is poisoned - */ - s16b poisoned; - - /** @structvar cdis - * @brief Number - * @note Current dis from player - */ - byte cdis; - - /** @structvar mflag - * @brief Number - * @note Extra monster flags - */ - s32b mflag; - - /** @structvar ml - * @brief Boolean - * @note Monster is "visible" - */ - bool ml; - - /** @structvar hold_o_idx - * @brief Number - * @note Object being held (if any) - */ - s16b hold_o_idx; - - /** @structvar smart - * @brief Number - * @note Field for "smart_learn" - */ - u32b smart; - - /** @structvar status - * @brief Number - * @note Status(friendly, pet, companion, ..) - */ - s16b status; - - /** @structvar target - * @brief Number - * @note Monster target - */ - s16b target; - - /** @structvar possessor - * @brief Number - * @note Is it under the control of a possessor ? - */ - s16b possessor; -}; - -$static monster_type *lua_get_monster(int m_idx){return (&m_list[m_idx]);} -/** @fn monster(int m_idx); - * @brief Return the monster with index "m_idx" in the monster list.\n - * @param m_idx Number \n the index of the monster in the monster list - * @brief Monster index - * @return monster_type \n The monster. - * @note (see file w_mnster.c) - */ -static monster_type *lua_get_monster @ monster(int m_idx); - -/** @var m_list[max_m_idx] - * @brief monster_type - * @note List of monsters - */ -extern monster_type m_list[max_m_idx]; - -/** @fn race_info_idx(int r_idx, int ego) - * @brief Get monster info and ego info for monster with monster index "r_idx" - * and monster ego "ego".\n - * @param r_idx Number \n the index of the race in the monster race array - * @brief Race index - * @param ego Number \n the index of the ego in the monster ego array - * @brief Ego index - * @return monster_race \n The monster race. - * @note - * If "ego" > 0, the ego information is applied to the monster information and - * the new monster information is returned. - * @note - * For example, race_info_idx(141,7) will create a brown yeek (monster) - * shaman (ego). - * @note (see file monster2.c) - */ -extern monster_race* race_info_idx(int r_idx, int ego); - -/** @fn delete_monster_idx(int i) - * @brief Delete monster "i" from the monster array.\n - * @param i Number \n the index of the monster in the monster list - * @brief Monster index - * @note (see file monster2.c) - */ -extern void delete_monster_idx(int i); - -/** @fn m_pop(void) - * @brief Get an empty slot in the monster list. - * @return Number \n The index of an empty slot the monster list. - * @note - * If there are no empty slots, a slot will be reclaimed from a "dead" - * monster. If all slots are full, 0 is returned, which means the function - * has failed ("Too many monsters!"). - * @note (see file monster2.c) - */ -extern s16b m_pop(void); - -/** @fn get_mon_num_prep(void) - * @brief Apply a "monster restriction function" to the "monster allocation - * table". - * @return Number \n 0 (success) always. - * @note - * There are no parameters, but there are some other variables which will - * need to be set. They are get_mon_num_hook and get_mon_num2_hook. They - * are pointers to functions. - * @note - * For example, get_mon_num_hook = monster_volcano means when - * get_mon_num_hook is called (*get_mon_num_hook)(index), the actual - * function called is monster_volcano(index). This particular function - * returns TRUE if the monster indicated by "index" has the - * RF8_WILD_VOLCANO flag set. - * @note - * It is a good idea to store the old value of get_mon_num_hook before - * setting a new one, and restoring it when your function is finished. - * @note - * Following is a list of functions which can be assigned to - * get_mon_num_hook:\n - * create_molds_hook\n - * create_townpeople_hook\n - * mon_hook_bounty\n - * monster_dungeon\n - * monster_grass\n - * monster_mountain\n - * monster_ocean\n - * monster_quest\n - * monster_shore\n - * monster_town\n - * monster_volcano\n - * monster_waste\n - * monster_wood\n - * mutate_monster_okay\n - * place_monster_okay\n - * summon_specific_okay\n - * vault_aux_animal\n - * vault_aux_chapel\n - * vault_aux_clone\n - * vault_aux_demon\n - * vault_aux_dragon\n - * vault_aux_giant\n - * vault_aux_jelly\n - * vault_aux_kennel\n - * vault_aux_orc\n - * vault_aux_symbol\n - * vault_aux_treasure\n - * vault_aux_troll\n - * vault_aux_undead - * @note - * Or you can write your own. The function must take an integer (index) - * as a parameter and return boolean (TRUE if the monster is selected, - * or FALSE if it is not). - * @note (see file monster2.c) - */ -extern errr get_mon_num_prep(void); - -/** @fn get_mon_num(int level) - * @brief For the given level "level", return the index of an appropriate - * monster race.\n - * @param level Number \n a dungeon level (which is adjusted before - * it is used). - * @brief Dungeon level - * @return Number \n The index of a monster race in the monster race array. - * @note - * This function uses the "prob2" field of the "monster allocation table", - * and various local information, to calculate the "prob3" field of the - * same table, which is then used to choose an "appropriate" monster, in - * a relatively efficient manner. - * @note - * Note that "town" monsters will *only* be created in the town, and - * "normal" monsters will *never* be created in the town, unless the - * "level" is "modified", for example, by polymorph or summoning. - * @note - * There is a small chance (1/50) of "boosting" the given depth by - * a small amount (up to four levels), except in the town. - * @note - * It is (slightly) more likely to acquire a monster of the given level - * than one of a lower level. This is done by choosing several monsters - * appropriate to the given level and keeping the "hardest" one. - * @note - * Note that if no monsters are "appropriate", then this function will - * fail, and return zero, but this should *almost* never happen. - * @note (see file monster2.c) - */ -extern s16b get_mon_num(int level); - -$static char *lua_monster_desc(monster_type *m_ptr, int mode){static char buf[200]; monster_desc(buf, m_ptr, mode); return buf;} -/** @fn monster_desc(monster_type *m_ptr, int mode); - * @brief Return a monster description for monster "monster_type" using flag - * "mode".\n - * @param *m_ptr monster_type \n the monster - * @brief Monster - * @param mode Number \n description mode (see below) - * @brief Description mode - * @return String \n The description of the monster. - * @note - * We can correctly describe monsters based on their visibility.\n - * We can force all monsters to be treated as visible or invisible.\n - * We can build nominatives, objectives, possessives, or reflexives.\n - * We can selectively pronominalize hidden, visible, or all monsters.\n - * We can use definite or indefinite descriptions for hidden monsters.\n - * We can use definite or indefinite descriptions for visible monsters. - * @note - * Pronominalization involves the gender whenever possible and allowed, - * so that by cleverly requesting pronominalization / visibility, you - * can get messages like "You hit someone. She screams in agony!". - * @note - * Reflexives are acquired by requesting Objective plus Possessive. - * @note - * If no m_ptr arg is given (?), the monster is assumed to be hidden, - * unless the "Assume Visible" mode is requested. - * @note - * If no r_ptr arg is given, it is extracted from m_ptr and r_info - * If neither m_ptr nor r_ptr is given, the monster is assumed to - * be neuter, singular, and hidden (unless "Assume Visible" is set), - * in which case you may be in trouble... :-) - * @note - * I am assuming that no monster name is more than 70 characters long, - * so that "char desc[80];" is sufficiently large for any result. - * @note - * Mode Flags:\n - * 0x01 --> Objective (or Reflexive)\n - * 0x02 --> Possessive (or Reflexive)\n - * 0x04 --> Use indefinites for hidden monsters ("something")\n - * 0x08 --> Use indefinites for visible monsters ("a kobold")\n - * 0x10 --> Pronominalize hidden monsters\n - * 0x20 --> Pronominalize visible monsters\n - * 0x40 --> Assume the monster is hidden\n - * 0x80 --> Assume the monster is visible - * @note - * Useful Modes:\n - * 0x00 --> Full nominative name ("the kobold") or "it"\n - * 0x04 --> Full nominative name ("the kobold") or "something"\n - * 0x80 --> Genocide resistance name ("the kobold")\n - * 0x88 --> Killing name ("a kobold")\n - * 0x22 --> Possessive, genderized if visible ("his") or "its"\n - * 0x23 --> Reflexive, genderized if visible ("himself") or "itself" - * @note (see file monster2.c) - */ -static char *lua_monster_desc @ monster_desc(monster_type *m_ptr, int mode); - -$static char *lua_monster_race_desc(int r_idx, int ego){static char buf[200]; monster_race_desc(buf, r_idx, ego); return buf;} -/** @fn monster_race_desc(int r_idx, int ego); - * @brief Return the monster description for monster with monster index - * "r_idx" and monster ego "ego".\n - * @param r_idx Number \n the index of the race in the monster race array - * @brief Race index - * @param ego Number \n the index of the ego in the monster ego array - * @brief Ego index - * @return String \n The description of the monster race. - * @note - * The monster description is made up of the ego name (if any) and monster - * name, or the unique name. - * @note (see file w_mnster.c) - */ -static char *lua_monster_race_desc @ monster_race_desc(int r_idx, int ego); - -/** @fn monster_race_desc(char *desc, int r_idx, int ego) - * @brief Return the monster description "desc" for monster with monster index - * "r_idx" and monster ego "ego".\n - * @param *desc String - * @brief Description - * @param r_idx Number \n the index of the race in the monster race array - * @brief Race index - * @param ego Number \n the index of the ego in the monster ego array - * @brief Ego index - * @return *desc String \n The description of the monster race. - * @note - * The monster description is made up of the ego name (if any) and monster - * name, or the unique name. - * @note (see file monster2.c) - */ -extern void monster_race_desc(char *desc, int r_idx, int ego); - -/** @fn monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr) - * @brief Allow monster "m_ptr" with monster index "m_idx" to carry object - * "q_ptr".\n - * @param *m_ptr monster_type \n the monster - * @brief Monster - * @param m_idx Number \n the index of the monster in the monster list - * @brief Monster index - * @param *q_ptr object_type \n the object - * @brief Object - * @note - * The monster can only carry the object if there is room for the object in the - * object list. - * @note (see file monster2.c) - */ -extern void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr); - -/** @fn place_monster_aux(int y, int x, int r_idx, bool slp, bool grp, int status) - * @brief Attempt to place a monster with monster race index "r_idx" and status - * "status" at grid "y", "x". The monster may be asleep ("slp") or surrounded - * by a group of identical monsters ("grp").\n - * @param y Number \n the y coordinate of the target grid - * @brief Y-coordinate - * @param x Number \n the x coordinate of the target grid - * @brief X-coordinate - * @param r_idx Number \n the index of the race in the monster race array - * @brief Race index - * @param slp Boolean \n TRUE if monster is asleep, otherwise FALSE - * @brief Asleep? - * @param grp Boolean \n TRUE if monster appears in a group, otherwise FALSE - * @brief Group? - * @param status Number \n the status of the monster from the player's point - * of view (see MSTATUS_foo flags) - * @brief Monster status - * @return Boolean \n TRUE if the monster is placed successfully, otherwise - * FALSE. - * @note - * Note that certain monsters are now marked as requiring "friends". - * These monsters, if successfully placed, and if the "grp" parameter - * is TRUE, will be surrounded by a "group" of identical monsters. - * @note - * Note that certain monsters are now marked as requiring an "escort", - * which is a collection of monsters with similar "race" but lower - * level. - * @note - * Some monsters induce a fake "group" flag on their escorts. - * @note - * Note the "bizarre" use of non-recursion to prevent annoying output - * when running a code profiler. - * @note - * Note the use of the new "monster allocation table" code to restrict - * the "get_mon_num()" function to "legal" escort types. - * @note (see file monster2.c) - */ -extern bool place_monster_aux(int y, int x, int r_idx, bool slp, bool grp, int status); - -/** @fn place_monster(int y, int x, bool slp, bool grp) - * @brief Attempt to place a monster at grid "y", "x". The monster may be - * asleep ("slp") or surrounded by a group of identical monsters ("grp").\n - * @param y Number \n the y coordinate of the target grid - * @brief Y-coordinate - * @param x Number \n the x coordinate of the target grid - * @brief X-coordinate - * @param slp Boolean \n TRUE if monster is asleep, otherwise FALSE - * @brief Asleep? - * @param grp Boolean \n TRUE if monster appears in a group, otherwise FALSE - * @brief Group? - * @return Boolean \n TRUE if the monster is placed successfully, otherwise - * FALSE. - * @note - * Attempt to find a monster appropriate to the "monster_level" - * @note (see file monster2.c) - */ -extern bool place_monster(int y, int x, bool slp, bool grp); - -/** @fn place_monster_one(int y, int x, int r_idx, int ego, bool slp, int status) - * @brief Attempt to place a monster with monster race index "r_idx", monster - * ego "ego" and status "status" at grid "y", "x". The monster may be asleep - * ("slp").\n - * @param y Number \n the y coordinate of the target grid - * @brief Y-coordinate - * @param x Number \n the x coordinate of the target grid - * @brief X-coordinate - * @param r_idx Number \n the index of the race in the monster race array - * @brief Race index - * @param ego Number \n the index of the ego in the monster ego array - * @brief Ego index - * @param slp Boolean \n TRUE if monster is asleep, otherwise FALSE - * @brief Asleep? - * @param status Number \n the status of the monster from the player's point - * of view (see MSTATUS_foo flags) - * @brief Monster status - * @return Number \n The index of the placed monster in the monster list. - * @note - * To give the player a sporting chance, any monster that appears in - * line-of-sight and is extremely dangerous can be marked as - * "FORCE_SLEEP", which will cause them to be placed with low energy, - * which often (but not always) lets the player move before they do. - * @note - * This routine refuses to place out-of-depth "FORCE_DEPTH" monsters. - * @note - * XXX XXX XXX Use special "here" and "dead" flags for unique monsters, - * remove old "cur_num" and "max_num" fields. - * @note - * XXX XXX XXX Actually, do something similar for artifacts, to simplify - * the "preserve" mode, and to make the "what artifacts" flag more useful. - * @note - * This is the only function which may place a monster in the dungeon, - * except for the savefile loading code. - * @note (see file monster2.c) - */ -extern s16b place_monster_one(int y, int x, int r_idx, int ego, bool slp, int status); - -/** @fn is_friend(monster_type *m_ptr) - * @brief Return a value to indicate the status of monster "m_ptr".\n - * @param *m_ptr monster_type \n the monster - * @brief Monster - * @return Number \n -1 if monster is an enemy, 0 if it is neutral, and 1 if - * it is friendly. - * @note (see file monster3.c) - */ -extern int is_friend(monster_type *m_ptr); - -/** @fn is_enemy(monster_type *m_ptr, monster_type *t_ptr) - * @brief Determine if monster "m_ptr" should attack monster "t_ptr".\n - * @param *m_ptr monster_type \n the monster - * @brief Monster - * @param *t_ptr monster_type \n the target monster - * @brief Target monster - * @return Boolean \n TRUE if monster "m_ptr" should attack monster "t_ptr", - * otherwise FALSE. - * @note - * If "m_ptr" is stupid and "r_ptr" is a different type of monster then the - * function will return TRUE.\n - * If "m_ptr" is not neutral and "r_ptr" is a breeder, and "r_ptr" is a - * different type of monster then the function will return TRUE (and vice - * versa).\n - * If both monsters are not neutral and one is friendly and the other isn't - * then the function will return TRUE. - * @note (see file monster3.c) - */ -extern bool is_enemy(monster_type *m_ptr, monster_type *t_ptr); - -/** @fn change_side(monster_type *m_ptr) - * @brief Change the status of monster "m_ptr" from friendly to unfriendly and - * vice versa. - * @param *m_ptr monster_type \n the monster - * @brief Monster - * @return Boolean \n TRUE if the status changed, otherwise FALSE. - * @note - * Friends and pets become enemies.\n - * Neutral monsters become neutral pets and vice versa.\n - * Companions are unaffected. - * @note (see file monster3.c) - */ -extern bool change_side(monster_type *m_ptr); - -/** @fn find_position(int y, int x, int *yy = 0, int *xx = 0) - * @brief Find a new grid "yy", "xx" within 6 grids of target grid "y", "x".\n - * @param y Number \n the y coordinate of the origin grid - * @brief Origin y-coordinate - * @param x Number \n the x coordinate of the origin grid - * @brief Origin x-coordinate - * @param yy Number \n the y coordinate of the target grid - * @brief Target y-coordinate - * @param xx Number \n the x coordinate of the target grid - * @brief Target x-coordinate - * @note - * The new grid must be within line-of-sight of the target grid. A - * maximum of 5000 attempts is made. - * @note (see file lua_bind.c) - */ -extern void find_position(int y, int x, int *yy = 0, int *xx = 0); - -/** @var summon_specific_level - * @brief Number - * @note - * Force summoned monsters to be at this level. - */ -extern int summon_specific_level; - -/** @var summon_kin_type - * @brief String - * @note - * The monster character for those monsters who can summon kin. - */ -extern char summon_kin_type; - -/** @fn summon_specific(int y1, int x1, int lev, int type) - * @brief Place a monster of type "type" near grid "y","x".\n - * @param y1 Number \n the y coordinate of the target grid - * @brief Y-coordinate - * @param x1 Number \n the x coordinate of the target grid - * @brief X-coordinate - * @param lev Number \n the monster level of the summoning monster - * @brief Summoner level - * @param type Number \n the type of summoned monster - * @brief Monster type - * @return Boolean \n TRUE if a monster was summoned, otherwise FALSE. - * @note - * We will attempt to place the monster up to 20 times before giving up. - * @note - * Note: SUMMON_UNIQUE and SUMMON_WRAITH (XXX) will summon Unique's\n - * Note: SUMMON_HI_UNDEAD and SUMMON_HI_DRAGON may summon Unique's\n - * Note: None of the other summon codes will ever summon Unique's. - * @note - * This function has been changed. We now take the "monster level" - * of the summoning monster as a parameter, and use that, along with - * the current dungeon level, to help determine the level of the - * desired monster. Note that this is an upper bound, and also - * tends to "prefer" monsters of that level. Currently, we use - * the average of the dungeon and monster levels, and then add - * five to allow slight increases in monster power. - * @note - * Note that we use the new "monster allocation table" creation code - * to restrict the "get_mon_num()" function to the set of "legal" - * monsters, making this function much faster and more reliable. - * @note - * Note that this function may not succeed, though this is very rare. - * @note (see file monster2.c) - */ -extern bool summon_specific(int y1, int x1, int lev, int type); - -/** @fn summon_specific_friendly(int y1, int x1, int lev, int type, bool Group_ok) - * @brief Place a friendly monster of type "type" near grid "y","x". The - * monster may be surrounded by a group of identical monsters ("Group_ok").\n - * @param y1 Number \n the y coordinate of the target grid - * @brief Y-coordinate - * @param x1 Number \n the x coordinate of the target grid - * @brief X-coordinate - * @param lev Number \n the monster level of the summoning monster - * @brief Summoner level - * @param type Number \n the type of summoned monster - * @brief Monster type - * @param Group_ok Boolean \n TRUE if monster appears in a group, otherwise - * FALSE - * @brief Group? - * @return Boolean \n TRUE if a monster was summoned, otherwise FALSE. - * @note (see file monster2.c) - */ -extern bool summon_specific_friendly(int y1, int x1, int lev, int type, bool Group_ok); - -/** @fn can_create_companion() - * @brief Determine if a companion can be created. - * @return Boolean \n TRUE if a companion can be created, otherwise FALSE. - * @note - * The companions are counted. If this is less than the number allowed by - * the player monster lore skill, the function returns TRUE, otherwise the - * function returns FALSE. - * @note (see file monster3.c) - */ -extern bool can_create_companion(); - -/** @fn monster_set_level(int m_idx, int level) - * @brief Set a new level for monster with monster index "m_idx".\n - * @param m_idx Number \n the index of the monster in the monster list - * @brief Monster index - * @param level Number \n the new level of the monster - * @brief Monster level - * @note - * The new level can not exceed 150. If the new level is higher than the - * monster level, the monster experience value is recalculated. - * @note (see file monster2.c) - */ -extern void monster_set_level(int m_idx, int level); - -/** @name Summon types - * @note Legal restrictions for "summon_specific()" - */ -/** @def SUMMON_ANT - * @note Summon giant ant (a) excluding uniques. - */ -#define SUMMON_ANT 11 - -/** @def SUMMON_SPIDER - * @note Summon spider/scorpion/tick (S) excluding uniques. - */ -#define SUMMON_SPIDER 12 - -/** @def SUMMON_HOUND - * @note Summon canine (C) or zephyr hound (Z) excluding uniques. - */ -#define SUMMON_HOUND 13 - -/** @def SUMMON_HYDRA - * @note Summon multi-headed hydra (M) excluding uniques. - */ -#define SUMMON_HYDRA 14 - -/** @def SUMMON_ANGEL - * @note Summon angelic being (A) excluding uniques. - */ -#define SUMMON_ANGEL 15 - -/** @def SUMMON_DEMON - * @note Summon demon (RF3_DEMON) excluding uniques. - */ -#define SUMMON_DEMON 16 - -/** @def SUMMON_UNDEAD - * @note Summon undead (RF3_UNDEAD) excluding uniques. - */ -#define SUMMON_UNDEAD 17 - -/** @def SUMMON_DRAGON - * @note Summon dragon (RF3_DRAGON) excluding uniques. - */ -#define SUMMON_DRAGON 18 - -/** @def SUMMON_HI_UNDEAD - * @note Summon lich (L) or vampire (V) or wight/wraith (W) including uniques. - */ -#define SUMMON_HI_UNDEAD 21 - -/** @def SUMMON_HI_DRAGON - * @note Summon ancient dragon (D) including uniques. - */ -#define SUMMON_HI_DRAGON 22 - -/** @def SUMMON_WRAITH - * @note Summon wight/wraith (W) including uniques. - */ -#define SUMMON_WRAITH 31 - -/** @def SUMMON_UNIQUE - * @note Summon unique (RF1_UNIQUE). - */ -#define SUMMON_UNIQUE 32 - -/** @def SUMMON_BIZARRE1 - * @note Summon mold (m) excluding uniques. - */ -#define SUMMON_BIZARRE1 33 - -/** @def SUMMON_BIZARRE2 - * @note Summon giant bat (b) excluding uniques. - */ -#define SUMMON_BIZARRE2 34 - -/** @def SUMMON_BIZARRE3 - * @note Summon quylthulg (Q) excluding uniques. - */ -#define SUMMON_BIZARRE3 35 - -/** @def SUMMON_BIZARRE4 - * @note Summon vortex (v) excluding uniques. - */ -#define SUMMON_BIZARRE4 36 - -/** @def SUMMON_BIZARRE5 - * @note Summon creeping coins ($) excluding uniques. - */ -#define SUMMON_BIZARRE5 37 - -/** @def SUMMON_BIZARRE6 - * @note Summon mimic (!?=$|) excluding uniques. - */ -#define SUMMON_BIZARRE6 38 - -/** @def SUMMON_HI_DEMON - * @note Summon demon (RF3_DEMON) and major demon (U) excluding uniques. - */ -#define SUMMON_HI_DEMON 39 - -/** @def SUMMON_KIN - * @note Summon monster of the same character type excluding uniques. - */ -#define SUMMON_KIN 40 - -/** @def SUMMON_DAWN - * @note Summon monster with "the Dawn" in the name excluding uniques. - */ -#define SUMMON_DAWN 41 - -/** @def SUMMON_ANIMAL - * @note Summon animal (RF3_ANIMAL) excluding uniques. - */ -#define SUMMON_ANIMAL 42 - -/** @def SUMMON_ANIMAL_RANGER - * @note Summon animal (RF3_ANIMAL) and giant ant, giant bat, centipede, - * feline,giant louse, quadruped, rodent, worm or worm mass, bird, canine, - * insect, snake, killer beetle, multi-headed hydra, reptile/amphibian, - * spider/scorpion/tick (abcflqrwBCIJKMRS) and not dragon (RF3_DRAGON) and not - * evil (RF3_EVIL) and not undead (RF3_UNDEAD) and not demon (RF3_DEMON) and - * not inate/breath and not normal spells and not special spells excluding - * uniques. - */ -#define SUMMON_ANIMAL_RANGER 43 - -/** @def SUMMON_HI_UNDEAD_NO_UNIQUES - * @note Summon lich (L) or vampire (V) or wight/wraith (W) excluding uniques. - */ -#define SUMMON_HI_UNDEAD_NO_UNIQUES 44 - -/** @def SUMMON_HI_DRAGON_NO_UNIQUES - * @note Summon ancient dragon (D) excluding uniques. - */ -#define SUMMON_HI_DRAGON_NO_UNIQUES 45 - -/** @def SUMMON_NO_UNIQUES - * @note Summon non-uniques (not RF1_UNIQUE). - */ -#define SUMMON_NO_UNIQUES 46 - -/** @def SUMMON_PHANTOM - * @note Summon monster with "Phantom" in the name excluding uniques. - */ -#define SUMMON_PHANTOM 47 - -/** @def SUMMON_ELEMENTAL - * @note Summon monster with "lemental" in the name excluding uniques. - */ -#define SUMMON_ELEMENTAL 48 - -/** @def SUMMON_THUNDERLORD - * @note Summon thunderlords (RF3_THUNDERLORD) including uniques. - */ -#define SUMMON_THUNDERLORD 49 - -/** @def SUMMON_BLUE_HORROR - * @note Summon monster with "lue horror" in the name excluding uniques. - */ -#define SUMMON_BLUE_HORROR 50 - -/** @def SUMMON_BUG - * @note Summon monster with "Software bug" in the name excluding uniques. - */ -#define SUMMON_BUG 51 - -/** @def SUMMON_RNG - * @note Summon monster with "Random Number Generator" in the name excluding - * uniques. - */ -#define SUMMON_RNG 52 - -/** @def SUMMON_MINE - * @note Summon mines (RF1_NEVER_MOVE) including uniques. - */ -#define SUMMON_MINE 53 - -/** @def SUMMON_HUMAN - * @note Summon (p) excluding uniques. - */ -#define SUMMON_HUMAN 54 - -/** @def SUMMON_SHADOWS - * @note Summon ghost (G) excluding uniques. - */ -#define SUMMON_SHADOWS 55 - -/** @def SUMMON_GHOST - * @note Summon ghost (G) including uniques. - */ -#define SUMMON_GHOST 56 - -/** @def SUMMON_QUYLTHULG - * @note Summon (Q) excluding uniques. - */ -#define SUMMON_QUYLTHULG 57 - -/** @} */ - -/** @fn do_control_reconnect() - * @brief Find the controlled monster and reconnect to it. - * @return Boolean \n TRUE if there is a controlled monster, otherwise FALSE. - * @note - * The monster list is scanned for a monster with MFLAG_CONTROL. If it is - * found, the function returns TRUE. - * @note (see file monster3.c) - */ -extern bool do_control_reconnect(); - -/* monster thing */ -/** @var m_max - * @brief Number - * @note The number of monsters currently in the monster list. - */ -extern s16b m_max; diff --git a/src/object.pkg b/src/object.pkg deleted file mode 100644 index 05ea9c1a..00000000 --- a/src/object.pkg +++ /dev/null @@ -1,1161 +0,0 @@ -/* File: object.pkg */ - -/* - * Purpose: Lua interface defitions for objects. - * To be processed by tolua to generate C source code. - */ - -$#include "angband.h" - -typedef char* cptr; -typedef int errr; -typedef unsigned char bool; -typedef unsigned char byte; -typedef signed short s16b; -typedef unsigned short u16b; -typedef signed int s32b; -typedef unsigned int u32b; - -/* To make easy object creations */ -$static object_type lua_obj_forge; -static object_type lua_obj_forge @ obj_forge; -$static obj_theme lua_obj_theme; -static obj_theme lua_obj_theme @ theme_forge; - -#define TR1_STR 0x00000001L /* STR += "pval" */ -#define TR1_INT 0x00000002L /* INT += "pval" */ -#define TR1_WIS 0x00000004L /* WIS += "pval" */ -#define TR1_DEX 0x00000008L /* DEX += "pval" */ -#define TR1_CON 0x00000010L /* CON += "pval" */ -#define TR1_CHR 0x00000020L /* CHR += "pval" */ -#define TR1_MANA 0x00000040L /* Mana multipler */ -#define TR1_SPELL 0x00000080L /* Spell power increase */ -#define TR1_STEALTH 0x00000100L /* Stealth += "pval" */ -#define TR1_SEARCH 0x00000200L /* Search += "pval" */ -#define TR1_INFRA 0x00000400L /* Infra += "pval" */ -#define TR1_TUNNEL 0x00000800L /* Tunnel += "pval" */ -#define TR1_SPEED 0x00001000L /* Speed += "pval" */ -#define TR1_BLOWS 0x00002000L /* Blows += "pval" */ -#define TR1_CHAOTIC 0x00004000L -#define TR1_VAMPIRIC 0x00008000L -#define TR1_SLAY_ANIMAL 0x00010000L -#define TR1_SLAY_EVIL 0x00020000L -#define TR1_SLAY_UNDEAD 0x00040000L -#define TR1_SLAY_DEMON 0x00080000L -#define TR1_SLAY_ORC 0x00100000L -#define TR1_SLAY_TROLL 0x00200000L -#define TR1_SLAY_GIANT 0x00400000L -#define TR1_SLAY_DRAGON 0x00800000L -#define TR1_KILL_DRAGON 0x01000000L /* Execute Dragon */ -#define TR1_VORPAL 0x02000000L /* Later */ -#define TR1_IMPACT 0x04000000L /* Cause Earthquakes */ -#define TR1_BRAND_POIS 0x08000000L -#define TR1_BRAND_ACID 0x10000000L -#define TR1_BRAND_ELEC 0x20000000L -#define TR1_BRAND_FIRE 0x40000000L -#define TR1_BRAND_COLD 0x80000000L -#define TR1_NULL_MASK 0x00000000L - -#define TR2_SUST_STR 0x00000001L -#define TR2_SUST_INT 0x00000002L -#define TR2_SUST_WIS 0x00000004L -#define TR2_SUST_DEX 0x00000008L -#define TR2_SUST_CON 0x00000010L -#define TR2_SUST_CHR 0x00000020L -#define TR2_INVIS 0x00000040L /* Invisibility */ -#define TR2_LIFE 0x00000080L /* Life multiplier */ -#define TR2_IM_ACID 0x00000100L -#define TR2_IM_ELEC 0x00000200L -#define TR2_IM_FIRE 0x00000400L -#define TR2_IM_COLD 0x00000800L -#define TR2_SENS_FIRE 0x00001000L /* Sensibility to fire */ -#define TR2_REFLECT 0x00002000L /* Reflect 'bolts' */ -#define TR2_FREE_ACT 0x00004000L /* Free Action */ -#define TR2_HOLD_LIFE 0x00008000L /* Hold Life */ -#define TR2_RES_ACID 0x00010000L -#define TR2_RES_ELEC 0x00020000L -#define TR2_RES_FIRE 0x00040000L -#define TR2_RES_COLD 0x00080000L -#define TR2_RES_POIS 0x00100000L -#define TR2_RES_FEAR 0x00200000L -#define TR2_RES_LITE 0x00400000L -#define TR2_RES_DARK 0x00800000L -#define TR2_RES_BLIND 0x01000000L -#define TR2_RES_CONF 0x02000000L -#define TR2_RES_SOUND 0x04000000L -#define TR2_RES_SHARDS 0x08000000L -#define TR2_RES_NETHER 0x10000000L -#define TR2_RES_NEXUS 0x20000000L -#define TR2_RES_CHAOS 0x40000000L -#define TR2_RES_DISEN 0x80000000L -#define TR2_NULL_MASK 0x00000000L - -#define TR3_SH_FIRE 0x00000001L /* Immolation (Fire) */ -#define TR3_SH_ELEC 0x00000002L /* Electric Sheath */ -#define TR3_AUTO_CURSE 0x00000004L /* The obj will recurse itself */ -#define TR3_DECAY 0x00000008L /* Decay */ -#define TR3_NO_TELE 0x00000010L /* Anti-teleportation */ -#define TR3_NO_MAGIC 0x00000020L /* Anti-magic */ -#define TR3_WRAITH 0x00000040L /* Wraithform */ -#define TR3_TY_CURSE 0x00000080L /* The Ancient Curse */ -#define TR3_EASY_KNOW 0x00000100L /* Aware -> Known */ -#define TR3_HIDE_TYPE 0x00000200L /* Hide "pval" description */ -#define TR3_SHOW_MODS 0x00000400L /* Always show Tohit/Todam */ -#define TR3_INSTA_ART 0x00000800L /* Item must be an artifact */ -#define TR3_FEATHER 0x00001000L /* Feather Falling */ -#define TR3_LITE1 0x00002000L /* lite radius 1 */ -#define TR3_SEE_INVIS 0x00004000L /* See Invisible */ -#define TR3_NORM_ART 0x00008000L /* Artifact in k_info */ -#define TR3_SLOW_DIGEST 0x00010000L /* Item slows down digestion */ -#define TR3_REGEN 0x00020000L /* Item induces regeneration */ -#define TR3_XTRA_MIGHT 0x00040000L /* Bows get extra multiplier */ -#define TR3_XTRA_SHOTS 0x00080000L /* Bows get extra shots */ -#define TR3_IGNORE_ACID 0x00100000L /* Item ignores Acid Damage */ -#define TR3_IGNORE_ELEC 0x00200000L /* Item ignores Elec Damage */ -#define TR3_IGNORE_FIRE 0x00400000L /* Item ignores Fire Damage */ -#define TR3_IGNORE_COLD 0x00800000L /* Item ignores Cold Damage */ -#define TR3_ACTIVATE 0x01000000L /* Item can be activated */ -#define TR3_DRAIN_EXP 0x02000000L /* Item drains Experience */ -#define TR3_TELEPORT 0x04000000L /* Item teleports player */ -#define TR3_AGGRAVATE 0x08000000L /* Item aggravates monsters */ -#define TR3_BLESSED 0x10000000L /* Item is Blessed */ -#define TR3_CURSED 0x20000000L /* Item is Cursed */ -#define TR3_HEAVY_CURSE 0x40000000L /* Item is Heavily Cursed */ -#define TR3_PERMA_CURSE 0x80000000L /* Item is Perma Cursed */ -#define TR3_NULL_MASK 0x00000000L - -#define TR4_NEVER_BLOW 0x00000001L /* Weapon can't attack */ -#define TR4_PRECOGNITION 0x00000002L /* Like activating the cheat mode */ -#define TR4_BLACK_BREATH 0x00000004L /* Tolkien's Black Breath */ -#define TR4_RECHARGE 0x00000008L /* For artifact Wands and Staffs */ -#define TR4_FLY 0x00000010L /* This one and ONLY this one allow you to fly over trees */ -#define TR4_DG_CURSE 0x00000020L /* The Ancient Morgothian Curse */ -#define TR4_COULD2H 0x00000040L /* Can wield it 2 Handed */ -#define TR4_MUST2H 0x00000080L /* Must wield it 2 Handed */ -#define TR4_LEVELS 0x00000100L /* Can gain exp/exp levels !! */ -#define TR4_CLONE 0x00000200L /* Can clone monsters */ -#define TR4_SPECIAL_GENE 0x00000400L /* The object can only be generated in special conditions like quests, special dungeons, ... */ -#define TR4_CLIMB 0x00000800L /* Allow climbing mountains */ -#define TR4_FAST_CAST 0x00001000L /* Rod is x2 time faster to use */ -#define TR4_CAPACITY 0x00002000L /* Rod can take x2 mana */ -#define TR4_CHARGING 0x00004000L /* Rod recharge faster */ -#define TR4_CHEAPNESS 0x00008000L /* Rod spells are cheaper(in mana cost) to cast */ -#define TR4_FOUNTAIN 0x00010000L /* Available as fountain (for potions) */ -#define TR4_ANTIMAGIC_50 0x00020000L /* Forbid magic */ -#define TR4_ANTIMAGIC_30 0x00040000L /* Forbid magic */ -#define TR4_ANTIMAGIC_20 0x00080000L /* Forbid magic */ -#define TR4_ANTIMAGIC_10 0x00100000L /* Forbid magic */ -#define TR4_EASY_USE 0x00200000L /* Easily activable */ -#define TR4_IM_NETHER 0x00400000L /* Immunity to nether */ -#define TR4_RECHARGED 0x00800000L /* Object has been recharged once */ -#define TR4_ULTIMATE 0x01000000L /* ULTIMATE artifact */ -#define TR4_AUTO_ID 0x02000000L /* Id stuff on floor */ -#define TR4_LITE2 0x04000000L /* lite radius 2 */ -#define TR4_LITE3 0x08000000L /* lite radius 3 */ -#define TR4_FUEL_LITE 0x10000000L /* fuelable lite */ -#define TR4_ART_EXP 0x20000000L /* Will accumulate xp */ -#define TR4_CURSE_NO_DROP 0x40000000L /* The obj wont be dropped */ -#define TR4_NO_RECHARGE 0x80000000L /* Object Cannot be recharged */ -#define TR4_NULL_MASK 0xFFFFFFFCL - -#define TR5_TEMPORARY 0x00000001L /* In timeout turns it is destroyed */ -#define TR5_DRAIN_MANA 0x00000002L /* Drains mana */ -#define TR5_DRAIN_HP 0x00000004L /* Drains hp */ -#define TR5_KILL_DEMON 0x00000008L /* Execute Demon */ -#define TR5_KILL_UNDEAD 0x00000010L /* Execute Undead */ -#define TR5_CRIT 0x00000020L /* More critical hits */ -#define TR5_ATTR_MULTI 0x00000040L /* Object shimmer -- only allowed in k_info */ -#define TR5_WOUNDING 0x00000080L /* Wounds monsters */ -#define TR5_FULL_NAME 0x00000100L /* Uses direct name from k_info */ -#define TR5_LUCK 0x00000200L /* Luck += pval */ -#define TR5_IMMOVABLE 0x00000400L /* Cannot move */ -#define TR5_SPELL_CONTAIN 0x00000800L /* Can contain a spell */ -#define TR5_RES_MORGUL 0x00001000L /* Is not shattered by morgul fiends(nazguls) */ -#define TR5_ACTIVATE_NO_WIELD 0x00002000L /* Can be 'A'ctivated without being wielded */ -#define TR5_MAGIC_BREATH 0x00004000L /* Can breath anywere */ -#define TR5_WATER_BREATH 0x00008000L /* Can breath underwater */ -#define TR5_WIELD_CAST 0x00010000L /* Need to be wielded to cast spelsl fomr it(if it can be wiekded) */ - -#define ESP_ORC 0x00000001L -#define ESP_TROLL 0x00000002L -#define ESP_DRAGON 0x00000004L -#define ESP_GIANT 0x00000008L -#define ESP_DEMON 0x00000010L -#define ESP_UNDEAD 0x00000020L -#define ESP_EVIL 0x00000040L -#define ESP_ANIMAL 0x00000080L -#define ESP_THUNDERLORD 0x00000100L -#define ESP_GOOD 0x00000200L -#define ESP_NONLIVING 0x00000400L -#define ESP_UNIQUE 0x00000800L -#define ESP_SPIDER 0x00001000L -#define ESP_ALL 0x80000000L - -/* - * Bit flags for the "get_item" function - */ -#define USE_EQUIP 0x01 /* Allow equip items */ -#define USE_INVEN 0x02 /* Allow inven items */ -#define USE_FLOOR 0x04 /* Allow floor items */ -#define USE_EXTRA 0x08 /* Allow extra items */ - -#define INVEN_WIELD 24 /* 3 weapons -- WEAPONS */ -#define INVEN_BOW 27 /* 1 bow -- WEAPON */ -#define INVEN_RING 28 /* 6 rings -- FINGER */ -#define INVEN_NECK 34 /* 2 amulets -- HEAD */ -#define INVEN_LITE 36 /* 1 lite -- TORSO */ -#define INVEN_BODY 37 /* 1 body -- TORSO */ -#define INVEN_OUTER 38 /* 1 cloak -- TORSO */ -#define INVEN_ARM 39 /* 3 arms -- ARMS */ -#define INVEN_HEAD 42 /* 2 heads -- HEAD */ -#define INVEN_HANDS 44 /* 3 hands -- ARMS */ -#define INVEN_FEET 47 /* 2 feets -- LEGS */ -#define INVEN_CARRY 49 /* 1 carried monster -- TORSO */ -#define INVEN_AMMO 50 /* 1 quiver -- TORSO */ -#define INVEN_TOOL 51 /* 1 tool -- ARMS */ -#define INVEN_TOTAL 52 -#define INVEN_EQ (INVEN_TOTAL - INVEN_WIELD) - -#define TV_SKELETON 1 /* Skeletons ('s') */ -#define TV_BOTTLE 2 /* Empty bottles ('!') */ -#define TV_BATERIE 4 /* For the Alchemists */ -#define TV_SPIKE 5 /* Spikes ('~') */ -#define TV_MSTAFF 6 /* Mage Staffs */ -#define TV_CHEST 7 /* Chests ('~') */ -#define TV_PARCHMENT 8 /* Parchments from Kamband */ -#define TV_PARCHEMENT 8 /* compatibility define */ -#define TV_CORPSE 9 /* Monster corpses */ -#define TV_EGG 10 /* Monster Eggs */ -#define TV_JUNK 11 /* Sticks, Pottery, etc ('~') */ -#define TV_TOOL 12 /* Tools */ -#define TV_INSTRUMENT 14 /* Musical instruments */ -#define TV_BOOMERANG 15 /* Boomerangs */ -#define TV_SHOT 16 /* Ammo for slings */ -#define TV_ARROW 17 /* Ammo for bows */ -#define TV_BOLT 18 /* Ammo for x-bows */ -#define TV_BOW 19 /* Slings/Bows/Xbows */ -#define TV_DIGGING 20 /* Shovels/Picks */ -#define TV_HAFTED 21 /* Priest Weapons */ -#define TV_POLEARM 22 /* Pikes/Glaives/Spears/etc. */ -#define TV_SWORD 23 /* Edged Weapons */ -#define TV_AXE 24 /* Axes/Cleavers */ -#define TV_BOOTS 30 /* Boots */ -#define TV_GLOVES 31 /* Gloves */ -#define TV_HELM 32 /* Helms */ -#define TV_CROWN 33 /* Crowns */ -#define TV_SHIELD 34 /* Shields */ -#define TV_CLOAK 35 /* Cloaks */ -#define TV_SOFT_ARMOR 36 /* Soft Armor */ -#define TV_HARD_ARMOR 37 /* Hard Armor */ -#define TV_DRAG_ARMOR 38 /* Dragon Scale Mail */ -#define TV_LITE 39 /* Lites (including Specials) */ -#define TV_AMULET 40 /* Amulets (including Specials) */ -#define TV_RING 45 /* Rings (including Specials) */ -#define TV_TRAPKIT 46 /* Trapkits */ -#define TV_TOTEM 54 /* Summoner totems */ -#define TV_STAFF 55 -#define TV_WAND 65 -#define TV_ROD 66 -#define TV_ROD_MAIN 67 -#define TV_SCROLL 70 -#define TV_POTION 71 -#define TV_POTION2 72 /* Second set of potion */ -#define TV_FLASK 77 -#define TV_FOOD 80 -#define TV_HYPNOS 99 /* To wield monsters !:) */ -#define TV_GOLD 100 /* Gold can only be picked up by players */ -#define TV_RANDART 102 /* Random Artifacts */ -#define TV_RUNE1 104 /* Base runes */ -#define TV_RUNE2 105 /* Modifier runes */ - -#define TV_BOOK 111 -#define TV_SYMBIOTIC_BOOK 112 -#define TV_MUSIC_BOOK 113 -#define TV_DRUID_BOOK 114 -#define TV_DAEMON_BOOK 115 - -/* The "sval" codes for TV_TOOL */ -#define SV_TOOL_CLIMB 0 -#define SV_PORTABLE_HOLE 1 - -/* The "sval" codes for TV_MSTAFF */ -#define SV_MSTAFF 1 - -/* The "sval" codes for TV_SHOT/TV_ARROW/TV_BOLT */ -#define SV_AMMO_LIGHT 0 /* pebbles */ -#define SV_AMMO_NORMAL 1 /* shots, arrows, bolts */ -#define SV_AMMO_HEAVY 2 /* seeker arrows and bolts, mithril shots */ - -/* The "sval" codes for TV_INSTRUMENT */ -#define SV_DRUM 58 -#define SV_HARP 59 -#define SV_HORN 60 - -/* The "sval" codes for TV_TRAPKIT */ -#define SV_TRAPKIT_SLING 1 -#define SV_TRAPKIT_BOW 2 -#define SV_TRAPKIT_XBOW 3 -#define SV_TRAPKIT_POTION 4 -#define SV_TRAPKIT_SCROLL 5 -#define SV_TRAPKIT_DEVICE 6 - -/* The "sval" codes for TV_BOOMERANG */ -#define SV_BOOM_S_WOOD 1 /* 1d4 */ -#define SV_BOOM_WOOD 2 /* 1d9 */ -#define SV_BOOM_S_METAL 3 /* 1d8 */ -#define SV_BOOM_METAL 4 /* 2d4 */ - -/* The "sval" codes for TV_BOW (note information in "sval") */ -#define SV_SLING 2 /* (x2) */ -#define SV_SHORT_BOW 12 /* (x2) */ -#define SV_LONG_BOW 13 /* (x3) */ -#define SV_LIGHT_XBOW 23 /* (x3) */ -#define SV_HEAVY_XBOW 24 /* (x4) */ - -/* The "sval" codes for TV_DIGGING */ -#define SV_SHOVEL 1 -#define SV_GNOMISH_SHOVEL 2 -#define SV_DWARVEN_SHOVEL 3 -#define SV_PICK 4 -#define SV_ORCISH_PICK 5 -#define SV_DWARVEN_PICK 6 -#define SV_MATTOCK 7 - -/* The "sval" values for TV_HAFTED */ -#define SV_CLUB 1 /* 1d4 */ -#define SV_WHIP 2 /* 1d6 */ -#define SV_QUARTERSTAFF 3 /* 1d9 */ -#define SV_NUNCHAKU 4 /* 2d3 */ -#define SV_MACE 5 /* 2d4 */ -#define SV_BALL_AND_CHAIN 6 /* 2d4 */ -#define SV_WAR_HAMMER 8 /* 3d3 */ -#define SV_LUCERN_HAMMER 10 /* 2d5 */ -#define SV_THREE_PIECE_ROD 11 /* 3d3 */ -#define SV_MORNING_STAR 12 /* 2d6 */ -#define SV_FLAIL 13 /* 2d6 */ -#define SV_LEAD_FILLED_MACE 15 /* 3d4 */ -#define SV_TWO_HANDED_FLAIL 18 /* 3d6 */ -#define SV_GREAT_HAMMER 19 /* 4d6 */ -#define SV_MACE_OF_DISRUPTION 20 /* 5d8 */ -#define SV_GROND 50 /* 3d4 */ - -/* The "sval" values for TV_AXE */ -#define SV_HATCHET 1 /* 1d5 */ -#define SV_CLEAVER 2 /* 2d4 */ -#define SV_LIGHT_WAR_AXE 8 /* 2d5 */ -#define SV_BEAKED_AXE 10 /* 2d6 */ -#define SV_BROAD_AXE 11 /* 2d6 */ -#define SV_BATTLE_AXE 22 /* 2d8 */ -#define SV_GREAT_AXE 25 /* 4d4 */ -#define SV_LOCHABER_AXE 28 /* 3d8 */ -#define SV_SLAUGHTER_AXE 30 /* 5d7 */ - -/* The "sval" values for TV_POLEARM */ -#define SV_SPEAR 2 /* 1d6 */ -#define SV_SICKLE 3 /* 2d3 */ -#define SV_AWL_PIKE 4 /* 1d8 */ -#define SV_TRIDENT 5 /* 1d9 */ -#define SV_FAUCHARD 6 /* 1d10 */ -#define SV_BROAD_SPEAR 7 /* 1d9 */ -#define SV_PIKE 8 /* 2d5 */ -#define SV_GLAIVE 13 /* 2d6 */ -#define SV_HALBERD 15 /* 3d4 */ -#define SV_GUISARME 16 /* 2d5 */ -#define SV_SCYTHE 17 /* 5d3 */ -#define SV_LANCE 20 /* 2d8 */ -#define SV_TRIFURCATE_SPEAR 26 /* 2d9 */ -#define SV_HEAVY_LANCE 29 /* 4d8 */ -#define SV_SCYTHE_OF_SLICING 30 /* 8d4 */ - -/* The "sval" codes for TV_SWORD */ -#define SV_BROKEN_DAGGER 1 /* 1d1 */ -#define SV_BROKEN_SWORD 2 /* 1d2 */ -#define SV_DAGGER 4 /* 1d4 */ -#define SV_MAIN_GAUCHE 5 /* 1d5 */ -#define SV_RAPIER 7 /* 1d6 */ -#define SV_SMALL_SWORD 8 /* 1d6 */ -#define SV_BASILLARD 9 /* 1d8 */ -#define SV_SHORT_SWORD 10 /* 1d7 */ -#define SV_SABRE 11 /* 1d7 */ -#define SV_CUTLASS 12 /* 1d7 */ -#define SV_KHOPESH 14 /* 2d4 */ -#define SV_TULWAR 15 /* 2d4 */ -#define SV_BROAD_SWORD 16 /* 2d5 */ -#define SV_LONG_SWORD 17 /* 2d5 */ -#define SV_SCIMITAR 18 /* 2d5 */ -#define SV_KATANA 20 /* 3d4 */ -#define SV_BASTARD_SWORD 21 /* 3d4 */ -#define SV_GREAT_SCIMITAR 22 /* 4d5 */ -#define SV_CLAYMORE 23 /* 2d8 */ -#define SV_ESPADON 24 /* 2d9 */ -#define SV_TWO_HANDED_SWORD 25 /* 3d6 */ -#define SV_FLAMBERGE 26 /* 3d7 */ -#define SV_EXECUTIONERS_SWORD 28 /* 4d5 */ -#define SV_ZWEIHANDER 29 /* 4d6 */ -#define SV_BLADE_OF_CHAOS 30 /* 6d5 */ -#define SV_BLUESTEEL_BLADE 31 /* 3d9 */ -#define SV_SHADOW_BLADE 32 /* 4d4 */ -#define SV_DARK_SWORD 33 /* 3d7 */ - -/* The "sval" codes for TV_SHIELD */ -#define SV_SMALL_LEATHER_SHIELD 2 -#define SV_SMALL_METAL_SHIELD 3 -#define SV_LARGE_LEATHER_SHIELD 4 -#define SV_LARGE_METAL_SHIELD 5 -#define SV_DRAGON_SHIELD 6 -#define SV_SHIELD_OF_DEFLECTION 10 - -/* The "sval" codes for TV_HELM */ -#define SV_HARD_LEATHER_CAP 2 -#define SV_METAL_CAP 3 -#define SV_IRON_HELM 5 -#define SV_STEEL_HELM 6 -#define SV_DRAGON_HELM 7 -#define SV_IRON_CROWN 10 -#define SV_GOLDEN_CROWN 11 -#define SV_JEWELED_CROWN 12 -#define SV_MORGOTH 50 - -/* The "sval" codes for TV_BOOTS */ -#define SV_PAIR_OF_SOFT_LEATHER_BOOTS 2 -#define SV_PAIR_OF_HARD_LEATHER_BOOTS 3 -#define SV_PAIR_OF_METAL_SHOD_BOOTS 6 - -/* The "sval" codes for TV_CLOAK */ -#define SV_CLOAK 1 -#define SV_ELVEN_CLOAK 2 -#define SV_FUR_CLOAK 3 -#define SV_SHADOW_CLOAK 6 - -/* The "sval" codes for TV_GLOVES */ -#define SV_SET_OF_LEATHER_GLOVES 1 -#define SV_SET_OF_GAUNTLETS 2 -#define SV_SET_OF_CESTI 5 - -/* The "sval" codes for TV_SOFT_ARMOR */ -#define SV_FILTHY_RAG 1 -#define SV_ROBE 2 -#define SV_PAPER_ARMOR 3 /* 4 */ -#define SV_SOFT_LEATHER_ARMOR 4 -#define SV_SOFT_STUDDED_LEATHER 5 -#define SV_HARD_LEATHER_ARMOR 6 -#define SV_HARD_STUDDED_LEATHER 7 -#define SV_RHINO_HIDE_ARMOR 8 -#define SV_CORD_ARMOR 9 /* 6 */ -#define SV_PADDED_ARMOR 10 /* 4 */ -#define SV_LEATHER_SCALE_MAIL 11 -#define SV_LEATHER_JACK 12 -#define SV_STONE_AND_HIDE_ARMOR 15 /* 15 */ -#define SV_THUNDERLORD_SUIT 16 - -/* The "sval" codes for TV_HARD_ARMOR */ -#define SV_RUSTY_CHAIN_MAIL 1 /* 14- */ -#define SV_RING_MAIL 2 /* 12 */ -#define SV_METAL_SCALE_MAIL 3 /* 13 */ -#define SV_CHAIN_MAIL 4 /* 14 */ -#define SV_DOUBLE_RING_MAIL 5 /* 15 */ -#define SV_AUGMENTED_CHAIN_MAIL 6 /* 16 */ -#define SV_DOUBLE_CHAIN_MAIL 7 /* 16 */ -#define SV_BAR_CHAIN_MAIL 8 /* 18 */ -#define SV_METAL_BRIGANDINE_ARMOUR 9 /* 19 */ -#define SV_SPLINT_MAIL 10 /* 19 */ -#define SV_PARTIAL_PLATE_ARMOUR 12 /* 22 */ -#define SV_METAL_LAMELLAR_ARMOUR 13 /* 23 */ -#define SV_FULL_PLATE_ARMOUR 15 /* 25 */ -#define SV_RIBBED_PLATE_ARMOUR 18 /* 28 */ -#define SV_MITHRIL_CHAIN_MAIL 20 /* 28+ */ -#define SV_MITHRIL_PLATE_MAIL 25 /* 35+ */ -#define SV_ADAMANTITE_PLATE_MAIL 30 /* 40+ */ - -/* The "sval" codes for TV_DRAG_ARMOR */ -#define SV_DRAGON_BLACK 1 -#define SV_DRAGON_BLUE 2 -#define SV_DRAGON_WHITE 3 -#define SV_DRAGON_RED 4 -#define SV_DRAGON_GREEN 5 -#define SV_DRAGON_MULTIHUED 6 -#define SV_DRAGON_SHINING 10 -#define SV_DRAGON_LAW 12 -#define SV_DRAGON_BRONZE 14 -#define SV_DRAGON_GOLD 16 -#define SV_DRAGON_CHAOS 18 -#define SV_DRAGON_BALANCE 20 -#define SV_DRAGON_POWER 30 - -/* The sval codes for TV_LITE */ -#define SV_LITE_TORCH 0 -#define SV_LITE_LANTERN 1 -#define SV_LITE_TORCH_EVER 2 -#define SV_LITE_DWARVEN 3 -#define SV_LITE_FEANORIAN 4 -#define SV_LITE_GALADRIEL 100 -#define SV_LITE_ELENDIL 101 -#define SV_LITE_THRAIN 102 -#define SV_LITE_UNDEATH 103 -#define SV_LITE_PALANTIR 104 -#define SV_ANCHOR_SPACETIME 105 -#define SV_STONE_LORE 106 - - -/* The "sval" codes for TV_AMULET */ -#define SV_AMULET_DOOM 0 -#define SV_AMULET_TELEPORT 1 -#define SV_AMULET_ADORNMENT 2 -#define SV_AMULET_SLOW_DIGEST 3 -#define SV_AMULET_RESIST_ACID 4 -#define SV_AMULET_SEARCHING 5 -#define SV_AMULET_BRILLANCE 6 -#define SV_AMULET_CHARISMA 7 -#define SV_AMULET_THE_MAGI 8 -#define SV_AMULET_REFLECTION 9 -#define SV_AMULET_CARLAMMAS 10 -#define SV_AMULET_INGWE 11 -#define SV_AMULET_DWARVES 12 -#define SV_AMULET_NO_MAGIC 13 -#define SV_AMULET_NO_TELE 14 -#define SV_AMULET_RESISTANCE 15 -#define SV_AMULET_NOTHING 16 -#define SV_AMULET_SERPENT 17 -#define SV_AMULET_TORIS_MEJISTOS 18 -#define SV_AMULET_TRICKERY 23 -#define SV_AMULET_DEVOTION 25 -#define SV_AMULET_WEAPONMASTERY 24 -#define SV_AMULET_WISDOM 28 -#define SV_AMULET_INFRA 26 -#define SV_AMULET_SPELL 27 - -/* The sval codes for TV_RING */ -#define SV_RING_WOE 0 -#define SV_RING_AGGRAVATION 1 -#define SV_RING_WEAKNESS 2 -#define SV_RING_STUPIDITY 3 -#define SV_RING_TELEPORTATION 4 -#define SV_RING_SPECIAL 5 -#define SV_RING_SLOW_DIGESTION 6 -#define SV_RING_FEATHER_FALL 7 -#define SV_RING_RESIST_FIRE 8 -#define SV_RING_RESIST_COLD 9 -#define SV_RING_SUSTAIN_STR 10 -#define SV_RING_SUSTAIN_INT 11 -#define SV_RING_SUSTAIN_WIS 12 -#define SV_RING_SUSTAIN_DEX 13 -#define SV_RING_SUSTAIN_CON 14 -#define SV_RING_SUSTAIN_CHR 15 -#define SV_RING_PROTECTION 16 -#define SV_RING_ACID 17 -#define SV_RING_FLAMES 18 -#define SV_RING_ICE 19 -#define SV_RING_RESIST_POIS 20 -#define SV_RING_FREE_ACTION 21 -#define SV_RING_SEE_INVIS 22 -#define SV_RING_SEARCHING 23 -#define SV_RING_STR 24 -#define SV_RING_INT 25 -#define SV_RING_DEX 26 -#define SV_RING_CON 27 -#define SV_RING_ACCURACY 28 -#define SV_RING_DAMAGE 29 -#define SV_RING_SLAYING 30 -#define SV_RING_SPEED 31 -#define SV_RING_BARAHIR 32 -#define SV_RING_TULKAS 33 -#define SV_RING_NARYA 34 -#define SV_RING_NENYA 35 -#define SV_RING_VILYA 36 -#define SV_RING_POWER 37 -#define SV_RING_RES_FEAR 38 -#define SV_RING_RES_LD 39 -#define SV_RING_RES_NETHER 40 -#define SV_RING_RES_NEXUS 41 -#define SV_RING_RES_SOUND 42 -#define SV_RING_RES_CONFUSION 43 -#define SV_RING_RES_SHARDS 44 -#define SV_RING_RES_DISENCHANT 45 -#define SV_RING_RES_CHAOS 46 -#define SV_RING_RES_BLINDNESS 47 -#define SV_RING_LORDLY 48 -#define SV_RING_ATTACKS 49 -#define SV_RING_NOTHING 50 -#define SV_RING_PRECONITION 51 -#define SV_RING_FLAR 52 -#define SV_RING_INVIS 53 -#define SV_RING_FLYING 54 -#define SV_RING_WRAITH 55 -#define SV_RING_ELEC 56 -#define SV_RING_CRIT 57 -#define SV_RING_SPELL 58 - -/* The "sval" codes for TV_STAFF */ -#define SV_STAFF_SCHOOL 1 -#define SV_STAFF_NOTHING 2 - -/* The "sval" codes for TV_WAND */ -#define SV_WAND_SCHOOL 1 -#define SV_WAND_NOTHING 2 - -/* The "sval" codes for TV_ROD(Rod Tips) */ -#define SV_ROD_NOTHING 0 -#define SV_ROD_DETECT_DOOR 1 -#define SV_ROD_IDENTIFY 2 -#define SV_ROD_RECALL 3 -#define SV_ROD_ILLUMINATION 4 -#define SV_ROD_MAPPING 5 -#define SV_ROD_DETECTION 6 -#define SV_ROD_PROBING 7 -#define SV_ROD_CURING 8 -#define SV_ROD_HEALING 9 -#define SV_ROD_RESTORATION 10 -#define SV_ROD_SPEED 11 -/* xxx (aimed) */ -#define SV_ROD_TELEPORT_AWAY 13 -#define SV_ROD_DISARMING 14 -#define SV_ROD_LITE 15 -#define SV_ROD_SLEEP_MONSTER 16 -#define SV_ROD_SLOW_MONSTER 17 -#define SV_ROD_DRAIN_LIFE 18 -#define SV_ROD_POLYMORPH 19 -#define SV_ROD_ACID_BOLT 20 -#define SV_ROD_ELEC_BOLT 21 -#define SV_ROD_FIRE_BOLT 22 -#define SV_ROD_COLD_BOLT 23 -#define SV_ROD_ACID_BALL 24 -#define SV_ROD_ELEC_BALL 25 -#define SV_ROD_FIRE_BALL 26 -#define SV_ROD_COLD_BALL 27 -#define SV_ROD_HAVOC 28 -#define SV_ROD_DETECT_TRAP 29 -#define SV_ROD_HOME 30 - - -/* The "sval" codes for TV_ROD_MAIN(Rods) */ -/* Note that the sval is the max mana capacity of the rod */ - -#define SV_ROD_WOODEN 10 -#define SV_ROD_COPPER 20 -#define SV_ROD_IRON 50 -#define SV_ROD_ALUMINIUM 75 -#define SV_ROD_SILVER 100 -#define SV_ROD_GOLDEN 125 -#define SV_ROD_MITHRIL 160 -#define SV_ROD_ADMANTITE 200 - - -/* The "sval" codes for TV_SCROLL */ - -#define SV_SCROLL_DARKNESS 0 -#define SV_SCROLL_AGGRAVATE_MONSTER 1 -#define SV_SCROLL_CURSE_ARMOR 2 -#define SV_SCROLL_CURSE_WEAPON 3 -#define SV_SCROLL_SUMMON_MONSTER 4 -#define SV_SCROLL_SUMMON_UNDEAD 5 -#define SV_SCROLL_SUMMON_MINE 6 -#define SV_SCROLL_TRAP_CREATION 7 -#define SV_SCROLL_PHASE_DOOR 8 -#define SV_SCROLL_TELEPORT 9 -#define SV_SCROLL_TELEPORT_LEVEL 10 -#define SV_SCROLL_WORD_OF_RECALL 11 -#define SV_SCROLL_IDENTIFY 12 -#define SV_SCROLL_STAR_IDENTIFY 13 -#define SV_SCROLL_REMOVE_CURSE 14 -#define SV_SCROLL_STAR_REMOVE_CURSE 15 -#define SV_SCROLL_ENCHANT_ARMOR 16 -#define SV_SCROLL_ENCHANT_WEAPON_TO_HIT 17 -#define SV_SCROLL_ENCHANT_WEAPON_TO_DAM 18 -#define SV_SCROLL_ENCHANT_WEAPON_PVAL 19 -#define SV_SCROLL_STAR_ENCHANT_ARMOR 20 -#define SV_SCROLL_STAR_ENCHANT_WEAPON 21 -#define SV_SCROLL_RECHARGING 22 -#define SV_SCROLL_RESET_RECALL 23 -#define SV_SCROLL_LIGHT 24 -#define SV_SCROLL_MAPPING 25 -#define SV_SCROLL_DETECT_GOLD 26 -#define SV_SCROLL_DETECT_ITEM 27 -#define SV_SCROLL_DETECT_TRAP 28 -#define SV_SCROLL_DETECT_DOOR 29 -#define SV_SCROLL_DETECT_INVIS 30 -#define SV_SCROLL_DIVINATION 31 -#define SV_SCROLL_SATISFY_HUNGER 32 -#define SV_SCROLL_BLESSING 33 -#define SV_SCROLL_HOLY_CHANT 34 -#define SV_SCROLL_HOLY_PRAYER 35 -#define SV_SCROLL_MONSTER_CONFUSION 36 -#define SV_SCROLL_PROTECTION_FROM_EVIL 37 -#define SV_SCROLL_RUNE_OF_PROTECTION 38 -#define SV_SCROLL_TRAP_DOOR_DESTRUCTION 39 -#define SV_SCROLL_DEINCARNATION 40 -#define SV_SCROLL_STAR_DESTRUCTION 41 -#define SV_SCROLL_DISPEL_UNDEAD 42 -#define SV_SCROLL_MASS_RESURECTION 43 -#define SV_SCROLL_GENOCIDE 44 -#define SV_SCROLL_MASS_GENOCIDE 45 -#define SV_SCROLL_ACQUIREMENT 46 -#define SV_SCROLL_STAR_ACQUIREMENT 47 -#define SV_SCROLL_FIRE 48 -#define SV_SCROLL_ICE 49 -#define SV_SCROLL_CHAOS 50 -#define SV_SCROLL_RUMOR 51 -#define SV_SCROLL_ARTIFACT 52 -#define SV_SCROLL_NOTHING 53 - -/* The "sval" codes for TV_POTION */ -#define SV_POTION_WATER 0 -#define SV_POTION_APPLE_JUICE 1 -#define SV_POTION_SLIME_MOLD 2 -#define SV_POTION_BLOOD 3 -#define SV_POTION_SLOWNESS 4 -#define SV_POTION_SALT_WATER 5 -#define SV_POTION_POISON 6 -#define SV_POTION_BLINDNESS 7 -#define SV_POTION_INVIS 8 -#define SV_POTION_CONFUSION 9 -#define SV_POTION_MUTATION 10 -#define SV_POTION_SLEEP 11 -#define SV_POTION_LEARNING 12 -#define SV_POTION_LOSE_MEMORIES 13 -/* xxx */ -#define SV_POTION_RUINATION 15 -#define SV_POTION_DEC_STR 16 -#define SV_POTION_DEC_INT 17 -#define SV_POTION_DEC_WIS 18 -#define SV_POTION_DEC_DEX 19 -#define SV_POTION_DEC_CON 20 -#define SV_POTION_DEC_CHR 21 -#define SV_POTION_DETONATIONS 22 -#define SV_POTION_DEATH 23 -#define SV_POTION_INFRAVISION 24 -#define SV_POTION_DETECT_INVIS 25 -#define SV_POTION_SLOW_POISON 26 -#define SV_POTION_CURE_POISON 27 -#define SV_POTION_BOLDNESS 28 -#define SV_POTION_SPEED 29 -#define SV_POTION_RESIST_HEAT 30 -#define SV_POTION_RESIST_COLD 31 -#define SV_POTION_HEROISM 32 -#define SV_POTION_BESERK_STRENGTH 33 -#define SV_POTION_CURE_LIGHT 34 -#define SV_POTION_CURE_SERIOUS 35 -#define SV_POTION_CURE_CRITICAL 36 -#define SV_POTION_HEALING 37 -#define SV_POTION_STAR_HEALING 38 -#define SV_POTION_LIFE 39 -#define SV_POTION_RESTORE_MANA 40 -#define SV_POTION_RESTORE_EXP 41 -#define SV_POTION_RES_STR 42 -#define SV_POTION_RES_INT 43 -#define SV_POTION_RES_WIS 44 -#define SV_POTION_RES_DEX 45 -#define SV_POTION_RES_CON 46 -#define SV_POTION_RES_CHR 47 -#define SV_POTION_INC_STR 48 -#define SV_POTION_INC_INT 49 -#define SV_POTION_INC_WIS 50 -#define SV_POTION_INC_DEX 51 -#define SV_POTION_INC_CON 52 -#define SV_POTION_INC_CHR 53 -/* xxx */ -#define SV_POTION_AUGMENTATION 55 -#define SV_POTION_ENLIGHTENMENT 56 -#define SV_POTION_STAR_ENLIGHTENMENT 57 -#define SV_POTION_SELF_KNOWLEDGE 58 -#define SV_POTION_EXPERIENCE 59 -#define SV_POTION_RESISTANCE 60 -#define SV_POTION_CURING 61 -#define SV_POTION_INVULNERABILITY 62 -#define SV_POTION_NEW_LIFE 63 - -#define SV_POTION_LAST 63 - -/* The "sval" codes for TV_POTION2 */ -#define SV_POTION2_MIMIC 1 -#define SV_POTION2_CURE_LIGHT_SANITY 14 -#define SV_POTION2_CURE_SERIOUS_SANITY 15 -#define SV_POTION2_CURE_CRITICAL_SANITY 16 -#define SV_POTION2_CURE_SANITY 17 -#define SV_POTION2_CURE_WATER 18 - -#define SV_POTION2_LAST 18 - -/* The "sval" codes for TV_FOOD */ -#define SV_FOOD_POISON 0 -#define SV_FOOD_BLINDNESS 1 -#define SV_FOOD_PARANOIA 2 -#define SV_FOOD_CONFUSION 3 -#define SV_FOOD_HALLUCINATION 4 -#define SV_FOOD_PARALYSIS 5 -#define SV_FOOD_WEAKNESS 6 -#define SV_FOOD_SICKNESS 7 -#define SV_FOOD_STUPIDITY 8 -#define SV_FOOD_NAIVETY 9 -#define SV_FOOD_UNHEALTH 10 -#define SV_FOOD_DISEASE 11 -#define SV_FOOD_CURE_POISON 12 -#define SV_FOOD_CURE_BLINDNESS 13 -#define SV_FOOD_CURE_PARANOIA 14 -#define SV_FOOD_CURE_CONFUSION 15 -#define SV_FOOD_CURE_SERIOUS 16 -#define SV_FOOD_RESTORE_STR 17 -#define SV_FOOD_RESTORE_CON 18 -#define SV_FOOD_RESTORING 19 -/* many missing mushrooms */ -#define SV_FOOD_BISCUIT 32 -#define SV_FOOD_JERKY 33 -#define SV_FOOD_RATION 35 -#define SV_FOOD_SLIME_MOLD 36 -#define SV_FOOD_WAYBREAD 37 -#define SV_FOOD_PINT_OF_ALE 38 -#define SV_FOOD_PINT_OF_WINE 39 -#define SV_FOOD_ATHELAS 40 -#define SV_FOOD_GREAT_HEALTH 41 -#define SV_FOOD_FORTUNE_COOKIE 42 - -/* The "sval" codes for TV_BATERIE */ -#define SV_BATERIE_POISON 1 -#define SV_BATERIE_EXPLOSION 2 -#define SV_BATERIE_TELEPORT 3 -#define SV_BATERIE_COLD 4 -#define SV_BATERIE_FIRE 5 -#define SV_BATERIE_ACID 6 -#define SV_BATERIE_LIFE 7 -#define SV_BATERIE_CONFUSION 8 -#define SV_BATERIE_LITE 9 -#define SV_BATERIE_CHAOS 10 -#define SV_BATERIE_TIME 11 -#define SV_BATERIE_MAGIC 12 -#define SV_BATERIE_XTRA_LIFE 13 -#define SV_BATERIE_DARKNESS 14 -#define SV_BATERIE_KNOWLEDGE 15 -#define SV_BATERIE_FORCE 16 -#define SV_BATERIE_LIGHTNING 17 -#define SV_BATERIE_MANA 18 - -/* The "sval" codes for TV_CORPSE */ -#define SV_CORPSE_CORPSE 1 -#define SV_CORPSE_SKELETON 2 -#define SV_CORPSE_HEAD 3 -#define SV_CORPSE_SKULL 4 -#define SV_CORPSE_MEAT 5 - -/* - * Special Object Flags - */ -#define IDENT_SENSE 0x01 /* Item has been "sensed" */ -#define IDENT_FIXED 0x02 /* Item has been "haggled" */ -#define IDENT_EMPTY 0x04 /* Item charges are known */ -#define IDENT_KNOWN 0x08 /* Item abilities are known */ -#define IDENT_STOREB 0x10 /* Item is storebought !!!! */ -#define IDENT_MENTAL 0x20 /* Item information is known */ -#define IDENT_CURSED 0x40 /* Item is temporarily cursed */ - -/* - * Location of objects when they were found - */ -#define OBJ_FOUND_MONSTER 1 -#define OBJ_FOUND_FLOOR 2 -#define OBJ_FOUND_VAULT 3 -#define OBJ_FOUND_SPECIAL 4 -#define OBJ_FOUND_RUBBLE 5 -#define OBJ_FOUND_REWARD 6 -#define OBJ_FOUND_STORE 7 -#define OBJ_FOUND_STOLEN 8 -#define OBJ_FOUND_SELFMADE 9 - -struct obj_theme -{ - byte treasure; - byte combat; - byte magic; - byte tools; -}; - -struct object_kind -{ - u32b name; /* Name (offset) */ - u32b text; /* Text (offset) */ - - byte tval; /* Object type */ - byte sval; /* Object sub type */ - - s32b pval; /* Object extra info */ - s32b pval2; /* Object extra info */ - - s16b to_h; /* Bonus to hit */ - s16b to_d; /* Bonus to damage */ - s16b to_a; /* Bonus to armor */ - - s16b ac; /* Base armor */ - - byte dd; - byte ds; /* Damage dice/sides */ - - s32b weight; /* Weight */ - - s32b cost; /* Object "base cost" */ - - u32b flags1; /* Flags, set 1 */ - u32b flags2; /* Flags, set 2 */ - u32b flags3; /* Flags, set 3 */ - u32b flags4; /* Flags, set 4 */ - u32b flags5; /* Flags, set 5 */ - - byte locale[4]; /* Allocation level(s) */ - byte chance[4]; /* Allocation chance(s) */ - - byte level; /* Level */ - byte extra; /* Something */ - - - byte d_attr; /* Default object attribute */ - char d_char; /* Default object character */ - - - byte x_attr; /* Desired object attribute */ - char x_char; /* Desired object character */ - - - byte flavor; /* Special object flavor (or zero) */ - - bool easy_know; /* This object is always known (if aware) */ - - - bool aware; /* The player is "aware" of the item's effects */ - - bool tried; /* The player has "tried" one of the items */ - - bool know; /* extractable flag for the alchemist */ - - u32b esp; /* ESP flags */ - - byte btval; /* Become Object type */ - byte bsval; /* Become Object sub type */ - bool artifact; /* Is it a normal artifact(already generated) */ - - s16b power; /* Power granted(if any) */ -}; - -struct artifact_type -{ - u32b name; /* Name (offset) */ - u32b text; /* Text (offset) */ - - byte tval; /* Artifact type */ - byte sval; /* Artifact sub type */ - - s16b pval; /* Artifact extra info */ - - s16b to_h; /* Bonus to hit */ - s16b to_d; /* Bonus to damage */ - s16b to_a; /* Bonus to armor */ - - s16b ac; /* Base armor */ - - byte dd; - byte ds; /* Damage when hits */ - - s16b weight; /* Weight */ - - s32b cost; /* Artifact "cost" */ - - u32b flags1; /* Artifact Flags, set 1 */ - u32b flags2; /* Artifact Flags, set 2 */ - u32b flags3; /* Artifact Flags, set 3 */ - u32b flags4; /* Artifact Flags, set 4 */ - u32b flags5; /* Artifact Flags, set 5 */ - - byte level; /* Artifact level */ - byte rarity; /* Artifact rarity */ - - byte cur_num; /* Number created (0 or 1) */ - byte max_num; /* Unused (should be "1") */ - - u32b esp; /* ESP flags */ - - s16b power; /* Power granted(if any) */ -}; - -struct ego_item_type -{ - u32b name; /* Name (offset) */ - u32b text; /* Text (offset) */ - - bool before; /* Before or after the object name ? */ - - byte tval[6]; - byte min_sval[6]; - byte max_sval[6]; - - byte rating; /* Rating boost */ - - byte level; /* Minimum level */ - byte rarity; /* Object rarity */ - byte mrarity; /* Object rarity */ - - s16b max_to_h; /* Maximum to-hit bonus */ - s16b max_to_d; /* Maximum to-dam bonus */ - s16b max_to_a; /* Maximum to-ac bonus */ - - s32b max_pval; /* Maximum pval */ - - s32b cost; /* Ego-item "cost" */ - - byte rar[5]; - u32b flags1[5]; /* Ego-Item Flags, set 1 */ - u32b flags2[5]; /* Ego-Item Flags, set 2 */ - u32b flags3[5]; /* Ego-Item Flags, set 3 */ - u32b flags4[5]; /* Ego-Item Flags, set 4 */ - u32b flags5[5]; /* Ego-Item Flags, set 5 */ - u32b esp[5]; /* ESP flags */ - u32b fego[5]; /* ego flags */ - - s16b power; /* Power granted(if any) */ -}; - -struct object_type -{ - s16b k_idx; /* Kind index (zero if "dead") */ - - byte iy; /* Y-position on map, or zero */ - byte ix; /* X-position on map, or zero */ - - byte tval; /* Item type (from kind) */ - byte sval; /* Item sub-type (from kind) */ - - s32b pval; /* Item extra-parameter */ - s16b pval2; /* Item extra-parameter for some special - items*/ - s32b pval3; /* Item extra-parameter for some special - items*/ - - byte discount; /* Discount (if any) */ - - byte number; /* Number of items */ - - s32b weight; /* Item weight */ - - byte elevel; /* Item exp level */ - s32b exp; /* Item exp */ - - byte name1; /* Artifact type, if any */ - s16b name2; /* Ego-Item type, if any */ - s16b name2b; /* Second Ego-Item type, if any */ - - byte xtra1; /* Extra info type */ - s16b xtra2; /* Extra info index */ - - s16b to_h; /* Plusses to hit */ - s16b to_d; /* Plusses to damage */ - s16b to_a; /* Plusses to AC */ - - s16b ac; /* Normal AC */ - - byte dd; - byte ds; /* Damage dice/sides */ - - s16b timeout; /* Timeout Counter */ - - byte ident; /* Special flags */ - - byte marked; /* Object is marked */ - - u16b note; /* Inscription index */ - u16b art_name; /* Artifact name (random artifacts) */ - - u32b art_flags1; /* Flags, set 1 Alas, these were necessary */ - u32b art_flags2; /* Flags, set 2 for the random artifacts of*/ - u32b art_flags3; /* Flags, set 3 Zangband */ - u32b art_flags4; /* Flags, set 4 PernAngband */ - u32b art_flags5; /* Flags, set 5 PernAngband */ - u32b art_esp; /* Flags, set esp PernAngband */ - - s16b next_o_idx; /* Next object in stack (if any) */ - - s16b held_m_idx; /* Monster holding us (if any) */ - - byte sense; /* Pseudo-id status */ - - byte found; /* How did we find it */ - s16b found_aux1; /* Stores info for found */ - s16b found_aux2; /* Stores info for found */ -}; - -/* Pseudo-id defines */ -#define SENSE_NONE 0 -#define SENSE_CURSED 1 -#define SENSE_AVERAGE 2 -#define SENSE_GOOD_LIGHT 3 -#define SENSE_GOOD_HEAVY 4 -#define SENSE_EXCELLENT 5 -#define SENSE_WORTHLESS 6 -#define SENSE_TERRIBLE 7 -#define SENSE_SPECIAL 8 -#define SENSE_BROKEN 9 -#define SENSE_UNCURSED 10 - -extern object_type o_list[max_o_idx]; -extern object_kind k_info[max_k_idx]; -extern char *k_name; -extern char *k_text; -extern artifact_type a_info[max_a_idx]; -extern char *a_name; -extern char *a_text; -extern header *e_head; -extern ego_item_type e_info[max_e_idx]; -extern char *e_name; -extern char *e_text; - -extern s16b m_bonus(int max, int level); -extern s16b wield_slot_ideal(object_type *o_ptr, bool ideal); -extern s16b wield_slot(object_type *o_ptr); -extern void object_flags(object_type *o_ptr, u32b *f1 = 0, u32b *f2 = 0, u32b *f3 = 0, u32b *f4 = 0, u32b *f5 = 0, u32b *esp = 0); -extern char *lua_object_desc @ object_desc(object_type *o_ptr, int pref, int mode); -extern bool object_out_desc(object_type *o_ptr, FILE *fff, bool trim_down, bool wait_for_it); -extern void inven_item_describe(int item); -extern void inven_item_increase(int item, int num); -extern bool inven_item_optimize(int item); -extern void floor_item_describe(int item); -extern void floor_item_increase(int item, int num); -extern void floor_item_optimize(int item); -extern void delete_object_idx(int o_idx); -extern s16b o_pop(void); -extern errr get_obj_num_prep(void); -extern bool ident_all(void); -extern s16b get_obj_num(int level); -extern s16b lookup_kind(int tval, int sval); -extern void object_wipe(object_type *o_ptr); -extern void object_prep(object_type *o_ptr, int k_idx); -extern void object_copy(object_type *o_ptr, object_type *j_ptr); -extern bool inven_carry_okay(object_type *o_ptr); -extern void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great); -extern bool make_object(object_type *j_ptr, bool good, bool great, obj_theme theme); -extern s16b drop_near(object_type *o_ptr, int chance, int y, int x); -extern object_type *get_object(int item); -extern object_type *new_object(); -extern void end_object(object_type *o_ptr); -extern void identify_pack_fully(void); -extern s16b inven_carry(object_type *o_ptr, bool final); -extern s32b calc_total_weight(void); -extern int get_slot(int slot); -extern bool is_blessed(object_type *o_ptr); -extern cptr sense_desc[1000]; /* 1000 is just a hack for tolua */ -extern void object_pickup(int this_o_idx); - -$static bool lua_is_artifact(object_type *o_ptr) { return artifact_p(o_ptr); } -static bool lua_is_artifact@is_artifact(object_type *o_ptr); - -$static bool lua_is_aware(object_type *o_ptr) { return object_aware_p(o_ptr); } -static bool lua_is_aware@is_aware(object_type *o_ptr); - -$static bool lua_is_known(object_type *o_ptr) { return object_known_p(o_ptr); } -static bool lua_is_known@is_known(object_type *o_ptr); - -$static void lua_set_aware(object_type *o_ptr) { object_aware(o_ptr); } -static void lua_set_aware@set_aware(object_type *o_ptr); - -$static void lua_set_known(object_type *o_ptr) { object_known(o_ptr); } -static void lua_set_known@set_known(object_type *o_ptr); - -extern byte value_check_aux1(object_type *o_ptr); -extern byte value_check_aux1_magic(object_type *o_ptr); -extern byte value_check_aux2(object_type *o_ptr); -extern byte value_check_aux2_magic(object_type *o_ptr); - -extern bool remove_curse_object(object_type *o_ptr, bool all); diff --git a/src/player.pkg b/src/player.pkg deleted file mode 100644 index 9115d7cf..00000000 --- a/src/player.pkg +++ /dev/null @@ -1,3446 +0,0 @@ -/* File: player.pkg */ - -/* - * Purpose: Lua interface defitions for the player. - * To be processed by tolua to generate C source code. - */ - -$#include "angband.h" - -/** @typedef cptr - * @note String - */ -typedef char* cptr; -/** @typedef errr - * @note Number - */ -typedef int errr; -/** @typedef bool - * @note Boolean - */ -typedef unsigned char bool; -/** @typedef byte - * @note Number - */ -typedef unsigned char byte; -/** @typedef s16b - * @note Number - */ -typedef signed short s16b; -/** @typedef u16b - * @note Number - */ -typedef unsigned short u16b; -/** @typedef s32b - * @note Number - */ -typedef signed int s32b; -/** @typedef u32b - * @note Number - */ -typedef unsigned int u32b; - -/** @def PY_MAX_LEVEL - * @note Maximum level - */ -#define PY_MAX_LEVEL 50 - -/** @var player_exp[PY_MAX_LEVEL] - * @brief Number - * @note Array of experience points per level. - */ -extern s32b player_exp[PY_MAX_LEVEL]; - -/** @name Attributes - * @brief Indexes of the various "stats" (hard-coded by savefiles, etc). - * @{ */ -/** @def A_STR - * @note Strength */ -#define A_STR 0 - -/** @def A_INT - * @note Intelligence */ -#define A_INT 1 - -/** @def A_WIS - * @note Wisdom */ -#define A_WIS 2 - -/** @def A_DEX - * @note Dexterity */ -#define A_DEX 3 - -/** @def A_CON - * @note Constitution */ -#define A_CON 4 - -/** @def A_CHR - * @note Charisma */ -#define A_CHR 5 -/** @} */ - -/* Ugly hack, should be in foo-info, the subrace saved to the savefile */ -/** @def SUBRACE_SAVE */ -#define SUBRACE_SAVE 9 - - -/** @name Sex - * @brief Player sex constants (hard-coded by save-files, arrays, etc) - * @{ */ -/** @def SEX_FEMALE */ -#define SEX_FEMALE 0 - -/** @def SEX_MALE */ -#define SEX_MALE 1 - -/** @def SEX_NEUTER */ -#define SEX_NEUTER 2 - - -/** @def MAX_SEXES */ -#define MAX_SEXES 3 -/** @} */ - -/** @name Race flags - * @{ */ -/** @def PR1_EXPERIMENTAL - * @note Is still under developemnt - */ -#define PR1_EXPERIMENTAL 0x00000001L -/* XXX */ -/** @def PR1_RESIST_BLACK_BREATH - * @note Resist black breath - */ -#define PR1_RESIST_BLACK_BREATH 0x00000004L -/** @def PR1_NO_STUN - * @note Never stunned - */ -#define PR1_NO_STUN 0x00000008L -/** @def PR1_XTRA_MIGHT_BOW - * @note Xtra might with bows - */ -#define PR1_XTRA_MIGHT_BOW 0x00000010L -/** @def PR1_XTRA_MIGHT_XBOW - * @note Xtra might with xbows - */ -#define PR1_XTRA_MIGHT_XBOW 0x00000020L -/** @def PR1_XTRA_MIGHT_SLING - * @note Xtra might with slings - */ -#define PR1_XTRA_MIGHT_SLING 0x00000040L -/** @def PR1_AC_LEVEL - * @note More AC with levels - */ -#define PR1_AC_LEVEL 0x00000080L -/** @def PR1_HURT_LITE - * @note Hurt by light - */ -#define PR1_HURT_LITE 0x00000100L -/** @def PR1_VAMPIRE - * @note Vampire - */ -#define PR1_VAMPIRE 0x00000200L -/** @def PR1_UNDEAD - * @note Undead - */ -#define PR1_UNDEAD 0x00000400L -/** @def PR1_NO_CUT - * @note no cuts - */ -#define PR1_NO_CUT 0x00000800L -/** @def PR1_CORRUPT - * @note hack-- corrupted - */ -#define PR1_CORRUPT 0x00001000L -/** @def PR1_NO_FOOD - * @note little gain from food - */ -#define PR1_NO_FOOD 0x00002000L -/** @def PR1_NO_GOD - * @note cannot worship - */ -#define PR1_NO_GOD 0x00004000L -/* XXX */ -/** @def PR1_ELF - * @note Is an elf - */ -#define PR1_ELF 0x00010000L -/** @def PR1_SEMI_WRAITH - * @note Takes damage when going in walls - */ -#define PR1_SEMI_WRAITH 0x00020000L -/** @def PR1_NO_SUBRACE_CHANGE - * @note Impossible to change subrace - */ -#define PR1_NO_SUBRACE_CHANGE 0x00040000L -/* XXX */ -/** @def PR1_ANTIMAGIC - * @note antimagic ... hack - */ -#define PR1_ANTIMAGIC 0x00100000L -/** @def PR1_MOLD_FRIEND - * @note Not attacked by molds wielded - */ -#define PR1_MOLD_FRIEND 0x00200000L -/** @def PR1_GOD_FRIEND - * @note Better grace - */ -#define PR1_GOD_FRIEND 0x00400000L -/* XXX */ -/** @def PR1_INNATE_SPELLS - * @note KNown all spells, only need books - */ -#define PR1_INNATE_SPELLS 0x01000000L -/* XXX */ -/* XXX */ -/** @def PR1_EASE_STEAL - * @note Gain xp by stealing - */ -#define PR1_EASE_STEAL 0x08000000L -/* XXX */ -/* XXX */ -/* XXX */ -/* XXX */ - -/* XXX */ -/** @def PR2_ASTRAL - * @note Is it an astral being coming from th halls of mandos ? - */ -#define PR2_ASTRAL 0x00000002L -/* XXX */ -/** @} */ - -/** @name Notice flags - * @brief Bit flags for the "p_ptr->notice" variable - * @{ */ -/** @def PN_COMBINE - * @note Combine the pack - */ -#define PN_COMBINE 0x00000001L -/** @def PN_REORDER - * @note Reorder the pack - */ -#define PN_REORDER 0x00000002L -/* xxx (many) */ -/** @} */ - - -/** @name Update flags - * @brief Bit flags for the "p_ptr->update" variable - * @{ */ -/** @def PU_BONUS - * @note Calculate bonuses - */ -#define PU_BONUS 0x00000001L -/** @def PU_TORCH - * @note Calculate torch radius - */ -#define PU_TORCH 0x00000002L -/** @def PU_BODY - * @note Calculate body parts - */ -#define PU_BODY 0x00000004L -/** @def PU_SANITY - * @note Calculate csan and msan - */ -#define PU_SANITY 0x00000008L -/** @def PU_HP - * @note Calculate chp and mhp - */ -#define PU_HP 0x00000010L -/** @def PU_MANA - * @note Calculate csp and msp - */ -#define PU_MANA 0x00000020L -/** @def PU_SPELLS - * @note Calculate spells - */ -#define PU_SPELLS 0x00000040L -/** @def PU_POWERS - * @note Calculate powers - */ -#define PU_POWERS 0x00000080L -/* xxx (many) */ -/** @def PU_UN_VIEW - * @note Forget view - */ -#define PU_UN_VIEW 0x00010000L -/* xxx (many) */ -/** @def PU_VIEW - * @note Update view - */ -#define PU_VIEW 0x00100000L -/** @def PU_MON_LITE - * @note Update monster light - */ -#define PU_MON_LITE 0x00200000L -/* xxx */ -/** @def PU_MONSTERS - * @note Update monsters - */ -#define PU_MONSTERS 0x01000000L -/** @def PU_DISTANCE - * @note Update distances - */ -#define PU_DISTANCE 0x02000000L -/* xxx */ -/** @def PU_FLOW - * @note Update flow - */ -#define PU_FLOW 0x10000000L -/* xxx (many) */ -/** @} */ - - -/** @name Redraw flags - * @brief Bit flags for the "p_ptr->redraw" variable - * @{ */ -/** @def PR_MISC - * @note Display Race/Class - */ -#define PR_MISC 0x00000001L -/** @def PR_TITLE - * @note Display Title - */ -#define PR_TITLE 0x00000002L -/** @def PR_LEV - * @note Display Level - */ -#define PR_LEV 0x00000004L -/** @def PR_EXP - * @note Display Experience - */ -#define PR_EXP 0x00000008L -/** @def PR_STATS - * @note Display Stats - */ -#define PR_STATS 0x00000010L -/** @def PR_ARMOR - * @note Display Armor - */ -#define PR_ARMOR 0x00000020L -/** @def PR_HP - * @note Display Hitpoints - */ -#define PR_HP 0x00000040L -/** @def PR_MANA - * @note Display Mana - */ -#define PR_MANA 0x00000080L -/** @def PR_GOLD - * @note Display Gold - */ -#define PR_GOLD 0x00000100L -/** @def PR_DEPTH - * @note Display Depth - */ -#define PR_DEPTH 0x00000200L -/****/ -/** @def PR_HEALTH - * @note Display Health Bar - */ -#define PR_HEALTH 0x00000800L -/** @def PR_CUT - * @note Display Extra (Cut) - */ -#define PR_CUT 0x00001000L -/** @def PR_STUN - * @note Display Extra (Stun) - */ -#define PR_STUN 0x00002000L -/** @def PR_HUNGER - * @note Display Extra (Hunger) - */ -#define PR_HUNGER 0x00004000L -/** @def PR_PIETY - * @note Display Piety - */ -#define PR_PIETY 0x00008000L -/** @def PR_BLIND - * @note Display Extra (Blind) - */ -#define PR_BLIND 0x00010000L -/** @def PR_CONFUSED - * @note Display Extra (Confused) - */ -#define PR_CONFUSED 0x00020000L -/** @def PR_AFRAID - * @note Display Extra (Afraid) - */ -#define PR_AFRAID 0x00040000L -/** @def PR_POISONED - * @note Display Extra (Poisoned) - */ -#define PR_POISONED 0x00080000L -/** @def PR_STATE - * @note Display Extra (State) - */ -#define PR_STATE 0x00100000L -/** @def PR_SPEED - * @note Display Extra (Speed) - */ -#define PR_SPEED 0x00200000L -/** @def PR_STUDY - * @note Display Extra (Study) - */ -#define PR_STUDY 0x00400000L -/** @def PR_SANITY - * @note Display Sanity - */ -#define PR_SANITY 0x00800000L -/** @def PR_EXTRA - * @note Display Extra Info - */ -#define PR_EXTRA 0x01000000L -/** @def PR_BASIC - * @note Display Basic Info - */ -#define PR_BASIC 0x02000000L -/** @def PR_MAP - * @note Display Map - */ -#define PR_MAP 0x04000000L -/** @def PR_WIPE - * @note Hack -- Total Redraw - */ -#define PR_WIPE 0x08000000L -/** @def PR_MH - * @note Display Monster hitpoints - */ -#define PR_MH 0x10000000L -/** @def PR_MH - * @note Display Monster hitpoints - */ -#define PR_MH 0x10000000L -/** @def PR_DTRAP - * @note Display Extra (DTrap) - */ -#define PR_DTRAP 0x20000000L -/* xxx */ -/* xxx */ -/** @} */ - - -/** @name Window flags - * @brief Bit flags for the "p_ptr->window" variable (etc) - * @{ */ -/** @def PW_INVEN - * @note Display inven/equip - */ -#define PW_INVEN 0x00000001L -/** @def PW_EQUIP - * @note Display equip/inven - */ -#define PW_EQUIP 0x00000002L -/* xxx */ -/** @def PW_PLAYER - * @note Display character - */ -#define PW_PLAYER 0x00000008L -/** @def PW_M_LIST - * @note Show monster list - */ -#define PW_M_LIST 0x00000010L -/* xxx */ -/** @def PW_MESSAGE - * @note Display messages - */ -#define PW_MESSAGE 0x00000040L -/** @def PW_OVERHEAD - * @note Display overhead view - */ -#define PW_OVERHEAD 0x00000080L -/** @def PW_MONSTER - * @note Display monster recall - */ -#define PW_MONSTER 0x00000100L -/** @def PW_OBJECT - * @note Display object recall - */ -#define PW_OBJECT 0x00000200L -/* xxx */ -/** @def PW_SNAPSHOT - * @note Display snap-shot - */ -#define PW_SNAPSHOT 0x00000800L -/* xxx */ -/* xxx */ -/** @def PW_BORG_1 - * @note Display borg messages - */ -#define PW_BORG_1 0x00004000L -/** @def PW_BORG_2 - * @note Display borg status - */ -#define PW_BORG_2 0x00008000L -/** @} */ - -/** @name Body parts - * @{ */ -/** @def BODY_WEAPON */ -#define BODY_WEAPON 0 - -/** @def BODY_TORSO */ -#define BODY_TORSO 1 - -/** @def BODY_ARMS */ -#define BODY_ARMS 2 - -/** @def BODY_FINGER */ -#define BODY_FINGER 3 - -/** @def BODY_HEAD */ -#define BODY_HEAD 4 - -/** @def BODY_LEGS */ -#define BODY_LEGS 5 - -/** @def BODY_MAX */ -#define BODY_MAX 6 -/** @} */ - - -/** @struct player_type - */ -struct player_type -{ - /** @structvar lives - * @brief Number - * @note How many times we resurected - */ - s32b lives; - - /** @structvar oldpy - * @brief Number - * @note Previous player location -KMW- - */ - s16b oldpy; - /** @structvar oldpx - * @brief Number - * @note Previous player location -KMW- - */ - s16b oldpx; - - /** @structvar py - * @brief Number - * @note Player location - */ - s16b py; - /** @structvar px - * @brief Number - * @note Player location - */ - s16b px; - - /** @structvar psex - * @brief Number - * @note Sex index - */ - byte psex; - /** @structvar prace - * @brief Number - * @note Race index - */ - byte prace; - /** @structvar pracem - * @brief Number - * @note Race Mod index - */ - byte pracem; - /** @structvar pclass - * @brief Number - * @note Class index - */ - byte pclass; - /** @structvar mimic_form - * @brief Number - * @note Actualy transformation - */ - byte mimic_form; - /** @structvar mimic_level - * @brief Number - * @note Level of the mimic effect - */ - s16b mimic_level; - /** @structvar oops - * @brief Number - * @note Unused - */ - byte oops; - - object_type inventory[INVEN_TOTAL] @inventory_real; - - /** @structvar hitdie - * @brief Number - * @note Hit dice (sides) - */ - byte hitdie; - /** @structvar expfact - * @brief Number - * @note Experience factor - */ - u16b expfact; - - /** @structvar allow_one_death - * @brief Number - * @note Blood of life - */ - byte allow_one_death; - - /** @structvar age - * @brief Number - * @note Characters age - */ - s16b age; - /** @structvar ht - * @brief Number - * @note Height - */ - s16b ht; - /** @structvar wt - * @brief Number - * @note Weight - */ - s16b wt; - /** @structvar sc - * @brief Number - * @note Social Class - */ - s16b sc; - - - /** @structvar au - * @brief Number - * @note Current Gold - */ - s32b au; - - /** @structvar max_exp - * @brief Number - * @note Max experience - */ - s32b max_exp; - /** @structvar exp - * @brief Number - * @note Cur experience - */ - s32b exp; - /** @structvar exp_frac - * @brief Number - * @note Cur exp frac (times 2^16) - */ - u16b exp_frac; - - /** @structvar lev - * @brief Number - * @note Level - */ - s16b lev; - - /** @structvar town_num - * @brief Number - * @note Current town number - */ - s16b town_num; - /** @structvar inside_quest - * @brief Number - * @note Inside quest level - */ - s16b inside_quest; - /** @structvar exit_bldg - * @brief Boolean - * @note Goal obtained in arena? -KMW- - */ - bool exit_bldg; - - /** @structvar wilderness_x - * @brief Number - * @note Coordinates in the wilderness - */ - s32b wilderness_x; - /** @structvar wilderness_y - * @brief Number - */ - s32b wilderness_y; - /** @structvar wild_mode - * @brief Boolean - * @note TRUE = Small map, FLASE = Big map - */ - bool wild_mode; - /** @structvar old_wild_mode - * @brief Boolean - * @note TRUE = Small map, FLASE = Big map - */ - bool old_wild_mode; - - /** @structvar mhp - * @brief Number - * @note Max hit pts - */ - s16b mhp; - /** @structvar chp - * @brief Number - * @note Cur hit pts - */ - s16b chp; - /** @structvar chp_frac - * @brief Number - * @note Cur hit frac (times 2^16) - */ - u16b chp_frac; - /** @structvar hp_mod - * @brief Number - * @note A modificator(permanent) - */ - s16b hp_mod; - - /** @structvar msp - * @brief Number - * @note Max mana pts - */ - s16b msp; - /** @structvar csp - * @brief Number - * @note Cur mana pts - */ - s16b csp; - /** @structvar csp_frac - * @brief Number - * @note Cur mana frac (times 2^16) - */ - u16b csp_frac; - - /** @structvar msane - * @brief Number - * @note Max sanity - */ - s16b msane; - /** @structvar csane - * @brief Number - * @note Cur sanity - */ - s16b csane; - /** @structvar csane_frac - * @brief Number - * @note Cur sanity frac - */ - u16b csane_frac; - - /** @structvar grace - * @brief Number - * @note Your God's appreciation factor. - */ - s32b grace; - /** @structvar pgod - * @brief Number - * @note Your God. - */ - byte pgod; - /** @structvar praying - * @brief Boolean - * @note Praying to your god. - */ - bool praying; - - /** @structvar max_plv - * @brief Number - * @note Max Player Level - */ - s16b max_plv; - - /** @structvar stat_max[6] - * @brief Number - * @note Current "maximal" stat values - */ - s16b stat_max[6]; - /** @structvar stat_cur[6] - * @brief Number - * @note Current "natural" stat values - */ - s16b stat_cur[6]; - - /** @structvar luck_cur - * @brief Number - * @note Current "natural" luck value (range -30 <> 30) - */ - s16b luck_cur; - /** @structvar luck_max - * @brief Number - * @note Current "maximal base" luck value (range -30 <> 30) - */ - s16b luck_max; - /** @structvar luck_base - * @brief Number - * @note Current "base" luck value (range -30 <> 30) - */ - s16b luck_base; - - /** @structvar fast - * @brief Number - * @note Timed -- Fast - */ - s16b fast; - /** @structvar lightspeed - * @brief Number - * @note Timed -- Light Speed - */ - s16b lightspeed; - /** @structvar slow - * @brief Number - * @note Timed -- Slow - */ - s16b slow; - /** @structvar blind - * @brief Number - * @note Timed -- Blindness - */ - s16b blind; - /** @structvar paralyzed - * @brief Number - * @note Timed -- Paralysis - */ - s16b paralyzed; - /** @structvar confused - * @brief Number - * @note Timed -- Confusion - */ - s16b confused; - /** @structvar afraid - * @brief Number - * @note Timed -- Fear - */ - s16b afraid; - /** @structvar image - * @brief Number - * @note Timed -- Hallucination - */ - s16b image; - /** @structvar poisoned - * @brief Number - * @note Timed -- Poisoned - */ - s16b poisoned; - /** @structvar cut - * @brief Number - * @note Timed -- Cut - */ - s16b cut; - /** @structvar stun - * @brief Number - * @note Timed -- Stun - */ - s16b stun; - - /** @structvar protevil - * @brief Number - * @note Timed -- Protection from Evil - */ - s16b protevil; - /** @structvar protgood - * @brief Number - * @note Timed -- Protection from Good - */ - s16b protgood; - /** @structvar protundead - * @brief Number - * @note Timed -- Protection from Undead - */ - s16b protundead; - /** @structvar invuln - * @brief Number - * @note Timed -- Invulnerable - */ - s16b invuln; - /** @structvar hero - * @brief Number - * @note Timed -- Heroism - */ - s16b hero; - /** @structvar shero - * @brief Number - * @note Timed -- Super Heroism - */ - s16b shero; - /** @structvar shield - * @brief Number - * @note Timed -- Shield Spell - */ - s16b shield; - /** @structvar shield_power - * @brief Number - * @note Timed -- Shield Spell Power - */ - s16b shield_power; - /** @structvar shield_opt - * @brief Number - * @note Timed -- Shield Spell options - */ - s16b shield_opt; - /** @structvar blessed - * @brief Number - * @note Timed -- Blessed - */ - s16b blessed; - /** @structvar tim_invis - * @brief Number - * @note Timed -- See Invisible - */ - s16b tim_invis; - /** @structvar tim_infra - * @brief Number - * @note Timed -- Infra Vision - */ - s16b tim_infra; - - /** @structvar oppose_acid - * @brief Number - * @note Timed -- oppose acid - */ - s16b oppose_acid; - /** @structvar oppose_elec - * @brief Number - * @note Timed -- oppose lightning - */ - s16b oppose_elec; - /** @structvar oppose_fire - * @brief Number - * @note Timed -- oppose heat - */ - s16b oppose_fire; - /** @structvar oppose_cold - * @brief Number - * @note Timed -- oppose cold - */ - s16b oppose_cold; - /** @structvar oppose_pois - * @brief Number - * @note Timed -- oppose poison - */ - s16b oppose_pois; - /** @structvar oppose_ld - * @brief Number - * @note Timed -- oppose light & dark - */ - s16b oppose_ld; - /** @structvar oppose_cc - * @brief Number - * @note Timed -- oppose chaos & confusion - */ - s16b oppose_cc; - /** @structvar oppose_ss - * @brief Number - * @note Timed -- oppose sound & shards - */ - s16b oppose_ss; - /** @structvar oppose_nex - * @brief Number - * @note Timed -- oppose nexus - */ - s16b oppose_nex; - - - /** @structvar tim_esp - * @brief Number - * @note Timed ESP - */ - s16b tim_esp; - /** @structvar tim_wraith - * @brief Number - * @note Timed wraithform - */ - s16b tim_wraith; - /** @structvar tim_ffall - * @brief Number - * @note Timed Levitation - */ - s16b tim_ffall; - /** @structvar tim_fly - * @brief Number - * @note Timed Levitation - */ - s16b tim_fly; - /** @structvar tim_fire_aura - * @brief Number - * @note Timed Fire Aura - */ - s16b tim_fire_aura; - /** @structvar tim_regen - * @brief Number - * @note Timed regen - */ - s16b tim_regen; - /** @structvar tim_regen_pow - * @brief Number - * @note Timed regen - */ - s16b tim_regen_pow; - /** @structvar tim_poison - * @brief Number - * @note Timed poison hands - */ - s16b tim_poison; - /** @structvar tim_thunder - * @brief Number - * @note Timed thunderstorm - */ - s16b tim_thunder; - /** @structvar tim_thunder_p1 - * @brief Number - * @note Timed thunderstorm - */ - s16b tim_thunder_p1; - /** @structvar tim_thunder_p2 - * @brief Number - * @note Timed thunderstorm - */ - s16b tim_thunder_p2; - - /** @structvar resist_magic - * @brief Number - * @note Timed Resist Magic (later) - */ - s16b resist_magic; - /** @structvar tim_invisible - * @brief Number - * @note Timed Invisibility - */ - s16b tim_invisible; - /** @structvar tim_inv_pow - * @brief Number - * @note Power of timed invisibility - */ - s16b tim_inv_pow; - /** @structvar tim_mimic - * @brief Number - * @note Timed Mimic - */ - s16b tim_mimic; - /** @structvar tim_lite - * @brief Number - * @note Timed Lite - */ - s16b tim_lite; - /** @structvar holy - * @brief Number - * @note Holy Aura - */ - s16b holy; - /** @structvar walk_water - * @brief Number - * @note Walk over water as a god - */ - s16b walk_water; - /** @structvar tim_mental_barrier - * @brief Number - * @note Sustain Int&Wis - */ - s16b tim_mental_barrier; - /** @structvar strike - * @brief Number - * @note True Strike(+25 hit) - */ - s16b strike; - /** @structvar meditation - * @brief Number - * @note Meditation(+50 mana -25 to hit/to dam) - */ - s16b meditation; - /** @structvar tim_reflect - * @brief Number - * @note Timed Reflection - */ - s16b tim_reflect; - /** @structvar tim_res_time - * @brief Number - * @note Timed Resistance to Time - */ - s16b tim_res_time; - /** @structvar tim_deadly - * @brief Number - * @note Timed deadly blow - */ - s16b tim_deadly; - /** @structvar prob_travel - * @brief Number - * @note Timed probability travel - */ - s16b prob_travel; - /** @structvar disrupt_shield - * @brief Number - * @note Timed disruption shield - */ - s16b disrupt_shield; - /** @structvar parasite - * @brief Number - * @note Timed parasite - */ - s16b parasite; - /** @structvar parasite_r_idx - * @brief Number - * @note Timed parasite monster - */ - s16b parasite_r_idx; - /** @structvar loan - * @brief Number - */ - u32b loan; - /** @structvar loan_time - * @brief Number - * @note Timer -- loan - */ - u32b loan_time; - /** @structvar tim_magic_breath - * @brief Number - * @note Magical breathing -- can breath anywhere - */ - s16b tim_magic_breath; - /** @structvar tim_water_breath - * @brief Number - * @note Water breathing -- can breath underwater - */ - s16b tim_water_breath; - - /** @structvar immov_cntr - * @brief Number - * @note Timed -- Last ``immovable'' command. - */ - s16b immov_cntr; - - /** @structvar music_extra - * @brief Number - * @note Music songs - */ - u32b music_extra; - /** @structvar music_extra2 - * @brief Number - * @note Music songs - */ - u32b music_extra2; - - /** @structvar chaos_patron - * @brief Number - */ - s16b chaos_patron; - - /** @structvar recall_dungeon - * @brief Number - * @note Recall in which dungeon - */ - s16b recall_dungeon; - /** @structvar word_recall - * @brief Number - * @note Word of recall counter - */ - s16b word_recall; - - /** @structvar energy - * @brief Number - * @note Current energy - */ - s32b energy; - - /** @structvar food - * @brief Number - * @note Current nutrition - */ - s16b food; - - /** @structvar confusing - * @brief Number - * @note Glowing hands - */ - byte confusing; - /** @structvar searching - * @brief Number - * @note Currently searching - */ - byte searching; - - /** @structvar new_spells - * @brief Number - * @note Number of spells available - */ - s16b new_spells; - - /** @structvar old_spells - * @brief Number - */ - s16b old_spells; - - /** @structvar xtra_spells - * @brief Number - * @note Number of xtra spell learned(via potion) - */ - s16b xtra_spells; - - /** @structvar cur_lite - * @brief Number - * @note Radius of lite (if any) - */ - s16b cur_lite; - - /*** Extra flags -- used for lua and easying stuff ***/ - /** @structvar xtra_f1 - * @brief Number - */ - u32b xtra_f1; - /** @structvar xtra_f2 - * @brief Number - */ - u32b xtra_f2; - /** @structvar xtra_f3 - * @brief Number - */ - u32b xtra_f3; - /** @structvar xtra_f4 - * @brief Number - */ - u32b xtra_f4; - /** @structvar xtra_f5 - * @brief Number - */ - u32b xtra_f5; - /** @structvar xtra_esp - * @brief Number - */ - u32b xtra_esp; - - /** @structvar pspeed - * @brief Number - * @note Current speed - */ - s16b pspeed; - - /** @structvar notice - * @brief Number - * @note Special Updates (bit flags) - */ - u32b notice; - /** @structvar update - * @brief Number - * @note Pending Updates (bit flags) - */ - u32b update; - /** @structvar redraw - * @brief Number - * @note Normal Redraws (bit flags) - */ - u32b redraw; - /** @structvar window - * @brief Number - * @note Window Redraws (bit flags) - */ - u32b window; - - /** @structvar stat_use[6] - * @brief Number - * @note Current modified stats - */ - s16b stat_use[6]; - /** @structvar stat_top[6] - * @brief Number - * @note Maximal modified stats - */ - s16b stat_top[6]; - - /** @structvar stat_add[6] - * @brief Number - * @note Modifiers to stat values - */ - s16b stat_add[6]; - /** @structvar stat_ind[6] - * @brief Number - * @note Indexes into stat tables - */ - s16b stat_ind[6]; - /** @structvar stat_cnt[6] - * @brief Number - * @note Counter for temporary drains - */ - s16b stat_cnt[6]; - /** @structvar stat_los[6] - * @brief Number - * @note Amount of temporary drains - */ - s16b stat_los[6]; - - /** @structvar immune_acid - * @brief Boolean - * @note Immunity to acid - */ - bool immune_acid; - /** @structvar immune_elec - * @brief Boolean - * @note Immunity to lightning - */ - bool immune_elec; - /** @structvar immune_fire - * @brief Boolean - * @note Immunity to fire - */ - bool immune_fire; - /** @structvar immune_cold - * @brief Boolean - * @note Immunity to cold - */ - bool immune_cold; - /** @structvar immune_neth - * @brief Boolean - * @note Immunity to nether - */ - bool immune_neth; - - /** @structvar resist_acid - * @brief Boolean - * @note Resist acid - */ - bool resist_acid; - /** @structvar resist_elec - * @brief Boolean - * @note Resist lightning - */ - bool resist_elec; - /** @structvar resist_fire - * @brief Boolean - * @note Resist fire - */ - bool resist_fire; - /** @structvar resist_cold - * @brief Boolean - * @note Resist cold - */ - bool resist_cold; - /** @structvar resist_pois - * @brief Boolean - * @note Resist poison - */ - bool resist_pois; - - /** @structvar resist_conf - * @brief Boolean - * @note Resist confusion - */ - bool resist_conf; - /** @structvar resist_sound - * @brief Boolean - * @note Resist sound - */ - bool resist_sound; - /** @structvar resist_lite - * @brief Boolean - * @note Resist light - */ - bool resist_lite; - /** @structvar resist_dark - * @brief Boolean - * @note Resist darkness - */ - bool resist_dark; - /** @structvar resist_chaos - * @brief Boolean - * @note Resist chaos - */ - bool resist_chaos; - /** @structvar resist_disen - * @brief Boolean - * @note Resist disenchant - */ - bool resist_disen; - /** @structvar resist_shard - * @brief Boolean - * @note Resist shards - */ - bool resist_shard; - /** @structvar resist_nexus - * @brief Boolean - * @note Resist nexus - */ - bool resist_nexus; - /** @structvar resist_blind - * @brief Boolean - * @note Resist blindness - */ - bool resist_blind; - /** @structvar resist_neth - * @brief Boolean - * @note Resist nether - */ - bool resist_neth; - /** @structvar resist_fear - * @brief Boolean - * @note Resist fear - */ - bool resist_fear; - /** @structvar resist_continuum - * @brief Boolean - * @note Resist space-time continuum disruption - */ - bool resist_continuum; - - /** @structvar sensible_fire - * @brief Boolean - * @note Fire does more damage on the player - */ - bool sensible_fire; - /** @structvar sensible_lite - * @brief Boolean - * @note Lite does more damage on the player and blinds her/him - */ - bool sensible_lite; - - /** @structvar reflect - * @brief Boolean - * @note Reflect 'bolt' attacks - */ - bool reflect; - /** @structvar sh_fire - * @brief Boolean - * @note Fiery 'immolation' effect - */ - bool sh_fire; - /** @structvar sh_elec - * @brief Boolean - * @note Electric 'immolation' effect - */ - bool sh_elec; - /** @structvar wraith_form - * @brief Boolean - * @note wraithform - */ - bool wraith_form; - - /** @structvar anti_magic - * @brief Boolean - * @note Anti-magic - */ - bool anti_magic; - /** @structvar anti_tele - * @brief Boolean - * @note Prevent teleportation - */ - bool anti_tele; - - /** @structvar sustain_str - * @brief Boolean - * @note Keep strength - */ - bool sustain_str; - /** @structvar sustain_int - * @brief Boolean - * @note Keep intelligence - */ - bool sustain_int; - /** @structvar sustain_wis - * @brief Boolean - * @note Keep wisdom - */ - bool sustain_wis; - /** @structvar sustain_dex - * @brief Boolean - * @note Keep dexterity - */ - bool sustain_dex; - /** @structvar sustain_con - * @brief Boolean - * @note Keep constitution - */ - bool sustain_con; - /** @structvar sustain_chr - * @brief Boolean - * @note Keep charisma - */ - bool sustain_chr; - - /** @structvar aggravate - * @brief Boolean - * @note Aggravate monsters - */ - bool aggravate; - /** @structvar teleport - * @brief Boolean - * @note Random teleporting - */ - bool teleport; - - /** @structvar exp_drain - * @brief Boolean - * @note Experience draining - */ - bool exp_drain; - /** @structvar drain_mana - * @brief Number - * @note mana draining - */ - byte drain_mana; - /** @structvar drain_life - * @brief Number - * @note hp draining - */ - byte drain_life; - - /** @structvar magical_breath - * @brief Boolean - * @note Magical breathing -- can breath anywhere - */ - bool magical_breath; - /** @structvar water_breath - * @brief Boolean - * @note Water breathing -- can breath underwater - */ - bool water_breath; - /** @structvar climb - * @brief Boolean - * @note Can climb mountains - */ - bool climb; - /** @structvar fly - * @brief Boolean - * @note Can fly over some features - */ - bool fly; - /** @structvar ffall - * @brief Boolean - * @note No damage falling - */ - bool ffall; - /** @structvar lite - * @brief Boolean - * @note Permanent light - */ - bool lite; - /** @structvar free_act - * @brief Boolean - * @note Never paralyzed - */ - bool free_act; - /** @structvar see_inv - * @brief Boolean - * @note Can see invisible - */ - bool see_inv; - /** @structvar regenerate - * @brief Boolean - * @note Regenerate hit pts - */ - bool regenerate; - /** @structvar hold_life - * @brief Boolean - * @note Resist life draining - */ - bool hold_life; - /** @structvar telepathy - * @brief Number - * @note Telepathy - */ - u32b telepathy; - /** @structvar slow_digest - * @brief Boolean - * @note Slower digestion - */ - bool slow_digest; - /** @structvar bless_blade - * @brief Boolean - * @note Blessed blade - */ - bool bless_blade; - /** @structvar xtra_might - * @brief Number - * @note Extra might bow - */ - byte xtra_might; - /** @structvar impact - * @brief Boolean - * @note Earthquake blows - */ - bool impact; - /** @structvar auto_id - * @brief Boolean - * @note Auto id items - */ - bool auto_id; - - /** @structvar dis_to_h - * @brief Number - * @note Known bonus to hit - */ - s16b dis_to_h; - /** @structvar dis_to_d - * @brief Number - * @note Known bonus to dam - */ - s16b dis_to_d; - /** @structvar dis_to_a - * @brief Number - * @note Known bonus to ac - */ - s16b dis_to_a; - - /** @structvar dis_ac - * @brief Number - * @note Known base ac - */ - s16b dis_ac; - - /** @structvar to_m - * @brief Number - * @note Bonus to mana - */ - s16b to_m; - /** @structvar to_s - * @brief Number - * @note Bonus to spell - */ - s16b to_s; - /** @structvar to_h - * @brief Number - * @note Bonus to hit - */ - s16b to_h; - /** @structvar to_d - * @brief Number - * @note Bonus to dam - */ - s16b to_d; - /** @structvar to_a - * @brief Number - * @note Bonus to ac - */ - s16b to_a; - - /** @structvar to_h_melee - * @brief Number - * @note Bonus to hit - */ - s16b to_h_melee; - /** @structvar to_d_melee - * @brief Number - * @note Bonus to dam - */ - s16b to_d_melee; - - /** @structvar to_h_ranged - * @brief Number - * @note Bonus to hit - */ - s16b to_h_ranged; - /** @structvar to_d_ranged - * @brief Number - * @note Bonus to dam - */ - s16b to_d_ranged; - - /** @structvar num_blow - * @brief Number - * @note Number of blows - */ - s16b num_blow; - /** @structvar num_fire - * @brief Number - * @note Number of shots - */ - s16b num_fire; - - /** @structvar ac - * @brief Number - * @note Base ac - */ - s16b ac; - - /** @structvar antimagic - * @brief Number - * @note Power of the anti magic field - */ - byte antimagic; - /** @structvar antimagic_dis - * @brief Number - * @note Radius of the anti magic field - */ - byte antimagic_dis; - - /** @structvar see_infra - * @brief Number - * @note Infravision range - */ - s16b see_infra; - - /** @structvar skill_dis - * @brief Number - * @note Skill: Disarming - */ - s16b skill_dis; - /** @structvar skill_dev - * @brief Number - * @note Skill: Magic Devices - */ - s16b skill_dev; - /** @structvar skill_sav - * @brief Number - * @note Skill: Saving throw - */ - s16b skill_sav; - /** @structvar skill_stl - * @brief Number - * @note Skill: Stealth factor - */ - s16b skill_stl; - /** @structvar skill_srh - * @brief Number - * @note Skill: Searching ability - */ - s16b skill_srh; - /** @structvar skill_fos - * @brief Number - * @note Skill: Searching frequency - */ - s16b skill_fos; - /** @structvar skill_thn - * @brief Number - * @note Skill: To hit (normal) - */ - s16b skill_thn; - /** @structvar skill_thb - * @brief Number - * @note Skill: To hit (shooting) - */ - s16b skill_thb; - /** @structvar skill_tht - * @brief Number - * @note Skill: To hit (throwing) - */ - s16b skill_tht; - /** @structvar skill_dig - * @brief Number - * @note Skill: Digging - */ - s16b skill_dig; - - /** @structvar skill_points - * @brief Number - */ - s16b skill_points; - - /** @structvar control - * @brief Number - * @note Controlled monster - */ - s16b control; - /** @structvar control_dir - * @brief Number - * @note Controlled monster - */ - byte control_dir; - /** @structvar companion_killed - * @brief Number - * @note Number of companion death - */ - s16b companion_killed; - /** @structvar black_breath - * @brief Boolean - * @note The Tolkien's Black Breath - */ - bool black_breath; - /** @structvar body_monster - * @brief Number - * @note In which body is the player - */ - u16b body_monster; - - /** @structvar body_parts[28] - * @brief Number - * @note Various body modifiers - */ - byte body_parts[28]; - - /** @structvar powers_mod[POWER_MAX] - * @brief Boolean - * @note Intrinsinc powers - */ - bool powers_mod[POWER_MAX]; - /** @structvar powers[POWER_MAX] - * @brief Boolean - */ - bool powers[POWER_MAX]; - - /* Corruptions */ - bool corrupt_anti_teleport_stopped; - - /* Astral */ - /** @structvar astral - * @brief Boolean - * @note We started at the bottom ? - */ - bool astral; - - /*** Temporary fields ***/ - - /** @structvar leaving - * @brief Boolean - * @note True if player is leaving - */ - bool leaving; -}; - -/** - * Corruptions - */ -#define CORRUPT_BALROG_AURA 0 -#define CORRUPT_BALROG_WINGS 1 -#define CORRUPT_BALROG_STRENGTH 2 -#define CORRUPT_BALROG_FORM 3 -#define CORRUPT_DEMON_SPIRIT 4 -#define CORRUPT_DEMON_HIDE 5 -#define CORRUPT_DEMON_BREATH 6 -#define CORRUPT_DEMON_REALM 7 -#define CORRUPT_RANDOM_TELEPORT 8 -#define CORRUPT_ANTI_TELEPORT 9 -#define CORRUPT_TROLL_BLOOD 10 -#define CORRUPT_VAMPIRE_TEETH 11 -#define CORRUPT_VAMPIRE_STRENGTH 12 -#define CORRUPT_VAMPIRE_VAMPIRE 13 -#define MUT1_SPIT_ACID 14 -#define MUT1_BR_FIRE 15 -#define MUT1_HYPN_GAZE 16 -#define MUT1_TELEKINES 17 -#define MUT1_VTELEPORT 18 -#define MUT1_MIND_BLST 19 -#define MUT1_VAMPIRISM 20 -#define MUT1_SMELL_MET 21 -#define MUT1_SMELL_MON 22 -#define MUT1_BLINK 23 -#define MUT1_EAT_ROCK 24 -#define MUT1_SWAP_POS 25 -#define MUT1_SHRIEK 26 -#define MUT1_ILLUMINE 27 -#define MUT1_DET_CURSE 28 -#define MUT1_BERSERK 29 -#define MUT1_MIDAS_TCH 30 -#define MUT1_GROW_MOLD 31 -#define MUT1_RESIST 32 -#define MUT1_EARTHQUAKE 33 -#define CORRUPTIONS_MAX 34 - -extern bool player_has_corruption(int corruption_idx); -extern void player_gain_corruption(int corruption_idx); - -/** @name Spellbinder triggers - * @{ */ -/** @def SPELLBINDER_HP75 - * @note Trigger spellbinder at 75% maximum hit points */ -#define SPELLBINDER_HP75 1 - -/** @def SPELLBINDER_HP50 - * @note Trigger spellbinder at 50% maximum hit points */ -#define SPELLBINDER_HP50 2 - -/** @def SPELLBINDER_HP25 - * @note Trigger spellbinder at 25% maximum hit points */ -#define SPELLBINDER_HP25 3 -/** @} */ - - -/** @struct player_race - */ -struct player_race -{ - /** @structvar title - * @brief Number - * @note Type of race - */ - s32b title; - /** @structvar desc - * @brief Number - */ - s32b desc; - - /** @structvar infra - * @brief Number - * @note Infra-vision range - */ - byte infra; -}; - -/** @struct player_race_mod - */ -struct player_race_mod -{ - /** @structvar title - * @brief Number - * @note Type of race mod - */ - s32b title; - /** @structvar desc - * @brief Number - * @note Desc - */ - s32b desc; - /** @structvar place - * @brief Boolean - * @note TRUE = race race modifier, FALSE = Race modifier race - */ - bool place; - - /** @structvar r_adj[6] - * @brief Number - * @note (+) Racial stat bonuses - */ - s16b r_adj[6]; - - /** @structvar luck - * @brief String - * @note Luck - */ - char luck; - /** @structvar mana - * @brief Number - * @note Mana % - */ - s16b mana; - - /** @structvar r_dis - * @brief Number - * @note (+) disarming - */ - s16b r_dis; - /** @structvar r_dev - * @brief Number - * @note (+) magic devices - */ - s16b r_dev; - /** @structvar r_sav - * @brief Number - * @note (+) saving throw - */ - s16b r_sav; - /** @structvar r_stl - * @brief Number - * @note (+) stealth - */ - s16b r_stl; - /** @structvar r_srh - * @brief Number - * @note (+) search ability - */ - s16b r_srh; - /** @structvar r_fos - * @brief Number - * @note (+) search frequency - */ - s16b r_fos; - /** @structvar r_thn - * @brief Number - * @note (+) combat (normal) - */ - s16b r_thn; - /** @structvar r_thb - * @brief Number - * @note (+) combat (shooting) - */ - s16b r_thb; - - /** @structvar r_mhp - * @brief String - * @note (+) Race mod hit-dice modifier - */ - char r_mhp; - /** @structvar r_exp - * @brief Number - * @note (+) Race mod experience factor - */ - s16b r_exp; - - /** @structvar b_age - * @brief String - * @note (+) base age - */ - char b_age; - /** @structvar m_age - * @brief String - * @note (+) mod age - */ - char m_age; - - /** @structvar m_b_ht - * @brief String - * @note (+) base height (males) - */ - char m_b_ht; - /** @structvar m_m_ht - * @brief String - * @note (+) mod height (males) - */ - char m_m_ht; - /** @structvar m_b_wt - * @brief String - * @note (+) base weight (males) - */ - char m_b_wt; - /** @structvar m_m_wt - * @brief String - * @note (+) mod weight (males) - */ - char m_m_wt; - - /** @structvar f_b_ht - * @brief String - * @note (+) base height (females) - */ - char f_b_ht; - /** @structvar f_m_ht - * @brief String - * @note (+) mod height (females) - */ - char f_m_ht; - /** @structvar f_b_wt - * @brief String - * @note (+) base weight (females) - */ - char f_b_wt; - /** @structvar f_m_wt - * @brief String - * @note (+) mod weight (females) - */ - char f_m_wt; - - /** @structvar infra - * @brief String - * @note (+) Infra-vision range - */ - char infra; - - /** @structvar choice[2] - * @brief Number - * @note Legal race choices - */ - u32b choice[2]; - - /** @structvar pclass[2] - * @brief Number - * @note Classes allowed - */ - u32b pclass[2]; - /** @structvar mclass[2] - * @brief Number - * @note Classes restricted - */ - u32b mclass[2]; - - /** @structvar powers[4] - * @brief Number - * @note Powers of the subrace - */ - s16b powers[4]; - - /** @structvar body_parts[BODY_MAX] - * @brief String - * @note To help to decide what to use when body changing - */ - char body_parts[BODY_MAX]; - - /** @structvar flags1 - * @brief Number - */ - u32b flags1; - /** @structvar flags2 - * @brief Number - * @note flags - */ - u32b flags2; - - /** @structvar oflags1[51] - * @brief Number - */ - u32b oflags1[51]; - /** @structvar oflags2[51] - * @brief Number - */ - u32b oflags2[51]; - /** @structvar oflags3[51] - * @brief Number - */ - u32b oflags3[51]; - /** @structvar oflags4[51] - * @brief Number - */ - u32b oflags4[51]; - /** @structvar oflags5[51] - * @brief Number - */ - u32b oflags5[51]; - /** @structvar oesp[51] - * @brief Number - */ - u32b oesp[51]; - /** @structvar opval[51] - * @brief Number - */ - s16b opval[51]; - - /** @structvar g_attr - * @brief Number - * @note Overlay graphic attribute - */ - byte g_attr; - /** @structvar g_char - * @brief String - * @note Overlay graphic character - */ - char g_char; - - /** @structvar skill_basem[MAX_SKILLS] - * @brief String - */ - char skill_basem[MAX_SKILLS]; - /** @structvar skill_base[MAX_SKILLS] - * @brief Number - */ - u32b skill_base[MAX_SKILLS]; - /** @structvar skill_modm[MAX_SKILLS] - * @brief String - */ - char skill_modm[MAX_SKILLS]; - /** @structvar skill_mod[MAX_SKILLS] - * @brief Number - */ - s16b skill_mod[MAX_SKILLS]; -}; - -/** @var energy_use - * @brief Number - * @note Energy use for an action (0 if action does not take a turn). - */ -extern s32b energy_use; - -/** @var player; - * @brief player_type - * @note The player. - */ -extern player_type *p_ptr @ player; - -/** @var max_rp_idx - * @brief Number - * @note Maximum number of entries in player race array. - */ -extern u16b max_rp_idx; - -/** @var race_info[max_rp_idx] - * @brief player_race - * @note Array of player races. - */ -extern player_race race_info[max_rp_idx]; - -/** @var *rp_name - * @brief String - * @note Name of player race. - */ -extern char *rp_name; - -/** @var *rp_text - * @brief String - */ -extern char *rp_text; - -/** @var max_rmp_idx - * @brief Number - * @note Maximum number of player subraces. - */ -extern u16b max_rmp_idx; - -/** @var _mod race_mod_info[max_rmp_idx] - * @brief player_race - * @note Array of player subraces. - */ -extern player_race_mod race_mod_info[max_rmp_idx]; - -/** @var *rmp_name - * @brief String - * @note Name of player subrace. - */ -extern char *rmp_name; - -/** @var *rmp_text - * @brief String - */ -extern char *rmp_text; - -/** @var class_info[max_c_idx] - * @brief player_class - * @note Array of classes. - */ -extern player_class class_info[max_c_idx]; - -/** @var *c_name - * @brief String - * @note Name of player class. - */ -extern char *c_name; - -/** @var *c_text - * @brief String - */ -extern char *c_text; - -/** @var flush_failure - * @brief Boolean - * @note TRUE if flush input on any failure, otherwise FALSE. - */ -extern bool flush_failure; - -/** @fn set_roots(int v, s16b ac, s16b dam) - * @brief Player has timed roots.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @param ac Number \n bonus to AC - * @brief AC bonus - * @param dam Number \n bonus to melee to-damage - * @brief To-damage bonus - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_roots(int v, s16b ac, s16b dam); - -/** @fn set_shadow(int v) - * @brief Player has wraith form.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_shadow(int v); - -/** @fn set_parasite(int v, int r) - * @brief Player has timed parasite.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @param r Number \n index of race in monster race array - * @brief Parasite race index - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * When the time remaining reaches 0, there is an 80% chance the parasite will - * be born, otherwise it will die away. - * @note (see file xtra2.c) - */ -extern bool set_parasite(int v, int r); - -/** @fn set_disrupt_shield(int v) - * @brief Player has timed disrupt shield (feels invulnerable).\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_disrupt_shield(int v); - -/** @fn set_prob_travel(int v) - * @brief Player has timed probability travel.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_prob_travel(int v); - -/** @fn set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag) - * @brief Player's weapon has a spell effect.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @param gf Number \n spell effect - * @brief Spell effect - * @param dam Number \n damage caused by spell effect - * @brief Spell damage - * @param rad Number \n radius of spell effect - * @brief Spell radius - * @param flag Number \n spell projection effect - * @brief Spell properties - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag); - -/** @fn set_tim_deadly(int v) - * @brief Player has deadly accuracy.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_tim_deadly(int v); - -/** @fn set_tim_res_time(int v) - * @brief Player has timed time resistance.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_tim_res_time(int v); - -/** @fn set_tim_reflect(int v) - * @brief Player has timed reflection.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_tim_reflect(int v); - -/** @fn set_meditation(int v) - * @brief Player can meditate (forcibly pseudo-id).\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_meditation(int v); - -/** @fn set_strike(int v) - * @brief Player has true strike.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_strike(int v); - -/** @fn set_walk_water(int v) - * @brief Player can walk on water.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_walk_water(int v); - -/** @fn set_tim_ffall(int v) - * @brief Player has timed levitation (feather-fall).\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_tim_ffall(int v); - -/** @fn set_tim_fire_aura(int v) - * @brief Player has a timed fiery aura.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_tim_fire_aura(int v); - -/** @fn set_tim_regen(int v, int p) - * @brief Player has timed regeneration.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @param p Number \n power of regeneration - * @brief Regeneration power - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_tim_regen(int v, int p); - -/** @fn set_holy(int v) - * @brief Player has a timed holy aura.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_holy(int v); - -/** @fn set_grace(s32b v) - * @brief Set the amount of grace a player has with a god.\n - * @param v Number \n time remaining until effect expires - * (must be in the range -30,000 to 30,000) - * @brief Grace - * @note (see file xtra2.c) - */ -extern void set_grace(s32b v); - -/** @fn set_mimic(int v, int p, int level) - * @brief Player has mimic form.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @param p Number \n the mimic form - * @brief Mimic form - * @param level Number \n the level of the mimic form - * @brief Mimic level - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_mimic(int v, int p, int level); - -/** @fn set_no_breeders(int v) - * @brief Player has timed breeder prevention.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_no_breeders(int v); - -/** @fn set_tim_esp(int v) - * @brief Player has timed ESP.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_tim_esp(int v); - -/** @fn set_invis(int v, int p) - * @brief Player has timed invisibility.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @param p Number \n power of invisibility - * @brief Invisibility power - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_invis(int v, int p); - -/** @fn set_lite(int v) - * @brief Player has timed light.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * Note the use of "PU_VIEW", which is needed to - * memorize any terrain features which suddenly become "visible". - * @note - * Note that blindness is currently the only thing which can affect - * "player_can_see_bold()". - * @note (see file xtra2.c) - */ -extern bool set_lite(int v); - -/** @fn set_blind(int v) - * @brief Player has timed blindness.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * Note the use of "PU_UN_VIEW", which is needed to memorize any terrain - * features which suddenly become "visible". - * @note - * Note that blindness is currently the only thing which can affect - * "player_can_see_bold()". - * @note (see file xtra2.c) - */ -extern bool set_blind(int v); - -/** @fn set_confused(int v) - * @brief Player has timed confusion.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_confused(int v); - -/** @fn set_poisoned(int v) - * @brief Player has timed poisoning.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_poisoned(int v); - -/** @fn set_afraid(int v) - * @brief Player has timed fear.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_afraid(int v); - -/** @fn set_paralyzed(int v) - * @brief Player has timed paralysis.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_paralyzed(int v); - -/** @fn set_image(int v) - * @brief Player has timed hallucination.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * Note that we must redraw the map when hallucination changes. - * @note (see file xtra2.c) - */ -extern bool set_image(int v); - -/** @fn set_fast(int v, int p) - * @brief Player has timed speed boost.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @param p Number \n speed factor - * @brief Speed factor - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_fast(int v, int p); - -/** @fn set_light_speed(int v) - * @brief Player has timed light speed.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_light_speed(int v); - -/** @fn set_slow(int v) - * @brief Player has timed slowness.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_slow(int v); - -/** @fn set_shield(int v, int p, s16b o, s16b d1, s16b d2) - * @brief Player has timed mystic shield.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @param p Number \n bonus to AC - * @brief AC bonus - * @param o Number \n type of shield (see SHIELD_foo fields) - * @brief Shield type - * @param d1 Number \n number of dice for damage roll - * @brief Damage dice - * @param d2 Number \n number of sides per die for damage roll - * @brief Damage sides - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_shield(int v, int p, s16b o, s16b d1, s16b d2); - -/* For calc_bonus hooks */ -/** @fn apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pval = 0, s16b tval = 0, s16b to_h = 0, s16b to_d = 0, s16b to_a = 0) - * @brief Apply flags and values to the player.\n - * @param f1 Number \n flags to be applied to the player - * @brief Flag1 - * @param f2 Number \n flags to be applied to the player - * @brief Flag2 - * @param f3 Number \n flags to be applied to the player - * @brief Flag3 - * @param f4 Number \n flags to be applied to the player - * @brief Flag4 - * @param f5 Number \n flags to be applied to the player - * @brief Flag5 - * @param esp Number \n ESP flag - * @brief Esp flag - * @param pval Number \n PVal to be applied to the player - * @brief Pval - * @param tval Number \n TVal to be applied to the player - * @brief Tval - * @param to_h Number \n to-hit bonus to be applied to the player - * @brief To-hit - * @param to_d Number \n to-damage bonus to be applied to the player - * @brief To-damage - * @param to_a Number \n AC bonus to be applied to the player - * @brief AC - * @note - * f1 can apply to attribuets, spell power, mana capacity, stealth, searching - * ability and frequency, infravision, digging, speed, extra blows, and - * earthquakes. - * @note - * f2 can apply to life capacity, sensible fire, invisibility, free action, - * hold life, immunities (except neither), resistances, reflection, and - * sustains. - * @note - * f3 can apply to extra shots, aggravate, teleport, drain XP, blessed, extra - * might, slow digestion, regeneration, lite, see invisible, wraith form, - * feather fall, fire sheath, electricity sheath, anti magic, and anti - * teleport. - * @note - * f4 can apply to lite, flying, climbing, nether immunity, precognition, and - * anti-magic power and radius. - * @note - * f5 can apply to luck, critical hits, drain mana, drain life, immovable, - * water breath, and magic breath. - * @note - * esp can apply to, well, just telepathy. - * @note - * pval can apply to attributes, luck, spell power, mana capacity, life - * capacity, stealth, search ability and frequency (x 5), infravision, digging - * (x 20), speed, extra blows, critical blows, invisibility (x 10), extra - * might, anti-magic power and radius. - * @note - * tval can apply to lite - * @note - * to_h, to_d, and to_ac can apply to anti-magic power and radius. - * @note (see file xtra1.c) - */ -extern void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pval = 0, s16b tval = 0, s16b to_h = 0, s16b to_d = 0, s16b to_a = 0); - -/** @name Shield effect options - * @{ */ -/** @def SHIELD_NONE */ -#define SHIELD_NONE 0x0000 - -/** @def SHIELD_COUNTER */ -#define SHIELD_COUNTER 0x0001 - -/** @def SHIELD_FIRE */ -#define SHIELD_FIRE 0x0002 - -/** @def SHIELD_GREAT_FIRE */ -#define SHIELD_GREAT_FIRE 0x0004 - -/** @def SHIELD_FEAR */ -#define SHIELD_FEAR 0x0008 -/** @} */ - -/** - * Timered precognition - */ - - -/** @fn set_tim_thunder(int v, int p1, int p2) - * @brief Player has timed thunderstorm.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @param p1 Number \n number of dice for damage roll - * @brief Damage dice - * @param p2 Number \n number of sides per die for damage roll - * @brief Damage sides - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_tim_thunder(int v, int p1, int p2); - -/** @fn set_tim_breath(int v, bool magical) - * @brief Player has timed magic/water breath.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @param magical Boolean \n TRUE if player has magic breath, or FALSE if the - * player has water breath - * @brief Magic breath? - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_tim_breath(int v, bool magical); - -/** @fn set_tim_fly(int v) - * @brief Player has timed flight.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_tim_fly(int v); - -/** @fn set_blessed(int v) - * @brief Player has timed blessing.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * Blessing gives +5 bonus AC and +10 bonus to-hit. - * @note (see file xtra2.c) - */ -extern bool set_blessed(int v); - -/** @fn set_hero(int v) - * @brief Player has timed heroism.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * Heroism gives +10 bonus max HP, +12 bonus to-hit, and resist fear. - * @note (see file xtra2.c) - */ -extern bool set_hero(int v); - -/** @fn set_shero(int v) - * @brief Player has timed berserk strength.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * Berserk strength gives +30 bonus max HP, +24 bonus to-hit, -10 penalty AC, - * and resist fear. - * @note (see file xtra2.c) - */ -extern bool set_shero(int v); - -/** @fn set_protevil(int v) - * @brief Player has timed protection from evil.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * Protection from evil gives the player a chance to repel evil monsters. - * @note (see file xtra2.c) - */ -extern bool set_protevil(int v); - -/** @fn set_protgood(int v) - * @brief Player has timed protection from good.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * Protection from good gives the player a chance to repel good monsters. - * @note (see file xtra2.c) - */ -extern bool set_protgood(int v); - -/** @fn set_protundead(int v) - * @brief Player has timed protection from undead.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * Protection from undead protects against getting the Black Breath in a melee - * attack. - * @note (see file xtra2.c) - */ -extern bool set_protundead(int v); - -/** @fn set_invuln(int v) - * @brief Player has timed invulnerability.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * Invulnerability prevents damage from walking on lava, walking the Straight - * Road, poison, cuts, and starvation. It gives +100 bonus to AC. - * @note - * It can be ended by the player attacking a monster, firing a missile, - * throwing an object, or activating a power. - * @note (see file xtra2.c) - */ -extern bool set_invuln(int v); - -/** @fn set_tim_invis(int v) - * @brief Player has timed "see invisibile".\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_tim_invis(int v); - -/** @fn set_tim_infra(int v) - * @brief Player has timed infravision.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_tim_infra(int v); - -/** @fn set_mental_barrier(int v) - * @brief Player has timed mental barrier.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * Mental barrier sustains intelligence and wisdom. - * @note (see file xtra2.c) - */ -extern bool set_mental_barrier(int v); - -/** @fn set_poison(int v) - * @brief Player has timed poison hands.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_poison(int v); - -/** @fn set_oppose_acid(int v) - * @brief Player has timed acid resistance.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_oppose_acid(int v); - -/** @fn set_oppose_elec(int v) - * @brief Player has timed electricity resistance.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_oppose_elec(int v); - -/** @fn set_oppose_fire(int v) - * @brief Player has timed fire resistance.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_oppose_fire(int v); - -/** @fn set_oppose_cold(int v) - * @brief Player has timed cold resistance.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_oppose_cold(int v); - -/** @fn set_oppose_pois(int v) - * @brief Player has timed poison resistance.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_oppose_pois(int v); - -/** @fn set_oppose_ld(int v) - * @brief Player has timed light and dark resistance.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_oppose_ld(int v); - -/** @fn set_oppose_cc(int v) - * @brief Player has timed chaos and confusion resistance.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_oppose_cc(int v); - -/** @fn set_oppose_ss(int v) - * @brief Player has timed sound and shard resistance.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_oppose_ss(int v); - -/** @fn set_oppose_nex(int v) - * @brief Player has timed nexus resistance.\n - * @param v Number \n time remaining until effect expires - * (must be in the range 0 to 10,000) - * @brief Time remaining - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note (see file xtra2.c) - */ -extern bool set_oppose_nex(int v); - -/** @fn set_stun(int v) - * @brief Player stun level changes.\n - * @param v Number \n the level of stun (must be in the range 0 to 10,000) - * @brief Stun level - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * Note the special code to only notice "range" changes. - * @note - * Some races resist stunning. - * @note - * There is a v chance in 1000 or 1 in 16 that a stun will be the result of - * a vicious blow to the head. If so, the player will lose a point of - * intelligence, or wisdom, or both unless the stat is sustained. - * @note (see file xtra2.c) - */ -extern bool set_stun(int v); - -/** @fn set_cut(int v) - * @brief Player cut level changes.\n - * @param v Number \n the level of cut (must be in the range 0 to 10,000) - * @brief Cut level - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * Note the special code to only notice "range" changes. - * @note - * Some races resist cutting. - * @note - * There is a v chance in 1000 or 1 in 16 that a cut will result in scarrring. - * If so, the player will lose a point of charisma unless it is sustained. - * @note (see file xtra2.c) - */ -extern bool set_cut(int v); - -/** @fn set_food(int v) - * @brief Player hunger level changes.\n - * @param v Number \n the level of cut (must be in the range 0 to 10,000) - * @brief Cut level - * @return Boolean \n TRUE if player notices the effect, otherwise FALSE. - * @note - * The "p_ptr->food" variable can get as large as 20000, allowing the - * addition of the most "filling" item, Elvish Waybread, which adds - * 7500 food units, without overflowing the 32767 maximum limit. - * @note - * Perhaps we should disturb the player with various messages, - * especially messages about hunger status changes. XXX XXX XXX - * @note - * Digestion of food is handled in "dungeon.c", in which, normally, - * the player digests about 20 food units per 100 game turns, more - * when "fast", more when "regenerating", less with "slow digestion", - * but when the player is "gorged", he digests 100 food units per 10 - * game turns, or a full 1000 food units per 100 game turns. - * @note - * Note that the player's speed is reduced by 10 units while gorged, - * so if the player eats a single food ration (5000 food units) when - * full (15000 food units), he will be gorged for (5000/100)*10 = 500 - * game turns, or 500/(100/5) = 25 player turns (if nothing else is - * affecting the player speed). - * @note (see file xtra2.c) - */ -extern bool set_food(int v); - -/** @name Hunger flags - * @brief Player "food" crucial values - * @{ */ -/** @def PY_FOOD_MAX - * @note Food value (Bloated) - */ -#define PY_FOOD_MAX 15000 -/** @def PY_FOOD_FULL - * @note Food value (Normal) - */ -#define PY_FOOD_FULL 10000 -/** @def PY_FOOD_ALERT - * @note Food value (Hungry) - */ -#define PY_FOOD_ALERT 2000 -/** @def PY_FOOD_WEAK - * @note Food value (Weak) - */ -#define PY_FOOD_WEAK 1000 -/** @def PY_FOOD_FAINT - * @note Food value (Fainting) - */ -#define PY_FOOD_FAINT 500 -/** @def PY_FOOD_STARVE - * @note Food value (Starving) - */ -#define PY_FOOD_STARVE 100 -/** @} */ - -/** @fn check_experience(void) - * @brief Check if player experience level has changed.\n - * @note - * If a player has achieved a level for the first time, give a corruption - * (1 chance in 3) if it applies, increase skill points, check ability levels, - * and add a note if notes are taken. - * @note (see file xtra2.c) - */ -extern void check_experience(void); - -/** @fn check_experience_obj(object_type *o_ptr) - * @brief Check if object "o_ptr" experience level has changed.\n - * @param *o_ptr object_type \n the object - * @brief Object - * @note - * If an object has achieved a level for the first time, apply gains. - * @note (see file xtra2.c) - */ -extern void check_experience_obj(object_type *o_ptr); - -/** @fn gain_exp(s32b amount) - * @brief Gain "amount" of experience.\n - * @param amount Number \n the experience points to gain. - * @brief Experience - * @note - * Count the number of objects which will gain experience. The objects share - * equally 2/3 of "amount". Give corruption if it applies. Gain experience. - * If experience is less than maximum, then increase maximum experience by 20% - * of "amount". Check for level change and print experience (check_experience). - * @note (see file xtra2.c) - */ -extern void gain_exp(s32b amount); - -/** @fn lose_exp(s32b amount) - * @brief Decrease experience by "amount".\n - * @param amount Number \n the experience points to lose. - * @brief Experience - * @note - * Experience can not fall below zero. Check for level change and print - * experience (check_experience). - * @note (see file xtra2.c) - */ -extern void lose_exp(s32b amount); - -/** @fn no_lite(void) - * @brief Return true if the player's grid is dark. - * @return Boolean \n TRUE if the player's grid is dark, otherwise FALSE. - * @note (see file cave.c) - */ -extern bool no_lite(void); - -/** @var dun_level - * @brief Number - * @note Current dungeon level - */ -extern s16b dun_level; - - -/** @name Gods - * @{ */ -/** @def GOD_ALL */ -#define GOD_ALL -1 - -/** @def GOD_NONE */ -#define GOD_NONE 0 - -/** @def GOD_ERU */ -#define GOD_ERU 1 - -/** @def GOD_MANWE */ -#define GOD_MANWE 2 - -/** @def GOD_TULKAS */ -#define GOD_TULKAS 3 - -/** @def GOD_MELKOR */ -#define GOD_MELKOR 4 - -/** @def GOD_YAVANNA */ -#define GOD_YAVANNA 5 -/** @} */ - -#define GOD_AULE 6 -#define GOD_VARDA 7 -#define GOD_ULMO 8 -#define GOD_MANDOS 9 - - -/** @fn inc_piety(int god, s32b amt) - * @brief Increase piety for god "god" by amount "amt".\n - * @param god Number \n the god - * @brief God - * @param amt Number \n the amount of piety - * @brief Piety - * @note - * If the player worships all gods, or "god", the piety (grace) will increase. - * @note (see file gods.c) - */ -extern void inc_piety(int god, s32b amt); - -/** @fn abandon_god(int god) - * @brief Player renounces their religion.\n - * @param god Number \n the god - * @brief God - * @note - * If the player worships all gods or "god", the player worships no god and - * the piety score is set to 0. - * @note (see file gods.c) - */ -extern void abandon_god(int god); - -/** @fn wisdom_scale(int max) - * @brief Rescale the wisdom value to a 0 <-> max range.\n - * @param max Number \n the new maximum value of the rescaled wisdom - * @brief New maximum wisdom - * @return Number \n The rescaled value of player wisdom. - * @note (see file gods.c) - */ -extern int wisdom_scale(int max); - -/** @name Powers - * @{ */ -/** @def PWR_SPIT_ACID - * @note Spit acid (GF_ACID) */ -#define PWR_SPIT_ACID 0 - -/** @def PWR_BR_FIRE - * @note Breathe fire (GF_FIRE) */ -#define PWR_BR_FIRE 1 - -/** @def PWR_HYPN_GAZE - * @note Hypnotic gaze */ -#define PWR_HYPN_GAZE 2 - -/** @def PWR_TELEKINES - * @note Telekinesis (fetch an object) */ -#define PWR_TELEKINES 3 - -/** @def PWR_VTELEPORT - * @note Teleport */ -#define PWR_VTELEPORT 4 - -/** @def PWR_MIND_BLST - * @note Mind blast (GF_PSI) */ -#define PWR_MIND_BLST 5 - -/** @def PWR_RADIATION - * @note Emit radiation (GF_NUKE) */ -#define PWR_RADIATION 6 - -/** @def PWR_VAMPIRISM - * @note Vampire bite */ -#define PWR_VAMPIRISM 7 - -/** @def PWR_SMELL_MET - * @note Detect treasure */ -#define PWR_SMELL_MET 8 - -/** @def PWR_SMELL_MON - * @note Detect normal monsters */ -#define PWR_SMELL_MON 9 - -/** @def PWR_BLINK - * @note Short teleport (up to 10 grids) */ -#define PWR_BLINK 10 - -/** @def PWR_EAT_ROCK - * @note Eat rock for food (wall to mud) */ -#define PWR_EAT_ROCK 11 - -/** @def PWR_SWAP_POS - * @note Swap position with a monster */ -#define PWR_SWAP_POS 12 - -/** @def PWR_SHRIEK - * @note Shriek (GF_SOUND and aggravate) */ -#define PWR_SHRIEK 13 - -/** @def PWR_ILLUMINE - * @note Lite area */ -#define PWR_ILLUMINE 14 - -/** @def PWR_DET_CURSE - * @note Detect cursed items in inventory */ -#define PWR_DET_CURSE 15 - -/** @def PWR_BERSERK - * @note Berserk rage */ -#define PWR_BERSERK 16 - -/** @def PWR_POLYMORPH - * @note Polymorph self */ -#define PWR_POLYMORPH 17 - -/** @def PWR_MIDAS_TCH - * @note Midas touch - turn an item into gold */ -#define PWR_MIDAS_TCH 18 - -/** @def PWR_GROW_MOLD - * @note Summon mold */ -#define PWR_GROW_MOLD 19 - -/** @def PWR_RESIST - * @note Temporary elemental resist */ -#define PWR_RESIST 20 - -/** @def PWR_EARTHQUAKE - * @note Cause an earthquake (destruction) */ -#define PWR_EARTHQUAKE 21 - -/** @def PWR_EAT_MAGIC - * @note Absorb energy from magic items */ -#define PWR_EAT_MAGIC 22 - -/** @def PWR_WEIGH_MAG - * @note Report magic affecting player */ -#define PWR_WEIGH_MAG 23 - -/** @def PWR_STERILITY - * @note Player experiences forced abstinence */ -#define PWR_STERILITY 24 - -/** @def PWR_PANIC_HIT - * @note Hit a monster and run away */ -#define PWR_PANIC_HIT 25 - -/** @def PWR_DAZZLE - * @note Stun, confuse, and turn monsters */ -#define PWR_DAZZLE 26 - -/** @def PWR_DARKRAY - * @note Fire a beam of light (GF_LITE) */ -#define PWR_DARKRAY 27 - -/** @def PWR_RECALL - * @note Recall to dungeon/town */ -#define PWR_RECALL 28 - -/** @def PWR_BANISH - * @note Banish evil creatures */ -#define PWR_BANISH 29 - -/** @def PWR_COLD_TOUCH - * @note Bolt of cold (GF_COLD) */ -#define PWR_COLD_TOUCH 30 - -/** @def PWR_LAUNCHER - * @note Increase the multiplier for a thrown object */ -#define PWR_LAUNCHER 31 - -/** @def PWR_PASSWALL - * @note Walk through a wall */ -#define PWR_PASSWALL 32 - -/** @def PWR_DETECT_TD - * @note Detect traps, doors, and stairs */ -#define PWR_DETECT_TD 33 - -/** @def PWR_COOK_FOOD - * @note Create some food */ -#define PWR_COOK_FOOD 34 - -/** @def PWR_UNFEAR - * @note Remove fear */ -#define PWR_UNFEAR 35 - -/** @def PWR_EXPL_RUNE - * @note Set an explosive rune */ -#define PWR_EXPL_RUNE 36 - -/** @def PWR_STM - * @note Bash a wall (stone to mud) */ -#define PWR_STM 37 - -/** @def PWR_POIS_DART - * @note Throw a poison dart (GF_POIS) */ -#define PWR_POIS_DART 38 - -/** @def PWR_MAGIC_MISSILE - * @note Fire a magic missile (GF_MISSILE) */ -#define PWR_MAGIC_MISSILE 39 - -/** @def PWR_GROW_TREE - * @note Grow trees around the player */ -#define PWR_GROW_TREE 40 - -/** @def PWR_BR_COLD - * @note Breathe cold (GF_COLD) */ -#define PWR_BR_COLD 41 - -/** @def PWR_BR_CHAOS - * @note Breathe chaos (GF_CHAOS) */ -#define PWR_BR_CHAOS 42 - -/** @def PWR_BR_ELEM - * @note Breath elements (GF_MISSILE) */ -#define PWR_BR_ELEM 43 - -/** @def PWR_WRECK_WORLD - * @note Change the world (new level) */ -#define PWR_WRECK_WORLD 44 - -/** @def PWR_SCARE - * @note Howl to scare monsters */ -#define PWR_SCARE 45 - -/** @def PWR_REST_LIFE - * @note Restore life levels */ -#define PWR_REST_LIFE 46 - -/** @def PWR_SUMMON_MONSTER - * @note Beastmaster powers (summon pets) */ -#define PWR_SUMMON_MONSTER 47 - -/** @def PWR_NECRO - * @note Cast a necromancy spell */ -#define PWR_NECRO 48 - -/** @def PWR_ROHAN - * @note Use flash aura or light speed jump */ -#define PWR_ROHAN 49 - -/** @def PWR_THUNDER - * @note Use thunder strike, ride the straight road, or go back in town */ -#define PWR_THUNDER 50 - -/** @def PWR_DEATHMOLD - * @note Use deathmold powers:\n - * (a) Teleport to a specific place\n - * (b) Fetch an item\n - * (c) Go up 50'\n - * (d) Go down 50' - */ -#define PWR_DEATHMOLD 51 - -/** @def PWR_HYPNO - * @note Hypnotise a pet */ -#define PWR_HYPNO 52 - -/** @def PWR_UNHYPNO - * @note Unhypnotise a pet */ -#define PWR_UNHYPNO 53 - -/** @def PWR_INCARNATE - * @note Incarnate into a body */ -#define PWR_INCARNATE 54 - -/** @def PWR_MAGIC_MAP - * @note Magic mapping */ -#define PWR_MAGIC_MAP 55 - -/** @def PWR_LAY_TRAP - * @note Set a trap */ -#define PWR_LAY_TRAP 56 - -/** @def PWR_MERCHANT - * @note Appraise item, warp item, or identify item */ -#define PWR_MERCHANT 57 - -/** @def PWR_COMPANION - * @note Create a companion */ -#define PWR_COMPANION 58 - -/** @def PWR_BEAR - * @note Mimic a bear */ -#define PWR_BEAR 59 - -/** @def PWR_DODGE - * @note Report chance of dodging a monster */ -#define PWR_DODGE 60 - -/** @def PWR_BALROG - * @note Mimic a balrog */ -#define PWR_BALROG 61 -/** @} */ - -#define POWER_INVISIBILITY 62 -#define POWER_WEB 63 -#define POWER_COR_SPACE_TIME 64 - - -/* Misc */ -/** @fn do_cmd_throw(void) - * @brief Throw an object from the pack or floor. - * @note - * Note: "unseen" monsters are very hard to hit. - * @note - * Should throwing a weapon do full damage? Should it allow the magic - * to hit bonus of the weapon to have an effect? Should it ever cause - * the item to be destroyed? Should it do any damage at all? - * @note (see file cmd2.c) - */ -extern void do_cmd_throw(void); - -/** @fn change_wild_mode() - * @brief Toggle between big map and little map. - * @note - * If the player is immovable, and the map is big, the player receives a - * warning and is allowed to proceed. - * @note - * If the player is about to be recalled, and the map is big, the map is - * not changed. - * @note - * The map is changed. The game is saved if autosave is set to "levels". - * @note (see file spells2.c) - */ -extern void change_wild_mode(); - -/* Player race flags */ -$static bool lua_test_race_flags(int slot, u32b flags) { if (slot == 1) return (PRACE_FLAG(flags)) ? TRUE : FALSE; else return (PRACE_FLAG2(flags)) ? TRUE : FALSE; } -/** @fn test_race_flags(int slot, u32b flags); - * @brief Test flag "flags" against race flags, race modifier flags, class - * flags, and specialist flags.\n - * @param slot Number \n 1 if testing against first set of flags (PRACE_FLAG), - * 2 if testing against second set of flags (PRACE_FLAG2) - * @brief Flag selecter. - * @param flags Number \n the flags to be tested - * @brief Test flags - * @return Boolean \n TRUE if test flags match any of the corresponding race, - * race modifier, class, and specialist flags. - * @note (see file w_player.c) - */ -static bool lua_test_race_flags@test_race_flags(int slot, u32b flags); - -/** @name Winner states - * @{ */ -/** @def WINNER_NORMAL - * @note Player has killed Morgoth */ -#define WINNER_NORMAL 1 - -/** @def WINNER_ULTRA - * @note Player has killed Melkor */ -#define WINNER_ULTRA 2 -/** @} */ - -/** @var wizard - * @brief Boolean - * @note TRUE if player currently in Wizard mode, otherwise FALSE. - */ -extern bool wizard; - -/** @var total_winner - * @brief Number - * @note Game has been won (see WINNER_foo fields). - */ -extern u16b total_winner; - -/** @var has_won - * @brief Number - * @note Game has been won (see WINNER_foo fields). - */ -extern u16b has_won; - -/** @var joke_monsters - * @brief Boolean - * @note TRUE if allowing joke monsters, otherwise FALSE. - */ -extern bool joke_monsters; - -extern s16b max_dlv[999999]; diff --git a/src/player_c.pkg b/src/player_c.pkg deleted file mode 100644 index f55f9325..00000000 --- a/src/player_c.pkg +++ /dev/null @@ -1,1060 +0,0 @@ -/* File: player_c.pkg */ - -/* - * Purpose: Lua interface defitions for player classes. - * To be processed by tolua to generate C source code. - */ - -$#include "angband.h" - -/** @typedef cptr - * @note String - */ -typedef char* cptr; -/** @typedef errr - * @note Number - */ -typedef int errr; -/** @typedef bool - * @note Boolean - */ -typedef unsigned char bool; -/** @typedef byte - * @note Number - */ -typedef unsigned char byte; -/** @typedef s16b - * @note Number - */ -typedef signed short s16b; -/** @typedef u16b - * @note Number - */ -typedef unsigned short u16b; -/** @typedef s32b - * @note Number - */ -typedef signed int s32b; -/** @typedef u32b - * @note Number - */ -typedef unsigned int u32b; - -/** @struct player_class - * @brief Player class - */ -struct player_class -{ - /** @structvar title - * @brief Number - * @note Type of class - */ - s32b title; - /** @structvar desc - * @brief Number - * @note Small desc of the class - */ - s32b desc; - /** @structvar titles[10] - * @brief Number - */ - s32b titles[10]; - - /** @structvar c_adj[6] - * @brief Number - * @note Class stat modifier - */ - s16b c_adj[6]; - - /** @structvar c_dis - * @brief Number - * @note class disarming - */ - s16b c_dis; - /** @structvar c_dev - * @brief Number - * @note class magic devices - */ - s16b c_dev; - /** @structvar c_sav - * @brief Number - * @note class saving throws - */ - s16b c_sav; - /** @structvar c_stl - * @brief Number - * @note class stealth - */ - s16b c_stl; - /** @structvar c_srh - * @brief Number - * @note class searching ability - */ - s16b c_srh; - /** @structvar c_fos - * @brief Number - * @note class searching frequency - */ - s16b c_fos; - /** @structvar c_thn - * @brief Number - * @note class to hit (normal) - */ - s16b c_thn; - /** @structvar c_thb - * @brief Number - * @note class to hit (bows) - */ - s16b c_thb; - - /** @structvar x_dis - * @brief Number - * @note extra disarming - */ - s16b x_dis; - /** @structvar x_dev - * @brief Number - * @note extra magic devices - */ - s16b x_dev; - /** @structvar x_sav - * @brief Number - * @note extra saving throws - */ - s16b x_sav; - /** @structvar x_stl - * @brief Number - * @note extra stealth - */ - s16b x_stl; - /** @structvar x_srh - * @brief Number - * @note extra searching ability - */ - s16b x_srh; - /** @structvar x_fos - * @brief Number - * @note extra searching frequency - */ - s16b x_fos; - /** @structvar x_thn - * @brief Number - * @note extra to hit (normal) - */ - s16b x_thn; - /** @structvar x_thb - * @brief Number - * @note extra to hit (bows) - */ - s16b x_thb; - - /** @structvar c_mhp - * @brief Number - * @note Class hit-dice adjustment - */ - s16b c_mhp; - /** @structvar c_exp - * @brief Number - * @note Class experience factor - */ - s16b c_exp; - - /** @structvar powers[4] - * @brief Number - * @note Powers of the class - */ - s16b powers[4]; - - /** @structvar spell_book - * @brief Number - * @note Tval of spell books (if any) - */ - s16b spell_book; - /** @structvar spell_stat - * @brief Number - * @note Stat for spells (if any) - */ - s16b spell_stat; - /** @structvar spell_lev - * @brief Number - * @note The higher it is the higher the spells level are - */ - s16b spell_lev; - /** @structvar spell_fail - * @brief Number - * @note The higher it is the higher the spells failure are - */ - s16b spell_fail; - /** @structvar spell_mana - * @brief Number - * @note The higher it is the higher the spells mana are - */ - s16b spell_mana; - /** @structvar spell_first - * @brief Number - * @note Level of first spell - */ - s16b spell_first; - /** @structvar spell_weight - * @brief Number - * @note Weight that hurts spells - */ - s16b spell_weight; - /** @structvar max_spell_level - * @brief Number - * @note Maximun spell level - */ - byte max_spell_level; - /** @structvar magic_max_spell - * @brief Number - * @note Maximun numbner of spells one can learn by natural means - */ - byte magic_max_spell; - - /** @structvar flags1 - * @brief Number - * @note flags - */ - s32b flags1; - - /** @structvar mana - * @brief Number - */ - s16b mana; - /** @structvar blow_num - * @brief Number - */ - s16b blow_num; - /** @structvar blow_wgt - * @brief Number - */ - s16b blow_wgt; - /** @structvar blow_mul - * @brief Number - */ - s16b blow_mul; - /** @structvar extra_blows - * @brief Number - */ - s16b extra_blows; - - /** @structvar sense_base - * @brief Number - */ - s32b sense_base; - /** @structvar sense_pl - * @brief Number - */ - s32b sense_pl; - /** @structvar sense_plus - * @brief Number - */ - s32b sense_plus; - /** @structvar sense_heavy - * @brief Number - */ - byte sense_heavy; - /** @structvar sense_heavy_magic - * @brief Number - */ - byte sense_heavy_magic; -}; - -/** @var *cp_ptr - * @brief player_class - * @note Player class information - */ -extern player_class *cp_ptr; - - - -/** @struct skill_type - * @brief Skills - */ -struct skill_type -{ - /** @structvar name - * @brief Number - * @note Name - */ - u32b name; - /** @structvar desc - * @brief Number - * @note Description - */ - u32b desc; - /** @structvar action_desc - * @brief Number - * @note Action Description - */ - u32b action_desc; - - /** @structvar action_mkey - * @brief Number - * @note Action do to - */ - s16b action_mkey; - - /** @structvar i_value - * @brief Number - * @note Actual value - */ - u32b i_value; - /** @structvar i_mod - * @brief Number - * @note Modifier(1 skill point = modifier skill) - */ - u16b i_mod; - - /** @structvar value - * @brief Number - * @note Actual value - */ - u32b value; - /** @structvar mod - * @brief Number - * @note Modifier(1 skill point = modifier skill) - */ - u16b mod; - /** @structvar rate - * @brief Number - * @note Modifier decreasing rate - */ - s16b rate; - - /** @structvar uses - * @brief Number - * @note Number of times used - */ - u32b uses; - - /** @structvar action[9999] - * @brief Number - * @note List of actions against other skills - */ - s16b action[9999]; - - /** @structvar father - * @brief Number - * @note Father in the skill tree - */ - s16b father; - /** @structvar dev - * @brief Boolean - * @note Is the branch developped ? - */ - bool dev; - /** @structvar order - * @brief Number - * @note Order in the tree - */ - s16b order; - /** @structvar hidden - * @brief Boolean - * @note Innactive - */ - bool hidden; -}; - -/** @def MAX_SKILLS - * @brief Maximum number of skills - */ -#define MAX_SKILLS 100 - - -$static cptr get_skill_name(int i) { return s_name + s_info[i].name; } -/** @fn get_skill_name(int i) - * @brief Return name of skill with index "i" in skill array.\n - * @param i Number \n the index of skill in skill array. - * @brief Skill index - * @return String \n The name of the skill with index "i" in the skill array. - * @note (see file w_play_c.c) - */ -static cptr get_skill_name(int i); - -/** @var old_max_s_idx - * @brief Number - * @note Previous maximum skill index - */ -extern u16b old_max_s_idx; -/** @var max_s_idx - * @brief Number - * @note Current maximum skill index - */ -extern u16b max_s_idx; -/** @var s_info[MAX_SKILLS] - * @brief skill_type - * @note Array of player skills - */ -skill_type s_info[MAX_SKILLS]; - -/** @name Skills - * @{ */ -/** @def SKILL_CONVEYANCE - * @brief Conveyance - * @note - * Ability to learn and use spells from the Conveyance school - */ -#define SKILL_CONVEYANCE 1 - -/** @def SKILL_MANA - * @brief Mana - * @note - * Ability to learn and use spells from the Mana school - */ -#define SKILL_MANA 2 - -/** @def SKILL_FIRE - * @brief Fire - * @note - * Ability to learn and use spells from the Fire school - */ -#define SKILL_FIRE 3 - -/** @def SKILL_AIR - * @brief Air - * @note - * Ability to learn and use spells from the Air school - */ -#define SKILL_AIR 4 - -/** @def SKILL_WATER - * @brief Water - * @note - * Ability to learn and use spells from the Water school - */ -#define SKILL_WATER 5 - -/** @def SKILL_NATURE - * @brief Nature - * @note - * Ability to learn and use spells from the Nature school - */ -#define SKILL_NATURE 6 - -/** @def SKILL_EARTH - * @brief Earth - * @note - * Ability to learn and use spells from the Earth school - */ -#define SKILL_EARTH 7 - -/** @def SKILL_SYMBIOTIC - * @brief Symbiosis - * @note - * Ability to enter in symbiosis with monsters unable to move by themselves - */ -#define SKILL_SYMBIOTIC 8 - -/** @def SKILL_MUSIC - * @brief Music - * @note - * Ability to learn and sing songs - */ -#define SKILL_MUSIC 9 - -/** @def SKILL_DIVINATION - * @brief Divination - * @note - * Ability to learn and use spells from the Divination school - */ -#define SKILL_DIVINATION 10 - -/** @def SKILL_TEMPORAL - * @brief Temporal - * @note - * Ability to learn and use spells from the Temporal school - */ -#define SKILL_TEMPORAL 11 - -/** @def SKILL_DRUID - * @brief Druidistic - * @note - * Ability to learn and use prayers from the Druidistic realm - */ -#define SKILL_DRUID 12 - -/** @def SKILL_DAEMON - * @brief Demonology - * @note - * Ability to use incantations from the Demonblades - */ -#define SKILL_DAEMON 13 - -/** @def SKILL_META - * @brief Meta - * @note - * Ability to learn and use spells from the Meta school - */ -#define SKILL_META 14 - -/** @def SKILL_MAGIC - * @brief Magic - * @note - * General ability to do magic, also affect mana reserves and - * magic device ability. Helps pseudo-id of magic objects - */ -#define SKILL_MAGIC 15 - -/** @def SKILL_COMBAT - * @brief Combat - * @note - * General ability to fight and to pseudo-id armours and weapons. - * It also allows to use heavier armours without penalties - */ -#define SKILL_COMBAT 16 - -/** @def SKILL_MASTERY - * @brief Weaponmastery - * @note - * General ability to use melee weapons - */ -#define SKILL_MASTERY 17 - -/** @def SKILL_SWORD - * @brief Sword-mastery - * @note - * Ability to use swords - */ -#define SKILL_SWORD 18 - -/** @def SKILL_AXE - * @brief Axe-mastery - * @note - * Ability to use axes - */ -#define SKILL_AXE 19 - -/** @def SKILL_POLEARM - * @brief Polearm-mastery - * @note - * Ability to use polearms - */ -#define SKILL_POLEARM 20 - -/** @def SKILL_HAFTED - * @brief Hafted-mastery - * @note - * Ability to use hafted weapons - */ -#define SKILL_HAFTED 21 - -/** @def SKILL_BACKSTAB - * @brief Backstab - * @note - * Ability to backstab fleeing and sleeping monsters to increase damage - */ -#define SKILL_BACKSTAB 22 - -/** @def SKILL_ARCHERY - * @brief Archery - * @note - * General ability to use ranged weapons - */ -#define SKILL_ARCHERY 23 - -/** @def SKILL_SLING - * @brief Sling-mastery - * @note - * Ability to use slings - */ -#define SKILL_SLING 24 - -/** @def SKILL_BOW - * @brief Bow-mastery - * @note - * Ability to use bows - */ -#define SKILL_BOW 25 - -/** @def SKILL_XBOW - * @brief Crossbow-mastery - * @note - * Ability to use crossbows - */ -#define SKILL_XBOW 26 - -/** @def SKILL_BOOMERANG - * @brief Boomerang-mastery - * @note - * Ability to use boomerangs - */ -#define SKILL_BOOMERANG 27 - -/** @def SKILL_SPIRITUALITY - * @brief Spirituality - * @note - * General ability to use spiritual skills and also influence Saving Throw - */ -#define SKILL_SPIRITUALITY 28 - -/** @def SKILL_MINDCRAFT - * @brief Mindcraft - * @note - * Ability to focus the powers of the mind - */ -#define SKILL_MINDCRAFT 29 - -/** @def SKILL_MISC - * @brief Misc - * @note - * Not a real skill, it is only used to regroup some skills - */ -#define SKILL_MISC 30 - -/** @def SKILL_NECROMANCY - * @brief Necromancy - * @note - * Ability to harness the powers of the dead - */ -#define SKILL_NECROMANCY 31 - -/** @def SKILL_MIMICRY - * @brief Mimicry - * @note - * Ability to use cloaks of mimicry to change form - */ -#define SKILL_MIMICRY 32 - -/** @def SKILL_ANTIMAGIC - * @brief Antimagic - * @note - * Ability to generates an antimagic field - */ -#define SKILL_ANTIMAGIC 33 - -/** @def SKILL_RUNECRAFT - * @brief Runecraft - * @note - * Ability to combine magic runes to create your own spells - */ -#define SKILL_RUNECRAFT 34 - -/** @def SKILL_SNEAK - * @brief Sneakiness - * @note - * General ability at the sneakiness skills - */ -#define SKILL_SNEAK 35 - -/** @def SKILL_STEALTH - * @brief Stealth - * @note - * Ability to move unnoticed, silently - */ -#define SKILL_STEALTH 36 - -/** @def SKILL_DISARMING - * @brief Disarming - * @note - * Ability to disarm the various traps - */ -#define SKILL_DISARMING 37 - -/* XXX */ - -/** @def SKILL_ALCHEMY - * @brief Alchemy - * @note - * Ability to use essences to modify/create magic items - */ -#define SKILL_ALCHEMY 39 - -/** @def SKILL_STEALING - * @brief Stealing - * @note - * Ability to steal objects - */ -#define SKILL_STEALING 40 - -/** @def SKILL_SORCERY - * @brief Sorcery - * @note - * Ability to use all the magic schools as if their skill was sorcery - */ -#define SKILL_SORCERY 41 - -/** @def SKILL_HAND - * @brief Barehand-combat - * @note - * Ability to fight barehanded - */ -#define SKILL_HAND 42 - -/** @def SKILL_THAUMATURGY - * @brief Thaumaturgy - * @note - * Ability to gain and cast innate spells - */ -#define SKILL_THAUMATURGY 43 - -/** @def SKILL_SUMMON - * @brief Summoning - * @note - * Ability to create totems from monsters and use them to summon monsters - */ -#define SKILL_SUMMON 44 - -/** @def SKILL_SPELL - * @brief Spell-power - * @note - * Ability to increase the power of spells - */ -#define SKILL_SPELL 45 - -/** @def SKILL_DODGE - * @brief Dodging - * @note - * Ability to dodge blows and bolts - */ -#define SKILL_DODGE 46 - -/** @def SKILL_BEAR - * @brief Bearform-combat - * @note - * Ability to fight in bear form - */ -#define SKILL_BEAR 47 - -/** @def SKILL_LORE - * @brief Monster-lore - * @note - * General ability at the monster related skills, ability to gain experience - * from friendly kills. It also affects the number of companions the player - * can have - */ -#define SKILL_LORE 48 - -/** @def SKILL_PRESERVATION - * @brief Corpse-preservation - * @note - * Ability to not destroy the monster corpse when killing them - */ -#define SKILL_PRESERVATION 49 - -/** @def SKILL_POSSESSION - * @brief Possession - * @note - * Ability to incarnate into monsters - */ -#define SKILL_POSSESSION 50 - -/** @def SKILL_MIND - * @brief Mind - * @note - * Ability to learn and use spells from the Mind school - */ -#define SKILL_MIND 51 - -/** @def SKILL_CRITS - * @brief Critical-hits - * @note - * Ability to deal critical hits with swords < 5lb - */ -#define SKILL_CRITS 52 - -/** @def SKILL_PRAY - * @brief Prayer - * @note - * Ability to learn and use spells from the gods schools - */ -#define SKILL_PRAY 53 - -/** @def SKILL_LEARN - * @brief Spell-learning - * @note - * You should not see that ! that is a BUG! - */ -#define SKILL_LEARN 54 - -/** @def SKILL_UDUN - * @brief Udun - * @note - * Ability to learn and use spells from the Udun school - */ -#define SKILL_UDUN 55 - -/** @def SKILL_DEVICE - * @brief Magic-Device - * @note - * Ease the use of magical devices, such as wands, staves and rods. - * It also helps pseudo-id of magic objects - */ -#define SKILL_DEVICE 56 - -/** @def SKILL_STUN - * @brief Stunning-blows - * @note - * Ability to stun opponents when doing critical hits with hafted weapons > 5lb - */ -#define SKILL_STUN 57 - -/** @def SKILL_BOULDER - * @brief Boulder-throwing - * @note - * Ability to make and throw boulders - */ -#define SKILL_BOULDER 58 - -/** @def SKILL_GEOMANCY - * @brief Geomancy - * @note - * Ability to understand the raw elemental forces of nature and use - * them to advantage. Most spells need Fire/Water/Earth/Air skills - */ -#define SKILL_GEOMANCY 59 - - -/** @def SKILL_MAX - * @note Maximun skill value - */ -#define SKILL_MAX 50000 -/** @def SKILL_STEP - * @note 1 skill point - */ -#define SKILL_STEP 1000 - -/** @} */ - -/** @fn get_skill(int skill) - * @brief Return the value of skill with index "skill" in skill array.\n - * @param skill Number \n the index of skill in skill array. - * @brief Skill index - * @return Number \n The value of the skill with index "skill" in the skill - * array. - * @note (see file skills.c) - */ -extern s16b get_skill(int skill); - -/** @fn get_skill_scale(int skill, u32b scale) - * @brief Return the value of skill with index "skill" in skill array rescaled - * to a maximum of "scale".\n - * @param skill Number \n the index of skill in skill array. - * @brief Skill index - * @param scale Number \n the maximum rescaled skill value. - * @brief Scaled maximum - * @return Number \n The rescaled value of the skill with index "skill" in the - * skill array. - * @note (see file skills.c) - */ -extern s16b get_skill_scale(int skill, u32b scale); - -/** @fn do_get_new_skill() - * @brief Player select one of four new skills. - * @note (see file skills.c) - */ -extern void do_get_new_skill(); - -/** @fn get_melee_skills() - * @brief Return the number of melee skills the player has. - * @return Number \n The number of melee skills. - * @note - * A skill is counted if the value > 0 and the skill is not hidden. - * @note (see file skills.c) - */ -extern s16b get_melee_skills(); - -/** @fn find_skill(cptr name) - * @brief Return the index of skill with name "name".\n - * @param name String \n the name of the skill. - * @brief Skill name - * @return Number \n The index of the skill with name "name" in the skill - * array. - * @note - * The search is case sensitive.\n - * If no skills match the name, -1 is returned. - * @note (see file skills.c) - */ -extern s16b find_skill(cptr name); - -/** @fn find_skill_i(cptr name) - * @brief Return the index of skill with name "name".\n - * @param name String \n the name of the skill. - * @brief Skill name - * @return Number \n The index of the skill with name "name" in the skill - * array. - * @note - * The search ignores case.\n - * If no skills match the name, -1 is returned. - * @note (see file skills.c) - */ -extern s16b find_skill_i(cptr name); - -$static char *get_class_name() {return spp_ptr->title + c_name;} -/** @fn *get_class_name() - * @brief Return the player's class. - * @return String \n The player's type of class + class name - * @note (see file w_play_c.c) - */ -char *get_class_name(); - -$static char *get_race_name() {return rp_ptr->title + rp_name;} -/** @fn *get_race_name() - * @brief Return the player's race. - * @return String \n The player's type of race + race name - * @note (see file w_play_c.c) - */ -char *get_race_name(); - -$static char *get_subrace_name() {return rmp_ptr->title + rmp_name;} -/** @fn *get_subrace_name() - * @brief Return the player's subrace. - * @return String \n The player's type of subrace + subrace name - * @note (see file w_play_c.c) - */ -char *get_subrace_name(); - -/** @struct ability_type - * @brief Abilities - */ -struct ability_type -{ - /** @structvar action_mkey - * @brief Number - * @note Action do to - */ - s16b action_mkey; - - /** @structvar cost - * @brief Number - * @note Skill points cost - */ - s16b cost; - - /** @structvar acquired - * @brief Boolean - * @note Do the player actualylg ot it ? - */ - bool acquired; -}; - -/** @fn find_ability(cptr name) - * @brief Return the index of ability with name "name".\n - * @param name String \n the name of the ability. - * @brief Ability name - * @return Number \n The index of the ability with name "name" in the ability - * array. - * @note - * The search is case sensitive.\n - * If no abilities match the name, -1 is returned. - * @note (see file skills.c) - */ -extern s16b find_ability(cptr name); - -/** @fn do_cmd_ability() - * @brief Allow the user to interact with abilities. - * @note - * This screen is typically used to view abilities, and increase them. - * @note (see file skills.c) - */ -extern void do_cmd_ability(); - -/** @fn has_ability(int ab) - * @brief Does the player have ability "ab"? - * @param ab Number \n the index of ability in ability array. - * @brief Ability index - * @return Boolean \n TRUE if player has the ability, otherwise FALSE. - * @note (see file skills.c) - */ -extern bool has_ability(int ab); - -/** @var max_ab_idx - * @brief Number - * @note Maximum ability index - */ -extern s16b max_ab_idx; -/** @var ab_info[max_ab_idx] - * @brief ability_type - * @note Array of player abilities - */ -extern ability_type ab_info[max_ab_idx]; - -/** @name Abilities - * @{ */ -/** @def AB_SPREAD_BLOWS - * @brief Spread blows - * @note - * If a monster dies to an attack but the player still has blows left - * they won't lose the full turn, allowing them to attack some other - * monster in the same turn. - */ -#define AB_SPREAD_BLOWS 0 - -/** @def AB_TREE_WALK - * @brief Tree walking - * @note - * Allows player to walk in dense forest. - */ -#define AB_TREE_WALK 1 - -/** @def AB_PERFECT_CASTING - * @brief Perfect casting - * @note - * Allows player to reach 0% failure rate on spells. - */ -#define AB_PERFECT_CASTING 2 - -/** @def AB_MAX_BLOW1 - * @brief Extra Max Blow(1) - * @note - * Increases player "maximum possible blows" number by 1. - */ -#define AB_MAX_BLOW1 3 - -/** @def AB_MAX_BLOW2 - * @brief Extra Max Blow(2) - * @note - * Increases player "maximum possible blows" number by 1 - * (Cumulative with Extra Max Blow(1)). - */ -#define AB_MAX_BLOW2 4 - -/** @def AB_AMMO_CREATION - * @brief Ammo creation - * @note - * Allows player to create shots, arrows and bolts from various materials. - */ -#define AB_AMMO_CREATION 5 - -/** @def AB_DEATH_TOUCH - * @brief Touch of death - * @note - * Player melee blows can insta-kill, but they only receive 1/3 of the - * experience for that kill. - */ -#define AB_DEATH_TOUCH 6 - -/** @def AB_CREATE_ART - * @brief Artifact creation - * @note - * In combination with a high alchemy skill this ability will let the player - * design their very own artifacts. - */ -#define AB_CREATE_ART 7 - -/** @def AB_FAR_REACHING - * @brief Far reaching attack - * @note - * The player can attack an enemy one square far using a polearm. - * At high levels of polearm skill, they can even hit two enemies at once. - */ -#define AB_FAR_REACHING 8 - -/** @def AB_TRAPPING - * @brief Trapping - * @note - * Enables player to set traps which harm monsters. - */ -#define AB_TRAPPING 9 - -/** @def AB_UNDEAD_FORM - * @brief Undead form - * @note - * Ability to turn into a weak undead being when you "die". - * You must then kill enough monsters to absorb enough life energy - * to come back to life. - */ -#define AB_UNDEAD_FORM 10 - -/** @} */ - diff --git a/src/plots.c b/src/plots.c index 2fb592b0..f5801ec3 100644 --- a/src/plots.c +++ b/src/plots.c @@ -13,10 +13,6 @@ #include "angband.h" #include <assert.h> -#include "lua/lua.h" -#include "tolua.h" -extern lua_State* L; - /* #define DEBUG_HOOK */ /******** Hooks stuff *********/ @@ -117,16 +113,6 @@ void add_hook_new(int h_idx, bool_ (*hook_f)(void *, void *, void *), cptr name, c->type = HOOK_TYPE_NEW; } -void add_hook_script(int h_idx, char *script, cptr name) -{ - hooks_chain *c = add_hook(h_idx, NULL, name); -#ifdef DEBUG_HOOK - if (wizard) cmsg_format(TERM_VIOLET, "HOOK LUA ADD: %s : %s", name, script); -#endif - sprintf(c->script, "%s", script); - c->type = HOOK_TYPE_LUA; -} - /* Remove a hook */ void del_hook(int h_idx, hook_type hook) { @@ -299,102 +285,6 @@ static bool_ vprocess_hooks_return (int h_idx, char *ret, char *fmt, va_list *ap c = c->next; } } - else if (c->type == HOOK_TYPE_LUA) - { - int i = 0, nb = 0, nbr = 1; - int oldtop = lua_gettop(L), size; - - /* Push the function */ - lua_getglobal(L, c->script); - - /* Push and count the arguments */ - COPY(&real_ap, ap, va_list); - while (fmt[i]) - { - switch (fmt[i++]) - { - case 'd': - case 'l': - tolua_pushnumber(L, va_arg(real_ap, s32b)); - nb++; - break; - case 's': - tolua_pushstring(L, va_arg(real_ap, char*)); - nb++; - break; - case 'O': - tolua_pushusertype(L, (void*)va_arg(real_ap, object_type*), tolua_tag(L, "object_type")); - nb++; - break; - case 'M': - tolua_pushusertype(L, (void*)va_arg(real_ap, monster_type*), tolua_tag(L, "monster_type")); - nb++; - break; - case '(': - case ')': - case ',': - break; - } - } - - /* Count returns */ - nbr += strlen(ret); - - /* Call the function */ - if (lua_call(L, nb, nbr)) - { - cmsg_format(TERM_VIOLET, "ERROR in lua_call while calling '%s' lua hook script. Breaking the hook chain now.", c->script); - return FALSE; - } - - /* Number of returned values, SHOULD be the same as nbr, but I'm paranoid */ - size = lua_gettop(L) - oldtop; - - /* get the extra returns if needed */ - for (i = 0; i < nbr - 1; i++) - { - if ((ret[i] == 'd') || (ret[i] == 'l')) - { - if (lua_isnumber(L, ( -size) + 1 + i)) process_hooks_return[i].num = tolua_getnumber(L, ( -size) + 1 + i, 0); - else process_hooks_return[i].num = 0; - } - else if (ret[i] == 's') - { - if (lua_isstring(L, ( -size) + 1 + i)) process_hooks_return[i].str = tolua_getstring(L, ( -size) + 1 + i, ""); - else process_hooks_return[i].str = NULL; - } - else if (ret[i] == 'O') - { - if (tolua_istype(L, ( -size) + 1 + i, tolua_tag(L, "object_type"), 0)) - process_hooks_return[i].o_ptr = (object_type*)tolua_getuserdata(L, ( -size) + 1 + i, NULL); - else - process_hooks_return[i].o_ptr = NULL; - } - else if (ret[i] == 'M') - { - if (tolua_istype(L, ( -size) + 1 + i, tolua_tag(L, "monster_type"), 0)) - process_hooks_return[i].m_ptr = (monster_type*)tolua_getuserdata(L, ( -size) + 1 + i, NULL); - else - process_hooks_return[i].m_ptr = NULL; - } - else process_hooks_return[i].num = 0; - } - - /* Get the basic return(continue or stop the hook chain) */ - if (tolua_getnumber(L, -size, 0)) - { - lua_settop(L, oldtop); - return (TRUE); - } - if (process_hooks_restart) - { - c = hooks_heads[h_idx]; - process_hooks_restart = FALSE; - } - else - c = c->next; - lua_settop(L, oldtop); - } else if (c->type == HOOK_TYPE_NEW) { /* Skip; handled in process_hooks_new */ diff --git a/src/q_fireprof.c b/src/q_fireprof.c index 35ca7d7e..4405d43b 100644 --- a/src/q_fireprof.c +++ b/src/q_fireprof.c @@ -406,7 +406,7 @@ static bool_ fireproof_stair_hook(char *fmt) } else { - bool ret; + bool_ ret; if (cave[p_ptr->py][p_ptr->px].feat != FEAT_LESS) { diff --git a/src/script.c b/src/script.c index 9a863146..40f43f95 100644 --- a/src/script.c +++ b/src/script.c @@ -12,220 +12,9 @@ #include "angband.h" -#include "lua/lua.h" -#include "lua/lualib.h" -#include "lauxlib.h" -#include "tolua.h" - -int tolua_monster_open (lua_State *L); -int tolua_player_open (lua_State *L); -int tolua_player_c_open (lua_State *L); -int tolua_util_open (lua_State *L); -int tolua_z_pack_open (lua_State *L); -int tolua_object_open (lua_State *L); -int tolua_spells_open (lua_State *L); -int tolua_dungeon_open (lua_State *L); - -/* - * Lua state - */ -lua_State* L = NULL; - -/* ToME Lua error message handler */ -static int tome_errormessage(lua_State *L) -{ - char buf[200]; - cptr str = luaL_check_string(L, 1); - int i = 0, j = 0; - - while (str[i]) - { - if (str[i] == '#') - { - buf[j++] = '$'; - } - else if (str[i] != '\n') - { - buf[j++] = str[i]; - } - else - { - buf[j] = '\0'; - cmsg_format(TERM_VIOLET, "LUA: %s", buf); - j = 0; - } - i++; - } - buf[j] = '\0'; - cmsg_format(TERM_VIOLET, "LUA: %s", buf); - return (0); -} - -static struct luaL_reg tome_iolib[] = -{ - { "_ALERT", tome_errormessage }, -}; - -#define luaL_check_bit(L, n) ((long)luaL_check_number(L, n)) -#define luaL_check_ubit(L, n) ((unsigned long)luaL_check_bit(L, n)) - - -/* - * Monadic bit negation operation - * MONADIC(not, ~) - */ -static int int_not(lua_State* L) -{ - lua_pushnumber(L, ~luaL_check_bit(L, 1)); - return 1; -} - - -/* - * Dyadic integer modulus operation - * DYADIC(mod, %) - */ -static int int_mod(lua_State* L) -{ - lua_pushnumber(L, luaL_check_bit(L, 1) % luaL_check_bit(L, 2)); - return 1; -} - - -/* - * Variable length bitwise AND operation - * VARIADIC(and, &) - */ -static int int_and(lua_State *L) -{ - int n = lua_gettop(L), i; - long w = luaL_check_bit(L, 1); - - for (i = 2; i <= n; i++) w &= luaL_check_bit(L, i); - lua_pushnumber(L, w); - - return 1; -} - - -/* - * Variable length bitwise OR operation - * VARIADIC(or, |) - */ -static int int_or(lua_State *L) -{ - int n = lua_gettop(L), i; - long w = luaL_check_bit(L, 1); - - for (i = 2; i <= n; i++) w |= luaL_check_bit(L, i); - lua_pushnumber(L, w); - - return 1; -} - - -/* - * Variable length bitwise XOR operation - * VARIADIC(xor, ^) - */ -static int int_xor(lua_State *L) -{ - int n = lua_gettop(L), i; - long w = luaL_check_bit(L, 1); - - for (i = 2; i <= n; i++) w ^= luaL_check_bit(L, i); - lua_pushnumber(L, w); - - return 1; -} - - -/* - * Binary left shift operation - * TDYADIC(lshift, <<, , u) - */ -static int int_lshift(lua_State* L) -{ - lua_pushnumber(L, luaL_check_bit(L, 1) << luaL_check_ubit(L, 2)); - return 1; -} - -/* - * Binary logical right shift operation - * TDYADIC(rshift, >>, u, u) - */ -static int int_rshift(lua_State* L) -{ - lua_pushnumber(L, luaL_check_ubit(L, 1) >> luaL_check_ubit(L, 2)); - return 1; -} - -/* - * Binary arithmetic right shift operation - * TDYADIC(arshift, >>, , u) - */ -static int int_arshift(lua_State* L) -{ - lua_pushnumber(L, luaL_check_bit(L, 1) >> luaL_check_ubit(L, 2)); - return 1; -} - - -static const struct luaL_reg bitlib[] = -{ - {"bnot", int_not}, - {"imod", int_mod}, /* "mod" already in Lua math library */ - {"band", int_and}, - {"bor", int_or}, - {"bxor", int_xor}, - {"lshift", int_lshift}, - {"rshift", int_rshift}, - {"arshift", int_arshift}, -}; - -/* - * Initialize lua scripting - */ -static bool_ init_lua_done = FALSE; -void init_lua() -{ - /* Hack -- Do not initialize more than once */ - if (init_lua_done) return; - init_lua_done = TRUE; - - /* Start the interpreter with default stack size */ - L = lua_open(0); - - /* Register the Lua base libraries */ - lua_baselibopen(L); - lua_strlibopen(L); - lua_iolibopen(L); - lua_dblibopen(L); - - /* Register tome lua debug library */ - luaL_openl(L, tome_iolib); - - /* Register the bitlib */ - luaL_openl(L, bitlib); - - /* Register the ToME main APIs */ - tolua_player_open(L); - tolua_player_c_open(L); - tolua_util_open(L); - tolua_z_pack_open(L); - tolua_object_open(L); - tolua_monster_open(L); - tolua_spells_open(L); - tolua_dungeon_open(L); -} void init_lua_init() { - int i, max; - - /* Load the first lua file */ - tome_dofile_anywhere(ANGBAND_DIR_CORE, "init.lua", TRUE); - /* Initialize schooled spells */ schools_init(); school_spells_init(); @@ -237,288 +26,3 @@ void init_lua_init() /* Finish up the corruptions */ init_corruptions(); } - -bool_ tome_dofile(char *file) -{ - char buf[1024]; - int oldtop = lua_gettop(L); - - /* Build the filename */ - path_build(buf, sizeof(buf), ANGBAND_DIR_SCPT, file); - - if (!file_exist(buf)) - { - /* No lua source(.lua), maybe a compiled one(.luo) ? */ - if (suffix(buf, ".lua")) - { - int len = strlen(buf); - buf[len - 1] = 'o'; - if (!file_exist(buf)) - { - cmsg_format(TERM_VIOLET, - "tome_dofile(): file %s(%s) doesn't exist.", file, buf); - return (FALSE); - } - } - } - - lua_dofile(L, buf); - lua_settop(L, oldtop); - - return (TRUE); -} - -bool_ tome_dofile_anywhere(cptr dir, char *file, bool_ test_exist) -{ - char buf[1024]; - int oldtop = lua_gettop(L); - - /* Build the filename */ - path_build(buf, sizeof(buf), dir, file); - - if (!file_exist(buf)) - { - /* No lua source(.lua), maybe a compiled one(.luo) ? */ - if (suffix(buf, ".lua")) - { - int len = strlen(buf); - buf[len - 1] = 'o'; - if (!file_exist(buf)) - { - if (test_exist) - cmsg_format(TERM_VIOLET, - "tome_dofile_anywhere(): file %s(%s) doesn't exist in %s.", dir, file, buf); - return (FALSE); - } - } - } - - lua_dofile(L, buf); - lua_settop(L, oldtop); - - return (TRUE); -} - -int exec_lua(char *file) -{ - int oldtop = lua_gettop(L); - int res; - - if (!lua_dostring(L, file)) - { - int size = lua_gettop(L) - oldtop; - res = tolua_getnumber(L, -size, 0); - } - else - res = 0; - - lua_settop(L, oldtop); - return (res); -} - -cptr string_exec_lua(char *file) -{ - int oldtop = lua_gettop(L); - cptr res; - - if (!lua_dostring(L, file)) - { - int size = lua_gettop(L) - oldtop; - res = tolua_getstring(L, -size, ""); - } - else - res = ""; - lua_settop(L, oldtop); - return (res); -} - -void dump_lua_stack(int min, int max) -{ - int i; - - cmsg_print(TERM_YELLOW, "lua_stack:"); - for (i = min; i <= max; i++) - { - if (lua_isnumber(L, i)) cmsg_format(TERM_YELLOW, "%d [n] = %d", i, tolua_getnumber(L, i, 0)); - else if (lua_isstring(L, i)) cmsg_format(TERM_YELLOW, "%d [s] = '%s'", i, tolua_getstring(L, i, 0)); - } - cmsg_print(TERM_YELLOW, "END lua_stack"); -} - -bool_ call_lua(cptr function, cptr args, cptr ret, ...) -{ - int i = 0, nb = 0, nbr = 0; - int oldtop = lua_gettop(L), size; - va_list ap; - - va_start(ap, ret); - - /* Push the function */ - lua_getglobal(L, function); - - /* Push and count the arguments */ - while (args[i]) - { - switch (args[i++]) - { - case 'd': - case 'l': - tolua_pushnumber(L, va_arg(ap, s32b)); - nb++; - break; - case 's': - tolua_pushstring(L, va_arg(ap, char*)); - nb++; - break; - case 'O': - tolua_pushusertype(L, (void*)va_arg(ap, object_type*), tolua_tag(L, "object_type")); - nb++; - break; - case 'M': - tolua_pushusertype(L, (void*)va_arg(ap, monster_type*), tolua_tag(L, "monster_type")); - nb++; - break; - case 'n': - lua_pushnil(L); - nb++; - break; - case '(': - case ')': - case ',': - break; - } - } - - /* Count returns */ - nbr = strlen(ret); - - /* Call the function */ - if (lua_call(L, nb, nbr)) - { - cmsg_format(TERM_VIOLET, "ERROR in lua_call while calling '%s' from call_lua. Things should start breaking up from now on!", function); - return FALSE; - } - - /* Number of returned values, SHOULD be the same as nbr, but I'm paranoid */ - size = lua_gettop(L) - oldtop; - - /* Get the returns */ - for (i = 0; ret[i]; i++) - { - switch (ret[i]) - { - case 'd': - case 'l': - { - s32b *tmp = va_arg(ap, s32b*); - - if (lua_isnumber(L, ( -size) + i)) *tmp = tolua_getnumber(L, ( -size) + i, 0); - else *tmp = 0; - break; - } - - case 's': - { - cptr *tmp = va_arg(ap, cptr*); - - if (lua_isstring(L, ( -size) + i)) *tmp = tolua_getstring(L, ( -size) + i, ""); - else *tmp = NULL; - break; - } - - case 'O': - { - object_type **tmp = va_arg(ap, object_type**); - - if (tolua_istype(L, ( -size) + i, tolua_tag(L, "object_type"), 0)) - *tmp = (object_type*)tolua_getuserdata(L, ( -size) + i, NULL); - else - *tmp = NULL; - break; - } - - case 'M': - { - monster_type **tmp = va_arg(ap, monster_type**); - - if (tolua_istype(L, ( -size) + i, tolua_tag(L, "monster_type"), 0)) - *tmp = (monster_type*)tolua_getuserdata(L, ( -size) + i, NULL); - else - *tmp = NULL; - break; - } - - default: - cmsg_format(TERM_VIOLET, "ERROR in lua_call while calling '%s' from call_lua: Unknown return type '%c'", function, ret[i]); - return FALSE; - } - } - - lua_settop(L, oldtop); - - va_end(ap); - - return TRUE; -} - -bool_ get_lua_var(cptr name, char type, void *arg) -{ - int oldtop = lua_gettop(L), size; - - /* Push the function */ - lua_getglobal(L, name); - - size = lua_gettop(L) - oldtop; - - switch (type) - { - case 'd': - case 'l': - { - s32b *tmp = (s32b*)arg; - - if (lua_isnumber(L, ( -size))) *tmp = tolua_getnumber(L, ( -size), 0); - else *tmp = 0; - break; - } - - case 's': - { - cptr *tmp = (cptr*)arg; - - if (lua_isstring(L, ( -size))) *tmp = tolua_getstring(L, ( -size), ""); - else *tmp = NULL; - break; - } - - case 'O': - { - object_type **tmp = (object_type**)arg; - - if (tolua_istype(L, ( -size), tolua_tag(L, "object_type"), 0)) - *tmp = (object_type*)tolua_getuserdata(L, ( -size), NULL); - else - *tmp = NULL; - break; - } - - case 'M': - { - monster_type **tmp = (monster_type**)arg; - - if (tolua_istype(L, ( -size), tolua_tag(L, "monster_type"), 0)) - *tmp = (monster_type*)tolua_getuserdata(L, ( -size), NULL); - else - *tmp = NULL; - break; - } - - default: - cmsg_format(TERM_VIOLET, "ERROR in get_lua_var while calling '%s': Unknown return type '%c'", name, type); - return FALSE; - } - - lua_settop(L, oldtop); - - return TRUE; -} diff --git a/src/spells.pkg b/src/spells.pkg deleted file mode 100644 index 26d7abab..00000000 --- a/src/spells.pkg +++ /dev/null @@ -1,2258 +0,0 @@ -/* File: spells.pkg */ - -/* - * Purpose: Lua interface defitions for spells. - * To be processed by tolua to generate C source code. - */ - -$#include "angband.h" -$#include "lua.h" - -/** @typedef *mcptr - * @note String - */ -typedef char *mcptr; - -/** @typedef cptr - * @note String - */ -typedef const char* cptr; - -/** @typedef errr - * @note Number - */ -typedef int errr; - -/** @typedef bool - * @note Boolean - */ -typedef unsigned char bool; - -/** @typedef byte - * @note Number - */ -typedef unsigned char byte; - -/** @typedef s16b - * @note Number - */ -typedef signed short s16b; - -/** @typedef u16b - * @note Number - */ -typedef unsigned short u16b; - -/** @typedef s32b - * @note Number - */ -typedef signed int s32b; - -/** @typedef u32b - * @note Number - */ -typedef unsigned int u32b; - -/** @def DEFAULT_RADIUS */ -#define DEFAULT_RADIUS 25 - -/** @name Spell Damage Types - * @brief Type of damage caused by spell - * @{ */ -/** @def GF_ELEC */ -#define GF_ELEC 1 - -/** @def GF_POIS */ -#define GF_POIS 2 - -/** @def GF_ACID */ -#define GF_ACID 3 - -/** @def GF_COLD */ -#define GF_COLD 4 - -/** @def GF_FIRE */ -#define GF_FIRE 5 - -/** @def GF_UNBREATH */ -#define GF_UNBREATH 6 - -/** @def GF_CORPSE_EXPL */ -#define GF_CORPSE_EXPL 7 - -/** @def GF_MISSILE */ -#define GF_MISSILE 10 - -/** @def GF_ARROW */ -#define GF_ARROW 11 - -/** @def GF_PLASMA */ -#define GF_PLASMA 12 - -/** @def GF_WAVE */ -#define GF_WAVE 13 - -/** @def GF_WATER */ -#define GF_WATER 14 - -/** @def GF_LITE */ -#define GF_LITE 15 - -/** @def GF_DARK */ -#define GF_DARK 16 - -/** @def GF_LITE_WEAK */ -#define GF_LITE_WEAK 17 - -/** @def GF_DARK_WEAK */ -#define GF_DARK_WEAK 18 - -/** @def GF_SHARDS */ -#define GF_SHARDS 20 - -/** @def GF_SOUND */ -#define GF_SOUND 21 - -/** @def GF_CONFUSION */ -#define GF_CONFUSION 22 - -/** @def GF_FORCE */ -#define GF_FORCE 23 - -/** @def GF_INERTIA */ -#define GF_INERTIA 24 - -/** @def GF_MANA */ -#define GF_MANA 26 - -/** @def GF_METEOR */ -#define GF_METEOR 27 - -/** @def GF_ICE */ -#define GF_ICE 28 - -/** @def GF_CHAOS */ -#define GF_CHAOS 30 - -/** @def GF_NETHER */ -#define GF_NETHER 31 - -/** @def GF_DISENCHANT */ -#define GF_DISENCHANT 32 - -/** @def GF_NEXUS */ -#define GF_NEXUS 33 - -/** @def GF_TIME */ -#define GF_TIME 34 - -/** @def GF_GRAVITY */ -#define GF_GRAVITY 35 - -/** @def GF_KILL_WALL */ -#define GF_KILL_WALL 40 - -/** @def GF_KILL_DOOR */ -#define GF_KILL_DOOR 41 - -/** @def GF_KILL_TRAP */ -#define GF_KILL_TRAP 42 - -/** @def GF_MAKE_WALL */ -#define GF_MAKE_WALL 45 - -/** @def GF_MAKE_DOOR */ -#define GF_MAKE_DOOR 46 - -/** @def GF_MAKE_TRAP */ -#define GF_MAKE_TRAP 47 - -/** @def GF_OLD_CLONE */ -#define GF_OLD_CLONE 51 - -/** @def GF_OLD_POLY */ -#define GF_OLD_POLY 52 - -/** @def GF_OLD_HEAL */ -#define GF_OLD_HEAL 53 - -/** @def GF_OLD_SPEED */ -#define GF_OLD_SPEED 54 - -/** @def GF_OLD_SLOW */ -#define GF_OLD_SLOW 55 - -/** @def GF_OLD_CONF */ -#define GF_OLD_CONF 56 - -/** @def GF_OLD_SLEEP */ -#define GF_OLD_SLEEP 57 - -/** @def GF_OLD_DRAIN */ -#define GF_OLD_DRAIN 58 - -/** @def GF_AWAY_UNDEAD */ -#define GF_AWAY_UNDEAD 61 - -/** @def GF_AWAY_EVIL */ -#define GF_AWAY_EVIL 62 - -/** @def GF_AWAY_ALL */ -#define GF_AWAY_ALL 63 - -/** @def GF_TURN_UNDEAD */ -#define GF_TURN_UNDEAD 64 - -/** @def GF_TURN_EVIL */ -#define GF_TURN_EVIL 65 - -/** @def GF_TURN_ALL */ -#define GF_TURN_ALL 66 - -/** @def GF_DISP_UNDEAD */ -#define GF_DISP_UNDEAD 67 - -/** @def GF_DISP_EVIL */ -#define GF_DISP_EVIL 68 - -/** @def GF_DISP_ALL */ -#define GF_DISP_ALL 69 - -/* New types for Zangband begin here... */ - -/** @def GF_DISP_DEMON */ -#define GF_DISP_DEMON 70 - -/** @def GF_DISP_LIVING */ -#define GF_DISP_LIVING 71 - -/** @def GF_ROCKET */ -#define GF_ROCKET 72 - -/** @def GF_NUKE */ -#define GF_NUKE 73 - -/** @def GF_MAKE_GLYPH */ -#define GF_MAKE_GLYPH 74 - -/** @def GF_STASIS */ -#define GF_STASIS 75 - -/** @def GF_STONE_WALL */ -#define GF_STONE_WALL 76 - -/** @def GF_DEATH_RAY */ -#define GF_DEATH_RAY 77 - -/** @def GF_STUN */ -#define GF_STUN 78 - -/** @def GF_HOLY_FIRE */ -#define GF_HOLY_FIRE 79 - -/** @def GF_HELL_FIRE */ -#define GF_HELL_FIRE 80 - -/** @def GF_DISINTEGRATE */ -#define GF_DISINTEGRATE 81 - -/** @def GF_CHARM */ -#define GF_CHARM 82 - -/** @def GF_CONTROL_UNDEAD */ -#define GF_CONTROL_UNDEAD 83 - -/** @def GF_CONTROL_ANIMAL */ -#define GF_CONTROL_ANIMAL 84 - -/** @def GF_PSI */ -#define GF_PSI 85 - -/** @def GF_PSI_DRAIN */ -#define GF_PSI_DRAIN 86 - -/** @def GF_TELEKINESIS */ -#define GF_TELEKINESIS 87 - -/** @def GF_JAM_DOOR */ -#define GF_JAM_DOOR 88 - -/** @def GF_DOMINATION */ -#define GF_DOMINATION 89 - -/** @def GF_DISP_GOOD */ -#define GF_DISP_GOOD 90 - -/** @def GF_IDENTIFY */ -#define GF_IDENTIFY 91 - -/** @def GF_RAISE */ -#define GF_RAISE 92 - -/** @def GF_STAR_IDENTIFY */ -#define GF_STAR_IDENTIFY 93 - -/** @def GF_DESTRUCTION */ -#define GF_DESTRUCTION 94 - -/** @def GF_STUN_CONF */ -#define GF_STUN_CONF 95 - -/** @def GF_STUN_DAM */ -#define GF_STUN_DAM 96 - -/** @def GF_CONF_DAM */ -#define GF_CONF_DAM 98 - -/** @def GF_STAR_CHARM */ -#define GF_STAR_CHARM 99 - -/** @def GF_IMPLOSION */ -#define GF_IMPLOSION 100 - -/** @def GF_LAVA_FLOW */ -#define GF_LAVA_FLOW 101 - -/** @def GF_FEAR */ -#define GF_FEAR 102 - -/** @def GF_BETWEEN_GATE */ -#define GF_BETWEEN_GATE 103 - -/** @def GF_WINDS_MANA */ -#define GF_WINDS_MANA 104 - -/** @def GF_DEATH */ -#define GF_DEATH 105 - -/** @def GF_CONTROL_DEMON */ -#define GF_CONTROL_DEMON 106 - -/** @def GF_RAISE_DEMON */ -#define GF_RAISE_DEMON 107 - -/** @def GF_TRAP_DEMONSOUL */ -#define GF_TRAP_DEMONSOUL 108 - -/** @def GF_ATTACK */ -#define GF_ATTACK 109 - -/** @def GF_CHARM_UNMOVING */ -#define GF_CHARM_UNMOVING 110 - -/** @def GF_INSTA_DEATH */ -#define GF_INSTA_DEATH 111 - -/** @def GF_ELEMENTAL_WALL */ -#define GF_ELEMENTAL_WALL 112 - -/** @def GF_ELEMENTAL_GROWTH */ -#define GF_ELEMENTAL_GROWTH 113 - -/** @def MAX_GF */ -#define MAX_GF 114 -/** @} */ - -/** @name Spell Projection Flags - * @brief Area affected by spell - * @{ */ -/** @def PROJECT_JUMP - * @note Jump directly to the target location (this is a hack) - */ -#define PROJECT_JUMP 0x00000001 - -/** @def PROJECT_BEAM - * @note Work as a beam weapon (affect every grid passed through) - */ -#define PROJECT_BEAM 0x00000002 - -/** @def PROJECT_THRU - * @note Continue "through" the target (used for "bolts"/"beams") - */ -#define PROJECT_THRU 0x00000004 - -/** @def PROJECT_STOP - * @note Stop as soon as we hit a monster (used for "bolts") - */ -#define PROJECT_STOP 0x00000008 - -/** @def PROJECT_GRID - * @note Affect each grid in the "blast area" in some way - */ -#define PROJECT_GRID 0x00000010 - -/** @def PROJECT_ITEM - * @note Affect each object in the "blast area" in some way - */ -#define PROJECT_ITEM 0x00000020 - -/** @def PROJECT_KILL - * @note Affect each monster in the "blast area" in some way - */ -#define PROJECT_KILL 0x00000040 - -/** @def PROJECT_HIDE - * @note Hack -- disable "visual" feedback from projection - */ -#define PROJECT_HIDE 0x00000080 - -/** @def PROJECT_VIEWABLE - * @note Affect monsters in LOS - */ -#define PROJECT_VIEWABLE 0x00000100 - -/** @def PROJECT_METEOR_SHOWER - * @note Affect random grids - */ -#define PROJECT_METEOR_SHOWER 0x00000200 - -/** @def PROJECT_BLAST - * @note Like Mega_blast, but will only affect viewable grids - */ -#define PROJECT_BLAST 0x00000400 - -/** @def PROJECT_PANEL - * @note Affect everything in the panel. - */ -#define PROJECT_PANEL 0x00000800 - -/** @def PROJECT_ALL - * @note Affect every single grid. - */ -#define PROJECT_ALL 0x00001000 - -/** @def PROJECT_WALL - * @note Continue "through" the walls - */ -#define PROJECT_WALL 0x00002000 - -/** @def PROJECT_MANA_PATH - * @note Follow a mana path. - */ -#define PROJECT_MANA_PATH 0x00004000 - -/** @def PROJECT_ABSORB_MANA - * @note The spell increase in power as it absord grid's mana. - */ -#define PROJECT_ABSORB_MANA 0x00008000 - -/** @def PROJECT_STAY */ -#define PROJECT_STAY 0x00010000 -/** @} */ - -/** @var project_time - * @brief Number - * @note The length of time a spell effect exists. - */ -extern int project_time; - -/** @fn teleport_player_directed(int rad, int dir) - * @brief Teleport a player up to "rad" grids away roughly in "dir" - * direction.\n - * @param rad Number \n rad must not exceed 200. The distance teleported is - * at least a quarter of rad. - * @brief Distance - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @note - * Teleport player, using a distance and a direction as a rough guide.\n\n - * This function is not at all obsessive about correctness.\n - * This function allows teleporting into vaults (!) - * @note (see file spells1.c) - */ -extern void teleport_player_directed(int rad, int dir); - -/** @fn teleport_away(int m_idx, int dis) - * @brief Teleport monster indicated by "m_idx" up to "dis" grids away.\n - * @param m_idx Number \n m_idx is the index of the monster in m_list[]. - * @brief Monster index - * @param dis Number \n dis must not exceed 200. The distance teleported - * is a minimum of a quarter of "dis". - * @brief Distance - * @note - * Teleport a monster, normally up to "dis" grids away.\n\n - * Attempt to move the monster at least "dis/2" grids away.\n\n - * But allow variation to prevent infinite loops. - * @note (see file spells1.c) - */ -extern void teleport_away(int m_idx, int dis); - -/** @fn teleport_player(int dis) - * @brief Teleport player up to "dis" grids away.\n - * @param dis Number \n dis must not exceed 200. The distance teleported - * is a minimum of a quarter of dis. - * @brief Distance - * @note - * Teleport the player to a location up to "dis" grids away.\n\n - * If no such spaces are readily available, the distance may increase.\n - * Try very hard to move the player at least a quarter that distance. - * @note (see file spells1.c) - */ -extern void teleport_player(int dis); - -/** @fn teleport_monster_to(int m_idx, int ny, int nx) - * @brief Teleport monster indicated by "m_idx" to a grid near coordinate - * ("ny", "nx").\n - * @param m_idx Number \n m_idx is the index of the monster in m_list[]. - * @brief Monster index - * @param ny Number \n ny is the y co-ordinate of the location. - * @brief Y coordinate - * @param nx Number \n nx is the x co-ordinate of the location. - * @brief X coordinate - * @note - * Teleport a monster to a grid near the given location\n\n - * This function is slightly obsessive about correctness.\n\n - * If the location is empty, the monster goes there, otherwise they go to - * a grid as close as possible to the location. - * @note (see file spells1.c) - */ -extern void teleport_monster_to(int m_idx, int ny, int nx); - -/** @fn teleport_monster(int dir) - * @brief Teleport away all monsters in direction "dir".\n - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * All monsters in direction "dir" are teleported away and sustain - * MAX_SIGHT (20) x 5 damage.\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir". - * @note (see file spells2.c) - */ -extern bool teleport_monster(int dir); - -/** @fn teleport_player_level(void) - * @brief Teleport the player one level up or down at random. - * @note - * Teleport the player one level up or down (random when legal) - * @note (see file spells1.c) - */ -extern void teleport_player_level(void); - -/** @fn fetch(int dir, int wgt, bool require_los) - * @brief Fetch an item in direction "dir" with weight "wgt" possibly not in - * line of sight.\n - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param wgt Number \n maximum weight of object. - * @brief Weight - * @param require_los Boolean \n TRUE if line of sight is required, otherwise - * FALSE. - * @brief Require-line-of-sight flag - * @note - * Fetch an item (teleport it right underneath the caster)\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir". - * Fetch will fail if player is standing on something, or if the object is - * too far away, or if require_los is TRUE and player does not have line - * of sight to the object, or the object is too heavy. Otherwise the - * object appears at the player's feet (same grid as player). - * @note (see file cmd5.c) - */ -extern void fetch(int dir, int wgt, bool require_los); - -/** @fn recall_player(int d, int f) - * @brief Recall the player to town (if in dungeon) or dungeon (if in town).\n - * @param d Number \n Random time interval - * @brief Dice - * @param f Number \n Fixed time interval - * @brief Fixed - * @note (see file spells1.c) - */ -extern void recall_player(int d, int f); - -/** @fn take_hit(int damage, cptr kb_str) - * @brief Reduce player hit points by "damage" inflicted by "kb_str".\n - * @param damage Number \n damage is the number of hit points of damage. - * @brief Damage - * @param kb_str String \n kb_str describes what killed the player - * (in the event the player dies) - * @brief Killed by - * @note - * Decreases players hit points and sets death flag if necessary\n\n - * XXX XXX XXX Invulnerability needs to be changed into a "shield"\n\n - * XXX XXX XXX Hack -- this function allows the user to save (or quit) - * the game when he dies, since the "You die." message is shown before - * setting the player to "dead". - * @note (see file spells1.c) - */ -extern void take_hit(int damage, cptr kb_str); - -/** @fn take_sanity_hit(int damage, cptr hit_from) - * @brief Reduce player sanity points by "damage" inflicted by "hit_from".\n - * @param damage Number \n damage is the number of sanity points of damage. - * @brief Damage - * @param hit_from String \n hit_from describes what caused the damage. - * @brief Hit from - * @note - * Decrease player's sanity. This is a copy of the function above.\n\n - * Reduce the player's current sanity points by "damage" points. If the - * player dies, "hit_from" is used to record what the player was killed - * by (see high-score table). - * @note (see file spells1.c) - */ -extern void take_sanity_hit(int damage, cptr hit_from); - -/** @fn project(int who, int rad, int y, int x, int dam, int typ, int flg) - * @brief Generate a beam/bolt/ball with properties "flg" starting from "who" - * with a radius of "rad" at target grid "y,x" for "dam" points of "typ" - * damage.\n - * @param who Number \n who is > 0 (index of monster in m_list[]), < 0 and - * not -100 or -101 (player), -100 or -101 (trap). - * @brief Source - * @param rad Number \n rad is 0 for a beam/bolt and 1-9 for a ball. - * @brief Radius - * @param y Number \n y is the y coordinate of the target grid. - * @brief Y-coordinate - * @param x Number \n x is the x co-ordinate of the target grid. - * @brief X-coordinate - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param flg Number \n flg is the projection effect (PROJECT field). - * @brief Properties flag - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Generic "beam"/"bolt"/"ball" projection routine.\n\n - * Input:\n - * who: Index of "source" monster (negative for "player")\n - * jk -- -2 for traps, only used with project_jump\n - * rad: Radius of explosion (0 = beam/bolt, 1 to 9 = ball)\n - * y,x: Target location (or location to travel "towards")\n - * dam: Base damage roll to apply to affected monsters (or player)\n - * typ: Type of damage to apply to monsters (and objects)\n - * flg: Extra bit flags (see PROJECT_xxxx in "defines.h")\n\n - * Return:\n - * TRUE if any "effects" of the projection were observed, else FALSE\n\n - * Allows a monster (or player) to project a beam/bolt/ball of a given kind - * towards a given location (optionally passing over the heads of interposing - * monsters), and have it do a given amount of damage to the monsters (and - * optionally objects) within the given radius of the final location.\n\n - * A "bolt" travels from source to target and affects only the target grid.\n - * A "beam" travels from source to target, affecting all grids passed through.\n - * A "ball" travels from source to the target, exploding at the target, and - * affecting everything within the given radius of the target location.\n\n - * Traditionally, a "bolt" does not affect anything on the ground, and does - * not pass over the heads of interposing monsters, much like a traditional - * missile, and will "stop" abruptly at the "target" even if no monster is - * positioned there, while a "ball", on the other hand, passes over the heads - * of monsters between the source and target, and affects everything except - * the source monster which lies within the final radius, while a "beam" - * affects every monster between the source and target, except for the casting - * monster (or player), and rarely affects things on the ground.\n\n - * Two special flags allow us to use this function in special ways, the - * "PROJECT_HIDE" flag allows us to perform "invisible" projections, while - * the "PROJECT_JUMP" flag allows us to affect a specific grid, without - * actually projecting from the source monster (or player).\n\n - * The player will only get "experience" for monsters killed by himself - * Unique monsters can only be destroyed by attacks from the player\n\n - * Only 256 grids can be affected per projection, limiting the effective - * "radius" of standard ball attacks to nine units (diameter nineteen).\n\n - * One can project in a given "direction" by combining PROJECT_THRU with small - * offsets to the initial location (see "line_spell()"), or by calculating - * "virtual targets" far away from the player.\n\n - * One can also use PROJECT_THRU to send a beam/bolt along an angled path, - * continuing until it actually hits something (useful for "stone to mud").\n\n - * Bolts and Beams explode INSIDE walls, so that they can destroy doors.\n\n - * Balls must explode BEFORE hitting walls, or they would affect monsters - * on both sides of a wall. Some bug reports indicate that this is still - * happening in 2.7.8 for Windows, though it appears to be impossible.\n\n - * We "pre-calculate" the blast area only in part for efficiency. - * More importantly, this lets us do "explosions" from the "inside" out. - * This results in a more logical distribution of "blast" treasure. - * It also produces a better (in my opinion) animation of the explosion. - * It could be (but is not) used to have the treasure dropped by monsters - * in the middle of the explosion fall "outwards", and then be damaged by - * the blast as it spreads outwards towards the treasure drop location.\n\n - * Walls and doors are included in the blast area, so that they can be - * "burned" or "melted" in later versions.\n\n - * This algorithm is intended to maximise simplicity, not necessarily - * efficiency, since this function is not a bottleneck in the code.\n\n - * We apply the blast effect from ground zero outwards, in several passes, - * first affecting features, then objects, then monsters, then the player. - * This allows walls to be removed before checking the object or monster - * in the wall, and protects objects which are dropped by monsters killed - * in the blast, and allows the player to see all affects before he is - * killed or teleported away. The semantics of this method are open to - * various interpretations, but they seem to work well in practice.\n\n - * We process the blast area from ground-zero outwards to allow for better - * distribution of treasure dropped by monsters, and because it provides a - * pleasing visual effect at low cost.\n\n - * Note that the damage done by "ball" explosions decreases with distance. - * This decrease is rapid, grids at radius "dist" take "1/dist" damage.\n\n - * Notice the "napalm" effect of "beam" weapons. First they "project" to - * the target, and then the damage "flows" along this beam of destruction. - * The damage at every grid is the same as at the "centre" of a "ball" - * explosion, since the "beam" grids are treated as if they ARE at the - * centre of a "ball" explosion.\n\n - * Currently, specifying "beam" plus "ball" means that locations which are - * covered by the initial "beam", and also covered by the final "ball", except - * for the final grid (the epicentre of the ball), will be "hit twice", once - * by the initial beam, and once by the exploding ball. For the grid right - * next to the epicentre, this results in 150% damage being done. The centre - * does not have this problem, for the same reason the final grid in a "beam" - * plus "bolt" does not -- it is explicitly removed. Simply removing "beam" - * grids which are covered by the "ball" will NOT work, as then they will - * receive LESS damage than they should. Do not combine "beam" with "ball".\n\n - * The array "gy[],gx[]" with current size "grids" is used to hold the - * collected locations of all grids in the "blast area" plus "beam path".\n\n - * Note the rather complex usage of the "gm[]" array. First, gm[0] is always - * zero. Second, for N>1, gm[N] is always the index (in gy[],gx[]) of the - * first blast grid (see above) with radius "N" from the blast centre. Note - * that only the first gm[1] grids in the blast area thus take full damage. - * Also, note that gm[rad+1] is always equal to "grids", which is the total - * number of blast grids.\n\n - * Note that once the projection is complete, (y2,x2) holds the final location - * of bolts/beams, and the "epicentre" of balls.\n\n - * Note also that "rad" specifies the "inclusive" radius of projection blast, - * so that a "rad" of "one" actually covers 5 or 9 grids, depending on the - * implementation of the "distance" function. Also, a bolt can be properly - * viewed as a "ball" with a "rad" of "zero".\n\n - * Note that if no "target" is reached before the beam/bolt/ball travels the - * maximum distance allowed (MAX_RANGE), no "blast" will be induced. This - * may be relevant even for bolts, since they have a "1x1" mini-blast.\n\n - * Note that for consistency, we "pretend" that the bolt actually takes "time" - * to move from point A to point B, even if the player cannot see part of the - * projection path. Note that in general, the player will *always* see part - * of the path, since it either starts at the player or ends on the player.\n\n - * Hack -- we assume that every "projection" is "self-illuminating".\n\n - * Hack -- when only a single monster is affected, we automatically track - * (and recall) that monster, unless "PROJECT_JUMP" is used.\n\n - * Note that all projections now "explode" at their final destination, even - * if they were being projected at a more distant destination. This means - * that "ball" spells will *always* explode.\n\n - * Note that we must call "handle_stuff()" after affecting terrain features - * in the blast radius, in case the "illumination" of the grid was changed, - * and "update_view()" and "update_monsters()" need to be called. - * @note (see file spells1.c) - */ -extern bool project(int who, int rad, int y, int x, int dam, int typ, int flg); - -/** @fn corrupt_player(void) - * @brief Swap two of the player's stats at random. - * @note (see file spells1.c) - */ -extern void corrupt_player(void); - -/** @fn grow_grass(int rad) - * @brief Grow grass within "rad" distance of the player.\n - * @param rad Number \n rad is the radius of the area where grass may grow. - * @brief Radius - * @note - * Grow grass\n\n - * Up to (rad * (rad + 11)) grass can be grown around the player. The - * grids must support growth. - * @note (see file spells2.c) - */ -extern void grow_grass(int rad); - -/** @fn grow_trees(int rad) - * @brief Grow trees within "rad" distance of the player.\n - * @param rad Number \n rad is the radius of the area where trees may grow. - * @brief Radius - * @note - * Grow trees\n\n - * Up to (rad * (rad + 11)) trees can be grown around the player. The - * grids must support growth. - * @note (see file spells2.c) - */ -extern void grow_trees(int rad); - -/** @fn hp_player(int num) - * @brief Add "num" points to the player's current hit points.\n - * @param num Number \n num is the number of points to add. - * @brief Number - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Increase players hit points, notice effects\n\n - * The total can not exceed the maximum. - * @note (see file spells2.c) - */ -extern bool hp_player(int num); - -/** @fn heal_insanity(int val) - * @brief Add "val" points to the player's current sanity points.\n - * @param val Number \n val is the number of points to add. - * @brief Value - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Heal insanity.\n\n - * The total can not exceed the maximum. - * @note (see file spells2.c) - */ -extern bool heal_insanity(int val); - -/** @fn warding_glyph(void) - * @brief Place a glyph at the player's location. - * @note - * Leave a "glyph of warding" which prevents monster movement\n\n - * The location must be bare. - * @note (see file spells2.c) - */ -extern void warding_glyph(void); - -/** @fn explosive_rune(void) - * @brief Place a minor glyph (explosive rune) at the player's location. - * @note - * The location must be bare. - * @note (see file spells2.c) - */ -extern void explosive_rune(void); - -/** @fn do_dec_stat(int stat, int mode) - * @brief Attempt to reduce the player's "stat" statistic by a point.\n - * @param stat Number \n stat is the statistic - * @brief Statistic - * @param mode Number \n mode is the type of decrease: temporary, normal, - * or permanent - * @brief Mode - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Lose a "point" - * @note (see file spells2.c) - */ -extern bool do_dec_stat(int stat, int mode); - -/** @fn do_res_stat(int stat, bool full) - * @brief Restore the player's "stat" statistic.\n - * @param stat Number \n stat is the statistic. - * @brief Statistic - * @param full Boolean \n TRUE if full restore is required, otherwise FALSE. - * @brief Full restore flag - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Restore lost "points" in a stat - * @note (see file spells2.c) - */ -extern bool do_res_stat(int stat, bool full); - -/** @fn do_inc_stat(int stat) - * @brief Increase the player's "stat" statistic by a point.\n - * @param stat Number \n stat is the statistic. - * @brief Statistic - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Gain a "point" in a stat - * @note (see file spells2.c) - */ -extern bool do_inc_stat(int stat); - -/** @fn identify_pack(void) - * @brief Identify all items in the inventory. - * @note - * Identify everything being carried.\n - * Done by a potion of "self knowledge". - * @note (see file spells2.c) - */ -extern bool identify_pack(void); - -/** @fn remove_curse(void) - * @brief Remove all curses except for heavy curses. - * @return Boolean \n TRUE if at least one item was uncursed, otherwise FALSE. - * @note - * Remove most curses\n\n - * There is a 1 in (55 - level) chance of reversing the curse effects for - * items which are not artifacts. For example, a Ring of Damage (-15) will - * become a Ring of Damage (+15). - * @note (see file spells2.c) - */ -extern bool remove_curse(void); - -/** @fn remove_all_curse(void) - * @brief Remove all curses including heavy curses. - * @return Boolean \n TRUE if at least one item was uncursed, otherwise FALSE. - * @note - * Remove all curses\n\n - * There is a 1 in (55 - level) chance of reversing the curse effects for - * items which are not artifacts. For example, a Ring of Damage (-15) will - * become a Ring of Damage (+15). - * @note (see file spells2.c) - */ -extern bool remove_all_curse(void); - -/** @fn restore_level(void) - * @brief Restore all drained experience points (if any). - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Restores any drained experience - * @note (see file spells2.c) - */ -extern bool restore_level(void); - -/** @fn self_knowledge(FILE *fff=NULL) - * @brief Show all attributes including racial powers, mutations, and - * equipment effects.\n - * @param *fff FILE \n write info to screen if fff is NULL, - * otherwise write info to file fff. - * @brief Output file - * @note - * self-knowledge... idea from nethack. Useful for determining powers and - * resistances of items. It saves the screen, clears it, then starts listing - * attributes, a screenful at a time. (There are a LOT of attributes to - * list. It will probably take 2 or 3 screens for a powerful character whose - * using several artifacts...) -CFT\n\n - * It is now a lot more efficient. -BEN-\n\n - * See also "identify_fully()".\n\n - * XXX XXX XXX Use the "show_file()" method, perhaps. - * @note (see file spells2.c) - */ -extern void self_knowledge(FILE *fff=NULL); - -/** @fn lose_all_info(void) - * @brief Forget about objects and the map. - * @return Boolean \n TRUE (always). - * @note - * Forget everything - * @note (see file spells2.c) - */ -extern bool lose_all_info(void); - -/** @fn detect_traps(int rad) - * @brief Detect all traps within radius "rad" of the player.\n - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE (always). - * @note - * All grids within the radius are searched.\n - * A message is displayed if traps are detected. - * @note (see file spells2.c) - */ -extern bool detect_traps(int rad); - -/** @fn detect_doors(int rad) - * @brief Detect all doors within radius "rad" of the player.\n - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if doors were detected, otherwise FALSE. - * @note - * All grids within the radius are searched.\n - * A message is displayed if doors are detected. - * @note (see file spells2.c) - */ -extern bool detect_doors(int rad); - -/** @fn detect_stairs(int rad) - * @brief Detect all exits within radius "rad" of the player.\n - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if exits were detected, otherwise FALSE. - * @note - * All grids within the radius are searched.\n - * A message is displayed if exits are detected. Exits can be stairs, - * shafts, and ways out. - * @note (see file spells2.c) - */ -extern bool detect_stairs(int rad); - -/** @fn detect_treasure(int rad) - * @brief Detect all buried treasure within radius "rad" of the player.\n - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if buried treasure was detected, otherwise FALSE. - * @note - * All grids within the radius are searched.\n - * A message is displayed if buried treasure is detected. Treasure can be - * buried in magma, quartz, or sandwall. - * @note (see file spells2.c) - */ -extern bool detect_treasure(int rad); - -/** @var hack_no_detect_message - * @brief Boolean - * @note Suppress messages generated by "detect" spells? - */ -extern bool hack_no_detect_message; - -/** @fn detect_objects_gold(int rad) - * @brief Detect all gold within radius "rad" of the player.\n - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if gold was detected, otherwise FALSE. - * @note - * All grids within the radius are searched.\n - * A message is displayed if gold is detected. Gold can be coins or mimics. - * Monsters of type "$" are detected but not shown or reported. - * @note (see file spells2.c) - */ -extern bool detect_objects_gold(int rad); - -/** @fn detect_objects_normal(int rad) - * @brief Detect all normal (not gold) items within radius "rad" of the player.\n - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if normal items were detected, otherwise FALSE. - * @note - * All grids within the radius are searched.\n - * A message is displayed if normal items are detected. Items include mimics. - * Monsters of type "!=?|" are detected but not shown or reported. - * @note (see file spells2.c) - */ -extern bool detect_objects_normal(int rad); - -/** @fn detect_objects_magic(int rad) - * @brief Detect all magic (not gold) items within radius "rad" of the player.\n - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if magic items were detected, otherwise FALSE. - * @note - * This will light up all spaces with "magic" items, including artifacts, - * ego-items, potions, scrolls, books, rods, wands, staves, amulets, rings, - * and "enchanted" items of the "good" variety.\n\n - * It can probably be argued that this function is now too powerful.\n\n - * All grids within the radius are searched.\n - * A message is displayed if magic items are detected. Items include mimics. - * @note (see file spells2.c) - */ -extern bool detect_objects_magic(int rad); - -/** @fn detect_monsters_normal(int rad) - * @brief Detect all non-invisible monsters within radius "rad" of the player.\n - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if non-invisible monsters were detected, - * otherwise FALSE. - * @note - * A non-invisible monster is one which is visible, or one which is invisible - * but the player can see invisible monsters. - * @note (see file spells2.c) - */ -extern bool detect_monsters_normal(int rad); - -/** @fn detect_monsters_invis(int rad) - * @brief Detect all invisible monsters within radius "rad" of the player.\n - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if invisible monsters were detected, - * otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool detect_monsters_invis(int rad); - -/** @fn detect_monsters_evil(int rad) - * @brief Detect all evil monsters within radius "rad" of the player.\n - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if evil monsters were detected, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool detect_monsters_evil(int rad); - -/** @fn detect_monsters_good(int rad) - * @brief Detect all good monsters within radius "rad" of the player.\n - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if good monsters were detected, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool detect_monsters_good(int rad); - -/** @fn detect_monsters_xxx(u32b match_flag, int rad) - * @brief Detect all monsters with flag "match_flag" within radius "rad" of the - * player.\n - * @param match_flag Number \n match_flag is the type of monster. It must be - * a RF3_ flag (see defines.h). - * @brief Match flag - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if monsters were detected, otherwise FALSE. - * @note - * A "generic" detect monsters routine, tagged to flags3\n\n - * This routine will work with ANY RF3 flag, but messages will only be - * printed if the following monsters are detected: demon, undead, good. - * @note (see file spells2.c) - */ -extern bool detect_monsters_xxx(u32b match_flag, int rad); - -/** @fn detect_monsters_string(cptr chars, int rad) - * @brief Detect all monsters whose monster symbol is in "chars" within - * radius "rad" of the player.\n - * @param chars String \n chars is the string of monster types. For - * available characters, see the "symbol" field of the graphics (G) - * line of r_info.txt. - * @brief Symbols - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if monsters were detected, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool detect_monsters_string(cptr chars, int rad); - -/** @fn detect_monsters_nonliving(int rad) - * @brief Detect all nonliving monsters within radius "rad" of the player.\n - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if nonliving monsters were detected, - * otherwise FALSE. - * @note - * Detect all "nonliving", "undead" or "demonic" monsters on current panel\n\n - * Nonliving monsters are either RF3_NONLIVING, RF3_UNDEAD, or RF3_DEMON. - * @note (see file spells2.c) - */ -extern bool detect_monsters_nonliving(int rad); - -/** @fn detect_all(int rad) - * @brief Detect everything within radius "rad" of the player.\n - * @param rad Number \n rad is the radius of circle of detection. - * @brief Radius - * @return Boolean \n TRUE if something was detected, otherwise FALSE. - * @note - * Detect everything\n\n - * Detects traps, doors, stairs, treasure, gold objects, normal objects, - * invisible monsters, non-invisible monsters. - */ -extern bool detect_all(int rad); - -/** @fn stair_creation(void) - * @brief Create stairs at the player location - * @note - * This is not allowed if the grid is not empty, the player is not in a - * dungeon, the player is on a special level, the player is in an arena - * or quest. If the player is in the town or wilderness the stairs will - * go down. If the player is on a quest level or at the bottom of a - * dungeon, the stairs will go up. Otherwise there is an even chance the - * stairs will go up or down. - */ -extern void stair_creation(void); - -/** @fn tgt_pt (int *x=0, int *y=0) - * @brief Set a target point\n - * @param *x Number - * @brief X-coordinate - * @param *y Number - * @brief Y-coordinate - * @return *x Number \n X-coordinate of target. - * @return *y Number \n Y-coordinate of target. - * @return Boolean \n True if a target was selected, otherwise FALSE. - * @note - * Allow the user to move the cursor around the screen to select a target. - * The user must press the space key to set the target. - * @note (see file xtra2.c) - */ -extern bool tgt_pt (int *x=0, int *y=0); - -/** @fn wall_stone(int y, int x) - * @brief Create a stone wall at dungeon grid ("y", "x").\n - * @param y Number \n Y-coordinate of dungeon grid. - * @brief Y-coordinate - * @param x Number \n X-coordinate of dungeon grid. - * @brief X-coordinate - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool wall_stone(int y, int x); - -/** @fn create_artifact(object_type *o_ptr, bool a_scroll, bool get_name) - * @brief Create an artifact from object "o_ptr".\n - * @param *o_ptr object_type \n object to become an artifact - * @brief Object - * @param a_scroll Boolean \n Is a scroll used to create the artifact?\n - * TRUE if the artifact is created by reading a scroll. - * @brief Use scroll? - * @param get_name Boolean \n Get a name for the artifact?\n - * TRUE if the artifact is to be named by the player (if a_scroll is true) or - * created randomly (a_scroll is false), or FALSE if an inscription is used. - * @brief Get name? - * @return *o_ptr object_type \n The artifact. - * @return Boolean \n TRUE (always). - * @note (see file randart.c) - */ -extern bool create_artifact(object_type *o_ptr, bool a_scroll, bool get_name); - -/** @fn wall_to_mud(int dir) - * @brief Cast a wall-to-mud spell in direction "dir".\n - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir". - * @note (see file spells2.c) - */ -extern bool wall_to_mud(int dir); - -/** @fn ident_spell(void) - * @brief Identify an object in the inventory (or on the floor). - * @return Boolean \n TRUE if object is identified, otherwise FALSE. - * @note - * Identify an object in the inventory (or on the floor). - * This routine does *not* automatically combine objects. - * @note (see file spells2.c) - */ -extern bool ident_spell(void); - -/** @fn identify_fully(void) - * @brief Fully "identify" an object in the inventory (or on the floor). - * @return Boolean \n TRUE if object is identified, otherwise FALSE. - * @note - * Fully "identify" an object in the inventory -BEN- - * @note (see file spells2.c) - */ -extern bool identify_fully(void); - -/** @fn recharge(int num) - * @brief Recharge an object in the inventory (or on the floor) with "num" - * power.\n - * @param num Number \n num is the power used in recharging. It is compared - * to the object's level to determine whether the item is recharged - * successfully or destroyed. If it is recharged, it also determines - * how many charges are added, or how much recharge time is reduced. - * @brief Power - * @return Boolean \n TRUE if something was recharged, otherwise FALSE. - * @note - * Recharge a wand/staff/rod from the pack or on the floor.\n - * This function has been rewritten in Oangband. -LM-\n\n - * Mage -- Recharge I --> recharge(90)\n - * Mage -- Recharge II --> recharge(150)\n - * Mage -- Recharge III --> recharge(220)\n\n - * Priest or Necromancer -- Recharge --> recharge(140)\n - * Scroll of recharging --> recharge(130)\n - * Scroll of *recharging* --> recharge(200)\n\n - * It is harder to recharge high level, and highly charged wands, - * staffs, and rods. The more wands in a stack, the more easily and - * strongly they recharge. Staffs, however, each get fewer charges if - * stacked.\n\n - * XXX XXX XXX Beware of "sliding index errors". - * @note (see file spells2.c) - */ -extern bool recharge(int num); - -/** @fn aggravate_monsters(int who) - * @brief Aggravate monsters, originating from "who".\n - * @param who Number \n who is the index of monster in m_list[] - * (1 if it is the player) which triggers the aggravation. - * @brief Source - * @note - * Wake up all monsters, and speed up "los" monsters. - * @note (see file spells2.c) - */ -extern void aggravate_monsters(int who); - -/** @fn genocide_aux(bool player_cast, char typ) - * @brief Genocide a monster race.\n - * @param player_cast Boolean \n player_cast is true if the player cast the - * spell so the player can take damage. - * @param typ Char \n typ is the letetr of the genocided monsters - * @return Boolean \n TRUE if genocide was cast, otherwise FALSE. - * @note - * Genocide will not work on DF2_NO_GENO dungeon levels, or on "fated to - * die" levels. - * The player gets 4 points of damage per monster genocided. - * @note (see file spells2.c) - */ -extern bool genocide_aux(bool player_cast, char typ); - -/** @fn genocide(bool player_cast) - * @brief Genocide a monster race.\n - * @param player_cast Boolean \n player_cast is true if the player cast the - * spell so the player can take damage. - * @brief Player cast spell? - * @return Boolean \n TRUE if genocide was cast, otherwise FALSE. - * @note - * Genocide will not work on DF2_NO_GENO dungeon levels, or on "fated to - * die" levels. - * The player gets 4 points of damage per monster genocided. - * @note (see file spells2.c) - */ -extern bool genocide(bool player_cast); - -/** @fn mass_genocide(bool player_cast) - * @brief Delete all nearby (non-unique) monsters.\n - * @param player_cast Boolean \n player_cast is true if the player cast the - * spell so the player can take damage. - * @brief Player cast spell? - * @return Boolean \n TRUE (always). - * @note - * Genocide will not work on DF2_NO_GENO dungeon levels, or on "fated to - * die" levels.\n - * The player gets 3 points of damage per monster genocided. - * @note (see file spells2.c) - */ -extern bool mass_genocide(bool player_cast); - -/** @fn probing(void) - * @brief Probe all nearby monsters. - * @return Boolean \n TRUE if probe was successful, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool probing(void); - -/** @fn banish_evil(int dist) - * @brief Banish nearby evil monsters doing "dist" points of GF_AWAY_EVIL - * damage.\n - * @param dist Number \n dist is the number of hit points of damage. - * @brief Damage - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool banish_evil(int dist); - -/** @fn dispel_evil(int dam) - * @brief Dispel nearby evil monsters doing "dam" points of GF_DISP_EVIL - * damage.\n - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool dispel_evil(int dam); - -/** @fn dispel_good(int dam) - * @brief Dispel nearby good monsters doing "dam" points of GF_DISP_GOOD - * damage.\n - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool dispel_good(int dam); - -/** @fn dispel_undead(int dam) - * @brief Dispel nearby undead monsters doing "dam" points of GF_DISP_UNDEAD - * damage.\n - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool dispel_undead(int dam); - -/** @fn dispel_monsters(int dam) - * @brief Dispel all nearby monsters doing "dam" points of GF_DISP_ALL - * damage.\n - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool dispel_monsters(int dam); - -/** @fn dispel_living(int dam) - * @brief Dispel nearby living monsters doing "dam" points of GF_DISP_LIVING - * damage.\n - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool dispel_living(int dam); - -/** @fn dispel_demons(int dam) - * @brief Dispel nearby demon monsters doing "dam" points of GF_DISP_DEMON - * damage.\n - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool dispel_demons(int dam); - -/** @fn turn_undead(void) - * @brief Turn nearby undead monsters doing a point of GF_TURN_UNDEAD damage - * for each player level. - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool turn_undead(void); - -/** @fn door_creation(void) - * @brief Create doors in all grids adjacent to the player. - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool door_creation(void); - -/** @fn trap_creation(void) - * @brief Create traps in all grids adjacent to the player. - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool trap_creation(void); - -/** @fn glyph_creation(void) - * @brief Create glyphs in all grids adjacent to the player. - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool glyph_creation(void); - -/** @fn wipe(int y1, int x1, int r) - * @brief Delete monsters and objects from an area of the dungeon centred at - * grid "y1,x1" for a radius "r".\n - * @param y1 Number \n Y-coordinate of dungeon grid. - * @brief Y-coordinate - * @param x1 Number \n X-coordinate of dungeon grid. - * @brief X-coordinate - * @param r Number \n rad is the radius of circle of detection. - * @brief Radius - * @note - * Wipe -- Empties a part of the dungeon\n\n - * This does not work on special levels or quests. The player may become - * blinded. The player forgets the affected area and it becomes dark. - * All grids become floor. - * @note (see file spells2.c) - */ -extern void wipe(int y1, int x1, int r); - -/** @fn destroy_area(int y1, int x1, int r, bool full, bool bypass) - * @brief Delete monsters and objects from an area of the dungeon centred at - * grid "y1,x1" for a radius "r".\n - * @param y1 Number \n Y-coordinate of dungeon grid. - * @brief Y-coordinate - * @param x1 Number \n X-coordinate of dungeon grid. - * @brief X-coordinate - * @param r Number \n rad is the radius of circle of detection. - * @brief Radius - * @param full Boolean \n unused - * @brief *Unused* - * @param bypass Boolean \n TRUE if quest levels are not destroyed, otherwise - * FALSE. - * @brief Exempt quest levels? - * @note - * The spell of destruction\n\n - * This spell "deletes" monsters (instead of "killing" them).\n\n - * Later we may use one function for both "destruction" and - * "earthquake" by using the "full" to select "destruction".\n\n - * This does not work on special levels. This does not work on quests if the - * bypass flag is set. The epicentre is NOT affected. The player may become - * blinded. The player forgets the affected area and it becomes dark. The - * grids can become granite, quartz, magma, or floor. - * @note (see file spells2.c) - */ -extern void destroy_area(int y1, int x1, int r, bool full, bool bypass); - -/** @fn earthquake(int cy, int cx, int r) - * @brief Create an earthquake centred on grid "cy,cx" with a radius of "r".\n - * @param cy Number \n Y-coordinate of dungeon grid. - * @brief Y-coordinate - * @param cx Number \n X-coordinate of dungeon grid. - * @brief X-coordinate - * @param r Number \n rad is the radius of circle of detection. - * @brief Radius - * @note - * Induce an "earthquake" of the given radius at the given location.\n\n - * This will turn some walls into floors and some floors into walls.\n\n - * The player will take damage and "jump" into a safe grid if possible, - * otherwise, he will "tunnel" through the rubble instantaneously.\n\n - * Monsters will take damage, and "jump" into a safe grid if possible, - * otherwise they will be "buried" in the rubble, disappearing from - * the level in the same way that they do when genocided.\n\n - * Note that thus the player and monsters (except eaters of walls and - * passers through walls) will never occupy the same grid as a wall. - * Note that as of now (2.7.8) no monster may occupy a "wall" grid, even - * for a single turn, unless that monster can pass_walls or kill_walls. - * This has allowed massive simplification of the "monster" code.\n\n - * This does not work on quest levels. The epicentre is NOT affected. - * Only about 15% of the grids are affected. The player takes 300 points - * of damage if they can't be moved to a safe grid, otherwise damage is - * from 10 to 40 points. The player forgets the affected area and it - * becomes dark. The grids can become granite, quartz, magma, or floor. - * @note (see file spells2.c) - */ -extern void earthquake(int cy, int cx, int r); - -/** @fn lite_room(int y1, int x1) - * @brief Lite room containing grid "y1,x1".\n - * @param y1 Number \n Y-coordinate of dungeon grid. - * @brief Y-coordinate - * @param x1 Number \n X-coordinate of dungeon grid. - * @brief X-coordinate - * @note - * Illuminate any room containing the given location. - * @note (see file spells2.c) - */ -extern void lite_room(int y1, int x1); - -/** @fn unlite_room(int y1, int x1) - * @brief Unlite room containing grid "y1,x1".\n - * @param y1 Number \n Y-coordinate of dungeon grid. - * @brief Y-coordinate - * @param x1 Number \n X-coordinate of dungeon grid. - * @brief X-coordinate - * @note - * Darken all rooms containing the given location. - * @note (see file spells2.c) - */ -extern void unlite_room(int y1, int x1); - -/** @fn lite_area(int dam, int rad) - * @brief Lite area around player of radius "rad" causing "dam" points of - * damage to monsters. - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @param rad Number \n rad is the radius of circle of lite. - * @brief Radius - * @return Boolean \n TRUE (always). - * @note - * Hack -- call light around the player\n - * Affect all monsters in the projection radius\n\n - * Generate a ball of spell type GF_LITE_WEAK.\n - * @note (see file spells2.c) - */ -extern bool lite_area(int dam, int rad); - -/** @fn unlite_area(int dam, int rad) - * @brief Unlite area around player of radius "rad" causing "dam" points of - * damage to monsters. - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @param rad Number \n rad is the radius of circle of lite. - * @brief Radius - * @return Boolean \n TRUE (always). - * @note - * Hack -- call darkness around the player\n - * Affect all monsters in the projection radius\n\n - * Generate a ball of spell type GF_DARK_WEAK.\n - * @note (see file spells2.c) - */ -extern bool unlite_area(int dam, int rad); - -/** @fn fire_ball_beam(int typ, int dir, int dam, int rad) - * @brief Generate a ball spell of type "typ" with radius "rad" aimed in - * direction "dir" for "dam" damage.\n - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @param rad Number \n rad is 0 for a beam/bolt and 1-16 for a ball. - * @brief Radius - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Cast a ball-beamed spell\n - * Stop if we hit a monster, act as a "ball"\n - * Allow "target" mode to pass over monsters\n - * Affect grids, objects, and monsters\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir".\n\n - * Any radius >16 is treated as 16. - * @note (see file spells2.c) - */ -extern bool fire_ball_beam(int typ, int dir, int dam, int rad); - -/** @fn make_wish(void) - * @brief Allow the player to make a wish. - * @note (see file xtra2.c) - */ -extern void make_wish(void); - -/** @fn fire_wave(int typ, int dir, int dam, int rad, int time, s32b eff) - * @brief Generate a ball spell of type "typ" with radius "rad" and effect - * "eff" lasting "time" turns aimed in direction "dir" for "dam" damage.\n - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @param rad Number \n rad is 0 for a beam/bolt and 1-16 for a ball. - * @brief Radius - * @param time Number \n time is the number of turns the spell lasts. - * @brief Duration - * @param eff Number \n eff is the spell effect (EFF field) - * @brief Effect - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Cast a wave spell\n - * Stop if we hit a monster, act as a "ball"\n - * Allow "target" mode to pass over monsters\n - * Affect grids, objects, and monsters\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir".\n\n - * Any radius >16 is treated as 16. - * @note (see file spells2.c) - */ -extern bool fire_wave(int typ, int dir, int dam, int rad, int time, s32b eff); - -/** @name Spell Effect Flags - * @brief Effect of spell - * @{ */ -/** @def EFF_WAVE - * @note A circle whose radius increase - */ -#define EFF_WAVE 0x00000001 - -/** @def EFF_LAST - * @note The wave lasts - */ -#define EFF_LAST 0x00000002 - -/** @def EFF_STORM - * @note the effect follows the player - */ -#define EFF_STORM 0x00000004 - -/** @name Spell Effect Direction Flags - * @brief Direction of the spell - * @{ */ -#define EFF_DIR1 0x00000008 /* Directed effect */ -#define EFF_DIR2 0x00000010 /* Directed effect */ -#define EFF_DIR3 0x00000020 /* Directed effect */ -#define EFF_DIR4 0x00000040 /* Directed effect */ -#define EFF_DIR6 0x00000080 /* Directed effect */ -#define EFF_DIR7 0x00000100 /* Directed effect */ -#define EFF_DIR8 0x00000200 /* Directed effect */ -#define EFF_DIR9 0x00000400 /* Directed effect */ -/** @} */ -/** @} */ - -/** @fn fire_cloud(int typ, int dir, int dam, int rad, int time) - * @brief Generate a ball spell of type "typ" with radius "rad" lasting - * "time" turns aimed in direction "dir" for "dam" damage.\n - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @param rad Number \n rad is 0 for a beam/bolt and 1-16 for a ball. - * @brief Radius - * @param time Number \n time is the number of turns the spell lasts. - * @brief Duration - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Cast a cloud spell\n - * Stop if we hit a monster, act as a "ball"\n - * Allow "target" mode to pass over monsters\n - * Affect grids, objects, and monsters\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir".\n\n - * Any radius >16 is treated as 16. - * @note (see file spells2.c) - */ -extern bool fire_cloud(int typ, int dir, int dam, int rad, int time); - -/** @fn fire_wall(int typ, int dir, int dam, int time) - * @brief Generate a beam spell of type "typ" lasting "time" turns aimed in - * direction "dir" for "dam" damage.\n - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @param time Number \n time is the number of turns the spell lasts. - * @brief Duration - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Cast a persistant beam spell\n - * Pass through monsters, as a "beam"\n - * Affect monsters (not grids or objects)\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir". - * @note (see file spells2.c) - */ -extern bool fire_wall(int typ, int dir, int dam, int time); - -/** @fn fire_ball(int typ, int dir, int dam, int rad) - * @brief Generate a ball spell of type "typ" with radius "rad" aimed in - * direction "dir" for "dam" damage.\n - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @param rad Number \n rad is 0 for a beam/bolt and 1-16 for a ball. - * @brief Radius - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Cast a ball spell\n - * Stop if we hit a monster, act as a "ball"\n - * Allow "target" mode to pass over monsters\n - * Affect grids, objects, and monsters\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir". - * @note (see file spells2.c) - */ -extern bool fire_ball(int typ, int dir, int dam, int rad); - -/** @fn fire_bolt(int typ, int dir, int dam) - * @brief Generate a bolt spell of type "typ" aimed in direction "dir" - * for "dam" damage.\n - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Cast a bolt spell\n - * Stop if we hit a monster, as a "bolt"\n - * Affect monsters (not grids or objects)\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir". - * @note (see file spells2.c) - */ -extern bool fire_bolt(int typ, int dir, int dam); - -/** @fn fire_beam(int typ, int dir, int dam) - * @brief Generate a beam spell of type "typ" aimed in direction "dir" - * for "dam" damage.\n - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Cast a beam spell\n - * Pass through monsters, as a "beam"\n - * Affect monsters (not grids or objects)\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir". - * @note (see file spells2.c) - */ -extern bool fire_beam(int typ, int dir, int dam); - -/** @fn fire_druid_ball(int typ, int dir, int dam, int rad) - * @brief Generate a druid ball spell of type "typ" with radius "rad" aimed in - * direction "dir" for "dam" damage.\n - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @param rad Number \n rad is 0 for a beam/bolt and 1-16 for a ball. - * @brief Radius - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Cast a druidistic ball spell\n - * Stop if we hit a monster, act as a "ball"\n - * Allow "target" mode to pass over monsters\n - * Affect grids, objects, and monsters\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir".\n\n - * The spells follows a mana path\n\n - * WARNING: This routine has been deprecated. - * @note (see file spells2.c) - */ -extern bool fire_druid_ball(int typ, int dir, int dam, int rad); - -/** @fn fire_druid_bolt(int typ, int dir, int dam) - * @brief Generate a druid bolt spell of type "typ" aimed in direction "dir" - * for "dam" damage.\n - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Cast a druidistic bolt spell\n - * Stop if we hit a monster, as a "bolt"\n - * Affect monsters (not grids or objects)\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir".\n\n - * The spells follows a mana path\n\n - * WARNING: This routine has been deprecated. - * @note (see file spells2.c) - */ -extern bool fire_druid_bolt(int typ, int dir, int dam); - -/** @fn fire_druid_beam(int typ, int dir, int dam) - * @brief Generate a druid beam spell of type "typ" aimed in direction "dir" - * for "dam" damage.\n - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Cast a druidistic beam spell\n - * Pass through monsters, as a "beam"\n - * Affect monsters (not grids or objects)\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir".\n\n - * The spells follows a mana path\n\n - * WARNING: This routine has been deprecated. - * @note (see file spells2.c) - */ -extern bool fire_druid_beam(int typ, int dir, int dam); - -/** @fn fire_bolt_or_beam(int prob, int typ, int dir, int dam) - * @brief Generate a bolt spell of type "typ" aimed in direction "dir" - * for "dam" damage with "prob" percent chance of a beam.\n - * @param prob Number \n prob is the percentage chance the spell will be a - * beam instead of a bolt. - * @brief Beam probability percentage - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Cast a bolt spell, or rarely, a beam spell\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir".\n\n - * @note (see file spells2.c) - */ -extern bool fire_bolt_or_beam(int prob, int typ, int dir, int dam); - -/** @fn alchemy(void) - * @brief Turns an object into gold, gain some of its value in a shop - * @return Boolean \n TRUE if object turns to gold, otherwise FALSE. - * @note - * The player selects an object (and quantity if it applies) from the - * inventory or the floor and attempts to turn it into gold. If the - * price of the item is < 0 then the player gains nothing (fool's gold), - * otherwise the player gets a third of the price in gold. Artifacts are - * not affected. - * @note (see file spells2.c) - */ -extern bool alchemy(void); - -/** @fn alter_reality(void) - * @brief The player leaves the level immediately. - * @note (see file spells2.c) - */ -extern void alter_reality(void); - -/** @fn swap_position(int lty, int ltx) - * @brief Swap the position of the player with whatever is in grid "lty,ltx".\n - * @param lty Number \n Y-coordinate of target location. - * @brief Y-coordinate - * @param ltx Number \n X-coordinate of target location. - * @brief X-coordinate - * @note - * Player moves to target location. If there is a monster at the target - * location, it is moved to the player location. This is not allowed if - * the space-time continuum can not be disrupted. - * @note (see file spells2.c) - */ -extern void swap_position(int lty, int ltx); - -/** @fn teleport_swap(int dir) - * @brief Player swaps places with target in direction "dir".\n - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @note - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, the target is the grid adjacent to the player in direction - * "dir".\n\n - * The target must be a monster. It will not work if the space-time continuum - * can not be disrupted or if the monster resists teleportation. - * @note (see file spells2.c) - */ -extern void teleport_swap(int dir); - -/** @fn project_meteor(int radius, int typ, int dam, u32b flg) - * @brief Generate from "radius" to ("radius" x2) ball spells with properties - * "flg" of type "typ" for "dam" damage.\n - * @param radius Number \n rad is the minimum number of balls created. - * rad + randint("rad") balls are created. - * @brief Balls - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @param flg Number \n flg is the projection effect (PROJECT field). - * @brief Properties flag - * @note - * Apply a "project()" a la meteor shower\n\n - * Each ball has a radius of 2 grids. Each target grid is within 5 grids of - * the player. - * @note (see file spells2.c) - */ -extern void project_meteor(int radius, int typ, int dam, u32b flg); - -/** @fn passwall(int dir, bool safe) - * @brief Move the player through walls in direction "dir", to a "safe" - * location.\n - * @param dir Number \n dir must be a value from 0 to 9. It can not be 5. - * @brief Direction - * @param safe Boolean \n TRUE if location must be a safe one, otherwise FALSE. - * @brief Safe location? - * @return Boolean \n TRUE if move was successful, otherwise FALSE. - * @note - * Send the player shooting through walls in the given direction until - * they reach a non-wall space, or a monster, or a permanent wall.\n\n - * If the player ends up in a wall, they take 10d8 damage and the wall is - * replaced by a floor.\n\n - * This does not work in the wilderness, on quest levels, or if teleport is - * not allowed. Stopping on monsters or inside vaults is not allowed. - * @note (see file spells2.c) - */ -extern bool passwall(int dir, bool safe); - -/** @fn project_hook(int typ, int dir, int dam, int flg) - * @brief Generate a bolt/beam with properties "flg" in direction "dir" for - * "dam" points of "typ" damage.\n - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @param flg Number \n flg is the projection effect (PROJECT field). - * @brief Properties flag - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Hack -- apply a "projection()" in a direction (or at the target)\n\n - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir". - * @note (see file spells2.c) - */ -extern bool project_hook(int typ, int dir, int dam, int flg); - -/** @fn wizard_lock(int dir) - * @brief Cast a wizard_lock spell in direction "dir".\n - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * If direction is 5 and a target has been selected, then the target is used. - * Otherwise, a target is calculated based on a distance of 999 grids away - * from the player in direction "dir". - * @note (see file spells2.c) - */ -extern bool wizard_lock(int dir); - -/** @fn reset_recall(bool no_trepas_max_depth) - * @brief Ask the user to set a recall level in a dungeon, possibly no - * deeper than maximum dungeon depth.\n - * @param no_trepas_max_depth Boolean \n TRUE if user can select maximum - * dungeon depth, FALSE if user can select up to player's maximum depth - * in the dungeon so far. - * @brief Allow maximum dungeon depth? - * @return Boolean \n TRUE of recall level was reset, otherwise FALSE. - * @note - * Ask the user for a dungeon and appropriate level within the dungeon.\n - * The user can not specify a dungeon the player has not gone to yet.\n - * If the depth is <1, reset fails. If depth is 99 or 100, the level is set - * to 98. - * @note (see file spells2.c) - */ -extern bool reset_recall(bool no_trepas_max_depth); - -/** @fn get_aim_dir(int *dp=0) - * @brief Get an aiming direction from the user and store it in "dp".\n - * @param *dp Number - * @brief Direction - * @return *dp Number \n Aiming direction. - * @return Boolean \n TRUE if a valid direction was returned, otherwise FALSE. - * @note - * Get an "aiming direction" from the user.\n\n - * The "dir" is loaded with 1,2,3,4,6,7,8,9 for "actual direction", and - * "0" for "current target", and "-1" for "entry aborted".\n\n - * Note that "Force Target", if set, will pre-empt user interaction, - * if there is a usable target already set.\n\n - * Note that confusion over-rides any (explicit?) user choice. - * @note (see file xtra2.c) - */ -extern bool get_aim_dir(int *dp=0); - -/** @fn get_rep_dir(int *dp=0) - * @brief Get a movement direction from the user and store it in "dp".\n - * @param *dp Number - * @brief Direction - * @return *dp Number \n Movement direction. - * @return Boolean \n TRUE if a valid direction was returned, otherwise FALSE. - * @note - * Request a "movement" direction (1,2,3,4,6,7,8,9) from the user, - * and place it into "command_dir", unless we already have one.\n\n - * This function should be used for all "repeatable" commands, such as - * run, walk, open, close, bash, disarm, spike, tunnel, etc, as well - * as all commands which must reference a grid adjacent to the player, - * and which may not reference the grid under the player. Note that, - * for example, it is no longer possible to "disarm" or "open" chests - * in the same grid as the player.\n\n - * Direction "5" is illegal and will (cleanly) abort the command.\n\n - * This function tracks and uses the "global direction", and uses - * that as the "desired direction", to which "confusion" is applied. - * @note (see file xtra2.c) - */ -extern bool get_rep_dir(int *dp=0); - -/** @fn project_los(int typ, int dam); - * @brief Generate a bolt/beam for "dam" points of "typ" damage to all - * viewable monsters in line of sight.\n - * @param typ Number \n typ is the type of damage (GF field). - * @brief Type - * @param dam Number \n dam is the number of hit points of damage. - * @brief Damage - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note - * Apply a "project()" directly to all viewable monsters\n\n - * Note that affected monsters are NOT auto-tracked by this usage. - * @note (see file spells2.c) - */ -extern bool project_hack @ project_los(int typ, int dam); - -/** @fn map_area(void) - * @brief Map current area. - * @note - * Hack -- map the current panel (plus some) ala "magic mapping"\n\n - * Up to 10 grids above and below, and up to 20 grids either side of the - * panel are mapped. - * @note (see file cave.c) - */ -extern void map_area(void); - -/** @fn wiz_lite(void) - * @brief Lite level using "clairvoyance". - * @note - * This function "illuminates" every grid in the dungeon, memorizes all - * "objects", memorizes all grids as with magic mapping, and, under the - * standard option settings (view_perma_grids but not view_torch_grids) - * memorizes all floor grids too.\n\n - * Note that if "view_perma_grids" is not set, we do not memorize floor - * grids, since this would defeat the purpose of "view_perma_grids", not - * that anyone seems to play without this option.\n\n - * Note that if "view_torch_grids" is set, we do not memorize floor grids, - * since this would prevent the use of "view_torch_grids" as a method to - * keep track of what grids have been observed directly. - * @note (see file cave.c) - */ -extern void wiz_lite(void); - -/** @fn wiz_lite_extra(void) - * @brief Lite and memorize level. - * @note (see file cave.c) - */ -extern void wiz_lite_extra(void); - -/** @fn wiz_dark(void) - * @brief Forget all grids and objects. - * @note - * Forget the dungeon map (ala "Thinking of Maud..."). - * @note (see file cave.c) - */ -extern void wiz_dark(void); - -/** @fn create_between_gate(int dist, int y, int x) - * @brief Create a between gate at grid "y,x" or at a target grid within - * distance "dist" of the player.\n - * @param dist Number \n dist is the maximum distance from the player of the - * between gate. - * @brief Distance - * @param y Number \n Y-coordinate of dungeon grid. - * @brief Y-coordinate - * @param x Number \n X-coordinate of dungeon grid. - * @brief X-coordinate - * @note - * Creates a between gate\n\n - * This will fail if teleporting is not allowed on the level.\n\n - * If the coordinates are given, a between gate is created under the player - * and at the given coordinate.\n\n - * If there are no coordinates, a target is selected. The gate will not be - * created if the grid is not empty, or the grid is in a vault, or the grid - * is too far away. There is always a chance (1 in (Conveyance Skill * - * Conveyance Skill / 2)) the gate will not be created. - * @note (see file spells2.c) - */ -extern void create_between_gate(int dist, int y, int x); - -/** @fn destroy_doors_touch(void) - * @brief Destroy all doors adjacent to the player. - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool destroy_doors_touch(void); - -/** @fn destroy_traps_touch(void) - * @brief Destroy all traps adjacent to the player. - * @return Boolean \n TRUE if player notices, otherwise FALSE. - * @note (see file spells2.c) - */ -extern bool destroy_traps_touch(void); - -/** @struct magic_power - * @brief Innate powers - */ -struct magic_power -{ - /** @structvar min_lev - * @brief Number - */ - int min_lev; - - /** @structvar mana_cost - * @brief Number - */ - int mana_cost; - - /** @structvar fail - * @brief Number - */ - int fail; - - /** @structvar name - * @brief String - */ - cptr name; - - /** @structvar desc - * @brief String - */ - cptr desc; -}; - -/** @fn get_magic_power(magic_power *m_ptr, int num); - * @dgonly - * @brief Get magic power number "num" from array "m_ptr" of magic powers.\n - * @param *m_ptr magic_power \n m_ptr is the array of magic powers. - * @brief Powers - * @param num Number \n num is the index to the array. - * @brief Index - * @return magic_power \n A magic power. - * @note - * Note: do not call this function.\n - * By order of DG. - * @note (see file lua_bind.c) - */ -extern magic_power *grab_magic_power @ get_magic_power(magic_power *m_ptr, int num); - -extern s16b can_spell_random(s16b spell_idx); - -/* Schools */ - -/** @struct school_spell_type - * @brief Spell - * @note The spell function must provide the desc - */ -struct spell_type@school_spell_type -{ - /** @structvar name - * @brief String - */ - cptr name; - - /** @structvar skill_level - * @brief Number - * @note Required level (to learn) - */ - byte skill_level; - -}; - -/** Get level of device */ -extern s32b get_level_device(s32b s, s32b max, s32b min); - -/** Get level of spell */ -extern s32b get_level(s32b s, s32b max, s32b min); - - -/** @fn lua_spell_device_chance(s32b chance, int level, int base_level) - * @dgonly - * @brief Get the chance a device will fail.\n - * @param chance Number \n chance is the inital chance a spell will work. - * @brief Initial chance - * @param level Number \n level represents the level of player skill. - * @brief Player skill level - * @param base_level Number \n *unused* - * @brief *Unused* - * @return Number \n Chance of failure. - * @note - * Note: do not call this function directly.\n - * By order of DG. - * @note (see file lua_bind.c) - */ -extern s32b lua_spell_device_chance(s32b chance, int level, int base_level); - -/** @fn get_school_spell(cptr do_what, cptr check_fct, s16b force_book) - * @brief Get a spell from a book.\n - * @param do_what String \n what the player wants to do with the spell, - * for example "cast" or "copy". - * @brief Action - * @param check_fct String \n check_fct is the name of a function which checks - * if the player has access to the spell. - * @brief Check function - * @param force_book Number \n If it is different from 0 it for'ces the use of - * a spellbook, bypassing spellbook selection - * @brief Bypass book selection - * @return Number \n Spell number. - * @note - * Get a spell from a book\n\n - * The player must have a book to select a spell. When a book is chosen, the - * player is given a choice of spells to select. The player must be able to - * access the spell.\n\n - * If no spell is chosen, -1 is returned. - * @note (see file cmd5.c) - */ -extern s32b get_school_spell(cptr do_what, s16b force_book); - -/** @fn get_pos_player(int dis, int *ny=0, int *nx=0) - * @brief Get a grid near the player.\n - * @param dis Number \n is the maximum distance away from the player. - * This is limited to 200. - * @brief Distance from player - * @return y Number \n Y-coordinate of grid. - * @return x Number \n X-coordinate of grid. - * @note - * This function is slightly obsessive about correctness.\n\n - * Minimum distance is half the maximum distance. The function attempts to - * find a valid grid up to 500 times. If no valid grid is found, the maximum - * distance is doubled (though no more than 200) and the minimum distance is - * halved. The function does this 100 times. - * @note (see file spells1.c) - */ -extern void get_pos_player(int dis, int *ny=0, int *nx=0); - -/** - * spells4.c - */ -void init_school_books(); - -extern s32b SCHOOL_AIR; -extern s32b SCHOOL_AULE; -extern s32b SCHOOL_CONVEYANCE; -extern s32b SCHOOL_DEMON; -extern s32b SCHOOL_DEVICE; -extern s32b SCHOOL_DIVINATION; -extern s32b SCHOOL_EARTH; -extern s32b SCHOOL_ERU; -extern s32b SCHOOL_FIRE; -extern s32b SCHOOL_GEOMANCY; -extern s32b SCHOOL_MANA; -extern s32b SCHOOL_MANDOS; -extern s32b SCHOOL_MANWE; -extern s32b SCHOOL_MELKOR; -extern s32b SCHOOL_META; -extern s32b SCHOOL_MIND; -extern s32b SCHOOL_MUSIC; -extern s32b SCHOOL_NATURE; -extern s32b SCHOOL_TEMPORAL; -extern s32b SCHOOL_TULKAS; -extern s32b SCHOOL_UDUN; -extern s32b SCHOOL_ULMO; -extern s32b SCHOOL_VARDA; -extern s32b SCHOOL_WATER; -extern s32b SCHOOL_YAVANNA; - -void lua_cast_school_spell @ cast_school_spell(s32b spell_idx, bool no_cost = FALSE); -void spell_description_add_line(s32b spell_idx, cptr line); - -/** - * spells5.c - */ -void school_spells_init(); -s16b get_random_spell(s16b random_type, int lev); - -/** - * spells6.c - */ -void schools_init(); diff --git a/src/squeltch.c b/src/squeltch.c index d47f8a11..3b018834 100644 --- a/src/squeltch.c +++ b/src/squeltch.c @@ -11,8 +11,6 @@ */ #include "angband.h" -#include "lua/lua.h" -#include "tolua.h" #include <jansson.h> #define RULES_MAX 4096 diff --git a/src/util.pkg b/src/util.pkg deleted file mode 100644 index 196aabda..00000000 --- a/src/util.pkg +++ /dev/null @@ -1,2251 +0,0 @@ -/* File: util.pkg */ - -/* - * Purpose: Lua interface defitions for miscellaneous routines. - * To be processed by tolua to generate C source code. - */ - -$#include "angband.h" -$#include "plots.h" - -/** @typedef cptr - * @note String - */ -typedef char* cptr; -/** @typedef errr - * @note Number - */ -typedef int errr; -/** @typedef bool - * @note Boolean - */ -typedef unsigned char bool; -/** @typedef byte - * @note Number - */ -typedef unsigned char byte; -/** @typedef s16b - * @note Number - */ -typedef signed short s16b; -/** @typedef u16b - * @note Number - */ -typedef unsigned short u16b; -/** @typedef s32b - * @note Number - */ -typedef signed int s32b; -/** @typedef u32b - * @note Number - */ -typedef unsigned int u32b; - -/** @def TRUE */ -#define TRUE - -/** @def FALSE */ -#define FALSE - - -/** @def ESCAPE */ -#define ESCAPE '\033' - -/** @name Terminal Colours - * @{ - */ -/** @def TERM_DARK - * @note 'd' (0,0,0) - */ -#define TERM_DARK 0 /* 'd' */ -/** @def TERM_WHITE - * @note 'w' (4,4,4) - */ -#define TERM_WHITE 1 /* 'w' */ -/** @def TERM_SLATE - * @note 's' (2,2,2) - */ -#define TERM_SLATE 2 /* 's' */ -/** @def TERM_ORANGE - * @note 'o' (4,2,0) - */ -#define TERM_ORANGE 3 /* 'o' */ -/** @def TERM_RED - * @note 'r' (3,0,0) - */ -#define TERM_RED 4 /* 'r' */ -/** @def TERM_GREEN - * @note 'g' (0,2,1) - */ -#define TERM_GREEN 5 /* 'g' */ -/** @def TERM_BLUE - * @note 'b' (0,0,4) - */ -#define TERM_BLUE 6 /* 'b' */ -/** @def TERM_UMBER - * @note 'u' (2,1,0) - */ -#define TERM_UMBER 7 /* 'u' */ -/** @def TERM_L_DARK - * @note 'D' (1,1,1) - */ -#define TERM_L_DARK 8 /* 'D' */ -/** @def TERM_L_WHITE - * @note 'W' (3,3,3) - */ -#define TERM_L_WHITE 9 /* 'W' */ -/** @def TERM_VIOLET - * @note 'v' (4,0,4) - */ -#define TERM_VIOLET 10 /* 'v' */ -/** @def TERM_YELLOW - * @note 'y' (4,4,0) - */ -#define TERM_YELLOW 11 /* 'y' */ -/** @def TERM_L_RED - * @note 'R' (4,0,0) - */ -#define TERM_L_RED 12 /* 'R' */ -/** @def TERM_L_GREEN - * @note 'G' (0,4,0) - */ -#define TERM_L_GREEN 13 /* 'G' */ -/** @def TERM_L_BLUE - * @note 'B' (0,4,4) - */ -#define TERM_L_BLUE 14 /* 'B' */ -/** @def TERM_L_UMBER - * @note 'U' (3,2,1) - */ -#define TERM_L_UMBER 15 /* 'U' */ -/** @} */ - -/** @name Event Hooks - * @{ - */ -/** @def HOOK_MONSTER_DEATH - * @brief Monster dies.\n - * @param Number m_idx \n index of monster in monster (m_list) array. - * @brief Monster index - * @note (see file xtra2.c) - */ -#define HOOK_MONSTER_DEATH 0 - -/** @def HOOK_OPEN - * @brief Open door or chest.\n - * @param Number quest \n if 0, then player is not on a quest level, - * otherwise the player is on a quest. - * @brief On quest? - * @note (see file cmd2.c) - */ -#define HOOK_OPEN 1 - -/** @def HOOK_GEN_QUEST - * @brief Generate quest level.\n - * @param Number quest \n if 0, then player is not on a quest level, - * otherwise the player is on a quest. - * @brief On quest? - * @note (see file generate.c) - */ -#define HOOK_GEN_QUEST 2 - -/** @def HOOK_END_TURN - * @brief Turn ends.\n - * @param Number quest \n if 0, then player is not on a quest level, - * otherwise the player is on a quest. - * @brief On quest? - * @note (see file dungeon.c) - */ -#define HOOK_END_TURN 3 - -/** @def HOOK_FEELING - * @brief Display level feeling.\n - * @param Number quest \n if 0, then player is not on a quest level, - * otherwise the player is on a quest. - * @brief On quest? - * @return Boolean \n TRUE if a level feeling was displayed, otherwise FALSE. - * @note - * If the hook returns TRUE, then no other feelings are displayed and - * do_cmd_feeling() returns. - * @note (see file cmd4.c) - */ -#define HOOK_FEELING 4 - -/** @def HOOK_NEW_MONSTER - * @brief Generate monster.\n - * @param Number r_idx \n index of monster in monster race (r_info) array. - * @brief Monster index - * @return Boolean \n TRUE if monster is not allowed to be created, - * otherwise FALSE. - * @note - * If the hook returns TRUE, then the monster is "killed". - * @note (see file monster2.c) - */ -#define HOOK_NEW_MONSTER 5 - -/** @def HOOK_GEN_LEVEL - * @brief Generate dungeon level.\n - * @param Number quest \n if 0, then player is not on a quest level, - * otherwise the player is on a quest. - * @brief On quest? - * @note (see file generate.c) - */ -#define HOOK_GEN_LEVEL 6 - -/** @def HOOK_BUILD_ROOM1 - * @brief Generate room (type 1 - normal rectangular room).\n - * @param Number by0 \n y-coordinate of dungeon block where room is built. - * @brief Block y-coordinate - * @param Number bx0 \n x-coordinate of dungeon block where room is built. - * @brief Block x-coordinate - * @return Boolean \n TRUE if room was created, otherwise FALSE. - * @note - * If the hook returns TRUE, then the room has been built and build_type1() - * returns. - * @note (see file generate.c) - */ -#define HOOK_BUILD_ROOM1 7 - -/** @def HOOK_NEW_LEVEL - * @brief Start dungeon level.\n - * @param Number quest \n if 0, then player is not on a quest level, - * otherwise the player is on a quest. - * @brief On quest? - * @note (see file dungeon.c) - */ -#define HOOK_NEW_LEVEL 8 - -/** @def HOOK_QUEST_FINISH - * @brief Quest finished.\n - * @param Number plot \n a plot from the plots array. - * @brief Plot - * @note (see file bldg.c) - */ -#define HOOK_QUEST_FINISH 9 - -/** @def HOOK_QUEST_FAIL - * @brief Quest failed.\n - * @param Number plot \n a plot from the plots array. - * @brief Plot - * @note (see file bldg.c) - */ -#define HOOK_QUEST_FAIL 10 - -/** @def HOOK_GIVE - * @brief Give item to monster.\n - * @param Number m_idx \n index of monster in monster (m_list) array. - * @brief Monster index - * @param Number item \n the item to be given. - * @brief Item number - * @return Boolean \n TRUE if item was given to monster, otherwise FALSE. - * @note - * If the hook returns FALSE, then the message "The monster does not want - * your item." is displayed. - * @note (see file cmd2.c) - */ -#define HOOK_GIVE 11 - -/** @def HOOK_CHAR_DUMP - * @brief Add a line to the character sheet. - * @note (see files.c) - */ -#define HOOK_CHAR_DUMP 12 - -/** @def HOOK_INIT_QUEST - * @brief Quest initialised.\n - * @param Number plot \n a plot from the plots array. - * @brief Plot - * @return Boolean \n TRUE if quest was not initialised, otherwise FALSE. - * @note - * If the hook returns TRUE, castle_quest() returns FALSE. - * @note (see file bldg.c) - */ -#define HOOK_INIT_QUEST 13 - -/** @def HOOK_WILD_GEN - * @brief Generate wilderness.\n - * @param Number wilderness \n if TRUE, then this is overhead wilderness - * processing, otherwise it is regular wilderness processing. - * @brief Overhead? - * @note (see file wild.c) - */ -#define HOOK_WILD_GEN 14 - -/** @def HOOK_DROP - * @brief Drop an item.\n - * @param Number item \n the item to drop. - * @brief Item number - * @return Boolean \n TRUE if item was dropped, otherwise FALSE. - * @note - * If the hook returns TRUE, do_cmd_drop() returns, otherwise the function - * continues. - * @note (see file cmd3.c) - */ -#define HOOK_DROP 15 - -/** @def HOOK_IDENTIFY - * @brief Identfy an item.\n - * @param Number item \n the item to identify. - * @brief Item number - * @param String type \n "normal" to identify the item, or "full" to fully - * identify an item. - * @brief Type - * @note (see files spells1.c, spells2.c) - */ -#define HOOK_IDENTIFY 16 - -/** @def HOOK_MOVE - * @brief Player moves.\n - * @param Number y \n the y-coordinate of the new location. - * @brief Y-coordinate - * @param Number x \n the x-coordinate of the new location. - * @brief X-coordinate - * @return Boolean \n TRUE if player is not allowed to move, otherwise FALSE. - * @note - * If the hook returns TRUE, move_player_aux() returns, otherwise the function - * continues. - * @note (see file cmd1.c) - */ -#define HOOK_MOVE 17 - -/** @def HOOK_STAIR - * @brief Player uses stairs.\n - * @param String direction \n "up" if the player is going up stairs, or - * "down" if the player is going down stairs. - * @brief Direction - * @return Boolean \n TRUE if player is not allowed to use stairs, otherwise - * FALSE. - * @note - * If the hook returns TRUE, do_cmd_go_up() or do_cmd_go_down() returns, - * otherwise the function continues. - * @note (see file cmd2.c) - */ -#define HOOK_STAIR 18 - -/** @def HOOK_MONSTER_AI - * @brief Monster moves.\n - * @param Number m_idx \n index of monster in monster (m_list) array. - * @brief Monster index - * @return Boolean \n TRUE if monster AI was applied, otherwise FALSE. - * @return Number y2 \n New y-coordinate of monster target. - * @return Number x2 \n New x-coordinate of monster target. - * @note - * If the hook returns TRUE, the monster moves toward the hook position. - * @note (see file melee2.c) - */ -#define HOOK_MONSTER_AI 19 - -/** @def HOOK_PLAYER_LEVEL - * @brief Player gains (or loses) a level.\n - * @param Number gained \n the number of levels gained (or lost). - * @brief Levels gained - * @note (see file xtra2.c) - */ -#define HOOK_PLAYER_LEVEL 20 - -/** @def HOOK_WIELD - * @brief Player wields an item.\n - * @param Number item \n the item to wield. - * @brief Item number - * @return Boolean \n TRUE if item was not wielded, otherwise FALSE. - * @note - * If the hook returns TRUE, do_cmd_wield() returns, otherwise the function - * continues. - * @note (see file cmd3.c) - */ -#define HOOK_WIELD 21 - -/** @def HOOK_AIM */ -#define HOOK_AIM 24 - -/** @def HOOK_USE */ -#define HOOK_USE 25 - -/** @def HOOK_ACTIVATE - * @brief Player activates an item.\n - * @param Number item \n the item to activate. - * @brief Item number - * @return Boolean \n TRUE if item was activated, otherwise FALSE. - * @note - * If the hook returns TRUE, do_cmd_activate() returns, otherwise the function - * continues. - * @note (see file cmd6.c) - */ -#define HOOK_ACTIVATE 26 - -/** @def HOOK_ZAP - * @brief Player zaps a rod.\n - * @param Number tval \n type of rod to zap. - * @brief Type - * @param Number sval \n sub-type of rod to zap. - * @brief Sub-type - * @note (see file cmd6.c) - */ -#define HOOK_ZAP 27 - -/** @def HOOK_CALC_POWERS - * @brief Calculate player powers. - * @note (see xtra1.c) - */ -#define HOOK_CALC_POWERS 30 - -/** @def HOOK_KEYPRESS - * @brief User enters a command.\n - * @param Number command \n the pressed key (command_cmd). - * @brief Command - * @return Boolean \n TRUE if special processing was done, otherwise FALSE. - * @note - * If the hook returns TRUE, process_command() returns, otherwise the function - * continues. - * @note (see file dungeon.c) - */ -#define HOOK_KEYPRESS 31 - -/** @def HOOK_CHAT - * @brief Player chats to monster.\n - * @param Number m_idx \n index of monster in monster (m_list) array. - * @brief Monster index - * @return Boolean \n TRUE if monster chats, otherwise FALSE. - * @note - * If the hook returns FALSE, the message "There is no monster there." is - * printed. - * @note (see file cmd2.c) - */ -#define HOOK_CHAT 32 - -/** @def HOOK_MON_SPEAK - * @brief Monster speaks.\n - * @param Number m_idx \n index of monster in monster (m_list) array. - * @brief Monster index - * @param String m_name \n name of the monster. - * @brief Monster name - * @return Boolean \n TRUE if monster speaks, otherwise FALSE. - * @note - * If the hook returns FALSE, the monster may say something else. - * @note (see file melee2.c) - */ -#define HOOK_MON_SPEAK 33 - -/** @def HOOK_BIRTH_OBJECTS - * @brief Player receives objects at birth. - * @note (see file birth.c) - */ -#define HOOK_BIRTH_OBJECTS 35 - -/** @def HOOK_ACTIVATE_DESC - * @brief Display activation description.\n - * @param Object o_ptr \n the item to activate. - * @brief Object - * @return Boolean \n TRUE if item has an activation, otherwise FALSE. - * @return String desc \n the activation description. - * @note - * If the hook returns TRUE, item_activation() returns the hook's activation - * description. - * @note (see file object1.c) - */ -#define HOOK_ACTIVATE_DESC 36 - -/** @def HOOK_INIT_GAME - * @brief Game initialised.\n - * @param String when \n "begin" if done at the start of game initialisation, - * or "end" if done at end of game initialisation. - * @brief When? - * @note (see file init2.c) - */ -#define HOOK_INIT_GAME 37 - -/** @def HOOK_ACTIVATE_POWER - * @brief Player activates a power.\n - * @param Number power \n the power to activate. - * @brief Power - * @return Boolean \n TRUE if power was activated, otherwise FALSE. - * @note - * If the hook returns FALSE, power_activate() displays the message - * "Warning power_activate() called with invalid power(xx)." where - * xx = power. - * @note (see file powers.c) - */ -#define HOOK_ACTIVATE_POWER 38 - -/** @def HOOK_ITEM_NAME - * @brief Get an item name.\n - * @param Object o_ptr \n the item whose name is required. - * @brief Object - * @return Boolean \n TRUE if name was found, otherwise FALSE. - * @return String basenm \n The item name. - * @return String modstr \n The item modifier string. - * @note (see file object1.c) - */ -#define HOOK_ITEM_NAME 39 - -/** @def HOOK_SAVE_GAME - * @brief Save the game. - * @note (see file loadsave.c) - */ -#define HOOK_SAVE_GAME 40 - -/** @def HOOK_LOAD_GAME - * @brief Load the game. - * @note (see file loadsave.c) - */ -#define HOOK_LOAD_GAME 41 - -/** @def HOOK_LEVEL_REGEN - * @brief Start generation of a special level. - * @note (see file generate.c) - */ -#define HOOK_LEVEL_REGEN 42 - -/** @def HOOK_LEVEL_END_GEN - * @brief End generation of a special level. - * @note (see file generate.c) - */ -#define HOOK_LEVEL_END_GEN 43 - -/** @def HOOK_BUILDING_ACTION - * @brief Player performs an action in a building.\n - * @param Number action \n the action performed in the building - * @brief Action flag - * @return Boolean \n TRUE if player performed the action, otherwise FALSE. - * @return Number paid \n TRUE if player paid to perform the action, otherwise - * FALSE. - * @return Number recreate \n TRUE if something is recreated, otherwise FALSE. - * @note - * If the hook returns TRUE, the hook sets the "paid" and "recreate" flags. - * @note (see file bldg.c) - */ -#define HOOK_BUILDING_ACTION 44 - -/** @def HOOK_WIELD_SLOT - * @brief Find equipment slot for object.\n - * @param Object o_ptr \n the object to wield. - * @brief Object - * @param Number ideal \n TRUE if current body and stuff is ignore, otherwise - * FALSE. - * @return Boolean \n TRUE if hook processed the object, otherwise FALSE. - * @return Number slot \n The equipent slot where the object will go (-1 if - * there are no available slots). - * @note - * If the hook returns TRUE, wield_slot_ideal() returns the slot from the hook. - * @note (see file objects1.c) - */ -#define HOOK_WIELD_SLOT 46 - -/** @def HOOK_STORE_STOCK - * @brief Stock a store.\n - * @param Number st_idx \n the index of the store in st_info array. - * @brief Store index - * @param String name \n the name of the store. - * @brief Store name - * @param Number level \n the "dungeon level" of the store. - * @brief Store level - * @return Boolean \n TRUE if hook has selected an object, otherwise FALSE. - * @return Object q_ptr \n The item to be stocked in the store. - * @note - * If the hook returns TRUE, store_create() will create the hook's object and - * put it in the store. - * @note (see file store.c) - */ -#define HOOK_STORE_STOCK 47 - -/** @def HOOK_GEN_LEVEL_BEGIN - * @brief Generate a random dungeon level. - * @note (see file generate.c) - */ -#define HOOK_GEN_LEVEL_BEGIN 49 - -/** @def HOOK_GET - * @brief Player gets an object.\n - * @param Object o_ptr \n the object to get. - * @brief Object - * @param Number o_idx \n the index of the object in o_list array. - * @brief Object index - * @return Boolean \n TRUE if hooks processes the object, otherwise FALSE. - * @note - * If the hook returns TRUE, object_pickup() returns, otherwise the function - * continues. - * @note (see object1.c) - */ -#define HOOK_GET 50 - -/** @def HOOK_REDRAW - * @brief Redraw the screen. - * @note (see file xtra1.c) - */ -#define HOOK_REDRAW 51 - -/** @def HOOK_RECALC_SKILLS - * @brief Recalculate player skills. - * @note (see skills.c) - */ -#define HOOK_RECALC_SKILLS 52 - -/** @def HOOK_ENTER_DUNGEON - * @brief Player goes down one dungeon level.\n - * @param Number special \n special information for player's dungeon grid. - * @brief Special info - * @return Boolean \n TRUE if the hook prevents the player going down, - * otherwise FALSE. - * @note - * If the hook returns TRUE, the player remains on the current dungeon level - * and do_cmd_go_down() returns. - * @note (see file cmd2.c) - */ -#define HOOK_ENTER_DUNGEON 53 - -/** @def HOOK_FIRE - * @brief Player fires an object (bow slot of inventory).\n - * @param Object \n the object to fire. - * @brief Object - * @return Boolean \n TRUE if the hook has fired the object, otherwise FALSE. - * @note - * If the hook returns TRUE, process_command() returns. - * @note (see file dungeon.c) - */ -#define HOOK_FIRE 54 - -/** @def HOOK_EAT - * @brief Player eats.\n - * @param Object o_ptr \n the object the player eats. - * @brief Object - * @return Boolean \n TRUE if hook processes the object, otherwise FALSE. - * @return Number ident \n TRUE if the object was identified, otherwise FALSE. - * @note - * If the hook returns TRUE, the hook sets the "food identified" flag. - * @note (see file cmd6.c) - */ -#define HOOK_EAT 55 - -/** @def HOOK_DIE - * @brief Player dies. - * @return Boolean \n TRUE if player does not die, otherwise FALSE. - * @note - * If the hook returns TRUE, the player cheats death. - * @note (see file dungeon.c) - */ -#define HOOK_DIE 56 - -/** @def HOOK_CALC_HP - * @brief Recalculate player HP (hit points).\n - * @param Number mhp \n the player's new maximum hit points. - * @brief Maximum hit points. - * @return Boolean \n TRUE if hook has processed player hit points, otherwise - * FALSE. - * @note - * If the hook returns TRUE, the player's maximum hit points are updated. - * @note (see file xtra1.c) - */ -#define HOOK_CALC_HP 57 - -/** @def HOOK_CALC_MANA - * @brief Recalculate player SP (spell points).\n - * @param Number msp \n the player's new maximum spell points. - * @brief Maximum spell points. - * @return Boolean \n TRUE if hook has processed player spell points, otherwise - * FALSE. - * @note - * If the hook returns TRUE, the player's maximum spell points are updated. - * @note (see file xtra1.c) - */ -#define HOOK_CALC_MANA 60 - -/** @def HOOK_LOAD_END - * @brief Load a savefile.\n - * @param Number death \n TRUE if the character is dead, otherwise FALSE. - * @brief Dead character? - * @return Boolean \n TRUE if hook has processed savefile, otherwise FALSE. - * @return Number death \n - * @note - * If the hook returns TRUE, then "character_loaded" (real living player) is - * set to TRUE. The player has been revived. - * @note (see file loadsave.c) - */ -#define HOOK_LOAD_END 61 - -/** @def HOOK_RECALL - * @brief Player recalls from/to dungeon/town. - * @return Boolean \n TRUE if player is not allowed to recall, otherwise - * FALSE. - * @note (see file dungeon.c) - */ -#define HOOK_RECALL 62 - -/** @def HOOK_BODY_PARTS - * @brief Calculate which body parts the player has. - * @note (see file xtra1.c) - */ -#define HOOK_BODY_PARTS 65 - -/** @def HOOK_APPLY_MAGIC - * @brief Apply magic to an item.\n - * @param Object o_ptr \n the item to which magic is applied - * @brief Object - * @param Number level \n the level of the object - * @brief Object level - * @param Number power \n the power of the object (0 = normal, 1 = good, - * 2 = great, -1 = cursed, -2 = broken) - * @brief Power - * @return Boolean \n TRUE if hook has applied magic, otherwise FALSE. - * @note - * If the hook returns TRUE, a_m_aux_n() (where n=1 to 4) returns. - * @note (see file object2.c) - */ -#define HOOK_APPLY_MAGIC 66 - -/** @def HOOK_PLAYER_EXP - * @brief Player gains/loses experience points (XP).\n - * @param Number amount \n the number of experience points to gain/lose - * @brief Points - * @note (see file xtra2.c) - */ -#define HOOK_PLAYER_EXP 67 - -/** @def HOOK_BIRTH - * @brief Player is born. - * @note (see file birth.c) - */ -#define HOOK_BIRTH 68 - -/** @def HOOK_LEARN_ABILITY - * @brief Player learns an ability.\n - * @param Number ab \n index of ability in ability (ab_info) array. - * @brief Ability index - * @return Boolean \n TRUE if player is not to gain the ability, otherwise - * FALSE. - * @note If the hook returns TRUE, can_learn_ability() returns FALSE. - * @note (see file skills.c) - */ -#define HOOK_LEARN_ABILITY 70 - -/** @def HOOK_MOVED - * @brief Player finishes moving. - * @note (see file cmd1.c) - */ -#define HOOK_MOVED 71 - -/** @def HOOK_GAME_START - * @brief Game begins. - * @note (see file dungeon.c) - */ -#define HOOK_GAME_START 72 - -/** @def HOOK_TAKEOFF - * @brief Player takes off an item.\n - * @param Number item \n the item to take off. - * @brief Item - * @return Booelan \n TRUE if item can not be taken off, otherwise FALSE. - * @note - * If the hook returns TRUE, do_cmd_takeoff() returns. - * @note (see file cmd3.c) - */ -#define HOOK_TAKEOFF 73 - -/** @def HOOK_CALC_WEIGHT - * @brief Calculate player weight limit.\n - * @param Number weight \n the current weight limit. - * @brief Weight - * @return Boolean \n TRUE if weight was processed, otherwise FALSE. - * @return Number weight \n The new maximum weight. - * @note - * If the hook returns TRUE, weight_limit() returns the hook's weight. - * @note (see file xtra1.c) - */ -#define HOOK_CALC_WEIGHT 74 - -/** @def HOOK_FORBID_TRAVEL - * @brief Check if the player may press < and travel.\n - * @return Boolean \n TRUE if travel is forbidden, otherwise FALSE. - */ -#define HOOK_FORBID_TRAVEL 75 - -/** @def HOOK_DEBUG_COMMAND - * @brief User enters a debug command.\n - * @param Number command \n the pressed key (cmd). - * @brief Command - * @return Boolean \n TRUE if special processing was done, otherwise FALSE. - */ -#define HOOK_DEBUG_COMMAND 76 - - -/** @} */ - - -/** @var turn - * @brief Number - * @note Current game turn - */ -extern s32b turn; -/** @var old_turn - * @brief Number - * @note Turn when level began (feelings) - */ -extern s32b old_turn; -/** @var cur_wid - * @brief Number - * @note Current dungeon width - */ -extern s16b cur_wid; -/** @var cur_hgt - * @brief Number - * @note Current dungeon height - */ -extern s16b cur_hgt; - -/** @fn disturb(int stop_search, int flush_output) - * @brief Disturb the player.\n - * @param stop_search Number \n if 0, this will not disturb searching, - * otherwise searching is stopped. - * @brief Stop search? - * @param flush_output Number \n *unused* - * @brief *Unused* - * @note - * Something has happened to disturb the player.\n\n - * The first arg indicates a major disturbance, which affects search.\n - * The second arg is currently unused, but could induce output flush.\n\n - * All disturbance cancels repeated commands, resting, and running. - * @note (see file cave.c) - */ -extern void disturb(int stop_search, int flush_output); - -/** @fn bst(s32b what, s32b t) - * @brief Break scalar time.\n - * @param what Number \n the unit time "t" is to be broken into. The following - * values can be used: MINUTE, HOUR, DAY, YEAR - * @brief Unit of time - * @param t Number \n the time to be broken. - * @brief Time - * @return Number \n The number of unit in time "t". - * @note (see file util.c) - */ -extern s32b bst(s32b what, s32b t); - -$static char *path_build_lua(cptr path, cptr file){static char buf[1025]; path_build(buf, 1024, path, file); return buf;} - -/** @fn path_build(cptr path, cptr file); - * @brief Create a new path by appending a file (or directory) to a path.\n - * @param path String \n the original path. - * @brief Path - * @param file String \n the file or directory to append to the path. - * @brief File or directory - * @return String \n The new path. - * @note - * This requires no special processing on simple machines, except - * for verifying the size of the filename, but note the ability to - * bypass the given "path" with certain special file-names.\n\n - * Note that the "file" may actually be a "sub-path", including - * a path and a file.\n\n - * @note (see file util.c) - */ -static char *path_build_lua@path_build(cptr path, cptr file); - -/** @fn move_cursor(int row, int col) - * @brief Move the cursor of a terminal to row "row" and column "col".\n - * @param row Number \n the target row on the screen. - * @brief Row - * @param col Number \n the target column on the screen. - * @brief Column - * @note (see file util.c) - */ -extern void move_cursor(int row, int col); - -/** @fn flush(void) - * @brief Flush all input chars. - * @note - * Actually, remember the flush, and do a "special flush" before the next - * "inkey()". - * This is not only more efficient, but also necessary to make sure - * that various "inkey()" codes are not "lost" along the way. - * @note (see file util.c) - */ -extern void flush(void); - -/** @var inkey_scan - * @brief Boolean - * @note - * If "inkey_scan" is TRUE, then we will immediately return "zero" if no - * keypress is available, instead of waiting for a keypress. - */ -extern bool inkey_scan; - -/** @fn inkey(void) - * @brief Get a keypress from the user. - * @return String \n the key pressed by the user. - * @note - * This function recognizes a few "global parameters". These are variables - * which, if set to TRUE before calling this function, will have an effect - * on this function, and which are always reset to FALSE by this function - * before this function returns. Thus they function just like normal - * parameters, except that most calls to this function can ignore - * them.\n\n - * If "inkey_xtra" is TRUE, then all pending keypresses will be flushed, - * and any macro processing in progress will be aborted. This flag is - * set by the "flush()" function, which does not actually flush anything - * itself, but rather, triggers delayed input flushing via - * "inkey_xtra".\n\n - * If "inkey_scan" is TRUE, then we will immediately return "zero" if no - * keypress is available, instead of waiting for a - * keypress.\n\n - * If "inkey_base" is TRUE, then all macro processing will be bypassed. - * If "inkey_base" and "inkey_scan" are both TRUE, then this function will - * not return immediately, but will wait for a keypress for as long as the - * normal macro matching code would, allowing the direct entry of macro - * triggers. The "inkey_base" flag is extremely - * dangerous!\n\n - * If "inkey_flag" is TRUE, then we will assume that we are waiting for a - * normal command, and we will only show the cursor if "hilite_player" is - * TRUE (or if the player is in a store), instead of always showing the - * cursor. The various "main-xxx.c" files should avoid saving the game - * in response to a "menu item" request unless "inkey_flag" is TRUE, to - * prevent savefile - * corruption.\n\n - * If we are waiting for a keypress, and no keypress is ready, then we will - * refresh (once) the window which was active when this function was - * called.\n\n - * Note that "back-quote" is automatically converted into "escape" for - * convenience on machines with no "escape" key. This is done after the - * macro matching, so the user can still make a macro for - * "backquote".\n\n - * Note the special handling of "ascii 30" (ctrl-caret, aka ctrl-shift-six) - * and "ascii 31" (ctrl-underscore, aka ctrl-shift-minus), which are used to - * provide support for simple keyboard "macros". These keys are so strange - * that their loss as normal keys will probably be noticed by nobody. The - * "ascii 30" key is used to indicate the "end" of a macro action, which - * allows recursive macros to be avoided. The "ascii 31" key is used by - * some of the "main-xxx.c" files to introduce macro trigger - * sequences.\n\n - * Hack -- we use "ascii 29" (ctrl-right-bracket) as a special "magic" key, - * which can be used to give a variety of "sub-commands" which can be used - * any time. These sub-commands could include commands to take a picture of - * the current screen, to start/stop recording a macro action, - * etc.\n\n - * If "angband_term[0]" is not active, we will make it active during this - * function, so that the various "main-xxx.c" files can assume that input - * is only requested (via "Term_inkey()") when "angband_term[0]" is - * active.\n\n - * Mega-Hack -- This function is used as the entry point for clearing the - * "signal_count" variable, and of the "character_saved" - * variable.\n\n - * Hack -- Note the use of "inkey_next" to allow "keymaps" to be - * processed.\n\n - * Mega-Hack -- Note the use of "inkey_hack" to allow the "Borg" to steal - * control of the keyboard from the user. - * @note (see file util.c) - */ -extern char inkey(void); - -/** @fn cmsg_print(byte color, cptr msg) - * @brief Output message "msg" in colour "color" to the top line of the - * screen.\n - * @param color Number \n the colour of the message (see TERM_ fields). - * @brief Colour - * @param msg String \n the message. - * @brief Message - * @note - * Break long messages into multiple pieces (40-72 chars).\n\n - * Allow multiple short messages to "share" the top line.\n\n - * Prompt the user to make sure he has a chance to read them.\n\n - * These messages are memorized for later reference (see above).\n\n - * We could do "Term_fresh()" to provide "flicker" if needed.\n\n - * The global "msg_flag" variable can be cleared to tell us to - * "erase" any "pending" messages still on the - * screen.\n\n - * XXX XXX XXX Note that we must be very careful about using the - * "msg_print()" functions without explicitly calling the special - * "msg_print(NULL)" function, since this may result in the loss - * of information if the screen is cleared, or if anything is - * displayed on the top - * line.\n\n - * XXX XXX XXX Note that "msg_print(NULL)" will clear the top line - * even if no messages are pending. This is probably a hack. - * @note (see file util.c) - */ -extern void cmsg_print(byte color, cptr msg); - -/** @fn msg_print(cptr msg) - * @brief Output message "msg" in white to the top line of the screen.\n - * @param msg String \n the message. - * @brief Message - * @note (see file util.c) - */ -extern void msg_print(cptr msg); - -/** @fn screen_save(void) - * @brief Save the screen. - * @note - * Increase the "icky" depth.\n\n - * This function must match exactly one call to "screen_load()". - * @note (see file util.c) - */ -extern void screen_save(void); - -/** @fn screen_load(void) - * @brief Load the screen. - * @note - * Decrease the "icky" depth.\n\n - * This function must match exactly one call to "screen_save()". - * @note (see file util.c) - */ -extern void screen_load(void); - -/** @fn Term_save(void) - * @brief Save the "requested" screen into the "memorized" screen. - * @return Number \n 0 (always). - * @note - * Every "Term_save()" should match exactly one "Term_load()" - * @note (see file z-term.c) - */ -extern errr Term_save(void); - -/** @fn Term_load(void) - * @brief Restore the "requested" contents from the "memorized" screen. - * @return Number \n 0 (always). - * @note - * Every "Term_save()" should match exactly one "Term_load()" - * @note (see file z-term.c) - */ -extern errr Term_load(void); - -/** @fn c_put_str(byte attr, cptr str, int row, int col) - * @brief Add string "str" with attributes "attr" to screen at row "row" - * and column "col".\n - * @param attr Number \n the attribute of the string - * @brief Attribute - * @param str String \n the string - * @brief String - * @param row Number \n the target row on the screen. - * @brief Row - * @param col Number \n the target column on the screen. - * @brief Column - * @note - * Display a string on the screen using an attribute.\n\n - * At the given location, using the given attribute, if allowed, - * add the given string. Do not clear the line. - * @note (see file util.c) - */ -extern void c_put_str(byte attr, cptr str, int row, int col); - -/** @fn c_prt(byte attr, cptr str, int row, int col) - * @brief Add string "str" with attributes "attr" to screen at row "row" - * and column "col", clearing to the end of the row.\n - * @param attr Number \n the attribute of the string - * @brief Attribute - * @param str String \n the string - * @brief String - * @param row Number \n the target row on the screen. - * @brief Row - * @param col Number \n the target column on the screen. - * @brief Column - * @note (see file util.c) - */ -extern void c_prt(byte attr, cptr str, int row, int col); - -/** @fn prt(cptr str, int row, int col) - * @brief Add white string "str" to screen at row "row" and column "col", - * clearing to the end of the row.\n - * @param str String \n the string - * @brief String - * @param row Number \n the target row on the screen. - * @brief Row - * @param col Number \n the target column on the screen. - * @brief Column - * @note (see file util.c) - */ -extern void prt(cptr str, int row, int col); - -/** @fn message_add(byte type, cptr msg, byte color) - * @brief Add a message "msg" of type "type" and colour "color" to the - * message array.\n - * @param type Number \n the type of message. MESSAGE_MSG for regular - * messages. - * @brief Type - * @param msg String \n the message. - * @brief Message - * @param color Number \n the colour of the message (see TERM_ fields). - * @brief Colour - * @note - * Use "msg_print() instead. If you insist on using this function, be - * careful. - * @note (see file util.c) - */ -extern void message_add(byte type, cptr msg, byte color); - -/** @fn display_message(int x, int y, int split, byte color, cptr t) - * @brief Display a message.\n - * @param x Number \n the x-coordinate of the screen where the message starts. - * @brief X-coordinate - * @param y Number \n the y-coordinate of the screen where the message starts. - * @brief Y-coordinate - * @param split Number \n the position in the message where it is split. The - * rest of the message will not appear. - * @brief Split position - * @param color Number \n the colour of the message (see TERM_ fields). - * @brief Colour - * @param t String \n the message. - * @brief Message - * @note - * @note (see file util.c) - */ -extern void display_message(int x, int y, int split, byte color, cptr t); - -/** @fn clear_from(int row) - * @brief Clear part of the screen.\n - * @param row Number \n the target row on the screen. - * @brief Row - * @note - * Clear all rows from the starting row to the end of the screen. - * @note (see file util.c) - */ -extern void clear_from(int row); - -/** @fn askfor_aux(char *buf, int len) - * @brief Get some input at the cursor location.\n - * @param *buf String \n Default string (optional). - * @brief String - * @param len Number \n the maximum length of the string. - * @brief Length of string - * @return Boolean \n TRUE if string was entered, otherwise FALSE. - * @return *buf \n The entered string. - * @note - * Assume the buffer is initialized to a default string.\n - * Note that this string is often "empty" (see below).\n - * The default buffer is displayed in yellow until cleared.\n - * Pressing RETURN right away accepts the default entry.\n - * Normal chars clear the default and append the char.\n - * Backspace clears the default or deletes the final char.\n - * ESCAPE clears the buffer and the window and returns FALSE.\n - * RETURN accepts the current buffer contents and returns TRUE. - * @note (see file util.c) - */ -extern bool askfor_aux(char *buf, int len); - -/** @fn get_string(cptr prompt, char *buf, int len) - * @brief Get a string from the user.\n - * @param prompt String \n the prompt, which should take the form "Prompt: " - * @brief Prompt - * @param *buf String - * @brief String - * @param len Number \n the maximum length of the string. - * @brief Length of string - * @return Boolean \n TRUE if string was entered, otherwise FALSE. - * @return *buf \n The entered string. - * @note - * Note that the initial contents of the string is used as - * the default response, so be sure to "clear" it if needed.\n\n - * We clear the input, and return FALSE, on "ESCAPE". - * @note (see file util.c) - */ -extern bool get_string(cptr prompt, char *buf, int len); - -/** @fn get_check(cptr prompt) - * @brief Verify something with the user.\n - * @param prompt String \n the prompt, which should take the form "Query? " - * @brief Prompt - * @return Boolean \n TRUE if "y" or "Y" is entered, otherwise FALSE. - * @note - * Note that "[y/n]" is appended to the prompt. - * @note (see file util.c) - */ -extern bool get_check(cptr prompt); - -/** @fn get_com(cptr promtp, int *com = 0); - * @brief Prompts for a keypress.\n - * @param promtp String \n the prompt, which should take the form "Command: " - * @brief Prompt - * @param *com Number - * @brief Command - * @return Boolean \n FALSE if "Escape" was pressed, otherwise TRUE. - * @return *com \n The entered command. - * @note (see file util.c) - */ -extern bool get_com_lua @ get_com(cptr promtp, int *com = 0); - -/** @fn get_quantity(cptr prompt, s32b max) - * @brief Request a "quantity" from the user.\n - * @param prompt String \n the prompt - * @brief Prompt - * @param max Number \n the maximum quantity - * @brief Maximum quantity - * @return Number \n the returned quantity. - * @note - * Hack -- allow "command_arg" to specify a quantity\n\n - * The quantity is in the range 0 to "max" inclusive. The default is 1. A - * letter means the maximum. - * @note (see file util.c) - */ -extern s32b get_quantity(cptr prompt, s32b max); - -/** @fn test_monster_name(cptr name) - * @brief Given monster name as string, return the index in r_info array.\n - * @param name String \n the monster name. - * @brief Monster name - * @return Number \n The index of the monster in r_info[], or 0 if the name - * does not match a monster. - * @note - * Name must exactly match (look out for commas and the like!), or else 0 is - * returned. Case doesn't matter. - * @note (see file util.c) - */ -extern int test_monster_name(cptr name); - -/** @fn test_item_name(cptr name) - * @brief Given item name as string, return the index in k_info array.\n - * @param name String \n the item name. - * @brief Item name - * @return Number \n The index of the item in k_info[], or 0 if the name - * does not match an item. - * @note - * Name must exactly match (look out for commas and the like!), or else 0 is - * returned. Case doesn't matter. - * @note (see file util.c) - */ -extern int test_item_name(cptr name); - -/** @fn luck(int min, int max) - * @brief Return a luck number between a certain range.\n - * @param min Number \n the minimum luck value returned. - * @brief Mimimum - * @param max Number \n the maximum luck value returned. - * @brief Maximum - * @return Number \n The scaled value of player's luck. - * @note - * Player lucked is cap at a minimum of -30 and maximum of +30 before it is - * scaled to the range defined by "min" and "max". - * @note (see file xtra1.c) - */ -extern int luck(int min, int max); - -/** @fn get_player_race_name(int pr, int ps) - * @brief Return the player's race (and sub-race) name.\n - * @param pr Number \n the player's race. It is an index to race_info[]. - * @brief Player race - * @param ps Number \n the player's subrace, if any. It is an index to - * race_mod_info[]. - * @brief Player subrace - * @return String \n The player's full race name. - * @note (see file util.c) - */ -extern cptr get_player_race_name(int pr, int ps); - -/** @fn quit(cptr str) - * @brief Quit the game. - * @param str String \n an error code or a message which is logged. - * @brief String - * @note - * Exit (ala "exit()"). If 'str' is NULL, do "exit(0)".\n - * If 'str' begins with "+" or "-", do "exit(atoi(str))".\n - * Otherwise, plog() 'str' and exit with an error code of -1.\n - * But always use 'quit_aux', if set, before anything else. - * @note (see file z-util.c) - */ -extern void quit(cptr str); - -/** @fn text_out_c(byte a, cptr str) - * @brief Output text to the screen (in color) or to a file depending on the - * selected hook.\n - * @param a Number \n the attribute of the string - * @brief Attribute - * @param str String \n the string - * @brief String - * @note (see file util.c) - */ -extern void text_out_c(byte a, cptr str); - -/** @fn text_out(cptr str) - * @brief Output text to the screen (in white) or to a file depending on the - * selected hook.\n - * @param str String \n the string - * @brief String - * @note (see file util.c) - */ -extern void text_out(cptr str); - -/** @fn change_option(cptr name, bool value) - * @brief Switch an option by only knowing its name.\n - * @param name String \n the name of the option. - * @brief Option name - * @param value Boolean \n the new value of the option. - * @brief Option value - * @return Boolean \n the old value of the option, or FALSE if "name" is not - * an option. - * @note (see file cmd4.c) - */ -extern bool change_option(cptr name, bool value); - -/** @var process_hooks_restart - * @brief Number - * @note - * Set this to TRUE after deleting a C-hook (from a quest) to clean up hook - * processing. This is not required for Lua hooks as they are not deleted. - */ -extern int process_hooks_restart; - -/** @fn dump_hooks(int h_idx) - * @brief Print the name and type (language) of all hooks in a hook chain.\n - * @param h_idx Number \n the index of the hook chain in the hook_chain array. - * If this is -1, then all hook chains will be printed. - * @brief Hook chain index - * @note (see file plots.c) - */ -extern void dump_hooks(int h_idx); - -/** @fn add_hook_script(int h_idx, char *script, cptr name) - * @brief Add Lua script "name" in file "script" to hook_chain.\n - * @param h_idx Number \n the index of the hook chain in the hook_chain array. - * @brief Hook chain index - * @param *script String \n the name of the Lua script file. - * @brief Script filename - * @param name String \n the name of the script. - * @brief Script name - * @note (see file plots.c) - */ -extern void add_hook_script(int h_idx, char *script, cptr name); - -/** @fn del_hook_name(int h_idx, cptr name) - * @brief Delete hook with name "name" from a hook chain.\n - * @param h_idx Number \n the index of the hook chain in the hook_chain array. - * @brief Hook chain index - * @param name String \n the name of the hook to delete - * @brief Hook name - * @note (see file plots.c) - */ -extern void del_hook_name(int h_idx, cptr name); - -/** @fn tome_dofile(char *file) - * @brief Load a Lua file from lib/scpts.\n - * @param *file String \n the name of a Lua file to load. - * @brief Filename - * @return Boolean \n TRUE if file was loaded, otherwise FALSE. - * @note (see file script.c) - */ -extern bool tome_dofile(char *file); - -/** @fn tome_dofile_anywhere(cptr dir, char *file, bool test_exist = TRUE) - * @brief Load a Lua file from any directory.\n - * @param dir String \n the name of a Lua file directory - * @brief Directory - * @param *file String \n the name of a Lua file to load. - * @brief Filename - * @param test_exist Boolean \n TRUE if a message is printed if the file does - * not exist, otherwise FALSE. - * @brief Message if file does not exist? - * @return Boolean \n TRUE if file was loaded, otherwise FALSE. - * @note (see file script.c) - */ -extern bool tome_dofile_anywhere(cptr dir, char *file, bool test_exist = TRUE); - -/** @fn exec_lua(char *file) - * @brief Execute Lua command "file" and return the integer result.\n - * @param *file String \n the Lua command to execute. - * @brief Command - * @return Number \n the result of the Lua command. - * @note (see file script.c) - */ -extern int exec_lua(char *file); - -/** @fn dump_lua_stack(int min, int max) - * @brief Display part of the Lua stack.\n - * @param min Number \n the starting item of the stack dump. - * @brief Start item - * @param max Number \n the ending item of the stack dump. - * @brief End item - * @note (see file script.c) - */ -extern void dump_lua_stack(int min, int max); - -/** @fn string_exec_lua(char *file) - * @brief Execute Lua command "file" and return the string result.\n - * @param *file String \n the Lua command to execute. - * @brief Command - * @return String \n the result of the Lua command. - * @note (see file script.c) - */ -extern cptr string_exec_lua(char *file); - -/** @fn print_hook(cptr str); - * @brief Print string "string" to the hook file.\n - * @param str String \ the string. - * @brief String - * @note (see file lua_bind.c) - */ -extern void lua_print_hook@print_hook(cptr str); - - -/* Tables */ -/** @var adj_mag_study[100] - * @brief Number - * @note Stat Table (INT/WIS) -- Number of half-spells per level - */ -extern byte adj_mag_study[100]; - -/** @var adj_mag_mana[100] - * @brief Number - * @note Stat Table (INT/WIS) -- extra half-mana-points per level - */ -extern byte adj_mag_mana[100]; - -/** @var adj_mag_fail[100] - * @brief Number - * @note Stat Table (INT/WIS) -- Minimum failure rate (percentage) - */ -extern byte adj_mag_fail[100]; - -/** @var adj_mag_stat[100] - * @brief Number - * @note Stat Table (INT/WIS) -- Various things - */ -extern byte adj_mag_stat[100]; - -/** @var adj_chr_gold[100] - * @brief Number - * @note Stat Table (CHR) -- payment percentages - */ -extern byte adj_chr_gold[100]; - -/** @var adj_int_dev[100] - * @brief Number - * @note Stat Table (INT) -- Magic devices - */ -extern byte adj_int_dev[100]; - -/** @var adj_wis_sav[100] - * @brief Number - * @note Stat Table (WIS) -- Saving throw - */ -extern byte adj_wis_sav[100]; - -/** @var adj_dex_dis[100] - * @brief Number - * @note Stat Table (DEX) -- disarming - */ -extern byte adj_dex_dis[100]; - -/** @var adj_int_dis[100] - * @brief Number - * @note Stat Table (INT) -- disarming - */ -extern byte adj_int_dis[100]; - -/** @var adj_dex_ta[100] - * @brief Number - * @note Stat Table (DEX) -- bonus to ac (plus 128) - */ -extern byte adj_dex_ta[100]; - -/** @var adj_str_td[100] - * @brief Number - * @note Stat Table (STR) -- bonus to dam (plus 128) - */ -extern byte adj_str_td[100]; - -/** @var adj_dex_th[100] - * @brief Number - * @note Stat Table (DEX) -- bonus to hit (plus 128) - */ -extern byte adj_dex_th[100]; - -/** @var adj_str_th[100] - * @brief Number - * @note Stat Table (STR) -- bonus to hit (plus 128) - */ -extern byte adj_str_th[100]; - -/** @var adj_str_wgt[100] - * @brief Number - * @note Stat Table (STR) -- weight limit in deca-pounds - */ -extern byte adj_str_wgt[100]; - -/** @var adj_str_hold[100] - * @brief Number - * @note Stat Table (STR) -- weapon weight limit in pounds - */ -extern byte adj_str_hold[100]; - -/** @var adj_str_dig[100] - * @brief Number - * @note Stat Table (STR) -- digging value - */ -extern byte adj_str_dig[100]; - -/** @var adj_str_blow[100] - * @brief Number - * @note Stat Table (STR) -- help index into the "blow" table - */ -extern byte adj_str_blow[100]; - -/** @var adj_dex_blow[100] - * @brief Number - * @note Stat Table (DEX) -- index into the "blow" table - */ -extern byte adj_dex_blow[100]; - -/** @var adj_dex_safe[100] - * @brief Number - * @note Stat Table (DEX) -- chance of avoiding "theft" and "falling" - */ -extern byte adj_dex_safe[100]; - -/** @var adj_con_fix[100] - * @brief Number - * @note Stat Table (CON) -- base regeneration rate - */ -extern byte adj_con_fix[100]; - -/** @var adj_con_mhp[100] - * @brief Number - * @note Stat Table (CON) -- extra half-hitpoints per level (plus 128) - */ -extern byte adj_con_mhp[100]; - -/* Repeat stuff */ -/** @fn repeat_push(int what) - * @brief Push key "what" onto the end of the repeat_key array.\n - * @param what Number \n the key to be repeated. - * @brief Key - * @note (see file util.c) - */ -extern void repeat_push(int what); - -/** @fn repeat_pull(int *what = 0) - * @brief Pull key from the repeat__key array.\n - * @param *what Number - * @brief Key - * @return Boolean \n TRUE if key was pulled, otherwise FALSE. - * @return *what Number \n the key pulled. - * @note - * This functions starts from an index, which may not be at the start of the - * array. - * @note (see file util.c) - */ -extern bool repeat_pull(int *what = 0); - -/** @fn repeat_check(void) - * @brief Check if the last command is repeated. - * @note - * Ignore certain commands: ESC, space, newline.\n - * 'n' repeats the last command (index is set to 0).\n - * Other commands reset the repeat array (index and count are set to 0). - * @note (see file util.c) - */ -extern void repeat_check(void); - -/** @fn get_count(int number, int max) - * @brief Allow the user to select multiple items without pressing '0'.\n - * @param number Number \n the default number. - * @brief Default - * @param max Number \n the maximum value allowed. - * @brief Maximum - * The user is prompted with "How many?" - * @note (see file util.c) - */ -extern void get_count(int number, int max); - -/** @name Feature Flags - * @{ - */ -/** @def FF1_NO_WALK */ -#define FF1_NO_WALK 0x00000001L - -/** @def FF1_NO_VISION */ -#define FF1_NO_VISION 0x00000002L - -/** @def FF1_CAN_LEVITATE */ -#define FF1_CAN_LEVITATE 0x00000004L - -/** @def FF1_CAN_PASS */ -#define FF1_CAN_PASS 0x00000008L - -/** @def FF1_FLOOR */ -#define FF1_FLOOR 0x00000010L - -/** @def FF1_WALL */ -#define FF1_WALL 0x00000020L - -/** @def FF1_PERMANENT */ -#define FF1_PERMANENT 0x00000040L - -/** @def FF1_CAN_FLY */ -#define FF1_CAN_FLY 0x00000080L - -/** @def FF1_REMEMBER */ -#define FF1_REMEMBER 0x00000100L - -/** @def FF1_NOTICE */ -#define FF1_NOTICE 0x00000200L - -/** @def FF1_DONT_NOTICE_RUNNING */ -#define FF1_DONT_NOTICE_RUNNING 0x00000400L - -/** @def FF1_CAN_RUN */ -#define FF1_CAN_RUN 0x00000800L - -/** @def FF1_DOOR */ -#define FF1_DOOR 0x00001000L - -/** @def FF1_SUPPORT_LIGHT */ -#define FF1_SUPPORT_LIGHT 0x00002000L - -/** @def FF1_CAN_CLIMB */ -#define FF1_CAN_CLIMB 0x00004000L - -/** @def FF1_TUNNELABLE */ -#define FF1_TUNNELABLE 0x00008000L - -/** @def FF1_WEB */ -#define FF1_WEB 0x00010000L - -/** @def FF1_ATTR_MULTI */ -#define FF1_ATTR_MULTI 0x00020000L - -/** @def FF1_SUPPORT_GROWTH */ -#define FF1_SUPPORT_GROWTH 0x00040000L -/** @} */ - - -/* Cave stuff */ -/** @struct cave_type - */ -struct cave_type -{ - /** @structvar info - * @brief Number - * @note Hack -- cave flags - */ - u16b info; - - /** @structvar feat - * @brief Number - * @note Hack -- feature type - */ - byte feat; - - /** @structvar o_idx - * @brief Number - * @note Object in this grid - */ - s16b o_idx; - - /** @structvar m_idx - * @brief Number - * @note Monster in this grid - */ - s16b m_idx; - - /** @structvar t_idx - * @brief Number - * @note trap index (in t_list) or zero - */ - s16b t_idx; - - /** @structvar special - * @brief Number - */ - s16b special; - /** @structvar special2 - * @brief Number - * @note Special cave info - */ - s16b special2; - - /** @structvar inscription - * @brief Number - * @note Inscription of the grid - */ - s16b inscription; - - /** @structvar mana - * @brief Number - * @note Magical energy of the grid - */ - byte mana; - - /** @structvar mimic - * @brief Number - * @note Feature to mimic - */ - byte mimic; - - /** @structvar effect - * @brief Number - * @note The lasting effects - */ - s16b effect; -}; - -/** @var ANGBAND_SYS - * @brief String - * @note - * Hack -- The special Angband "System Suffix"\n - * This variable is used to choose an appropriate "pref-xxx" file - */ -extern cptr ANGBAND_SYS; - -/** @var ANGBAND_KEYBOARD - * @brief String - * @note - * Hack -- The special Angband "Keyboard Suffix"\n - * This variable is used to choose an appropriate macro-trigger definition - */ -extern cptr ANGBAND_KEYBOARD; - -/** @var ANGBAND_GRAF - * @brief String - * @note - * Hack -- The special Angband "Graphics Suffix"\n - * This variable is used to choose an appropriate "graf-xxx" file - */ -extern cptr ANGBAND_GRAF; - -/** @var ANGBAND_DIR - * @brief String - * @note - * Path name: The main "lib" directory\n - * This variable is not actually used anywhere in the code - */ -extern cptr ANGBAND_DIR; - -/** @var ANGBAND_DIR_APEX - * @brief String - * @note - * High score files (binary)\n - * These files may be portable between platforms - */ -extern cptr ANGBAND_DIR_APEX; - -/** @var ANGBAND_DIR_CORE - * @brief String - * @note - * Core lua system\n - * These files are portable between platforms - */ -extern cptr ANGBAND_DIR_CORE; - -/** @var ANGBAND_DIR_DNGN - * @brief String - * @note - * Textual dungeon level definition files\n - * These files are portable between platforms - */ -extern cptr ANGBAND_DIR_DNGN; - -/** @var ANGBAND_DIR_DATA - * @brief String - * @note - * Binary image files for the "*_info" arrays (binary)\n - * These files are not portable between platforms - */ -extern cptr ANGBAND_DIR_DATA; - -/** @var ANGBAND_DIR_EDIT - * @brief String - * @note - * Textual template files for the "*_info" arrays (ascii)\n - * These files are portable between platforms - */ -extern cptr ANGBAND_DIR_EDIT; - -/** @var ANGBAND_DIR_FILE - * @brief String - * @note - * Various extra files (ascii)\n - * These files may be portable between platforms - */ -extern cptr ANGBAND_DIR_FILE; - -/** @var ANGBAND_DIR_HELP - * @brief String - * @note - * Help files (normal) for the online help (ascii)\n - * These files are portable between platforms - */ -extern cptr ANGBAND_DIR_HELP; - -/** @var ANGBAND_DIR_INFO - * @brief String - * @note - * Help files (spoilers) for the online help (ascii)\n - * These files are portable between platforms - */ -extern cptr ANGBAND_DIR_INFO; - -/** @var ANGBAND_DIR_MODULES - * @brief String - * @note - * Modules, those subdirectories are half-mirrors of lib/ - */ -extern cptr ANGBAND_DIR_MODULES; - -/** @var ANGBAND_DIR_NOTE - * @brief String - * @note - * Textual template files for the plot files (ascii)\n - * These files are portable between platforms - */ -extern cptr ANGBAND_DIR_NOTE; - -/** @var ANGBAND_DIR_SAVE - * @brief String - * @note - * Savefiles for current characters (binary)\n - * These files are portable between platforms - */ -extern cptr ANGBAND_DIR_SAVE; - -/** @var ANGBAND_DIR_SCPT - * @brief String - * @note - * Scripts.\n - * These files are portable between platforms - */ -extern cptr ANGBAND_DIR_SCPT; - -/** @var ANGBAND_DIR_PREF - * @brief String - * @note - * Default "preference" files (ascii)\n - * These files are rarely portable between platforms - */ -extern cptr ANGBAND_DIR_PREF; - -/** @var ANGBAND_DIR_PATCH - * @brief String - * @note - * Patches, contains one subdir per patch with a patch.lua file - * in it and a patch_init() function in it - */ -extern cptr ANGBAND_DIR_PATCH; - -/** @var ANGBAND_DIR_USER - * @brief String - * @note - * User "preference" files (ascii)\n - * These files are rarely portable between platforms - */ -extern cptr ANGBAND_DIR_USER; - -/** @var ANGBAND_DIR_XTRA - * @brief String - * @note - * Various extra files (binary)\n - * These files are rarely portable between platforms - */ -extern cptr ANGBAND_DIR_XTRA; - -/** @var ANGBAND_DIR_CMOV - * @brief String - * @note - * Cmovie files of entire games (ascii)\n - * Apart from possible newline things, likely portable btw platforms - */ -extern cptr ANGBAND_DIR_CMOV; - - -/** @fn los(int y1, int x1, int y2, int x2) - * @brief Determine if a line of sight can be traced from (x1,y1) to (x2,y2).\n - * @param y1 Number \n y-coordinate of the origin. - * @brief Origin y-coordinate - * @param x1 Number \n x-coordinate of the origin. - * @brief Origin x-coordinate - * @param y2 Number \n y-coordinate of the target. - * @brief Target y-coordinate - * @param x2 Number \n x-coordinate of the target. - * @brief Target x-coordinate - * @return Boolean \n TRUE if origin has line of sight to target, otherwise - * FALSE. - * @note - * A simple, fast, integer-based line-of-sight algorithm. By Joseph Hall, - * 4116 Brewster Drive, Raleigh NC 27606. Email to jnh@ecemwl.ncsu.edu.\n\n - * Returns TRUE if a line of sight can be traced from (x1,y1) to (x2,y2).\n\n - * The LOS begins at the center of the tile (x1,y1) and ends at the center of - * the tile (x2,y2). If los() is to return TRUE, all of the tiles this line - * passes through must be floor tiles, except for (x1,y1) and (x2,y2).\n\n - * We assume that the "mathematical corner" of a non-floor tile does not - * block line of sight.\n\n - * Because this function uses (short) ints for all calculations, overflow may - * occur if dx and dy exceed 90.\n\n - * Once all the degenerate cases are eliminated, the values "qx", "qy", and - * "m" are multiplied by a scale factor "f1 = abs(dx * dy * 2)", so that - * we can use integer arithmetic.\n\n - * We travel from start to finish along the longer axis, starting at the border - * between the first and second tiles, where the y offset = .5 * slope, taking - * into account the scale factor. See below.\n\n - * Also note that this function and the "move towards target" code do NOT - * share the same properties. Thus, you can see someone, target them, and - * then fire a bolt at them, but the bolt may hit a wall, not them. However, - * by clever choice of target locations, you can sometimes throw a "curve".\n\n - * Note that "line of sight" is not "reflexive" in all cases.\n\n - * Use the "projectable()" routine to test "spell/missile line of sight".\n\n* - * Use the "update_view()" function to determine player line-of-sight.\n\n - * @note (see file cave.c) - */ -extern bool los(int y1, int x1, int y2, int x2); -$static bool lua_cave_is(cave_type *c_ptr, s32b flag) { return (f_info[c_ptr->feat].flags1 & flag) ? TRUE : FALSE; } - -/** @fn cave_is(cave_type *c_ptr, s32b flag); - * @brief Determine if cave "c_ptr" has feature "flag".\n - * @param *c_ptr cave_type \n the cave. - * @brief Cave - * @param flag Number \n the required feature flag. - * @brief Feature - * @return Boolean \n TRUE if the cave features include "flag", otherwise - * FALSE. - * @note (see file w_util.c) - */ -static bool lua_cave_is @ cave_is(cave_type *c_ptr, s32b flag); - -/** @fn cave(int y, int x); - * @brief Return the type of cave at grid coordinate (x,y).\n - * @param y Number \n y-coordinate of grid. - * @brief Y-coordinate - * @param x Number \n x-coordinate of grid. - * @brief X-coordinate - * @return cave_type \n The type of cave at grid coordinate (x,y). - * @note (see file lua_bind.c) - */ -extern cave_type *lua_get_cave @ cave(int y, int x); - -/** @fn set_target(int y, int x) - * @brief Set grid coordinate (x,y) as the target grid.\n - * @param y Number \n y-coordinate of grid. - * @brief Y-coordinate - * @param x Number \n x-coordinate of grid. - * @brief X-coordinate - * @note (see file lua_bind.c) - */ -extern void set_target(int y, int x); - -/** @fn get_target(int dir, int *y = 0, int *x = 0) - * @brief Get a target based on direction "dir" from the player.\n - * @param dir Number \n dir must be a value from 0 to 9. - * @brief Direction - * @param *y Number - * @brief Target y-coordinate - * @param *x Number - * @brief Target x-coordinate - * @return *y Number \n The y-coordinate of the target. - * @return *x Number \n The x-coordinate of the target. - * @note - * The target is actually 100 grids away in direction "dir". If "dir" is 5, - * the actual target, if one is set, is returned. - * @note (see file lua_bind.c) - */ -extern void get_target(int dir, int *y = 0, int *x = 0); - -/** @var m_allow_special[max_r_idx] - * @brief Boolean - * @note "Special gene" flags for monsters - */ -extern bool m_allow_special[max_r_idx]; - -/** @var k_allow_special[max_k_idx] - * @brief Boolean - * @note "Special gene" flags for objects - */ -extern bool k_allow_special[max_k_idx]; - -/** @var a_allow_special[max_a_idx] - * @brief Boolean - * @note "Special gene" flags for artifacts - */ -extern bool a_allow_special[max_a_idx]; - -/** @fn cave_set_feat(int y, int x, int feat) - * @brief Change the "feat" flag for a grid, and notice/redraw the grid - * @param y Number \n y-coordinate of grid. - * @brief Y-coordinate - * @param x Number \n x-coordinate of grid. - * @brief X-coordinate - * @param feat Number \n new set of feature flags. - * @brief Features - * @note (see file cave.c) - */ -extern void cave_set_feat(int y, int x, int feat); - -/** @fn show_file(cptr name, cptr what, int line, int mode) - * @brief Show a help file.\n - * @param name String \n name of the help file. - * @brief Filename - * @param what String \n hyperlink caption. - * @brief Caption - * @param line Number \n the line number from where to start the display of - * the file. - * @brief Starting line - * @param mode Number \n *unused* - * @brief *Unused* - * @return Boolean \n TRUE if file was shown successfully, otherwise FALSE.\n - * @note - * If the file is not found, the function will search the help, info, and file - * directories for the file. If it is still not found, a message is displayed - * and the function returns FALSE.\n\n - * The file is parsed once to extract colour, tag, and hyperlink - * information.\n\n - * The file is parse again to show it on the screen. - * @note (see file files.c) - */ -extern bool show_file(cptr name, cptr what, int line, int mode); - -/** @var target_who - * @brief Number - * @note - * If this is -1, the target is the player.\n - * If this is 0, there is no target.\n - * If this is >0, the target is the monster m_idx[target_who]. - */ -extern s16b target_who; - -/** @var target_col - * @brief Number - * @note The column of the target grid - */ -extern s16b target_col; - -/** @var target_row - * @brief Number - * @note The row of the target grid - */ -extern s16b target_row; - -/** @var max_bact - * @brief Number - * @note Maximum building actions - */ -extern int max_bact; - -/** @var ddd[9] - * @brief Number - * @note Global array for looping through the "keypad directions" - */ -extern s16b ddd[9]; - -/** @var ddx[10] - * @brief Number - * @note Global array for converting "keypad direction" into x offsets - */ -extern s16b ddx[10]; - -/** @var ddy[10] - * @brief Number - * @note Global array for converting "keypad direction" into y offsets - */ -extern s16b ddy[10]; - -/** @var ddx_ddd[9] - * @brief Number - * @note Global array for optimizing "ddx[ddd[i]]" - */ -extern s16b ddx_ddd[9]; - -/** @var ddy_ddd[9] - * @brief Number - * @note Global array for optimizing "ddy[ddd[i]]" - */ -extern s16b ddy_ddd[9]; - - -/* Gen stuff */ - -/** @fn load_map(char *name, int *y = 2, int *x = 2) - * @brief Load the map in file "name".\n - * @param *name String \n the name of the map file. - * @brief Map - * @param *y Number - * @brief Maximum y-coordinate - * @param *x Number - * @brief Maximum x-coordinate - * @return *y Number \n The maximum y-coordinate of the map. - * @return *x Number \n The maximum x-coordinate of the map. - * @note - * The map is loaded and the player is placed at the starting position. - * @note (see file lua_bind.c) - */ -extern void load_map(char *name, int *y = 2, int *x = 2); - -/** @fn alloc_room(int by0, int bx0, int ysize, int xsize, int *y1 = 0, int *x1 = 0, int *y2 = 0, int *x2 = 0) - * @brief Allocate the space needed by a room in the room_map array.\n - * @param by0 Number \n the y-coordinate of the block to contain the room. - * @brief Block y-coordinate - * @param bx0 Number \n the x-coordinate of the block to contain the room. - * @brief Block x-coordinate - * @param ysize Number \n the vertical size (height) of the room. - * @brief Room height - * @param xsize Number \n the horizontal size (width) of the room. - * @brief Room width - * @param *y1 Number - * @brief Top-right y-coordinate - * @param *x1 Number - * @brief Top-right x-coordinate - * @param *y2 Number - * @brief Bottom-left y-coordinate - * @param *x2 Number - * @brief Bottom-right x-coordinate - * @return Boolean \n TRUE if the room was allocated successfully, otherwise - * FALSE. - * @return *y1 Number \n The y-coordinate of the top left corner. - * @return *x1 Number \n The x-coordinate of the top left corner. - * @return *y2 Number \n The y-coordinate of the bottom right corner. - * @return *x2 Number \n The x-coordinate of the bottom right corner. - * @note - * Dungeon generation is not something to be messed around with unless you - * really, really, really know what you are doing (or you are DarkGod). - * @note (see file lua_bind.c, generate.c) - */ -extern bool alloc_room(int by0, int bx0, int ysize, int xsize, int *y1 = 0, int *x1 = 0, int *y2 = 0, int *x2 = 0); - -/* Misc stuff */ -/** @fn input_box(cptr title, int max); - * @brief Create an input box and ask the user a question.\n - * @param title String \n the title of the box, which should take the form of - * a question. For example, "New name?". - * @brief Title - * @param max Number \n the maximum length of the response. - * @brief Maximum response length - * @return String \n The answer to the question. - * @note - * The input box is placed in the middle of the screen. The default reponse is - * blank, and can be up to 79 characters long. - * @note (see file lua_bind.c, util.c) - */ -extern char *lua_input_box@input_box(cptr title, int max); - -/** @fn msg_box(cptr title); - * @brief Create a msg box and ask a question.\n - * @param title String \n the question. - * @brief Question - * @return String \n The answer. - * @note - * The message box is placed in the middle of the screen. The answer is a - * single character / key press. - * @note (see file lua_bind.c, util.c) - */ -extern char lua_msg_box@msg_box(cptr title); - -/** @fn rescale(s32b x, s32b max, s32b new_max) - * @brief Rescale value "x".\n - * @param x Number \n the original value. - * @brief Value - * @param max Number \n the original maximum that value could have. - * @brief Original maximum - * @param new_max Number \n the new maximum that value can have. - * @brief New maximum - * @return Number \n The rescaled value of "x". - * @note - * There is no error checking here. Please don't set "max" to zero. - * @note (see file util.c) - */ -extern s32b rescale(s32b x, s32b max, s32b new_max); -$static const char *player_name_lua(void){return (const char *)player_name;} - -/** @fn player_name() - * @brief Return the player's name. - * @return String \n The player's name. - * @note (see file w_util.c) - */ -const char *player_name_lua@player_name(); - -/* Quarks */ -/** @fn quark_str(s16b num) - * @brief Return a quark (inscription) from the quark array.\n - * @param num Number \n the index to the quark string array. If this is less - * than zero or more than the maximum number of quarks, it is treated as zero. - * @brief Quark index - * @return String \n The quark. - * @note - * We use a global array for all inscriptions to reduce the memory - * spent maintaining inscriptions. Of course, it is still possible - * to run out of inscription memory, especially if too many different - * inscriptions are used, but hopefully this will be rare.\n\n - * We use dynamic string allocation because otherwise it is necessary - * to pre-guess the amount of quark activity. We limit the total - * number of quarks, but this is much easier to "expand" as needed.\n\n - * Any two items with the same inscription will have the same "quark" - * index, which should greatly reduce the need for inscription space.\n\n - * Note that "quark zero" is NULL and should not be "dereferenced". - * @note (see file util.c) - */ -extern cptr quark_str(s16b num); - -/** @fn quark_add(cptr str) - * @brief Add a quark (inscription) to the quark array.\n - * @param str String \n the quark to add to the array. - * @brief Quark - * @return Number \n The index to the quark array for this quark - * @note - * The array is searched to see if the quark already exists. If so, the index - * to the existing quark is returned.\n - * If there is no room, 0 (NULL reference) is returned. - * @note (see file util.c) - */ -extern s16b quark_add(cptr str); - -/* Modules */ -/** @fn module_reset_dir(cptr dir, cptr new_path) - * @brief Redirect one of the ToME directories.\n - * @param dir String \n the name of the directory (not the full path). - * @brief Directory - * @param new_path String \n the new path of "dir" under ANGBAND_DIR_MODULES.\n - * @brief New path - * @note (see file modules.c) - */ -extern void module_reset_dir(cptr dir, cptr new_path); - -/** @fn scansubdir(cptr dir) - * @brief Scan sub-directory "dir".\n - * @param dir String \n the sub-directory to scan. - * @brief Directory - * @note - * Nicer wrapper around TERM_XTRA_SCANSUBDIR\n\n - * This function sets scansubdir_dir and calls the SCANSUBDIR terminal hook. - * @note (see file util.c) - */ -extern void scansubdir(cptr dir); - -/** @fn file_exist(char *buf) - * @brief Check if file "buf" exists.\n - * @param *buf String \n the file to be tested. - * @brief Filename - * @return Boolean \n TRUE if the file exists, otherwise FALSE. - * @note (see file loadsave.c) - */ -extern bool file_exist(char *buf); - -/** @var game_module - * @brief String - * @note The name of the current game module - */ -extern cptr game_module; - -/* Input */ -/** @fn get_keymap_dir(char ch) - * @brief Get a direction from the keyboard according to the keymap.\n - * @param ch String \n the character representing a direction. - * @brief Direction - * @return Number \n The direction represented by "ch". It will be in the - * range 0 to 9. - * @note - * If "ch" is a number, the number is used. Otherwise the direction is - * chosen from the Original or Rogue keymaps.\n - * If the direction is 5, it is set to 0. - * @note (see file util.c) - */ -extern int get_keymap_dir(char ch); - -extern errr file_character(cptr name, bool full); -extern void calc_bonuses(bool silent); - -extern void note_spot(int y, int x); -extern void lite_spot(int y, int x); - -/** - * Mimicry - */ -extern s16b resolve_mimic_name(cptr name); - -/** - * Timers - */ -void timer_aggravate_evil_enable(); - -/** - * Initialize bookable spells. - */ -void initialize_bookable_spells(); diff --git a/src/wizard2.c b/src/wizard2.c index e2683435..f6ce41af 100644 --- a/src/wizard2.c +++ b/src/wizard2.c @@ -184,43 +184,6 @@ static void wiz_create_named_art() msg_print("Allocated."); } -/* - * Hack -- quick debugging hook - */ -void do_cmd_wiz_hack_ben(int num) -{ - s32b a; - - /* MAKE(r_ptr, monster_race); - COPY(r_ptr, &r_info[500], monster_race); - - r_ptr->level = 1; - r_ptr->flags6 |= RF6_BLINK; - r_ptr->freq_inate = r_ptr->freq_spell = 90; - - place_monster_one_race = r_ptr; - place_monster_one(p_ptr->py - 1, p_ptr->px, 500, 0, TRUE, MSTATUS_PET);*/ - - get_lua_var("a", 'd', &a); - msg_format("a: %d", a); - - /* Success */ - return; -} - -void do_cmd_lua_script() -{ - char script[80] = "tome_dofile_anywhere(ANGBAND_DIR_CORE, 'gen_idx.lua')"; - - if (!get_string("Script:", script, 80)) return; - - exec_lua(script); - - /* Success */ - return; -} - - #ifdef MONSTER_HORDES /* Summon a horde of monsters */ @@ -1909,11 +1872,6 @@ void do_cmd_debug(void) do_cmd_wiz_zap(); break; - /* Hack -- whatever I desire */ - case '_': - do_cmd_wiz_hack_ben(command_arg); - break; - /* Mimic shape changing */ case '*': p_ptr->tim_mimic = 100; @@ -1954,10 +1912,6 @@ void do_cmd_debug(void) summon_specific(p_ptr->py, p_ptr->px, max_dlv[dungeon_type], command_arg); break; - case '>': - do_cmd_lua_script(); - break; - /* Not a Wizard Command */ default: if (!process_hooks(HOOK_DEBUG_COMMAND, "(d)", cmd)) diff --git a/src/z_pack.pkg b/src/z_pack.pkg deleted file mode 100644 index 5a46b3b2..00000000 --- a/src/z_pack.pkg +++ /dev/null @@ -1,398 +0,0 @@ -/* File: z_pack.pkg */ - -/* - * Purpose: Lua interface defitions for z-*.c - * To be processed by tolua to generate C source code. - */ - -$#include "angband.h" - -/** @typedef cptr - * @note String - */ -typedef char* cptr; -/** @typedef errr - * @note Number - */ -typedef int errr; -/** @typedef bool - * @note Boolean - */ -typedef unsigned char bool; -/** @typedef byte - * @note Number - */ -typedef unsigned char byte; -/** @typedef s16b - * @note Number - */ -typedef signed short s16b; -/** @typedef u16b - * @note Number - */ -typedef unsigned short u16b; -/** @typedef s32b - * @note Number - */ -typedef signed int s32b; -/** @typedef u32b - * @note Number - */ -typedef unsigned int u32b; - -/** @name Terminal actions - * @{ */ -/** @def TERM_XTRA_EVENT - * @note Process some pending events - */ -#define TERM_XTRA_EVENT 1 -/** @def TERM_XTRA_FLUSH - * @note Flush all pending events - */ -#define TERM_XTRA_FLUSH 2 -/** @def TERM_XTRA_CLEAR - * @note Clear the entire window - */ -#define TERM_XTRA_CLEAR 3 -/** @def TERM_XTRA_SHAPE - * @note Set cursor shape (optional) - */ -#define TERM_XTRA_SHAPE 4 -/** @def TERM_XTRA_FROSH - * @note Flush one row (optional) - */ -#define TERM_XTRA_FROSH 5 -/** @def TERM_XTRA_FRESH - * @note Flush all rows (optional) - */ -#define TERM_XTRA_FRESH 6 -/** @def TERM_XTRA_NOISE - * @note Make a noise (optional) - */ -#define TERM_XTRA_NOISE 7 -/** @def TERM_XTRA_SOUND - * @note Make a sound (optional) - */ -#define TERM_XTRA_SOUND 8 -/** @def TERM_XTRA_BORED - * @note Handle stuff when bored (optional) - */ -#define TERM_XTRA_BORED 9 -/** @def TERM_XTRA_REACT - * @note React to global changes (optional) - */ -#define TERM_XTRA_REACT 10 -/** @def TERM_XTRA_ALIVE - * @note Change the "hard" level (optional) - */ -#define TERM_XTRA_ALIVE 11 -/** @def TERM_XTRA_LEVEL - * @note Change the "soft" level (optional) - */ -#define TERM_XTRA_LEVEL 12 -/** @def TERM_XTRA_DELAY - * @note Delay some milliseconds (optional) - */ -#define TERM_XTRA_DELAY 13 -/** @def TERM_XTRA_GET_DELAY - * @note Get the cuyrrent time in milliseconds (optional) - */ -#define TERM_XTRA_GET_DELAY 14 -/** @def TERM_XTRA_SCANSUBDIR - * @note Scan for subdir in a dir - */ -#define TERM_XTRA_SCANSUBDIR 15 -/** @} */ - -/** @var Term_xtra_long - * @brief Number - */ -extern long Term_xtra_long; - -/** @var scansubdir_dir[1024] - * @brief String - * @note The directory which is scanned for sub-directories. - */ -char scansubdir_dir[1024]; - -/** @var scansubdir_max - * @brief Number - * @note The number of entries in the scansubdir_result array. - */ -int scansubdir_max; - -/** @var scansubdir_result[scansubdir_max] - * @brief String - * @note The sub-directories of scansubdir_dir directory. - */ -cptr scansubdir_result[scansubdir_max]; - -/** @fn Term_xtra(int n, int v) - * @brief Generic function to perform system dependant terminal actions.\n - * @param n Number \n a terminal action (see TERM_XTRA fields). - * @brief Terminal action - * @param v Number \n variable depending on the terminal action. - * @brief Variable - * @return Number \n Result of the terminal action. - * @note - * The "Term->xtra_hook" hook provides a variety of different functions, - * based on the first parameter (which should be taken from the various - * TERM_XTRA_* defines) and the second parameter (which may make sense - * only for some first parameters). It is available to the program via - * the "Term_xtra()" function, though some first parameters are only - * "legal" when called from inside this package. - * @note (see file z-term.c) - */ -extern errr Term_xtra(int n, int v); - -/** @fn Term_set_cursor(int v) - * @brief Set the cursor visibility.\n - * @param v Number \n v is the visibility. - * @brief Visibility - * @return Number \n 1 if visibility was unchanged, otherwise 0. - * @note - * Cursor visibility (field "cv") is defined as a boolean, so take care what - * value is assigned to "v". - * @note (see file z-term.c) - */ -extern errr Term_set_cursor(int v); - -/** @fn Term_gotoxy(int x, int y) - * @brief Place the cursor at a given location.\n - * @param x Number \n x-coordinate of target location. - * @brief X-coordinate - * @param y Number \n y-coordinate of target location. - * @brief Y-coordinate - * @return Number \n -1 if cursor could not be placed at given location, - * otherwise 0. - * @note - * Note -- "illegal" requests do not move the cursor.\n\n - * The cursor is flagged as useful if it placed okay. - * @note (see file z-term.c) - */ -extern errr Term_gotoxy(int x, int y); - -/** @fn Term_putch(int x, int y, byte a, char c) - * @brief Move to a location and, using an attr, add a char.\n - * @param x Number \n x-coordinate of target location. - * @brief X-coordinate - * @param y Number \n y-coordinate of target location. - * @brief Y-coordinate - * @param a Number \n attribute of character. - * @brief Attribute - * @param c String \n the character. - * @brief Character - * @return Number \n <0 if error, 0 if success, 1 if success but cursor is - * useless. - * @note - * We return "-2" if the character is "illegal". XXX XXX\n\n - * We return "-1" if the cursor is currently unusable.\n\n - * We queue the given attr/char for display at the current - * cursor location, and advance the cursor to the right, - * marking it as unuable and returning "1" if it leaves - * the screen, and otherwise returning "0".\n\n - * So when this function returns a positive value, future calls to this - * function will return negative ones. - * @note (see file z-term.c) - */ -extern errr Term_putch(int x, int y, byte a, char c); - -/** @fn Term_putstr(int x, int y, int n, byte a, cptr s) - * @brief Move to a location and, using an attr, add a string.\n - * @param x Number \n x-coordinate of target location. - * @brief X-coordinate - * @param y Number \n y-coordinate of target location. - * @brief Y-coordinate - * @param n Number \n length of string. - * @brief Length - * @param a Number \n attribute of string. - * @brief Attribute - * @param s String \n the string. - * @brief String - * @return Number \n <0 if error, 0 if success, 1 if success but cursor is - * useless. - * @note - * For length "n", using negative values to imply the largest possible value, - * and then we use the minimum of this length and the "actual" length of the - * string as the actual number of characters to attempt to display, never - * displaying more characters than will actually fit, since we do NOT attempt - * to "wrap" the cursor at the screen edge.\n\n - * We return "-1" if the cursor is currently unusable.\n - * We return "N" if we were "only" able to write "N" chars, even if all of the - * given characters fit on the screen, and mark the cursor as unusable for - * future attempts.\n\n - * So when this function, returns a positive value, future calls to this - * function will return negative ones. - * @note (see file z-term.c) - */ -extern errr Term_putstr(int x, int y, int n, byte a, cptr s); - -/** @fn Term_clear(void) - * @brief Clear the entire window, and move to the top left corner. - * @return Number \n 0 (always). - * @note - * Note the use of the special "total_erase" code - * @note (see file z-term.c) - */ -extern errr Term_clear(void); - -/** @fn Term_redraw(void) - * @brief Redraw (and refresh) the whole window. - * @return Number \n 0 (always). - * @note (see file z-term.c) - */ -extern errr Term_redraw(void); - -/** @fn Term_redraw_section(int x1, int y1, int x2, int y2) - * @brief Redraw part of a window.\n - * @param x1 Number \n x-coordinate of top-left location. - * @brief X-coordinate (top left) - * @param y1 Number \n y-coordinate of top-left location. - * @brief Y-coordinate (top left) - * @param x2 Number \n x-coordinate of bottom-right location. - * @brief X-coordinate (bottom right) - * @param y2 Number \n y-coordinate of bottom-right location. - * @brief Y-coordinate (bottom right) - * @return Number \n 0 (always). - * @note (see file z-term.c) - */ -extern errr Term_redraw_section(int x1, int y1, int x2, int y2); - -/** @fn Term_get_size(int *w, int *h) - * @brief Extract the current window size.\n - * @param *w Number - * @brief Screen width - * @param *h Number - * @brief Screen height - * @return Number \n 0 (always). - * @return *w Number \n The width of the screen (in characters). - * @return *h Number \n The height of the screen (in characters). - * @note (see file z-term.c) - */ -extern errr Term_get_size(int *w, int *h); - -/* - * random numbers - */ -$static s32b lua_rand_int(s32b m) {return rand_int(m);} - -/** @fn rand_int(s32b m); - * @brief Generate a random integer between 0 and (m - 1).\n - * @param m Number \n maximum value of random integer. The random integer - * will be less than "m". - * @brief Maximum - * @return Number \n The random number. - * @note (see file w_z_pack.c) - */ -static s32b lua_rand_int @ rand_int(s32b m); - -/* - * Generates a random long integer X where A<=X<=B - * The integer X falls along a uniform distribution. - * Note: rand_range(0,N-1) == rand_int(N) - */ -$static s32b lua_rand_range(s32b A, s32b B) {return ((A) + (rand_int(1+(B)-(A))));} - -/** @fn rand_range(s32b A, s32b B); - * @brief Generate a random integer between A and B inclusive.\n - * @param A Number \n minimum number. - * @brief Minimum - * @param B Number \n maximum number. - * @brief Maximum - * @return Number \n The random number. - * @note (see file w_z_pack.c) - */ -static s32b lua_rand_range @ rand_range(s32b A, s32b B); - -/* - * Generate a random long integer X where A-D<=X<=A+D - * The integer X falls along a uniform distribution. - * Note: rand_spread(A,D) == rand_range(A-D,A+D) - */ -$static s32b lua_rand_spread(s32b A, s32b D) {return ((A) + (rand_int(1+(D)+(D))) - (D));} - -/** @fn rand_spread(s32b A, s32b D); - * @brief Generate a radom integer between A-D and A+D inclusive.\n - * @param A Number \n average number. - * @brief Average - * @param D Number \n deviation from average. - * @brief Deviation - * @return Number \n The random number. - * @note (see file w_z_pack.c) - */ -static s32b lua_rand_spread @ rand_spread(s32b A, s32b D); - - -/* - * Generate a random long integer X where 1<=X<=M - * Also, "correctly" handle the case of M<=1 - */ -$static s32b lua_randint(s32b m) {return rand_int(m) + 1;} - -/** @fn randint(s32b m); - * @brief Generate a random integer between 1 and M inclusive.\n - * @param m Number \n maximum value of random integer. - * @brief Maximum - * @return Number \n The random number. - * @note (see file w_z_pack.c) - */ -static s32b lua_randint @ randint(s32b m); - - -/* - * Evaluate to TRUE "P" percent of the time - */ -$static bool lua_magik(s32b P) {return (rand_int(100) < (P));} - -/** @fn magik(s32b P); - * @brief Return TRUE "P" % of the time. - * @param P Number \n percent chance the function returns TRUE. - * @brief Percent true - * @return Boolean \n TRUE if a random number from 0 to 99 is less than P, - * otherwise FALSE. - * @note (see file w_z_pack.c) - */ -static bool lua_magik @ magik(s32b P); - - -/**** Available Variables ****/ -/** @var Rand_quick - * @brief Boolean - * @note - * If this is TRUE, then use the "simple" Random Number Generator.\n - * If this is FALSE, then use the "complex" Random Number Generator. - */ -extern bool Rand_quick; - -/** @var Rand_value - * @brief Number - * @note - * The current value (seed) of the simple Random Number Generator. - */ -extern u32b Rand_value; - -/**** Available Functions ****/ -/** @fn damroll(int num, int sides) - * @brief Generates damage for "2d6" style dice rolls.\n - * @param num Number \n the number of "dice" used. - * @brief Number - * @param sides Number \n the number of sides on each "die". - * @brief Sides - * @return Number \n The random number. - * @note - * The function simulates the rolling of "num" "sides"-sided dice. Each die - * will result in a random number from 1 to "sides". - * @note (see file z-rand.c) - */ -extern s16b damroll(int num, int sides); - -/** @fn maxroll(int num, int sides) - * @brief Generate the maximum damage for "num" dice with "sides" sides each. - * @param num Number \n The number of "dice" used. - * @brief Number - * @param sides Number \n The number of sides on each "die". - * @brief Sides - * @return Number \n "num" * "sides". - * @note (see file z-rand.c) - */ -extern s16b maxroll(int num, int sides); |