fwi 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/fwi.gemspec +1 -1
- data/lib/fwi/compiler.rb +10 -4
- data/lib/fwi/{cpp → compilers/cpp}/compiler.rb +1 -3
- data/lib/fwi/{cpp → compilers/cpp}/gen.rb +0 -0
- data/lib/fwi/compilers/js/compiler.rb +24 -0
- data/lib/fwi/compilers/js/gen.rb +174 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eae98e13b6ec9a8846176fa727bbb962397b1c5f
|
4
|
+
data.tar.gz: 7352bb31bed27f0a41cc332f59276bc57bf35b70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 675e87dea63eb8189a13de38e72b00b85c14bbfe84d83463c56f13272671bce276aa4bf558152294d596a96f4f9f8590e9cdc9c9666956de41612f59db1022ea
|
7
|
+
data.tar.gz: a2a3deb6e44f6d372b9ec90bcd2f45aff0fc5dd33f9a9e93f8fb11910432aa56f631020b1f1ff8f608547a3efd1a72f4bf65f847f05b44e4557c5be03dc79645
|
data/Gemfile
CHANGED
data/fwi.gemspec
CHANGED
data/lib/fwi/compiler.rb
CHANGED
@@ -1,13 +1,17 @@
|
|
1
|
-
|
1
|
+
require 'fwi/compilers/cpp/compiler.rb'
|
2
|
+
require 'fwi/compilers/js/compiler.rb'
|
3
|
+
# require_relative 'js/compiler.rb'
|
4
|
+
|
2
5
|
require_relative 'parser.rb'
|
3
6
|
require 'optparse'
|
4
7
|
|
5
8
|
COMPILERS = {
|
6
|
-
"cpp" => CPPCompiler.new
|
9
|
+
"cpp" => CPPCompiler.new,
|
10
|
+
"js" => JSCompiler.new
|
7
11
|
};
|
8
12
|
|
9
13
|
options = {
|
10
|
-
:source_root => "."
|
14
|
+
:source_root => ".", :output => "."
|
11
15
|
}
|
12
16
|
optp = OptionParser.new do |opts|
|
13
17
|
|
@@ -24,10 +28,12 @@ optp = OptionParser.new do |opts|
|
|
24
28
|
options[:language] = lang
|
25
29
|
end
|
26
30
|
|
27
|
-
opts.on("-d", "--source-
|
31
|
+
opts.on("-d", "--source-dir [DIRECTORY]", "Set the source directory to pull files from") do |directory|
|
28
32
|
options[:source_root] = directory
|
29
33
|
end
|
30
34
|
|
35
|
+
opts.on("-o", "--output [DIRECTORY]", "Directory to put Generated Files") { |x| options[:output] = x }
|
36
|
+
|
31
37
|
COMPILERS.each do |n,x|
|
32
38
|
opts.separator ""
|
33
39
|
opts.separator n
|
File without changes
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative 'gen.rb'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
class JSCompiler
|
5
|
+
GEN = FWI::Generator::JS.new
|
6
|
+
|
7
|
+
def populate_options o
|
8
|
+
end
|
9
|
+
|
10
|
+
def after_parse; end
|
11
|
+
def on_selected; end
|
12
|
+
|
13
|
+
def compile file, lex, bitmap, options
|
14
|
+
base = File.basename(file, File.extname(file))
|
15
|
+
|
16
|
+
files = GEN.gen bitmap
|
17
|
+
files.each do |fn, contents|
|
18
|
+
f = File.join(options[:output], fn)
|
19
|
+
FileUtils.mkdir_p File.expand_path("..", f)
|
20
|
+
File.write(f, contents)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
module FWI
|
2
|
+
module Generator
|
3
|
+
class JS
|
4
|
+
def append buffer, indent, string
|
5
|
+
string.split(/\n/).each { |y| buffer << ("\t" * indent) + y + "\n" }
|
6
|
+
end
|
7
|
+
|
8
|
+
def _func_util obj, member, mode
|
9
|
+
type = member[:type]
|
10
|
+
internal_type = type.to_s
|
11
|
+
internal_type = "child" if type == :reference && member[:element_type] == :block
|
12
|
+
internal_type = "u8" if type == :reference && member[:element_type] == :enum
|
13
|
+
|
14
|
+
param = member[:array].nil? ? "" : "int index#{mode == :setter ? ', ' : ''}"
|
15
|
+
custom_getter = member[:attribute_map]["getter"]
|
16
|
+
custom_setter = member[:attribute_map]["setter"]
|
17
|
+
custom_length = member[:attribute_map]["length_func"]
|
18
|
+
|
19
|
+
func_name = nil
|
20
|
+
func_sig = nil
|
21
|
+
if mode == :setter
|
22
|
+
func_name = custom_setter.nil? ? "set_#{member[:name]}" : custom_setter
|
23
|
+
func_sig = "function(#{param}value) {"
|
24
|
+
elsif mode == :getter
|
25
|
+
func_name = custom_getter.nil? ? "get_#{member[:name]}" : custom_getter
|
26
|
+
func_sig = "function(#{param}) {"
|
27
|
+
elsif mode == :length
|
28
|
+
func_name = custom_length.nil? ? "#{member[:name]}_length" : custom_length
|
29
|
+
func_sig = "function(#{param}) {"
|
30
|
+
end
|
31
|
+
|
32
|
+
index = member[:index]
|
33
|
+
index = "#{index} + (#{member[:typesize]} * index)" unless member[:array].nil?
|
34
|
+
{ :internal_type => internal_type, :index => index, :func_name => func_name, :func_sig => func_sig }
|
35
|
+
end
|
36
|
+
|
37
|
+
def write_getter obj, member, str, indent
|
38
|
+
return "" if member[:attributes].include? "no-getter"
|
39
|
+
util = _func_util(obj, member, :getter)
|
40
|
+
|
41
|
+
fullfunc = obj + ".prototype." + util[:func_name] + " = " + util[:func_sig]
|
42
|
+
append(str, indent, fullfunc)
|
43
|
+
type = member[:type]
|
44
|
+
if type == :reference && member[:element_type] == :block
|
45
|
+
type = member[:element_name].gsub("::", ".")
|
46
|
+
append(str, indent + 1, "return this.get_child(#{type}, #{util[:index]});")
|
47
|
+
elsif type == :bool
|
48
|
+
if member[:array].nil?
|
49
|
+
append(str, indent + 1, "return this.get_bool(#{util[:index]}, #{member[:bit_index]});")
|
50
|
+
else
|
51
|
+
append(str, indent + 1, "return this.get_bool(#{member[:index]} + index / 8, index % 8, value);")
|
52
|
+
end
|
53
|
+
else
|
54
|
+
append(str, indent + 1, "return this.get_#{util[:internal_type]}(#{util[:index]});")
|
55
|
+
end
|
56
|
+
append(str, indent, "};")
|
57
|
+
end
|
58
|
+
|
59
|
+
def write_setter obj, member, str, indent
|
60
|
+
return "" if member[:attributes].include? "no-setter"
|
61
|
+
util = _func_util(obj, member, :setter)
|
62
|
+
|
63
|
+
fullfunc = obj + ".prototype." + util[:func_name] + " = " + util[:func_sig]
|
64
|
+
append(str, indent, fullfunc)
|
65
|
+
type = member[:type]
|
66
|
+
if type == :bool
|
67
|
+
if member[:array].nil?
|
68
|
+
append(str, indent + 1, "this.set_bool(#{util[:index]}, #{member[:bit_index]}, value);")
|
69
|
+
else
|
70
|
+
append(str, indent + 1, "this.set_bool(#{member[:index]} + index / 8, index % 8, value);")
|
71
|
+
end
|
72
|
+
else
|
73
|
+
append(str, indent + 1, "this.set_#{util[:internal_type]}(#{util[:index]}, value);")
|
74
|
+
end
|
75
|
+
append(str, indent, "};")
|
76
|
+
end
|
77
|
+
|
78
|
+
def write_length obj, member, str, indent
|
79
|
+
return "" if member[:attributes].include? "no-len"
|
80
|
+
util = _func_util(obj, member, :length)
|
81
|
+
|
82
|
+
fullfunc = obj + ".prototype." + util[:func_name] + " = " + util[:func_sig]
|
83
|
+
append(str, indent, fullfunc)
|
84
|
+
append(str, indent + 1, "return #{member[:size]};")
|
85
|
+
append(str, indent, "};")
|
86
|
+
end
|
87
|
+
|
88
|
+
def gen_prototype obj, member, str, indent
|
89
|
+
write_getter obj, member, str, indent
|
90
|
+
if member[:type] == :reference
|
91
|
+
if member[:element_type] == :enum
|
92
|
+
write_setter obj, member, str, indent
|
93
|
+
end
|
94
|
+
else
|
95
|
+
write_setter obj, member, str, indent
|
96
|
+
write_length(obj, member, str, indent)if member[:type] == :string
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def gen_for_ns parent, name, ns, str, indent
|
101
|
+
is_root = name == "<root>"
|
102
|
+
has_parent = parent != "<root>"
|
103
|
+
unless has_parent
|
104
|
+
append str, indent, "var #{name} = {};" unless is_root
|
105
|
+
else
|
106
|
+
append str, indent, "#{parent}.#{name} = {};" unless is_root
|
107
|
+
end
|
108
|
+
|
109
|
+
fqn_ns = name
|
110
|
+
fqn_ns = parent + "." + fqn_ns if has_parent
|
111
|
+
|
112
|
+
unless is_root
|
113
|
+
append(str, indent, "FWI.util.exports().#{fqn_ns} = #{fqn_ns};")
|
114
|
+
end
|
115
|
+
|
116
|
+
ns[:members].each do |el_name, element|
|
117
|
+
fqn = fqn_ns + "." + el_name
|
118
|
+
fqn = el_name if is_root
|
119
|
+
type_decl = is_root ? "var #{fqn}" : "#{fqn}"
|
120
|
+
|
121
|
+
if element[:type] == :namespace
|
122
|
+
gen_for_ns(fqn_ns, el_name, element, str, indent);
|
123
|
+
elsif element[:type] == :block
|
124
|
+
append str, indent, type_decl + " = FWI.block(\"#{fqn}\", #{element[:size]});"
|
125
|
+
element[:members].each do |mem|
|
126
|
+
gen_prototype(fqn, mem, str, indent)
|
127
|
+
end
|
128
|
+
elsif element[:type] == :enum
|
129
|
+
maps = element[:members].map do |e|
|
130
|
+
"#{e[:name]}: #{e[:val]},"
|
131
|
+
end
|
132
|
+
maps.last.sub!(",","")
|
133
|
+
append str, indent, type_decl + " = {"
|
134
|
+
maps.each do |m|
|
135
|
+
append str, indent+1, m
|
136
|
+
end
|
137
|
+
append str, indent, "};"
|
138
|
+
end
|
139
|
+
|
140
|
+
if is_root
|
141
|
+
append(str, indent, "FWI.util.exports().#{fqn} = #{fqn};")
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def _get_for_file bitmap, file
|
147
|
+
map = { :members => {}, :type => :namespace }
|
148
|
+
bitmap[:members].each do |name, member|
|
149
|
+
if member[:type] == :namespace
|
150
|
+
ret = _get_for_file member, file
|
151
|
+
map[:members][name] = ret unless ret[:members].empty?
|
152
|
+
else
|
153
|
+
map[:members][name] = member if member[:file] == file
|
154
|
+
end
|
155
|
+
end
|
156
|
+
map
|
157
|
+
end
|
158
|
+
|
159
|
+
def gen bitmap
|
160
|
+
map = {}
|
161
|
+
bitmap[:files].each do |name, file|
|
162
|
+
filename = name.sub ".fwi", ".js"
|
163
|
+
contents = "(function() {\n"
|
164
|
+
|
165
|
+
gen_for_ns("<root>", "<root>", _get_for_file(bitmap, name), contents, 1)
|
166
|
+
|
167
|
+
contents += "})();"
|
168
|
+
map[filename] = contents
|
169
|
+
end
|
170
|
+
map
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fwi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jaci Brunning
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-06 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -23,8 +23,10 @@ files:
|
|
23
23
|
- bin/fwi
|
24
24
|
- fwi.gemspec
|
25
25
|
- lib/fwi/compiler.rb
|
26
|
-
- lib/fwi/cpp/compiler.rb
|
27
|
-
- lib/fwi/cpp/gen.rb
|
26
|
+
- lib/fwi/compilers/cpp/compiler.rb
|
27
|
+
- lib/fwi/compilers/cpp/gen.rb
|
28
|
+
- lib/fwi/compilers/js/compiler.rb
|
29
|
+
- lib/fwi/compilers/js/gen.rb
|
28
30
|
- lib/fwi/parser.rb
|
29
31
|
homepage: http://github.com/JacisNonsense/Fixed-Width-Interchange
|
30
32
|
licenses: []
|