Sponsored Content
Top Forums Programming Using ANSI color codes in gcc compiled program Post 302632183 by Corona688 on Sunday 29th of April 2012 12:23:07 PM
Old 04-29-2012
I wrote some routines for printing ANSI colors inside printf like
Code:
 afprintf(stdout, "This word is ~&110RED~&R!\n");

It's just a translator built on top of standard printf, so should handle any of the usual % sequences. I do not claim that it's ideal or bug-free. Colors cannot be in arguments, only in the command string.

Source code:

Code:
/* ansi.h */
#ifndef __ANSI_H__
#define __ANSI_H__

#include <stdio.h>
#include <stdarg.h>

/**
 *      Simple ANSI sequences in C.
 *      example:  aprintf("This word is ~&110RED~&R!\n");
 *
 *      Commands:
 *      ~&R     Reset to defaults
 *      ~&C     Clear screen
 *      ~&111   Sets colors with attr,fg,bg.
 *              attr 0 is normal, attr 1 is bold, others are terminal-dependent.
 *              Colors are
 *              1=red 2=green 4=blue 3=yellow 5=mauve 6=cyan 7=grey/white
 */

int vafprintf(FILE *fp, const char *cmdstr, va_list ap);
int vasprintf(char *buf, const char *cmdstr, va_list ap);
int asprintf(char *buf, const char *cmdstr, ...);
int afprintf(FILE *fp, const char *cmdstr, ...);
int aprintf(const char *cmdstr, ...);
int aprintf(const char *cmdstr, ...);

#endif/*__ANSI_H__*/

Code:
/* ansi.c */

#include <stdio.h>
#include <stdarg.h>
#include <ctype.h>

#include "ansi.h"

#define ESC     "\x1b["

#if 0
int main(void){ afprintf(stdout, "This word is ~&110RED~&R!\n"); }
#endif

// Convert ~&R into \x1b[0m, etc
static void translate_ansi(char *lcmdstr, const char *cmdstr)
{
        int opos=0;

        while(*cmdstr)
        {
                const char *esc=NULL;
                int a,f,b;

                if(cmdstr[0] == '~')
                if(cmdstr[1] == '&')
                {
                        switch(toupper(cmdstr[2]))
                        {
                        // Can add other single-char sequences here
                        case 'R':       esc=ESC"0m";    break;
                        case 'C':       esc=ESC"2J";    break;
                        default:                        break;
                        }

                        if(esc)
                        {
                                opos+=sprintf(lcmdstr+opos, "%s", esc);
                                cmdstr+=3;
                                continue;
                        }

                        if(sscanf(cmdstr, "~&%01d%01d%01d", &a, &f, &b) == 3)
                        {
                                opos+=sprintf(lcmdstr+opos,
                                        ESC "%d;3%d;4%dm",
                                        a, f%8, b%8);
                                cmdstr += 5;
                                continue;
                        }
                }

                lcmdstr[opos++]=*(cmdstr++);
        }

        lcmdstr[opos]='\0';
}

int vafprintf(FILE *fp, const char *cmdstr, va_list ap)
{
        char lcmdstr[4096];
        translate_ansi(lcmdstr, cmdstr);
        return(vfprintf(fp, lcmdstr, ap));
}


int vasprintf(char *buf, const char *cmdstr, va_list ap)
{
        char lcmdstr[16384];
        translate_ansi(lcmdstr, cmdstr);
        return(vsprintf(buf, lcmdstr, ap));
}

int asprintf(char *buf, const char *cmdstr, ...)
{
        int ret;
        va_list ap;
        va_start(ap, cmdstr);
                ret=vasprintf(buf, cmdstr, ap);
        va_end(ap);

        return(ret);
}

int afprintf(FILE *fp, const char *cmdstr, ...)
{
        char buf[16384];
        int ret;
        va_list ap;

        va_start(ap, cmdstr);
                ret=vafprintf(fp, cmdstr, ap);
        va_end(ap);

        return(ret);
}

int aprintf(const char *cmdstr, ...)
{
        int ret;
        va_list ap;

        va_start(ap, cmdstr);
                ret=vafprintf(stdout, cmdstr, ap);
        va_end(ap);

        return(ret);
}

