ccRainbow输出库

ccRainbow输出库

起因

因为输出的好看一点对我来说是困难的,但是下学期有c语言程序设计课。为了作业不这么ugly。所以就写了一个可以在shell中简单输出颜色的工具

使用

github链接
gitee链接
见项目说明README

说明

功能

这个库里面仅有一个接口函数rainbow_print(char*)。实现了对字符串"{color-code}string...{color-code}string..."的输出并按照{color-code}为字符串上色.

实现

解析字符串

我们只是为标准输出函数printf套了一个壳,使用我们只需要解析出颜色代码即可.为了解析形如{red}的颜色代码,并将一个字符串以不同颜色分割为多个字符串。以经验来看可以使用栈来进行符号配对。

考虑解析情况

我们的解析分为两步:

  1. "{color1}string1....{color2}string2.....{color3}string3...."依次读取出"{color1}string1...." "{color2}string2..." "{color3}string3..."
  2. 将读取出的{color}string...解析为item.color = color-code item.context = string...
    为了完成上述的第一步,使用以下读取规则:

    若读入’{‘ 弹出栈中所有元素解析并输出
    若读入’\‘ 则检查是否为’{‘或’}‘ 若是则不触发栈操作,并正常压栈
    若读入’\0’ 则弹出栈中所有元素解析并输出并结束
    读入其他元素,则直接压入栈中
    为了完成上述的第二步,使用以下的解析规则
    仅解析获取字符串的第一个字符
    若解析到{ 则一直向后读取字符直到}并构成新的字符串,再将该字符串与颜色字符串匹配,若匹配成功,则返回对应的颜色代码,若匹配失败则返回null.

    若在读取中读取到了'\0'则抛出错误。
    解析颜色代码成功后,设置输出颜色,并将字符串输出
    若解析到了普通的字符,则直接将字符串输出

    格式控制符
    因为其本质还是使用printf进行输出,所以不需要重新编写格式控制符的解析器,只需在解析到%时一直读取字符直到读取到[d,e,u,s,c,p,...]等标志控制符末尾的字符时,将读取到的字符串按照对应的类型使用printf输出即可