divine 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/README.md +285 -2
  4. data/divine.gemspec +2 -2
  5. data/lib/divine.rb +0 -0
  6. data/lib/divine/code_generators/code_generator.rb +0 -0
  7. data/lib/divine/code_generators/csharp.rb +24 -50
  8. data/lib/divine/code_generators/java.rb +22 -28
  9. data/lib/divine/code_generators/javascript.rb +19 -33
  10. data/lib/divine/code_generators/ruby.rb +17 -34
  11. data/lib/divine/dsl.rb +47 -8
  12. data/lib/divine/graph_generator/graph_generator.rb +0 -0
  13. data/lib/divine/version.rb +1 -1
  14. data/test/basic_complex_test/basic_complex_test.rb +0 -0
  15. data/test/basic_complex_test/java_test/JavaTest.java +0 -0
  16. data/test/basic_complex_test/js_test/js_testBasic.js +1 -5
  17. data/test/basic_complex_test/js_test/js_testComplex.js +1 -5
  18. data/test/basic_complex_test/ruby_test/ruby_test.rb +0 -0
  19. data/test/binaryTree_test/binaryTree_test.rb +1 -0
  20. data/test/binaryTree_test/csharp_test/csharp_test.cs +8 -0
  21. data/test/binaryTree_test/graph.png +0 -0
  22. data/test/binaryTree_test/java_test/JavaTest.java +9 -0
  23. data/test/binaryTree_test/js_test/js_test.js +9 -5
  24. data/test/binaryTree_test/ruby_test/ruby_test.rb +10 -2
  25. data/test/complex_test/complex_test.rb +0 -0
  26. data/test/complex_test/csharp_test/csharp_test.cs +0 -0
  27. data/test/complex_test/graph.png +0 -0
  28. data/test/complex_test/java_test/JavaTest.java +0 -0
  29. data/test/complex_test/js_test/js_test.js +1 -5
  30. data/test/complex_test/ruby_test/ruby_test.rb +0 -0
  31. data/test/dynamic_int_test/csharp_test/csharp_test.cs +0 -0
  32. data/test/dynamic_int_test/dynamic_int_test.rb +0 -0
  33. data/test/dynamic_int_test/java_test/JavaTest.java +0 -0
  34. data/test/dynamic_int_test/js_test/js_test.js +1 -5
  35. data/test/dynamic_int_test/ruby_test/ruby_test.rb +0 -0
  36. data/test/ipv6_test/csharp_test/csharp_test.cs +0 -0
  37. data/test/ipv6_test/ipv6_test.rb +0 -0
  38. data/test/ipv6_test/java_test/JavaTest.java +0 -0
  39. data/test/ipv6_test/js_test/js_test.js +1 -5
  40. data/test/ipv6_test/ruby_test/ruby_test.rb +0 -0
  41. data/test/lib/csharp/nunit.framework.dll +0 -0
  42. data/test/lib/java/junit.jar +0 -0
  43. data/test/signed_int_test/csharp_test/csharp_test.cs +0 -0
  44. data/test/signed_int_test/java_test/JavaTest.java +0 -0
  45. data/test/signed_int_test/js_test/js_test.js +1 -5
  46. data/test/signed_int_test/ruby_test/ruby_test.rb +0 -0
  47. data/test/signed_int_test/signed_int_test.rb +0 -0
  48. data/test/unify_test/unify_test.rb +0 -0
  49. metadata +18 -34
  50. data/test/basic_complex_test/graph.jpg +0 -0
  51. data/test/dynamic_int_test/graph.jpg +0 -0
  52. data/test/ipv6_test/graph.jpg +0 -0
  53. data/test/signed_int_test/graph.jpg +0 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 586169794d6b8461baab4af10ef57a52e178039a
4
+ data.tar.gz: 3939d4f5eb57f2b3a30f272044f7dd74ef46a4cb
5
+ SHA512:
6
+ metadata.gz: a9624587d78882b3d5b0cd6e6c730c4ebfc907673d648d23ed8b9a3e0e213435cc9c5fbfcb7255257fa5151471fd4bcace450a6f485bbc50744ddaabb2495ac5
7
+ data.tar.gz: d73c7a67534c01c66fa1832269d926c4c4c9195acc1bfc9b293cc6430010fa9006fe438a93be9515e836c357b5b8949e4ebacf6d6f8f518779ef5b9926f68847
data/.gitignore CHANGED
@@ -31,7 +31,14 @@ test/binaryTree_test/js_test/test_binaryTree.js
31
31
  test/complex_test/js_test/test_complex.js
32
32
  test/ipv6_test/js_test/test_ipv6.js
33
33
  test/signed_int_test/js_test/test_signed_int.js
34
+ test/binaryTree_test/csharp_test/test_binaryTree.cs
35
+ test/complex_test/csharp_test/test_complex.cs
36
+ test/dynamic_int_test/csharp_test/test_dynamic_int.cs
37
+ test/ipv6_test/csharp_test/test_ipv6.cs
38
+ test/signed_int_test/csharp_test/test_signed_int.cs
34
39
  bin.babel
35
40
  bin.babel.csharp
36
41
  bin.babel.rb
37
42
  bin.babel.js
43
+ *.jpg
44
+ .project
data/README.md CHANGED
@@ -6,7 +6,105 @@ This software is still under active development and testing.
6
6
 
7
7
  We support C#, Java, Ruby and Javascript at the moment.
8
8
 
9
- ## Example
9
+
10
+ ## Supported types
11
+
12
+ <table>
13
+ <tr>
14
+ <th>Name</th>
15
+ <th>Range</th>
16
+ <th>Range (hex)</th>
17
+ <th>Description</th>
18
+ </tr>
19
+ <tr>
20
+ <td>int8</td>
21
+ <td>0-255</td>
22
+ <td>0x00-0xFF</td>
23
+ <td>Unsinged integer stored in a singe byte</td>
24
+ </tr>
25
+ <tr>
26
+ <td>int16</td>
27
+ <td>0-65,535</td>
28
+ <td>0x00-0xFFFF</td>
29
+ <td>Unsinged integer stored in two bytes</td>
30
+ </tr>
31
+ <tr>
32
+ <td>int24</td>
33
+ <td>0-16,777,215</td>
34
+ <td>0x00-0xFFFFFF</td>
35
+ <td>Unsinged integer stored in three bytes</td>
36
+ </tr>
37
+ <tr>
38
+ <td>int32</td>
39
+ <td>0-4,294,967,295</td>
40
+ <td>0x00-0xFFFFFFFF</td>
41
+ <td>Unsinged integer stored in four bytes</td>
42
+ </tr>
43
+ <tr>
44
+ <td>dint63</td>
45
+ <td>0-9,223,372,036,854,775,807</td>
46
+ <td>0x00-0x7FFFFFFFFFFFFFFF</td>
47
+ <td>The dynamic int 63 will use between 1 to 9 bytes to represent the value. It will use 1 bit/byte to keep information if the next byte is used for the dynamic int
48
+ <table>
49
+ <tr><th>Size</th><th>Max value</th></tr>
50
+ <tr><td>1 byte</td><td>127</td></tr>
51
+ <tr><td>2 bytes</td><td>16,383</td></tr>
52
+ <tr><td>3 bytes</td><td>2,097,151</td></tr>
53
+ <tr><td>4 bytes</td><td>268,435,455</td></tr>
54
+ <tr><td>5 bytes</td><td>34,359,738,367</td></tr>
55
+ <tr><td>6 bytes</td><td>4,398,046,511,103</td></tr>
56
+ <tr><td>7 bytes</td><td>562,949,953,421,311</td></tr>
57
+ <tr><td>8 bytes</td><td>72,057,594,037,927,935</td></tr>
58
+ <tr><td>9 bytes</td><td>9,223,372,036,854,775,807</td></tr>
59
+ </table>
60
+ </td>
61
+ </tr>
62
+ <tr>
63
+ <td>sint32</td>
64
+ <td>-2,147,483,648 to 2,147,483,647</td>
65
+ <td></td>
66
+ <td>A signed integer that requires 4 bytes</td>
67
+ </tr>
68
+ <tr>
69
+ <td>sint64</td>
70
+ <td>-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807</td>
71
+ <td></td>
72
+ <td>A signed integer that requires 8 bytes</td>
73
+ </tr>
74
+ </table>
75
+
76
+ <table>
77
+ <tr>
78
+ <th>Name</th>
79
+ <th>Description</th>
80
+ </tr>
81
+ <tr>
82
+ <td>bool</td>
83
+ <td>Write a boolean value requiring 1 byte</td>
84
+ </tr>
85
+ <tr>
86
+ <td>binary</td>
87
+ <td>Write a byte array of max 4,294,967,295 bytes</td>
88
+ </tr>
89
+ <tr>
90
+ <td>string</td>
91
+ <td>A UTF-8 based string of max 65,535 bytes (and one UTF8 char is represented by between 1 to 4 bytes)</td>
92
+ </tr>
93
+ <tr>
94
+ <td>ip_number</td>
95
+ <td>A IPv4 or IPv6 number as a string. An IPv4 number require 5 bytes, while an IPv6 number will require somewhere between 3-17 bytes.</td>
96
+ </tr>
97
+ <tr>
98
+ <td>list</td>
99
+ <td>A list of items</td>
100
+ </tr>
101
+ <tr>
102
+ <td>map</td>
103
+ <td>A hash-map of key/value items</td>
104
+ </tr>
105
+ </table>
106
+
107
+ ## Example 1
10
108
 
