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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fa660a22bbbf1df9773fa0d2740b8379c39f50b2
4
- data.tar.gz: 1115bc3ce6f5054a2153bfe71c7625b471dbdd51
3
+ metadata.gz: 62a9a7dc427851854af74f77d0143aa950a5c8ab
4
+ data.tar.gz: c464d9c4aacdc84106511b5c47aac741053af044
5
5
  SHA512:
6
- metadata.gz: 2d47e29531f20c161ed8d3f0c84ef7263540fe4c20ebd30cd96d02aac0cd5b43556387589d527ba33dc018fdb9e03ae9cef621dba79c998c35f936590c389be0
7
- data.tar.gz: 1ccba34aed35c2fb0ce4007cd37ded06cee2eaaa9091641eab08ef323b6b363ac8cf0a0b5e5b8ad18428925054c970cb5a9530f0a3cf4d33bcefd09f48d8eaf4
6
+ metadata.gz: 0770f71df505d61ab1e3ebaef17e52cd949ec1113cabe6d84f1c706bfa31ed3c24adabada7dd97177dff4d51a335978fa3f43d09bdd7d662b2c7c810ca1bbc82
7
+ data.tar.gz: 646e176dbd99611c6524de75bf4c4f025d183cc3edab890460553e4fee4344737eeb8ebb634079798d4c5ff14840044963c7575bd5938693a20b414a0c5e163f
@@ -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
- int write_raw_little_endian32(uint32_t value, uint8_t *buffer, int offset) {
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
- int write_raw_little_endian64(uint64_t value, uint8_t *buffer, int offset) {
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
- int write_raw_float(float value, uint8_t *buffer, int offset) {
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
- int write_raw_double(double value, uint8_t *buffer, int offset) {
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
- int write_raw_varint64(uint64_t value, uint8_t *buffer, int offset) {
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
- int read_raw_little_endian32(uint32_t *tag, const uint8_t *buffer, int offset) {
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
- int read_raw_little_endian64(uint64_t *tag, const uint8_t *buffer, int offset) {
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
- int read_raw_float(float *value, const uint8_t *buffer, int offset) {
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
- int read_raw_double(double *value, const uint8_t *buffer, int offset) {
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
- int read_raw_varint64(uint64_t *tag, const uint8_t *buffer, int offset) {
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 =~ /bool/ %>
251
+ <% elsif field.type == 'bool' %>
232
252
  pb-><%= field.name %> = <%= field.options.fetch(:default, 'false') %>;
233
- <% elsif field.type =~ /string/ %>
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 =~ /bytes/ %>
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 =~ /string|bytes/ %>
255
- && memcmp(&pb-><%= field.name %>.data, <%= field.options.fetch('default', '""') %>, <%= field.meta.fetch('size_max', field.options.fetch('default', '').bytesize) %>) == 0
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 =~ /double/ %>
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 =~ /float/ %>
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 =~ /int32/%>
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 =~ /int64/ %>
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 =~ /sint32/ %>
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 =~ /sint62/ %>
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 =~ /uint32/ %>
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 =~ /uint64/ %>
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 =~ /s?fixed32/ %>
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 =~ /s?fixed64/ %>
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 =~ /bool/ %>
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 =~ /string/ %>
332
- if (memcmp(&pb-><%= field.name %>.data, <%= field.options.fetch('default', '""') %>, <%= field.meta.fetch('size_max', field.options.fetch('default', '').bytesize) %>) != 0) {
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 =~ /bytes/ %>
338
- if (memcmp(&pb-><%= field.name %>.data, <%= field.options.fetch('default', '""') %>, <%= field.meta.fetch('size_max', field.options.fetch('default', '').bytesize) %>) != 0) {
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 =~ /double/ %>
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 =~ /float/ %>
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 =~ /int32/ %>
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 =~ /int64/ %>
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 =~ /sint32/ %>
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 =~ /sint62/ %>
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 =~ /uint32/ %>
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 =~ /uint64/ %>
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 =~ /s?fixed32/ %>
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 =~ /s?fixed64/ %>
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 =~ /bool/ %>
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 =~ /string/ %>
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 =~ /bytes/ %>
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 =~ /float/ %>
461
+ <% elsif field.type == 'float' %>
442
462
  offset = read_raw_float(&pb-><%= field.name %>, buffer, offset);
443
- <% elsif field.type =~ /double/ %>
463
+ <% elsif field.type == 'double' %>
444
464
  offset = read_raw_double(&pb-><%= field.name %>, buffer, offset);
445
- <% elsif field.type =~ /int32/ %>
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 =~ /int64/ %>
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 =~ /sint32/ %>
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 =~ /sint64/ %>
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 =~ /uint32/ %>
483
+ <% elsif field.type == 'uint32' %>
464
484
  offset = read_raw_varint32(&tag, buffer, offset);
465
485
  pb-><%= field.name %> = tag;
466
- <% elsif field.type =~ /uint64/ %>
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 =~ /fixed32/ %>
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 =~ /fixed64/ %>
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 =~ /sfixed32/ %>
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 =~ /sfixed64/ %>
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 =~ /bool/ %>
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 =~ /string|bytes/ %>
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 =~ /double/ %>
27
+ <% elsif field.type == 'double' %>
43
28
  double <%= field.name %>;
44
- <% elsif field.type =~ /float/ %>
29
+ <% elsif field.type == 'float' %>
45
30
  float <%= field.name %>;
46
- <% elsif field.type =~ /int32|sint32|sfixed32/ %>
31
+ <% elsif %w{int32 sint32 sfixed32}.include?(field.type) %>
47
32
  int32_t <%= field.name %>;
48
- <% elsif field.type =~ /int64|sint64|sfixed64/ %>
33
+ <% elsif %w{int64 sint64 sfixed64}.include?(field.type) %>
49
34
  int64_t <%= field.name %>;
50
- <% elsif field.type =~ /uint32|fixed32/ %>
35
+ <% elsif %w{uint32 fixed32}.include?(field.type) %>
51
36
  uint32_t <%= field.name %>;
52
- <% elsif field.type =~ /uint64|fixed64/ %>
37
+ <% elsif %w{uint64 fixed64}.include?(field.type) %>
53
38
  uint64_t <%= field.name %>;
54
- <% elsif field.type =~ /bool/ %>
39
+ <% elsif field.type == 'bool' %>
55
40
  bool <%= field.name %>;
56
- <% elsif field.type =~ /string/ %>
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["size_max"] %>];
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 >> match('[1-9]') >> digit.repeat }
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 | integer | float | string }
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) }
@@ -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.1.1'
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.1.1
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-13 00:00:00.000000000 Z
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.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: