1 /******************************************************************************
2 *   This file is part of TinTin++                                             *
3 *                                                                             *
4 *   Copyright 2004-2020 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 /******************************************************************************
22 *                                                                             *
23 *              (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t                   *
24 *                                                                             *
25 *                        coded by peter unold 1992                            *
26 *                       modified by Bill Reiss 1993                           *
27 *                    recoded by Igor van den Hoven 2004                       *
28 ******************************************************************************/
29 
30 #include <stdio.h>
31 #include <zlib.h>
32 #include <ctype.h>
33 #include <termios.h>
34 #include <pcre.h>
35 #include <errno.h>
36 #include <math.h>
37 #include <stdarg.h>
38 
39 /******************************************************************************
40 *   Autoconf patching by David Hedbor                                         *
41 *******************************************************************************/
42 
43 #include "config.h"
44 
45 #if defined(HAVE_STRING_H)
46 #include <string.h>
47 #elif defined(HAVE_STRINGS_H)
48 #include <strings.h>
49 #endif
50 
51 #ifdef HAVE_STDLIB_H
52 #include <stdlib.h>
53 #endif
54 
55 #ifdef HAVE_UNISTD_H
56 #include <unistd.h>
57 #endif
58 
59 
60 #ifdef HAVE_TIME_H
61 #include <time.h>
62 #endif
63 
64 
65 #ifdef TIME_WITH_SYS_TIME
66 #include <sys/time.h>
67 #endif
68 
69 /*
70 #ifdef SOCKS
71 #include <socks.h>
72 #endif
73 */
74 
75 #ifndef BADSIG
76 #define BADSIG (RETSIGTYPE (*)(int))-1
77 #endif
78 
79 
80 #ifdef HAVE_NET_ERRNO_H
81 #include <net/errno.h>
82 #endif
83 
84 
85 #ifdef HAVE_GNUTLS_H
86 #include <gnutls/gnutls.h>
87 #include <gnutls/x509.h>
88 #else
89 #define gnutls_session_t int
90 #endif
91 
92 #ifdef HAVE_SYS_SOCKET_H
93 #include <sys/socket.h>
94 #endif
95 
96 #ifdef HAVE_SYS_TYPES_H
97 #include <sys/types.h>
98 #endif
99 
100 #ifdef HAVE_SYS_STAT_H
101 #include <sys/stat.h>
102 #endif
103 
104 #if !defined(SO_PEERCRED)
105 	#define SO_PEERCRED 17
106 #endif
107 
108 #ifndef __TINTIN_H__
109 #define __TINTIN_H__
110 
111 /*
112 	A bunch of constants
113 */
114 
115 #define FLAG_NONE                        0
116 
117 #define FALSE                            0
118 #define TRUE                             1
119 
120 #define IS_LINE                          0
121 #define IS_PROMPT                        1
122 
123 #define GET_ONE                          0 // stop at spaces
124 #define GET_ALL                          1 // stop at semicolon
125 #define GET_NST                          2 // nest square brackets
126 #define GET_VBT                          4 // ignore semicolon for verbatim mode
127 
128 #define TEL_N                            0
129 #define TEL_Y                            1
130 #define TEL_I                            2
131 
132 #define SCREEN_WIDTH                    80
133 #define SCREEN_HEIGHT                   24
134 
135 #define SORT_PRIORITY                    0
136 #define SORT_ALPHA                       1
137 #define SORT_ALNUM                       2
138 #define SORT_STABLE                      3
139 #define SORT_APPEND                      4
140 
141 #define SEEK_MATCH                       0
142 #define SEEK_REPLACE                     1
143 #define SEEK_APPEND                      2
144 
145 #define DEFAULT_OPEN                   '{'
146 #define DEFAULT_CLOSE                  '}'
147 
148 #define COMMAND_SEPARATOR              ';'
149 
150 #define ASCII_NUL                        0
151 #define ASCII_ENQ                        5 // Ignore if possible
152 #define ASCII_HTML_AMP                   6 // Might conflict with MSDP
153 #define ASCII_BEL                        7
154 #define ASCII_BS                         8
155 #define ASCII_HTAB                       9
156 #define ASCII_LF                        10
157 #define ASCII_VTAB                      11
158 #define ASCII_FF                        12
159 #define ASCII_CR                        13
160 #define ASCII_ESC                       27
161 #define ASCII_HTML_OPEN                 28 // Also file separator, whatever that is
162 #define ASCII_HTML_CLOSE                30 // Also record separator, whatever that is
163 
164 #define CTRL_A                           1
165 #define CTRL_B                           2
166 #define CTRL_C                           3
167 #define CTRL_D                           4
168 #define CTRL_E                           5
169 #define CTRL_F                           6
170 #define CTRL_G                           7
171 #define CTRL_H                           8
172 #define CTRL_I                           9
173 #define CTRL_J                          10
174 #define CTRL_K                          11
175 #define CTRL_L                          12
176 #define CTRL_M                          13
177 #define CTRL_N                          14
178 #define CTRL_O                          15
179 #define CTRL_P                          16
180 #define CTRL_Q                          17
181 #define CTRL_R                          18
182 #define CTRL_S                          19
183 #define CTRL_T                          20
184 #define CTRL_U                          21
185 #define CTRL_V                          22
186 #define CTRL_W                          23
187 #define CTRL_X                          24
188 #define CTRL_Y                          25
189 #define CTRL_Z                          26
190 
191 
192 #define ASCII_DEL                      127
193 
194 #define DAEMON_DIR               "daemons"
195 #define TINTIN_DIR               ".tintin"
196 
197 #define HISTORY_FILE         "history.txt"
198 
199 #define BUFFER_SIZE                  40000
200 #define INPUT_SIZE                   10000
201 #define PATH_SIZE                     4096
202 #define STACK_SIZE                    1000
203 #define NAME_SIZE                      256
204 #define NUMBER_SIZE                    100
205 #define LEGEND_SIZE                     50
206 #define COLOR_SIZE                      50
207 #define CHAR_SIZE                        5
208 #define LIST_SIZE                        2
209 
210 #define STRING_SIZE        2 * BUFFER_SIZE
211 
212 #define CLIENT_NAME              "TinTin++"
213 #define CLIENT_VERSION           "2.02.12 "
214 
215 
216 #define XT_E                            0x27
217 #define XT_C                            0x5B
218 #define XT_O                            0x5D
219 #define XT_W                            0x74
220 #define XT_T                            0x07
221 #define XT_CS                           0x73
222 #define XT_S                            "\073"
223 #define XT_V                            "\000"
224 
225 /*
226 	<faa> - red
227 	<afa> - green
228 	<ffa> - yellow
229 	<aaf> - blue
230 	<faf> - magenta
231 	<aff> - cyan
232 	<fff> - white
233 	<acf> - Azure
234 	<afc> - Jade
235 	<caf> - Violet
236 	<cfa> - Lime
237 	<fac> - Pink
238 	<fca> - Orange
239 */
240 
241 #define COLOR_BRACE         "\e[38;5;164m" // "<eae>" // magenta
242 #define COLOR_COMMAND       "\e[38;5;044m" // "<aee>" // cyan
243 #define COLOR_CONFIG        "\e[38;5;208m" // "<fca>" // orange
244 #define COLOR_RESET         "\e[0m"        // "<088>" // reset
245 #define COLOR_SEPARATOR     "\e[38;5;160m" // "<eaa>" // red
246 #define COLOR_STATEMENT     "\e[38;5;040m" // "<aea>" // green
247 #define COLOR_STRING        "\e[38;5;188m" // "<eee>" // white
248 //#define COLOR_TEXT          "\e[38;5;122m" // "<cfe>" // pale jade
249 #define COLOR_TEXT          "\e[0m" // "<cfe>" // pale jade
250 #define COLOR_TINTIN        "\e[38;5;184m" // "<eea>" // yellow
251 #define COLOR_REPEAT        "\e[38;5;33m"  // "<acf>" // azure
252 
253 /*
254 	Index for lists used by tintin
255 */
256 
257 enum lists
258 {
259 	LIST_ACTION,
260 	LIST_ALIAS,
261 	LIST_BUTTON,
262 	LIST_CLASS,
263 	LIST_COMMAND,
264 	LIST_CONFIG,
265 	LIST_DELAY,
266 	LIST_EVENT,
267 	LIST_FUNCTION,
268 	LIST_GAG,
269 	LIST_HIGHLIGHT,
270 	LIST_HISTORY,
271 	LIST_LANDMARK,
272 	LIST_MACRO,
273 	LIST_PATH,
274 	LIST_PATHDIR,
275 	LIST_PROMPT,
276 	LIST_SUBSTITUTE,
277 	LIST_TAB,
278 	LIST_TERRAIN,
279 	LIST_TICKER,
280 	LIST_VARIABLE,
281 	LIST_MAX,
282 };
283 /*
284 #define LIST_ACTION                      0
285 #define LIST_ALIAS                       1
286 #define LIST_BUTTON                      2
287 #define LIST_CLASS                       3
288 #define LIST_COMMAND                     4
289 #define LIST_CONFIG                      5
290 #define LIST_DELAY                       6
291 #define LIST_EVENT                       7
292 #define LIST_FUNCTION                    8
293 #define LIST_GAG                         9
294 #define LIST_HIGHLIGHT                  10
295 #define LIST_HISTORY                    11
296 #define LIST_LANDMARK                   12
297 #define LIST_MACRO                      13
298 #define LIST_PATH                       14
299 #define LIST_PATHDIR                    15
300 #define LIST_PROMPT                     16
301 #define LIST_SUBSTITUTE                 17
302 #define LIST_TAB                        18
303 #define LIST_TERRAIN                    19
304 #define LIST_TICKER                     20
305 #define LIST_VARIABLE                   21
306 #define LIST_MAX                        22
307 */
308 /*
309 	Command type
310 */
311 
312 enum operators
313 {
314 	TOKEN_TYPE_BREAK,
315 	TOKEN_TYPE_CASE,
316 	TOKEN_TYPE_COMMAND,
317 	TOKEN_TYPE_CONTINUE,
318 	TOKEN_TYPE_DEFAULT,
319 	TOKEN_TYPE_END,
320 	TOKEN_TYPE_ELSE,
321 	TOKEN_TYPE_ELSEIF,
322 	TOKEN_TYPE_FOREACH,
323 	TOKEN_TYPE_BROKEN_FOREACH,
324 	TOKEN_TYPE_IF,
325 	TOKEN_TYPE_LOOP,
326 	TOKEN_TYPE_BROKEN_LOOP,
327 	TOKEN_TYPE_PARSE,
328 	TOKEN_TYPE_BROKEN_PARSE,
329 	TOKEN_TYPE_REGEX,
330 	TOKEN_TYPE_RETURN,
331 	TOKEN_TYPE_SESSION,
332 	TOKEN_TYPE_STRING,
333 	TOKEN_TYPE_SWITCH,
334 	TOKEN_TYPE_WHILE,
335 	TOKEN_TYPE_BROKEN_WHILE,
336 	TOKEN_TYPE_STATEMENT,
337 	TOKEN_TYPE_CONFIG,
338 	TOKEN_TYPE_REPEAT
339 };
340 
341 /*
342 	Various flags
343 */
344 #define BV00 (0   <<  0)
345 
346 #define BV01 (1   <<  0)
347 #define BV02 (1   <<  1)
348 #define BV03 (1   <<  2)
349 #define BV04 (1   <<  3)
350 #define BV05 (1   <<  4)
351 #define BV06 (1   <<  5)
352 #define BV07 (1   <<  6)
353 #define BV08 (1   <<  7)
354 #define BV09 (1   <<  8)
355 #define BV10 (1   <<  9)
356 #define BV11 (1   << 10)
357 #define BV12 (1   << 11)
358 #define BV13 (1   << 12)
359 #define BV14 (1   << 13)
360 #define BV15 (1   << 14)
361 #define BV16 (1   << 15)
362 #define BV17 (1   << 16)
363 #define BV18 (1   << 17)
364 #define BV19 (1   << 18)
365 #define BV20 (1   << 19)
366 #define BV21 (1   << 20)
367 #define BV22 (1   << 21)
368 #define BV23 (1   << 22)
369 #define BV24 (1   << 23)
370 #define BV25 (1   << 24)
371 #define BV26 (1   << 25)
372 #define BV27 (1   << 26)
373 #define BV28 (1   << 27)
374 #define BV29 (1   << 28)
375 #define BV30 (1   << 29)
376 #define BV31 (1   << 30)
377 #define BV32 (1LL << 31)
378 #define BV33 (1LL << 32)
379 #define BV34 (1LL << 33)
380 #define BV35 (1LL << 34)
381 #define BV36 (1LL << 35)
382 #define BV37 (1LL << 36)
383 #define BV38 (1LL << 37)
384 #define BV39 (1LL << 38)
385 #define BV40 (1LL << 39)
386 #define BV41 (1LL << 40)
387 
388 
389 #define BUFFER_FLAG_GREP                  BV01
390 
391 
392 #define CHAR_FLAG_DIGIT                   BV01
393 #define CHAR_FLAG_ALPHA                   BV02
394 #define CHAR_FLAG_VAR                     BV03
395 #define CHAR_FLAG_SPACE                   BV04
396 #define CHAR_FLAG_HEX                     BV05
397 #define CHAR_FLAG_CSI                     BV06
398 #define CHAR_FLAG_PRINT                   BV07 // max
399 
400 
401 #define CHARSET_FLAG_UTF8                 BV01
402 #define CHARSET_FLAG_BIG5                 BV02
403 #define CHARSET_FLAG_GBK1                 BV03
404 #define CHARSET_FLAG_CP949                BV04
405 
406 #define CHARSET_FLAG_BIG5TOUTF8           BV05
407 #define CHARSET_FLAG_FANSITOUTF8          BV06
408 #define CHARSET_FLAG_GBK1TOUTF8           BV07
409 #define CHARSET_FLAG_ISO1TOUTF8           BV08
410 #define CHARSET_FLAG_ISO2TOUTF8           BV09
411 #define CHARSET_FLAG_KOI8TOUTF8           BV10
412 #define CHARSET_FLAG_CP1251TOUTF8         BV11
413 #define CHARSET_FLAG_CP949TOUTF8          BV12
414 
415 #define CHARSET_FLAG_EUC                  CHARSET_FLAG_BIG5|CHARSET_FLAG_GBK1|CHARSET_FLAG_CP949
416 #define CHARSET_FLAG_ALL_TOUTF8           CHARSET_FLAG_BIG5TOUTF8|CHARSET_FLAG_CP1251TOUTF8|CHARSET_FLAG_FANSITOUTF8|CHARSET_FLAG_GBK1TOUTF8|CHARSET_FLAG_ISO1TOUTF8|CHARSET_FLAG_ISO2TOUTF8|CHARSET_FLAG_KOI8TOUTF8|CHARSET_FLAG_CP949TOUTF8
417 #define CHARSET_FLAG_ALL                  CHARSET_FLAG_UTF8|CHARSET_FLAG_ALL_TOUTF8|CHARSET_FLAG_EUC
418 
419 
420 #define COL_BLD                       BV01
421 #define COL_ITA                       BV02
422 #define COL_UND                       BV03
423 #define COL_BLK                       BV04
424 #define COL_REV                       BV05
425 
426 #define COL_XTF                       BV06
427 #define COL_XTF_5                     BV07
428 #define COL_XTF_R                     BV08
429 #define COL_XTB                       BV09
430 #define COL_XTB_5                     BV10
431 #define COL_XTB_R                     BV11
432 
433 #define COL_TCF                       BV12
434 #define COL_TCF_2                     BV13
435 #define COL_TCF_R                     BV14
436 #define COL_TCB                       BV15
437 #define COL_TCB_2                     BV16
438 #define COL_TCB_R                     BV17
439 
440 #define CHAT_NAME_CHANGE                 1
441 #define CHAT_REQUEST_CONNECTIONS         2
442 #define CHAT_CONNECTION_LIST             3
443 #define CHAT_TEXT_EVERYBODY              4
444 #define CHAT_TEXT_PERSONAL               5
445 #define CHAT_TEXT_GROUP                  6
446 #define CHAT_MESSAGE                     7
447 #define CHAT_DO_NOT_DISTURB              8
448 #define CHAT_SEND_ACTION                 9
449 #define CHAT_SEND_ALIAS                 10
450 #define CHAT_SEND_MACRO                 11
451 #define CHAT_SEND_VARIABLE              12
452 #define CHAT_SEND_EVENT                 13
453 #define CHAT_SEND_GAG                   14
454 #define CHAT_SEND_HIGHLIGHT             15
455 #define CHAT_SEND_LIST                  16
456 #define CHAT_SEND_ARRAY                 17
457 #define CHAT_SEND_BARITEM               18
458 #define CHAT_VERSION                    19
459 #define CHAT_FILE_START                 20
460 #define CHAT_FILE_DENY                  21
461 #define CHAT_FILE_BLOCK_REQUEST         22
462 #define CHAT_FILE_BLOCK                 23
463 #define CHAT_FILE_END                   24
464 #define CHAT_FILE_CANCEL                25
465 #define CHAT_PING_REQUEST               26
466 #define CHAT_PING_RESPONSE              27
467 #define CHAT_PEEK_CONNECTIONS           28
468 #define CHAT_PEEK_LIST                  29
469 #define CHAT_SNOOP_START                30
470 #define CHAT_SNOOP_DATA                 31
471 
472 #define CHAT_END_OF_COMMAND            255
473 
474 #define CHAT_FLAG_PRIVATE             BV01
475 #define CHAT_FLAG_REQUEST             BV02
476 #define CHAT_FLAG_SERVE               BV03
477 #define CHAT_FLAG_IGNORE              BV04
478 #define CHAT_FLAG_FORWARD             BV05
479 #define CHAT_FLAG_FORWARDBY           BV06
480 #define CHAT_FLAG_FORWARDALL          BV07
481 #define CHAT_FLAG_DND                 BV08
482 #define CHAT_FLAG_LINKLOST            BV09
483 
484 #define INPUT_FLAG_EDIT               BV01
485 #define INPUT_FLAG_HISTORYBROWSE      BV02
486 #define INPUT_FLAG_HISTORYSEARCH      BV03
487 #define INPUT_FLAG_CONVERTMETACHAR    BV04
488 
489 #define PORT_FLAG_PRIVATE             BV01
490 #define PORT_FLAG_REQUEST             BV02
491 #define PORT_FLAG_SERVE               BV03
492 #define PORT_FLAG_IGNORE              BV04
493 #define PORT_FLAG_FORWARD             BV05
494 #define PORT_FLAG_FORWARDBY           BV06
495 #define PORT_FLAG_FORWARDALL          BV07
496 #define PORT_FLAG_DND                 BV08
497 #define PORT_FLAG_LINKLOST            BV09
498 
499 #define PORT_RANK_SPY                    0 // observer
500 #define PORT_RANK_DIPLOMAT               1 //
501 #define PORT_RANK_SCOUT                  2
502 
503 #define RANK_FLAG_SCOUT               BV01
504 
505 #define COMM_FLAG_DISCONNECT          BV01
506 #define COMM_FLAG_PASSWORD            BV02
507 #define COMM_FLAG_REMOTEECHO          BV03
508 #define COMM_FLAG_EOR                 BV04
509 #define COMM_FLAG_MSDPUPDATE          BV05
510 #define COMM_FLAG_256COLORS           BV06
511 #define COMM_FLAG_UTF8                BV07
512 #define COMM_FLAG_GMCP                BV08
513 
514 #define MSDP_FLAG_COMMAND             BV01
515 #define MSDP_FLAG_LIST                BV02
516 #define MSDP_FLAG_SENDABLE            BV03
517 #define MSDP_FLAG_REPORTABLE          BV04
518 #define MSDP_FLAG_CONFIGURABLE        BV05
519 #define MSDP_FLAG_REPORTED            BV06
520 #define MSDP_FLAG_UPDATED             BV07
521 
522 #define MTTS_FLAG_ANSI                BV01
523 #define MTTS_FLAG_VT100               BV02
524 #define MTTS_FLAG_UTF8                BV03
525 #define MTTS_FLAG_256COLORS           BV04
526 #define MTTS_FLAG_MOUSETRACKING       BV05
527 #define MTTS_FLAG_COLORPALETTE        BV06
528 #define MTTS_FLAG_SCREENREADER        BV07
529 #define MTTS_FLAG_PROXY               BV08
530 #define MTTS_FLAG_TRUECOLOR           BV09
531 
532 #define SCREEN_FLAG_CSIP              BV01
533 #define SCREEN_FLAG_OSCT              BV02
534 #define SCREEN_FLAG_OMIT              BV03
535 #define SCREEN_FLAG_GET_ONE           BV04
536 #define SCREEN_FLAG_GET_ALL           BV05
537 #define SCREEN_FLAG_GET_NONE          BV06
538 
539 #define SCREEN_FLAG_SCROLLMODE        BV07
540 #define SCREEN_FLAG_SCROLLUPDATE      BV08
541 
542 #define SCROLL_FLAG_RESIZE            BV01
543 
544 #define STR_FLAG_STACK                BV01
545 #define STR_FLAG_LIST                 BV02
546 #define STR_FLAG_FREE                 BV03
547 
548 
549 // combines with event flags
550 
551 #define SUB_NONE                      BV00
552 
553 #define SUB_ARG                       BV01
554 #define SUB_SEC                       BV02
555 #define SUB_BRA                       BV03
556 #define SUB_CMD                       BV04
557 #define SUB_VAR                       BV05
558 #define SUB_FUN                       BV06
559 #define SUB_COL                       BV07
560 #define SUB_ESC                       BV08
561 #define SUB_EOL                       BV09 // telnet
562 #define SUB_LNF                       BV10
563 #define SUB_SIL                       BV11 // silent
564 #define SUB_LIT                       BV12 // no soft escaping
565 
566 /*
567 #define SUB_ARG                       BV01
568 #define SUB_SEC                       BV02
569 #define SUB_BRA                       BV03
570 */
571 #define EVENT_FLAG_CATCH              BV04
572 #define EVENT_FLAG_CLASS              BV05
573 #define EVENT_FLAG_GAG                BV06
574 #define EVENT_FLAG_INPUT              BV07
575 #define EVENT_FLAG_MAP                BV08
576 #define EVENT_FLAG_MOUSE              BV09
577 #define EVENT_FLAG_OUTPUT             BV10
578 #define EVENT_FLAG_PORT               BV11
579 #define EVENT_FLAG_SCAN               BV12
580 #define EVENT_FLAG_SCREEN             BV13
581 #define EVENT_FLAG_SESSION            BV14
582 #define EVENT_FLAG_SYSTEM             BV15
583 #define EVENT_FLAG_TELNET             BV16
584 #define EVENT_FLAG_TIME               BV17
585 #define EVENT_FLAG_UPDATE             BV18
586 #define EVENT_FLAG_VARIABLE           BV19
587 #define EVENT_FLAG_VT100              BV20
588 
589 #define TAB_FLAG_FORWARD              BV01
590 #define TAB_FLAG_BACKWARD             BV02
591 #define TAB_FLAG_COMPLETE             BV03
592 #define TAB_FLAG_CASELESS             BV04
593 #define TAB_FLAG_DICTIONARY           BV05
594 #define TAB_FLAG_LIST                 BV06
595 #define TAB_FLAG_SCROLLBACK           BV07
596 
597 #define REGEX_FLAG_NONE                  0
598 #define REGEX_FLAG_FIX                BV01
599 #define REGEX_FLAG_ARG                BV02
600 #define REGEX_FLAG_CMD                BV03
601 
602 
603 
604 #define TINTIN_FLAG_GETNUMBER         BV01 // UNUSED
605 #define TINTIN_FLAG_SESSIONUPDATE     BV02
606 #define TINTIN_FLAG_PROCESSINPUT      BV03
607 #define TINTIN_FLAG_INHERITANCE       BV04
608 #define TINTIN_FLAG_INSERTINPUT       BV05
609 #define TINTIN_FLAG_CHILDLOCK         BV06
610 #define TINTIN_FLAG_TERMINATE         BV07
611 #define TINTIN_FLAG_MOUSETRACKING     BV08
612 #define TINTIN_FLAG_DISPLAYUPDATE     BV09
613 #define TINTIN_FLAG_DAEMONIZE         BV10
614 #define TINTIN_FLAG_HIDDENCURSOR      BV11
615 #define TINTIN_FLAG_LOCAL             BV12
616 #define TINTIN_FLAG_PRESERVEMACRO     BV13
617 #define TINTIN_FLAG_WINCHUPDATE       BV14
618 
619 #define CONFIG_FLAG_AUTOPATCH         BV01
620 #define CONFIG_FLAG_AUTOPROMPT        BV02
621 #define CONFIG_FLAG_COLORPATCH        BV03
622 #define CONFIG_FLAG_CONVERTMETA       BV04
623 #define CONFIG_FLAG_ECHOCOMMAND       BV05
624 #define CONFIG_FLAG_MCCP              BV06
625 #define CONFIG_FLAG_MOUSEDEBUG        BV07
626 #define CONFIG_FLAG_MOUSEINFO         BV08
627 #define CONFIG_FLAG_MOUSEPIXELS       BV09
628 #define CONFIG_FLAG_MOUSETRACKING     BV10
629 #define CONFIG_FLAG_REPEATENTER       BV11
630 #define CONFIG_FLAG_SCREENREADER      BV12
631 #define CONFIG_FLAG_SCROLLLOCK        BV13
632 #define CONFIG_FLAG_SPEEDWALK         BV14
633 #define CONFIG_FLAG_TELNET            BV15
634 #define CONFIG_FLAG_VERBATIM          BV16
635 #define CONFIG_FLAG_VERBOSE           BV17
636 #define CONFIG_FLAG_WORDWRAP          BV18
637 
638 #define SES_FLAG_BUFFERUPDATE         BV01
639 #define SES_FLAG_CLOSED               BV02
640 #define SES_FLAG_CONNECTED            BV03
641 #define SES_FLAG_GAG                  BV04
642 #define SES_FLAG_PATHMAPPING          BV05
643 #define SES_FLAG_PRINTBUFFER          BV06
644 #define SES_FLAG_PRINTLINE            BV07
645 #define SES_FLAG_READMUD              BV08
646 #define SES_FLAG_RUN                  BV09
647 #define SES_FLAG_SCANABORT            BV10
648 #define SES_FLAG_SCROLLSPLIT          BV11
649 #define SES_FLAG_SNOOP                BV12
650 #define SES_FLAG_SNOOPSCROLL          BV13
651 #define SES_FLAG_SPLIT                BV14
652 #define SES_FLAG_UPDATEVTMAP          BV15
653 
654 
655 #define TELOPT_FLAG_TELNET            BV01
656 #define TELOPT_FLAG_SGA               BV02
657 #define TELOPT_FLAG_ECHO              BV03
658 #define TELOPT_FLAG_NAWS              BV04
659 #define TELOPT_FLAG_PROMPT            BV05
660 #define TELOPT_FLAG_DEBUG             BV06
661 #define TELOPT_FLAG_TSPEED            BV07
662 #define TELOPT_FLAG_TTYPE             BV08
663 #define TELOPT_FLAG_MTTS              BV09
664 #define TELOPT_FLAG_UPDATENAWS        BV10
665 #define TELOPT_FLAG_CR                BV11
666 #define TELOPT_FLAG_LF                BV12
667 #define TELOPT_FLAG_NUL               BV13
668 
669 #define LIST_FLAG_IGNORE              BV01
670 #define LIST_FLAG_PRIORITY            BV02
671 #define LIST_FLAG_MESSAGE             BV03
672 #define LIST_FLAG_DEBUG               BV04
673 #define LIST_FLAG_INFO                BV05
674 #define LIST_FLAG_LOG                 BV06
675 #define LIST_FLAG_CLASS               BV07
676 #define LIST_FLAG_READ                BV08
677 #define LIST_FLAG_WRITE               BV09
678 #define LIST_FLAG_HIDE                BV10
679 #define LIST_FLAG_INHERIT             BV11
680 #define LIST_FLAG_REGEX               BV12
681 #define LIST_FLAG_NEST                BV13
682 #define LIST_FLAG_DEFAULT             LIST_FLAG_MESSAGE
683 
684 #define NODE_FLAG_ONESHOT             BV01
685 
686 #define LOG_FLAG_NONE                    0
687 #define LOG_FLAG_LINEFEED             BV01
688 #define LOG_FLAG_OVERWRITE            BV02
689 #define LOG_FLAG_APPEND               BV03
690 #define LOG_FLAG_NEXT                 BV04
691 #define LOG_FLAG_LOW                  BV05
692 
693 #define LOG_FLAG_HTML                 BV06
694 #define LOG_FLAG_PLAIN                BV07
695 #define LOG_FLAG_RAW                  BV08
696 #define LOG_FLAG_OLD_HTML             BV09
697 #define LOG_FLAG_OLD_PLAIN            BV10
698 #define LOG_FLAG_OLD_RAW              BV11
699 
700 
701 // Saved in map files, so don't swap around
702 
703 // keep synced with exit flags
704 
705 #define ROOM_FLAG_AVOID               BV01
706 #define ROOM_FLAG_HIDE                BV02
707 #define ROOM_FLAG_LEAVE               BV03
708 #define ROOM_FLAG_VOID                BV04
709 #define ROOM_FLAG_STATIC              BV05
710 #define ROOM_FLAG_CURVED              BV06
711 #define ROOM_FLAG_PATH                BV07
712 #define ROOM_FLAG_NOGLOBAL            BV08
713 #define ROOM_FLAG_INVIS               BV09
714 
715 #define ROOM_FLAG_AVOID_TMP           BV10|ROOM_FLAG_AVOID // To realign exit and room flags in the future.
716 #define ROOM_FLAG_HIDE_TMP            BV11|ROOM_FLAG_HIDE
717 #define ROOM_FLAG_LEAVE_TMP           BV12|ROOM_FLAG_LEAVE
718 #define ROOM_FLAG_VOID_TMP            BV13|ROOM_FLAG_VOID
719 #define ROOM_FLAG_STATIC_TMP          BV13|ROOM_FLAG_STATIC
720 #define ROOM_FLAG_CURVED_TMP          BV14|ROOM_FLAG_CURVED
721 #define ROOM_FLAG_BLOCK               BV15
722 #define ROOM_FLAG_TERRAIN             BV20
723 #define ROOM_FLAG_FOG                 BV21
724 
725 // keep synced with room flags
726 
727 #define EXIT_FLAG_HIDE                BV01
728 #define EXIT_FLAG_AVOID               BV02
729 #define EXIT_FLAG_INVIS               BV03
730 #define EXIT_FLAG_BLOCK               BV04
731 #define EXIT_FLAG_ALL                 BV01|BV02|BV03|BV04
732 
733 #define EXIT_GRID_0                     0
734 #define EXIT_GRID_N                     1
735 #define EXIT_GRID_E                     2
736 #define EXIT_GRID_S                     3
737 #define EXIT_GRID_W                     4
738 #define EXIT_GRID_U                     5
739 #define EXIT_GRID_D                     6
740 #define EXIT_GRID_NE                    7
741 #define EXIT_GRID_NW                    8
742 #define EXIT_GRID_SE                    9
743 #define EXIT_GRID_SW                   10
744 
745 #define MAP_FLAG_STATIC               BV01
746 #define MAP_FLAG_VTMAP                BV02
747 #define MAP_FLAG_DIRECTION            BV03
748 #define MAP_FLAG_ASCIIGRAPHICS        BV04
749 #define MAP_FLAG_ASCIIVNUMS           BV05
750 #define MAP_FLAG_MUDFONT              BV06
751 #define MAP_FLAG_NOFOLLOW             BV07
752 #define MAP_FLAG_SYMBOLGRAPHICS       BV08
753 #define MAP_FLAG_UNICODEGRAPHICS      BV09
754 #define MAP_FLAG_BLOCKGRAPHICS        BV10
755 #define MAP_FLAG_RESIZE               BV11
756 #define MAP_FLAG_SYNC                 BV12
757 #define MAP_FLAG_ASCIILENGTH          BV13 // For debugging but might be useful
758 #define MAP_FLAG_TERRAIN              BV14
759 #define MAP_FLAG_UPDATETERRAIN        BV15
760 #define MAP_FLAG_DOUBLED              BV16
761 #define MAP_FLAG_QUIET                BV17
762 #define MAP_FLAG_READ                 BV18
763 
764 #define MAP_SEARCH_NAME                0
765 #define MAP_SEARCH_EXITS               1
766 #define MAP_SEARCH_DESC                2
767 #define MAP_SEARCH_AREA                3
768 #define MAP_SEARCH_NOTE                4
769 #define MAP_SEARCH_TERRAIN             5
770 #define MAP_SEARCH_FLAG                6
771 #define MAP_SEARCH_ID                  7
772 #define MAP_SEARCH_DISTANCE            8
773 #define MAP_SEARCH_MAX                 9
774 
775 #define MAP_EXIT_N                     1
776 #define MAP_EXIT_E                     2
777 #define MAP_EXIT_S                     4
778 #define MAP_EXIT_W                     8
779 #define MAP_EXIT_U                    16
780 #define MAP_EXIT_D                    32
781 
782 #define MAP_DIR_N                     (1LL << MAP_EXIT_N)
783 #define MAP_DIR_E                     (1LL << MAP_EXIT_E)
784 #define MAP_DIR_S                     (1LL << MAP_EXIT_S)
785 #define MAP_DIR_W                     (1LL << MAP_EXIT_W)
786 #define MAP_DIR_U                     (1LL << MAP_EXIT_U)
787 #define MAP_DIR_D                     (1LL << MAP_EXIT_D)
788 
789 #define MAP_DIR_NE                    (1LL << (MAP_EXIT_N|MAP_EXIT_E))
790 #define MAP_DIR_NW                    (1LL << (MAP_EXIT_N|MAP_EXIT_W))
791 #define MAP_DIR_SE                    (1LL << (MAP_EXIT_S|MAP_EXIT_E))
792 #define MAP_DIR_SW                    (1LL << (MAP_EXIT_S|MAP_EXIT_W))
793 
794 #define MAP_UNDO_MOVE                 (1 <<  0)
795 #define MAP_UNDO_CREATE               (1 <<  1)
796 #define MAP_UNDO_LINK                 (1 <<  2)
797 #define MAP_UNDO_INSERT               (1 <<  3)
798 
799 #define TERRAIN_FLAG_DENSE            BV01
800 #define TERRAIN_FLAG_AMPLE            BV02
801 #define TERRAIN_FLAG_SPARSE           BV03
802 #define TERRAIN_FLAG_SCANT            BV04
803 #define TERRAIN_FLAG_NARROW           BV05
804 #define TERRAIN_FLAG_STANDARD         BV06
805 #define TERRAIN_FLAG_WIDE             BV07
806 #define TERRAIN_FLAG_VAST             BV08
807 #define TERRAIN_FLAG_FADEIN           BV09
808 #define TERRAIN_FLAG_FADEOUT          BV10
809 #define TERRAIN_FLAG_DOUBLE           BV11
810 
811 #define MOUSE_FLAG_BUTTON_A              1
812 #define MOUSE_FLAG_BUTTON_B              2
813 #define MOUSE_FLAG_SHIFT                 4
814 #define MOUSE_FLAG_ALT                   8
815 #define MOUSE_FLAG_CTRL                 16
816 #define MOUSE_FLAG_MOTION               32
817 #define MOUSE_FLAG_WHEEL                64
818 #define MOUSE_FLAG_EXTRA               128
819 #define MOUSE_FLAG_RELEASE             256
820 
821 #define CURSOR_FLAG_ALWAYS               1
822 //#define CURSOR_FLAG_NEVER               2
823 #define CURSOR_FLAG_GET_ONE              4
824 #define CURSOR_FLAG_GET_ALL              8
825 
826 #define STARTUP_FLAG_NOGREETING          1
827 #define STARTUP_FLAG_SCREENREADER        2
828 #define STARTUP_FLAG_NORESET             4
829 #define STARTUP_FLAG_ARGUMENT            8
830 #define STARTUP_FLAG_NOTITLE            16
831 #define STARTUP_FLAG_VERBOSE            32
832 
833 #define WRAP_FLAG_NONE                   0
834 #define WRAP_FLAG_DISPLAY             BV01
835 #define WRAP_FLAG_WORD                BV02
836 #define WRAP_FLAG_SPLIT               BV03
837 #define WRAP_FLAG_TAIL                BV04
838 
839 #define LEGEND_ASCII                    0
840 #define LEGEND_ASCII_MISC              16
841 #define LEGEND_ASCII_CURVED            20
842 #define LEGEND_ASCII_DIRS              24
843 #define LEGEND_UNICODE                 32
844 #define LEGEND_UNICODE_MISC            48
845 #define LEGEND_UNICODE_CURVED          52
846 #define LEGEND_UNICODE_DIRS            56
847 #define LEGEND_MUDFONT                 64
848 #define LEGEND_MUDFONT_NWS             64
849 #define LEGEND_MUDFONT_NES             96
850 #define LEGEND_MUDFONT_CURVED         192
851 #define LEGEND_UNICODE_GRAPHICS       196
852 #define LEGEND_MAX                    230
853 
854 #define UNICODE_DIR_SE                  1
855 #define UNICODE_DIR_NE                  2
856 #define UNICODE_DIR_SW                  4
857 #define UNICODE_DIR_NW                  8
858 
859 #define UNICODE_DIR_D                  16
860 #define UNICODE_DIR_N                  17
861 #define UNICODE_DIR_S                  18
862 #define UNICODE_DIR_NS                 19
863 #define UNICODE_DIR_U                  20
864 #define UNICODE_DIR_E                  21
865 #define UNICODE_DIR_W                  22
866 #define UNICODE_DIR_EW                 23
867 #define UNICODE_DIR_RL                 24
868 #define UNICODE_DIR_RL_CURVED          25
869 #define UNICODE_DIR_RR                 26
870 #define UNICODE_DIR_RR_CURVED          27
871 
872 
873 
874 #define MAP_COLOR_AVOID                 0
875 #define MAP_COLOR_BACK                  1
876 #define MAP_COLOR_BLOCK                 2
877 #define MAP_COLOR_EXIT                  3
878 #define MAP_COLOR_FOG                   4
879 #define MAP_COLOR_HIDE                  5
880 #define MAP_COLOR_INVIS                 6
881 #define MAP_COLOR_PATH                  7
882 #define MAP_COLOR_ROOM                  8
883 #define MAP_COLOR_SYMBOL                9
884 #define MAP_COLOR_USER                  10
885 
886 #define MAP_COLOR_MAX                   11
887 
888 
889 /*
890 	Some macros to deal with double linked lists
891 */
892 
893 #define LINK(link, head, tail) \
894 { \
895 	if ((head) == NULL) \
896 	{ \
897 		(head) = (link); \
898 	} \
899 	else \
900 	{ \
901 		(tail)->next = (link); \
902 	} \
903 	(link)->next = NULL; \
904 	(link)->prev = (tail); \
905 	(tail)				    = (link); \
906 }
907 
908 /*
909 #define INSERT_LEFT(link, right, head) \
910 { \
911 	(link)->prev = (right)->prev; \
912 	(right)->prev = (link); \
913 	(link)->next = (right); \
914 	\
915 	if ((link)->prev) \
916 	{ \
917 		(link)->prev->next = (link); \
918 	} \
919 	else \
920 	{ \
921 		(head) = (link); \
922 	} \
923 }
924 
925 
926 #define INSERT_RIGHT(link, left, tail) \
927 { \
928 	(link)->next = (left)->next; \
929 	(left)->next = (link); \
930 	(link)->prev = (left); \
931 \
932 	if ((link)->next) \
933 	{ \
934 		(link)->next->prev = (link); \
935 	} \
936 	else \
937 	{ \
938 		(tail) = (link); \
939 	} \
940 }
941 */
942 
943 #define UNLINK(link, head, tail) \
944 { \
945 	if (((link)->prev == NULL && (link) != head) \
946 	||  ((link)->next == NULL && (link) != tail)) \
947 	{ \
948 		tintin_printf2(NULL, "#UNLINK ERROR in file %s on line %d", __FILE__, __LINE__); \
949 		dump_stack(); \
950 	} \
951 	if ((link)->prev == NULL) \
952 	{ \
953 		(head)			   = (link)->next; \
954 	} \
955 	else \
956 	{ \
957 		(link)->prev->next	  = (link)->next; \
958 	} \
959 	if ((link)->next == NULL) \
960 	{ \
961 		(tail)			    = (link)->prev; \
962 	} \
963 	else \
964 	{ \
965 		(link)->next->prev	  = (link)->prev; \
966 	} \
967 	(link)->next = NULL; \
968 	(link)->prev = NULL; \
969 }
970 
971 /*
972 	string allocation
973 */
974 
975 #define RESTRING(point, value) \
976 { \
977 	if (point) \
978 	{ \
979 		free(point); \
980 	} \
981 	point = strdup((value)); \
982 }
983 /*
984 #define FREE(point) \
985 { \
986 	free((point)); \
987 	point = NULL; \
988 }
989 */
990 /*
991 	Bit operations
992 */
993 
994 #define HAS_BIT(bitvector, bit)   ((bitvector)  & (bit))
995 #define SET_BIT(bitvector, bit)   ((bitvector) |= (bit))
996 #define DEL_BIT(bitvector, bit)   ((bitvector) &= (~(bit)))
997 #define TOG_BIT(bitvector, bit)   ((bitvector) ^= (bit))
998 #define FFS_BIT(bitvector)        ((ffs(bitvector) - 1))
999 
1000 /*
1001 	Generic
1002 */
1003 
1004 #define URANGE(a, b, c)           ((b) < (a) ? (a) : (b) > (c) ? (c) : (b))
1005 //#define URANGE(a, b, c)           ((b) <= (a) ? (a) : (c) >= (b) ? (b) : (c) < (b) ? (b) : (c))
1006 
1007 #define UMAX(a, b)                ((a) > (b) ? (a) : (b))
1008 #define UMIN(a, b)                ((a) < (b) ? (a) : (b))
1009 
1010 #define next_arg(u)               (u < 99 ? u++ : u)
1011 
1012 #define IS_SPLIT(ses)             (gtd->screen->rows != (ses)->split->bot_row)
1013 
1014 #define SCROLL(ses)               ((ses)->cur_row == 0 || ((ses)->cur_row >= (ses)->split->top_row && (ses)->cur_row <= (ses)->split->bot_row) || ((ses)->cur_row >= ses->input->top_row && (ses)->cur_row <= ses->input->bot_row))
1015 
1016 #define VERBATIM(ses)             (gtd->level->verbatim || (gtd->level->input == 0 && (HAS_BIT((ses)->config_flags, CONFIG_FLAG_VERBATIM) || HAS_BIT(gtd->flags, TINTIN_FLAG_CHILDLOCK))))
1017 
1018 
1019 
1020 /*
1021 	Compatibility
1022 */
1023 
1024 
1025 #define atoll(str) (strtoll(str, NULL, 10))
1026 
1027 /************************ structures *********************/
1028 
1029 struct listroot
1030 {
1031 	struct listnode      ** list;
1032 	struct session        * ses;
1033 	int                     size;
1034 	int                     used;
1035 	int                     update;
1036 	short                   type;
1037 	short                   flags;
1038 };
1039 
1040 struct listnode
1041 {
1042 	struct listroot       * root; // variable
1043 	char                  * arg1;
1044 	char                  * arg2;
1045 	char                  * arg3;
1046 	char                  * arg4;
1047 	char                  * group;
1048 	unsigned int            shots;
1049 	union
1050 	{
1051 		pcre              * regex;      // act, alias, gag, highlight, substitute
1052 		char              * data;       // class
1053 		struct room_data  * room;       // terrain
1054 		long long           val64;      // delay, tick, path
1055 		short               val16[4];   // button
1056 		int                 val32[2];   // landmark, event, pathdir
1057 	};
1058 };
1059 
1060 /*
1061 struct tableroot
1062 {
1063 	struct listtable     ** table;
1064 	int                     size;
1065 	int                     used;
1066 };
1067 
1068 struct tablenode
1069 {
1070 	struct tableroot      * root;
1071 	char                  * arg1;
1072 	char                  * arg2;
1073 };
1074 */
1075 
1076 struct scriptroot
1077 {
1078 	struct scriptnode    * next;
1079 	struct scriptnode    * prev;
1080 	struct session       * ses;
1081 	struct listroot      * local;
1082 	int                    list;
1083 };
1084 
1085 struct process_data
1086 {
1087 	pid_t                   pid;
1088 	uid_t                   uid;
1089 	gid_t                   gid;
1090 };
1091 
1092 struct tintin_data
1093 {
1094 	struct session        * ses;
1095 	struct session        * update;
1096 	struct session        * dispose_next;
1097 	struct session        * dispose_prev;
1098 	struct listroot       * dispose_list;
1099 	struct listroot       * banner_list;
1100 	struct chat_data      * chat;
1101 	struct screen_data    * screen;
1102 	struct level_data     * level;
1103 	struct memory_data    * memory;
1104 	struct system_data    * system;
1105 	struct termios          old_terminal;
1106 	char                  * detach_file;
1107 	int                     detach_port;
1108 	struct process_data     detach_info;
1109 	int                     detach_sock;
1110 	char                 *  attach_file;
1111 	int                     attach_pid;
1112 	int                     attach_sock;
1113 	int                     daemon;
1114 	char                  * buf;
1115 	char                  * out;
1116 	char                  * mud_output_buf;
1117 	int                     mud_output_max;
1118 	int                     mud_output_len;
1119 	unsigned char         * mccp_buf;
1120 	int                     mccp_len;
1121 	char                    macro_buf[BUFFER_SIZE];
1122 	char                    is_result[NUMBER_SIZE];
1123 	time_t                  time;
1124 	time_t                  time_daemon;
1125 	time_t                  time_input;
1126 	time_t                  time_session;
1127 	unsigned long long      utime;
1128 	unsigned long long      utime_next_delay;
1129 	unsigned long long      utime_next_tick;
1130 	long long               total_io_exec;
1131 	long long               total_io_delay;
1132 	long long               convert_time;
1133 	int                     history_size;
1134 	unsigned short          command_ref[32];
1135 	int                     msdp_table_size;
1136 	int                     flags;
1137 	int                     event_flags;
1138 	struct scriptroot     * script_stack[STACK_SIZE];
1139 	int                     script_index;
1140 	char                    tintin_char;
1141 	char                    verbatim_char;
1142 	char                    repeat_char;
1143 	char                  * vars[100];
1144 	char                  * cmds[100];
1145 	int                     args[100];
1146 	char                    color_reset[COLOR_SIZE];
1147 };
1148 
1149 struct session
1150 {
1151 	struct session        * next;
1152 	struct session        * prev;
1153 	struct map_data       * map;
1154 	struct port_data      * port;
1155 	z_stream              * mccp2;
1156 	z_stream              * mccp3;
1157 	gnutls_session_t        ssl;
1158 	struct termios          cur_terminal;
1159 	struct log_data       * log;
1160 	struct scroll_data    * scroll;
1161 	struct split_data     * split;
1162 	struct input_data     * input;
1163 	char                  * name;
1164 	char                  * group;
1165 	char                  * line_capturefile;
1166 	int                     line_captureindex;
1167 	int                     gagline;
1168 	struct listroot       * list[LIST_MAX];
1169 	time_t                  created;
1170 	int                     cur_row;
1171 	int                     sav_row;
1172 	int                     cur_col;
1173 	int                     sav_col;
1174 	int                     wrap;
1175 	int                     fgc;
1176 	int                     bgc;
1177 	int                     vtc;
1178 	int                     socket;
1179 	int                     telopts;
1180 	int                     telopt_flag[8];
1181 	int                     event_flags;
1182         int                     config_flags;
1183 	int                     flags;
1184 	int                     charset;
1185 	char                  * session_host;
1186 	char                  * session_ip;
1187 	char                  * session_port;
1188 	char                  * cmd_color;
1189 	unsigned char         * read_buf;
1190 	int                     read_len;
1191 	int                     read_max;
1192 	unsigned long long      connect_retry;
1193 	int                     connect_error;
1194 //	char                    more_output[BUFFER_SIZE];
1195 	char                  * more_output;
1196 	int                     color;
1197 	char                    color_patch[100];
1198 	unsigned long long      packet_patch;
1199 	unsigned long long      check_output;
1200 	int                     scrollback_tab;
1201 	int                     tab_width;
1202 	unsigned long long      rand;
1203 	unsigned short          rkey;
1204 	struct port_data      * proxy;
1205 };
1206 
1207 struct edit_data
1208 {
1209 	struct row_data      ** line;
1210 	int                     used;
1211 	int                     size;
1212 	int                     update;
1213 };
1214 
1215 struct system_data
1216 {
1217 	char                  * tt_dir;
1218 	char                  * home;
1219 	char                  * lang;
1220 	char                  * os;
1221 	char                  * term;
1222 	char                  * exec;
1223 };
1224 
1225 struct input_data
1226 {
1227 	struct edit_data      * line;
1228 	struct edit_data      * edit;
1229 	char                  * line_name;
1230 	char                  * edit_name;
1231 
1232 	int                     flags;
1233 
1234 	int                     sav_top_row;
1235 	int                     sav_top_col;
1236 	int                     sav_bot_row;
1237 	int                     sav_bot_col;
1238 
1239 	int                     top_row;
1240 	int                     top_col;
1241 	int                     bot_row;
1242 	int                     bot_col;
1243 
1244 	int                     cur_row;
1245 
1246 	int                     str_len;
1247 	int                     raw_len;
1248 	int                     str_pos;
1249 	int                     raw_pos;
1250 
1251 	int                     str_hid;
1252 	int                     raw_hid;
1253 
1254 	int                     str_off;
1255 
1256 	char                   *buf;
1257 	char                   *tmp;
1258 	char                   *cut;
1259 };
1260 
1261 struct level_data
1262 {
1263 	unsigned int            background;
1264 	unsigned int            convert;
1265 	unsigned int            debug;
1266 	unsigned int            grep;
1267 	unsigned int            ignore;
1268 	unsigned int            info;
1269 	unsigned int            input;
1270 	unsigned int            local;
1271 	unsigned int            mshot;
1272 	unsigned int            quiet;
1273 	unsigned int            repeat;
1274 	unsigned int            scan;
1275 	unsigned int            scroll;
1276 	unsigned int            shots;
1277 	unsigned int            verbatim;
1278 	unsigned int            verbose;
1279 };
1280 
1281 struct log_data
1282 {
1283 	FILE                  * file;
1284 	char                  * name;
1285 	int                     mode;
1286 	FILE                  * next_file;
1287 	char                  * next_name;
1288 	time_t                  next_time;
1289 	FILE                  * line_file;
1290 	char                  * line_name;
1291 	time_t                  line_time;
1292 	char                    stamp_text[100];
1293 	char                  * stamp_strf;
1294 	time_t                  stamp_time;
1295 };
1296 
1297 struct split_data
1298 {
1299 	int                     sav_top_row;
1300 	int                     sav_top_col;
1301 	int                     sav_bot_row;
1302 	int                     sav_bot_col;
1303 	int                     top_row;
1304 	int                     top_col;
1305 	int                     bot_row;
1306 	int                     bot_col;
1307 };
1308 
1309 struct scroll_data
1310 {
1311 	struct buffer_data   ** buffer;
1312 	int                     base;
1313 	int                     line;
1314 	int                     used;
1315 	int                     size;
1316 	int                     wrap;
1317 	time_t                  time;
1318 	char                  * input;
1319 	int                     flags;
1320 	int                     width;
1321 };
1322 
1323 struct buffer_data
1324 {
1325 	int                     width;
1326 	int                     height;
1327 	unsigned short          lines;
1328 	unsigned short          flags;
1329 	time_t                  time;
1330 	char                  * str;
1331 };
1332 
1333 struct chat_data
1334 {
1335 	struct chat_data      * next;
1336 	struct chat_data      * prev;
1337 	struct chat_data      * update;
1338 	char                  * name;
1339 	char                  * ip;
1340 	char                  * version;
1341 	char                  * download;
1342 	char                  * reply;
1343 	char                  * prefix;
1344 	char                  * paste_buf;
1345 	char                  * color;
1346 	char                  * group;
1347 	int                     port;
1348 	int                     fd;
1349 	time_t                  timeout;
1350 	int                     flags;
1351 	unsigned long long      paste_time;
1352 	FILE                  * file_pt;
1353 	char                  * file_name;
1354 	long long               file_size;
1355 	int                     file_block_cnt;
1356 	int                     file_block_tot;
1357 	int                     file_block_patch;
1358 	unsigned long long      file_start_time;
1359 };
1360 
1361 struct port_data
1362 {
1363 	struct port_data      * next;
1364 	struct port_data      * prev;
1365 	struct port_data      * update;
1366 	char                  * name;
1367 	char                  * ip;
1368 	char                  * prefix;
1369 	char                  * color;
1370 	char                  * group;
1371 	int                     port;
1372 	int                     fd;
1373 	int                     flags;
1374 	int                     comm_flags;
1375 	int                     mtts_flags;
1376 	struct msdp_data     ** msdp_data;
1377 	char                  * proxy;
1378 	char                  * ttype;
1379 	char                    telbuf[BUFFER_SIZE];
1380 	int                     teltop;
1381 	char                    inbuf[BUFFER_SIZE];
1382 	int                     intop;
1383 	int                     cols;
1384 	int                     rows;
1385 	int                     total;
1386 	int                     rank;
1387 	z_stream              * mccp2;
1388 	z_stream              * mccp3;
1389 	struct session        * ses;
1390 };
1391 
1392 struct link_data
1393 {
1394 	struct link_data     * next;
1395 	struct link_data     * prev;
1396 	char                 * str1;
1397 	char                 * str2;
1398 	char                 * str3;
1399 };
1400 
1401 struct map_data
1402 {
1403 	struct room_data     ** room_list;
1404 	struct room_data     ** grid_rooms;
1405 	int                   * grid_vnums;
1406 	FILE                  * logfile;
1407 	struct link_data      * undo_head;
1408 	struct link_data      * undo_tail;
1409 	struct search_data    * search;
1410 	char                  * buf;
1411 	char                  * out;
1412 	char                    color[MAP_COLOR_MAX][COLOR_SIZE];
1413 	char                    color_raw[MAP_COLOR_MAX][COLOR_SIZE];
1414 	int                     center_x;
1415 	int                     center_y;
1416 	int                     center_z;
1417 	int                     max_grid_x;
1418 	int                     max_grid_y;
1419 	int                     sav_top_row;
1420 	int                     sav_top_col;
1421 	int                     sav_bot_row;
1422 	int                     sav_bot_col;
1423 	int                     top_row;
1424 	int                     top_col;
1425 	int                     bot_row;
1426 	int                     bot_col;
1427 	int                     rows;
1428 	int                     cols;
1429 	int                     undo_size;
1430 	int                     dir;
1431 	int                     size;
1432 	int                     flags;
1433 	int                     in_room;
1434 	int                     at_room;
1435 	int                     last_room;
1436 	int                     global_vnum;
1437 	struct exit_data      * global_exit;
1438 	int                     version;
1439 	short                   display_stamp;
1440 	int                     nofollow;
1441 	char                    legend[LEGEND_MAX][LEGEND_SIZE];
1442 	char                    legend_raw[LEGEND_MAX][LEGEND_SIZE];
1443 };
1444 
1445 struct room_data
1446 {
1447 	struct exit_data        * f_exit;
1448 	struct exit_data        * l_exit;
1449 	struct exit_data        * exit_grid[11];
1450 	int                       vnum;
1451 	long long                 exit_dirs;
1452 	float                     length;
1453 	float                     weight;
1454 	unsigned short            exit_size;
1455 	unsigned short            search_stamp;
1456 	unsigned short            display_stamp;
1457 	int                       flags;
1458 	int                       w;
1459 	int                       x;
1460 	int                       y;
1461 	int                       z;
1462 	int                       terrain_index;
1463 	short                     terrain_flags;
1464 	char                    * area;
1465 	char                    * color;
1466 	char                    * data;
1467 	char                    * desc;
1468 	char                    * id;
1469 	char                    * name;
1470 	char                    * note;
1471 	char                    * symbol;
1472 	char                    * terrain;
1473 };
1474 
1475 struct exit_data
1476 {
1477 	struct exit_data        * next;
1478 	struct exit_data        * prev;
1479 	int                       vnum;
1480 	int                       dir;
1481 	int                       grid;
1482 	int                       flags;
1483 	float                     weight;
1484 	float                     delay;
1485 	char                    * name;
1486 	char                    * cmd;
1487 	char                    * color;
1488 	char                    * data;
1489 };
1490 
1491 struct search_data
1492 {
1493 	int                     vnum;
1494 	int                     min;
1495 	int                     max;
1496 	unsigned short          stamp;
1497 	char                  * arg;
1498 	pcre                  * name;
1499 	int                     exit_size;
1500 	long long               exit_dirs;
1501 	char                  * exit_list;
1502 	pcre                  * desc;
1503 	pcre                  * area;
1504 	pcre                  * note;
1505 	pcre                  * terrain;
1506 	long long               flag;
1507 	long long               galf;
1508 	char                  * id;
1509 	float                   distance;
1510 };
1511 
1512 struct msdp_data
1513 {
1514 	char                 * value;
1515 	int                    flags;
1516 };
1517 
1518 struct memory_data
1519 {
1520 	struct stack_data      ** debug;
1521 	int                       debug_len;
1522 	int                       debug_max;
1523 
1524 	struct str_data        ** stack;
1525 	int                       stack_len;
1526 	int                       stack_cap;
1527 	int                       stack_max;
1528 
1529 	struct str_data        ** list;
1530 	int                       list_len;
1531 	int                       list_max;
1532 
1533 	int                     * free;
1534 	int                       free_len;
1535 	int                       free_max;
1536 };
1537 
1538 struct row_data
1539 {
1540 	char                  * str;
1541 };
1542 
1543 struct screen_data
1544 {
1545 	struct row_data      ** line;
1546 	struct row_data      ** grid;
1547 	int                     flags;
1548 	int                     rows;
1549 	int                     cols;
1550 	int                     height;
1551 	int                     width;
1552 	int                     tot_height;
1553 	int                     tot_width;
1554 	int                     pos_height;
1555 	int                     pos_width;
1556 	int                     minimized;
1557 	int                     focus;
1558 	int                     char_height;
1559 	int                     char_width;
1560 	int                     desk_rows;
1561 	int                     desk_cols;
1562 	int                     desk_height;
1563 	int                     desk_width;
1564 	int                     top_row;
1565 	int                     bot_row;
1566 	int                     cur_row;
1567 	int                     cur_col;
1568 	int                     max_row;
1569 	int                     sav_lev;
1570 	int                     sav_row[STACK_SIZE];
1571 	int                     sav_col[STACK_SIZE];
1572 };
1573 
1574 struct stack_data
1575 {
1576 	char                    * name;
1577 	int                       index;
1578 };
1579 
1580 struct str_data
1581 {
1582 	int                       index;
1583 	int                       max;
1584 	int                       len;
1585 	short                     flags;
1586 	short                     blank;
1587 };
1588 
1589 
1590 // unused
1591 
1592 struct window_data
1593 {
1594 	char                    *name;
1595 
1596 	int                     top_row;
1597 	int                     top_col;
1598 	int                     bot_row;
1599 	int                     bot_col;
1600 
1601 	int                     off_row;
1602 	int                     off_col;
1603 
1604 	int                     max_row;
1605 	int                     max_col;
1606 
1607 	int                     pos_row;
1608 	int                     pos_col;
1609 
1610 	struct input_data      **buffer;
1611 };
1612 
1613 #define DO_BUFFER(buffer)               void buffer (struct session *ses, char *arg, char *arg1, char *arg2)
1614 #define DO_CHAT(chat)                     void chat (char *arg1, char *arg2)
1615 #define DO_COMMAND(command) struct session *command (struct session *ses, char *arg, char *arg1, char *arg2, char *arg3, char *arg4)
1616 #define DO_CONFIG(config)    struct session *config (struct session *ses, char *arg1, char *arg2, int index)
1617 #define DO_CURSOR(cursor)               void cursor (struct session *ses, char *arg)
1618 #define DO_DAEMON(daemon)               void daemon (struct session *ses, char *arg, char *arg1, char *arg2)
1619 #define DO_EDIT(edit)          struct session *edit (struct session *ses, char *arg, char *arg1, char *arg2)
1620 #define DO_HISTORY(history)            void history (struct session *ses, char *arg, char *arg1, char *arg2)
1621 #define DO_LINE(line)          struct session *line (struct session *ses, char *arg, char *arg1, char *arg2, char *arg3)
1622 #define DO_MAP(map)                        void map (struct session *ses, char *arg, char *arg1, char *arg2)
1623 #define DO_PATH(path)                     void path (struct session *ses, char *arg)
1624 #define DO_PORT(port)          struct session *port (struct session *ses, char *arg, char *arg1, char *arg2)
1625 
1626 
1627 /*
1628 	Typedefs
1629 */
1630 
1631 typedef int             CMPFUNC (const void *a, const void *b);
1632 
1633 typedef void            BUFFER  (struct session *ses, char *arg, char *arg1, char *arg2);
1634 typedef void            CHAT    (char *arg1, char *arg2);
1635 typedef struct session *CONFIG  (struct session *ses, char *arg1, char *arg2, int index);
1636 typedef struct session *COMMAND (struct session *ses, char *arg, char *arg1, char *arg2, char *arg3, char *arg4);
1637 typedef void            CURSOR  (struct session *ses, char *arg);
1638 typedef void            DAEMON  (struct session *ses, char *arg, char *arg1, char *arg2);
1639 typedef struct session *EDIT    (struct session *ses, char *arg, char *arg1, char *arg2);
1640 typedef void            HISTORY (struct session *ses, char *arg, char *arg1, char *arg2);
1641 typedef struct session *LINE    (struct session *ses, char *arg, char *arg1, char *arg2, char *arg3);
1642 typedef void            MAP     (struct session *ses, char *arg, char *arg1, char *arg2);
1643 typedef void            MSDP    (struct session *ses, struct port_data *buddy, int index);
1644 typedef void            PATH    (struct session *ses, char *arg);
1645 typedef struct session *PORT    (struct session *ses, char *arg, char *arg1, char *arg2);
1646 
1647 
1648 /*
1649 	Structures for tables.c
1650 */
1651 
1652 struct buffer_type
1653 {
1654 	char                  * name;
1655 	BUFFER                * fun;
1656 	char                  * desc;
1657 };
1658 
1659 struct charset_type
1660 {
1661 	char                  * name;
1662 	char                  * html;
1663 	int                     flags;
1664 };
1665 
1666 struct chat_type
1667 {
1668 	char                  * name;
1669 	CHAT                  * fun;
1670 	int                     lval;
1671 	int                     rval;
1672 	char                  * desc;
1673 };
1674 
1675 struct color_type
1676 {
1677 	char                  * name;
1678 	char                  * code;
1679 	int                     len;
1680 };
1681 
1682 struct command_type
1683 {
1684 	char                  * name;
1685 	COMMAND               * command;
1686 	int                     args;
1687 	int                     type;
1688 };
1689 
1690 struct config_type
1691 {
1692 	char                  * name;
1693 	char                  * msg_on;
1694 	char                  * msg_off;
1695 	CONFIG                * config;
1696 };
1697 
1698 struct cursor_type
1699 {
1700 	char                  * name;
1701 	char                  * desc;
1702 	char                  * code;
1703 	int                     flags;
1704 	CURSOR                * fun;
1705 	char                  * arg;
1706 };
1707 
1708 struct daemon_type
1709 {
1710 	char                  * name;
1711 	DAEMON                * fun;
1712 	char                  * desc;
1713 };
1714 
1715 struct edit_type
1716 {
1717 	char                  * name;
1718 	EDIT                  * fun;
1719 	char                  * desc;
1720 };
1721 
1722 struct event_type
1723 {
1724 	char                  * name;
1725 	int                     level;
1726 	int                     flags;
1727 	char                  * group;
1728 	char                  * desc;
1729 };
1730 
1731 struct history_type
1732 {
1733 	char                  * name;
1734 	HISTORY               * fun;
1735 	char                  * desc;
1736 };
1737 
1738 struct list_type
1739 {
1740 	char                  * name;
1741 	char                  * name_multi;
1742 	int                     mode;
1743 	int                     args;
1744 	int                     script_arg;
1745 	int                     priority_arg;
1746 	int                     flags;
1747 };
1748 
1749 
1750 struct line_type
1751 {
1752 	char                  * name;
1753 	LINE                  * fun;
1754 	char                  * desc;
1755 };
1756 
1757 struct map_type
1758 {
1759 	char                  * name;
1760 	MAP                   * fun;
1761 	int                     flags;
1762 	int                     check;
1763 	char                  * desc;
1764 };
1765 
1766 struct map_legend_type
1767 {
1768 	char                  * name;
1769 	char                  * group;
1770 	char                  * min;
1771 	char                  * max;
1772 };
1773 
1774 struct map_legend_group_type
1775 {
1776 	char                  * name;
1777 	char                  * group;
1778 	int                     min_row;
1779 	int                     min_col;
1780 	int                     max_row;
1781 	int                     max_col;
1782 	int                     start;
1783 	int                     end;
1784 	char                  * reset;
1785 };
1786 
1787 struct msdp_type
1788 {
1789 	char                 * name;
1790 	int                    flags;
1791 	int                    rank;
1792 	MSDP                 * fun;
1793 };
1794 
1795 struct path_type
1796 {
1797 	char                  * name;
1798 	PATH                  * fun;
1799 	char                  * desc;
1800 };
1801 
1802 struct port_type
1803 {
1804 	char                  * name;
1805 	PORT                  * fun;
1806 	int                     lval;
1807 	int                     rval;
1808 	char                  * desc;
1809 };
1810 
1811 struct pulse_type
1812 {
1813 	unsigned char           update_input;
1814 	unsigned char           update_sessions;
1815 	unsigned char           update_delays;
1816 	unsigned char           update_daemon;
1817 	unsigned char           update_chat;
1818 	unsigned char           update_port;
1819 	unsigned char           update_ticks;
1820 	unsigned char           update_paths;
1821 	unsigned char           update_packets;
1822 	unsigned char           update_terminal;
1823 	unsigned char           update_memory;
1824 	unsigned char           update_time;
1825 };
1826 
1827 
1828 struct rank_type
1829 {
1830 	char                  * name;
1831 	int                     flags;
1832 };
1833 
1834 struct stamp_type
1835 {
1836 	char                  * name;
1837 	int                     length;
1838 	char                  * desc;
1839 };
1840 
1841 struct substitution_type
1842 {
1843 	char                  * name;
1844 	int                     bitvector;
1845 };
1846 
1847 struct timer_type
1848 {
1849 	char                  * name;
1850 };
1851 
1852 struct telopt_type
1853 {
1854 	char                  * name;
1855 	int                     want;
1856 	int                     flags;
1857 };
1858 
1859 #endif
1860 
1861 
1862 /*
1863 	Function declarations
1864 */
1865 
1866 
1867 #ifndef __BANNER_H__
1868 #define __BANNER_H__
1869 
1870 extern DO_COMMAND(do_banner);
1871 
1872 #endif
1873 
1874 
1875 #ifndef __BASE_H__
1876 #define __BASE_H__
1877 
1878 extern int str_to_base64(char *in, char *out, size_t size);
1879 extern int base64_to_str(char *in, char *out, size_t size);
1880 
1881 extern void str_to_base64z(char *in, char *out, size_t size);
1882 extern void base64z_to_str(char *in, char *out, size_t size);
1883 
1884 extern int str_to_base252(char *in, char *out, size_t size);
1885 extern int base252_to_str(char *in, char *out, size_t size);
1886 
1887 extern void str_to_base252z(char *in, char *out, size_t size);
1888 extern void base252z_to_str(char *in, char *out, size_t size);
1889 
1890 #endif
1891 
1892 #ifndef __BUFFER_H__
1893 #define __BUFFER_H__
1894 
1895 extern DO_COMMAND(do_buffer);
1896 extern DO_COMMAND(do_grep);
1897 
1898 extern void init_buffer(struct session *ses, int size);
1899 extern void add_line_buffer(struct session *ses, char *line, int more_output);
1900 extern int show_buffer(struct session *ses);
1901 
1902 extern DO_BUFFER(buffer_up);
1903 extern DO_BUFFER(buffer_clear);
1904 extern DO_BUFFER(buffer_down);
1905 extern DO_BUFFER(buffer_get);
1906 extern DO_BUFFER(buffer_home);
1907 extern DO_BUFFER(buffer_end);
1908 extern DO_BUFFER(buffer_find);
1909 extern DO_BUFFER(buffer_jump);
1910 extern DO_BUFFER(buffer_lock);
1911 extern DO_BUFFER(buffer_refresh);
1912 extern DO_BUFFER(buffer_write);
1913 extern DO_BUFFER(buffer_info);
1914 
1915 #endif
1916 
1917 
1918 #ifndef __CHAT_H__
1919 #define __CHAT_H__
1920 
1921 extern DO_COMMAND(do_chat);
1922 
1923 extern void process_chat_connections(fd_set *read_set, fd_set *write_set, fd_set *exc_set);
1924 extern void chat_socket_printf(struct chat_data *buddy, char *format, ...);
1925 extern void close_chat(struct chat_data *buddy, int unlink);
1926 extern void chat_forward_session(struct session *ses, char *linelog);
1927 
1928 extern DO_CHAT(chat_accept);
1929 extern DO_CHAT(chat_call);
1930 extern DO_CHAT(chat_cancelfile);
1931 extern DO_CHAT(chat_color);
1932 extern DO_CHAT(chat_decline);
1933 extern DO_CHAT(chat_dnd);
1934 extern DO_CHAT(chat_downloaddir);
1935 extern DO_CHAT(chat_emote);
1936 extern DO_CHAT(chat_filestat);
1937 extern DO_CHAT(chat_group);
1938 extern DO_CHAT(chat_forward);
1939 extern DO_CHAT(chat_forwardall);
1940 extern DO_CHAT(chat_ignore);
1941 extern DO_CHAT(chat_initialize);
1942 extern DO_CHAT(chat_info);
1943 extern DO_CHAT(chat_ip);
1944 extern DO_CHAT(chat_message);
1945 extern DO_CHAT(chat_name);
1946 extern DO_CHAT(chat_paste);
1947 extern DO_CHAT(chat_peek);
1948 extern DO_CHAT(chat_ping);
1949 extern DO_CHAT(chat_prefix);
1950 extern DO_CHAT(chat_private);
1951 extern DO_CHAT(chat_public);
1952 extern DO_CHAT(chat_reply);
1953 extern DO_CHAT(chat_request);
1954 extern DO_CHAT(chat_send);
1955 extern DO_CHAT(chat_sendfile);
1956 extern DO_CHAT(chat_transfer);
1957 extern DO_CHAT(chat_serve);
1958 extern DO_CHAT(chat_uninitialize);
1959 extern DO_CHAT(chat_who);
1960 extern DO_CHAT(chat_zap);
1961 
1962 #endif
1963 
1964 #ifndef __COMMAND_H__
1965 #define __COMMAND_H__
1966 
1967 extern void init_commands(void);
1968 
1969 #endif
1970 
1971 #ifndef __CURSOR_H__
1972 #define __CURSOR_H__
1973 
1974 extern DO_COMMAND(do_cursor);
1975 
1976 int inputline_cur_row(void);
1977 int inputline_cur_col(void);
1978 int inputline_cur_off(void);
1979 int inputline_cur_str_len(void);
1980 int inputline_max_str_len(void);
1981 int inputline_max_row(void);
1982 int inputline_editor(void);
1983 int inputline_rows(struct session *ses);
1984 
1985 void inputline_insert(char *arg, int str_pos);
1986 void inputline_set(char *arg, int str_pos);
1987 
1988 extern DO_CURSOR(cursor_backspace);
1989 extern DO_CURSOR(cursor_brace);
1990 extern DO_CURSOR(cursor_buffer_down);
1991 extern DO_CURSOR(cursor_buffer_end);
1992 extern DO_CURSOR(cursor_buffer_home);
1993 extern DO_CURSOR(cursor_buffer_lock);
1994 extern DO_CURSOR(cursor_buffer_up);
1995 extern DO_CURSOR(cursor_check_line);
1996 extern DO_CURSOR(cursor_check_line_modified);
1997 extern DO_CURSOR(cursor_clear_left);
1998 extern DO_CURSOR(cursor_clear_line);
1999 extern DO_CURSOR(cursor_clear_right);
2000 extern DO_CURSOR(cursor_convert_meta);
2001 extern DO_CURSOR(cursor_delete);
2002 extern DO_CURSOR(cursor_delete_or_exit);
2003 extern DO_CURSOR(cursor_delete_word_left);
2004 extern DO_CURSOR(cursor_delete_word_right);
2005 extern DO_CURSOR(cursor_echo);
2006 extern DO_CURSOR(cursor_end);
2007 extern DO_CURSOR(cursor_enter);
2008 extern DO_CURSOR(cursor_enter_finish);
2009 extern DO_CURSOR(cursor_flag);
2010 extern DO_CURSOR(cursor_get);
2011 extern DO_CURSOR(cursor_history_find);
2012 extern DO_CURSOR(cursor_history_next);
2013 extern DO_CURSOR(cursor_history_prev);
2014 extern DO_CURSOR(cursor_history_search);
2015 extern DO_CURSOR(cursor_home);
2016 extern DO_CURSOR(cursor_info);
2017 extern DO_CURSOR(cursor_insert);
2018 extern DO_CURSOR(cursor_macro);
2019 extern DO_CURSOR(cursor_move_page_down);
2020 extern DO_CURSOR(cursor_move_down);
2021 extern DO_CURSOR(cursor_move_left);
2022 extern DO_CURSOR(cursor_move_left_word);
2023 extern DO_CURSOR(cursor_move_right);
2024 extern DO_CURSOR(cursor_move_right_word);
2025 extern DO_CURSOR(cursor_move_page_up);
2026 extern DO_CURSOR(cursor_move_up);
2027 extern DO_CURSOR(cursor_page);
2028 extern DO_CURSOR(cursor_paste_buffer);
2029 extern DO_CURSOR(cursor_position);
2030 extern DO_CURSOR(cursor_redraw_input);
2031 extern DO_CURSOR(cursor_redraw_line);
2032 extern DO_CURSOR(cursor_redraw_singleline);
2033 extern DO_CURSOR(cursor_redraw_multiline);
2034 extern DO_CURSOR(cursor_redraw_edit);
2035 extern DO_CURSOR(cursor_set);
2036 extern DO_CURSOR(cursor_soft_enter);
2037 extern DO_CURSOR(cursor_suspend);
2038 extern DO_CURSOR(cursor_tab);
2039 
2040 #endif
2041 
2042 
2043 #ifndef __INPUT_H__
2044 #define __INPUT_H__
2045 
2046 extern void  process_input(void);
2047 extern void  read_line(char *input, int len);
2048 extern void  read_key(char *input, int len);
2049 extern int   check_key(char *input, int len);
2050 extern void  convert_meta(char *input, char *output, int eol);
2051 extern char *str_convert_meta(char *input, int eol);
2052 extern void  echo_command(struct session *ses, char *line);
2053 extern void init_input(struct session *ses, int top_row, int top_col, int bot_row, int bot_col);
2054 extern void free_input(struct session *ses);
2055 extern void  input_printf(char *format, ...);
2056 extern void  modified_input(void);
2057 
2058 #endif
2059 
2060 
2061 #ifndef __MAPPER_H__
2062 #define __MAPPER_H__
2063 
2064 extern DO_COMMAND(do_map);
2065 
2066 extern void delete_room_data(struct room_data *room);
2067 extern  int follow_map(struct session *ses, char *argument);
2068 extern void show_vtmap(struct session *ses);
2069 extern void map_mouse_handler(struct session *ses, char *left, char *right, int row, int col, int rev_row, int rev_col, int height, int width);
2070 extern  int delete_map(struct session *ses);
2071 
2072 extern DO_MAP(map_at);
2073 extern DO_MAP(map_center);
2074 extern DO_MAP(map_color);
2075 extern DO_MAP(map_create);
2076 extern DO_MAP(map_debug);
2077 extern DO_MAP(map_delete);
2078 extern DO_MAP(map_destroy);
2079 extern DO_MAP(map_dig);
2080 extern DO_MAP(map_entrance);
2081 extern DO_MAP(map_exit);
2082 extern DO_MAP(map_exitflag);
2083 extern DO_MAP(map_explore);
2084 extern DO_MAP(map_find);
2085 extern DO_MAP(map_flag);
2086 extern DO_MAP(map_get);
2087 extern DO_MAP(map_global);
2088 extern DO_MAP(map_goto);
2089 extern DO_MAP(map_info);
2090 extern DO_MAP(map_insert);
2091 extern DO_MAP(map_jump);
2092 extern DO_MAP(map_landmark);
2093 extern DO_MAP(map_leave);
2094 extern DO_MAP(map_legend);
2095 extern DO_MAP(map_link);
2096 extern DO_MAP(map_list);
2097 extern DO_MAP(map_map);
2098 extern DO_MAP(map_move);
2099 extern DO_MAP(map_name);
2100 extern DO_MAP(map_offset);
2101 extern DO_MAP(map_read);
2102 extern DO_MAP(map_resize);
2103 extern DO_MAP(map_return);
2104 extern DO_MAP(map_roomflag);
2105 extern DO_MAP(map_run);
2106 extern DO_MAP(map_set);
2107 extern DO_MAP(map_sync);
2108 extern DO_MAP(map_terrain);
2109 extern DO_MAP(map_travel);
2110 extern DO_MAP(map_undo);
2111 extern DO_MAP(map_uninsert);
2112 extern DO_MAP(map_unlandmark);
2113 extern DO_MAP(map_unlink);
2114 extern DO_MAP(map_unterrain);
2115 extern DO_MAP(map_update);
2116 extern DO_MAP(map_vnum);
2117 extern DO_MAP(map_write);
2118 
2119 #endif
2120 
2121 
2122 #ifndef __TT_MATH_H__
2123 #define __TT_MATH_H__
2124 
2125 extern long double mathexp(struct session *ses, char *str, char *result, int seed);
2126 extern int is_math(struct session *ses, char *str);
2127 extern int get_ellipsis(struct session *ses, unsigned int size, char *name, int *min, int *max);
2128 extern long double get_number(struct session *ses, char *str);
2129 extern unsigned long long get_ulong(struct session *ses, char *str);
2130 extern long double get_double(struct session *ses, char *str);
2131 extern void get_number_string(struct session *ses, char *str, char *result);
2132 extern long double mathswitch(struct session *ses, char *left, char *right);
2133 extern long double tintoi(char *str);
2134 extern unsigned long long tintou(char *str);
2135 
2136 
2137 #endif
2138 
2139 
2140 #ifndef __CONFIG_H__
2141 #define __CONFIG_H__
2142 
2143 extern DO_COMMAND(do_configure);
2144 
2145 extern DO_CONFIG(config_autotab);
2146 extern DO_CONFIG(config_buffersize);
2147 extern DO_CONFIG(config_charset);
2148 extern DO_CONFIG(config_colormode);
2149 extern DO_CONFIG(config_colorpatch);
2150 extern DO_CONFIG(config_commandcolor);
2151 extern DO_CONFIG(config_commandecho);
2152 extern DO_CONFIG(config_connectretry);
2153 extern DO_CONFIG(config_childlock);
2154 extern DO_CONFIG(config_convertmeta);
2155 extern DO_CONFIG(config_debugtelnet);
2156 extern DO_CONFIG(config_historysize);
2157 extern DO_CONFIG(config_inheritance);
2158 extern DO_CONFIG(config_loglevel);
2159 extern DO_CONFIG(config_logmode);
2160 extern DO_CONFIG(config_mccp);
2161 extern DO_CONFIG(config_mousetracking);
2162 extern DO_CONFIG(config_packetpatch);
2163 extern DO_CONFIG(config_randomseed);
2164 extern DO_CONFIG(config_repeatchar);
2165 extern DO_CONFIG(config_repeatenter);
2166 extern DO_CONFIG(config_screenreader);
2167 extern DO_CONFIG(config_scrolllock);
2168 extern DO_CONFIG(config_speedwalk);
2169 extern DO_CONFIG(config_tabwidth);
2170 extern DO_CONFIG(config_telnet);
2171 extern DO_CONFIG(config_tintinchar);
2172 extern DO_CONFIG(config_verbatim);
2173 extern DO_CONFIG(config_verbatimchar);
2174 extern DO_CONFIG(config_verbose);
2175 extern DO_CONFIG(config_wordwrap);
2176 
2177 #endif
2178 
2179 
2180 
2181 #ifndef __DAEMON_H__
2182 #define __DAEMON_H__
2183 
2184 extern DO_COMMAND(do_daemon);
2185 
2186 extern DO_DAEMON(daemon_attach);
2187 extern DO_DAEMON(daemon_detach);
2188 extern DO_DAEMON(daemon_input);
2189 extern DO_DAEMON(daemon_kill);
2190 extern DO_DAEMON(daemon_list);
2191 
2192 extern void reset_daemon(void);
2193 extern void winch_daemon(void);
2194 
2195 #endif
2196 
2197 #ifndef __DATA_H__
2198 #define __DATA_H__
2199 
2200 extern DO_COMMAND(do_kill);
2201 
2202 extern void kill_list(struct listroot *root);
2203 extern void free_list(struct listroot *root);
2204 extern  int show_node_with_wild(struct session *ses, char *cptr, struct listroot *root);
2205 extern void show_node(struct listroot *root, struct listnode *node, int level);
2206 extern void show_nest(struct listnode *node, char *result);
2207 extern void show_list(struct listroot *root, int level);
2208 extern void remove_node_list(struct session *ses, int type, struct listnode *node);
2209 extern void remove_index_list(struct listroot *root, int index);
2210 extern void dispose_node(struct listnode *node);
2211 extern void delete_node_list(struct session *ses, int type, struct listnode *node);
2212 extern  int delete_node_with_wild(struct session *ses, int index, char *string);
2213 extern void delete_index_list(struct listroot *root, int index);
2214 extern  int search_index_list(struct listroot *root, char *text, char *priority);
2215 extern  int locate_index_list(struct listroot *root, char *text, char *priority);
2216 extern  int bsearch_alpha_list(struct listroot *root, char *text, int seek);
2217 extern  int bsearch_alnum_list(struct listroot *root, char *text, int seek);
2218 extern  int bsearch_priority_list(struct listroot *root, char *text, char *priority, int seek);
2219 extern  int nsearch_list(struct listroot *root, char *text);
2220 extern struct listroot *init_list(struct session *ses, int type, int size);
2221 extern struct listroot *copy_list(struct session *ses, struct listroot *sourcelist, int type);
2222 extern struct listnode *create_node_list(struct listroot *root, char *arg1, char *arg2, char *arg3, char *arg4);
2223 extern struct listnode *insert_node_list(struct listroot *root, struct listnode *node);
2224 extern struct listnode *insert_index_list(struct listroot *root, struct listnode *node, int index);
2225 extern struct listnode *update_node_list(struct listroot *root, char *arg1, char *arg2, char *arg3, char *arg4);
2226 extern struct listnode *search_node_list(struct listroot *root, char *text);
2227 
2228 
2229 #endif
2230 
2231 
2232 #ifndef __DEBUG_H__
2233 #define __DEBUG_H__
2234 
2235 extern void push_call(char *format, ...);
2236 extern  int push_call_printf(char *format, ...);
2237 extern void pop_call(void);
2238 extern void dump_stack(void);
2239 
2240 #endif
2241 
2242 #ifndef __DICT_H__
2243 #define __DICT_H__
2244 
2245 extern DO_COMMAND(do_dictionary);
2246 
2247 extern int spellcheck_count(struct session *ses, char *in);
2248 extern int cursor_dictionary_tab_add(int stop_after_first);
2249 
2250 #endif
2251 
2252 #ifndef __EDIT_H__
2253 #define __EDIT_H__
2254 
2255 DO_COMMAND(do_edit);
2256 
2257 DO_EDIT(edit_create);
2258 DO_EDIT(edit_load);
2259 DO_EDIT(edit_read);
2260 DO_EDIT(edit_resume);
2261 DO_EDIT(edit_save);
2262 DO_EDIT(edit_suspend);
2263 DO_EDIT(edit_write);
2264 
2265 extern struct edit_data *create_editor(void);
2266 
2267 extern void enable_editor(struct edit_data *edit);
2268 extern void delete_editor(struct edit_data *edit);
2269 extern void resize_editor(struct edit_data *edit, int size);
2270 extern void clear_editor(struct edit_data *edit);
2271 extern  int str_save_editor(struct edit_data *edit, char **str);
2272 extern  int var_save_editor(struct edit_data *edit, char **str);
2273 extern void create_line(struct edit_data *edit, int index, char *str);
2274 extern void delete_line(struct edit_data *edit, int index);
2275 extern void insert_line(struct edit_data *edit, int index, char *str);
2276 extern void remove_line(struct edit_data *edit, int index);
2277 #endif
2278 
2279 #ifndef __DRAW_H__
2280 #define __DRAW_H__
2281 
2282 extern DO_COMMAND(do_draw);
2283 
2284 #endif
2285 
2286 
2287 #ifndef __EVENT_H__
2288 #define __EVENT_H__
2289 
2290 //extern DO_COMMAND(do_event);
2291 //extern DO_COMMAND(do_unevent);
2292 
2293 extern  int check_all_events(struct session *ses, int flags, int args, int vars, char *fmt, ...);
2294 extern void mouse_handler(struct session *ses, int val1, int val2, int val3);
2295 
2296 #endif
2297 
2298 
2299 #ifndef __FILES_H__
2300 #define __FILES_H__
2301 
2302 extern DO_COMMAND(do_read);
2303 extern DO_COMMAND(do_write);
2304 
2305 extern struct session *read_file(struct session *ses, FILE *fp, char *filename);
2306 extern void write_node(struct session *ses, int mode, struct listnode *node, FILE *file);
2307 extern char *fread_one_line(char **str, FILE *fp);
2308 
2309 #endif
2310 
2311 
2312 #ifndef __HELP_H__
2313 #define __HELP_H__
2314 
2315 extern DO_COMMAND(do_help);
2316 
2317 #endif
2318 
2319 
2320 #ifndef __HISTORY_H__
2321 #define __HISTORY_H__
2322 
2323 extern DO_COMMAND(do_history);
2324 
2325 extern void add_line_history(struct session *ses, char *line);
2326 extern void insert_line_history(struct session *ses, char *line);
2327 extern struct session *repeat_history(struct session *ses, char *line);
2328 extern int write_history(struct session *ses, char *filename);
2329 extern int read_history(struct session *ses, char *filename);
2330 
2331 DO_HISTORY(history_character);
2332 DO_HISTORY(history_delete);
2333 DO_HISTORY(history_get);
2334 DO_HISTORY(history_insert);
2335 DO_HISTORY(history_list);
2336 DO_HISTORY(history_size);
2337 DO_HISTORY(history_read);
2338 DO_HISTORY(history_write);
2339 
2340 #endif
2341 
2342 
2343 #ifndef __LINE_H__
2344 #define __LINE_H__
2345 
2346 extern DO_COMMAND(do_line);
2347 
2348 extern DO_LINE(line_background);
2349 extern DO_LINE(line_benchmark);
2350 extern DO_LINE(line_capture);
2351 extern DO_LINE(line_convert);
2352 extern DO_LINE(line_debug);
2353 extern DO_LINE(line_gag);
2354 extern DO_LINE(line_ignore);
2355 extern DO_LINE(line_local);
2356 extern DO_LINE(line_log);
2357 extern DO_LINE(line_logmode);
2358 extern DO_LINE(line_logverbatim);
2359 extern DO_LINE(line_msdp);
2360 extern DO_LINE(line_multishot);
2361 extern DO_LINE(line_oneshot);
2362 extern DO_LINE(line_quiet);
2363 extern DO_LINE(line_strip);
2364 extern DO_LINE(line_substitute);
2365 extern DO_LINE(line_verbatim);
2366 extern DO_LINE(line_verbose);
2367 
2368 #endif
2369 
2370 
2371 #ifndef __LOG_H__
2372 #define __LOG_H__
2373 
2374 extern void logheader(struct session *ses, FILE *file, int newline);
2375 extern void init_log(struct session *ses);
2376 extern void free_log(struct session *ses);
2377 
2378 extern void logit(struct session *ses, char *txt, FILE *file, int newline);
2379 extern void write_html_header(struct session *ses, FILE *fp);
2380 extern void vt102_to_html(struct session *ses, char *txt, char *out);
2381 
2382 #endif
2383 
2384 
2385 #ifndef __MAIN_H__
2386 #define __MAIN_H__
2387 
2388 extern struct session *gts;
2389 extern struct tintin_data *gtd;
2390 extern void winch_handler(int signal);
2391 extern void abort_handler(int signal);
2392 extern void pipe_handler(int signal);
2393 extern void suspend_handler(int signal);
2394 extern void trap_handler(int signal);
2395 extern  int main(int argc, char **argv);
2396 extern void init_tintin(int greeting);
2397 extern void quitmsg(char *message);
2398 extern void syserr_fatal(int signal, char *msg);
2399 extern void syserr_printf(struct session *ses, char *fmt, ...);
2400 
2401 #endif
2402 
2403 #ifndef __MCCP_H__
2404 #define __MCCP_H__
2405 
2406 void *zlib_alloc(void *opaque, unsigned int items, unsigned int size);
2407 void  zlib_free(void *opaque, void *address);
2408 
2409 #endif
2410 
2411 #ifndef __MEMORY_H__
2412 #define __MEMORY_H__
2413 
2414 extern char *restring(char *point, char *string);
2415 extern char *restringf(char *point, char *fmt, ...);
2416 
2417 extern void init_memory(void);
2418 
2419 extern struct str_data *get_str_ptr(char *str);
2420 extern char *get_str_str(struct str_data *str_ptr);
2421 
2422 extern  int str_len(char *str);
2423 extern  int str_max(char *str);
2424 extern  int str_fix(char *str);
2425 
2426 extern char *str_alloc(int len);
2427 extern void  str_free(char *ptr);
2428 
2429 extern char *str_mim(char *original);
2430 extern char *str_dup(char *original);
2431 extern char *str_dup_clone(char *original);
2432 extern char *str_dup_printf(char *fmt, ...);
2433 extern char *str_ndup(char *original, int len);
2434 
2435 extern char *str_resize(char **ptr, int add);
2436 extern void  str_clone(char **clone, char *original);
2437 extern char *str_cpy(char **ptr, char *str);
2438 extern char *str_cpy_printf(char **ptr, char *fmt, ...);
2439 extern char *str_ncpy(char **ptr, char *str, int len);
2440 extern char *str_cat_len(char **str, char *arg, int len);
2441 extern char *str_cat(char **str, char *arg);
2442 extern char *str_cat_chr(char **ptr, char chr);
2443 extern char *str_cat_printf(char **str, char *fmt, ...);
2444 extern char *str_cap(char **str, int index, char *buf);
2445 extern char *str_ins(char **str, int index, char *buf);
2446 extern char *str_ins_printf(char **str, int index, char *fmt, ...);
2447 extern char *str_mov(char **str, int dst, int src);
2448 
2449 extern char *str_alloc_stack(int size);
2450 
2451 #endif
2452 
2453 
2454 #ifndef __MISC_H__
2455 #define __MISC_H__
2456 
2457 extern DO_COMMAND(do_end);
2458 extern DO_COMMAND(do_nop);
2459 extern DO_COMMAND(do_test);
2460 
2461 #endif
2462 
2463 #ifndef __MSDP_H__
2464 #define __MSDP_H__
2465 
2466 extern void init_msdp_table(void);
2467 extern  int msdp_find(char *var);
2468 extern void arachnos_devel(struct session *ses, char *fmt, ...);
2469 extern void arachnos_mudlist(struct session *ses, char *fmt, ...);
2470 extern void msdp_update_all(char *var, char *fmt, ...);
2471 extern void msdp_update_var(struct session *ses, struct port_data *buddy, char *var, char *str);
2472 extern void msdp_update_varf(struct session *ses, struct port_data *buddy, char *var, char *fmt, ...);
2473 extern void msdp_update_var_instant(struct session *ses, struct port_data *buddy, char *var, char *fmt, ...);
2474 extern void msdp_send_update(struct session *ses, struct port_data *buddy);
2475 extern char *msdp_get_var(struct session *ses, struct port_data *buddy, char *var);
2476 extern void process_msdp_varval(struct session *ses, struct port_data *buddy, char *var, char *val );
2477 extern void msdp_command_list(struct session *ses, struct port_data *buddy, int index);
2478 extern void msdp_command_report(struct session *ses, struct port_data *buddy, int index);
2479 extern void msdp_command_reset(struct session *ses, struct port_data *buddy, int index);
2480 extern void msdp_command_send(struct session *ses, struct port_data *buddy, int index);
2481 extern void msdp_command_unreport(struct session *ses, struct port_data *buddy, int index);
2482 extern void msdp_configure_arachnos(struct session *ses, struct port_data *buddy, int index);
2483 extern void write_msdp_to_descriptor(struct session *ses, struct port_data *buddy, char *src, int length);
2484 extern  int msdp2json(unsigned char *src, int srclen, char *out);
2485 extern  int json2msdp(unsigned char *src, int srclen, char *out);
2486 extern  int tintin2msdp(char *src, char *out);
2487 extern void arachnos_devel(struct session *ses, char *fmt, ...);
2488 extern void arachnos_mudlist(struct session *ses, char *fmt, ...);
2489 extern struct msdp_type msdp_table[];
2490 
2491 #endif
2492 
2493 #ifndef __NEST_H__
2494 #define __NEST_H__
2495 
2496 extern struct listroot *search_nest_base_ses(struct session *ses, char *arg);
2497 extern struct listroot *search_nest_root(struct listroot *root, char *arg);
2498 extern struct listnode *search_base_node(struct listroot *root, char *variable);
2499 extern struct listnode *search_nest_node(struct listroot *root, char *variable);
2500 extern struct listnode *search_nest_node_ses(struct session *ses, char *variable);
2501 extern int search_nest_index(struct listroot *root, char *variable);
2502 extern struct listroot *update_nest_root(struct listroot *root, char *arg);
2503 extern void update_nest_node(struct listroot *root, char *arg);
2504 extern int delete_nest_node(struct listroot *root, char *variable);
2505 extern int get_nest_size_key(struct listroot *root, char *variable, char **result);
2506 extern int get_nest_size_val(struct listroot *root, char *variable, char **result);
2507 extern struct listnode *get_nest_node_key(struct listroot *root, char *variable, char **result, int def);
2508 extern struct listnode *get_nest_node_val(struct listroot *root, char *variable, char **result, int def);
2509 extern int get_nest_index(struct listroot *root, char *variable, char **result, int def);
2510 extern void show_nest_node(struct listnode *node, char **result, int initialize);
2511 extern void view_nest_node(struct listnode *node, char **str_result, int nest, int initialize, int color);
2512 extern struct listnode *set_nest_node_ses(struct session *ses, char *arg1, char *format, ...);
2513 extern struct listnode *add_nest_node_ses(struct session *ses, char *arg1, char *format, ...);
2514 extern struct listnode *set_nest_node(struct listroot *root, char *arg1, char *format, ...);
2515 extern struct listnode *add_nest_node(struct listroot *root, char *arg1, char *format, ...);
2516 extern void copy_nest_node(struct listroot *dst_root, struct listnode *dst, struct listnode *src);
2517 
2518 #endif
2519 
2520 
2521 #ifndef __NET_H__
2522 #define __NET_H__
2523 
2524 extern int connect_mud(struct session *ses, char *host, char *port);
2525 extern void write_line_mud(struct session *ses, char *line, int size);
2526 extern int read_buffer_mud(struct session *ses);
2527 extern void readmud(struct session *ses);
2528 extern void process_mud_output(struct session *ses, char *linebuf, int prompt);
2529 
2530 #endif
2531 
2532 #ifndef __PARSE_H__
2533 #define __PARSE_H__
2534 
2535 extern  int is_abbrev(char *str1, char *str2);
2536 extern  int is_member(char *str1, char *str2);
2537 extern  int is_vowel(char *str);
2538 extern void filename_string(char *input, char *output);
2539 extern struct session *execute(struct session *ses, char *format, ...);
2540 extern struct session *command(struct session *ses, COMMAND *cmd, char *format, ...);
2541 extern struct session *parse_input(struct session *ses, char *input);
2542 extern struct session *parse_command(struct session *ses, char *input);
2543 extern  int is_speedwalk(struct session *ses, char *input);
2544 extern char *substitute_speedwalk(struct session *ses, char *input, char *output);
2545 extern void process_speedwalk(struct session *ses, char *input);
2546 extern struct session *parse_tintin_command(struct session *ses, char *input);
2547 extern int cnt_arg_all(struct session *ses, char *string, int flag);
2548 extern char *get_arg_all(struct session *ses, char *string, char *result, int verbatim);
2549 extern char *sub_arg_all(struct session *ses, char *string, char *result, int verbatim, int sub);
2550 extern char *get_arg_in_braces(struct session *ses, char *string, char *result, int flag);
2551 extern char *sub_arg_in_braces(struct session *ses, char *string, char *result, int flag, int sub);
2552 extern char *get_arg_with_spaces(struct session *ses, char *string, char *result, int flag);
2553 extern char *get_arg_stop_spaces(struct session *ses, char *string, char *result, int flag);
2554 extern char *sub_arg_stop_spaces(struct session *ses, char *string, char *result, int flag, int sub);
2555 
2556 extern char *get_arg_stop_digits(struct session *ses, char *string, char *result, int flag);
2557 extern char *space_out(char *string);
2558 extern char *get_arg_to_brackets(struct session *ses, char *string, char *result);
2559 extern char *get_arg_at_brackets(struct session *ses, char *string, char *result);
2560 extern char *get_arg_in_brackets(struct session *ses, char *string, char *result);
2561 extern char *get_char(struct session *ses, char *string, char *result);
2562 extern void write_mud(struct session *ses, char *command, int flags);
2563 extern void do_one_line(char *line, struct session *ses);
2564 
2565 #endif
2566 
2567 
2568 #ifndef __PATH_H__
2569 #define __PATH_H__
2570 
2571 extern DO_COMMAND(do_pathdir);
2572 
2573 int is_pathdir(struct session *ses, char *dir);
2574 int exit_to_dir(struct session *ses, char *name);
2575 unsigned char pdir(struct listnode *node);
2576 char *dir_to_exit(struct session *ses, int dir);
2577 
2578 extern void check_append_path(struct session *ses, char *forward, char *backward, float delay, int force, int follow);
2579 
2580 extern DO_PATH(path_create);
2581 extern DO_PATH(path_describe);
2582 extern DO_PATH(path_delete);
2583 extern DO_PATH(path_destroy);
2584 extern DO_PATH(path_get);
2585 extern DO_PATH(path_goto);
2586 extern DO_PATH(path_insert);
2587 extern DO_PATH(path_load);
2588 extern DO_PATH(path_map);
2589 extern DO_PATH(path_move);
2590 extern DO_PATH(path_run);
2591 extern DO_PATH(path_save);
2592 extern DO_PATH(path_start);
2593 extern DO_PATH(path_stop);
2594 extern DO_PATH(path_swap);
2595 extern DO_PATH(path_undo);
2596 extern DO_PATH(path_unzip);
2597 extern DO_PATH(path_walk);
2598 extern DO_PATH(path_zip);
2599 
2600 // old
2601 
2602 extern DO_PATH(path_new);
2603 extern DO_PATH(path_end);
2604 
2605 #endif
2606 
2607 
2608 #ifndef __PORT_H__
2609 #define __PORT_H__
2610 
2611 extern DO_PORT(port_call);
2612 extern DO_PORT(port_color);
2613 extern DO_PORT(port_flag);
2614 extern DO_PORT(port_group);
2615 extern DO_PORT(port_ignore);
2616 extern DO_PORT(port_initialize);
2617 extern DO_PORT(port_info);
2618 extern DO_PORT(port_message);
2619 extern DO_PORT(port_name);
2620 extern DO_PORT(port_prefix);
2621 extern DO_PORT(port_proxy);
2622 extern DO_PORT(port_rank);
2623 extern DO_PORT(port_send);
2624 extern DO_PORT(port_uninitialize);
2625 extern DO_PORT(port_who);
2626 extern DO_PORT(port_zap);
2627 
2628 extern  int port_new(struct session *ses, int s);
2629 extern void close_port(struct session *ses, struct port_data *buddy, int unlink);
2630 extern void process_port_connections(struct session *ses, fd_set *read_set, fd_set *write_set, fd_set *exc_set);
2631 extern void port_forward_session(struct session *ses, char *linelog);
2632 extern void port_socket_printf(struct session *ses, struct port_data *buddy, char *format, ...);
2633 extern void port_telnet_printf(struct session *ses, struct port_data *buddy, size_t length, char *format, ...);
2634 extern void port_log_printf(struct session *ses, struct port_data *buddy, char *format, ...);
2635 extern void port_printf(struct session *ses, char *format, ...);
2636 extern  int process_port_input(struct session *ses, struct port_data *buddy);
2637 extern void get_port_commands(struct session *ses, struct port_data *buddy, char *buf, int len);
2638 extern void port_name_change(struct session *ses, struct port_data *buddy, char *txt);
2639 extern void port_receive_message(struct session *ses, struct port_data *buddy, char *txt);
2640 
2641 extern void port_puts(struct session *ses, char *arg);
2642 extern struct port_data *find_port_buddy(struct session *ses, char *arg);
2643 extern struct port_data *find_port_group(struct session *ses, char *arg);
2644 
2645 #endif
2646 
2647 #ifndef __SCREEN_H__
2648 #define __SCREEN_H__
2649 
2650 extern DO_COMMAND(do_screen);
2651 
2652 extern void init_inputregion(struct session *ses, int top_row, int top_col, int bot_row, int bot_col);
2653 extern  int get_row_index(struct session *ses, int val);
2654 extern  int get_col_index(struct session *ses, int val);
2655 extern  int get_row_index_arg(struct session *ses, char *arg);
2656 extern  int get_col_index_arg(struct session *ses, char *arg);
2657 extern void csip_handler(int var1, int var2, int var3);
2658 extern void csit_handler(int var1, int var2, int var3);
2659 extern void rqlp_handler(int event, int button, int row, int col);
2660 extern void osc_handler(char ind, char *arg);
2661 extern void erase_scroll_region(struct session *ses);
2662 extern void erase_input_region(struct session *ses);
2663 extern void erase_split_region(struct session *ses);
2664 extern void erase_bot_region(struct session *ses);
2665 extern void erase_top_region(struct session *ses);
2666 extern void erase_left_region(struct session *ses);
2667 extern void erase_right_region(struct session *ses);
2668 extern void erase_square(struct session *ses, int top_row, int top_col, int bot_row, int bot_col);
2669 extern void fill_top_region(struct session *ses, char *arg);
2670 extern void fill_bot_region(struct session *ses, char *arg);
2671 extern void fill_left_region(struct session *ses, char *arg);
2672 extern void fill_right_region(struct session *ses, char *arg);
2673 extern void fill_split_region(struct session *ses, char *arg);
2674 extern int inside_scroll_region(struct session *ses, int row, int col);
2675 extern void add_row_index(struct row_data **row, int index);
2676 extern void del_row_index(struct row_data **row, int index);
2677 
2678 extern void print_scroll_region(struct session *ses);
2679 extern void print_screen();
2680 extern void init_screen(int rows, int cols, int pix_rows, int pix_cols);
2681 extern void destroy_screen();
2682 extern int inside_scroll_region(struct session *ses, int row, int col);
2683 extern void set_grid_screen(struct session *ses, char *str, int row, int col);
2684 extern void add_line_screen(struct session *ses, char *str, int row);
2685 
2686 extern void set_line_screen(struct session *ses, char *ins, int row, int col);
2687 
2688 extern void get_line_screen(char *str, int row);
2689 extern  int get_link_screen(struct session *ses, char *var, char *val, int flags, int row, int col);
2690 extern void get_word_screen(char *str, int row, int col);
2691 
2692 #endif
2693 
2694 
2695 #ifndef __SESSION_H__
2696 #define __SESSION_H__
2697 
2698 extern DO_COMMAND(do_session);
2699 extern DO_COMMAND(do_snoop);
2700 extern DO_COMMAND(do_zap);
2701 
2702 extern struct session *session_command(char *arg, struct session *ses);
2703 extern struct session *find_session(char *name);
2704 extern struct session *newactive_session(void);
2705 extern struct session *activate_session(struct session *ses);
2706 extern struct session *new_session(struct session *ses, char *name, char *address, int desc, int ssl);
2707 extern struct session *connect_session(struct session *ses);
2708 extern void cleanup_session(struct session *ses);
2709 extern void dispose_session(struct session *ses);
2710 
2711 #endif
2712 
2713 
2714 #ifndef __SHOW_H__
2715 #define __SHOW_H__
2716 
2717 extern void show_message(struct session *ses, int index, char *format, ...);
2718 extern void show_error(struct session *ses, int index, char *format, ...);
2719 extern void show_debug(struct session *ses, int index, char *format, ...);
2720 extern void show_info(struct session *ses, int index, char *format, ...);
2721 extern void print_lines(struct session *ses, int flags, char *format, ...);
2722 extern void show_lines(struct session *ses, char *str);
2723 extern void tintin_header(struct session *ses, int width, char *format, ...);
2724 extern void socket_printf(struct session *ses, size_t length, char *format, ...);
2725 extern void telnet_printf(struct session *ses, int length, char *format, ...);
2726 
2727 extern void tintin_printf2(struct session *ses, char *format, ...);
2728 extern void tintin_printf(struct session *ses, char *format, ...);
2729 
2730 extern void tintin_puts3(struct session *ses, char *string, int prompt);
2731 extern void tintin_puts2(struct session *ses, char *string);
2732 extern void tintin_puts(struct session *ses, char *string);
2733 
2734 #endif
2735 
2736 
2737 #ifndef __SORT_H__
2738 #define __SORT_H__
2739 
2740 extern void quadsort(void *array, size_t nmemb, size_t size, CMPFUNC *cmp);
2741 extern int cmp_int(const void * a, const void * b);
2742 extern int cmp_str(const void * a, const void * b);
2743 extern int cmp_num(const void * a, const void * b);
2744 
2745 #endif
2746 
2747 #ifndef __SPLIT_H__
2748 #define __SPLIT_H__
2749 
2750 extern DO_COMMAND(do_split);
2751 extern DO_COMMAND(do_unsplit);
2752 
2753 extern void init_split(struct session *ses, int top, int bot, int left, int right);
2754 extern void reset_screen(struct session *ses);
2755 extern void dirty_screen(struct session *ses);
2756 extern void split_show(struct session *ses, char *prompt, char *row, char *col);
2757 
2758 #endif
2759 
2760 
2761 #ifndef __SSL_H__
2762 #define __SSL_H__
2763 
2764 extern gnutls_session_t ssl_negotiate(struct session *ses);
2765 
2766 #endif
2767 
2768 #ifndef __STRING_H__
2769 #define __STRING_H__
2770 
2771 extern int get_raw_len_str_range_str_width(struct session *ses, char *str, int start, int end, int *raw_width);
2772 extern int get_raw_off_str_range_raw_width(struct session *ses, char *str, int start, int end, int *raw_width);
2773 
2774 extern int raw_len_str(struct session *ses, char *str, int start, int end);
2775 extern int str_len_raw(struct session *ses, char *str, int start, int end);
2776 
2777 extern char *str_ins_str(struct session *ses, char **str, char *ins, int str_start, int str_end);
2778 
2779 extern char *calign(struct session *ses, char *in, char *out, int width);
2780 extern char *lalign(struct session *ses, char *in, char *out, int width);
2781 extern char *ralign(struct session *ses, char *in, char *out, int width);
2782 extern char *ualign(struct session *ses, char *in, char *out, int width);
2783 
2784 extern char char_cmp(char left, char right);
2785 
2786 extern char is_alnum(char input);
2787 extern char is_alpha(char input);
2788 extern char is_digit(char input);
2789 extern char is_hex(char input);
2790 extern char is_print(char input);
2791 extern char is_space(char input);
2792 extern char is_varchar(char input);
2793 extern char is_csichar(char input);
2794 
2795 #endif
2796 
2797 #ifndef __SUBSTITUTE_H__
2798 #define __SUBSTITUTE_H__
2799 
2800 extern  int valid_escape(struct session *ses, char *arg);
2801 extern char *fuzzy_color_code(struct session *ses, char *pti);
2802 extern char *dim_color_code(struct session *ses, char *pti, int mod);
2803 extern char *lit_color_code(struct session *ses, char *pti, int mod);
2804 extern int color_gradient(char *pti, int low, int max);
2805 extern int is_color_code(char *str);
2806 extern int is_color_name(char *str);
2807 extern int substitute_color(char *input, char *output, int colors);
2808 
2809 #endif
2810 
2811 #ifndef __SYSTEM_H__
2812 #define __SYSTEM_H__
2813 
2814 extern DO_COMMAND(do_suspend);
2815 
2816 #endif
2817 
2818 
2819 #ifndef __TABLES_H__
2820 #define __TABLES_H__
2821 
2822 extern struct buffer_type buffer_table[];
2823 extern struct charset_type charset_table[];
2824 extern struct chat_type chat_table[];
2825 extern   char character_table[];
2826 extern struct color_type color_table[];
2827 extern struct color_type map_color_table[];
2828 extern struct config_type config_table[];
2829 extern struct cursor_type cursor_table[];
2830 extern struct daemon_type daemon_table[];
2831 extern struct edit_type edit_table[];
2832 extern struct event_type event_table[];
2833 extern struct history_type history_table[];
2834 extern struct line_type line_table[];
2835 extern struct list_type list_table[LIST_MAX];
2836 extern struct map_type map_table[];
2837 extern struct path_type path_table[];
2838 extern struct port_type port_table[];
2839 extern struct rank_type rank_table[];
2840 extern struct stamp_type huge_stamp_table[];
2841 extern struct substitution_type substitution_table[];
2842 extern struct telopt_type telopt_table[];
2843 extern   char *telcmds[];
2844 extern struct timer_type timer_table[];
2845 extern struct map_legend_type map_legend_table[];
2846 extern struct map_legend_group_type map_legend_group_table[];
2847 
2848 #endif
2849 
2850 
2851 #ifndef __TELOPT_H__
2852 #define __TELOPT_H__
2853 
2854 extern  int client_translate_telopts(struct session *ses, unsigned char *src, int cplen);
2855 extern  int client_write_compressed(struct session *ses, char *txt, int length);
2856 extern  int client_send_sb_naws(struct session *ses, int cplen, unsigned char *cpsrc);
2857 extern void announce_support(struct session *ses, struct port_data *buddy);
2858 extern  int server_translate_telopts(struct session *ses, struct port_data *buddy, unsigned char *src, int srclen, unsigned char *out, int outlen);
2859 extern void write_mccp2(struct session *ses, struct port_data *buddy, char *txt, int length);
2860 extern void client_end_mccp2(struct session *ses);
2861 extern void end_mccp2(struct session *ses, struct port_data *buddy);
2862 extern void client_end_mccp3(struct session *ses);
2863 extern void end_mccp3(struct session *ses, struct port_data *buddy);
2864 extern void init_msdp_table(void);
2865 
2866 #endif
2867 
2868 
2869 #ifndef __TERMINAL_H__
2870 #define __TERMINAL_H__
2871 
2872 extern void  init_terminal(struct session *ses);
2873 extern void  reset_terminal(struct session *ses);
2874 extern void  save_session_terminal(struct session *ses);
2875 extern void  refresh_session_terminal(struct session *ses);
2876 extern void  echo_on(struct session *ses);
2877 extern void  echo_off(struct session *ses);
2878 extern void  init_terminal_size(struct session *ses);
2879 extern  int  get_scroll_rows(struct session *ses);
2880 extern  int  get_scroll_cols(struct session *ses);
2881 extern char *get_charset(struct session *ses);
2882 
2883 #endif
2884 
2885 
2886 #ifndef __TEXT_H__
2887 #define __TEXT_H__
2888 
2889 extern void print_line(struct session *ses, char **str, int isaprompt);
2890 extern void print_stdout(int row, int col, char *format, ...);
2891 extern  int word_wrap(struct session *ses, char *textin, char *textout, int display, int *height, int *width);
2892 extern  int word_wrap_split(struct session *ses, char *textin, char *textout, int wrap, int start, int end, int flags, int *height, int *width);
2893 
2894 #endif
2895 
2896 
2897 
2898 
2899 #ifndef __TINEXP_H__
2900 #define __TINEXP_H__
2901 
2902 DO_COMMAND(do_regexp);
2903 
2904 extern int substitute(struct session *ses, char *string, char *result, int flags);
2905 extern int match(struct session *ses, char *str, char *exp, int flags);
2906 extern int find(struct session *ses, char *str, char *exp, int sub, int flag);
2907 extern int regexp_compare(struct session *ses, pcre *regex, char *str, char *exp, int option, int flag);
2908 extern int check_one_regexp(struct session *ses, struct listnode *node, char *line, char *original, int option);
2909 extern int tintin_regexp_check(struct session *ses, char *exp);
2910 extern int tintin_regexp(struct session *ses, pcre *pcre, char *str, char *exp, int option, int flag);
2911 extern pcre *regexp_compile(struct session *ses, char *exp, int option);
2912 extern pcre *tintin_regexp_compile(struct session *ses, struct listnode *node, char *exp, int option);
2913 extern void  tintin_macro_compile(char *input, char *output);
2914 
2915 #endif
2916 
2917 
2918 #ifndef __TOKENIZE_H__
2919 #define __TOKENIZE_H__
2920 
2921 extern void init_local(struct session *ses);
2922 extern struct scriptroot *push_script_stack(struct session *ses, int list);
2923 extern void pop_script_stack();
2924 extern struct listroot *local_list(struct session *ses);
2925 extern struct session *script_driver(struct session *ses, int list, char *str);
2926 extern char *view_script(struct session *ses, struct scriptroot *root);
2927 extern char *script_writer(struct session *ses, char *str);
2928 extern char *script_viewer(struct session *ses, char *str);
2929 #endif
2930 
2931 
2932 #ifndef __TRIGGER_H__
2933 #define __TRIGGER_H__
2934 
2935 extern DO_COMMAND(do_delay);
2936 
2937 extern void check_all_actions(struct session *ses, char *original, char *line, char *buf);
2938 extern  int check_all_aliases(struct session *ses, char *input);
2939 extern void check_all_buttons(struct session *ses, short row, short col, char *arg1, char *arg2, char *word, char *line);
2940 extern void check_all_gags(struct session *ses, char *original, char *line);
2941 extern void check_all_highlights(struct session *ses, char *original, char *line);
2942 extern  int check_all_prompts(struct session *ses, char *original, char *line);
2943 extern void check_all_substitutions(struct session *ses, char *original, char *line);
2944 
2945 #endif
2946 
2947 // update.c
2948 
2949 extern void mainloop(void);
2950 extern void show_cpu(struct session *ses);
2951 
2952 
2953 #ifndef __UTILS_H__
2954 #define __UTILS_H__
2955 
2956 
2957 
2958 extern int is_number(char *str);
2959 extern unsigned long long hex_number_64bit(char *str);
2960 extern unsigned int hex_number_32bit(char *str);
2961 extern int hex_number_8bit(char *str);
2962 extern int oct_number(char *str);
2963 extern int unicode_8_bit(char *str, char *out);
2964 extern int unicode_12_bit(char *str, char *out);
2965 extern int unicode_16_bit(char *str, char *out);
2966 extern int unicode_20_bit(char *str, char *out);
2967 extern int unicode_21_bit(char *str, char *out);
2968 extern unsigned long long utime(void);
2969 extern time_t get_time(struct session *ses, char *str);
2970 extern char *str_time(struct session *ses, char *format, time_t time);
2971 extern unsigned long long generate_rand(struct session *ses);
2972 extern void seed_rand(struct session *ses, unsigned long long seed);
2973 extern char *capitalize(char *str);
2974 extern char *ftos(float number);
2975 extern char *ntos(long long number);
2976 extern char *indent_one(int len);
2977 extern char *indent(int len);
2978 extern int cat_sprintf(char *dest, char *fmt, ...);
2979 extern void ins_sprintf(char *dest, char *fmt, ...);
2980 extern char *str_ins_printf(char **str, int index, char *fmt, ...);
2981 extern int is_suffix(char *str1, char *str2);
2982 
2983 
2984 
2985 #endif
2986 
2987 
2988 #ifndef __UTF8_H__
2989 #define __UTF8_H__
2990 
2991 extern void big5toutf8_info(struct session *ses);
2992 extern void utf8tobig5_info(struct session *ses);
2993 
2994 extern int get_ascii_width(char *str, int *width);
2995 
2996 extern int is_utf8_head(char *str);
2997 extern int is_utf8_tail(char *str);
2998 extern int get_utf8_size(char *str);
2999 extern int get_utf8_width(char *str, int *width, int *index);
3000 extern int get_utf8_index(char *str, int *index);
3001 extern int unicode_to_utf8(int index, char *out);
3002 extern int utf8_strlen(char *str, int *width);
3003 
3004 extern int utf8_to_all(struct session *ses, char *in, char *out);
3005 extern int all_to_utf8(struct session *ses, char *in, char *out);
3006 extern int cp1251_to_utf8(char *input, char *output);
3007 extern int utf8_to_cp1251(char *input, char *output);
3008 extern int iso1_to_utf8(char *input, char *output);
3009 extern int utf8_to_iso1(char *input, char *output);
3010 extern int iso2_to_utf8(char *input, char *output);
3011 extern int utf8_to_iso2(char *input, char *output);
3012 extern int koi8_to_utf8(char *input, char *output);
3013 extern int utf8_to_koi8(char *input, char *output);
3014 extern int fansi_to_utf8(char *input, char *output);
3015 extern int is_euc_head(struct session *ses, char *str);
3016 extern int get_euc_size(struct session *ses, char *str);
3017 extern int get_euc_width(struct session *ses, char *str, int *width);
3018 extern int is_big5(char *str);
3019 extern int big5_to_utf8(char *input, char *output);
3020 extern int utf8_to_big5(char *input, char *output);
3021 extern int is_gbk1(char *str);
3022 extern int gbk1_to_utf8(char *input, char *output);
3023 extern int utf8_to_gbk1(char *input, char *output);
3024 extern int is_cp949(char *str);
3025 extern int cp949_to_utf8(char *input, char *output);
3026 extern int utf8_to_cp949(char *input, char *output);
3027 
3028 #endif
3029 
3030 #ifndef __VARIABLE_H__
3031 #define __VARIABLE_H__
3032 
3033 extern  int valid_variable(struct session *ses, char *arg);
3034 extern  int string_raw_str_len(struct session *ses, char *str, int start, int end);
3035 extern  int string_str_raw_len(struct session *ses, char *str, int start, int end);
3036 extern  int translate_color_names(struct session *ses, char *string, char *result);
3037 extern  int get_color_names(struct session *ses, char *htype, char *result);
3038 extern void lowerstring(char *str);
3039 extern void upperstring(char *str);
3040 extern void numbertocharacter(struct session *ses, char *str);
3041 extern void charactertonumber(struct session *ses, char *str);
3042 extern  int delete_variable(struct session *ses, char *variable);
3043 extern void justify_string(struct session *ses, char *in, char *out, int align, int cut);
3044 extern void format_string(struct session *ses, char *format, char *arg, char *out);
3045 extern struct listnode *search_variable(struct session *ses, char *variable);
3046 extern struct listnode *get_variable(struct session *ses, char *variable, char *result);
3047 extern struct listnode *set_variable(struct session *ses, char *variable, char *format, ...);
3048 
3049 
3050 #endif
3051 
3052 
3053 #ifndef __VT102_H__
3054 #define __VT102_H__
3055 
3056 extern void init_pos(struct session *ses, int row, int col);
3057 extern void hide_cursor(struct session *ses);
3058 extern void show_cursor(struct session *ses);
3059 extern void save_pos(struct session *ses);
3060 extern void goto_pos(struct session *ses, int row, int col);
3061 extern void restore_pos(struct session *ses);
3062 extern void erase_cols(int cnt);
3063 extern void erase_scroll_region(struct session *ses);
3064 extern void reset(struct session *ses);
3065 extern void scroll_region(struct session *ses, int top, int bottom);
3066 extern void reset_scroll_region(struct session *ses);
3067 extern int find_color_code(char *str);
3068 extern int find_escaped_color_code(char *str);
3069 extern int find_secure_color_code(char *str);
3070 extern int get_vt102_width(struct session *ses, char *str, int *width);
3071 extern int strip_vt102_width(struct session *ses, char *str, int *width);
3072 extern int skip_vt102_codes(char *str);
3073 extern int skip_vt102_codes_non_graph(char *str);
3074 extern int strip_vt102_codes(char *str, char *buf);
3075 extern void strip_vt102_codes_non_graph(char *str, char *buf);
3076 extern void strip_non_vt102_codes(char *str, char *buf);
3077 extern void get_color_codes(char *old, char *str, char *buf, int flags);
3078 extern int strip_vt102_strlen(struct session *ses, char *str);
3079 extern int strip_color_strlen(struct session *ses, char *str);
3080 extern char *strip_vt102_strstr(char *str, char *buf, int *len);
3081 extern int interpret_vt102_codes(struct session *ses, char *str, int real);
3082 extern int catch_vt102_codes(struct session *ses, unsigned char *str, int cplen);
3083 
3084 #endif
3085