| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 2996 人关注过本帖
标题:[开源] ★-----C语法高亮程序-------★
收藏  订阅  推荐  打印 
本主题由 卧龙孔明 于 2008-5-30 07:15 加入精华
VxWorks
Rank: 4
来自:WindRiver
等级:高级会员
威望:1
帖子:575
积分:6978
注册:2007-11-24
[开源] ★-----C语法高亮程序-------★

见论坛里雨中飞燕和RockCarry都做了语法高亮程序,偶一时手痒也做了一个。

用了5天时间完成,一天时间查阅ANSI C资料,做总体设计,一天时间编码,三天时间测试,除虫,写文档。
今天解决了处理预编译指令时的一个BUG,没有再发现错误,移植到windows下编译出win32版。

软件以GPL协议发布,任何人有权向发布者索取源代码。
任何人有权做出修改并重新发布自己的版本,但也必须以GPL协议发布。
你可以从这里下载移植后的windows/dos版源码,以及原始的Unix版源码。
还可以向vx.fish@gmail.com发送邮件,报告bug或索取源码。

这是Unix版源码,提供最丰富完整的文档资料:

这是移植后的windows版源码:

考虑到windows下编译不方便,这里提供编译后的win32版可执行程序:
                      (17:28分修改配置文件bccn.conf后重新上传)

Unix类系统用户在下载源码后可以编译安装:
程序代码:
# make
# make install
详情请阅读附带的INSTALL文件,安装后可以使用命令man fish获取联机帮助

windows用户请使用fish -h获取帮助,也可以阅读楼下的使用示例。

《========================================================================》
                                       NEWS
2008.05.28  晚上19:30
       更新了所有版本中bccn.conf的小错误。之前在颜色设置中误删字符a,使得预处理不能着色,
全部重新修改后上传,真是一失手成千古恨。

《========================================================================》

[ 本帖最后由 VxWorks 于 2008-5-28 19:33 编辑 ]
附件: 只有本站会员才能下载或查看附件,请您 登录注册
搜索更多相关主题的帖子: 高亮  语法  windows  源代码  BUG  
2008-5-28 16:56
VxWorks
Rank: 4
来自:WindRiver
等级:高级会员
威望:1
帖子:575
积分:6978
注册:2007-11-24

windows下使用实例:
切换到fish.exe所在文件夹下在命令行下运行fish.exe
程序代码:
fish  -i bc.c  -c bccn.conf  -o bc.txt
bc.c是下面显示的c程序,用来做测试用的,使用选项-i指定要高亮的源程序输入
bccn.conf是为bccn.net论坛写的配置文件,你可以用记事本打开修改配色方案。
-o指定输出文件,这里输出文件是bc.txt

可以使用下面的命令获取帮助:
程序代码:
fish   -h
将输出的bc.txt直接贴上论坛就可以了。

生成的bc.txt内容是:
程序代码:
[color=a020f0]#include[/color][color=ff00ff]<assert.h>[/color]
[color=a020f0]#include[/color][color=ff00ff]<stdlib.h>[/color]
[color=2e8b57]int[/color] [color=000000]get_tag[/color]([color=2e8b57]char[/color] *[color=000000]buf[/color], [color=2e8b57]int[/color] [color=000000]index[/color],[color=2e8b57]char[/color] [color=000000]opt[/color])
{
        [color=2e8b57]char[/color] *[color=000000]dest[/color];
        [color=2e8b57]const[/color] [color=2e8b57]char[/color] *[color=000000]SectionName[/color]=[color=000000]sections[/color][[color=000000]index[/color]];

        [color=000000]assert[/color]([color=000000]opt[/color]==[color=ff00ff]'s'[/color] || [color=000000]opt[/color]==[color=ff00ff]'e'[/color]);
        [color=2e8b57]if[/color]([color=000000]opt[/color] == [color=ff00ff]'s'[/color])
                [color=000000]dest[/color]=[color=000000]tag_list[/color][[color=000000]index[/color]].[color=000000]start[/color];
        [color=2e8b57]else[/color]
                [color=000000]dest[/color]=[color=000000]tag_list[/color][[color=000000]index[/color]].[color=000000]end[/color];

        [color=2e8b57]while[/color](*[color=000000]buf[/color] != [color=ff00ff]'!'[/color] && *[color=000000]buf[/color] != [color=ff00ff]'\0'[/color])
                ++[color=000000]buf[/color];

        [color=2e8b57]if[/color](*[color=000000]buf[/color] == [color=ff00ff]'\0'[/color])
        {
                [color=2e8b57]if[/color]([color=000000]opt[/color] == [color=ff00ff]'s'[/color])
                        [color=000000]fprintf[/color]([color=000000]stderr[/color],[color=ff00ff]"配置文件错误:%s\nstart = \n"[/color],[color=000000]SectionName[/color]);
                [color=2e8b57]else[/color]
                        [color=000000]fprintf[/color]([color=000000]stderr[/color],[color=ff00ff]"配置文件错误:%s\nend = \n"[/color],[color=000000]SectionName[/color]);
                [color=000000]exit[/color]([color=ff00ff]1[/color]);
        }

        [color=000000]strncpy[/color]([color=000000]dest[/color],++[color=000000]buf[/color],[color=ff00ff]40[/color]);

        [color=2e8b57]return[/color] [color=ff00ff]0[/color];
}
将输出的bc.txt直接贴出来即可:


#include<assert.h>
#include<stdlib.h>
int get_tag(char *buf, int index,char opt)
{
        char *dest;
        const char *SectionName=sections[index];

        assert(opt=='s' || opt=='e');
        if(opt == 's')
                dest=tag_list[index].start;
        else
                dest=tag_list[index].end;

        while(*buf != '!' && *buf != '\0')
                ++buf;

        if(*buf == '\0')
        {
                if(opt == 's')
                        fprintf(stderr,"配置文件错误:%s\nstart = \n",SectionName);
                else
                        fprintf(stderr,"配置文件错误:%s\nend = \n",SectionName);
                exit(1);
        }

        strncpy(dest,++buf,40);

        return 0;
}

当然也可以向下面这样在bc.txt文件首尾加入
程序代码:
[quote][/quote]
添加边框。
添加后的内容是:
程序代码:
[quote]
[color=a020f0]#include[/color][color=ff00ff]<assert.h>[/color]
[color=a020f0]#include[/color][color=ff00ff]<stdlib.h>[/color]
[color=2e8b57]int[/color] [color=000000]get_tag[/color]([color=2e8b57]char[/color] *[color=000000]buf[/color], [color=2e8b57]int[/color] [color=000000]index[/color],[color=2e8b57]char[/color] [color=000000]opt[/color])
{
        [color=2e8b57]char[/color] *[color=000000]dest[/color];
        [color=2e8b57]const[/color] [color=2e8b57]char[/color] *[color=000000]SectionName[/color]=[color=000000]sections[/color][[color=000000]index[/color]];

        [color=000000]assert[/color]([color=000000]opt[/color]==[color=ff00ff]'s'[/color] || [color=000000]opt[/color]==[color=ff00ff]'e'[/color]);
        [color=2e8b57]if[/color]([color=000000]opt[/color] == [color=ff00ff]'s'[/color])
                [color=000000]dest[/color]=[color=000000]tag_list[/color][[color=000000]index[/color]].[color=000000]start[/color];
        [color=2e8b57]else[/color]
                [color=000000]dest[/color]=[color=000000]tag_list[/color][[color=000000]index[/color]].[color=000000]end[/color];

        [color=2e8b57]while[/color](*[color=000000]buf[/color] != [color=ff00ff]'!'[/color] && *[color=000000]buf[/color] != [color=ff00ff]'\0'[/color])
                ++[color=000000]buf[/color];

        [color=2e8b57]if[/color](*[color=000000]buf[/color] == [color=ff00ff]'\0'[/color])
        {
                [color=2e8b57]if[/color]([color=000000]opt[/color] == [color=ff00ff]'s'[/color])
                        [color=000000]fprintf[/color]([color=000000]stderr[/color],[color=ff00ff]"配置文件错误:%s\nstart = \n"[/color],[color=000000]SectionName[/color]);
                [color=2e8b57]else[/color]
                        [color=000000]fprintf[/color]([color=000000]stderr[/color],[color=ff00ff]"配置文件错误:%s\nend = \n"[/color],[color=000000]SectionName[/color]);
                [color=000000]exit[/color]([color=ff00ff]1[/color]);
        }

        [color=000000]strncpy[/color]([color=000000]dest[/color],++[color=000000]buf[/color],[color=ff00ff]40[/color]);

        [color=2e8b57]return[/color] [color=ff00ff]0[/color];
}
[/quote]
添加边框后的效果如下:
#include<assert.h>
#include<stdlib.h>
int get_tag(char *buf, int index,char opt)
{
        char *dest;
        const char *SectionName=sections[index];

        assert(opt=='s' || opt=='e');
        if(opt == 's')
                dest=tag_list[index].start;
        else
                dest=tag_list[index].end;

        while(*buf != '!' && *buf != '\0')
                ++buf;

        if(*buf == '\0')
        {
                if(opt == 's')
                        fprintf(stderr,"配置文件错误:%s\nstart = \n",SectionName);
                else
                        fprintf(stderr,"配置文件错误:%s\nend = \n",SectionName);
                exit(1);
        }

        strncpy(dest,++buf,40);

        return 0;
}
[ 本帖最后由 VxWorks 于 2008-5-28 18:13 编辑 ]