This User Gave Thanks to Corona688 For This Post:
 

10 More Discussions You Might Find Interesting

1. Linux

gcc compiled executable not working across x86_64 linux platforms

Hi I compiled a hello world program on two different 64-bit Linux machines, named quimby and node0331. When I compile on quimby and run on node0331 I get a "Floating exception (core dumped)" error. But if I do it in reverse, things work fine. Here's my compilation on quimby: $ uname -a... (3 Replies)
Discussion started by: same1290
3 Replies

2. UNIX for Dummies Questions & Answers

Using color escape codes in less

Hi all, Not sure how "for dummies" this question is, but I'd better use understatement... A. My Environment ============== I am using RedHat Linux, version 2.6.18-53.el5. When I type less --version I get: less 394 Copyright (C) 1984-2005 Mark Nudelman ... My terminal is configured... (1 Reply)
Discussion started by: Source2Exe
1 Replies

3. UNIX for Dummies Questions & Answers

Regular expression on hex color codes

I want to have all hex color codes in a given stylesheet in uppercase, so #fff should be converted to #FFF for instance. Here is the regular expression I use to match and convert hex color codes to uppercase: sed -e 's/^#({3}$)|({6}$)/^#({3}$)|({6}$)/' main.css However, no conversion to uppercase... (6 Replies)
Discussion started by: figaro
6 Replies

4. Programming

pthread_mutex_lock in ANSI C vs using Atomic builtins of GCC

I have a program which has 7-8 threads, and lots of shared variables; these variables (and also they may not the primitive type, they may be enum or struct ), then they may read/write by different threads at the same time. Now, my design is like this, typedef unsigned short int UINT16;... (14 Replies)
Discussion started by: sehang
14 Replies

5. Homework & Coursework Questions

Calling compiled C program with Perl program

Long story short: I'm working inside of a Unix SSH under a bash shell. I have to code a C program that generates a random number. Then I have to call the compiled C program with a Perl program to run the C program 20 times and put all the generated random #s into a text file, then print that text... (1 Reply)
Discussion started by: jdkirby
1 Replies

6. Shell Programming and Scripting

zsh, prompt, variable expansion, ANSI color sequences

Hi! I am using latest ZSH and I have setopt prompt_subst I have a global hash array variable which contains some color definitions with color names as keys and 256-color ANSI codes (with %{ and %}) as values, eg %{\ePS1="$FG Hello World (%M) > " or PS1=$'$FG Hello World (%M) > ' then it... (3 Replies)
Discussion started by: galanom
3 Replies

7. UNIX for Dummies Questions & Answers

Display file with escaped color codes

Hi, I have a file containing color codes: Fri May 25 17:13:04 2012: Starting MTA: exim4^ Loading cpufreq kernel modules...^How can I display it colorized on a linux terminal? (4 Replies)
Discussion started by: ripat
4 Replies

8. Solaris

Newly Compiled GCC 4.4.4 on Solaris sparc gives problem with -m32/-m64 flags

Hello experts, This issue has kept me busy all day long. It started off with openssl compilation which was giving linking error with following message: /usr/local/bin/ld: target elf32-sparc not found collect2: ld returned 1 exit status I tried every step possible thing that I could think... (2 Replies)
Discussion started by: d_shanke
2 Replies

9. Shell Programming and Scripting

Help with awk color codes based on condition

HI i have two files say test and test1 Test.txt Code: Lun01 2TB 1.99TB 99.6% Lun02 2TB 1.99TB 99.5% Lun03 2TB 1.99TB 99.5% Lun04 2TB 1.55TB 89.6% Code: Test1.txt Lun01 2TB 1.99TB 89.5% Lun02 2TB 1.99TB 99.5% Lun03 2TB 1.99TB 99.5% Requirement is to compare... (6 Replies)
Discussion started by: venkitesh
6 Replies

10. Programming

Local variable in a C function is not getting created in stack when its compiled with GCC

Hi, I am working in UEFI EDK2 Bios source. We created a platform related new package in the EDK2 source. I find a strange issue with the platform related code we added. When I did source level debugging I noticed the local variable in a C function is not getting created in stack when its... (6 Replies)
Discussion started by: Divya R
6 Replies
All times are GMT -4. The time now is 06:52 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy