tinymush-3.1p2/game/backups/
tinymush-3.1p2/game/bin/
tinymush-3.1p2/game/data/
tinymush-3.1p2/game/modules/
tinymush-3.1p2/game/modules/old/
tinymush-3.1p2/src/modules/comsys/
tinymush-3.1p2/src/modules/hello/
tinymush-3.1p2/src/modules/mail/
tinymush-3.1p2/src/tools/
/* ansi.h - ANSI control codes for various neat-o terminal effects. */
/* $Id: ansi.h,v 1.18 2003/02/24 18:05:22 rmg Exp $ */

#include "copyright.h"

#ifndef __ANSI_H
#define __ANSI_H

#define BEEP_CHAR     '\07'
#define ESC_CHAR      '\033'

#define ANSI_CSI      '['
#define ANSI_END      'm'

#define ANSI_NORMAL   "\033[0m"

#define ANSI_HILITE   "\033[1m"
#define ANSI_INVERSE  "\033[7m"
#define ANSI_BLINK    "\033[5m"
#define ANSI_UNDER    "\033[4m"

#define ANSI_INV_BLINK         "\033[7;5m"
#define ANSI_INV_HILITE        "\033[1;7m"
#define ANSI_BLINK_HILITE      "\033[1;5m"
#define ANSI_INV_BLINK_HILITE  "\033[1;5;7m"

/* Foreground colors */

#define ANSI_BLACK	"\033[30m"
#define ANSI_RED	"\033[31m"
#define ANSI_GREEN	"\033[32m"
#define ANSI_YELLOW	"\033[33m"
#define ANSI_BLUE	"\033[34m"
#define ANSI_MAGENTA	"\033[35m"
#define ANSI_CYAN	"\033[36m"
#define ANSI_WHITE	"\033[37m"

/* Background colors */

#define ANSI_BBLACK	"\033[40m"
#define ANSI_BRED	"\033[41m"
#define ANSI_BGREEN	"\033[42m"
#define ANSI_BYELLOW	"\033[43m"
#define ANSI_BBLUE	"\033[44m"
#define ANSI_BMAGENTA	"\033[45m"
#define ANSI_BCYAN	"\033[46m"
#define ANSI_BWHITE	"\033[47m"

/* Numeric-only definitions */

#define N_ANSI_NORMAL   "0"

#define N_ANSI_HILITE   "1"
#define N_ANSI_INVERSE  "7"
#define N_ANSI_BLINK    "5"
#define N_ANSI_UNDER    "4"

#define N_ANSI_BLACK	"30"
#define N_ANSI_RED	"31"
#define N_ANSI_GREEN	"32"
#define N_ANSI_YELLOW	"33"
#define N_ANSI_BLUE	"34"
#define N_ANSI_MAGENTA	"35"
#define N_ANSI_CYAN	"36"
#define N_ANSI_WHITE	"37"

#define N_ANSI_BBLACK	"40"
#define N_ANSI_BRED	"41"
#define N_ANSI_BGREEN	"42"
#define N_ANSI_BYELLOW	"43"
#define N_ANSI_BBLUE	"44"
#define N_ANSI_BMAGENTA	"45"
#define N_ANSI_BCYAN	"46"
#define N_ANSI_BWHITE	"47"

#define N_ANSI_NORMAL   "0"

/* Integers */

#define I_ANSI_NORMAL   0

#define I_ANSI_HILITE   1
#define I_ANSI_INVERSE  7
#define I_ANSI_BLINK    5
#define I_ANSI_UNDER    4

#define I_ANSI_BLACK	30
#define I_ANSI_RED	31
#define I_ANSI_GREEN	32
#define I_ANSI_YELLOW	33
#define I_ANSI_BLUE	34
#define I_ANSI_MAGENTA	35
#define I_ANSI_CYAN	36
#define I_ANSI_WHITE	37

#define I_ANSI_BBLACK	40
#define I_ANSI_BRED	41
#define I_ANSI_BGREEN	42
#define I_ANSI_BYELLOW	43
#define I_ANSI_BBLUE	44
#define I_ANSI_BMAGENTA	45
#define I_ANSI_BCYAN	46
#define I_ANSI_BWHITE	47

#define I_ANSI_NUM	48
#define I_ANSI_LIM	50

#define ANST_NORMAL	0x0099
#define ANST_NONE	0x1099

/* From stringutil.c */
extern int	ansi_nchartab[256];
extern char	ansi_lettab[I_ANSI_NUM];
extern int	ansi_mask_bits[I_ANSI_LIM];
extern int	ansi_bits[I_ANSI_LIM];