11
109
 
12
110
  ```ruby
@@ -97,6 +195,181 @@ c2.deserialize(new BabelDataReader(ca));
97
195
  console.log(c2);
98
196
  ```
99
197
 
198
+ ## Example 2
199
+ ```ruby
200
+ require 'divine'
201
+
202
+ struct 'SignedInt' do
203
+ list :list1, :sint32
204
+ list :list2, :sint64
205
+ end
206
+
207
+ Divine::GraphGenerator.new.draw(".", "graph", "jpg")
208
+
209
+ Divine::CodeGenerator.new.generate(:java, file: 'test.java')
210
+ Divine::CodeGenerator.new.generate(:csharp, file: 'test.cs')
211
+ ```
212
+ a Java example that uses the generated file test.java
213
+ ```java
214
+ import java.io.ByteArrayInputStream;
215
+ import java.io.File;
216
+ import java.io.FileInputStream;
217
+ import java.io.FileOutputStream;
218
+ import java.io.IOException;
219
+ import java.util.ArrayList;
220
+
221
+ public class JavaTest {
222
+
223
+ public void testSignedInt() throws IOException {
224
+ SignedInt ser = buildObj();
225
+
226
+ serialize(ser);
227
+ byte[] res = deserialize();
228
+
229
+ SignedInt deser = new SignedInt();
230
+ deser.deserialize(new ByteArrayInputStream(res));
231
+
232
+ compare(ser, deser);
233
+ }
234
+
235
+ public SignedInt buildObj() {
236
+ SignedInt obj = new SignedInt();
237
+ obj.list1 = new ArrayList<Integer>(){{
238
+ add(-1);
239
+ add(-2);
240
+ add(-3);
241
+ add(Integer.MAX_VALUE);
242
+ add(Integer.MIN_VALUE);
243
+ }};
244
+
245
+ obj.list2 = new ArrayList<Long>(){{
246
+ add(-1L);
247
+ add(-2L);
248
+ add(-3L);
249
+ add( (long)Math.pow(2, 54-1)-1 );
250
+ add( (long)(Math.pow(2, (54-1)) - Math.pow(2, 54)) );
251
+ }};
252
+
253
+ return obj;
254
+ }
255
+
256
+ public void compare(SignedInt obj1, SignedInt obj2) {
257
+ for (int i = 0; i < obj1.list1.size(); i++){
258
+ System.out.println("Ser = " + obj1.list1.get(i) + ", Deser = " + obj2.list1.get(i));
259
+ }
260
+ for (int i = 0; i < obj1.list2.size(); i++){
261
+ System.out.println("Ser = " + obj1.list2.get(i) + ", Deser = " + obj2.list2.get(i));
262
+ }
263
+ }
264
+
265
+ public void serialize(Divine obj) throws IOException {
266
+ byte[] data = obj.serialize();
267
+ File file = new File("bin.babel");
268
+ try {
269
+ new FileOutputStream(file).write(data);
270
+ } catch (Exception e) {
271
+ e.printStackTrace();
272
+ }
273
+ }
274
+
275
+ public byte[] deserialize() throws IOException{
276
+ File file = new File("bin.babel");
277
+ byte[] data = new byte[(int) file.length()];
278
+ try {
279
+ new FileInputStream(file).read(data);
280
+ } catch (Exception e) {
281
+ e.printStackTrace();
282
+ }
283
+ return data;
284
+ }
285
+
286
+ }
287
+ ```
288
+ And a C# example that uses the generated file test.cs
289
+ ```csharp
290
+ using System;
291
+ using System.Collections.Generic;
292
+ using System.Text;
293
+ using System.IO;
294
+ using divine;
295
+
296
+ namespace test
297
+ {
298
+ class divine
299
+ {
300
+ public static void Main(String[] args)
301
+ {
302
+ SignedInt ser = buildObj();
303
+ serialize(ser);
304
+ byte[] res = deserialize();
305
+
306
+ SignedInt deser = new SignedInt();
307
+ deser.deserialize(new MemoryStream(res));
308
+
309
+ compare(ser, deser);
310
+
311
+ System.Console.Read();
312
+
313
+ }
314
+
315
+ public static SignedInt buildObj() {
316
+ SignedInt obj = new SignedInt();
317
+ obj.list1.Add(-1);
318
+ obj.list1.Add(-2);
319
+ obj.list1.Add(-3);
320
+ obj.list1.Add(int.MaxValue);
321
+ obj.list1.Add(int.MinValue);
322
+
323
+ obj.list2.Add(-1);
324
+ obj.list2.Add(-2);
325
+ obj.list2.Add(-3);
326
+ obj.list2.Add( (long) Math.Pow(2, 53) -1 );
327
+ obj.list2.Add( (long) (Math.Pow(2, 53) - Math.Pow(2, 54)) );
328
+ return obj;
329
+ }
330
+
331
+ public static void compare(SignedInt obj1, SignedInt obj2)
332
+ {
333
+ for (int i = 0; i < obj1.list1.Count; i++)
334
+ {
335
+ System.Console.Write("Ser = " + obj1.list1[i] + ", Deser = " + obj2.list1[i] + "\n");
336
+ }
337
+ for (int i = 0; i < obj1.list2.Count; i++)
338
+ {
339
+ System.Console.Write("Ser = " + obj1.list2[i] + ", Deser = " + obj2.list2[i] + "\n");
340
+ }
341
+ }
342
+
343
+ public static void serialize(Divine obj)
344
+ {
345
+ try
346
+ {
347
+ byte[] data = obj.serialize();
348
+ File.WriteAllBytes("bin.babel", data);
349
+ }
350
+ catch (System.IO.IOException ex)
351
+ {
352
+ throw ex;
353
+ }
354
+ }
355
+
356
+ public static byte[] deserialize()
357
+ {
358
+ try
359
+ {
360
+ byte[] data = File.ReadAllBytes("bin.babel");
361
+ return data;
362
+ }
363
+ catch (System.IO.IOException ex)
364
+ {
365
+ throw ex;
366
+ }
367
+ }
368
+
369
+ }
370
+ }
371
+ ```
372
+
100
373
  ### Versioning
