- 浏览: 234404 次
- 性别:
- 来自: 昆明
文章分类
最新评论
-
beiyangshuishi:
确实挺幽默的,太能恶搞了。不过这也让我想起日本的一则广告宣纸的 ...
一对活宝—— MySQL & PostgreSQL -
ShiningRay:
稍微看了vcf的api,比wxwidgets要干净得多
VCF 库的搞笑提示 -
Colorful:
Wow, this is amazing.
D语言 struct constrcutor 的 bug -
oldrev:
楼下,当时的 TRAC 确实说是要 py 2.4 的
出色的开源项目管理软件——Redmine -
jusdao:
...Trac可以用python2.5啊,没有说必须用2.4的 ...
出色的开源项目管理软件——Redmine
今天晚上费了点脑筋写了一个简单的 C2D 转换脚本,大致实现了函数申明、全局变量、typedef、enum、struct 和数组的转换,但是还不支持预处理、union、调用约定等。
我测试用的C语言头文件 hdr.c:
输出:
Have fun!
ruby 代码
- #!/bin/ruby
- require 'rexml/document'
- #TODO:
- # * 调用约定
- # * union
- # # 冲突关键字检查
- puts "c2d.rb 0.002 - A C to D Converter"
- puts "Written by Wei Li <oldrev<at>gmail.com>"
- puts "License: GPL"
- CFile = "hdr.c" #需要转换的 .h 或 .c 文件
- XmlFile = (CFile.map { |fn| fn += ".xml" }).to_s
- DVersion2 = false
- Cmd= "gccxml --gccxml-compiler \"gcc\" --gccxml-cxxflags \"-x c\" #{CFile} -fxml=#{XmlFile}"
- puts Cmd
- system Cmd
- puts "GCCXML 转换完成"
- class Generator
- def initialize(xml_file, writer)
- @writer = writer
- puts "正在加载 XML 文档"
- @xmlroot = REXML::Document.new(File.open(xml_file)).elements["GCC_XML"].elements
- builitin_ele = @xmlroot["File[contains(@name, 'gccxml_builtins.h')]"].attributes["id"]
- #去掉 GCCXML 内置的东西
- @xmlroot.delete_all "*[@file='#{builitin_ele}']"
- puts "完成"
- end
- def generate_linkage
- "extern(C)"
- end
- def generate_fundamental_type(type_ele)
- case type_ele.attributes["name"]
- when "short int" : "short"
- when "short unsigned int" : "ushort"
- when "int" : "int"
- when "long int" : "int"
- when "unsigned int" : "uint"
- when "long unsigned int" : "int"
- when "long long int" : "long"
- when "long long unsigned int" : "ulong"
- when "float" : "float"
- when "double" : "double"
- when "char" : "char"
- when "unsigned char" : "ubyte"
- when "signed char" : "byte"
- when "void" : "void"
- when "wchar_t" : if type_ele.attributes["size"] == "32" then "dchar" else "wchar" end
- when "signed wchar_t" : if type_ele.attributes["size"] == "32" then "int" else "short" end
- when "unsigned wchar_t" : if type_ele.attributes["size"] == "32" then "uint" else "ushort" end
- end
- end
- def generate_type(type_id)
- ele = @xmlroot["*[@id='#{type_id}']"]
- case ele.name
- when "FundamentalType" :
- generate_fundamental_type ele
- when "Struct"
- @xmlroot["*[@id='#{type_id}']"].attributes["name"]
- when "Typedef"
- @xmlroot["*[@id='#{type_id}']"].attributes["name"]
- when "FunctionType"
- generate_function_type(ele)
- #下面都是间接类型
- when "ArrayType"
- size = ele.attributes["max"].to_i - ele.attributes["min"].to_i + 1
- indirect_type = ele.attributes["type"]
- generate_type(indirect_type) + "[#{size}]"
- when "PointerType"
- indirect_type = ele.attributes["type"]
- #函数指针需要特殊处理
- if @xmlroot["*[@id='#{indirect_type}']"].name == "FunctionType"
- generate_type(indirect_type)
- else generate_type(indirect_type) + "*" end
- when "CvQualifiedType"
- indirect_type = ele.attributes["type"]
- if @xmlroot["*[@id='#{indirect_type}']"].name == "FundamentalType"
- "const " + generate_type(indirect_type)
- else
- if DVersion2 : "const(" + generate_type(indirect_type) + ")"
- else generate_type(indirect_type) end
- end
- end
- end
- def generate_parameters(funcEle)
- params = []
- funcEle.elements.each("Argument") { |arg|
- type_id = arg.attributes["type"]
- type = generate_type(type_id)
- name = arg.attributes["name"]
- params << if name : "#{type} #{name}" else "#{type}" end
- }
- if params.length == 1 then return params[0]
- else
- return params.join(", ")
- end
- end
- def generate_function_decl(e)
- return_type = generate_type(e.attributes["returns"])
- function_name = e.attributes["name"]
- parameters = generate_parameters(e)
- return "#{return_type} #{function_name}(#{parameters});\n"
- end
- def generate_function_type(e)
- return_type = generate_type(e.attributes["returns"])
- parameters = generate_parameters(e)
- return "#{return_type} function(#{parameters})"
- end
- def generate_fields(members)
- dcode = ""
- field_ids = []
- @xmlroot.each("Field") { |f| field_ids << f.attributes["id"] }
- members.each { |mid|
- if field_ids.include? mid then
- fe = @xmlroot["*[@id='#{mid}']"]
- type = generate_type(fe.attributes["type"])
- name = fe.attributes["name"]
- dcode << "\t#{type} #{name};\n"
- end
- }
- return dcode
- end
- def generate_struct(struct_ele)
- struct_name = struct_ele.attributes["name"]
- dcode = "\nstruct #{struct_name}\n"
- dcode << "{\n"
- dcode << generate_fields(struct_ele.attributes["members"].split(" ") )
- dcode << "};\n\n"
- return dcode
- end
- def generate_typedef_decl(typedef_ele)
- typedef_name = typedef_ele.attributes["name"]
- type = generate_type(typedef_ele.attributes["type"])
- dcode = "alias #{type} #{typedef_name};\n"
- return dcode
- end
- def generate_variable(var_ele)
- var_name = var_ele.attributes["name"]
- type = generate_type(var_ele.attributes["type"])
- init = var_ele.attributes["init"]
- dcode = "#{type} #{var_name}"
- if var_ele.attributes["extern"] then dcode = "extern #{dcode}" end
- if init then dcode = "#{dcode} = #{init}" end
- dcode = "#{dcode};\n"
- end
- def generate_enum(enum_ele)
- dcode = "enum " << enum_ele.attributes["name"] << " : int \n"
- dcode << "{\n"
- members = []
- enum_ele.elements.each("EnumValue") { |ev|
- evname = ev.attributes["name"]
- init = ev.attributes["init"]
- members << "\t#{evname} = #{init}"
- }
- if members.length <= 1
- dcode << members[0]
- else
- dcode << members.join(",\n")
- end
- dcode << "\n}\n"
- end
- def parse_node(node)
- @writer << case node.name
- when "Enumeration" : generate_enum node
- when "Function" : generate_function_decl node
- when "Struct" : generate_struct node
- when "Typedef" : generate_typedef_decl node
- when "Variable" : generate_variable node
- else ""
- end
- end
- def parse_all_nodes
- @xmlroot.each { |node|
- parse_node node
- }
- end
- end #end of class Generator
- dcode = ""
- gen = Generator.new( XmlFile, dcode)
- gen.parse_all_nodes
- puts dcode
我测试用的C语言头文件 hdr.c:
C代码
- #define DEFINE_CONST 123
- void foobar(double* x);
- double varD;
- unsigned long varL;
- wchar_t wc;
- struct Foo
- {
- int x;
- double y;
- long long z;
- };
- typedef Foo* FooPtr;
- typedef const Foo* ConstFooPtr;
- FooPtr myptr;
- Foo print(int x);
- Foo* print2(unsigned x, wchar_t y, long long z);
- Foo* print3(short x);
- Foo* print4(unsigned char x);
- void print5(unsigned x[]);
- void print6(FooPtr fp);
- void print7(const char* text);
- void print8(char** ppText);
- extern Foo g_foo;
- extern Foo g_foo10[10];
- extern int* g_pint20[20];
- static Foo s_foo;
- extern const double PI = 3.1415926;
- extern const char* TestString = "Hello";
- typedef void(*MyFuncPtr)(int x, long y, double z);
- enum MyEnum
- {
- Enum1 = 1,
- Enum2 = 2
- };
输出:
- c2d.rb 0.002 - A C to D Converter
- Written by Wei Li <oldrev<at>gmail.com>
- License: GPL
- gccxml --gccxml-compiler "gcc" --gccxml-cxxflags "-x c" hdr.c -fxml=hdr.c.xml
- GCCXML 转换完成
- 正在加载 XML 文档
- 完成
- enum MyEnum : int
- {
- Enum1 = 1,
- Enum2 = 2
- }
- alias void function(int, int, double) MyFuncPtr;
- const char* TestString = "Hello";
- const double PI = 3.14159260000000006840537025709636509418487548828e+0;
- Foo s_foo;
- extern int*[20] g_pint20;
- extern Foo[10] g_foo10;
- extern Foo g_foo;
- void print8(char** ppText);
- void print7(const char* text);
- void print6(FooPtr fp);
- void print5(uint* x);
- Foo* print4(ubyte x);
- Foo* print3(short x);
- Foo* print2(uint x, dchar y, long z);
- Foo print(int x);
- FooPtr myptr;
- alias Foo* ConstFooPtr;
- alias Foo* FooPtr;
- struct Foo
- {
- int x;
- double y;
- long z;
- };
- dchar wc;
- int varL;
- double varD;
- void foobar(double* x);
Requirements
- Ruby1.8: 废话
- GCCXML: Linux 直接使用包管理系统安装,Windows 可到 www.gccxml.org 下载安装程序
Have fun!
评论
9 楼
oldrev
2007-11-03
官网那个 htod 不开源,只能运行于Windows,这个Ruby程序可以作为一个补充。
8 楼
qiezi
2007-11-03
头文件转换是比较麻烦的,工具一般不能处理宏函数,这在C里面是很普遍的。而且工具通常需要把宏展开才能得到结果,展开后宏就没剩下原来的信息了。
7 楼
oldrev
2007-11-03
Ruby 脚本没法做成exe。
Ruby 在大多数 Linux、Mac OSX 都是系统内置的,这个脚本就是可执行文件。Windows 使用者可以自己去下载 gccxml/ruby 然后再设置路径,如果有耐心的话。
Ruby 在大多数 Linux、Mac OSX 都是系统内置的,这个脚本就是可执行文件。Windows 使用者可以自己去下载 gccxml/ruby 然后再设置路径,如果有耐心的话。
6 楼
tuja
2007-11-03
最好做成可执行文件, 同时用ruby和D的恐怕不是很多
5 楼
oldrev
2007-11-02
4 楼
oldrev
2007-10-30
0.004 发布,转换功能基本可用,不支持C++,需要 GCCXML和Ruby1.8。
尚未实现的功能:
* 预处理常量和宏
* 非C调用约定
* 自动生成多模块
* 对齐
* D2
下载:
http://dotmars.googlecode.com/svn/trunk/tools/htd/htd.rb
尚未实现的功能:
* 预处理常量和宏
* 非C调用约定
* 自动生成多模块
* 对齐
* D2
下载:
http://dotmars.googlecode.com/svn/trunk/tools/htd/htd.rb
3 楼
oldrev
2007-10-26
目前只差宏、预处理常量和调用约定了。
2 楼
ideage
2007-10-25
不错!支持!
1 楼
oldrev
2007-10-25
恩,预计这个星期以内就完全可以使用了。
发表评论
-
Tango 0.99.7 Dominik 今天放出
2008-07-25 12:16 1429详细的发布公告: http://www.dsource.org ... -
D新闻组里的天才代码
2008-03-30 21:26 3316超猛的代码,刚才逛新闻组刚看到的,随便记录一下。 出自: ... -
Ubuntu & D
2008-03-23 12:33 2443前几天 Ubuntu Linux 8.04 (Hardy) 刚 ... -
Dotmars.test 单元测试框架简介
2007-11-19 22:43 94D语言内置的 unittest关键字+assert 组成的单元 ... -
mixin 模拟多继承
2007-11-10 17:40 3720D1.0 代码 /** TupleMixin ... -
D1.0代码模拟 __traits(hasMember, ...)
2007-10-08 23:12 5153通过1.0的代码完全模拟了 D 2.0 __traits(ha ... -
更好的C++——给C++使用者的D语言简介
2007-09-14 01:30 12340作为 C++ 狂热的粉丝, ... -
让D代码自己编译自己
2007-09-12 22:55 4806刚在 D语言的新闻组里看到了D模板&元编程顶尖高人 ... -
Dotmars 实例之:容器、迭代器与算法框架
2007-08-03 23:49 5724Dotmars 实例之:容器、迭代器与算法框架 这几天 Mr. ... -
基于 D 2.0 编译时反射的单元测试框架
2007-07-27 21:25 2845一个模仿 Ruby Test::Unit 的 Quick &a ... -
D 2.0 Const/Final/Invariant 概念简介
2007-07-24 22:55 5473D 2.0 Const/Final/Invariant 概 ... -
DotMars 版 Hello World
2007-06-05 02:17 8240DotMars 已经具有初步的样子了,特别发帖庆祝。 Dot ... -
关联数组字面值+函数字面值=支持任意类型的 switch
2007-05-19 23:29 4564刚才写字符串格式化的由于要处理所有内置类型,而且只有 Type ... -
.Net/Java 风格格式化字符串
2007-05-18 22:51 3630基础类库的东西看起来容易做起来难,今天花时间实现了一点点 . ... -
修改版 juno.com.base
2007-04-20 00:28 4327dsource 上的 juno 是一个很不错的 Windows ... -
C#-like 的 DLL 封装
2007-04-16 23:19 4432一个类似 C# 的 DllImport 实现,用于“半”动态加 ... -
简单的D语言 VIM 缩写插件
2007-04-13 15:45 3514昨晚我写了一个非常简单的 VIM 的D语言缩写插件,希望能让用 ... -
双向链表模板类
2007-04-07 02:03 3074参考 STL 实现的 Quick & Dirty 双向 ... -
用Rant自动化D语言程序构建
2007-03-31 13:54 3273上回说到 Rank 这个 Ruby 世界最广泛使用的构建工具在 ... -
D语言通用 Rakefile
2007-03-31 00:21 2950在一个日文网站上发现的通用 Rakefile for GDCr ...
相关推荐
在"ruby脚本交互.rar"这个压缩包中,包含的可能是一份使用Ruby语言进行脚本交互的易语言源码。易语言是中国自主研发的一种简单易学的编程语言,它允许程序员用自然语言般的语法编写程序。下面我们将深入探讨Ruby脚本...
Ruby-ngxruby模块是Nginx服务器中的一个扩展,它允许开发者使用Ruby语言编写服务器端逻辑,从而增强Nginx的功能。Nginx以其高性能、轻量级的特性被广泛用于处理静态内容和反向代理任务,而通过ngx_ruby模块,Nginx...
Ruby脚本编辑器是一款专为Ruby编程语言设计的文本编辑工具,它提供了丰富的特性来帮助开发者高效地编写、调试和管理Ruby代码。在易语言源码的基础上,我们可以深入理解其功能实现,学习如何构建类似的开发工具。 ...
Ruby是一种面向对象的脚本语言,由松本行弘(Yukihiro "Matz" Matsumoto)发明于1993年,并在1995年公开发布。作为一种脚本语言,Ruby主要运行在服务器端进行网页开发、系统编程、命令行工具开发等。Ruby的特点在于...
易语言ruby脚本交互源码,ruby脚本交互,信息框_,加载内存DLL,释放内存DLL,取DLL导出函数地址,GetIntegerAddress,GetArrayDataAddress,脚本_直接执行,脚本_定义模块,脚本_初始化,脚本_定义类,脚本_定义类方法,脚本_...
这是一个将ruby脚本转换成二进制可执行文件的工具,使用简单方便,功能强大,解压编译后生成rubyc可执行程序!转换ruby脚本时 使用rubyc 脚本.rb即可,可以自动检测依赖关系!使用非常方便!
这是一个把ruby脚本代码转化为exe可执行文件转化后文件有点大。ruby2.0有望改进这方面的支持
本教程将深入探讨如何使用 Ruby 脚本搭建 Redis 集群。 首先,了解 Redis 集群的基本概念。Redis 集群是通过数据分片(Sharding)实现的,即将数据分散存储在多个节点上,每个节点负责一部分数据。这种方式能够确保...
Ruby教程 - 动态脚本语言的明珠 Ruby是一种高效且灵活的面向对象编程语言,由日本的松本行弘(Yukihiro Matsumoto)于1995年创建,旨在提供一种易于理解、简洁且强类型的编程体验。它的设计理念是结合Smalltalk的...
ruby脚本,用来分析case覆盖率,文件名,文件个数等等
Ruby是一种面向对象的脚本语言,它的设计目标是提供一种简单、易用的语言,以便开发者快速地创建程序。 Ruby的特点包括:动态类型、垃圾回收、闭包、块、Mixin等。 Ruby语言的名称来源于红宝石(Ruby),它是第四...
测试用 建立组织机构Ruby脚本 脚本基于GEPS接口,采用Ruby脚本编写;
《易语言源码与Ruby脚本编辑器的深度解析》 在编程领域,源码是理解软件工作原理的钥匙,而易语言作为一款中国本土化的编程语言,以其独特的语法和简洁的界面,深受初级和中级程序员的喜爱。同样,Ruby语言以其优雅...
Ruby脚本是一种可以在多种操作系统上运行的脚本语言,它结合了命令式、函数式和面向对象编程的最佳特性。本文将深入探讨Ruby脚本的概念、特点,并提供实际的代码示例来展示其实用性。 Ruby脚本是一种灵活、强大且...
易语言ruby脚本编辑器易语言源码.rar 易语言ruby脚本编辑器易语言源码.rar 易语言ruby脚本编辑器易语言源码.rar 易语言ruby脚本编辑器易语言源码.rar 易语言ruby脚本编辑器易语言源码.rar 易语言ruby脚本编辑器...
此压缩包“易语言源码易语言ruby脚本交互源码.rar”显然包含了与易语言相关的代码,特别是涉及到易语言与Ruby脚本之间的交互功能。 在编程领域,不同语言之间的交互是一个常见的需求,比如利用各自语言的优势处理...
本文将深入探讨Ruby脚本在Web开发中的多样化应用,从基础的Web服务器搭建到复杂的Web应用程序开发,以及Ruby脚本在性能优化和数据库操作中的关键作用。 Ruby脚本在Web开发中的应用广泛,从快速搭建Web服务器到开发...
在这个场景中,我们面临的是一个特定的问题:如何使用Ruby脚本进行“hackery”来手动修复损坏的HBase。通过分析标题和描述,我们可以推测这是一个关于使用Ruby编写脚本来解决HBase数据恢复的教程或工具包。 首先,...
Ruby脚本,用于将MP3文件转换为HLS流。 安装 将此行添加到您的应用程序的Gemfile中: gem 'mp3-to-hls' 然后执行: $ bundle 或将其自己安装为: $ gem install mp3-to-hls 用法 待办事项:在此处写下使用...
Ruby,作为一种灵活的脚本语言,提供了丰富的内置方法来处理文件的读写、属性修改以及其他相关的文件系统操作。本文将详细介绍如何在Ruby脚本中进行文件操作,包括文件的打开、读取、写入、关闭以及文件属性的查询等...