extern char *	FDECL(strip_ansi, (const char *));
extern int	FDECL(strip_ansi_len, (const char *));
extern char *	FDECL(normal_to_white, (const char *));
extern char *	FDECL(ansi_transition_esccode, (int, int));
extern char *	FDECL(ansi_transition_mushcode, (int, int));
extern char *	FDECL(ansi_transition_letters, (int, int));
extern int	FDECL(ansi_map_states, (const char *, int **));

#define skip_esccode(s) \
	++(s);						\
	if (*(s) == ANSI_CSI) {				\
		do {					\
			++(s);				\
		} while ((*(s) & 0xf0) == 0x30);	\
	}						\
	while ((*(s) & 0xf0) == 0x20) {			\
		++(s);					\
	}						\
	if (*(s)) {					\
		++(s);					\
	}

#define copy_esccode(s, t) \
	*(t)++ = *(s)++;				\
	if (*(s) == ANSI_CSI) {				\
		do {					\
			*(t)++ = *(s)++;		\
		} while ((*(s) & 0xf0) == 0x30);	\
	}						\
	while ((*(s) & 0xf0) == 0x20) {			\
		*(t)++ = *(s)++;			\
	}						\
	if (*(s)) {					\
		*(t)++ = *(s)++;			\
	}

#define safe_copy_esccode(s, buff, bufc) \
	safe_chr(*(s), (buff), (bufc));			\
	++(s);						\
	if (*(s) == ANSI_CSI) {				\
		do {					\
			safe_chr(*(s), (buff), (bufc));	\
			++(s);				\
		} while ((*(s) & 0xf0) == 0x30);	\
	}						\
	while ((*(s) & 0xf0) == 0x20) {			\
		safe_chr(*(s), (buff), (bufc));		\
		++(s);					\
	}						\
	if (*(s)) {					\
		safe_chr(*(s), (buff), (bufc));		\
		++(s);					\
	}

#define track_esccode(s, ansi_state) \
do {									\
	int ansi_mask = 0;						\
	int ansi_diff = 0;						\
	unsigned int param_val = 0;					\
									\
	++(s);								\
	if (*(s) == ANSI_CSI) {						\
		while ((*(++(s)) & 0xf0) == 0x30) {			\
			if (*(s) < 0x3a) {				\
				param_val <<= 1;			\
				param_val += (param_val << 2) + (*(s) & 0x0f); \
			} else {					\
				if (param_val < I_ANSI_LIM) {		\
					ansi_mask |= ansi_mask_bits[param_val]; \
					ansi_diff = ((ansi_diff & ~ansi_mask_bits[param_val]) | \
						     ansi_bits[param_val]); \
				}					\
				param_val = 0;				\
			}						\
		}							\
	}								\
	while ((*(s) & 0xf0) == 0x20) {					\
		++(s);							\
	}								\
	if (*(s) == ANSI_END) {						\
		if (param_val < I_ANSI_LIM) {				\
			ansi_mask |= ansi_mask_bits[param_val];		\
			ansi_diff = ((ansi_diff & ~ansi_mask_bits[param_val]) | \
				     ansi_bits[param_val]);		\
		}							\
		ansi_state = (ansi_state & ~ansi_mask) | ansi_diff;	\
		++(s);							\
	} else if (*(s)) {						\
		++(s);							\
	}								\
} while (0) 

#define track_all_esccodes(s, p, ansi_state) \
do {								 \
	(p) = (s);						 \
	while (*(p)) {						 \
		if (*(p) == ESC_CHAR) {				 \
			track_esccode((p), (ansi_state));	 \
		} else {					 \
			++(p);					 \
		}						 \
	}							 \
} while (0)

#define safe_copy_tracking(s, p, ansi_state, buff, bufc) \
track_all_esccodes((s), (p), (ansi_state));		 \
safe_known_str((s), (p) - (s), (buff), (bufc))

/* Macro for turning mushcode ansi letters into a packed ansi state.
 * s is a throwaway char *, t is the sequence of ansi letters, and
 * ansi_state is an int that will contain the result.
 */
#define track_ansi_letters(s, t, ansi_state) \
	ansi_state = ANST_NONE; \
	(s) = (t); \
	while (*(s)) { \
		if (*(s) == ESC_CHAR) { \
			skip_esccode((s)); \
		} else { \
			(ansi_state) = (((ansi_state) & ~ansi_mask_bits[ansi_nchartab[(unsigned char) *(s)]]) | \
					ansi_bits[ansi_nchartab[(unsigned char) *(s)]]); \
			++(s); \
		} \
	}

#endif /* __ANSI_H */