home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / the25.zip / thesrc251.zip / colour.c < prev    next >
C/C++ Source or Header  |  1998-04-11  |  21KB  |  578 lines

  1. /***********************************************************************/
  2. /* COLOUR.C - Colour related functions                                 */
  3. /* This file contains all commands that can be assigned to function    */
  4. /* keys or typed on the command line.                                  */
  5. /***********************************************************************/
  6. /*
  7.  * THE - The Hessling Editor. A text editor similar to VM/CMS xedit.
  8.  * Copyright (C) 1991-1997 Mark Hessling
  9.  *
  10.  * This program is free software; you can redistribute it and/or
  11.  * modify it under the terms of the GNU General Public License as
  12.  * published by the Free Software Foundation; either version 2 of
  13.  * the License, or any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  18.  * General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to:
  22.  *
  23.  *    The Free Software Foundation, Inc.
  24.  *    675 Mass Ave,
  25.  *    Cambridge, MA 02139 USA.
  26.  *
  27.  *
  28.  * If you make modifications to this software that you feel increases
  29.  * it usefulness for the rest of the community, please email the
  30.  * changes, enhancements, bug fixes as well as any and all ideas to me.
  31.  * This software is going to be maintained and enhanced as deemed
  32.  * necessary by the community.
  33.  *
  34.  * Mark Hessling                 Email:             M.Hessling@qut.edu.au
  35.  * PO Box 203                    Phone:                    +617 3802 0800
  36.  * Bellara                       http://www.gu.edu.au/gext/the/markh.html
  37.  * QLD 4507                      **** Maintainer PDCurses & REXX/SQL ****
  38.  * Australia                     ************* Author of THE ************
  39.  */
  40.  
  41. /*
  42. $Id: colour.c 2.1 1995/06/24 16:28:39 MH Rel MH $
  43. */
  44.  
  45. #include <the.h>
  46. #include <proto.h>
  47.  
  48. /*
  49.  *                        attributes
  50.  *             FILEAREA   CURLINE  BLOCK    CBLOCK
  51.  *             CMDLINE    IDLINE   MSGLINE  ARROW
  52.  *             PREFIX     PENDING  SCALE    TOFEOF
  53.  *             CTOFEOF    TABLINE  SHADOW   STATAREA
  54.  *             DIVIDER    RESERVED NONDISP  HIGHLIGHT
  55.  *             CHIGHLIGHT SLK      GAP
  56.  */
  57.  
  58. #ifdef A_COLOR
  59.  static chtype the_fore[ATTR_MAX] =
  60.               {COLOR_WHITE,COLOR_WHITE,COLOR_BLUE,COLOR_RED,
  61.                COLOR_BLACK,COLOR_BLUE,COLOR_RED,COLOR_BLACK,
  62.                COLOR_BLACK,COLOR_RED,COLOR_YELLOW,COLOR_WHITE,
  63.                COLOR_WHITE,COLOR_YELLOW,COLOR_RED,COLOR_BLUE,
  64.                COLOR_RED,COLOR_WHITE,COLOR_MAGENTA,COLOR_WHITE,
  65.                COLOR_YELLOW,COLOR_BLACK,COLOR_BLACK};
  66.  static chtype the_back[ATTR_MAX] =
  67.               {COLOR_BLUE,COLOR_BLUE,COLOR_WHITE,COLOR_WHITE,
  68.                COLOR_CYAN,COLOR_WHITE,COLOR_WHITE,COLOR_CYAN,
  69.                COLOR_CYAN,COLOR_WHITE,COLOR_BLUE,COLOR_BLUE,
  70.                COLOR_BLUE,COLOR_BLUE,COLOR_WHITE,COLOR_WHITE,
  71.                COLOR_WHITE,COLOR_BLACK,COLOR_CYAN,COLOR_CYAN,
  72.                COLOR_CYAN,COLOR_CYAN,COLOR_CYAN};
  73.  static chtype the_mod[ATTR_MAX] =
  74.               {A_NORMAL,A_BOLD,  A_NORMAL,A_NORMAL,
  75.                A_NORMAL,A_NORMAL,A_NORMAL,A_NORMAL,
  76.                A_NORMAL,A_NORMAL,A_BOLD,  A_BOLD,
  77.                A_BOLD,  A_BOLD,  A_NORMAL,A_NORMAL,
  78.                A_NORMAL,A_NORMAL,A_BLINK, A_BOLD,
  79.                A_BOLD,  A_BOLD,  A_NORMAL};
  80.  static chtype kedit_fore[ATTR_MAX] =
  81.               {COLOR_CYAN,COLOR_YELLOW,COLOR_CYAN,COLOR_YELLOW,
  82.                COLOR_YELLOW,COLOR_YELLOW,COLOR_YELLOW,COLOR_YELLOW,
  83.                COLOR_YELLOW,COLOR_WHITE,COLOR_YELLOW,COLOR_CYAN,
  84.                COLOR_YELLOW,COLOR_YELLOW,COLOR_YELLOW,COLOR_YELLOW,
  85.                COLOR_CYAN,COLOR_YELLOW,COLOR_MAGENTA,COLOR_WHITE,
  86.                COLOR_YELLOW,COLOR_BLACK,COLOR_CYAN};
  87.  static chtype kedit_back[ATTR_MAX] =
  88.               {COLOR_BLUE,COLOR_BLUE,COLOR_WHITE,COLOR_WHITE,
  89.                COLOR_BLUE,COLOR_BLUE,COLOR_BLUE,COLOR_BLUE,
  90.                COLOR_BLUE,COLOR_BLUE,COLOR_BLUE,COLOR_BLUE,
  91.                COLOR_BLUE,COLOR_BLUE,COLOR_BLUE,COLOR_BLUE,
  92.                COLOR_BLUE,COLOR_BLUE,COLOR_CYAN,COLOR_CYAN,
  93.                COLOR_CYAN,COLOR_CYAN,COLOR_BLUE};
  94.  static chtype kedit_mod[ATTR_MAX]  =
  95.               {A_BOLD,  A_BOLD,  A_BOLD,  A_BOLD,
  96.                A_BOLD,  A_BOLD,  A_BOLD,  A_BOLD,
  97.                A_NORMAL,A_BOLD,  A_BOLD,  A_BOLD,
  98.                A_BOLD,  A_BOLD,  A_NORMAL,A_BOLD,
  99.                A_BOLD,  A_BOLD,  A_BLINK, A_BOLD,
  100.                A_BOLD,  A_BOLD,  A_BOLD};
  101.  static chtype xedit_fore[ATTR_MAX] =
  102.               {COLOR_GREEN, COLOR_CYAN, COLOR_BLACK,COLOR_CYAN,
  103.                COLOR_YELLOW,COLOR_CYAN, COLOR_RED,  COLOR_CYAN,
  104.                COLOR_GREEN, COLOR_GREEN,COLOR_CYAN, COLOR_GREEN,
  105.                COLOR_GREEN, COLOR_GREEN,COLOR_GREEN,COLOR_CYAN,
  106.                COLOR_GREEN, COLOR_GREEN,COLOR_MAGENTA,COLOR_WHITE,
  107.                COLOR_YELLOW,COLOR_BLACK,COLOR_GREEN};
  108.  static chtype xedit_back[ATTR_MAX] =
  109.               {COLOR_BLACK,COLOR_BLACK,COLOR_GREEN,COLOR_GREEN,
  110.                COLOR_BLACK,COLOR_BLACK,COLOR_BLACK,COLOR_BLACK,
  111.                COLOR_BLACK,COLOR_BLACK,COLOR_BLACK,COLOR_BLACK,
  112.                COLOR_BLACK,COLOR_BLACK,COLOR_BLACK,COLOR_BLACK,
  113.                COLOR_BLACK,COLOR_BLACK,COLOR_CYAN,COLOR_CYAN,
  114.                COLOR_CYAN,COLOR_GREEN,COLOR_BLACK};
  115.  static chtype xedit_mod[ATTR_MAX]  =
  116.               {A_NORMAL,A_NORMAL,A_NORMAL,A_BOLD,
  117.                A_NORMAL,A_NORMAL,A_BOLD,  A_NORMAL,
  118.                A_NORMAL,A_BOLD,  A_NORMAL,A_NORMAL,
  119.                A_BOLD,  A_BOLD,  A_NORMAL,A_NORMAL,
  120.                A_BOLD,  A_BOLD,  A_BLINK, A_BOLD,
  121.                A_BOLD,  A_BOLD,  A_NORMAL};
  122. #else
  123.  static chtype the_fore[ATTR_MAX]   = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  124.  static chtype the_back[ATTR_MAX]   = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  125.  static chtype the_mod[ATTR_MAX]    = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  126.  static chtype kedit_fore[ATTR_MAX] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  127.  static chtype kedit_back[ATTR_MAX] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  128.  static chtype kedit_mod[ATTR_MAX]  = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  129.  static chtype xedit_fore[ATTR_MAX] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  130.  static chtype xedit_back[ATTR_MAX] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  131.  static chtype xedit_mod[ATTR_MAX]  = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  132. #endif
  133.  static chtype the_mono[ATTR_MAX] =
  134.               {A_NORMAL,A_BOLD,A_REVERSE,A_BOLD|A_REVERSE,
  135.                A_BOLD,A_REVERSE,A_BLINK,A_BOLD,
  136.                A_REVERSE,A_BOLD|A_REVERSE,A_BOLD,A_BOLD,
  137.                A_BOLD,A_BOLD,A_BOLD,A_REVERSE,
  138.                A_BOLD,A_BOLD,A_BLINK|A_REVERSE,A_REVERSE,
  139.                A_BOLD|A_REVERSE,A_BOLD|A_REVERSE,A_REVERSE};
  140.                                                         
  141.  static chtype kedit_mono[ATTR_MAX] =
  142.               {A_NORMAL,A_BOLD,  A_REVERSE,A_REVERSE|A_BOLD,
  143.                A_NORMAL,A_NORMAL,A_BOLD,  A_BOLD,
  144.                A_NORMAL,A_BOLD,  A_NORMAL,A_NORMAL,
  145.                A_BOLD,  A_NORMAL,A_NORMAL,A_BOLD,
  146.                A_NORMAL,A_NORMAL,A_BLINK|A_REVERSE,A_REVERSE,
  147.                A_BOLD|A_REVERSE,A_BOLD|A_REVERSE,A_NORMAL};
  148.  static chtype xedit_mono[ATTR_MAX] =
  149.               {A_NORMAL,A_BOLD,  A_REVERSE,A_BOLD|A_REVERSE,
  150.                A_NORMAL,A_BOLD,  A_BOLD,  A_BOLD,
  151.                A_NORMAL,A_BOLD,  A_BOLD,  A_NORMAL,
  152.                A_BOLD,  A_BOLD,  A_NORMAL,A_BOLD,
  153.                A_BOLD,  A_BOLD,  A_BLINK|A_REVERSE,A_REVERSE,
  154.                A_BOLD|A_REVERSE,A_BOLD|A_REVERSE,A_NORMAL};
  155.  
  156.  struct attributes
  157.  {
  158.   CHARTYPE *attrib;
  159.   short attrib_min_len;
  160.   chtype actual_attrib;
  161.   chtype colour_modifier;
  162.   bool attrib_modifier;
  163.   bool attrib_allowed_on_mono;
  164.  };
  165.  typedef struct attributes ATTRIBS;
  166. #define NO_ATTRIBS 21
  167.  static ATTRIBS valid_attribs[NO_ATTRIBS] =
  168.  {
  169.   {(CHARTYPE *)"black",3,COLOR_BLACK,0,FALSE,TRUE},
  170. #if 0
  171.   {(CHARTYPE *)"white",1,COLOR_WHITE,A_BOLD,FALSE,TRUE},
  172.   {(CHARTYPE *)"grey",3,COLOR_WHITE,0,FALSE,FALSE},
  173.   {(CHARTYPE *)"gray",3,COLOR_WHITE,0,FALSE,FALSE},
  174. #else
  175.   {(CHARTYPE *)"white",1,COLOR_WHITE,0,FALSE,TRUE},
  176.   {(CHARTYPE *)"grey",3,COLOR_BLACK,A_BOLD,FALSE,FALSE},
  177.   {(CHARTYPE *)"gray",3,COLOR_BLACK,A_BOLD,FALSE,FALSE},
  178. #endif
  179.   {(CHARTYPE *)"blue",3,COLOR_BLUE,0,FALSE,FALSE},
  180.   {(CHARTYPE *)"green",1,COLOR_GREEN,0,FALSE,FALSE},
  181.   {(CHARTYPE *)"cyan",1,COLOR_CYAN,0,FALSE,FALSE},
  182.   {(CHARTYPE *)"red",3,COLOR_RED,0,FALSE,FALSE},
  183.   {(CHARTYPE *)"magenta",1,COLOR_MAGENTA,0,FALSE,FALSE},
  184.   {(CHARTYPE *)"pink",1,COLOR_MAGENTA,A_BOLD,FALSE,FALSE},
  185.   {(CHARTYPE *)"brown",1,COLOR_YELLOW,0,FALSE,FALSE},
  186.   {(CHARTYPE *)"yellow",1,COLOR_YELLOW,A_BOLD,FALSE,FALSE},
  187.   {(CHARTYPE *)"turquoise",1,COLOR_CYAN,0,FALSE,FALSE},
  188.   {(CHARTYPE *)"normal",3,A_NORMAL,0,TRUE,TRUE},
  189.   {(CHARTYPE *)"blink",3,A_BLINK,0,TRUE,TRUE},
  190.   {(CHARTYPE *)"bold",2,A_BOLD,0,TRUE,TRUE},
  191.   {(CHARTYPE *)"bright",3,A_BOLD,0,TRUE,TRUE},
  192.   {(CHARTYPE *)"high",1,A_BOLD,0,TRUE,TRUE},
  193.   {(CHARTYPE *)"reverse",3,A_REVERSE,0,TRUE,TRUE},
  194.   {(CHARTYPE *)"underline",1,A_UNDERLINE,0,TRUE,TRUE},
  195.   {(CHARTYPE *)",",1,8,0,FALSE,TRUE},
  196.  };
  197.  
  198. /***********************************************************************/
  199. #ifdef HAVE_PROTO
  200. short parse_colours(CHARTYPE *attrib,COLOUR_ATTR *pattr,CHARTYPE **rem,bool spare,bool *any_colours)
  201. #else
  202. short parse_colours(attrib,pattr,rem,spare,any_colours)
  203. CHARTYPE *attrib;
  204. COLOUR_ATTR *pattr;
  205. CHARTYPE **rem;
  206. bool spare;
  207. bool *any_colours;
  208. #endif
  209. /***********************************************************************/
  210. {
  211. /*------------------------- external data -----------------------------*/
  212. extern bool colour_support;
  213. /*--------------------------- local data ------------------------------*/
  214.  register short i=0;
  215.  short num_colours=0;
  216.  chtype mono=pattr->mono;
  217.  chtype specified_mod=0L;
  218.  chtype fg=FOREFROMPAIR(pattr->pair);
  219.  chtype bg=BACKFROMPAIR(pattr->pair);
  220.  CHARTYPE *string=NULL;
  221.  CHARTYPE *p=NULL,*oldp=NULL;
  222.  bool found=FALSE,any_found=FALSE;
  223.  bool spare_pos=FALSE;
  224.  int offset=0;
  225. /*--------------------------- processing ------------------------------*/
  226. #ifdef TRACE
  227.  trace_function("colour.c:  parse_colours");
  228. #endif
  229. /*---------------------------------------------------------------------*/
  230. /* Get a copy of the passed string and wreck it rather than the passed */
  231. /* string.                                                             */
  232. /*---------------------------------------------------------------------*/
  233.  if ((string = (CHARTYPE *)my_strdup(attrib)) == NULL)
  234.    {
  235.     display_error(30,(CHARTYPE *)"",FALSE);
  236. #ifdef TRACE
  237.     trace_return();
  238. #endif
  239.     return(RC_OUT_OF_MEMORY);
  240.    }
  241.  oldp = string;
  242.  p = (CHARTYPE *)strtok((DEFCHAR *)string," \t");
  243.  while(p != NULL)
  244.    {
  245.     found = FALSE;
  246.     for (i=0;i<NO_ATTRIBS;i++)
  247.        {
  248.         if (equal(valid_attribs[i].attrib,p,valid_attribs[i].attrib_min_len))
  249.           {
  250.            any_found = found = TRUE;
  251.            if (!valid_attribs[i].attrib_allowed_on_mono
  252.            &&  !colour_support)
  253.              {
  254.               display_error(61,(CHARTYPE *)p,FALSE);
  255.               (*the_free)(string);
  256. #ifdef TRACE
  257.               trace_return();
  258. #endif
  259.               return(RC_INVALID_OPERAND);
  260.              }
  261.            if (valid_attribs[i].attrib_modifier)
  262.              {
  263.               if (colour_support)
  264.                  specified_mod = (valid_attribs[i].actual_attrib==A_NORMAL)?A_NORMAL:specified_mod | valid_attribs[i].actual_attrib;
  265.               else
  266.                  mono = (valid_attribs[i].actual_attrib==A_NORMAL)?A_NORMAL:mono | valid_attribs[i].actual_attrib;
  267.               offset = p-oldp+strlen((DEFCHAR *)p)+1;
  268.               break;
  269.              }
  270.            else
  271.              {
  272.               switch(num_colours)
  273.                 {
  274.                  case 0:
  275.                       if (!colour_support
  276.                       &&  valid_attribs[i].actual_attrib != COLOR_WHITE)
  277.                         {
  278.                          display_error(61,(CHARTYPE *)p,FALSE);
  279.                          (*the_free)(string);
  280. #ifdef TRACE
  281.                          trace_return();
  282. #endif
  283.                          return(RC_INVALID_OPERAND);
  284.                         }
  285.                       if (valid_attribs[i].actual_attrib != 8)
  286.                         {
  287.                          fg = valid_attribs[i].actual_attrib;
  288.                          specified_mod |= valid_attribs[i].colour_modifier;
  289.                         }
  290.                       num_colours++;
  291.                       offset = p-oldp+strlen((DEFCHAR *)p)+1;
  292.                       break;
  293.                  case 1:
  294.                       if (!colour_support
  295.                       &&  valid_attribs[i].actual_attrib != COLOR_BLACK)
  296.                         {
  297.                          display_error(61,(CHARTYPE *)p,FALSE);
  298.                          (*the_free)(string);
  299. #ifdef TRACE
  300.                          trace_return();
  301. #endif
  302.                          return(RC_INVALID_OPERAND);
  303.                         }
  304.                       if (valid_attribs[i].actual_attrib != 8)
  305.                         {
  306.                          bg = valid_attribs[i].actual_attrib;
  307.                         }
  308.                       num_colours++;
  309.                       offset = p-oldp+strlen((DEFCHAR *)p)+1;
  310.                       break;
  311.                  default:
  312.                       if (spare)
  313.                         {
  314.                          spare_pos = TRUE;
  315.                          *rem = (CHARTYPE *)attrib+offset;
  316.                          break;
  317.                         }
  318.                       display_error(1,(CHARTYPE *)p,FALSE);
  319.                       (*the_free)(string);
  320. #ifdef TRACE
  321.                       trace_return();
  322. #endif
  323.                       return(RC_INVALID_OPERAND);
  324.                       break;
  325.                 }
  326.               if (spare_pos)
  327.                  break;
  328.              }
  329.            break;
  330.           }
  331.        }
  332.     if (spare_pos && found)
  333.        break;
  334.     if (!found)
  335.       {
  336.        if (equal((CHARTYPE *)"on",p,2)
  337.        && num_colours == 1)
  338.           ;
  339.        else
  340.          {
  341.           if (spare)
  342.             {
  343.              *rem = (CHARTYPE *)attrib+offset;
  344.              break;
  345.             }
  346.           display_error(1,(CHARTYPE *)p,FALSE);
  347.           (*the_free)(string);
  348. #ifdef TRACE
  349.           trace_return();
  350. #endif
  351.           return(RC_INVALID_OPERAND);
  352.          }
  353.       }
  354.     p = (CHARTYPE *)strtok(NULL," \t");
  355.    }
  356.  
  357.  if (num_colours == 0)
  358.    pattr->pair = ATTR2PAIR(COLOR_WHITE,COLOR_BLACK);
  359.  else
  360.    pattr->pair = ATTR2PAIR(fg,bg);
  361.  pattr->mod = specified_mod;
  362.  pattr->mono = mono;
  363.  *any_colours = any_found;
  364.  (*the_free)(string);
  365. #ifdef TRACE
  366.  trace_return();
  367. #endif
  368.  return(RC_OK);
  369. }
  370. /***********************************************************************/
  371. #ifdef HAVE_PROTO
  372. chtype set_colour(COLOUR_ATTR *attr)
  373. #else
  374. chtype set_colour(attr)
  375. COLOUR_ATTR *attr;
  376. #endif
  377. /***********************************************************************/
  378. {
  379. /*------------------------- external data -----------------------------*/
  380.  extern bool colour_support;
  381. /*--------------------------- local data ------------------------------*/
  382.  chtype color=0;
  383. /*--------------------------- processing ------------------------------*/
  384. #ifdef TRACE
  385.  trace_function("colour.c:  set_colour");
  386. #endif
  387.  
  388.  color = attr->mono;
  389. #ifdef A_COLOR
  390.  if (colour_support)
  391.     color = (attr->pair) ? COLOR_PAIR(attr->pair) | attr->mod : attr->mod;
  392. #endif
  393.  
  394. #ifdef TRACE
  395.  trace_return();
  396. #endif
  397.  return(color);
  398. }
  399. /***********************************************************************/
  400. #ifdef HAVE_PROTO
  401. void set_up_default_colours(FILE_DETAILS *fd,COLOUR_ATTR *attr,int colour_num)
  402. #else
  403. void set_up_default_colours(fd,attr,colour_num)
  404. FILE_DETAILS *fd;
  405. COLOUR_ATTR *attr;
  406. int colour_num;
  407. #endif
  408. /***********************************************************************/
  409. /* This function is called as part of reading in a new file.           */
  410. /***********************************************************************/
  411. {
  412. /*------------------------- external data -----------------------------*/
  413.  extern short compatible_look;
  414. /*--------------------------- local data ------------------------------*/
  415.  register short i=0;
  416. /*--------------------------- processing ------------------------------*/
  417. #ifdef TRACE
  418.  trace_function("colour.c:  set_up_default_colours");
  419. #endif
  420. /*---------------------------------------------------------------------*/
  421. /* Set up default colours.                                             */
  422. /*---------------------------------------------------------------------*/
  423.  switch(compatible_look)
  424.    {
  425.     case COMPAT_THE:
  426.          if (colour_num == ATTR_MAX)
  427.            {
  428.             for (i=0;i<ATTR_MAX;i++)
  429.               {
  430.                fd->attr[i].pair = ATTR2PAIR(the_fore[i],the_back[i]);
  431.                fd->attr[i].mod = the_mod[i];
  432.                fd->attr[i].mono = the_mono[i];
  433.               }
  434.            }
  435.          else
  436.            {
  437.             attr->pair = ATTR2PAIR(the_fore[colour_num],the_back[colour_num]);
  438.             attr->mod = the_mod[colour_num];
  439.             attr->mono = the_mono[colour_num];
  440.            }
  441.          break;
  442.     case COMPAT_XEDIT:
  443.          if (colour_num == ATTR_MAX)
  444.            {
  445.             for (i=0;i<ATTR_MAX;i++)
  446.               {
  447.                fd->attr[i].pair = ATTR2PAIR(xedit_fore[i],xedit_back[i]);
  448.                fd->attr[i].mod = xedit_mod[i];
  449.                fd->attr[i].mono = xedit_mono[i];
  450.               }
  451.            }
  452.          else
  453.            {
  454.             attr->pair = ATTR2PAIR(xedit_fore[colour_num],xedit_back[colour_num]);
  455.             attr->mod = xedit_mod[colour_num];
  456.             attr->mono = xedit_mono[colour_num];
  457.            }
  458.          break;
  459.     case COMPAT_KEDIT:
  460.          if (colour_num == ATTR_MAX)
  461.            {
  462.             for (i=0;i<ATTR_MAX;i++)
  463.               {
  464.                fd->attr[i].pair = ATTR2PAIR(kedit_fore[i],kedit_back[i]);
  465.                fd->attr[i].mod = kedit_mod[i];
  466.                fd->attr[i].mono = kedit_mono[i];
  467.               }
  468.            }
  469.          else
  470.            {
  471.             attr->pair = ATTR2PAIR(kedit_fore[colour_num],kedit_back[colour_num]);
  472.             attr->mod = kedit_mod[colour_num];
  473.             attr->mono = kedit_mono[colour_num];
  474.            }
  475.          break;
  476.    }
  477. #ifdef TRACE
  478.  trace_return();
  479. #endif
  480.  return;
  481. }
  482. /***********************************************************************/
  483. #ifdef HAVE_PROTO
  484. CHARTYPE *get_colour_strings(COLOUR_ATTR *attr)
  485. #else
  486. CHARTYPE *get_colour_strings(attr)
  487. COLOUR_ATTR *attr;
  488. #endif
  489. /***********************************************************************/
  490. /* This function returns a pointer to an allocated block of memory with*/
  491. /* textual descriptions of the colours associated with the attr.       */
  492. /* The caller is responsible for freeing up the allocated memory.      */
  493. /***********************************************************************/
  494. {
  495. #define GET_MOD 0
  496. #define GET_FG  1
  497. #define GET_BG  2
  498. /*------------------------- external data -----------------------------*/
  499.  extern bool colour_support;
  500. /*--------------------------- local data ------------------------------*/
  501.  register int i=0,j=0;
  502.  CHARTYPE *attr_string=NULL;
  503.  int fg=FOREFROMPAIR(attr->pair),bg=BACKFROMPAIR(attr->pair);
  504.  chtype mod=attr->mono;
  505.  int start_with=0;
  506.  bool colour_only=FALSE;
  507.  chtype match_value=0L;
  508. /*--------------------------- processing ------------------------------*/
  509. #ifdef TRACE
  510.  trace_function("colour.c:  get_colour_strings");
  511. #endif
  512.  
  513.  start_with = GET_MOD;
  514. #ifdef A_COLOR
  515.  if (colour_support)
  516.    {
  517.     start_with = GET_MOD;
  518.     mod = attr->mod;
  519.    }
  520. #endif
  521.  attr_string = (CHARTYPE *)(*the_malloc)(sizeof(CHARTYPE)*70);
  522.  if (attr_string == (CHARTYPE *)NULL)
  523.    {
  524.     display_error(30,(CHARTYPE *)"",FALSE);
  525. #ifdef TRACE
  526.     trace_return();
  527. #endif
  528.     return(NULL);
  529.    }
  530.  strcpy((DEFCHAR *)attr_string,"");
  531.  for (j=start_with;j<3;j++)
  532.    {
  533.     switch(j)
  534.       {
  535.        case GET_FG:
  536.             colour_only = TRUE;
  537.             match_value = (chtype)fg;
  538.             break;
  539.        case GET_BG:
  540.             strcat((DEFCHAR *)attr_string,"on ");
  541.             colour_only = TRUE;
  542.             match_value = (chtype)bg;
  543.             break;
  544.        default:
  545.             colour_only = FALSE;
  546.             match_value = mod;
  547.             break;
  548.       }
  549.     for (i=0;i<NO_ATTRIBS;i++)
  550.       {
  551.        if (colour_only)
  552.          {
  553.           if (!valid_attribs[i].attrib_modifier
  554.           &&  match_value == (chtype)valid_attribs[i].actual_attrib)
  555.             {
  556.              strcat((DEFCHAR *)attr_string,(DEFCHAR *)valid_attribs[i].attrib);
  557.              strcat((DEFCHAR *)attr_string," ");
  558.              break;
  559.             }
  560.          }
  561.        else
  562.          {
  563.           if (valid_attribs[i].attrib_modifier
  564.           &&  (match_value & valid_attribs[i].actual_attrib))
  565.             {
  566.              strcat((DEFCHAR *)attr_string,(DEFCHAR *)valid_attribs[i].attrib);
  567.              strcat((DEFCHAR *)attr_string," ");
  568.              break;
  569.             }
  570.          }
  571.       }
  572.    }
  573. #ifdef TRACE
  574.  trace_return();
  575. #endif
  576.  return(attr_string);
  577. }
  578.