deltamud/deltamud/
deltamud/deltamud/bin/
deltamud/deltamud/cnf/
deltamud/deltamud/lib/
deltamud/deltamud/lib/etc/
deltamud/deltamud/lib/misc/
deltamud/deltamud/lib/plrobjs/
deltamud/deltamud/lib/text/
deltamud/deltamud/lib/text/help/
deltamud/deltamud/lib/world/
deltamud/deltamud/lib/world/trg/
/* ************************************************************************
   *   File: colour.c                                      Part of CircleMUD *
   *  Usage: interprets inline colour codes                                  *
   *  Name: Easy Colour v2.2                                                 *
   *                                                                         *
   *  All rights reserved.  See license.doc for complete information.        *
   *  Modifications Copyright Trevor Man 1997                                *
   *  Based on the Easy Color patch by mud@proimages.proimages.com           *
   *  Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University *
   *  CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.               *
   ************************************************************************ */

#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "utils.h"

#define CNRM  "\x1B[0;0m"
#define CBLK  "\x1B[0;30m"
#define CRED  "\x1B[0;31m"
#define CGRN  "\x1B[0;32m"
#define CYEL  "\x1B[0;33m"
#define CBLU  "\x1B[0;34m"
#define CMAG  "\x1B[0;35m"
#define CCYN  "\x1B[0;36m"
#define CWHT  "\x1B[0;37m"
#define CNUL  ""

#define BBLK  "\x1B[1;30m"
#define BRED  "\x1B[1;31m"
#define BGRN  "\x1B[1;32m"
#define BYEL  "\x1B[1;33m"
#define BBLU  "\x1B[1;34m"
#define BMAG  "\x1B[1;35m"
#define BCYN  "\x1B[1;36m"
#define BWHT  "\x1B[1;37m"

#define BKBLK  "\x1B[40m"
#define BKRED  "\x1B[41m"
#define BKGRN  "\x1B[42m"
#define BKYEL  "\x1B[43m"
#define BKBLU  "\x1B[44m"
#define BKMAG  "\x1B[45m"
#define BKCYN  "\x1B[46m"
#define BKWHT  "\x1B[47m"

#define CAMP  "&"
#define CSLH  "\\"

#define CUDL  "\x1B[4m"		/* Underline ANSI code */
#define CFSH  "\x1B[5m"		/* Flashing ANSI code.  Change to #define CFSH "" if
				   * you want to disable flashing colour codes
				 */
#define CRVS  "\x1B[7m"		/* Reverse video ANSI code */

const char *COLOURLIST[] =
{CNRM, CRED, CGRN, CYEL, CBLU, CMAG, CCYN, CWHT,
 BRED, BGRN, BYEL, BBLU, BMAG, BCYN, BWHT,
 BKRED, BKGRN, BKYEL, BKBLU, BKMAG, BKCYN, BKWHT,
 CAMP, CSLH, BKBLK, CBLK, CFSH, CRVS, CUDL, BBLK};

#define MAX_COLORS 28

int
isnum (char s)
{
  return ((s >= '0') && (s <= '9'));
}

int
is_colour (char code)
{
  switch (code)
    {
      /* Normal colours */
    case 'k':
      return 25;
      break;			/* Black */
    case 'r':
      return 1;
      break;			/* Red */
    case 'g':
      return 2;
      break;			/* Green */
    case 'y':
      return 3;
      break;			/* Yellow */
    case 'b':
      return 4;
      break;			/* Blue */
    case 'm':
      return 5;
      break;			/* Magenta */
    case 'c':
      return 6;
      break;			/* Cyan */
    case 'w':
      return 7;
      break;			/* White */

      /* Bold colours */
    case 'K':
      return 29;
      break;			/* Bold black (Just for completeness) */
    case 'R':
      return 8;
      break;			/* Bold red */
    case 'G':
      return 9;
      break;			/* Bold green */
    case 'Y':
      return 10;
      break;			/* Bold yellow */
    case 'B':
      return 11;
      break;			/* Bold blue */
    case 'M':
      return 12;
      break;			/* Bold magenta */
    case 'C':
      return 13;
      break;			/* Bold cyan */
    case 'W':
      return 14;
      break;			/* Bold white */

      /* Background colours */
    case '0':
      return 24;
      break;			/* Black background */
    case '1':
      return 15;
      break;			/* Red background */
    case '2':
      return 16;
      break;			/* Green background */
    case '3':
      return 17;
      break;			/* Yellow background */
    case '4':
      return 18;
      break;			/* Blue background */
    case '5':
      return 19;
      break;			/* Magenta background */
    case '6':
      return 20;
      break;			/* Cyan background */
    case '7':
      return 21;
      break;			/* White background */

      /* Misc characters */
    case '&':
      return 22;
      break;			/* The & character */
    case '\\':
      return 23;
      break;			/* The \ character */

      /* Special codes */
    case 'n':
      return 0;
      break;			/* Normal */
    case 'f':
      return 26;
      break;			/* Flash */
    case 'v':
      return 27;
      break;			/* Reverse video */
    case 'u':
      return 28;
      break;			/* Underline (Only for mono screens) */

    default:
      return -1;
      break;
    }
  return -1;
}

void
proc_color (char *inbuf, int colour)
{
  register int j = 0, p = 0;
  int k, max, c = 0, lastcol=0, lastcol2=0;
  char out_buf[32768];

  if (inbuf[0] == '\0')
    return;

  while (inbuf[j] != '\0')
    {
      if ((inbuf[j] == '\\') && (inbuf[j + 1] == 'c')
	  && isnum (inbuf[j + 2]) && isnum (inbuf[j + 3]))
	{
	  c = (inbuf[j + 2] - '0') * 10 + inbuf[j + 3] - '0';
	  j += 4;
	}
      else if ((inbuf[j] == '&') && (!(is_colour (inbuf[j + 1]) == -1) || LOWER(inbuf[j+1])=='l'))
	{
          if (LOWER(inbuf[j+1])=='l')
            c = colour != -1 ? lastcol2 : number(1,14);
          else
	    c = colour != -1 ? is_colour (inbuf[j + 1]) : number(1, 14);
          lastcol2=lastcol;
          lastcol=c;
	  j += 2;
	}
      else
	{
	  out_buf[p] = inbuf[j];
	  j++;
	  p++;
	  continue;
	}
      if (c > MAX_COLORS+1)
	c = 0;
      max = strlen (COLOURLIST[c]);
      if (colour || max == 1)
	for (k = 0; k < max; k++)
	  {
	    out_buf[p] = COLOURLIST[c][k];
	    p++;
	  }
    }

  out_buf[p] = '\0';

  strcpy (inbuf, out_buf);
}