101
374
  ```ruby
102
375
  require 'divine'
@@ -164,7 +437,17 @@ Divine::GraphGenerator.new.draw(".", "graph", "jpg")
164
437
  ```
165
438
 
166
439
 
440
+ ## Caveats
441
+ Javascript does only support numbers in the range of -9,007,199,254,740,992 to 9,007,199,254,740,991, a runtime error is thrown if you try to deserialize bigger number.
442
+
443
+
167
444
  ## Change log
445
+ Version 0.0.5
446
+
447
+ * Adapted to docile 1.1.5
448
+ * Removed short_binary
449
+
450
+
168
451
  Version 0.0.4
169
452
 
170
453
  * Added dint63 (Dynamic Int 63)
@@ -173,7 +456,7 @@ Version 0.0.4
173
456
  Version 0.0.3
174
457
 
175
458
  * Added C# code generator
176
- * Added sint64 (Signed Int 64)
459
+ * Added sint32 and sint64 (Signed Int 32 and 64)
177
460
  * Added versioning and freezing
178
461
 
179
462
 
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
19
 
20
- gem.add_dependency(%q<docile>, [">= 1.0.0"])
20
+ gem.add_dependency(%q<docile>, [">= 1.1.0"])
21
21
  gem.add_dependency(%q<erubis>, [">= 2.7.0"])
