6
votes

I know I can do the attron and attroff with the color I choose to, however, I would like to know if it's possible to do it with the ANSI colour escape codes within ncurses:

#include <stdio.h>
#include <ncurses.h>

int main()
{
   initscr();
   char *s2 = NULL;
   const char *s1 = "World";
   int n = 10; 

   // What would be a good way to colour %d?
   // seems it is not safe to us the ANSI color escape in here...
   s2 = malloc (snprintf (NULL, 0, "Hello %s \033[22;31m%d", s1, n) + 2); 
   sprintf (s2, "Hello %s \033[22;31m%d", s1, n); 
   printw("%s", s2);
   refresh();
   getch();
   endwin();

   return 0;
}

Linking with -lncurses

a regular printf("\033[22;31mHello, World!\n"); in a non-ncurses program works.

5

5 Answers

3
votes

I think you're probably straying into dangerous territory there. Curses will almost certainly track character positions based on output characters and, since it provides its own colour handling, it probably won't detect ANSI escape sequences as well.

It may work (did you try it?) but it may also stuff up the window management altogether.


And, since you stated in a comment that it didn't work then I guess the answer would be "no" :-)

If you're after a possible way to allow the ANSI escape sequences in your strings, then one way (kludge though it is) would be to intercept the string and modify it. Have a helper function like myPrintW() which takes a string and breaks it down, something like (pseudo-code):

def myPrintW(s):
    while s not end of string:
        s2 = position of color-change-sequence in s
        if s2 == NULL exit while
        printw characters from s (inclusive) to s2 (exclusive)
        decode color-change-sequence at s2 and issue relevant attron/off
        s = s2 + length of color-change-sequence
    endwhile
enddef

This would basically break down the string into normal character sequences and color-change-sequences and you'd process each separately. It would require a lookup table in order to translate the sequences into the desired attron/off calls. Not pretty, but sometimes pragmatism is best.

1
votes

Yes. It all depends on what kind of software or firmware is listening to the program's output. For V3.3 MSDOS, no, it won't work unless the device driver ansi.sys is loaded.

Modern terminal windows tend to have ANSI x3.64 semantics, so those escape sequences will often work. But don't expect too much: extra wide and extra high characters are notoriously poorly supported.

1
votes

It won't be too safe integrating ANSI on ncurses. You want to use attron/off calls and perhaps split the string into %s and %d. For > 2 conversions, you need to implement your own printw

0
votes

Here is Code

#include <stdio.h>

#define ANSI_COLOR_RED     "\x1b[31m"
#define ANSI_COLOR_GREEN   "\x1b[32m"
#define ANSI_COLOR_YELLOW  "\x1b[33m"
#define ANSI_COLOR_BLUE    "\x1b[34m"
#define ANSI_COLOR_MAGENTA "\x1b[35m"
#define ANSI_COLOR_CYAN    "\x1b[36m"
#define ANSI_COLOR_RESET   "\x1b[0m"

int main (int argc, char const *argv[]) {

  printf(ANSI_COLOR_RED     "This text is RED!"     ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_GREEN   "This text is GREEN!"   ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_YELLOW  "This text is YELLOW!"  ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_BLUE    "This text is BLUE!"    ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_MAGENTA "This text is MAGENTA!" ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_CYAN    "This text is CYAN!"    ANSI_COLOR_RESET "\n");

  return 0;
}