Yesterday is a history, tomorrow is a mystery, and now is a gift, that's why is called present.
2008-5-28 17:05
Loli
Rank: 3Rank: 3
来自:飞燕算法群46520219
等级:中级会员
帖子:348
积分:3862
注册:2008-5-27

占个位置先。。。。。

[color=white]

论坛http://yzfy.org 我的QQ号1007665007
Loli算法讨论QQ群: 3996098(每周有教学课) 46520219 57909089
2008-5-28 17:10
Loli
Rank: 3Rank: 3
来自:飞燕算法群46520219
等级:中级会员
帖子:348
积分:3862
注册:2008-5-27

非Win32图形界面啊。。。只好做插件了
/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) [url]http://yzfy.org[/url] **
*****************************************************************/
#include<assert.h>
#include<stdlib.h>
int get_tag(char *buf, int index,char opt)
{
   
char *dest;
    const char *SectionName=sections[index];
    int i=0;

    assert(opt=='s' || opt=='e');
    if (opt == 's')
        dest=tag_list[index].start;
    else
        
dest=tag_list[index].end;

    while (buf[i] != '!' && buf[i] != '\0')
        ++buf;

    if (buf[i] == '\0')
    {
        
if (opt == 's')
            fprintf(stderr,"配置文件错误:%s\nstart = \n",SectionName);
        else
            
fprintf(stderr,"配置文件错误:%s\nend = \n",SectionName);
        exit(1);
    }
   
strncpy(dest,++buf,40);
    return 0;
}
这个呢?

论坛http://yzfy.org 我的QQ号1007665007
Loli算法讨论QQ群: 3996098(每周有教学课) 46520219 57909089
2008-5-28 17:19
VxWorks
Rank: 4
来自:WindRiver
等级:高级会员
威望:1
帖子:575
积分:6978
注册:2007-11-24

sigh,3楼贴出来的着色又有问题,还是预处理。
不过还好,这次问题不在程序,是配置文件错了,修改方法:
程序代码:
用文本编辑器打开bccn.conf找到[preprocess]段,
将start =[color=020f0]修改为start =[color=a020f0]
附带的另一个html.conf没有问题,可以生成完整的html网页。

楼上的,我的着色是模仿大多数编辑器的方案,只对关键字,常量,注释,预处理指令进行处理。

[ 本帖最后由 VxWorks 于 2008-5-28 17:25 编辑 ]

Yesterday is a history, tomorrow is a mystery, and now is a gift, that's why is called present.
2008-5-28 17:21
切忌浮躁
Rank: 1
等级:新手上路
帖子:29
积分:434
注册:2008-5-28
试下

#include <stdio.h>
#define  max(a,b) \
(a)>(b)?(a):(b);


int test1()
{
        int a=1;
        int b=0x2efd;

        double f1=0.2548;
        double f2=0.2e3;
        double f3=5.4E5;

        char *string="hello\n";         /*hello world*/        
        printf("hello wold");        //hello   你好  
        return 0;
}


int test2()
{
        
        char *string="hello\n\";     /*hello world*/
    
    printf(\"hello wold"
);        //hello world

        return 0;
}
2008-5-28 17:22
切忌浮躁
Rank: 1
等级:新手上路
帖子:29
积分:434
注册:2008-5-28
这个是怎么的

将start =修改为start =
这个是怎么改?
2008-5-28 17:27
VxWorks
Rank: 4
来自:WindRiver
等级:高级会员
威望:1
帖子:575
积分:6978
注册:2007-11-24

看6楼
或者重新下载,我已经更新了fish_win32.rar文件

Yesterday is a history, tomorrow is a mystery, and now is a gift, that's why is called present.
2008-5-28 17:33
Loli
Rank: 3Rank: 3
来自:飞燕算法群46520219
等级:中级会员
帖子:348
积分:3862
注册:2008-5-27

请问一下楼主,有考虑过什么标签合并的问题么?

[color=white]

论坛http://yzfy.org 我的QQ号1007665007
Loli算法讨论QQ群: 3996098(每周有教学课) 46520219 57909089
2008-5-28 17:37
VxWorks
Rank: 4
来自:WindRiver
等级:高级会员
威望:1
帖子:575
积分:6978
注册:2007-11-24

大家可以使用下面的命令:
程序代码:
[VxWorks @ WinXP] D:\home\fish_win32#fish -i bc.c
只指定输入,默认使用html.conf配置文件输出一个web网页,然后就可以将着色后的代码贴到自己博客或个人空间。
你也可以建立自己的配置文件,通过-c指示程序读取。

关于命令行选项的用法使用命令fish -h获取帮助。
Unix类用户man fish可以获取更详细的资料。

Yesterday is a history, tomorrow is a mystery, and now is a gift, that's why is called present.
2008-5-28 17:39
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.076088 second(s), 10 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved