printf("\x1b[コードmメッセージ");

2008 年 5 月 17 日 | カテゴリー: プログラム

2008051701.png

printf() にコードを指定すると、文字色や背景色を変えたりすることができるようです。
ただし変えた色は戻さないと継続します。

コードはセミコロンで区切ることで複数指定することが可能なようです。
太字で青で “Hello” を表示するなら printf(“\x1b[1;34mHello!"); 。

以下、自分用に用意したファイル。

printer.h

enum で数字部分を BLUE や RED と指定できるようにしてもよかったけれど、とりあえずコードを直接指定する形のままで。
使う方にはヘッダーファイルを読んでもらう前提。

/*****************************************
 * Program: printer.h
 * Author: sarian
 * Created on 2008/05/17
 *****************************************/

#ifndef _PRINTER_H
#define _PRINTER_H

/* =======================================
 * set default           code: 0
 * ======================================= */
void printer_initPrinter();

/* =======================================
 * change print type.
 * set type BOLD         code: 1
 * set type UNDER LINE   code: 4
 * set type BLINKING     code: 5
 * set type REVERSING    code: 7
 * ======================================= */
void printer_setType(int type);

/* =======================================
 * change print color.
 * set color BLACK      code: 30
 * set color RED        code: 31
 * set color GREEN      code: 32
 * set color YELLOW     code: 33
 * set color BLUE       code: 34
 * set color MAGENTA    code: 35
 * set color CYAN       code: 36
 * set color GRAY       code: 37
 * ======================================= */
void printer_setPrintColor(int color);

/* =======================================
 * change background color.
 * set color BLACK      code: 40
 * set color RED        code: 41
 * set color GREEN      code: 42
 * set color YELLOW     code: 43
 * set color BLUE       code: 44
 * set color MAGENTA    code: 45
 * set color CYAN       code: 46
 * set color GRAY       code: 47
 * ======================================= */
void printer_setBackgroundColor(int color);

#endif /* _PRINTER_H */

printer.c

一時的に色を変更するような、引数に色を指定できるような仕様だといいのに。
と、書いた瞬間にそういうの作ればいいのかと気づいたわけですが。
printer_colorPrint(char *message, int color);
でもフォーマット指定できない printf なんて意味ないし、
前の色を保存しておかないと、使い終わった後勝手にデフォルトにするのもマズいし保留。

/*****************************************
 * Program: printer.c
 * Author: sarian
 * Created on 2008/05/17
 *****************************************/

#include <stdio.h>
#include "printer.h"

/**
 * default printer color.
 */
void printer_initPrinter() {
    printf("\x1b[0m"); /* DEFAULT */
}

/**
 * set print type.
 * @param type
 */
void printer_setPrintType(int type) {

    switch(type) {

        case 1:
            printf("\x1b[1m"); /* BOLD */
            break;
        case 4:
            printf("\x1b[4m"); /* UNDER LINE */
            break;
        case 5:
            printf("\x1b[31m"); /* BLINKING */
            break;
        case 7:
            printf("\x1b[31m"); /* REVERSING */
            break;
        default:
            break;
    }
}

/**
 * change print color.
 * @param color
 */
void printer_setPrintColor(int color) {

    switch(color) {

        case 30:
            printf("\x1b[30m"); /* BLACK */
            break;
        case 31:
            printf("\x1b[31m"); /* RED */
            break;
        case 32:
            printf("\x1b[32m"); /* GREEN */
            break;
        case 33:
            printf("\x1b[33m"); /* YELLOW */
            break;
        case 34:
            printf("\x1b[34m"); /* BLUE */
            break;
        case 35:
            printf("\x1b[35m"); /* MAGENTA */
            break;
        case 36: /* CYAN */
            printf("\x1b[36m");
            break;
        case 37: /* GRAY */
            printf("\x1b[37m");
            break;
        default:
            break;
    }
}

/**
 * change background color.
 * @param color
 */
void printer_setBackgroundColor(int color) {

    switch(color) {

        case 40:
            printf("\x1b[40m"); /* BLACK*/
            break;
        case 41:
            printf("\x1b[41m"); /* RED */
            break;
        case 42:
            printf("\x1b[42m"); /* GREEN */
            break;
        case 43:
            printf("\x1b[43m"); /* YELLOW */
            break;
        case 44:
            printf("\x1b[44m"); /* BLUE */
            break;
        case 45:
            printf("\x1b[45m"); /* MAGENTA */
            break;
        case 46: /* CYAN */
            printf("\x1b[46m");
            break;
        case 47: /* GRAY */
            printf("\x1b[47m");
            break;
        default:
            break;
    }
}

main.c

使い方はこんなかんじ。
colorgcc とかカラフルなのは好きなので、今後コンソールアプリケーションを作る際にはちょっと意識してみるつもり。

/*****************************************
 * Program: main.c
 * Author: sarian
 * Created on 2008/05/17
 *****************************************/

#include <stdio.h>
#include <stdlib.h>
#include "printer.h"

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

    printer_setPrintColor(30);
    printf(“BLACK\n”);

    printer_setPrintColor(31);
    printf(“RED\n”);

    printer_setPrintColor(32);
    printf(“GREEN\n”);

    printer_setPrintColor(33);
    printf(“YELLOW\n”);

    printer_setPrintColor(34);
    printf(“BLUE\n”);

    printer_setPrintColor(35);
    printf(“MAGENTA\n”);

    printer_setPrintColor(36);
    printf(“CYAN\n”);

    printer_setPrintColor(37);
    printf(“GRAY\n”);

    printer_initPrinter();
    printf(“DEFAULT\n”);

    return EXIT_SUCCESS;
}

コンパイルと実行

$ gcc -Wall printer.c main.c -o PrintDemo
$ ./PrintDemo
  1. 梅蔵
    2008 年 5 月 18 日 11:49

    printf(“\x1b[%dm” , color);じゃだめなの?

  2. 梅蔵
    2008 年 5 月 18 日 11:51

    と、思ったけど何カ所か無理なとこがあったね。
    #コメント削除できないのね。

  3. さりあん
    2008 年 5 月 18 日 15:13

    アー。それでいけるね。
    逆に、無理なところってなんだろ。

    # コメ削除はアカウント管理しないといけないしね。管理者権限で削除はできるけど。