protobuf-generate 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/protobuf-generate +1 -1
- data/lib/protobuf/generate/language.rb +6 -0
- data/lib/protobuf/generate/language/c.rb +24 -1
- data/lib/protobuf/generate/language/c/c.erb +80 -60
- data/lib/protobuf/generate/language/c/h.erb +9 -29
- data/lib/protobuf/generate/parser.rb +4 -4
- data/protobuf-generate.gemspec +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62a9a7dc427851854af74f77d0143aa950a5c8ab
|
4
|
+
data.tar.gz: c464d9c4aacdc84106511b5c47aac741053af044
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0770f71df505d61ab1e3ebaef17e52cd949ec1113cabe6d84f1c706bfa31ed3c24adabada7dd97177dff4d51a335978fa3f43d09bdd7d662b2c7c810ca1bbc82
|
7
|
+
data.tar.gz: 646e176dbd99611c6524de75bf4c4f025d183cc3edab890460553e4fee4344737eeb8ebb634079798d4c5ff14840044963c7575bd5938693a20b414a0c5e163f
|
data/bin/protobuf-generate
CHANGED
@@ -30,7 +30,7 @@ begin
|
|
30
30
|
# TODO: Each language should take care of file naming conventions as well.
|
31
31
|
postfix = File.basename(template).gsub(/\.erb$/, '') # c.erb, h.erb, demo.c.erb becomes .c, .h, demo.c
|
32
32
|
package = ast.find{|e| e.kind_of?(Protobuf::Generate::Ast::Package)}
|
33
|
-
package = package ? package.name : File.basename(proto).gsub(/\.proto
|
33
|
+
package = package ? package.name : File.basename(proto).gsub(/\.proto$/, '')
|
34
34
|
package = package.gsub('.', '_').gsub(/([^A-Z_])([A-Z]+)/, '\1_\2').gsub(/_+/, '_').downcase
|
35
35
|
filename = File.join(File.dirname(proto), [package, postfix].join('.'))
|
36
36
|
|
@@ -18,6 +18,12 @@ module Protobuf
|
|
18
18
|
Hash[*%w{int32 0 int64 0 sint32 0 sint64 0 uint32 0 uint64 0 string 2 bool 0 float 5 double 1 fixed32 5 fixed64 1 sfixed32 5 sfixed64 1 bytes 2}][type]
|
19
19
|
end
|
20
20
|
|
21
|
+
def type_count *types
|
22
|
+
select{|e| e.kind_of?(Protobuf::Generate::Ast::Message)}.inject(0) do |count, message|
|
23
|
+
count += message.fields.count{|f| types.map(&:to_s).include?(f.type)}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
21
27
|
def type_enum_default type, default
|
22
28
|
enum = find{|e| e.kind_of?(Protobuf::Generate::Ast::Enum) && e.name == type} # TODO: Or raise unknown type.
|
23
29
|
(enum.fields.find{|f| f.name == default.to_s} || enum.fields.first).name
|
@@ -7,6 +7,8 @@ module Protobuf
|
|
7
7
|
match %r{^ (?:gnu|[Cc]) (?:99|11) $}x
|
8
8
|
templates Dir.glob(File.join(File.expand_path(File.dirname(__FILE__)), 'c', '*.erb'))
|
9
9
|
|
10
|
+
#--
|
11
|
+
# TODO: Base conventions with snake_case, camel_case and studly_caps converters.
|
10
12
|
module Conventions
|
11
13
|
def type *name; snake_case *name, 't' end
|
12
14
|
def variable *name; snake_case *name end
|
@@ -15,14 +17,35 @@ module Protobuf
|
|
15
17
|
|
16
18
|
protected
|
17
19
|
def snake_case *name
|
18
|
-
name.map(&:to_s).join('_').gsub(/([^A-Z_])([A-Z]+)/, '\1_\2').gsub(/[_.]+/, '_').downcase
|
20
|
+
name.compact.map(&:to_s).join('_').gsub(/([^A-Z_])([A-Z]+)/, '\1_\2').gsub(/[_.]+/, '_').downcase
|
19
21
|
end
|
20
22
|
end # Conventions
|
21
23
|
|
24
|
+
#--
|
25
|
+
# TODO: Break C into base class, c-static, c-dynamic.
|
26
|
+
# @size_max is only required for static C.
|
22
27
|
def initialize ast, conventions = Conventions
|
28
|
+
validate ast
|
23
29
|
ast.extend(conventions)
|
24
30
|
super ast
|
25
31
|
end
|
32
|
+
|
33
|
+
private
|
34
|
+
#--
|
35
|
+
# TODO: Pass in validations as you do conventions.
|
36
|
+
def validate ast
|
37
|
+
ast.each do |e| # TODO: ast.messages
|
38
|
+
next unless e.kind_of?(Protobuf::Generate::Ast::Message) # TODO: e.message?
|
39
|
+
e.fields.each do |field|
|
40
|
+
if field.label.match(/repeated/)
|
41
|
+
raise "Message %s.%s field repeating is unsupported." % [e.name, field.name]
|
42
|
+
end
|
43
|
+
if field.type.match(/string|bytes/) && field.meta["size"].to_i <= 0
|
44
|
+
raise "Message %s.%s %s field requires size meta comment > 0 // @size = DIGITS" % [e.name, field.name, field.type]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
26
49
|
end # C
|
27
50
|
end # Langage
|
28
51
|
end # Generate
|
@@ -4,20 +4,23 @@
|
|
4
4
|
#include <stdint.h>
|
5
5
|
#include <string.h>
|
6
6
|
|
7
|
-
static int write_raw_byte(uint8_t value, uint8_t *buffer, int offset) {
|
7
|
+
static inline int write_raw_byte(uint8_t value, uint8_t *buffer, int offset) {
|
8
8
|
*(buffer + offset) = value;
|
9
9
|
return ++offset;
|
10
10
|
}
|
11
11
|
|
12
|
-
|
12
|
+
<% if type_count(:float, :fixed32, :sfixed32) > 0 %>
|
13
|
+
static int write_raw_little_endian32(uint32_t value, uint8_t *buffer, int offset) {
|
13
14
|
offset = write_raw_byte((uint8_t)((value ) & 0xFF), buffer, offset);
|
14
15
|
offset = write_raw_byte((uint8_t)((value >> 8) & 0xFF), buffer, offset);
|
15
16
|
offset = write_raw_byte((uint8_t)((value >> 16) & 0xFF), buffer, offset);
|
16
17
|
offset = write_raw_byte((uint8_t)((value >> 24) & 0xFF), buffer, offset);
|
17
18
|
return offset;
|
18
19
|
}
|
20
|
+
<% end %>
|
19
21
|
|
20
|
-
|
22
|
+
<% if type_count(:double, :fixed64, :sfixed64) > 0 %>
|
23
|
+
static int write_raw_little_endian64(uint64_t value, uint8_t *buffer, int offset) {
|
21
24
|
offset = write_raw_byte((uint8_t)((value ) & 0xFF), buffer, offset);
|
22
25
|
offset = write_raw_byte((uint8_t)((value >> 8) & 0xFF), buffer, offset);
|
23
26
|
offset = write_raw_byte((uint8_t)((value >> 16) & 0xFF), buffer, offset);
|
@@ -28,20 +31,25 @@ int write_raw_little_endian64(uint64_t value, uint8_t *buffer, int offset) {
|
|
28
31
|
offset = write_raw_byte((uint8_t)((value >> 56) & 0xFF), buffer, offset);
|
29
32
|
return offset;
|
30
33
|
}
|
34
|
+
<% end %>
|
31
35
|
|
32
|
-
|
36
|
+
<% if type_count(:float) > 0 %>
|
37
|
+
static int write_raw_float(float value, uint8_t *buffer, int offset) {
|
33
38
|
union { uint32_t i; float f; } punner;
|
34
39
|
punner.f = value;
|
35
40
|
return write_raw_little_endian32(punner.i, buffer, offset);
|
36
41
|
}
|
42
|
+
<% end %>
|
37
43
|
|
38
|
-
|
44
|
+
<% if type_count(:double) > 0 %>
|
45
|
+
static int write_raw_double(double value, uint8_t *buffer, int offset) {
|
39
46
|
union { uint64_t i; double f; } punner;
|
40
47
|
punner.f = value;
|
41
48
|
return write_raw_little_endian64(punner.i, buffer, offset);
|
42
49
|
}
|
50
|
+
<% end %>
|
43
51
|
|
44
|
-
int write_raw_varint32(uint32_t value, uint8_t *buffer, int offset) {
|
52
|
+
static int write_raw_varint32(uint32_t value, uint8_t *buffer, int offset) {
|
45
53
|
while (1) {
|
46
54
|
if ((value & ~0x7F) == 0) {
|
47
55
|
offset = write_raw_byte((uint8_t)value, buffer, offset);
|
@@ -54,7 +62,8 @@ int write_raw_varint32(uint32_t value, uint8_t *buffer, int offset) {
|
|
54
62
|
return offset;
|
55
63
|
}
|
56
64
|
|
57
|
-
|
65
|
+
<% if type_count(:int32, :int64, :sint64, :uint64) > 0 %>
|
66
|
+
static int write_raw_varint64(uint64_t value, uint8_t *buffer, int offset) {
|
58
67
|
while (1) {
|
59
68
|
if ((value & ~0x7FL) == 0) {
|
60
69
|
offset = write_raw_byte((uint8_t)value, buffer, offset);
|
@@ -66,6 +75,7 @@ int write_raw_varint64(uint64_t value, uint8_t *buffer, int offset) {
|
|
66
75
|
}
|
67
76
|
return offset;
|
68
77
|
}
|
78
|
+
<% end %>
|
69
79
|
|
70
80
|
static int write_raw_bytes(uint8_t *bytes, int bytes_size, uint8_t *buffer, int offset) {
|
71
81
|
for (int i = 0; i < bytes_size; ++i)
|
@@ -94,7 +104,8 @@ static inline int read_raw_byte(uint8_t *tag, const uint8_t *buffer, int offset)
|
|
94
104
|
return ++offset;
|
95
105
|
}
|
96
106
|
|
97
|
-
|
107
|
+
<% if type_count(:float, :fixed32, :sfixed32) > 0 %>
|
108
|
+
static int read_raw_little_endian32(uint32_t *tag, const uint8_t *buffer, int offset) {
|
98
109
|
offset = read_raw_byte((uint8_t *)tag, buffer, offset);
|
99
110
|
uint8_t b1 = (uint8_t)*tag;
|
100
111
|
offset = read_raw_byte((uint8_t *)tag, buffer, offset);
|
@@ -110,8 +121,10 @@ int read_raw_little_endian32(uint32_t *tag, const uint8_t *buffer, int offset) {
|
|
110
121
|
(((uint32_t)b4 & 0xff) << 24);
|
111
122
|
return offset;
|
112
123
|
}
|
124
|
+
<% end %>
|
113
125
|
|
114
|
-
|
126
|
+
<% if type_count(:double, :fixed64, :sfixed64) > 0 %>
|
127
|
+
static int read_raw_little_endian64(uint64_t *tag, const uint8_t *buffer, int offset) {
|
115
128
|
offset = read_raw_byte((uint8_t *)tag, buffer, offset);
|
116
129
|
uint8_t b1 = (uint8_t)*tag;
|
117
130
|
offset = read_raw_byte((uint8_t *)tag, buffer, offset);
|
@@ -140,22 +153,27 @@ int read_raw_little_endian64(uint64_t *tag, const uint8_t *buffer, int offset) {
|
|
140
153
|
|
141
154
|
return offset;
|
142
155
|
}
|
156
|
+
<% end %>
|
143
157
|
|
144
|
-
|
158
|
+
<% if type_count(:float) > 0 %>
|
159
|
+
static int read_raw_float(float *value, const uint8_t *buffer, int offset) {
|
145
160
|
union { uint32_t i; float f; } punner;
|
146
161
|
offset = read_raw_little_endian32(&punner.i, buffer, offset);
|
147
162
|
*value = punner.f;
|
148
163
|
return offset;
|
149
164
|
}
|
165
|
+
<% end %>
|
150
166
|
|
151
|
-
|
167
|
+
<% if type_count(:double) > 0 %>
|
168
|
+
static int read_raw_double(double *value, const uint8_t *buffer, int offset) {
|
152
169
|
union { uint64_t i; double f; } punner;
|
153
170
|
offset = read_raw_little_endian64(&punner.i, buffer, offset);
|
154
171
|
*value = punner.f;
|
155
172
|
return offset;
|
156
173
|
}
|
174
|
+
<% end %>
|
157
175
|
|
158
|
-
int read_raw_varint32(uint32_t *tag, const uint8_t *buffer, int offset) {
|
176
|
+
static int read_raw_varint32(uint32_t *tag, const uint8_t *buffer, int offset) {
|
159
177
|
uint8_t result;
|
160
178
|
|
161
179
|
offset = read_raw_byte(&result, buffer, offset);
|
@@ -198,7 +216,8 @@ int read_raw_varint32(uint32_t *tag, const uint8_t *buffer, int offset) {
|
|
198
216
|
return offset;
|
199
217
|
}
|
200
218
|
|
201
|
-
|
219
|
+
<% if type_count(:int64, :sint64, :uint64) > 0 %>
|
220
|
+
static int read_raw_varint64(uint64_t *tag, const uint8_t *buffer, int offset) {
|
202
221
|
short shift = 0;
|
203
222
|
uint8_t b;
|
204
223
|
*tag = 0;
|
@@ -213,6 +232,7 @@ int read_raw_varint64(uint64_t *tag, const uint8_t *buffer, int offset) {
|
|
213
232
|
/* return error code. */
|
214
233
|
return -1;
|
215
234
|
}
|
235
|
+
<% end %>
|
216
236
|
|
217
237
|
<% each do |exp| %>
|
218
238
|
<% if exp.kind_of?(Protobuf::Generate::Ast::Message) %>
|
@@ -228,12 +248,12 @@ int read_raw_varint64(uint64_t *tag, const uint8_t *buffer, int offset) {
|
|
228
248
|
<%= function exp.package, field.type, 'init', 'optional', 'attributes' %>(&pb-><%= field.name %>);
|
229
249
|
<% elsif type_enum?(field.type) %>
|
230
250
|
pb-><%= field.name %> = <%= constant exp.package, field.type, type_enum_default(field.type, field.options.fetch('default', nil)) %>;
|
231
|
-
<% elsif field.type
|
251
|
+
<% elsif field.type == 'bool' %>
|
232
252
|
pb-><%= field.name %> = <%= field.options.fetch(:default, 'false') %>;
|
233
|
-
<% elsif field.type
|
253
|
+
<% elsif field.type == 'string' %>
|
234
254
|
memcpy(pb-><%= field.name %>.data, <%= field.options.fetch('default', '""') %>, <%= size = (field.options.fetch('default', '').bytesize - 1); size > 0 ? size : 0 %>);
|
235
255
|
pb-><%= field.name %>.size = <%= field.options.fetch('default', '').bytesize %>;
|
236
|
-
<% elsif field.type
|
256
|
+
<% elsif field.type == 'bytes' %>
|
237
257
|
memcpy(pb-><%= field.name %>.data, <%= field.options.fetch('default', '""') %>, <%= field.options.fetch('default', '').bytesize %>);
|
238
258
|
pb-><%= field.name %>.size = <%= field.options.fetch('default', '').bytesize %>;
|
239
259
|
<% else %>
|
@@ -251,8 +271,8 @@ int read_raw_varint64(uint64_t *tag, const uint8_t *buffer, int offset) {
|
|
251
271
|
&& <%= function exp.package, field.type, 'is', 'default', 'message' %>(&pb-><%= field.name %>)
|
252
272
|
<% elsif type_enum?(field.type) %>
|
253
273
|
&& pb-><%= field.name %> == <%= constant exp.package, field.type, type_enum_default(field.type, field.options.fetch('default', nil)) %>
|
254
|
-
<% elsif field.type
|
255
|
-
&& memcmp(&pb-><%= field.name %>.data, <%= field.options.fetch('default', '""') %>, <%= field.meta.fetch('
|
274
|
+
<% elsif %w{string bytes}.include?(field.type) %>
|
275
|
+
&& memcmp(&pb-><%= field.name %>.data, <%= field.options.fetch('default', '""') %>, <%= field.meta.fetch('size', field.options.fetch('default', '').bytesize) %>) == 0
|
256
276
|
&& pb-><%= field.name %>.size == <%= field.options.fetch('default', '').bytesize %>
|
257
277
|
<% else %>
|
258
278
|
&& pb-><%= field.name %> == <%= field.options.fetch('default', 0) %>
|
@@ -272,70 +292,70 @@ int read_raw_varint64(uint64_t *tag, const uint8_t *buffer, int offset) {
|
|
272
292
|
offset = write_raw_varint32((<%= field.tag %><<3)+0, buffer, offset);
|
273
293
|
offset = write_raw_varint32(pb-><%= field.name %>, buffer, offset);
|
274
294
|
}
|
275
|
-
<% elsif field.type
|
295
|
+
<% elsif field.type == 'double' %>
|
276
296
|
if (pb-><%= field.name %> != <%= field.options.fetch('default', 0) %>) {
|
277
297
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
278
298
|
offset = write_raw_double(pb-><%= field.name %>, buffer, offset);
|
279
299
|
}
|
280
|
-
<% elsif field.type
|
300
|
+
<% elsif field.type == 'float' %>
|
281
301
|
if (pb-><%= field.name %> != <%= field.options.fetch('default', 0) %>) {
|
282
302
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
283
303
|
offset = write_raw_float(pb-><%= field.name %>, buffer, offset);
|
284
304
|
}
|
285
|
-
<% elsif field.type
|
305
|
+
<% elsif field.type == 'int32' %>
|
286
306
|
if (pb-><%= field.name %> != <%= field.options.fetch('default', 0) %>) {
|
287
307
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
288
308
|
if (pb-><%= field.name %> >= 0) offset = write_raw_varint32(pb-><%= field.name %>, buffer, offset);
|
289
309
|
else offset = write_raw_varint64(pb-><%= field.name %>, buffer, offset);
|
290
310
|
}
|
291
|
-
<% elsif field.type
|
311
|
+
<% elsif field.type == 'int64' %>
|
292
312
|
if (pb-><%= field.name %> != <%= field.options.fetch('default', 0) %>) {
|
293
313
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
294
314
|
offset = write_raw_varint64(pb-><%= field.name %>, buffer, offset);
|
295
315
|
}
|
296
|
-
<% elsif field.type
|
316
|
+
<% elsif field.type == 'sint32' %>
|
297
317
|
if (pb-><%= field.name %> != <%= field.options.fetch('default', 0) %>) {
|
298
318
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
299
319
|
offset = write_raw_varint32(encode_zig_zag32(pb-><%= field.name %>), buffer, offset);
|
300
320
|
}
|
301
|
-
<% elsif field.type
|
321
|
+
<% elsif field.type == 'sint64' %>
|
302
322
|
if (pb-><%= field.name %> != <%= field.options.fetch('default', 0) %>) {
|
303
323
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
304
324
|
offset = write_raw_varint64(encode_zig_zag64(pb-><%= field.name %>), buffer, offset);
|
305
325
|
}
|
306
|
-
<% elsif field.type
|
326
|
+
<% elsif field.type == 'uint32' %>
|
307
327
|
if (pb-><%= field.name %> != <%= field.options.fetch('default', 0) %>) {
|
308
328
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
309
329
|
offset = write_raw_varint32(pb-><%= field.name %>, buffer, offset);
|
310
330
|
}
|
311
|
-
<% elsif field.type
|
331
|
+
<% elsif field.type == 'uint64' %>
|
312
332
|
if (pb-><%= field.name %> != <%= field.options.fetch('default', 0) %>) {
|
313
333
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
314
334
|
offset = write_raw_varint64(pb-><%= field.name %>, buffer, offset);
|
315
335
|
}
|
316
|
-
<% elsif field.type
|
336
|
+
<% elsif %w{fixed32 sfixed32}.include?(field.type) %>
|
317
337
|
if (pb-><%= field.name %> != <%= field.options.fetch('default', 0) %>) {
|
318
338
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
319
339
|
offset = write_raw_little_endian32(pb-><%= field.name %>, buffer, offset);
|
320
340
|
}
|
321
|
-
<% elsif field.type
|
341
|
+
<% elsif %w{fixed64 sfixed64}.include?(field.type) %>
|
322
342
|
if (pb-><%= field.name %> != <%= field.options.fetch('default', 0) %>) {
|
323
343
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
324
344
|
offset = write_raw_little_endian64(pb-><%= field.name %>, buffer, offset);
|
325
345
|
}
|
326
|
-
<% elsif field.type
|
346
|
+
<% elsif field.type == 'bool' %>
|
327
347
|
if (pb-><%= field.name %> != <%= field.options.fetch('default', 'false') %>) {
|
328
348
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
329
349
|
offset = write_raw_byte(pb-><%= field.name %>, buffer, offset);
|
330
350
|
}
|
331
|
-
<% elsif field.type
|
332
|
-
if (memcmp(&pb-><%= field.name %>.data, <%= field.options.fetch('default', '""') %>, <%= field.meta.fetch('
|
351
|
+
<% elsif field.type == 'string' %>
|
352
|
+
if (memcmp(&pb-><%= field.name %>.data, <%= field.options.fetch('default', '""') %>, <%= field.meta.fetch('size', field.options.fetch('default', '').bytesize) %>) != 0) {
|
333
353
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
334
354
|
offset = write_raw_varint32(pb-><%= field.name %>.size, buffer, offset);
|
335
355
|
offset = write_raw_bytes((uint8_t *)pb-><%= field.name %>.data, pb-><%= field.name %>.size, buffer, offset);
|
336
356
|
}
|
337
|
-
<% elsif field.type
|
338
|
-
if (memcmp(&pb-><%= field.name %>.data, <%= field.options.fetch('default', '""') %>, <%= field.meta.fetch('
|
357
|
+
<% elsif field.type == 'bytes' %>
|
358
|
+
if (memcmp(&pb-><%= field.name %>.data, <%= field.options.fetch('default', '""') %>, <%= field.meta.fetch('size', field.options.fetch('default', '').bytesize) %>) != 0) {
|
339
359
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
340
360
|
offset = write_raw_varint32(pb-><%= field.name %>.size, buffer, offset);
|
341
361
|
offset = write_raw_bytes((uint8_t *)pb-><%= field.name %>.data, pb-><%= field.name %>.size, buffer, offset);
|
@@ -347,45 +367,45 @@ int read_raw_varint64(uint64_t *tag, const uint8_t *buffer, int offset) {
|
|
347
367
|
<% elsif type_enum?(field.type) %>
|
348
368
|
offset = write_raw_varint32((<%= field.tag %><<3)+0, buffer, offset);
|
349
369
|
offset = write_raw_varint32(pb-><%= field.name %>, buffer, offset);
|
350
|
-
<% elsif field.type
|
370
|
+
<% elsif field.type == 'double' %>
|
351
371
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
352
372
|
offset = write_raw_double(pb-><%= field.name %>, buffer, offset);
|
353
|
-
<% elsif field.type
|
373
|
+
<% elsif field.type == 'float' %>
|
354
374
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
355
375
|
offset = write_raw_float(pb-><%= field.name %>, buffer, offset);
|
356
|
-
<% elsif field.type
|
376
|
+
<% elsif field.type == 'int32' %>
|
357
377
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
358
378
|
if (pb-><%= field.name %> >= 0) offset = write_raw_varint32(pb-><%= field.name %>, buffer, offset);
|
359
379
|
else offset = write_raw_varint64(pb-><%= field.name %>, buffer, offset);
|
360
|
-
<% elsif field.type
|
380
|
+
<% elsif field.type == 'int64' %>
|
361
381
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
362
382
|
offset = write_raw_varint64(pb-><%= field.name %>, buffer, offset);
|
363
|
-
<% elsif field.type
|
383
|
+
<% elsif field.type == 'sint32' %>
|
364
384
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
365
385
|
offset = write_raw_varint32(encode_zig_zag32(pb-><%= field.name %>), buffer, offset);
|
366
|
-
<% elsif field.type
|
386
|
+
<% elsif field.type == 'sint64' %>
|
367
387
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
368
388
|
offset = write_raw_varint64(encode_zig_zag64(pb-><%= field.name %>), buffer, offset);
|
369
|
-
<% elsif field.type
|
389
|
+
<% elsif field.type == 'uint32' %>
|
370
390
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
371
391
|
offset = write_raw_varint32(pb-><%= field.name %>, buffer, offset);
|
372
|
-
<% elsif field.type
|
392
|
+
<% elsif field.type == 'uint64' %>
|
373
393
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
374
394
|
offset = write_raw_varint64(pb-><%= field.name %>, buffer, offset);
|
375
|
-
<% elsif field.type
|
395
|
+
<% elsif %w{fixed32 sfixed32}.include?(field.type) %>
|
376
396
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
377
397
|
offset = write_raw_little_endian32(pb-><%= field.name %>, buffer, offset);
|
378
|
-
<% elsif field.type
|
398
|
+
<% elsif %w{fixed64 sfixed64}.include?(field.type) %>
|
379
399
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
380
400
|
offset = write_raw_little_endian64(pb-><%= field.name %>, buffer, offset);
|
381
|
-
<% elsif field.type
|
401
|
+
<% elsif field.type == 'bool' %>
|
382
402
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
383
403
|
offset = write_raw_byte(pb-><%= field.name %>, buffer, offset);
|
384
|
-
<% elsif field.type
|
404
|
+
<% elsif field.type == 'string' %>
|
385
405
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
386
406
|
offset = write_raw_varint32(pb-><%= field.name %>.size, buffer, offset);
|
387
407
|
offset = write_raw_bytes((uint8_t *)pb-><%= field.name %>.data, pb-><%= field.name %>.size, buffer, offset);
|
388
|
-
<% elsif field.type
|
408
|
+
<% elsif field.type == 'bytes' %>
|
389
409
|
offset = write_raw_varint32((<%= field.tag %><<3)+<%= type_wire field.type %>, buffer, offset);
|
390
410
|
offset = write_raw_varint32(pb-><%= field.name %>.size, buffer, offset);
|
391
411
|
offset = write_raw_bytes((uint8_t *)pb-><%= field.name %>.data, pb-><%= field.name %>.size, buffer, offset);
|
@@ -438,59 +458,59 @@ int read_raw_varint64(uint64_t *tag, const uint8_t *buffer, int offset) {
|
|
438
458
|
<% elsif type_enum?(field.type) %>
|
439
459
|
offset = read_raw_varint32(&tag, buffer, offset);
|
440
460
|
pb-><%= field.name %> = tag;
|
441
|
-
<% elsif field.type
|
461
|
+
<% elsif field.type == 'float' %>
|
442
462
|
offset = read_raw_float(&pb-><%= field.name %>, buffer, offset);
|
443
|
-
<% elsif field.type
|
463
|
+
<% elsif field.type == 'double' %>
|
444
464
|
offset = read_raw_double(&pb-><%= field.name %>, buffer, offset);
|
445
|
-
<% elsif field.type
|
465
|
+
<% elsif field.type == 'int32' %>
|
446
466
|
offset = read_raw_varint32(&tag, buffer, offset);
|
447
467
|
pb-><%= field.name %> = (int32_t)tag;
|
448
|
-
<% elsif field.type
|
468
|
+
<% elsif field.type == 'int64' %>
|
449
469
|
{
|
450
470
|
uint64_t value = 0;
|
451
471
|
offset = read_raw_varint64(&value, buffer, offset);
|
452
472
|
pb-><%= field.name %> = (int64_t)tag;
|
453
473
|
}
|
454
|
-
<% elsif field.type
|
474
|
+
<% elsif field.type == 'sint32' %>
|
455
475
|
offset = read_raw_varint32(&tag, buffer, offset);
|
456
476
|
pb-><%= field.name %> = decode_zig_zag32(tag);
|
457
|
-
<% elsif field.type
|
477
|
+
<% elsif field.type == 'sint64' %>
|
458
478
|
{
|
459
479
|
uint64_t value = 0;
|
460
480
|
offset = read_raw_varint64(&value, buffer, offset);
|
461
481
|
pb-><%= field.name %> = decode_zig_zag64(value);
|
462
482
|
}
|
463
|
-
<% elsif field.type
|
483
|
+
<% elsif field.type == 'uint32' %>
|
464
484
|
offset = read_raw_varint32(&tag, buffer, offset);
|
465
485
|
pb-><%= field.name %> = tag;
|
466
|
-
<% elsif field.type
|
486
|
+
<% elsif field.type == 'uint64' %>
|
467
487
|
{
|
468
488
|
uint64_t value = 0;
|
469
489
|
offset = read_raw_varint64(&value, buffer, offset);
|
470
490
|
pb-><%= field.name %> = value;
|
471
491
|
}
|
472
|
-
<% elsif field.type
|
492
|
+
<% elsif field.type == 'fixed32' %>
|
473
493
|
offset = read_raw_little_endian32(&tag, buffer, offset);
|
474
494
|
pb-><%= field.name %> = tag;
|
475
|
-
<% elsif field.type
|
495
|
+
<% elsif field.type == 'fixed64' %>
|
476
496
|
{
|
477
497
|
uint64_t value = 0;
|
478
498
|
offset = read_raw_little_endian64(&value, buffer, offset);
|
479
499
|
pb-><%= field.name %> = value;
|
480
500
|
}
|
481
|
-
<% elsif field.type
|
501
|
+
<% elsif field.type == 'sfixed32' %>
|
482
502
|
offset = read_raw_little_endian32(&tag, buffer, offset);
|
483
503
|
pb-><%= field.name %> = (int32_t)tag;
|
484
|
-
<% elsif field.type
|
504
|
+
<% elsif field.type == 'sfixed64' %>
|
485
505
|
{
|
486
506
|
uint64_t value = 0;
|
487
507
|
offset = read_raw_little_endian64(&value, buffer, offset);
|
488
508
|
pb-><%= field.name %> = (int64_t)value;
|
489
509
|
}
|
490
|
-
<% elsif field.type
|
510
|
+
<% elsif field.type == 'bool' %>
|
491
511
|
offset = read_raw_varint32(&tag, buffer, offset);
|
492
512
|
pb-><%= field.name %> = tag & 1;
|
493
|
-
<% elsif field.type
|
513
|
+
<% elsif %w{string bytes}.include?(field.type) %>
|
494
514
|
offset = read_raw_varint32(&tag, buffer, offset);
|
495
515
|
pb-><%= field.name %>.size = (size_t)tag;
|
496
516
|
for (size_t i = 0; i < (size_t)tag; ++i)
|
@@ -8,21 +8,6 @@
|
|
8
8
|
extern "C" {
|
9
9
|
#endif
|
10
10
|
|
11
|
-
// TODO: Export to avoid unused function errors with -Werror.
|
12
|
-
// Remove. Have parser count type usage and only include the code if required.
|
13
|
-
int write_raw_little_endian32(uint32_t value, uint8_t *buffer, int offset);
|
14
|
-
int write_raw_little_endian64(uint64_t value, uint8_t *buffer, int offset);
|
15
|
-
int write_raw_float(float value, uint8_t *buffer, int offset);
|
16
|
-
int write_raw_double(double value, uint8_t *buffer, int offset);
|
17
|
-
int write_raw_varint32(uint32_t value, uint8_t *buffer, int offset);
|
18
|
-
int write_raw_varint64(uint64_t value, uint8_t *buffer, int offset);
|
19
|
-
int read_raw_little_endian32(uint32_t *tag, const uint8_t *buffer, int offset);
|
20
|
-
int read_raw_little_endian64(uint64_t *tag, const uint8_t *buffer, int offset);
|
21
|
-
int read_raw_float(float *tag, const uint8_t *buffer, int offset);
|
22
|
-
int read_raw_double(double *tag, const uint8_t *buffer, int offset);
|
23
|
-
int read_raw_varint32(uint32_t *tag, const uint8_t *buffer, int offset);
|
24
|
-
int read_raw_varint64(uint64_t *tag, const uint8_t *buffer, int offset);
|
25
|
-
|
26
11
|
<% each do |exp| %>
|
27
12
|
<% if exp.kind_of?(Protobuf::Generate::Ast::Enum) %>
|
28
13
|
|
@@ -39,28 +24,23 @@ int read_raw_varint64(uint64_t *tag, const uint8_t *buffer, int offset);
|
|
39
24
|
<%= type exp.package, field.type %> <%= field.name %>;
|
40
25
|
<% elsif type_enum?(field.type) %>
|
41
26
|
<%= type exp.package, field.type %> <%= field.name %>;
|
42
|
-
<% elsif field.type
|
27
|
+
<% elsif field.type == 'double' %>
|
43
28
|
double <%= field.name %>;
|
44
|
-
<% elsif field.type
|
29
|
+
<% elsif field.type == 'float' %>
|
45
30
|
float <%= field.name %>;
|
46
|
-
<% elsif field.type
|
31
|
+
<% elsif %w{int32 sint32 sfixed32}.include?(field.type) %>
|
47
32
|
int32_t <%= field.name %>;
|
48
|
-
<% elsif field.type
|
33
|
+
<% elsif %w{int64 sint64 sfixed64}.include?(field.type) %>
|
49
34
|
int64_t <%= field.name %>;
|
50
|
-
<% elsif field.type
|
35
|
+
<% elsif %w{uint32 fixed32}.include?(field.type) %>
|
51
36
|
uint32_t <%= field.name %>;
|
52
|
-
<% elsif field.type
|
37
|
+
<% elsif %w{uint64 fixed64}.include?(field.type) %>
|
53
38
|
uint64_t <%= field.name %>;
|
54
|
-
<% elsif field.type
|
39
|
+
<% elsif field.type == 'bool' %>
|
55
40
|
bool <%= field.name %>;
|
56
|
-
<% elsif field.type
|
57
|
-
struct {
|
58
|
-
uint8_t data[<%= field.meta["size_max"] %>];
|
59
|
-
size_t size;
|
60
|
-
} <%= field.name %>;
|
61
|
-
<% elsif field.type =~ /bytes/ %>
|
41
|
+
<% elsif %w{bytes string}.include?(field.type) %>
|
62
42
|
struct {
|
63
|
-
uint8_t data[<%= field.meta["
|
43
|
+
uint8_t data[<%= field.meta["size"] %>];
|
64
44
|
size_t size;
|
65
45
|
} <%= field.name %>;
|
66
46
|
<% end %>
|
@@ -19,7 +19,7 @@ module Protobuf
|
|
19
19
|
rule(:bracket_close) { str('}') >> whitespace? }
|
20
20
|
|
21
21
|
rule(:digit) { match('[0-9]') }
|
22
|
-
rule(:integer) { str('-').maybe >>
|
22
|
+
rule(:integer) { str('-').maybe >> digit.repeat(1) }
|
23
23
|
rule(:float) { str('-').maybe >> digit.repeat(1) >> str('.') >> digit.repeat(1) }
|
24
24
|
|
25
25
|
rule(:string_special) { match['\0\t\n\r"\\\\'] }
|
@@ -29,7 +29,7 @@ module Protobuf
|
|
29
29
|
rule(:identifier) { match('[a-zA-Z_]') >> match('[a-zA-Z0-9_]').repeat }
|
30
30
|
rule(:identifier_dot_list) { identifier >> (str('.') >> identifier).repeat }
|
31
31
|
|
32
|
-
rule(:constant) { identifier |
|
32
|
+
rule(:constant) { identifier | float | integer | string }
|
33
33
|
|
34
34
|
rule(:field_option) { str('default').as(:name) >> whitespace? >> equals >> constant.as(:value) }
|
35
35
|
rule(:field_option_list) { (str('[') >> whitespace? >> (field_option.as(:option) >> whitespace?).repeat(1) >> whitespace? >> str(']') >> whitespace?) }
|
@@ -37,11 +37,11 @@ module Protobuf
|
|
37
37
|
rule(:field_label) { (str('required') | str('optional') | str('repeated')).as(:label) >> whitespace? }
|
38
38
|
|
39
39
|
rule(:message_field) { (field_label >> field_type >> identifier.as(:name) >> whitespace? >> equals >> integer.as(:tag) >> whitespace? >> field_option_list.maybe.as(:options) >> str(';') >> space? >> comment.maybe.as(:comment) ).as(:message_field) }
|
40
|
-
rule(:message_field_list) { (message_field >> whitespace?).repeat(1).as(:fields) }
|
40
|
+
rule(:message_field_list) { ((message_field | comment) >> whitespace?).repeat(1).as(:fields) }
|
41
41
|
rule(:message) { (comment_list.maybe.as(:comments) >> str('message') >> whitespace? >> identifier.as(:name) >> whitespace? >> bracket_open >> message_field_list.maybe >> bracket_close >> whitespace?).as(:message) }
|
42
42
|
|
43
43
|
rule(:enum_field) { (identifier.as(:name) >> whitespace? >> equals >> integer.as(:tag) >> whitespace? >> str(';')).as(:enum_field) }
|
44
|
-
rule(:enum_field_list) { (enum_field >> whitespace?).repeat(1).as(:fields) }
|
44
|
+
rule(:enum_field_list) { ((enum_field | comment) >> whitespace?).repeat(1).as(:fields) }
|
45
45
|
rule(:enum) { (str('enum') >> whitespace? >> identifier.as(:name) >> whitespace? >> bracket_open >> enum_field_list >> bracket_close >> whitespace?).as(:enum) }
|
46
46
|
|
47
47
|
rule(:package) { (str('package') >> whitespace? >> identifier_dot_list.as(:name) >> whitespace? >> str(';') >> whitespace?).as(:package) }
|
data/protobuf-generate.gemspec
CHANGED
@@ -2,7 +2,7 @@ $:.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
|
2
2
|
|
3
3
|
spec = Gem::Specification.new do |s|
|
4
4
|
s.name = 'protobuf-generate'
|
5
|
-
s.version = '0.
|
5
|
+
s.version = '0.2.0'
|
6
6
|
s.summary = 'A multi-language concrete protobuf code generator.'
|
7
7
|
s.description = 'A simple PEG parser, AST and template based approach to code generation.'
|
8
8
|
s.authors = ['Shane Hanna']
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protobuf-generate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane Hanna
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-08-
|
11
|
+
date: 2013-08-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parslet
|
@@ -78,9 +78,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
78
|
version: '0'
|
79
79
|
requirements: []
|
80
80
|
rubyforge_project:
|
81
|
-
rubygems_version: 2.0.
|
81
|
+
rubygems_version: 2.0.3
|
82
82
|
signing_key:
|
83
83
|
specification_version: 4
|
84
84
|
summary: A multi-language concrete protobuf code generator.
|
85
85
|
test_files: []
|
86
|
-
has_rdoc:
|