ANSI colors in C and ncurses
ansi-escape, c, colors, ncurses
Solution
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.
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 as copy):
while s not empty:
p = position of first ansi-sequence in s
if p == NULL exit while
printw first p characters of s
remove the first p characters from s
decode ansi-sequence at start of s
issue relevant attron/off for that ansi-sequence
remove ansi-sequence from start of s
endwhile
output s though it may be empty
enddef
This would basically break down the string into normal character sequences and ansi-sequences and you'd process each separately.
It would require a lookup table (or smarts if you need to handle ANSI sequences with arbitrary parameters) in order to translate the sequences into the desired `attron/off` calls.
Problem
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.