tables.c 99 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117
  1. /******************************************************************************
  2. * This file is part of TinTin++ *
  3. * *
  4. * Copyright 2004-2019 Igor van den Hoven *
  5. * *
  6. * TinTin++ is free software; you can redistribute it and/or modify *
  7. * it under the terms of the GNU General Public License as published by *
  8. * the Free Software Foundation; either version 3 of the License, or *
  9. * (at your option) any later version. *
  10. * *
  11. * This program is distributed in the hope that it will be useful, *
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  14. * GNU General Public License for more details. *
  15. * *
  16. * *
  17. * You should have received a copy of the GNU General Public License *
  18. * along with TinTin++. If not, see https://www.gnu.org/licenses. *
  19. ******************************************************************************/
  20. /******************************************************************************
  21. * (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t *
  22. * *
  23. * coded by Igor van den Hoven 2004 *
  24. ******************************************************************************/
  25. #include "tintin.h"
  26. #include "telnet.h"
  27. struct command_type command_table[] =
  28. {
  29. { "action", do_action, TOKEN_TYPE_COMMAND },
  30. { "advertise", do_advertise, TOKEN_TYPE_COMMAND },
  31. { "alias", do_alias, TOKEN_TYPE_COMMAND },
  32. { "all", do_all, TOKEN_TYPE_COMMAND },
  33. { "bell", do_bell, TOKEN_TYPE_COMMAND },
  34. { "break", do_nop, TOKEN_TYPE_BREAK },
  35. { "buffer", do_buffer, TOKEN_TYPE_COMMAND },
  36. { "button", do_button, TOKEN_TYPE_COMMAND },
  37. { "case", do_nop, TOKEN_TYPE_CASE },
  38. { "cat", do_cat, TOKEN_TYPE_COMMAND },
  39. { "chat", do_chat, TOKEN_TYPE_COMMAND },
  40. { "class", do_class, TOKEN_TYPE_COMMAND },
  41. { "commands", do_commands, TOKEN_TYPE_COMMAND },
  42. { "config", do_configure, TOKEN_TYPE_COMMAND },
  43. { "continue", do_nop, TOKEN_TYPE_CONTINUE},
  44. { "cr", do_cr, TOKEN_TYPE_COMMAND },
  45. { "cursor", do_cursor, TOKEN_TYPE_COMMAND },
  46. { "daemon", do_daemon, TOKEN_TYPE_COMMAND },
  47. { "debug", do_debug, TOKEN_TYPE_COMMAND },
  48. { "default", do_nop, TOKEN_TYPE_DEFAULT },
  49. { "delay", do_delay, TOKEN_TYPE_COMMAND },
  50. { "dictionary", do_dictionary, TOKEN_TYPE_COMMAND },
  51. { "draw", do_draw, TOKEN_TYPE_COMMAND },
  52. { "echo", do_echo, TOKEN_TYPE_COMMAND },
  53. { "else", do_nop, TOKEN_TYPE_ELSE },
  54. { "elseif", do_nop, TOKEN_TYPE_ELSEIF },
  55. { "end", do_end, TOKEN_TYPE_COMMAND },
  56. { "event", do_event, TOKEN_TYPE_COMMAND },
  57. { "foreach", do_nop, TOKEN_TYPE_FOREACH },
  58. { "format", do_format, TOKEN_TYPE_COMMAND },
  59. { "function", do_function, TOKEN_TYPE_COMMAND },
  60. { "gag", do_gag, TOKEN_TYPE_COMMAND },
  61. { "grep", do_grep, TOKEN_TYPE_COMMAND },
  62. { "help", do_help, TOKEN_TYPE_COMMAND },
  63. { "highlight", do_highlight, TOKEN_TYPE_COMMAND },
  64. { "history", do_history, TOKEN_TYPE_COMMAND },
  65. { "if", do_nop, TOKEN_TYPE_IF },
  66. { "ignore", do_ignore, TOKEN_TYPE_COMMAND },
  67. { "info", do_info, TOKEN_TYPE_COMMAND },
  68. { "kill", do_kill, TOKEN_TYPE_COMMAND },
  69. { "killall", do_killall, TOKEN_TYPE_COMMAND },
  70. { "line", do_line, TOKEN_TYPE_COMMAND },
  71. { "list", do_list, TOKEN_TYPE_COMMAND },
  72. { "local", do_local, TOKEN_TYPE_COMMAND },
  73. { "log", do_log, TOKEN_TYPE_COMMAND },
  74. { "loop", do_nop, TOKEN_TYPE_LOOP },
  75. { "macro", do_macro, TOKEN_TYPE_COMMAND },
  76. { "map", do_map, TOKEN_TYPE_COMMAND },
  77. { "math", do_math, TOKEN_TYPE_COMMAND },
  78. { "message", do_message, TOKEN_TYPE_COMMAND },
  79. { "nop", do_nop, TOKEN_TYPE_COMMAND },
  80. { "parse", do_nop, TOKEN_TYPE_PARSE },
  81. { "path", do_path, TOKEN_TYPE_COMMAND },
  82. { "pathdir", do_pathdir, TOKEN_TYPE_COMMAND },
  83. { "port", do_port, TOKEN_TYPE_COMMAND },
  84. { "prompt", do_prompt, TOKEN_TYPE_COMMAND },
  85. { "read", do_read, TOKEN_TYPE_COMMAND },
  86. { "regexp", do_regexp, TOKEN_TYPE_REGEX },
  87. { "replace", do_replace, TOKEN_TYPE_COMMAND },
  88. { "return", do_nop, TOKEN_TYPE_RETURN },
  89. { "run", do_run, TOKEN_TYPE_COMMAND },
  90. { "scan", do_scan, TOKEN_TYPE_COMMAND },
  91. { "screen", do_screen, TOKEN_TYPE_COMMAND },
  92. { "script", do_script, TOKEN_TYPE_COMMAND },
  93. { "send", do_send, TOKEN_TYPE_COMMAND },
  94. { "session", do_session, TOKEN_TYPE_COMMAND },
  95. { "showme", do_showme, TOKEN_TYPE_COMMAND },
  96. { "snoop", do_snoop, TOKEN_TYPE_COMMAND },
  97. { "split", do_split, TOKEN_TYPE_COMMAND },
  98. { "ssl", do_ssl, TOKEN_TYPE_COMMAND },
  99. { "substitute", do_substitute, TOKEN_TYPE_COMMAND },
  100. { "switch", do_nop, TOKEN_TYPE_SWITCH },
  101. { "system", do_system, TOKEN_TYPE_COMMAND },
  102. { "tab", do_tab, TOKEN_TYPE_COMMAND },
  103. { "test", do_test, TOKEN_TYPE_COMMAND },
  104. { "textin", do_textin, TOKEN_TYPE_COMMAND },
  105. { "ticker", do_tick, TOKEN_TYPE_COMMAND },
  106. { "unaction", do_unaction, TOKEN_TYPE_COMMAND },
  107. { "unalias", do_unalias, TOKEN_TYPE_COMMAND },
  108. { "unbutton", do_unbutton, TOKEN_TYPE_COMMAND },
  109. { "undelay", do_undelay, TOKEN_TYPE_COMMAND },
  110. { "unevent", do_unevent, TOKEN_TYPE_COMMAND },
  111. { "unfunction", do_unfunction, TOKEN_TYPE_COMMAND },
  112. { "ungag", do_ungag, TOKEN_TYPE_COMMAND },
  113. { "unhighlight", do_unhighlight, TOKEN_TYPE_COMMAND },
  114. { "unmacro", do_unmacro, TOKEN_TYPE_COMMAND },
  115. { "unpathdir", do_unpathdir, TOKEN_TYPE_COMMAND },
  116. { "unprompt", do_unprompt, TOKEN_TYPE_COMMAND },
  117. { "unsplit", do_unsplit, TOKEN_TYPE_COMMAND },
  118. { "unsubstitute", do_unsubstitute, TOKEN_TYPE_COMMAND },
  119. { "untab", do_untab, TOKEN_TYPE_COMMAND },
  120. { "unticker", do_untick, TOKEN_TYPE_COMMAND },
  121. { "unvariable", do_unvariable, TOKEN_TYPE_COMMAND },
  122. { "variable", do_variable, TOKEN_TYPE_COMMAND },
  123. { "while", do_nop, TOKEN_TYPE_WHILE },
  124. { "write", do_write, TOKEN_TYPE_COMMAND },
  125. { "zap", do_zap, TOKEN_TYPE_COMMAND },
  126. { "", NULL, TOKEN_TYPE_COMMAND }
  127. };
  128. struct list_type list_table[LIST_MAX] =
  129. {
  130. { "ACTION", "ACTIONS", SORT_PRIORITY, 3, 2, 3, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT|LIST_FLAG_REGEX|LIST_FLAG_PRIORITY },
  131. { "ALIAS", "ALIASES", SORT_PRIORITY, 3, 2, 3, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT|LIST_FLAG_REGEX|LIST_FLAG_PRIORITY },
  132. { "BUTTON", "BUTTONS", SORT_PRIORITY, 3, 2, 3, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT|LIST_FLAG_PRIORITY },
  133. { "CLASS", "CLASSES", SORT_PRIORITY, 2, 0, 0, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_INHERIT },
  134. { "COMMAND", "COMMANDS", SORT_ALPHA, 1, 0, 0, LIST_FLAG_MESSAGE },
  135. { "CONFIG", "CONFIGS", SORT_ALPHA, 2, 0, 0, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT },
  136. { "DELAY", "DELAYS", SORT_DELAY, 3, 2, 0, LIST_FLAG_MESSAGE|LIST_FLAG_READ },
  137. { "EVENT", "EVENTS", SORT_ALPHA, 2, 2, 0, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT },
  138. { "FUNCTION", "FUNCTIONS", SORT_ALPHA, 2, 2, 0, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT },
  139. { "GAG", "GAGS", SORT_ALPHA, 1, 0, 0, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT },
  140. { "HIGHLIGHT", "HIGHLIGHTS", SORT_PRIORITY, 3, 0, 3, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT|LIST_FLAG_REGEX|LIST_FLAG_PRIORITY },
  141. { "HISTORY", "HISTORIES", SORT_APPEND, 1, 0, 0, LIST_FLAG_MESSAGE|LIST_FLAG_HIDE },
  142. { "LANDMARK", "LANDMARKS", SORT_ALPHA, 4, 0, 0, LIST_FLAG_MESSAGE|LIST_FLAG_HIDE },
  143. { "MACRO", "MACROS", SORT_ALPHA, 2, 2, 0, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT },
  144. { "PATH", "PATHS", SORT_APPEND, 2, 0, 0, LIST_FLAG_MESSAGE|LIST_FLAG_HIDE },
  145. { "PATHDIR", "PATHDIRS", SORT_ALPHA, 3, 0, 0, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT },
  146. { "PROMPT", "PROMPTS", SORT_ALPHA, 4, 0, 0, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT|LIST_FLAG_REGEX },
  147. { "SUBSTITUTE", "SUBSTITUTES", SORT_PRIORITY, 3, 0, 3, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT|LIST_FLAG_REGEX|LIST_FLAG_PRIORITY },
  148. { "TAB", "TABS", SORT_ALPHA, 1, 0, 0, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT },
  149. { "TERRAIN", "TERRAINS", SORT_ALPHA, 2, 0, 0, LIST_FLAG_MESSAGE|LIST_FLAG_HIDE },
  150. { "TICKER", "TICKERS", SORT_ALPHA, 3, 2, 0, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT },
  151. { "VARIABLE", "VARIABLES", SORT_ALPHA, 2, 0, 0, LIST_FLAG_MESSAGE|LIST_FLAG_READ|LIST_FLAG_WRITE|LIST_FLAG_CLASS|LIST_FLAG_INHERIT|LIST_FLAG_NEST }
  152. };
  153. struct substitution_type substitution_table[] =
  154. {
  155. { "ARGUMENTS", 1 },
  156. { "VARIABLES", 2 },
  157. { "FUNCTIONS", 4 },
  158. { "COLORS", 8 },
  159. { "ESCAPES", 16 },
  160. // { "COMMANDS", 32 },
  161. { "SECURE", 64 },
  162. { "EOL", 128 },
  163. { "LNF", 256 },
  164. // { "FIX", 512 },
  165. { "COMPRESS", 1024 },
  166. { "", 0 }
  167. };
  168. struct config_type config_table[] =
  169. {
  170. {
  171. "AUTO TAB",
  172. "",
  173. "Buffer lines used for tab completion",
  174. config_autotab
  175. },
  176. {
  177. "BUFFER SIZE",
  178. "",
  179. "The size of the scrollback buffer",
  180. config_buffersize
  181. },
  182. {
  183. "CHARSET",
  184. "",
  185. "The character set encoding used",
  186. config_charset
  187. },
  188. {
  189. "CHILD LOCK",
  190. "TinTin++ is child locked.",
  191. "TinTin++ is not child locked.",
  192. config_childlock
  193. },
  194. {
  195. "COLOR MODE",
  196. "",
  197. "The color code encoding used",
  198. config_colormode
  199. },
  200. {
  201. "COLOR PATCH",
  202. "Color the start of each line",
  203. "Leave color handling up to the server",
  204. config_colorpatch
  205. },
  206. {
  207. "COMMAND COLOR",
  208. "",
  209. "The color of echoed commands",
  210. config_commandcolor
  211. },
  212. {
  213. "COMMAND ECHO",
  214. "Commands are echoed in split mode",
  215. "Commands are not echoed in split mode",
  216. config_commandecho
  217. },
  218. {
  219. "CONNECT RETRY",
  220. "",
  221. "Seconds sessions try to connect on failure",
  222. config_connectretry
  223. },
  224. {
  225. "CONVERT META",
  226. "TinTin++ converts meta characters",
  227. "TinTin++ doesn't convert meta characters",
  228. config_convertmeta
  229. },
  230. {
  231. "DEBUG TELNET",
  232. "You see telnet negotiations",
  233. "You do not see telnet negotatiations",
  234. config_debugtelnet
  235. },
  236. {
  237. "HISTORY SIZE",
  238. "",
  239. "The size of the command history",
  240. config_historysize
  241. },
  242. {
  243. "INHERITANCE",
  244. "The startup session is inherited",
  245. "The startup session is not inherited",
  246. config_inheritance
  247. },
  248. {
  249. "LOG MODE",
  250. "",
  251. "The data type mode of log files",
  252. config_logmode
  253. },
  254. {
  255. "LOG LEVEL",
  256. "TinTin++ only logs low level server data",
  257. "TinTin++ only logs high level server data",
  258. config_loglevel
  259. },
  260. {
  261. "MCCP",
  262. "MCCP is enabled.",
  263. "MCCP is disabled.",
  264. config_mccp
  265. },
  266. {
  267. "MOUSE TRACKING",
  268. "Generate mouse tracking events.",
  269. "Do not generate mouse events.",
  270. config_mousetracking
  271. },
  272. {
  273. "PACKET PATCH",
  274. "",
  275. "Seconds to try to patch broken packets",
  276. config_packetpatch
  277. },
  278. {
  279. "PID",
  280. "",
  281. "The PID of the master process.",
  282. config_pid
  283. },
  284. {
  285. "RANDOM SEED",
  286. "",
  287. "Seed value used for random numbers",
  288. config_randomseed
  289. },
  290. {
  291. "REPEAT CHAR",
  292. "",
  293. "Character used for repeating commands",
  294. config_repeatchar
  295. },
  296. {
  297. "REPEAT ENTER",
  298. "You send the last command on an enter",
  299. "You send a carriage return on an enter",
  300. config_repeatenter
  301. },
  302. {
  303. "SCREEN READER",
  304. "You are using a screen reader",
  305. "You are not using a screen reader",
  306. config_screenreader
  307. },
  308. {
  309. "SCROLL LOCK",
  310. "You do not see server output while scrolling",
  311. "You see server output while scrolling",
  312. config_scrolllock
  313. },
  314. {
  315. "SPEEDWALK",
  316. "Your input is scanned for speedwalks",
  317. "Your input is not scanned for speedwalks",
  318. config_speedwalk
  319. },
  320. {
  321. "TAB WIDTH",
  322. "",
  323. "Number of spaces used for a tab",
  324. config_tabwidth
  325. },
  326. {
  327. "TELNET",
  328. "TELNET support is enabled.",
  329. "TELNET support is disabled.",
  330. config_telnet
  331. },
  332. {
  333. "TINTIN CHAR",
  334. "",
  335. "Character used for TinTin++ commands",
  336. config_tintinchar
  337. },
  338. {
  339. "VERBATIM",
  340. "Keyboard input is send as is",
  341. "Keyboard input is parsed by TinTin++",
  342. config_verbatim
  343. },
  344. {
  345. "VERBATIM CHAR",
  346. "",
  347. "Character used for verbatim lines",
  348. config_verbatimchar
  349. },
  350. {
  351. "VERBOSE",
  352. "Read script files verbosely",
  353. "Read script files quietly",
  354. config_verbose
  355. },
  356. {
  357. "WORDWRAP",
  358. "Server output is word wrapped",
  359. "Server output is line wrapped",
  360. config_wordwrap
  361. },
  362. {
  363. "",
  364. "",
  365. 0,
  366. 0
  367. }
  368. };
  369. struct color_type color_table[] =
  370. {
  371. { "azure", "<abd>", 5 },
  372. { "ebony", "<aaa>", 5 },
  373. { "jade", "<adb>", 4 },
  374. { "lime", "<bda>", 4 },
  375. { "orange", "<dba>", 6 },
  376. { "pink", "<dab>", 4 },
  377. { "silver", "<ccc>", 6 },
  378. { "tan", "<cba>", 3 },
  379. { "violet", "<bad>", 6 },
  380. { "light azure", "<acf>", 11 },
  381. { "light ebony", "<bbb>", 11 },
  382. { "light jade", "<afc>", 10 },
  383. { "light lime", "<cfa>", 10 },
  384. { "light orange", "<fca>", 12 },
  385. { "light pink", "<fac>", 10 },
  386. { "light silver", "<eee>", 12 },
  387. { "light tan", "<eda>", 9 },
  388. { "light violet", "<caf>", 12 },
  389. { "light black", "<108>", 11 },
  390. { "light red", "<118>", 9 },
  391. { "light green", "<128>", 11 },
  392. { "light yellow", "<138>", 12 },
  393. { "light blue", "<148>", 10 },
  394. { "light magenta", "<158>", 13 },
  395. { "light cyan", "<168>", 10 },
  396. { "light white", "<178>", 11 },
  397. { "dark black", "<208>", 5 },
  398. { "dark red", "<218>", 4 },
  399. { "dark green", "<228>", 5 },
  400. { "dark yellow", "<238>", 6 },
  401. { "dark blue", "<248>", 4 },
  402. { "dark magenta", "<258>", 7 },
  403. { "dark cyan", "<268>", 4 },
  404. { "dark white", "<278>", 5 },
  405. { "Azure", "<acf>", 5 },
  406. { "Ebony", "<bbb>", 5 },
  407. { "Jade", "<afc>", 4 },
  408. { "Lime", "<cfa>", 4 },
  409. { "Orange", "<fca>", 6 },
  410. { "Pink", "<fac>", 4 },
  411. { "Silver", "<eee>", 6 },
  412. { "Tan", "<eda>", 3 },
  413. { "Violet", "<caf>", 6 },
  414. { "reset", "<088>", 5 },
  415. { "light", "<188>", 5 },
  416. { "bold", "<188>", 4 },
  417. { "faint", "<288>", 5 },
  418. { "dim", "<288>", 3 },
  419. { "dark", "<288>", 4 },
  420. { "underscore", "<488>", 10 },
  421. { "blink", "<588>", 5 },
  422. { "reverse", "<788>", 7 },
  423. { "ununderscore", "\e[24m",13 },
  424. { "unblink", "\e[25m", 8 },
  425. { "unreverse", "\e[27m",10 },
  426. { "black", "<aaa>", 5 },
  427. { "red", "<daa>", 4 },
  428. { "green", "<ada>", 5 },
  429. { "yellow", "<dda>", 6 },
  430. { "blue", "<aad>", 4 },
  431. { "magenta", "<dad>", 7 },
  432. { "cyan", "<add>", 4 },
  433. { "white", "<ddd>", 5 },
  434. { "Black", "<bbb>", 5 },
  435. { "Red", "<faa>", 3 },
  436. { "Green", "<afa>", 5 },
  437. { "Yellow", "<ffa>", 6 },
  438. { "Blue", "<aaf>", 4 },
  439. { "Magenta", "<faf>", 7 },
  440. { "Cyan", "<aff>", 4 },
  441. { "White", "<fff>", 5 },
  442. { "b black", "<AAA>", 7 },
  443. { "b red", "<DAA>", 5 },
  444. { "b green", "<ADA>", 7 },
  445. { "b yellow", "<DDA>", 8 },
  446. { "b blue", "<AAD>", 6 },
  447. { "b magenta", "<DAD>", 9 },
  448. { "b cyan", "<ADD>", 6 },
  449. { "b white", "<DDD>", 7 },
  450. { "b azure", "<ABD>", 7 },
  451. { "b ebony", "<AAA>", 7 },
  452. { "b jade", "<ADB>", 6 },
  453. { "b lime", "<BDA>", 6 },
  454. { "b orange", "<DBA>", 8 },
  455. { "b pink", "<DAB>", 6 },
  456. { "b silver", "<CCC>", 8 },
  457. { "b tan", "<CBA>", 5 },
  458. { "b violet", "<BAD>", 8 },
  459. { "b Azure", "<ACF>", 7 },
  460. { "b Black", "<BBB>", 7 },
  461. { "b Blue", "<AAF>", 6 },
  462. { "b Cyan", "<AFF>", 6 },
  463. { "b Ebony", "<BBB>", 7 },
  464. { "b Green", "<AFA>", 7 },
  465. { "b Jade", "<AFC>", 6 },
  466. { "b Lime", "<CFA>", 6 },
  467. { "b Magenta", "<FAF>", 9 },
  468. { "b Orange", "<FCA>", 8 },
  469. { "b Pink", "<FAC>", 6 },
  470. { "b Red", "<FAA>", 5 },
  471. { "b Silver", "<EEE>", 8 },
  472. { "b Tan", "<EDA>", 5 },
  473. { "b Violet", "<CAF>", 8 },
  474. { "b White", "<FFF>", 7 },
  475. { "b Yellow", "<FFA>", 8 },
  476. { "", "<888>", 0 }
  477. };
  478. struct color_type map_color_table[] =
  479. {
  480. { "AVOID", "<118>" },
  481. { "BACKGROUND", "" },
  482. { "BLOCK", "<218>" },
  483. { "EXITS", "<278>" },
  484. { "HIDE", "<168>" },
  485. { "INVISIBLE", "<208>" },
  486. { "PATHS", "<138>" },
  487. { "ROOMS", "<178>" },
  488. { "SYMBOLS", "<128>" },
  489. { "USER", "<258>" },
  490. { NULL, "<888>" }
  491. };
  492. struct class_type class_table[] =
  493. {
  494. { "OPEN", class_open },
  495. { "CLOSE", class_close },
  496. { "KILL", class_kill },
  497. { "LIST", class_list },
  498. { "LOAD", class_load },
  499. { "READ", class_read },
  500. { "SAVE", class_save },
  501. { "SIZE", class_size },
  502. { "WRITE", class_write },
  503. { "", NULL },
  504. };
  505. struct chat_type chat_table[] =
  506. {
  507. { "ACCEPT", chat_accept, 0, 1, "Accept a file transfer" },
  508. { "CALL", chat_call, 0, 0, "Call a buddy" },
  509. { "CANCELFILE", chat_cancelfile, 1, 0, "Cancel a file transfer" },
  510. { "COLOR", chat_color, 1, 0, "Set the default chat color" },
  511. { "DECLINE", chat_decline, 1, 0, "Decline a file transfer" },
  512. { "DND", chat_dnd, 0, 0, "Decline new connections" },
  513. { "DOWNLOADDIR", chat_downloaddir, 1, 0, "Set the download directory" },
  514. { "EMOTE", chat_emote, 0, 1, "Send an emoted chat message" },
  515. { "FORWARD", chat_forward, 1, 0, "Forward all chat messages to a buddy" },
  516. { "FORWARDALL", chat_forwardall, 1, 0, "Forward all chat/server messages to a buddy" },
  517. { "FILESTAT", chat_filestat, 1, 0, "Show file transfer data" },
  518. { "GROUP", chat_group, 0, 1, "Assign a group to a buddy" },
  519. { "IGNORE", chat_ignore, 1, 0, "Ignore all messages from a buddy" },
  520. { "INITIALIZE", chat_initialize, 1, 0, "Initialize chat with an optional port number" },
  521. { "INFO", chat_info, 0, 0, "Display the chat settings" },
  522. { "IP", chat_ip, 1, 0, "Change the IP address, unset by default" },
  523. { "MESSAGE", chat_message, 0, 1, "Send a private message to a buddy" },
  524. { "NAME", chat_name, 1, 0, "Change the chat name" },
  525. { "PASTE", chat_paste, 0, 1, "Paste a block of text to a buddy" },
  526. { "PEEK", chat_peek, 1, 0, "Show a buddy's public connections" },
  527. { "PING", chat_ping, 1, 0, "Display a buddy's response time" },
  528. { "PREFIX", chat_prefix, 1, 0, "Prefix before each chat message" },
  529. { "PRIVATE", chat_private, 1, 0, "Do not share a buddy's IP address" },
  530. { "PUBLIC", chat_public, 1, 0, "Share a buddy's IP address" },
  531. { "REPLY", chat_reply, 1, 0, "Reply to last private message" },
  532. { "REQUEST", chat_request, 1, 0, "Request a buddy's public connections" },
  533. { "SEND", chat_send, 0, 1, "Send a raw data message to a buddy" },
  534. { "SENDFILE", chat_sendfile, 0, 1, "Send a file to a buddy" },
  535. { "SERVE", chat_serve, 1, 0, "Forward all public chat messages to a buddy" },
  536. { "UNINITIALIZE", chat_uninitialize, 0, 0, "Uninitializes the chat server" },
  537. { "WHO", chat_who, 0, 0, "Show all connections" },
  538. { "ZAP", chat_zap, 1, 0, "Close the connection to a buddy" },
  539. { "", NULL, 0, 0, "" }
  540. };
  541. struct daemon_type daemon_table[] =
  542. {
  543. { "ATTACH", daemon_attach, "Attach to a daemon" },
  544. { "DETACH", daemon_detach, "Turn into a daemon and detach" },
  545. { "INPUT", daemon_input, "Send input to an attached daemon" },
  546. { "KILL", daemon_kill, "Kill a daemon" },
  547. { "LIST", daemon_list, "List a daemon" },
  548. { "", NULL, "" }
  549. };
  550. struct port_type port_table[] =
  551. {
  552. { "CALL", port_call, 0, 0, "Create outgoing socket connection" },
  553. { "COLOR", port_color, 1, 0, "Set the default port message color" },
  554. { "FLAG", port_flag, 0, 0, "Set various flags." },
  555. { "GROUP", port_group, 0, 1, "Assign a group to a socket" },
  556. { "IGNORE", port_ignore, 1, 0, "Ignore all messages from a socket" },
  557. { "INITIALIZE", port_initialize, 0, 0, "Initialize port with optional file name" },
  558. { "INFO", port_info, 0, 0, "Display the port settings" },
  559. { "NAME", port_name, 0, 0, "Change a socket name" },
  560. { "PREFIX", port_prefix, 1, 0, "Prefix before each port message" },
  561. { "RANK", port_rank, 0, 0, "Assign a rank to a socket" },
  562. { "SEND", port_send, 0, 1, "Send a message to a socket" },
  563. { "UNINITIALIZE", port_uninitialize, 0, 0, "Uninitializes the port" },
  564. { "WHO", port_who, 0, 0, "Show all socket connections" },
  565. { "ZAP", port_zap, 1, 0, "Close the connection to a socket" },
  566. { "", NULL, 0, 0, "" }
  567. };
  568. struct rank_type rank_table[] =
  569. {
  570. { "SPY", 0 },
  571. { "SCOUT", RANK_FLAG_SCOUT }
  572. };
  573. struct array_type array_table[] =
  574. {
  575. { "ADD", array_add, "Add an item to a list table" },
  576. { "CLEAR", array_clear, "Clear a list" },
  577. { "CLR", array_clear, NULL },
  578. { "COLLAPSE", array_collapse, "Collapse the list into a variable" },
  579. { "CREATE", array_create, "Create a list table with given items" },
  580. { "DELETE", array_delete, "Delete a list item with given index" },
  581. { "EXPLODE", array_explode, "Explode the variable into a list" },
  582. { "FIND", array_find, "Find a list item with given regex" },
  583. { "FND", array_find, NULL },
  584. { "GET", array_get, "Retrieve a list item with given index" },
  585. { "INSERT", array_insert, "Insert a list item at given index" },
  586. { "LENGTH", array_size, NULL },
  587. { "SET", array_set, "Change a list item at given index" },
  588. { "SHUFFLE", array_shuffle, "Sort a list table randomly" },
  589. { "SIMPLIFY", array_simplify, "Turn a list table into a simple list" },
  590. { "SIZE", array_size, NULL },
  591. { "SORT", array_sort, "Sort a list table alphabetically" },
  592. { "SRT", array_sort, NULL },
  593. { "TOKENIZE", array_tokenize, "Create a list with given characters" },
  594. { "", NULL, }
  595. };
  596. // 0 no map, 1 has map, 2 is inside map
  597. struct map_type map_table[] =
  598. {
  599. { "AT", map_at, 0, 2, "Execute command at given location" },
  600. { "CENTER", map_center, MAP_FLAG_VTMAP, 2, "Set the center of the map display" },
  601. { "COLOR", map_color, MAP_FLAG_VTMAP, 1, "Set the color for given field" },
  602. { "CREATE", map_create, MAP_FLAG_VTMAP, 0, "Creates the initial map" },
  603. { "DEBUG", map_debug, 0, 2, "Obscure debug information" },
  604. { "DELETE", map_delete, MAP_FLAG_VTMAP, 1, "Delete the room at given direction" },
  605. { "DESTROY", map_destroy, MAP_FLAG_VTMAP, 1, "Destroy area or map" },
  606. { "DIG", map_dig, MAP_FLAG_VTMAP, 2, "Create new room at given direction" },
  607. { "ENTRANCE", map_entrance, MAP_FLAG_VTMAP, 2, "Change the given exit's entrance" },
  608. { "EXIT", map_exit, MAP_FLAG_VTMAP, 2, "Change the given exit" },
  609. { "EXITFLAG", map_exitflag, MAP_FLAG_VTMAP, 2, "Change the given exit's flags" },
  610. { "EXPLORE", map_explore, MAP_FLAG_VTMAP, 2, "Save explored path to #path" },
  611. { "FIND", map_find, MAP_FLAG_VTMAP, 2, "Save found path to #path" },
  612. { "FLAG", map_flag, MAP_FLAG_VTMAP, 1, "Change the map's flags" },
  613. { "GET", map_get, 0, 2, "Get various room values" },
  614. { "GLOBAL", map_global, 0, 1, "Set the global exit room" },
  615. { "GOTO", map_goto, MAP_FLAG_VTMAP, 1, "Move to the given room" },
  616. { "INFO", map_info, 0, 1, "Display map and room information" },
  617. { "INSERT", map_insert, MAP_FLAG_VTMAP, 2, "Insert a room at given direction" },
  618. { "JUMP", map_jump, MAP_FLAG_VTMAP, 2, "Move to the given coordinate" },
  619. { "LANDMARK", map_landmark, 0, 1, "Create a global room reference" },
  620. { "LEAVE", map_leave, MAP_FLAG_VTMAP, 2, "Leave the map" },
  621. { "LEGEND" , map_legend, MAP_FLAG_VTMAP, 1, "Manipulate the map legend" },
  622. { "LINK", map_link, MAP_FLAG_VTMAP, 2, "Link room at given direction" },
  623. { "LIST", map_list, 0, 2, "List matching rooms" },
  624. { "MAP", map_map, 0, 2, "Display the map" },
  625. { "MOVE", map_move, MAP_FLAG_VTMAP, 2, "Move to the given direction" },
  626. { "NAME", map_name, MAP_FLAG_VTMAP, 2, "(obsolete) Use SET ROOMNAME instead" },
  627. { "OFFSET", map_offset, MAP_FLAG_VTMAP, 1, "Set the offset of the vt map" },
  628. { "READ", map_read, MAP_FLAG_VTMAP, 0, "Read a map file" },
  629. { "RESIZE", map_resize, 0, 1, "Resize the map room vnum range" },
  630. { "RETURN", map_return, MAP_FLAG_VTMAP, 1, "Return to last known room" },
  631. { "ROOMFLAG", map_roomflag, MAP_FLAG_VTMAP, 2, "Change the room's flags" },
  632. { "RUN", map_run, MAP_FLAG_VTMAP, 2, "Save found path to #path and run it" },
  633. { "SET", map_set, MAP_FLAG_VTMAP, 2, "Set various room values" },
  634. { "SYNC", map_sync, MAP_FLAG_VTMAP, 0, "Read a map file without overwriting" },
  635. { "TERRAIN", map_terrain, MAP_FLAG_VTMAP, 1, "Create a terrain type" },
  636. { "TRAVEL", map_travel, MAP_FLAG_VTMAP, 2, "Save explored path to #path and run it" },
  637. { "UNDO", map_undo, MAP_FLAG_VTMAP, 2, "Undo last map action" },
  638. { "UNINSERT", map_uninsert, MAP_FLAG_VTMAP, 2, "Uninsert room in given direction" },
  639. { "UNLANDMARK", map_unlandmark, 0, 1, "Remove a landmark" },
  640. { "UNLINK", map_unlink, MAP_FLAG_VTMAP, 2, "Remove given exit" },
  641. { "UNTERRAIN", map_unterrain, 0, 1, "Remove a terrain type" },
  642. { "UPDATE", map_update, 0, 0, "Mark vt map for an auto update" },
  643. { "VNUM", map_vnum, MAP_FLAG_VTMAP, 2, "Change the room vnum to given vnum" },
  644. { "WRITE", map_write, 0, 1, "Save the map to given file" },
  645. { "", NULL, 0, 0, "" }
  646. };
  647. struct cursor_type cursor_table[] =
  648. {
  649. /*
  650. {
  651. "AUTO TAB BACKWARD",
  652. "Tab completion from scrollback buffer, backward",
  653. "",
  654. CURSOR_FLAG_GET_ALL,
  655. cursor_auto_tab_backward
  656. },
  657. {
  658. "AUTO TAB FORWARD",
  659. "Tab completion from scrollback buffer, forward",
  660. "",
  661. CURSOR_FLAG_GET_ALL,
  662. cursor_auto_tab_forward
  663. },
  664. */
  665. {
  666. "BACKSPACE",
  667. "Delete backward character",
  668. "",
  669. CURSOR_FLAG_GET_ONE,
  670. cursor_backspace
  671. },
  672. {
  673. "BRACE OPEN",
  674. "Insert the { character",
  675. "",
  676. CURSOR_FLAG_GET_ALL,
  677. cursor_brace_open
  678. },
  679. {
  680. "BRACE CLOSE",
  681. "Insert the } character",
  682. "",
  683. CURSOR_FLAG_GET_ALL,
  684. cursor_brace_close
  685. },
  686. {
  687. "BACKWARD",
  688. "Move cursor backward",
  689. "",
  690. CURSOR_FLAG_GET_ALL,
  691. cursor_left
  692. },
  693. {
  694. "CLEAR",
  695. "Delete the input line",
  696. "",
  697. CURSOR_FLAG_GET_ALL,
  698. cursor_clear_line
  699. },
  700. {
  701. "CLEAR LEFT",
  702. "Delete from cursor to start of input",
  703. "",
  704. CURSOR_FLAG_GET_ALL,
  705. cursor_clear_left
  706. },
  707. {
  708. "CLEAR LINE", /* obsolete */
  709. "Delete the input line",
  710. "",
  711. CURSOR_FLAG_GET_ALL,
  712. cursor_clear_line
  713. },
  714. {
  715. "CLEAR RIGHT",
  716. "Delete from cursor to end of input",
  717. " ",
  718. CURSOR_FLAG_GET_ALL,
  719. cursor_clear_right
  720. },
  721. {
  722. "CONVERT META",
  723. "Meta convert the next character",
  724. "",
  725. CURSOR_FLAG_GET_ALL,
  726. cursor_convert_meta
  727. },
  728. {
  729. "CTRL DELETE",
  730. "Delete one character, exit on an empty line",
  731. "",
  732. CURSOR_FLAG_GET_ALL,
  733. cursor_delete_or_exit
  734. },
  735. {
  736. "DELETE",
  737. "Delete character at cursor",
  738. "\e[3~",
  739. CURSOR_FLAG_GET_ALL,
  740. cursor_delete
  741. },
  742. {
  743. "DELETE WORD LEFT",
  744. "Delete backwards till next space",
  745. "",
  746. CURSOR_FLAG_GET_ALL,
  747. cursor_delete_word_left
  748. },
  749. {
  750. "DELETE WORD RIGHT",
  751. "Delete forwards till next space",
  752. "",
  753. CURSOR_FLAG_GET_ALL,
  754. cursor_delete_word_right
  755. },
  756. {
  757. "ECHO",
  758. "Turn local echoing on or off",
  759. "",
  760. CURSOR_FLAG_GET_ONE,
  761. cursor_echo
  762. },
  763. {
  764. "END",
  765. "Move cursor to end of input",
  766. "",
  767. CURSOR_FLAG_GET_ALL,
  768. cursor_end
  769. },
  770. {
  771. "ENTER",
  772. "Process the input line",
  773. "",
  774. CURSOR_FLAG_GET_ALL,
  775. cursor_enter
  776. },
  777. {
  778. "EXIT",
  779. "Exit current session",
  780. "",
  781. CURSOR_FLAG_GET_ALL,
  782. cursor_exit
  783. },
  784. {
  785. "FORWARD",
  786. "Move cursor forward",
  787. "",
  788. CURSOR_FLAG_GET_ALL,
  789. cursor_right
  790. },
  791. {
  792. "GET",
  793. "Copy input line to given variable",
  794. "",
  795. CURSOR_FLAG_GET_ONE,
  796. cursor_get
  797. },
  798. {
  799. "HISTORY NEXT",
  800. "Select next command history entry",
  801. "",
  802. CURSOR_FLAG_GET_ALL,
  803. cursor_history_next
  804. },
  805. {
  806. "HISTORY PREV",
  807. "Select previous command history entry",
  808. "",
  809. CURSOR_FLAG_GET_ALL,
  810. cursor_history_prev
  811. },
  812. {
  813. "HISTORY SEARCH",
  814. "Search command history",
  815. "",
  816. CURSOR_FLAG_GET_ALL,
  817. cursor_history_search
  818. },
  819. {
  820. "HOME",
  821. "Move the cursor to start of input",
  822. "",
  823. CURSOR_FLAG_GET_ALL,
  824. cursor_home
  825. },
  826. {
  827. "INFO",
  828. "Print debugging information",
  829. "",
  830. CURSOR_FLAG_GET_ALL,
  831. cursor_info
  832. },
  833. {
  834. "INSERT",
  835. "Turn insert mode on or off",
  836. "",
  837. CURSOR_FLAG_GET_ONE,
  838. cursor_insert
  839. },
  840. /*
  841. {
  842. "MIXED TAB BACKWARD",
  843. "Tab completion on last word, search backward",
  844. "\e[Z", // shift-tab
  845. CURSOR_FLAG_GET_ALL,
  846. cursor_mixed_tab_backward
  847. },
  848. {
  849. "MIXED TAB FORWARD",
  850. "Tab completion on last word, search forward",
  851. "\t",
  852. CURSOR_FLAG_GET_ALL,
  853. cursor_mixed_tab_forward
  854. },
  855. */
  856. {
  857. "NEXT WORD",
  858. "Move cursor to the next word",
  859. "\ef",
  860. CURSOR_FLAG_GET_ALL,
  861. cursor_right_word
  862. },
  863. {
  864. "PASTE BUFFER",
  865. "Paste the previously deleted input text",
  866. "",
  867. CURSOR_FLAG_GET_ALL,
  868. cursor_paste_buffer
  869. },
  870. {
  871. "PREV WORD",
  872. "Move cursor to the previous word",
  873. "\eb",
  874. CURSOR_FLAG_GET_ALL,
  875. cursor_left_word
  876. },
  877. {
  878. "REDRAW INPUT",
  879. "Redraw the input line",
  880. " ",
  881. CURSOR_FLAG_GET_ALL,
  882. cursor_redraw_input
  883. },
  884. {
  885. "SCREEN FOCUS IN",
  886. "Window is focussed in event",
  887. "\e[I",
  888. CURSOR_FLAG_GET_ALL|CURSOR_FLAG_ALWAYS,
  889. cursor_screen_focus_in
  890. },
  891. {
  892. "SCREEN FOCUS OUT",
  893. "Window is focussed out event",
  894. "\e[O",
  895. CURSOR_FLAG_GET_ALL|CURSOR_FLAG_ALWAYS,
  896. cursor_screen_focus_out
  897. },
  898. {
  899. "SET",
  900. "Copy given string to input line",
  901. "",
  902. CURSOR_FLAG_GET_ONE,
  903. cursor_set
  904. },
  905. {
  906. "SUSPEND",
  907. "Suspend program, return with fg",
  908. "",
  909. CURSOR_FLAG_GET_ALL,
  910. cursor_suspend
  911. },
  912. {
  913. "TAB",
  914. "<LIST|SCROLLBACK> <BACKWARD|FORWARD>",
  915. "",
  916. CURSOR_FLAG_GET_ONE,
  917. cursor_tab
  918. },
  919. {
  920. "TAB L S BACKWARD",
  921. "Tab completion on last word, search backward",
  922. "\e[Z", // shift-tab
  923. CURSOR_FLAG_GET_ALL,
  924. cursor_mixed_tab_backward
  925. },
  926. {
  927. "TAB L S FORWARD",
  928. "Tab completion on last word, search forward",
  929. "\t",
  930. CURSOR_FLAG_GET_ALL,
  931. cursor_mixed_tab_forward
  932. },
  933. /*
  934. {
  935. "TAB BACKWARD",
  936. "Tab completion from tab list, backward",
  937. "",
  938. CURSOR_FLAG_GET_ALL,
  939. cursor_tab_backward
  940. },
  941. {
  942. "TAB FORWARD",
  943. "Tab completion from tab list, forward",
  944. "",
  945. CURSOR_FLAG_GET_ALL,
  946. cursor_tab_forward
  947. },
  948. */
  949. {
  950. "", "", "\e[5~", 0, cursor_buffer_up
  951. },
  952. {
  953. "", "", "\e[6~", 0, cursor_buffer_down
  954. },
  955. {
  956. "", "", "", 0, cursor_buffer_lock
  957. },
  958. {
  959. "","", "\e[13;2u", 0, cursor_enter
  960. },
  961. {
  962. "", "", "\eOM", 0, cursor_enter
  963. },
  964. {
  965. "", "", "\e[7~", 0, cursor_home
  966. },
  967. {
  968. "", "", "\e[1~", 0, cursor_home
  969. },
  970. {
  971. "", "", "\eOH", 0, cursor_home
  972. },
  973. {
  974. "", "", "\e[H", 0, cursor_home
  975. },
  976. {
  977. "", "", "\eOD", 0, cursor_left
  978. },
  979. {
  980. "", "", "\e[D", 0, cursor_left
  981. },
  982. {
  983. "", "", "\e[8~", 0, cursor_end
  984. },
  985. {
  986. "", "", "\e[4~", 0, cursor_end
  987. },
  988. {
  989. "", "", "\eOF", 0, cursor_end
  990. },
  991. {
  992. "", "", "\e[F", 0, cursor_end
  993. },
  994. {
  995. "", "", "\eOC", 0, cursor_right
  996. },
  997. {
  998. "", "", "\e[C", 0, cursor_right
  999. },
  1000. {
  1001. "", "", "\x7F", 0, cursor_backspace
  1002. },
  1003. {
  1004. "", "", "\eOB", 0, cursor_history_next
  1005. },
  1006. {
  1007. "", "", "\e[B", 0, cursor_history_next
  1008. },
  1009. {
  1010. "", "", "\eOA", 0, cursor_history_prev
  1011. },
  1012. {
  1013. "", "", "\e[A", 0, cursor_history_prev
  1014. },
  1015. {
  1016. "", "", "\e\x7F", 0, cursor_delete_word_left
  1017. },
  1018. {
  1019. "", "", "\ed", 0, cursor_delete_word_right
  1020. },
  1021. {
  1022. "", "", "", 0, NULL
  1023. }
  1024. };
  1025. struct draw_type draw_table[] =
  1026. {
  1027. {
  1028. "BOX",
  1029. "Draw four sides of a box.",
  1030. DRAW_FLAG_BOXED|DRAW_FLAG_LEFT|DRAW_FLAG_RIGHT|DRAW_FLAG_TOP|DRAW_FLAG_BOT,
  1031. draw_box
  1032. },
  1033. {
  1034. "CORNER",
  1035. "Draw a corner",
  1036. DRAW_FLAG_CORNERED,
  1037. draw_corner
  1038. },
  1039. {
  1040. "LINE",
  1041. "Draw a line.",
  1042. DRAW_FLAG_NONE,
  1043. draw_line
  1044. },
  1045. {
  1046. "RAIN",
  1047. "Draw digital rain.",
  1048. DRAW_FLAG_NONE,
  1049. draw_rain
  1050. },
  1051. {
  1052. "SIDE",
  1053. "Draw a line with corners.",
  1054. DRAW_FLAG_BOXED,
  1055. draw_side
  1056. },
  1057. {
  1058. "TABLE",
  1059. "Draw a table.",
  1060. DRAW_FLAG_BOXED|DRAW_FLAG_LEFT|DRAW_FLAG_RIGHT|DRAW_FLAG_TOP|DRAW_FLAG_BOT,
  1061. draw_table_grid
  1062. },
  1063. {
  1064. "TILE",
  1065. "Draw a tile.",
  1066. 0,
  1067. draw_square
  1068. },
  1069. {
  1070. "",
  1071. "",
  1072. 0,
  1073. NULL
  1074. }
  1075. };
  1076. struct screen_type screen_table[] =
  1077. {
  1078. {
  1079. "BLUR",
  1080. "Shuffle the screen to the back of the desktop.",
  1081. SCREEN_FLAG_GET_ONE,
  1082. SCREEN_FLAG_GET_ONE,
  1083. SCREEN_FLAG_CSIP,
  1084. screen_blur
  1085. },
  1086. {
  1087. "CLEAR",
  1088. "Clear the screen.",
  1089. SCREEN_FLAG_GET_ONE,
  1090. SCREEN_FLAG_GET_NONE,
  1091. SCREEN_FLAG_CSIP,
  1092. screen_clear
  1093. },
  1094. {
  1095. "CURSOR",
  1096. "Cursor settings.",
  1097. SCREEN_FLAG_GET_ONE,
  1098. SCREEN_FLAG_GET_ONE,
  1099. SCREEN_FLAG_CSIP,
  1100. screen_cursor
  1101. },
  1102. {
  1103. "FILL",
  1104. "Fill given region with given character.",
  1105. SCREEN_FLAG_GET_ONE,
  1106. SCREEN_FLAG_GET_ONE,
  1107. SCREEN_FLAG_CSIP,
  1108. screen_fill
  1109. },
  1110. {
  1111. "FOCUS",
  1112. "Shuffle the screen to the front of the desktop.",
  1113. SCREEN_FLAG_GET_ONE,
  1114. SCREEN_FLAG_GET_ONE,
  1115. SCREEN_FLAG_CSIP,
  1116. screen_focus
  1117. },
  1118. {
  1119. "FULLSCREEN",
  1120. "Toggle fullscreen mode.",
  1121. SCREEN_FLAG_GET_ONE,
  1122. SCREEN_FLAG_GET_ONE,
  1123. SCREEN_FLAG_CSIP,
  1124. screen_fullscreen
  1125. },
  1126. {
  1127. "GET",
  1128. "Save screen information to given variable.",
  1129. SCREEN_FLAG_GET_ONE,
  1130. SCREEN_FLAG_GET_ONE,
  1131. SCREEN_FLAG_CSIP,
  1132. screen_get
  1133. },
  1134. {
  1135. "INFO",
  1136. "Show some debugging information.",
  1137. SCREEN_FLAG_GET_ONE,
  1138. SCREEN_FLAG_GET_ONE,
  1139. SCREEN_FLAG_CSIP,
  1140. screen_info
  1141. },
  1142. {
  1143. "LOAD",
  1144. "Load screen information from memory.",
  1145. SCREEN_FLAG_GET_ONE,
  1146. SCREEN_FLAG_GET_ONE,
  1147. SCREEN_FLAG_OSCT,
  1148. screen_load
  1149. },
  1150. {
  1151. "MAXIMIZE",
  1152. "Maximize or restore the screen.",
  1153. SCREEN_FLAG_GET_ONE,
  1154. SCREEN_FLAG_GET_ONE,
  1155. SCREEN_FLAG_CSIP,
  1156. screen_maximize
  1157. },
  1158. {
  1159. "MINIMIZE",
  1160. "Minimize or restore the screen.",
  1161. SCREEN_FLAG_GET_ONE,
  1162. SCREEN_FLAG_GET_ONE,
  1163. SCREEN_FLAG_CSIP,
  1164. screen_minimize
  1165. },
  1166. {
  1167. "MOVE",
  1168. "Move the screen to the given position.",
  1169. SCREEN_FLAG_GET_ONE,
  1170. SCREEN_FLAG_GET_ONE,
  1171. SCREEN_FLAG_CSIP,
  1172. screen_move
  1173. },
  1174. {
  1175. "RAISE",
  1176. "Raise a screen event.",
  1177. SCREEN_FLAG_GET_ALL,
  1178. SCREEN_FLAG_GET_ALL,
  1179. SCREEN_FLAG_CSIP,
  1180. screen_raise
  1181. },
  1182. {
  1183. "REFRESH",
  1184. "Force a refresh of the screen.",
  1185. SCREEN_FLAG_GET_ONE,
  1186. SCREEN_FLAG_GET_ONE,
  1187. SCREEN_FLAG_CSIP,
  1188. screen_refresh
  1189. },
  1190. {
  1191. "RESCALE",
  1192. "Rescale the screen to {height} {width} pixels.",
  1193. SCREEN_FLAG_GET_ONE,
  1194. SCREEN_FLAG_GET_ONE,
  1195. SCREEN_FLAG_CSIP,
  1196. screen_rescale
  1197. },
  1198. {
  1199. "RESIZE",
  1200. "Resize the screen to {rows} {cols} characters.",
  1201. SCREEN_FLAG_GET_ONE,
  1202. SCREEN_FLAG_GET_ONE,
  1203. SCREEN_FLAG_CSIP,
  1204. screen_resize
  1205. },
  1206. {
  1207. "SAVE",
  1208. "Save screen information to memory.",
  1209. SCREEN_FLAG_GET_ONE,
  1210. SCREEN_FLAG_GET_ONE,
  1211. SCREEN_FLAG_CSIP,
  1212. screen_save
  1213. },
  1214. {
  1215. "SCROLL",
  1216. "Set the scroll region to {square}.",
  1217. SCREEN_FLAG_GET_ONE,
  1218. SCREEN_FLAG_GET_ONE,
  1219. SCREEN_FLAG_CSIP,
  1220. screen_scrollregion
  1221. },
  1222. {
  1223. "SCROLLBAR",
  1224. "Scrollbar settings.",
  1225. SCREEN_FLAG_GET_ONE,
  1226. SCREEN_FLAG_GET_ONE,
  1227. SCREEN_FLAG_CSIP,
  1228. screen_scrollbar
  1229. },
  1230. {
  1231. "SET",
  1232. "Set screen information.",
  1233. SCREEN_FLAG_GET_ONE,
  1234. SCREEN_FLAG_GET_ONE,
  1235. SCREEN_FLAG_OSCT,
  1236. screen_set
  1237. },
  1238. {
  1239. "", "", 0, 0, 0, NULL
  1240. }
  1241. };
  1242. struct timer_type timer_table[] =
  1243. {
  1244. { "Update Input" },
  1245. { "Update Sessions" },
  1246. { "Update Delays" },
  1247. { "Update Chat" },
  1248. { "Update Port" },
  1249. { "Update Tickers" },
  1250. { "Update Paths" },
  1251. { "Update Packet Patcher" },
  1252. { "Update Terminal" },
  1253. { "Update Time Events" },
  1254. { "Update Memory" },
  1255. { "Stall Program" }
  1256. };
  1257. struct event_type event_table[] =
  1258. {
  1259. { "CATCH ", EVENT_FLAG_CATCH, "Triggers on catch events." },
  1260. { "CHAT MESSAGE", EVENT_FLAG_PORT, "Triggers on any chat related message." },
  1261. { "CLASS ACTIVATED", EVENT_FLAG_CLASS, "Triggers on class activations." },
  1262. { "CLASS CREATED", EVENT_FLAG_CLASS, "Triggers on class creation." },
  1263. { "CLASS DEACTIVATED", EVENT_FLAG_CLASS, "Triggers on class deactivations." },
  1264. { "CLASS DESTROYED", EVENT_FLAG_CLASS, "Triggers on class destruction." },
  1265. { "DATE", EVENT_FLAG_TIME, "Triggers on the given date." },
  1266. { "DAY", EVENT_FLAG_TIME, "Triggers each day or given day." },
  1267. { "DOUBLE-CLICKED ", EVENT_FLAG_MOUSE, "Triggers when mouse is double-clicked" },
  1268. { "END OF PATH", EVENT_FLAG_MAP, "Triggers when walking the last room." },
  1269. { "HOUR", EVENT_FLAG_TIME, "Triggers each hour or given hour." },
  1270. { "IAC ", EVENT_FLAG_TELNET, "Triggers on telopt negotiation." },
  1271. { "LONG-CLICKED ", EVENT_FLAG_MOUSE, "Triggers when mouse is long-clicked." },
  1272. { "MAP DOUBLE-CLICKED ", EVENT_FLAG_MOUSE, "Triggers on vt map click." },
  1273. { "MAP ENTER MAP", EVENT_FLAG_MAP, "Triggers when entering the map." },
  1274. { "MAP ENTER ROOM", EVENT_FLAG_MAP, "Triggers when entering a map room." },
  1275. { "MAP EXIT MAP", EVENT_FLAG_MAP, "Triggers when exiting the map." },
  1276. { "MAP EXIT ROOM", EVENT_FLAG_MAP, "Triggers when exiting a map room." },
  1277. { "MAP FOLLOW MAP", EVENT_FLAG_MAP, "Triggers when moving to a map room." },
  1278. { "MAP LOCATION", EVENT_FLAG_MOUSE, "Triggers on vt map click." },
  1279. { "MAP LONG-CLICKED ", EVENT_FLAG_MOUSE, "Triggers on vt map click." },
  1280. { "MAP MOUSE LOCATION", EVENT_FLAG_MOUSE, "Triggers when called by #screen raise." },
  1281. { "MAP PRESSED ", EVENT_FLAG_MOUSE, "Triggers on vt map click." },
  1282. { "MAP RELEASED ", EVENT_FLAG_MOUSE, "Triggers on vt map click." },
  1283. { "MAP SHORT-CLICKED ", EVENT_FLAG_MOUSE, "Triggers on vt map click." },
  1284. { "MAP TRIPLE-CLICKED ", EVENT_FLAG_MOUSE, "Triggers on vt map click." },
  1285. { "MAP UPDATED VTMAP", EVENT_FLAG_MAP, "Triggers on vt map update." },
  1286. { "MINUTE", EVENT_FLAG_TIME, "Triggers each minute or given minute." },
  1287. { "MONTH", EVENT_FLAG_TIME, "Triggers each month or given month." },
  1288. { "MOVED ", EVENT_FLAG_MOUSE, "Triggers when mouse is moved." },
  1289. { "PORT CONNECTION", EVENT_FLAG_PORT, "Triggers when socket connects." },
  1290. { "PORT DISCONNECTION", EVENT_FLAG_PORT, "Triggers when socket disconnects." },
  1291. { "PORT LOG MESSAGE", EVENT_FLAG_PORT, "Triggers on local port log messages." },
  1292. { "PORT MESSAGE", EVENT_FLAG_PORT, "Triggers on local port messages." },
  1293. { "PORT RECEIVED MESSAGE", EVENT_FLAG_PORT, "Triggers when socket data is received." },
  1294. { "PRESSED ", EVENT_FLAG_MOUSE, "Triggers when mouse button is pressed." },
  1295. { "PROGRAM START", EVENT_FLAG_SYSTEM, "Triggers when main session starts." },
  1296. { "PROGRAM TERMINATION", EVENT_FLAG_SYSTEM, "Triggers when main session exists." },
  1297. { "READ ERROR", EVENT_FLAG_SYSTEM, "Triggers when the read command fails." },
  1298. { "RECEIVED INPUT", EVENT_FLAG_INPUT, "Triggers when new input is received." },
  1299. { "RECEIVED KEYPRESS", EVENT_FLAG_INPUT, "Triggers when a keypress is received." },
  1300. { "RECEIVED LINE", EVENT_FLAG_OUTPUT, "Triggers when a new line is received." },
  1301. { "RECEIVED OUTPUT", EVENT_FLAG_OUTPUT, "Triggers when new output is received." },
  1302. { "RECEIVED PROMPT", EVENT_FLAG_OUTPUT, "Triggers when a prompt is received." },
  1303. { "RELEASED ", EVENT_FLAG_MOUSE, "Triggers when mouse button is released." },
  1304. { "SCAN CSV HEADER", EVENT_FLAG_SCAN, "Triggers when scanning a csv file." },
  1305. { "SCAN CSV LINE", EVENT_FLAG_SCAN, "Triggers when scanning a csv file." },
  1306. { "SCAN TSV HEADER", EVENT_FLAG_SCAN, "Triggers when scanning a tsv file." },
  1307. { "SCAN TSV LINE", EVENT_FLAG_SCAN, "Triggers when scanning a tsv file." },
  1308. { "SCREEN DESKTOP DIMENSIONS", EVENT_FLAG_SCREEN, "Triggers when called by #screen raise." },
  1309. { "SCREEN DESKTOP SIZE", EVENT_FLAG_SCREEN, "Triggers when called by #screen raise." },
  1310. { "SCREEN DIMENSIONS", EVENT_FLAG_SCREEN, "Triggers when called by #screen raise." },
  1311. { "SCREEN FOCUS", EVENT_FLAG_SCREEN, "Triggers when focus changes.", },
  1312. { "SCREEN LOCATION", EVENT_FLAG_SCREEN, "Triggers when called by #screen raise." },
  1313. { "SCREEN MINIMIZED", EVENT_FLAG_SCREEN, "Triggers when called by #screen raise." },
  1314. { "SCREEN MOUSE LOCATION", EVENT_FLAG_MOUSE, "Triggers when called by #screen raise." },
  1315. { "SCREEN REFRESH", EVENT_FLAG_SCREEN, "Triggers when the screen is refreshed." },
  1316. { "SCREEN RESIZE", EVENT_FLAG_SCREEN, "Triggers when the screen is resized." },
  1317. { "SCREEN ROTATE LANDSCAPE", EVENT_FLAG_SCREEN, "Triggers when the screen is rotated." },
  1318. { "SCREEN ROTATE PORTRAIT", EVENT_FLAG_SCREEN, "Triggers when the screen is rotated." },
  1319. { "SCREEN SIZE", EVENT_FLAG_SCREEN, "Triggers when called by #screen raise." },
  1320. { "SCREEN SPLIT", EVENT_FLAG_SCREEN, "Triggers when the screen is split." },
  1321. { "SCREEN UNSPLIT", EVENT_FLAG_SCREEN, "Triggers when the screen is unsplit." },
  1322. { "SCROLLED ", EVENT_FLAG_MOUSE, "Triggers when mouse wheel is scrolled." },
  1323. { "SECOND", EVENT_FLAG_TIME, "Triggers each second or given second." },
  1324. { "SEND OUTPUT", EVENT_FLAG_INPUT, "Triggers before sending output." },
  1325. { "SENT OUTPUT", EVENT_FLAG_INPUT, "Triggers after sending output." },
  1326. { "SESSION ACTIVATED", EVENT_FLAG_SESSION, "Triggers when a session is activated." },
  1327. { "SESSION CONNECTED", EVENT_FLAG_SESSION, "Triggers when a new session connects." },
  1328. { "SESSION CREATED", EVENT_FLAG_SESSION, "Triggers when a new session is created." },
  1329. { "SESSION DEACTIVATED", EVENT_FLAG_SESSION, "Triggers when a session is deactivated." },
  1330. { "SESSION DISCONNECTED", EVENT_FLAG_SESSION, "Triggers when a session disconnects." },
  1331. { "SESSION TIMED OUT", EVENT_FLAG_SESSION, "Triggers when a session doesn't connect."},
  1332. { "SHORT-CLICKED", EVENT_FLAG_MOUSE, "Triggers when mouse is short-clicked." },
  1333. { "SWIPED", EVENT_FLAG_MOUSE, "Triggers on mouse swipe."},
  1334. { "SYSTEM ERROR", EVENT_FLAG_SYSTEM, "Triggers on system errors." },
  1335. { "TIME", EVENT_FLAG_TIME, "Triggers on the given time." },
  1336. { "TRIPLE-CLICKED", EVENT_FLAG_MOUSE, "Triggers when mouse is triple-clicked." },
  1337. { "UNKNOWN COMMAND", EVENT_FLAG_SYSTEM, "Triggers on unknown tintin command." },
  1338. { "VARIABLE UPDATE ", EVENT_FLAG_SYSTEM, "Triggers before a variable updates." },
  1339. { "VARIABLE UPDATED ", EVENT_FLAG_SYSTEM, "Triggers after a variable update." },
  1340. { "VT100 CPR", EVENT_FLAG_VT100, "Triggers on an ESC [ 6 n call." },
  1341. { "VT100 DA", EVENT_FLAG_VT100, "Triggers on an ESC [ c call." },
  1342. { "VT100 DECID", EVENT_FLAG_VT100, "Triggers on an ESC Z call." },
  1343. { "VT100 DSR", EVENT_FLAG_VT100, "Triggers on an ESC [ 5 n call." },
  1344. { "VT100 ENQ", EVENT_FLAG_VT100, "Triggers on an \\x05 call." },
  1345. { "VT100 SCROLL REGION", EVENT_FLAG_VT100, "Triggers on vt100 scroll region change." },
  1346. { "WEEK", EVENT_FLAG_TIME, "Triggers each week or given week." },
  1347. { "WRITE ERROR", EVENT_FLAG_SYSTEM, "Triggers when the write command fails." },
  1348. { "YEAR", EVENT_FLAG_TIME, "Triggers each year or given year." },
  1349. { "", 0, "" }
  1350. };
  1351. struct path_type path_table[] =
  1352. {
  1353. { "CREATE", path_create, "Clear the path and start path mapping." },
  1354. { "DELETE", path_delete, "Delete the last command from the path." },
  1355. { "DESCRIBE", path_describe, "Describe the path and current position." },
  1356. { "DESTROY", path_destroy, "Clear the path and stop path mapping." },
  1357. { "END", path_end, "" },
  1358. { "GOTO", path_goto, "Move position to given index." },
  1359. { "INSERT", path_insert, "Insert a command to the end of the path." },
  1360. { "LOAD", path_load, "Load a path from a variable." },
  1361. { "MAP", path_map, "Display the path and current position." },
  1362. { "MOVE", path_move, "Move one position forward or backward." },
  1363. { "NEW", path_new, "" },
  1364. { "RUN", path_run, "Execute the current path with optional delay." },
  1365. { "SAVE", path_save, "Save the current path to the given variable." },
  1366. { "SHOW", path_map, "" },
  1367. { "START", path_start, "Start path mapping." },
  1368. { "STOP", path_stop, "Stop path mapping." },
  1369. { "SWAP", path_swap, "Reverse the path, forward becoming backward." },
  1370. { "UNDO", path_undo, "Undo last step." },
  1371. { "UNZIP", path_unzip, "Turn speedwalk into a path." },
  1372. { "WALK", path_walk, "Walk one step forward or backward." },
  1373. { "ZIP", path_zip, "Turn path into a speedwalk." },
  1374. { "", NULL, "" }
  1375. };
  1376. struct line_type line_table[] =
  1377. {
  1378. { "BACKGROUND", line_background, "Execute line without stealing session focus." },
  1379. { "BENCHMARK", line_benchmark, "Execute line and provide timing information." },
  1380. { "CAPTURE", line_capture, "Capture output in the given variable." },
  1381. { "DEBUG", line_debug, "Execute line in debug mode." },
  1382. { "GAG", line_gag, "Gag the next line." },
  1383. { "IGNORE", line_ignore, "Execute line with triggers ignored." },
  1384. { "LOG", line_log, "Log the next line or given line." },
  1385. { "LOGMODE", line_logmode, "Execute line with given log mode." },
  1386. { "LOGVERBATIM", line_logverbatim, "Log the line as plain text verbatim." },
  1387. { "ONESHOT", line_oneshot, "Execute line creating oneshot triggers." },
  1388. { "QUIET", line_quiet, "Execute line with all system messages off." },
  1389. { "STRIP", line_strip, "Execute line with escape codes stripped." },
  1390. { "SUBSTITUTE", line_substitute, "Execute line with given substitution." },
  1391. { "VERBATIM", line_verbatim, "Execute line as plain text." },
  1392. { "VERBOSE", line_verbose, "Execute line with all system messages on." },
  1393. { "", NULL, "" }
  1394. };
  1395. struct history_type history_table[] =
  1396. {
  1397. /* { "CHARACTER", history_character, "Set the character used for repeating commands." }, */
  1398. { "DELETE", history_delete, "Delete last command history entry." },
  1399. { "INSERT", history_insert, "Insert a new command history entry." },
  1400. { "LIST", history_list, "Display command history list." },
  1401. { "READ", history_read, "Read a command history list from file." },
  1402. /* { "SIZE", history_size, "The size of the command history." }, */
  1403. { "WRITE", history_write, "Write a command history list to file." },
  1404. { "", NULL, "" }
  1405. };
  1406. struct buffer_type buffer_table[] =
  1407. {
  1408. { "CLEAR", buffer_clear, "Clear buffer." },
  1409. { "DOWN", buffer_down, "Scroll down one page." },
  1410. { "END", buffer_end, "Scroll down to the end of the buffer." },
  1411. { "FIND", buffer_find, "Move to the given string in the buffer." },
  1412. { "GET", buffer_get, "Store in given variable a given line or range." },
  1413. { "HOME", buffer_home, "Scroll up to the start of the buffer." },
  1414. { "INFO", buffer_info, "Display statistics about the buffer." },
  1415. { "LOCK", buffer_lock, "Toggle the locking state of the buffer." },
  1416. { "UP", buffer_up, "Scroll up one page." },
  1417. { "WRITE", buffer_write, "Write the buffer to file." },
  1418. { "", NULL, "" }
  1419. };
  1420. char *telcmds[] =
  1421. {
  1422. "EOF", "SUSP", "ABORT", "EOR", "SE",
  1423. "NOP", "DMARK", "BRK", "IP", "AO",
  1424. "AYT", "EC", "EL", "GA", "SB",
  1425. "WILL", "WONT", "DO", "DONT", "IAC",
  1426. };
  1427. struct telopt_type telopt_table[] =
  1428. {
  1429. { "BINARY", TEL_N, 0 },
  1430. { "ECHO", TEL_Y, 0 },
  1431. { "RCP", TEL_N, 0 },
  1432. { "SGA", TEL_Y, 0 },
  1433. { "NAME", TEL_N, 0 },
  1434. { "STATUS", TEL_N, 0 },
  1435. { "TIMING MARK", TEL_N, 0 },
  1436. { "RCTE", TEL_N, 0 },
  1437. { "NAOL", TEL_N, 0 },
  1438. { "NAOP", TEL_N, 0 },
  1439. { "NAORCD", TEL_N, 0 }, /* 10 */
  1440. { "NAOHTS", TEL_N, 0 },
  1441. { "NAOHTD", TEL_N, 0 },
  1442. { "NAOFFD", TEL_N, 0 },
  1443. { "NAOVTS", TEL_N, 0 },
  1444. { "NAOVTD", TEL_N, 0 },
  1445. { "NAOLFD", TEL_N, 0 },
  1446. { "EXTEND ASCII", TEL_N, 0 },
  1447. { "LOGOUT", TEL_N, 0 },
  1448. { "BYTE MACRO", TEL_N, 0 },
  1449. { "DATA ENTRY TERML", TEL_N, 0 }, /* 20 */
  1450. { "SUPDUP", TEL_N, 0 },
  1451. { "SUPDUP OUTPUT", TEL_N, 0 },
  1452. { "SEND LOCATION", TEL_N, 0 },
  1453. { "TERMINAL TYPE", TEL_Y, ANNOUNCE_DO },
  1454. { "EOR", TEL_Y, 0 },
  1455. { "TACACS UID", TEL_N, 0 },
  1456. { "OUTPUT MARKING", TEL_N, 0 },
  1457. { "TTYLOC", TEL_N, 0 },
  1458. { "3270 REGIME", TEL_N, 0 },
  1459. { "X.3 PAD", TEL_N, 0 }, /* 30 */
  1460. { "NAWS", TEL_Y, ANNOUNCE_DO },
  1461. { "TSPEED", TEL_Y, 0 },
  1462. { "LFLOW", TEL_N, 0 },
  1463. { "LINEMODE", TEL_N, 0 },
  1464. { "XDISPLOC", TEL_N, 0 },
  1465. { "OLD-ENVIRON", TEL_N, 0 },
  1466. { "AUTH", TEL_N, 0 },
  1467. { "ENCRYPT", TEL_N, 0 },
  1468. { "NEW-ENVIRON", TEL_Y, ANNOUNCE_DO },
  1469. { "TN3270E", TEL_N, 0 }, /* 40 */
  1470. { "XAUTH", TEL_N, 0 },
  1471. { "CHARSET", TEL_Y, ANNOUNCE_WILL },
  1472. { "RSP", TEL_N, 0 },
  1473. { "COM PORT", TEL_N, 0 },
  1474. { "SLE", TEL_N, 0 },
  1475. { "STARTTLS", TEL_N, 0 },
  1476. { "KERMIT", TEL_N, 0 },
  1477. { "SEND-URL", TEL_N, 0 },
  1478. { "FORWARD_X", TEL_N, 0 },
  1479. { "50", TEL_N, 0 }, /* 50 */
  1480. { "51", TEL_N, 0 },
  1481. { "52", TEL_N, 0 },
  1482. { "53", TEL_N, 0 },
  1483. { "54", TEL_N, 0 },
  1484. { "55", TEL_N, 0 },
  1485. { "56", TEL_N, 0 },
  1486. { "57", TEL_N, 0 },
  1487. { "58", TEL_N, 0 },
  1488. { "59", TEL_N, 0 },
  1489. { "60", TEL_N, 0 }, /* 60 */
  1490. { "61", TEL_N, 0 },
  1491. { "62", TEL_N, 0 },
  1492. { "63", TEL_N, 0 },
  1493. { "64", TEL_N, 0 },
  1494. { "65", TEL_N, 0 },
  1495. { "66", TEL_N, 0 },
  1496. { "67", TEL_N, 0 },
  1497. { "68", TEL_N, 0 },
  1498. { "MSDP", TEL_N, ANNOUNCE_WILL }, /* Mud Server Data Protocol */
  1499. { "MSSP", TEL_N, ANNOUNCE_WILL }, /* Mud Server Status Protocol */
  1500. { "71", TEL_N, 0 },
  1501. { "72", TEL_N, 0 },
  1502. { "73", TEL_N, 0 },
  1503. { "74", TEL_N, 0 },
  1504. { "75", TEL_N, 0 },
  1505. { "76", TEL_N, 0 },
  1506. { "77", TEL_N, 0 },
  1507. { "78", TEL_N, 0 },
  1508. { "79", TEL_N, 0 },
  1509. { "80", TEL_N, 0 }, /* 80 */
  1510. { "81", TEL_N, 0 },
  1511. { "82", TEL_N, 0 },
  1512. { "83", TEL_N, 0 },
  1513. { "84", TEL_N, 0 },
  1514. { "MCCP1", TEL_N, 0 }, /* Obsolete */
  1515. { "MCCP2", TEL_Y, ANNOUNCE_WILL }, /* Mud Client Compression Protocol v2 */
  1516. { "MCCP3", TEL_N, ANNOUNCE_WILL }, /* Mud Client Compression Protocol v3 */
  1517. { "88", TEL_N, 0 },
  1518. { "89", TEL_N, 0 },
  1519. { "MSP", TEL_N, 0 }, /* Mud Sound Protocl */
  1520. { "MXP", TEL_N, 0 }, /* Mud eXtension Protocol */
  1521. { "92", TEL_N, 0 }, /* Unadopted - MSP2 draft */
  1522. { "ZMP", TEL_N, 0 }, /* Unadopted - Zenith Mud Protocl draft */
  1523. { "94", TEL_N, 0 },
  1524. { "95", TEL_N, 0 },
  1525. { "96", TEL_N, 0 },
  1526. { "97", TEL_N, 0 },
  1527. { "98", TEL_N, 0 },
  1528. { "99", TEL_N, 0 },
  1529. { "100", TEL_N, 0 },
  1530. { "101", TEL_N, 0 },
  1531. { "102", TEL_N, 0 }, /* Obsolete - Aardwolf */
  1532. { "103", TEL_N, 0 },
  1533. { "104", TEL_N, 0 },
  1534. { "105", TEL_N, 0 },
  1535. { "106", TEL_N, 0 },
  1536. { "107", TEL_N, 0 },
  1537. { "108", TEL_N, 0 },
  1538. { "109", TEL_N, 0 },
  1539. { "110", TEL_N, 0 },
  1540. { "111", TEL_N, 0 },
  1541. { "112", TEL_N, 0 },
  1542. { "113", TEL_N, 0 },
  1543. { "114", TEL_N, 0 },
  1544. { "115", TEL_N, 0 },
  1545. { "116", TEL_N, 0 },
  1546. { "117", TEL_N, 0 },
  1547. { "118", TEL_N, 0 },
  1548. { "119", TEL_N, 0 },
  1549. { "120", TEL_N, 0 },
  1550. { "121", TEL_N, 0 },
  1551. { "122", TEL_N, 0 },
  1552. { "123", TEL_N, 0 },
  1553. { "124", TEL_N, 0 },
  1554. { "125", TEL_N, 0 },
  1555. { "126", TEL_N, 0 },
  1556. { "127", TEL_N, 0 },
  1557. { "128", TEL_N, 0 },
  1558. { "129", TEL_N, 0 },
  1559. { "130", TEL_N, 0 },
  1560. { "131", TEL_N, 0 },
  1561. { "132", TEL_N, 0 },
  1562. { "133", TEL_N, 0 },
  1563. { "134", TEL_N, 0 },
  1564. { "135", TEL_N, 0 },
  1565. { "136", TEL_N, 0 },
  1566. { "137", TEL_N, 0 },
  1567. { "138", TEL_N, 0 },
  1568. { "139", TEL_N, 0 },
  1569. { "140", TEL_N, 0 },
  1570. { "141", TEL_N, 0 },
  1571. { "142", TEL_N, 0 },
  1572. { "143", TEL_N, 0 },
  1573. { "144", TEL_N, 0 },
  1574. { "145", TEL_N, 0 },
  1575. { "146", TEL_N, 0 },
  1576. { "147", TEL_N, 0 },
  1577. { "148", TEL_N, 0 },
  1578. { "149", TEL_N, 0 },
  1579. { "150", TEL_N, 0 },
  1580. { "151", TEL_N, 0 },
  1581. { "152", TEL_N, 0 },
  1582. { "153", TEL_N, 0 },
  1583. { "154", TEL_N, 0 },
  1584. { "155", TEL_N, 0 },
  1585. { "156", TEL_N, 0 },
  1586. { "157", TEL_N, 0 },
  1587. { "158", TEL_N, 0 },
  1588. { "159", TEL_N, 0 },
  1589. { "160", TEL_N, 0 },
  1590. { "161", TEL_N, 0 },
  1591. { "162", TEL_N, 0 },
  1592. { "163", TEL_N, 0 },
  1593. { "164", TEL_N, 0 },
  1594. { "165", TEL_N, 0 },
  1595. { "166", TEL_N, 0 },
  1596. { "167", TEL_N, 0 },
  1597. { "168", TEL_N, 0 },
  1598. { "169", TEL_N, 0 },
  1599. { "170", TEL_N, 0 },
  1600. { "171", TEL_N, 0 },
  1601. { "172", TEL_N, 0 },
  1602. { "173", TEL_N, 0 },
  1603. { "174", TEL_N, 0 },
  1604. { "175", TEL_N, 0 },
  1605. { "176", TEL_N, 0 },
  1606. { "177", TEL_N, 0 },
  1607. { "178", TEL_N, 0 },
  1608. { "179", TEL_N, 0 },
  1609. { "180", TEL_N, 0 },
  1610. { "181", TEL_N, 0 },
  1611. { "182", TEL_N, 0 },
  1612. { "183", TEL_N, 0 },
  1613. { "184", TEL_N, 0 },
  1614. { "185", TEL_N, 0 },
  1615. { "186", TEL_N, 0 },
  1616. { "187", TEL_N, 0 },
  1617. { "188", TEL_N, 0 },
  1618. { "189", TEL_N, 0 },
  1619. { "190", TEL_N, 0 },
  1620. { "191", TEL_N, 0 },
  1621. { "192", TEL_N, 0 },
  1622. { "193", TEL_N, 0 },
  1623. { "194", TEL_N, 0 },
  1624. { "195", TEL_N, 0 },
  1625. { "196", TEL_N, 0 },
  1626. { "197", TEL_N, 0 },
  1627. { "198", TEL_N, 0 },
  1628. { "199", TEL_N, 0 },
  1629. { "ATCP", TEL_N, 0 }, /* Obsolete - Achaea Telnet Communication Protocol */
  1630. { "GMCP", TEL_N, ANNOUNCE_WILL }, /* MSDP over GMCP */
  1631. { "202", TEL_N, 0 },
  1632. { "203", TEL_N, 0 },
  1633. { "204", TEL_N, 0 },
  1634. { "205", TEL_N, 0 },
  1635. { "206", TEL_N, 0 },
  1636. { "207", TEL_N, 0 },
  1637. { "208", TEL_N, 0 },
  1638. { "209", TEL_N, 0 },
  1639. { "210", TEL_N, 0 },
  1640. { "211", TEL_N, 0 },
  1641. { "212", TEL_N, 0 },
  1642. { "213", TEL_N, 0 },
  1643. { "214", TEL_N, 0 },
  1644. { "215", TEL_N, 0 },
  1645. { "216", TEL_N, 0 },
  1646. { "217", TEL_N, 0 },
  1647. { "218", TEL_N, 0 },
  1648. { "219", TEL_N, 0 },
  1649. { "220", TEL_N, 0 },
  1650. { "221", TEL_N, 0 },
  1651. { "222", TEL_N, 0 },
  1652. { "223", TEL_N, 0 },
  1653. { "224", TEL_N, 0 },
  1654. { "225", TEL_N, 0 },
  1655. { "226", TEL_N, 0 },
  1656. { "227", TEL_N, 0 },
  1657. { "228", TEL_N, 0 },
  1658. { "229", TEL_N, 0 },
  1659. { "230", TEL_N, 0 },
  1660. { "231", TEL_N, 0 },
  1661. { "232", TEL_N, 0 },
  1662. { "233", TEL_N, 0 },
  1663. { "234", TEL_N, 0 },
  1664. { "235", TEL_N, 0 },
  1665. { "236", TEL_N, 0 },
  1666. { "237", TEL_N, 0 },
  1667. { "238", TEL_N, 0 },
  1668. { "239", TEL_N, 0 },
  1669. { "240", TEL_N, 0 },
  1670. { "NOP", TEL_N, 0 },
  1671. { "242", TEL_N, 0 },
  1672. { "243", TEL_N, 0 },
  1673. { "244", TEL_N, 0 },
  1674. { "245", TEL_N, 0 },
  1675. { "246", TEL_N, 0 },
  1676. { "247", TEL_N, 0 },
  1677. { "248", TEL_N, 0 },
  1678. { "249", TEL_N, 0 },
  1679. { "250", TEL_N, 0 },
  1680. { "251", TEL_N, 0 },
  1681. { "252", TEL_N, 0 },
  1682. { "253", TEL_N, 0 },
  1683. { "254", TEL_N, 0 },
  1684. { "255", TEL_N, 0 }
  1685. };
  1686. struct map_legend_type map_legend_table[] =
  1687. {
  1688. { "NO EXITS", "ASCII NESW LINE", "x", "1x1" },
  1689. { "N", "ASCII NESW LINE", "o", "1x1" },
  1690. { " E", "ASCII NESW LINE", "o", "1x1" },
  1691. { "N E", "ASCII NESW LINE", "+", "1x1" },
  1692. { " S", "ASCII NESW LINE", "o", "1x1" },
  1693. { "N S", "ASCII NESW LINE", "|", "1x1" },
  1694. { " E S", "ASCII NESW LINE", "+", "1x1" },
  1695. { "N E S", "ASCII NESW LINE", "+", "1x1" },
  1696. { " W", "ASCII NESW LINE", "o", "1x1" },
  1697. { "N W", "ASCII NESW LINE", "+", "1x1" },
  1698. { " E W", "ASCII NESW LINE", "-", "1x1" },
  1699. { "N E W", "ASCII NESW LINE", "+", "1x1" },
  1700. { " S W", "ASCII NESW LINE", "+", "1x1" },
  1701. { "N S W", "ASCII NESW LINE", "+", "1x1" },
  1702. { " E S W", "ASCII NESW LINE", "+", "1x1" },
  1703. { "N E S W", "ASCII NESW LINE", "+", "1x1" },
  1704. { "USER", "ASCII NESW MISC", "x", "1x1" },
  1705. { "DIR UNKNOWN", "ASCII NESW MISC", "+", "1x1" },
  1706. { "N S VOID", "ASCII NESW MISC", "|", "1x1" },
  1707. { "E W VOID", "ASCII NESW MISC", "-", "1x1" },
  1708. { "N E CURVED", "ASCII NESW CURVED", "+", "1x1" },
  1709. { "S E CURVED", "ASCII NESW CURVED", "+", "1x1" },
  1710. { "S W CURVED", "ASCII NESW CURVED", "+", "1x1" },
  1711. { "N W CURVED", "ASCII NESW CURVED", "+", "1x1" },
  1712. { "DIR N", "ASCII NESW DIRS", "|", "1x1" },
  1713. { "DIR NE", "ASCII NESW DIRS", "/", "1x1" },
  1714. { "DIR E", "ASCII NESW DIRS", "-", "1x1" },
  1715. { "DIR SE", "ASCII NESW DIRS", "\\", "1x1" },
  1716. { "DIR S", "ASCII NESW DIRS", "|", "1x1" },
  1717. { "DIR SW", "ASCII NESW DIRS", "/", "1x1" },
  1718. { "DIR W", "ASCII NESW DIRS", "-", "1x1" },
  1719. { "DIR NW", "ASCII NESW DIRS", "\\", "1x1" },
  1720. { "NO EXITS", "NESW LINE", "1x1", "1x1" },
  1721. { "N", "NESW LINE", "1x1", "1x1" },
  1722. { " E", "NESW LINE", "1x1", "1x1" },
  1723. { "N E", "NESW LINE", "1x1", "1x1" },
  1724. { " S", "NESW LINE", "1x1", "1x1" },
  1725. { "N S", "NESW LINE", "1x1", "1x1" },
  1726. { " E S", "NESW LINE", "1x1", "1x1" },
  1727. { "N E S", "NESW LINE", "1x1", "1x1" },
  1728. { " W", "NESW LINE", "1x1", "1x1" },
  1729. { "N W", "NESW LINE", "1x1", "1x1" },
  1730. { " E W", "NESW LINE", "1x1", "1x1" },
  1731. { "N E W", "NESW LINE", "1x1", "1x1" },
  1732. { " S W", "NESW LINE", "1x1", "1x1" },
  1733. { "N S W", "NESW LINE", "1x1", "1x1" },
  1734. { " E S W", "NESW LINE", "1x1", "1x1" },
  1735. { "N E S W", "NESW LINE", "1x1", "1x1" },
  1736. { "USER", "NESW MISC", "1x1", "1x1" },
  1737. { "DIR UNKNOWN", "NESW MISC", "1x1", "1x1" },
  1738. { "N S VOID", "NESW MISC", "1x1", "1x1" },
  1739. { "E W VOID", "NESW MISC", "1x1", "1x1" },
  1740. { "N E CURVED", "NESW CURVED", "1x1", "1x1" },
  1741. { "S E CURVED", "NESW CURVED", "1x1", "1x1" },
  1742. { "S W CURVED", "NESW CURVED", "1x1", "1x1" },
  1743. { "N W CURVED", "NESW CURVED", "1x1", "1x1" },
  1744. { "DIR N", "NESW DIRS", "1x1", "1x1" },
  1745. { "DIR NE", "NESW DIRS", "1x1", "1x1" },
  1746. { "DIR E", "NESW DIRS", "1x1", "1x1" },
  1747. { "DIR SE", "NESW DIRS", "1x1", "1x1" },
  1748. { "DIR S", "NESW DIRS", "1x1", "1x1" },
  1749. { "DIR SW", "NESW DIRS", "1x1", "1x1" },
  1750. { "DIR W", "NESW DIRS", "1x1", "1x1" },
  1751. { "DIR NW", "NESW DIRS", "1x1", "1x1" },
  1752. { "NO EXITS", "MUDFONT NWS", "1x2", "1x2" },
  1753. { "N", "MUDFONT NWS", "1x2", "1x2" },
  1754. { " NW", "MUDFONT NWS", "1x2", "1x2" },
  1755. { "N NW", "MUDFONT NWS", "1x2", "1x2" },
  1756. { " W", "MUDFONT NWS", "1x2", "1x2" },
  1757. { "N W", "MUDFONT NWS", "1x2", "1x2" },
  1758. { " NW W", "MUDFONT NWS", "1x2", "1x2" },
  1759. { "N NW W", "MUDFONT NWS", "1x2", "1x2" },
  1760. { " SW", "MUDFONT NWS", "1x2", "1x2" },
  1761. { "N SW", "MUDFONT NWS", "1x2", "1x2" },
  1762. { " NW SW", "MUDFONT NWS", "1x2", "1x2" },
  1763. { "N NW SW", "MUDFONT NWS", "1x2", "1x2" },
  1764. { " W SW", "MUDFONT NWS", "1x2", "1x2" },
  1765. { "N W SW", "MUDFONT NWS", "1x2", "1x2" },
  1766. { " NW W SW", "MUDFONT NWS", "1x2", "1x2" },
  1767. { "N NW W SW", "MUDFONT NWS", "1x2", "1x2" },
  1768. { " S", "MUDFONT NWS", "1x2", "1x2" },
  1769. { "N S", "MUDFONT NWS", "1x2", "1x2" },
  1770. { " NW S", "MUDFONT NWS", "1x2", "1x2" },
  1771. { "N NW S", "MUDFONT NWS", "1x2", "1x2" },
  1772. { " W S", "MUDFONT NWS", "1x2", "1x2" },
  1773. { "N W S", "MUDFONT NWS", "1x2", "1x2" },
  1774. { " NW W S", "MUDFONT NWS", "1x2", "1x2" },
  1775. { "N NW W S", "MUDFONT NWS", "1x2", "1x2" },
  1776. { " SW S", "MUDFONT NWS", "1x2", "1x2" },
  1777. { "N SW S", "MUDFONT NWS", "1x2", "1x2" },
  1778. { " NW SW S", "MUDFONT NWS", "1x2", "1x2" },
  1779. { "N NW SW S", "MUDFONT NWS", "1x2", "1x2" },
  1780. { " W SW S", "MUDFONT NWS", "1x2", "1x2" },
  1781. { "N W SW S", "MUDFONT NWS", "1x2", "1x2" },
  1782. { " NW W SW S", "MUDFONT NWS", "1x2", "1x2" },
  1783. { "N NW W SW S", "MUDFONT NWS", "1x2", "1x2" },
  1784. { "NO EXITS", "MUDFONT NES", "1x2", "1x2" },
  1785. { "N", "MUDFONT NES", "1x2", "1x2" },
  1786. { " NE", "MUDFONT NES", "1x2", "1x2" },
  1787. { "N NE", "MUDFONT NES", "1x2", "1x2" },
  1788. { " W", "MUDFONT NES", "1x2", "1x2" },
  1789. { "N W", "MUDFONT NES", "1x2", "1x2" },
  1790. { " NE W", "MUDFONT NES", "1x2", "1x2" },
  1791. { "N NE W", "MUDFONT NES", "1x2", "1x2" },
  1792. { " SE", "MUDFONT NES", "1x2", "1x2" },
  1793. { "N SE", "MUDFONT NES", "1x2", "1x2" },
  1794. { " NE SE", "MUDFONT NES", "1x2", "1x2" },
  1795. { "N NE SE", "MUDFONT NES", "1x2", "1x2" },
  1796. { " W SE", "MUDFONT NES", "1x2", "1x2" },
  1797. { "N W SE", "MUDFONT NES", "1x2", "1x2" },
  1798. { " NE W SE", "MUDFONT NES", "1x2", "1x2" },
  1799. { "N NE W SE", "MUDFONT NES", "1x2", "1x2" },
  1800. { " S", "MUDFONT NES", "1x2", "1x2" },
  1801. { "N S", "MUDFONT NES", "1x2", "1x2" },
  1802. { " NE S", "MUDFONT NES", "1x2", "1x2" },
  1803. { "N NE S", "MUDFONT NES", "1x2", "1x2" },
  1804. { " W S", "MUDFONT NES", "1x2", "1x2" },
  1805. { "N W S", "MUDFONT NES", "1x2", "1x2" },
  1806. { " NE W S", "MUDFONT NES", "1x2", "1x2" },
  1807. { "N NE W S", "MUDFONT NES", "1x2", "1x2" },
  1808. { " SE S", "MUDFONT NES", "1x2", "1x2" },
  1809. { "N SE S", "MUDFONT NES", "1x2", "1x2" },
  1810. { " NE SE S", "MUDFONT NES", "1x2", "1x2" },
  1811. { "N NE SE S", "MUDFONT NES", "1x2", "1x2" },
  1812. { " W SE S", "MUDFONT NES", "1x2", "1x2" },
  1813. { "N W SE S", "MUDFONT NES", "1x2", "1x2" },
  1814. { " NE W SE S", "MUDFONT NES", "1x2", "1x2" },
  1815. { "N NE W SE S", "MUDFONT NES", "1x2", "1x2" },
  1816. { "NO EXITS", "MUDFONT VOID NWS", "1x2", "1x2" },
  1817. { "N", "MUDFONT VOID NWS", "1x2", "1x2" },
  1818. { " NW", "MUDFONT VOID NWS", "1x2", "1x2" },
  1819. { "N NW", "MUDFONT VOID NWS", "1x2", "1x2" },
  1820. { " W", "MUDFONT VOID NWS", "1x2", "1x2" },
  1821. { "N W", "MUDFONT VOID NWS", "1x2", "1x2" },
  1822. { " NW W", "MUDFONT VOID NWS", "1x2", "1x2" },
  1823. { "N NW W", "MUDFONT VOID NWS", "1x2", "1x2" },
  1824. { " SW", "MUDFONT VOID NWS", "1x2", "1x2" },
  1825. { "N SW", "MUDFONT VOID NWS", "1x2", "1x2" },
  1826. { " NW SW", "MUDFONT VOID NWS", "1x2", "1x2" },
  1827. { "N NW SW", "MUDFONT VOID NWS", "1x2", "1x2" },
  1828. { " W SW", "MUDFONT VOID NWS", "1x2", "1x2" },
  1829. { "N W SW", "MUDFONT VOID NWS", "1x2", "1x2" },
  1830. { " NW W SW", "MUDFONT VOID NWS", "1x2", "1x2" },
  1831. { "N NW W SW", "MUDFONT VOID NWS", "1x2", "1x2" },
  1832. { " S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1833. { "N S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1834. { " NW S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1835. { "N NW S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1836. { " W S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1837. { "N W S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1838. { " NW W S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1839. { "N NW W S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1840. { " SW S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1841. { "N SW S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1842. { " NW SW S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1843. { "N NW SW S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1844. { " W SW S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1845. { "N W SW S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1846. { " NW W SW S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1847. { "N NW W SW S", "MUDFONT VOID NWS", "1x2", "1x2" },
  1848. { "NO EXITS", "MUDFONT VOID NES", "1x2", "1x2" },
  1849. { "N", "MUDFONT VOID NES", "1x2", "1x2" },
  1850. { " NE", "MUDFONT VOID NES", "1x2", "1x2" },
  1851. { "N NE", "MUDFONT VOID NES", "1x2", "1x2" },
  1852. { " W", "MUDFONT VOID NES", "1x2", "1x2" },
  1853. { "N W", "MUDFONT VOID NES", "1x2", "1x2" },
  1854. { " NE W", "MUDFONT VOID NES", "1x2", "1x2" },
  1855. { "N NE W", "MUDFONT VOID NES", "1x2", "1x2" },
  1856. { " SE", "MUDFONT VOID NES", "1x2", "1x2" },
  1857. { "N SE", "MUDFONT VOID NES", "1x2", "1x2" },
  1858. { " NE SE", "MUDFONT VOID NES", "1x2", "1x2" },
  1859. { "N NE SE", "MUDFONT VOID NES", "1x2", "1x2" },
  1860. { " W SE", "MUDFONT VOID NES", "1x2", "1x2" },
  1861. { "N W SE", "MUDFONT VOID NES", "1x2", "1x2" },
  1862. { " NE W SE", "MUDFONT VOID NES", "1x2", "1x2" },
  1863. { "N NE W SE", "MUDFONT VOID NES", "1x2", "1x2" },
  1864. { " S", "MUDFONT VOID NES", "1x2", "1x2" },
  1865. { "N S", "MUDFONT VOID NES", "1x2", "1x2" },
  1866. { " NE S", "MUDFONT VOID NES", "1x2", "1x2" },
  1867. { "N NE S", "MUDFONT VOID NES", "1x2", "1x2" },
  1868. { " W S", "MUDFONT VOID NES", "1x2", "1x2" },
  1869. { "N W S", "MUDFONT VOID NES", "1x2", "1x2" },
  1870. { " NE W S", "MUDFONT VOID NES", "1x2", "1x2" },
  1871. { "N NE W S", "MUDFONT VOID NES", "1x2", "1x2" },
  1872. { " SE S", "MUDFONT VOID NES", "1x2", "1x2" },
  1873. { "N SE S", "MUDFONT VOID NES", "1x2", "1x2" },
  1874. { " NE SE S", "MUDFONT VOID NES", "1x2", "1x2" },
  1875. { "N NE SE S", "MUDFONT VOID NES", "1x2", "1x2" },
  1876. { " W SE S", "MUDFONT VOID NES", "1x2", "1x2" },
  1877. { "N W SE S", "MUDFONT VOID NES", "1x2", "1x2" },
  1878. { " NE W SE S", "MUDFONT VOID NES", "1x2", "1x2" },
  1879. { "N NE W SE S", "MUDFONT VOID NES", "1x2", "1x2" },
  1880. { "N E", "MUDFONT CURVED", "1x2", "1x2" },
  1881. { "S E", "MUDFONT CURVED", "1x2", "1x2" },
  1882. { "S W", "MUDFONT CURVED", "1x2", "1x2" },
  1883. { "N W", "MUDFONT CURVED", "1x2", "1x2" },
  1884. { "NO DIAGONAL", "UNICODE GRAPHICS", "2x5", "2x5" },
  1885. { "SE", "UNICODE GRAPHICS", "⸌", "2x5" },
  1886. { "NE", "UNICODE GRAPHICS", "⸝", "2x5" },
  1887. { "SE NE", "UNICODE GRAPHICS", ">", "2x5" },
  1888. { "SW", "UNICODE GRAPHICS", "⸍", "2x5" },
  1889. { "SE SW", "UNICODE GRAPHICS", "⸌⸍", "2x5" },
  1890. { "NE SW", "UNICODE GRAPHICS", "/", "2x5" },
  1891. { "SE NE SW", "UNICODE GRAPHICS", ">⸍", "2x5" },
  1892. { "NW", "UNICODE GRAPHICS", "⸜", "2x5" },
  1893. { "SE NW", "UNICODE GRAPHICS", "\", "2x5" },
  1894. { "NE NW", "UNICODE GRAPHICS", "⸝⸜", "2x5" },
  1895. { "SE NE NW", "UNICODE GRAPHICS", ">⸜", "2x5" },
  1896. { "SW NW", "UNICODE GRAPHICS", "<", "2x5" },
  1897. { "SE SW NW", "UNICODE GRAPHICS", "⸌<", "2x5" },
  1898. { "NE SW NW", "UNICODE GRAPHICS", "⸝<", "2x5" },
  1899. { "SE NE SW NW", "UNICODE GRAPHICS", "><", "2x5" },
  1900. { "D", "UNICODE GRAPHICS", "-", "2x5" },
  1901. { "N", "UNICODE GRAPHICS", "↑", "2x5" },
  1902. { "S", "UNICODE GRAPHICS", "↓", "2x5" },
  1903. { "N S", "UNICODE GRAPHICS", "│", "2x5" },
  1904. { "U", "UNICODE GRAPHICS", "+", "2x5" },
  1905. { "E", "UNICODE GRAPHICS", "🠆", "2x5" },
  1906. { "W", "UNICODE GRAPHICS", "🠄", "2x5" },
  1907. { "E W", "UNICODE GRAPHICS", "─", "2x5" },
  1908. { "ROOM L", "UNICODE GRAPHICS", "[", "2x5" },
  1909. { "ROOM L CURVED", "UNICODE GRAPHICS", "(", "2x5" },
  1910. { "ROOM R", "UNICODE GRAPHICS", "]", "2x5" },
  1911. { "ROOM R CURVED", "UNICODE GRAPHICS", ")", "2x5" },
  1912. { NULL, NULL, NULL, NULL }
  1913. };
  1914. struct map_group_type map_group_table[] =
  1915. {
  1916. { "ALL", "", 1, 1, 1, 2, 0, 0, "" },
  1917. { "ASCII NESW", "ASCII NESW", 1, 1, 1, 1, 0, 0, "{x} {o} {o} {+} {o} {|} {+} {+} {o} {+} {-} {+} {+} {+} {+} {+} {x} {+} {|} {-} {+} {+} {+} {+} {|} {/} {-} {\\\\} {|} {/} {-} {\\\\}" },
  1918. { "ASCII NESW LINE", "ASCII NESW LINE", 1, 1, 1, 1, 0, 0, "{x} {o} {o} {+} {o} {|} {+} {+} {o} {+} {-} {+} {+} {+} {+} {+}" },
  1919. { "ASCII NESW MISC", "ASCII NESW MISC", 1, 1, 1, 1, 0, 0, "{x} {+} {|} {-}" },
  1920. { "ASCII NESW CURVED", "ASCII NESW CURVED", 1, 1, 1, 1, 0, 0, "{+} {+} {+} {+}" },
  1921. { "ASCII NESW DIRS", "ASCII NESW DIRS", 1, 1, 1, 1, 0, 0, "{|} {/} {-} {\\\\} {|} {/} {-} {\\\\}" },
  1922. { "NESW", "NESW", 1, 1, 1, 1, 0, 0, "{\\u2B51} {\\u2579} {\\u257A} {\\u2517} {\\u257B} {\\u2503} {\\u250F} {\\u2523} {\\u2578} {\\u251B} {\\u2501} {\\u253B} {\\u2513} {\\u252B} {\\u2533} {\\u254B} {\\u2B51} {\\u2012} {\\u2507} {\\u254D} {\\u2570} {\\u256D} {\\u256E} {\\u256F} {\\u2191} {\\u2B08} {\\u2B95} {\\u2b0A} {\\u2193} {\\u2B0B} {\\u2B05} {\\u2B09}" },
  1923. { "NESW TUBE", "NESW", 1, 1, 1, 1, 0, 0, "{\\u25AB}{\\U01F791}{\\U01F791}{\\u255A}{\\U01F791}{\\u2551}{\\u2554} {\\u2560}{\\U01F791}{\\u255D} {\\u2550} {\\u2569} {\\u2557} {\\u2563} {\\u2566} {\\u256C} {\\u25CF} {} {\\u2502} {\\u2500} {\\u2570} {\\u256D} {\\u256E} {\\u256F} {\\u2191} {\\u2B08} {\\u2B95} {\\u2b0A} {\\u2193} {\\u2B0B} {\\u2B05} {\\u2B09}" },
  1924. { "NESW LINE", "NESW LINE", 1, 1, 1, 1, 0, 0, "{\\u25AA} {\\u2579} {\\u257A} {\\u2517} {\\u257B} {\\u2503} {\\u250F} {\\u2523} {\\u2578} {\\u251B} {\\u2501} {\\u253B} {\\u2513} {\\u252B} {\\u2533} {\\u254B}" },
  1925. { "NESW MISC", "NESW MISC", 1, 1, 1, 1, 0, 0, "{\\u2B51} {\\u2012} {\\u2507} {\\u254D}" },
  1926. { "NESW CURVED", "NESW CURVED", 1, 1, 1, 1, 0, 0, "{\\u2570} {\\u256D} {\\u256E} {\\u256F}" },
  1927. { "NESW DIRS", "NESW DIRS", 1, 1, 1, 1, 0, 0, "{\\u2191} {\\u2B08} {\\u2B95} {\\u2b0A} {\\u2193} {\\u2B0B} {\\u2B05} {\\u2B09}" },
  1928. // { "NESW DIRS", "NESW DIRS", 1, 1, 1, 1, 0, 0, "{\\U01F805}{\\u2B08}{\\U01F806}{\\u2b0A}{\\U01F807}{\\u2B0B}{\\U01F804}{\\u2B09}" }, poor cross-platform support.
  1929. { "MUDFONT", "MUDFONT", 1, 2, 1, 2, 0, 0, "" },
  1930. { "MUDFONT PRIVATE", "MUDFONT", 1, 2, 1, 2, 0, 0, "{\\uE000} {\\uE001} {\\uE002} {\\uE003} {\\uE004} {\\uE005} {\\uE006} {\\uE007} {\\uE008} {\\uE009} {\\uE00A} {\\uE00B} {\\uE00C} {\\uE00D} {\\uE00E} {\\uE00F} {\\uE010} {\\uE011} {\\uE012} {\\uE013} {\\uE014} {\\uE015} {\\uE016} {\\uE017} {\\uE018} {\\uE019} {\\uE01A} {\\uE01B} {\\uE01C} {\\uE01D} {\\uE01E} {\\uE01F} {\\uE020} {\\uE021} {\\uE022} {\\uE023} {\\uE024} {\\uE025} {\\uE026} {\\uE027} {\\uE028} {\\uE029} {\\uE02A} {\\uE02B} {\\uE02C} {\\uE02D} {\\uE02E} {\\uE02F} {\\uE030} {\\uE031} {\\uE032} {\\uE033} {\\uE034} {\\uE035} {\\uE036} {\\uE037} {\\uE038} {\\uE039} {\\uE03A} {\\uE03B} {\\uE03C} {\\uE03D} {\\uE03E} {\\uE03F} {\\uE040} {\\uE041} {\\uE042} {\\uE043} {\\uE044} {\\uE045} {\\uE046} {\\uE047} {\\uE048} {\\uE049} {\\uE04A} {\\uE04B} {\\uE04C} {\\uE04D} {\\uE04E} {\\uE04F} {\\uE050} {\\uE051} {\\uE052} {\\uE053} {\\uE054} {\\uE055} {\\uE056} {\\uE057} {\\uE058} {\\uE059} {\\uE05A} {\\uE05B} {\\uE05C} {\\uE05D} {\\uE05E} {\\uE05F} {\\uE060} {\\uE061} {\\uE062} {\\uE063} {\\uE064} {\\uE065} {\\uE066} {\\uE067} {\\uE068} {\\uE069} {\\uE06A} {\\uE06B} {\\uE06C} {\\uE06D} {\\uE06E} {\\uE06F} {\\uE070} {\\uE071} {\\uE072} {\\uE073} {\\uE074} {\\uE075} {\\uE076} {\\uE077} {\\uE078} {\\uE079} {\\uE07A} {\\uE07B} {\\uE07C} {\\uE07D} {\\uE07E} {\\uE07F} {\\uE080} {\\uE081} {\\uE082} {\\uE083} {\\uE084} {\\uE085} {\\uE086} {\\uE087}" },
  1931. { "MUDFONT BRAILLE TUBE", "MUDFONT", 1, 2, 1, 2, 0, 0, "{\\u28CF} {\\u28C7} {\\u28CE} {\\u28C6} {\\u28C9} {\\u28C1} {\\u28C8} {\\u28C0} {\\u288F} {\\u2887} {\\u288E} {\\u2886} {\\u2889} {\\u2881} {\\u2888} {\\u2880} {\\u284F} {\\u2847} {\\u284E} {\\u2846} {\\u2849} {\\u2841} {\\u2848} {\\u2880} {\\u280F} {\\u2807} {\\u280E} {\\u2806} {\\u2809} {\\u2801} {\\u2808} {\\u2800} {\\u28F9} {\\u28F8} {\\u28F1} {\\u28F0} {\\u28C9} {\\u28C8} {\\u28C2} {\\u28C0} {\\u2879} {\\u2878} {\\u2871} {\\u2870} {\\u2849} {\\u2848} {\\u2842} {\\u2840} {\\u28B9} {\\u28B8} {\\u28B1} {\\u28B0} {\\u2889} {\\u2888} {\\u2882} {\\u2880} {\\u2839} {\\u2838} {\\u2831} {\\u2830} {\\u2809} {\\u2808} {\\u2802} {\\u2800} {\\u2830} {\\u2838} {\\u2831} {\\u2839} {\\u2836} {\\u283E} {\\u2837} {\\u283F} {\\u2870} {\\u2878} {\\u2871} {\\u2879} {\\u2876} {\\u287E} {\\u2877} {\\u287F} {\\u28B0} {\\u28B8} {\\u28B1} {\\u28B9} {\\u28B6} {\\u28BE} {\\u28B7} {\\u28BF} {\\u28F0} {\\u28F8} {\\u28F1} {\\u28F9} {\\u28F6} {\\u28FE} {\\u28F7} {\\u28FF} {\\u2806} {\\u2807} {\\u280E} {\\u280F} {\\u2836} {\\u2837} {\\u283E} {\\u283F} {\\u2886} {\\u2887} {\\u288E} {\\u288F} {\\u28B6} {\\u28B7} {\\u28BE} {\\u28BF} {\\u2846} {\\u2847} {\\u284E} {\\u284F} {\\u2876} {\\u2877} {\\u287E} {\\u287F} {\\u28C6} {\\u28C7} {\\u28CE} {\\u28CF} {\\u28F6} {\\u28F7} {\\u28FE} {\\u28FF} {\\u2818} {\\u28A0} {\\u2844} {\\u2803} {} {} {} {}" },
  1932. { "MUDFONT BRAILLE LINE", "MUDFONT", 1, 2, 1, 2, 0, 0, "{\\u2830} {\\u2838} {\\u2831} {\\u2839} {\\u2836} {\\u283E} {\\u2837} {\\u283F} {\\u2870} {\\u2878} {\\u2871} {\\u2879} {\\u2876} {\\u287E} {\\u2877} {\\u287F} {\\u28B0} {\\u28B8} {\\u28B1} {\\u28B9} {\\u28B6} {\\u28BE} {\\u28B7} {\\u28BF} {\\u28F0} {\\u28F8} {\\u28F1} {\\u28F9} {\\u28F6} {\\u28FE} {\\u28F7} {\\u28FF} {\\u2806} {\\u2807} {\\u280E} {\\u280F} {\\u2836} {\\u2837} {\\u283E} {\\u283F} {\\u2886} {\\u2887} {\\u288E} {\\u288F} {\\u28B6} {\\u28B7} {\\u28BE} {\\u28BF} {\\u2846} {\\u2847} {\\u284E} {\\u284F} {\\u2876} {\\u2877} {\\u287E} {\\u287F} {\\u28C6} {\\u28C7} {\\u28CE} {\\u28CF} {\\u28F6} {\\u28F7} {\\u28FE} {\\u28FF} {\\u2800} {\\u2808} {\\u2801} {\\u2809} {\\u2806} {\\u280E} {\\u2807} {\\u280F} {\\u2840} {\\u2848} {\\u2841} {\\u2849} {\\u2846} {\\u284E} {\\u2847} {\\u284F} {\\u2880} {\\u2888} {\\u2881} {\\u2889} {\\u2886} {\\u288E} {\\u2887} {\\u288F} {\\u28C0} {\\u28C8} {\\u28C1} {\\u28C9} {\\u28C6} {\\u28CE} {\\u28C7} {\\u28CF} {\\u2800} {\\u2801} {\\u2808} {\\u2809} {\\u2830} {\\u2831} {\\u2838} {\\u2839} {\\u2880} {\\u2881} {\\u2888} {\\u2889} {\\u28B0} {\\u28B1} {\\u28B8} {\\u28B9} {\\u2840} {\\u2841} {\\u2848} {\\u2849} {\\u2870} {\\u2871} {\\u2878} {\\u2879} {\\u28C0} {\\u28C1} {\\u28C8} {\\u28C9} {\\u28F0} {\\u28F1} {\\u28F8} {\\u28F9} {\\u2818} {\\u28A0} {\\u2844} {\\u2803} {} {} {} {}" },
  1933. { "MUDFONT NWS", "MUDFONT NWS", 1, 2, 1, 2, 0, 0, "" },
  1934. { "MUDFONT NES", "MUDFONT NES", 1, 2, 1, 2, 0, 0, "" },
  1935. { "MUDFONT VOID NWS", "MUDFONT VOID NWS", 1, 2, 1, 2, 0, 0, "" },
  1936. { "MUDFONT VOID NES", "MUDFONT VOID NES", 1, 2, 1, 2, 0, 0, "" },
  1937. { "MUDFONT CURVED", "MUDFONT CURVED", 1, 2, 1, 2, 0, 0, "" },
  1938. { "MUDFONT CURVED BRAILLE", "MUDFONT CURVED", 1, 2, 1, 2, 0, 0, "{\\u2818} {\\u28A0} {\\u2844} {\\u2803} {} {} {} {}" },
  1939. { "UNICODE GRAPHICS", "UNICODE GRAPHICS", 2, 5, 2, 5, 0, 0, "{ } {\\u2E0C} {\\u2E1D} {>} {\\u2E0D} {\\u2E0C\\u2E0D} {\\uFF0F} {>\\u2E0D} {\\u2E1C} {\\uFF3C} {\\u2E1D\\u2E1C} {>\\u2E1C} {<} {\\u2E0C<} {\\u2E1D<} {><} {-} {\\u2191} {\\u2193} {\\u2502} {+} {\\U01F806} {\\U01F804} {\\u2500} {[} {(} {]} {)}" },
  1940. { NULL, NULL, 0, 0, 0, 0, 0, 0, "" }
  1941. };
  1942. struct stamp_type huge_stamp_table[] =
  1943. {
  1944. { " ", 23, " \n \n \n \n \n " },
  1945. { "!", 23, "██╗\n██║\n██║\n╚═╝\n██╗\n╚═╝" },
  1946. { "\"", 41, "██╗██╗\n2██║██║\n╚═╝╚═╝\n \n \n " },
  1947. { "#", 59, " ██╗ ██╗ \n████████╗\n╚██╔═██╔╝\n████████╗\n╚██╔═██╔╝\n ╚═╝ ╚═╝ " },
  1948. { "&", 59, " ████╗ \n ██╔═██╗ \n ╚████╔╝ \n██╔══██═╗\n╚█████╔█║\n ╚════╝╚╝" },
  1949. { "%", 47, "██╗ ██╗\n╚═╝██╔╝\n ██╔╝ \n ██╔╝ \n██╔╝██╗\n╚═╝ ╚═╝" },
  1950. { "'", 23, "╗██╗\n██║\n╚═╝\n \n \n " },
  1951. { "+", 59, " ██╗ \n ██║ \n████████╗\n╚══██╔══╝\n ██║ \n ╚═╝ " },
  1952. { "0", 53, " █████╗ \n██╔══██╗\n██║ ██║\n██║ ██║\n╚█████╔╝\n ╚════╝ " },
  1953. { "1", 53, " ▄██╗ \n ████║ \n ╚═██║ \n ██║ \n ██████╗\n ╚═════╝" },
  1954. { "2", 53, "██████╗ \n╚════██╗\n █████╔╝\n██╔═══╝ \n███████╗\n╚══════╝" },
  1955. { "3", 53, "██████╗ \n╚════██╗\n █████╔╝\n ╚═══██╗\n██████╔╝\n╚═════╝ " },
  1956. { "4", 53, "██╗ ██╗\n██║ ██║\n███████║\n╚════██║\n ██║\n ╚═╝" },
  1957. { "5", 53, "███████╗\n██╔════╝\n███████╗\n╚════██║\n███████║\n╚══════╝" },
  1958. { "6", 53, " █████╗ \n██╔═══╝ \n██████╗ \n██╔══██╗\n╚█████╔╝\n ╚════╝ " },
  1959. { "7", 53, "███████╗\n╚════██║\n ██╔╝\n ██╔╝ \n ██║ \n ╚═╝ " },
  1960. { "8", 53, " █████╗ \n██╔══██╗\n╚█████╔╝\n██╔══██╗\n╚█████╔╝\n ╚════╝ " },
  1961. { "9", 53, " █████╗ \n██╔══██╗\n╚██████║\n ╚═══██║\n █████╔╝\n ╚════╝ " },
  1962. { ":", 53, " \n ██╗ \n ╚═╝ \n \n ██╗ \n ╚═╝ " },
  1963. { "A", 53, " █████╗ \n██╔══██╗\n███████║\n██╔══██║\n██║ ██║\n╚═╝ ╚═╝" },
  1964. { "B", 53, "██████╗ \n██╔══██╗\n██████╔╝\n██╔══██╗\n██████╔╝\n╚═════╝ " },
  1965. { "C", 53, " ██████╗\n██╔════╝\n██║ \n██║ \n╚██████╗\n ╚═════╝" },
  1966. { "D", 53, "██████╗ \n██╔══██╗\n██║ ██║\n██║ ██║\n██████╔╝\n╚═════╝ " },
  1967. { "E", 53, "███████╗\n██╔════╝\n█████╗ \n██╔══╝ \n███████╗\n╚══════╝" },
  1968. { "F", 53, "███████╗\n██╔════╝\n█████╗ \n██╔══╝ \n██║ \n╚═╝ " },
  1969. { "G", 59, " ██████╗ \n██╔════╝ \n██║ ███╗\n██║ ██║\n╚██████╔╝\n ╚═════╝ " },
  1970. { "H", 53, "██╗ ██╗\n██║ ██║\n███████║\n██╔══██║\n██║ ██║\n╚═╝ ╚═╝" },
  1971. { "I", 47, "██████╗\n╚═██╔═╝\n ██║ \n ██║ \n██████╗\n╚═════╝" },
  1972. { "J", 53, " ██╗\n ██║\n ██║\n██ ██║\n╚█████╔╝\n ╚════╝ " },
  1973. { "K", 53, "██╗ ██╗\n██║ ██╔╝\n█████╔╝ \n██╔═██╗ \n██║ ██╗\n╚═╝ ╚═╝" },
  1974. { "L", 53, "██╗ \n██║ \n██║ \n██║ \n███████╗\n╚══════╝" },
  1975. { "M", 71, "███╗ ███╗\n████╗████║\n██╔███╔██║\n██║╚█╔╝██║\n██║ ╚╝ ██║\n╚═╝ ╚═╝" },
  1976. { "N", 65, "███╗ ██╗\n████╗ ██║\n██╔██╗ ██║\n██║╚██╗██║\n██║ ╚████║\n╚═╝ ╚═══╝" },
  1977. { "O", 59, " ██████╗ \n██╔═══██╗\n██║ ██║\n██║ ██║\n╚██████╔╝\n ╚═════╝ " },
  1978. { "P", 53, "██████╗ \n██╔══██╗\n██████╔╝\n██╔═══╝ \n██║ \n╚═╝ " },
  1979. { "Q", 59, " ██████╗ \n██╔═══██╗\n██║ ██║\n██║▄▄ ██║\n╚██████╔╝\n ╚══▀▀═╝ " },
  1980. { "R", 53, "██████╗ \n██╔══██╗\n██████╔╝\n██╔══██╗\n██║ ██║\n╚═╝ ╚═╝" },
  1981. { "S", 53, "███████╗\n██╔════╝\n███████╗\n╚════██║\n███████║\n╚══════╝" },
  1982. { "T", 59, "████████╗\n╚══██╔══╝\n ██║ \n ██║ \n ██║ \n ╚═╝ " },
  1983. { "U", 59, "██╗ ██╗\n██║ ██║\n██║ ██║\n██║ ██║\n╚██████╔╝\n ╚═════╝ " },
  1984. { "V", 59, "██╗ ██╗\n██║ ██║\n██║ ██║\n╚██╗ ██╔╝\n ╚████╔╝ \n ╚═══╝ " },
  1985. { "W", 65, "██╗ ██╗\n██║ ██║\n██║ █╗ ██║\n██║███╗██║\n╚███╔███╔╝\n ╚══╝╚══╝ " },
  1986. { "X", 53, "██╗ ██╗\n╚██╗██╔╝\n ╚███╔╝ \n ██╔██╗ \n██╔╝ ██╗\n╚═╝ ╚═╝" },
  1987. { "Y", 59, "██╗ ██╗\n╚██╗ ██╔╝\n ╚████╔╝ \n ╚██╔╝ \n ██║ \n ╚═╝ " },
  1988. { "Z", 53, "███████╗\n╚══███╔╝\n ███╔╝ \n ███╔╝ \n███████╗\n╚══════╝" },
  1989. { "i", 23, "██╗\n╚═╝\n██╗\n██║\n██║\n╚═╝" },
  1990. { "n", 47, " \n \n██▟███╗\n██║ ██║\n██║ ██║\n╚═╝ ╚═╝" },
  1991. { NULL, 0, NULL }
  1992. };