22
- gem.add_dependency(%q<ruby-graphviz>, [">= 1.0.8"])
22
+ gem.add_dependency(%q<ruby-graphviz>, [">= 1.2.0"])
23
23
  end
File without changes
@@ -105,7 +105,7 @@ namespace divine
105
105
  // Force utf8
106
106
  try
107
107
  {
108
- return System.Text.Encoding.UTF8.GetString(readBytes(readInt16(data), data));
108
+ return System.Text.Encoding.UTF8.GetString(readBytes((int)readDint63(data), data));
109
109
  }
110
110
  catch (System.IO.IOException ex)
111
111
  {
@@ -131,7 +131,7 @@ namespace divine
131
131
  {
132
132
  try
133
133
  {
134
- long c = readInt32(data);
134
+ long c = readDint63(data);
135
135
  if (c > int.MaxValue)
136
136
  {
137
137
  throw new System.IndexOutOfRangeException("Binary data to big for csharp");
@@ -144,23 +144,11 @@ namespace divine
144
144
  }
145
145
  }
146
146
 
147
- protected byte[] readShortBinary(MemoryStream data)
148
- {
149
- try
150
- {
151
- return readBytes(readInt8(data), data);
152
- }
153
- catch (System.IO.IOException ex)
154
- {
155
- throw ex;
156
- }
157
- }
158
-
159
147
  protected String readIpNumber(MemoryStream data)
160
148
  {
161
149
  try
162
150
  {
163
- byte[] ips = readShortBinary(data);
151
+ byte[] ips = readBytes(readInt8(data), data);
164
152
  if (ips.Length == 4)
165
153
  {
166
154
  return readIpv4Number(ips);
@@ -313,7 +301,7 @@ namespace divine
313
301
  for (int i = matches.Count - 1; i >= 0 ; i--)
314
302
  {
315
303
  String val = matches[i].Value;
316
- val += new String(new char[7 - val.Length]).Replace("\\\\0", "0") + Math.Min(i, 1);
304
+ val += new String('0', (7 - val.Length)) + Math.Min(i, 1);
317
305
  charArray = val.ToCharArray();
318
306
  Array.Reverse(charArray);
319
307
  String str = new String(charArray);
@@ -338,7 +326,7 @@ namespace divine
338
326
  {
339
327
  raiseError("Too large string: " + bs.Length + " bytes");
340
328
  }
341
- writeInt16((ushort)bs.Length, output);
329
+ writeDint63((long)bs.Length, output);
342
330
  output.Write(bs, 0, bs.Length);
343
331
  }
344
332
  catch (System.IO.IOException ex)
@@ -355,7 +343,7 @@ namespace divine
355
343
  {
356
344
  raiseError("Too large binary: " + v.Length + " bytes");
357
345
  }
358
- writeInt32((uint)v.Length, output);
346
+ writeDint63((long)v.Length, output);
359
347
  output.Write(v, 0, v.Length);
360
348
  }
361
349
  catch (System.IO.IOException ex)
@@ -384,23 +372,6 @@ namespace divine
384
372
  }
385
373
  }
386
374
 
387
- protected void writeShortBinary(byte[] v, MemoryStream output)
388
- {
389
- try
390
- {
391
- if (v.Length > 0xFF)
392
- {
393
- raiseError("Too large short_binary: " + v.Length + " bytes");
394
- }
395
- writeInt8((byte)v.Length, output);
396
- output.Write(v, 0, v.Length);
397
- }
398
- catch (System.IO.IOException ex)
399
- {
400
- throw ex;
401
- }
402
- }
403
-
404
375
  protected void writeIpNumber(String v, MemoryStream output)
405
376
  {
406
377
  try
@@ -437,7 +408,8 @@ namespace divine
437
408
  }
438
409
  if (ss.Length == 0 || ss.Length == 4)
439
410
  {
440
- writeShortBinary(ss, output);
411
+ writeInt8((byte)ss.Length, output);
412
+ output.Write(ss, 0, ss.Length);
441
413
  }
442
414
  else
443
415
  {
@@ -627,7 +599,6 @@ EOS
627
599
  # * string --> ""
628
600
  # * ip_number--> ""
629
601
  # * binary --> new byte[0]
630
- # * short_binary --> new byte[0]
631
602
  # * list --> new List<type>()
632
603
  # * map --> new Dictionary<keyType, valueType>()
633
604
 
@@ -650,12 +621,14 @@ EOS
650
621
 
651
622
  else
652
623
  case types
653
- when :binary, :short_binary
624
+ when :binary
654
625
  "new byte[0]"
655
626
  when :int8, :int16, :int32, :sint32, :sint64, :dint63
656
627
  "0"
657
628
  when :string, :ip_number
658
629
  "\"\""
630
+ when :bool
631
+ "false"
659
632
  else
660
633
  if $all_structs[types]
661
634
  types
@@ -677,7 +650,6 @@ EOS
677
650
  # * string --> string
678
651
  # * ip_number--> string
679
652
  # * binary --> byte[]
680
- # * short_binary --> byte[]
681
653
  # * list --> List<type>
682
654
  # * map --> Dictionary<keyType, valueType>
683
655
 
@@ -703,20 +675,22 @@ EOS
703
675
 
704
676
  else
705
677
  case types
706
- when :binary, :short_binary
678
+ when :binary
707
679
  "byte[]"
708
680
  when :int8
709
- "byte"
710
- when :int16
711
- "ushort"
712
- when :int32
681
+ "byte"
682
+ when :int16
683
+ "ushort"
684
+ when :int32
713
685
  "uint"
714
686
  when :sint32
715
- "int"
716
- when :sint64, :dint63
687
+ "int"
688
+ when :sint64, :dint63
717
689
  "long"
718
690
  when :string, :ip_number
719
691
  "string"
692
+ when :bool
693
+ "bool"
720
694
  else
721
695
  if $all_structs[types]
722
696
  types
@@ -739,7 +713,7 @@ EOS
739
713
  nv = get_fresh_variable_name
740
714
  idx = get_fresh_variable_name
741
715
  return [
742
- "writeInt32((uint)#{var}.Count, baos);",
716
+ "writeDint63((long)#{var}.Count, baos);",
743
717
  "for(int #{idx}=0; #{idx}<#{var}.Count; #{idx}++) {",
744
718
  :indent,
745
719
  "#{csharp_get_type_declaration types[1]} #{nv} = #{var}[#{idx}];",
@@ -751,7 +725,7 @@ EOS
751
725
  nv1 = get_fresh_variable_name
752
726
  nv2 = get_fresh_variable_name
753
727
  return [
754
- "writeInt32((uint)#{var}.Count, baos);",
728
+ "writeDint63((long)#{var}.Count, baos);",
755
729
  "foreach (#{csharp_get_type_declaration types[1]} #{nv1} in #{var}.Keys) {",
756
730
  :indent,
757
731
  "#{csharp_get_type_declaration types[2]} #{nv2} = #{var}[#{nv1}];",
@@ -791,7 +765,7 @@ EOS
791
765
  iter = get_fresh_variable_name
792
766
  return [
793
767
  "#{"#{csharp_get_type_declaration(types)} " unless var.include? "this."}#{var} = #{csharp_get_empty_declaration(types)};",
794
- "uint #{count} = this.readInt32(bais);",
768
+ "uint #{count} = (uint)this.readDint63(bais);",
795
769
  "for(int #{iter}=0; #{iter}<#{count}; #{iter}++) {",
796
770
  :indent,
797
771
  csharp_deserialize_internal(nv, types[1]),
@@ -805,7 +779,7 @@ EOS
805
779
  nv2 = get_fresh_variable_name
806
780
  iter = get_fresh_variable_name
807
781
  return ["#{"#{csharp_get_type_declaration(types)} " unless var.include? "this."}#{var} = #{csharp_get_empty_declaration(types)};",
808
- "uint #{count} = readInt32(bais);",
782
+ "uint #{count} = (uint)readDint63(bais);",
809
783
  "for(int #{iter}=0; #{iter}<#{count}; #{iter}++) {",
810
784
  :indent,
811
785
  csharp_deserialize_internal(nv1, types[1]),