protoc 2.6.1.1 → 2.6.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (479) hide show
  1. checksums.yaml +4 -4
  2. data/ext/protoc/Makefile.in +10 -13
  3. data/ext/protoc/extconf.rb +0 -1
  4. data/ext/protoc/protobuf/CHANGES.txt +593 -0
  5. data/ext/protoc/protobuf/CONTRIBUTORS.txt +93 -0
  6. data/ext/protoc/protobuf/INSTALL.txt +237 -0
  7. data/ext/protoc/protobuf/LICENSE +33 -0
  8. data/ext/protoc/protobuf/Makefile.am +267 -0
  9. data/ext/protoc/protobuf/README.md +167 -0
  10. data/ext/protoc/protobuf/autogen.sh +41 -0
  11. data/ext/protoc/protobuf/benchmarks/ProtoBench.java +203 -0
  12. data/ext/protoc/protobuf/benchmarks/google_message1.dat +0 -0
  13. data/ext/protoc/protobuf/benchmarks/google_message2.dat +0 -0
  14. data/ext/protoc/protobuf/benchmarks/google_size.proto +136 -0
  15. data/ext/protoc/protobuf/benchmarks/google_speed.proto +136 -0
  16. data/ext/protoc/protobuf/benchmarks/readme.txt +50 -0
  17. data/ext/protoc/protobuf/configure.ac +159 -0
  18. data/ext/protoc/protobuf/editors/README.txt +5 -0
  19. data/ext/protoc/protobuf/editors/proto.vim +105 -0
  20. data/ext/protoc/protobuf/editors/protobuf-mode.el +220 -0
  21. data/ext/protoc/protobuf/examples/AddPerson.java +95 -0
  22. data/ext/protoc/protobuf/examples/ListPeople.java +50 -0
  23. data/ext/protoc/protobuf/examples/Makefile +58 -0
  24. data/ext/protoc/protobuf/examples/README.txt +29 -0
  25. data/ext/protoc/protobuf/examples/add_person.cc +95 -0
  26. data/ext/protoc/protobuf/examples/add_person.py +58 -0
  27. data/ext/protoc/protobuf/examples/addressbook.proto +30 -0
  28. data/ext/protoc/protobuf/examples/list_people.cc +68 -0
  29. data/ext/protoc/protobuf/examples/list_people.py +38 -0
  30. data/ext/protoc/protobuf/generate_descriptor_proto.sh +33 -0
  31. data/ext/protoc/protobuf/java/README.txt +96 -0
  32. data/ext/protoc/protobuf/java/pom.xml +217 -0
  33. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java +466 -0
  34. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java +355 -0
  35. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractParser.java +253 -0
  36. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java +51 -0
  37. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java +64 -0
  38. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BoundedByteString.java +163 -0
  39. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ByteString.java +1022 -0
  40. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java +1311 -0
  41. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java +1297 -0
  42. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java +2238 -0
  43. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java +622 -0
  44. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Extension.java +96 -0
  45. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java +392 -0
  46. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java +185 -0
  47. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java +907 -0
  48. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java +2213 -0
  49. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java +949 -0
  50. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Internal.java +391 -0
  51. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java +122 -0
  52. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyField.java +154 -0
  53. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyFieldLite.java +176 -0
  54. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java +367 -0
  55. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java +163 -0
  56. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LiteralByteString.java +362 -0
  57. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Message.java +244 -0
  58. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java +320 -0
  59. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java +60 -0
  60. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java +143 -0
  61. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageReflection.java +931 -0
  62. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Parser.java +261 -0
  63. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java +58 -0
  64. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ProtocolStringList.java +48 -0
  65. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java +696 -0
  66. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RopeByteString.java +957 -0
  67. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java +47 -0
  68. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java +71 -0
  69. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcController.java +118 -0
  70. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java +134 -0
  71. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Service.java +117 -0
  72. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java +52 -0
  73. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java +241 -0
  74. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java +618 -0
  75. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java +1984 -0
  76. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java +99 -0
  77. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java +995 -0
  78. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java +205 -0
  79. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Utf8.java +349 -0
  80. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java +163 -0
  81. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java +527 -0
  82. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/BoundedByteStringTest.java +68 -0
  83. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ByteStringTest.java +759 -0
  84. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CheckUtf8Test.java +141 -0
  85. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java +769 -0
  86. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java +401 -0
  87. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java +80 -0
  88. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java +735 -0
  89. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java +326 -0
  90. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java +48 -0
  91. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java +1515 -0
  92. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8Test.java +180 -0
  93. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java +421 -0
  94. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyFieldLiteTest.java +134 -0
  95. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyFieldTest.java +121 -0
  96. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyMessageLiteTest.java +319 -0
  97. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java +174 -0
  98. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java +143 -0
  99. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java +85 -0
  100. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java +148 -0
  101. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteralByteStringTest.java +396 -0
  102. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java +353 -0
  103. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java +185 -0
  104. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ParserTest.java +381 -0
  105. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java +190 -0
  106. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringSubstringTest.java +97 -0
  107. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringTest.java +115 -0
  108. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java +320 -0
  109. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java +155 -0
  110. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java +420 -0
  111. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java +96 -0
  112. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java +4124 -0
  113. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java +994 -0
  114. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java +653 -0
  115. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java +227 -0
  116. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java +606 -0
  117. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/lazy_fields_lite.proto +61 -0
  118. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/lite_equals_and_hash.proto +55 -0
  119. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto +77 -0
  120. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto +53 -0
  121. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto +46 -0
  122. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto +48 -0
  123. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto +49 -0
  124. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto +50 -0
  125. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test.proto +38 -0
  126. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test2.proto +42 -0
  127. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test3.proto +43 -0
  128. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto +157 -0
  129. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_check_utf8.proto +50 -0
  130. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_check_utf8_size.proto +51 -0
  131. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_custom_options.proto +43 -0
  132. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_extra_interfaces.proto +60 -0
  133. data/ext/protoc/protobuf/m4/ac_system_extensions.m4 +37 -0
  134. data/ext/protoc/protobuf/m4/acx_check_suncc.m4 +75 -0
  135. data/ext/protoc/protobuf/m4/acx_pthread.m4 +397 -0
  136. data/ext/protoc/protobuf/m4/stl_hash.m4 +72 -0
  137. data/ext/protoc/protobuf/more_tests/Makefile +41 -0
  138. data/ext/protoc/protobuf/post_process_dist.sh +60 -0
  139. data/ext/protoc/protobuf/protobuf-lite.pc.in +13 -0
  140. data/ext/protoc/protobuf/protobuf.pc.in +14 -0
  141. data/ext/protoc/protobuf/python/README.txt +105 -0
  142. data/ext/protoc/protobuf/python/ez_setup.py +284 -0
  143. data/ext/protoc/protobuf/python/google/__init__.py +1 -0
  144. data/ext/protoc/protobuf/python/google/protobuf/__init__.py +0 -0
  145. data/ext/protoc/protobuf/python/google/protobuf/descriptor.py +849 -0
  146. data/ext/protoc/protobuf/python/google/protobuf/descriptor_database.py +137 -0
  147. data/ext/protoc/protobuf/python/google/protobuf/descriptor_pool.py +643 -0
  148. data/ext/protoc/protobuf/python/google/protobuf/internal/__init__.py +0 -0
  149. data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation.cc +139 -0
  150. data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation.py +89 -0
  151. data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation_default_test.py +63 -0
  152. data/ext/protoc/protobuf/python/google/protobuf/internal/containers.py +269 -0
  153. data/ext/protoc/protobuf/python/google/protobuf/internal/cpp_message.py +663 -0
  154. data/ext/protoc/protobuf/python/google/protobuf/internal/decoder.py +831 -0
  155. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_database_test.py +63 -0
  156. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test.py +564 -0
  157. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test1.proto +94 -0
  158. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test2.proto +70 -0
  159. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_python_test.py +54 -0
  160. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_test.py +669 -0
  161. data/ext/protoc/protobuf/python/google/protobuf/internal/encoder.py +788 -0
  162. data/ext/protoc/protobuf/python/google/protobuf/internal/enum_type_wrapper.py +89 -0
  163. data/ext/protoc/protobuf/python/google/protobuf/internal/factory_test1.proto +57 -0
  164. data/ext/protoc/protobuf/python/google/protobuf/internal/factory_test2.proto +92 -0
  165. data/ext/protoc/protobuf/python/google/protobuf/internal/generator_test.py +343 -0
  166. data/ext/protoc/protobuf/python/google/protobuf/internal/message_factory_python_test.py +54 -0
  167. data/ext/protoc/protobuf/python/google/protobuf/internal/message_factory_test.py +131 -0
  168. data/ext/protoc/protobuf/python/google/protobuf/internal/message_listener.py +78 -0
  169. data/ext/protoc/protobuf/python/google/protobuf/internal/message_python_test.py +54 -0
  170. data/ext/protoc/protobuf/python/google/protobuf/internal/message_test.py +681 -0
  171. data/ext/protoc/protobuf/python/google/protobuf/internal/missing_enum_values.proto +50 -0
  172. data/ext/protoc/protobuf/python/google/protobuf/internal/more_extensions.proto +58 -0
  173. data/ext/protoc/protobuf/python/google/protobuf/internal/more_extensions_dynamic.proto +49 -0
  174. data/ext/protoc/protobuf/python/google/protobuf/internal/more_messages.proto +51 -0
  175. data/ext/protoc/protobuf/python/google/protobuf/internal/python_message.py +1251 -0
  176. data/ext/protoc/protobuf/python/google/protobuf/internal/reflection_test.py +2934 -0
  177. data/ext/protoc/protobuf/python/google/protobuf/internal/service_reflection_test.py +136 -0
  178. data/ext/protoc/protobuf/python/google/protobuf/internal/symbol_database_test.py +120 -0
  179. data/ext/protoc/protobuf/python/google/protobuf/internal/test_bad_identifiers.proto +52 -0
  180. data/ext/protoc/protobuf/python/google/protobuf/internal/test_util.py +662 -0
  181. data/ext/protoc/protobuf/python/google/protobuf/internal/text_encoding_test.py +68 -0
  182. data/ext/protoc/protobuf/python/google/protobuf/internal/text_format_test.py +743 -0
  183. data/ext/protoc/protobuf/python/google/protobuf/internal/type_checkers.py +328 -0
  184. data/ext/protoc/protobuf/python/google/protobuf/internal/unknown_fields_test.py +231 -0
  185. data/ext/protoc/protobuf/python/google/protobuf/internal/wire_format.py +268 -0
  186. data/ext/protoc/protobuf/python/google/protobuf/internal/wire_format_test.py +253 -0
  187. data/ext/protoc/protobuf/python/google/protobuf/message.py +284 -0
  188. data/ext/protoc/protobuf/python/google/protobuf/message_factory.py +155 -0
  189. data/ext/protoc/protobuf/python/google/protobuf/pyext/README +6 -0
  190. data/ext/protoc/protobuf/python/google/protobuf/pyext/__init__.py +0 -0
  191. data/ext/protoc/protobuf/python/google/protobuf/pyext/cpp_message.py +61 -0
  192. data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor.cc +357 -0
  193. data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor.h +96 -0
  194. data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor_cpp2_test.py +58 -0
  195. data/ext/protoc/protobuf/python/google/protobuf/pyext/extension_dict.cc +338 -0
  196. data/ext/protoc/protobuf/python/google/protobuf/pyext/extension_dict.h +123 -0
  197. data/ext/protoc/protobuf/python/google/protobuf/pyext/message.cc +2561 -0
  198. data/ext/protoc/protobuf/python/google/protobuf/pyext/message.h +305 -0
  199. data/ext/protoc/protobuf/python/google/protobuf/pyext/message_factory_cpp2_test.py +56 -0
  200. data/ext/protoc/protobuf/python/google/protobuf/pyext/proto2_api_test.proto +38 -0
  201. data/ext/protoc/protobuf/python/google/protobuf/pyext/python.proto +66 -0
  202. data/ext/protoc/protobuf/python/google/protobuf/pyext/python_protobuf.h +57 -0
  203. data/ext/protoc/protobuf/python/google/protobuf/pyext/reflection_cpp2_generated_test.py +94 -0
  204. data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_composite_container.cc +763 -0
  205. data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_composite_container.h +172 -0
  206. data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_scalar_container.cc +825 -0
  207. data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_scalar_container.h +112 -0
  208. data/ext/protoc/protobuf/python/google/protobuf/pyext/scoped_pyobject_ptr.h +95 -0
  209. data/ext/protoc/protobuf/python/google/protobuf/reflection.py +205 -0
  210. data/ext/protoc/protobuf/python/google/protobuf/service.py +226 -0
  211. data/ext/protoc/protobuf/python/google/protobuf/service_reflection.py +284 -0
  212. data/ext/protoc/protobuf/python/google/protobuf/symbol_database.py +185 -0
  213. data/ext/protoc/protobuf/python/google/protobuf/text_encoding.py +110 -0
  214. data/ext/protoc/protobuf/python/google/protobuf/text_format.py +873 -0
  215. data/ext/protoc/protobuf/python/mox.py +1401 -0
  216. data/ext/protoc/protobuf/python/setup.py +201 -0
  217. data/ext/protoc/protobuf/python/stubout.py +140 -0
  218. data/ext/protoc/protobuf/src/Makefile.am +418 -0
  219. data/ext/protoc/protobuf/src/google/protobuf/SEBS +240 -0
  220. data/ext/protoc/protobuf/src/google/protobuf/compiler/code_generator.cc +84 -0
  221. data/ext/protoc/protobuf/src/google/protobuf/compiler/code_generator.h +145 -0
  222. data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface.cc +1603 -0
  223. data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface.h +378 -0
  224. data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc +1654 -0
  225. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc +158 -0
  226. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc +288 -0
  227. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h +103 -0
  228. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc +431 -0
  229. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h +122 -0
  230. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc +210 -0
  231. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h +86 -0
  232. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc +166 -0
  233. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h +185 -0
  234. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc +665 -0
  235. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h +99 -0
  236. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc +125 -0
  237. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
  238. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc +494 -0
  239. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h +206 -0
  240. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc +2645 -0
  241. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h +175 -0
  242. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc +375 -0
  243. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h +121 -0
  244. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_options.h +58 -0
  245. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc +123 -0
  246. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc +451 -0
  247. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +123 -0
  248. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc +334 -0
  249. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
  250. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc +642 -0
  251. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h +127 -0
  252. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto +132 -0
  253. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc +2074 -0
  254. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.h +51 -0
  255. data/ext/protoc/protobuf/src/google/protobuf/compiler/importer.cc +480 -0
  256. data/ext/protoc/protobuf/src/google/protobuf/compiler/importer.h +317 -0
  257. data/ext/protoc/protobuf/src/google/protobuf/compiler/importer_unittest.cc +617 -0
  258. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_context.cc +195 -0
  259. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_context.h +95 -0
  260. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment.cc +233 -0
  261. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment.h +69 -0
  262. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment_unittest.cc +67 -0
  263. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum.cc +333 -0
  264. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum.h +99 -0
  265. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc +778 -0
  266. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum_field.h +158 -0
  267. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_extension.cc +207 -0
  268. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_extension.h +109 -0
  269. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_field.cc +213 -0
  270. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_field.h +162 -0
  271. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_file.cc +534 -0
  272. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_file.h +115 -0
  273. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator.cc +158 -0
  274. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator.h +72 -0
  275. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator_factory.cc +77 -0
  276. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator_factory.h +101 -0
  277. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_helpers.cc +737 -0
  278. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_helpers.h +322 -0
  279. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.cc +826 -0
  280. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.h +121 -0
  281. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message.cc +1666 -0
  282. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message.h +140 -0
  283. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message_field.cc +1343 -0
  284. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message_field.h +173 -0
  285. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_name_resolver.cc +266 -0
  286. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_name_resolver.h +124 -0
  287. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc +124 -0
  288. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc +877 -0
  289. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h +160 -0
  290. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_service.cc +473 -0
  291. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_service.h +135 -0
  292. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.cc +201 -0
  293. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.h +90 -0
  294. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_string_field.cc +1056 -0
  295. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_string_field.h +160 -0
  296. data/ext/protoc/protobuf/src/google/protobuf/compiler/main.cc +61 -0
  297. data/ext/protoc/protobuf/src/google/protobuf/compiler/mock_code_generator.cc +240 -0
  298. data/ext/protoc/protobuf/src/google/protobuf/compiler/mock_code_generator.h +117 -0
  299. data/ext/protoc/protobuf/src/google/protobuf/compiler/package_info.h +64 -0
  300. data/ext/protoc/protobuf/src/google/protobuf/compiler/parser.cc +1750 -0
  301. data/ext/protoc/protobuf/src/google/protobuf/compiler/parser.h +522 -0
  302. data/ext/protoc/protobuf/src/google/protobuf/compiler/parser_unittest.cc +2612 -0
  303. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.cc +163 -0
  304. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.h +72 -0
  305. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.pb.cc +1148 -0
  306. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.pb.h +897 -0
  307. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.proto +147 -0
  308. data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_generator.cc +1262 -0
  309. data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_generator.h +166 -0
  310. data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc +118 -0
  311. data/ext/protoc/protobuf/src/google/protobuf/compiler/subprocess.cc +463 -0
  312. data/ext/protoc/protobuf/src/google/protobuf/compiler/subprocess.h +108 -0
  313. data/ext/protoc/protobuf/src/google/protobuf/compiler/test_plugin.cc +51 -0
  314. data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh +91 -0
  315. data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_writer.cc +218 -0
  316. data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_writer.h +93 -0
  317. data/ext/protoc/protobuf/src/google/protobuf/descriptor.cc +5420 -0
  318. data/ext/protoc/protobuf/src/google/protobuf/descriptor.h +1691 -0
  319. data/ext/protoc/protobuf/src/google/protobuf/descriptor.pb.cc +9135 -0
  320. data/ext/protoc/protobuf/src/google/protobuf/descriptor.pb.h +6761 -0
  321. data/ext/protoc/protobuf/src/google/protobuf/descriptor.proto +687 -0
  322. data/ext/protoc/protobuf/src/google/protobuf/descriptor_database.cc +543 -0
  323. data/ext/protoc/protobuf/src/google/protobuf/descriptor_database.h +369 -0
  324. data/ext/protoc/protobuf/src/google/protobuf/descriptor_database_unittest.cc +748 -0
  325. data/ext/protoc/protobuf/src/google/protobuf/descriptor_pb2_test.py +54 -0
  326. data/ext/protoc/protobuf/src/google/protobuf/descriptor_unittest.cc +5501 -0
  327. data/ext/protoc/protobuf/src/google/protobuf/dynamic_message.cc +764 -0
  328. data/ext/protoc/protobuf/src/google/protobuf/dynamic_message.h +148 -0
  329. data/ext/protoc/protobuf/src/google/protobuf/dynamic_message_unittest.cc +230 -0
  330. data/ext/protoc/protobuf/src/google/protobuf/extension_set.cc +1663 -0
  331. data/ext/protoc/protobuf/src/google/protobuf/extension_set.h +1234 -0
  332. data/ext/protoc/protobuf/src/google/protobuf/extension_set_heavy.cc +734 -0
  333. data/ext/protoc/protobuf/src/google/protobuf/extension_set_unittest.cc +1095 -0
  334. data/ext/protoc/protobuf/src/google/protobuf/generated_enum_reflection.h +91 -0
  335. data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection.cc +1683 -0
  336. data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection.h +504 -0
  337. data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc +795 -0
  338. data/ext/protoc/protobuf/src/google/protobuf/generated_message_util.cc +65 -0
  339. data/ext/protoc/protobuf/src/google/protobuf/generated_message_util.h +113 -0
  340. data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream.cc +914 -0
  341. data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream.h +1220 -0
  342. data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream_inl.h +69 -0
  343. data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream_unittest.cc +1378 -0
  344. data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream.cc +326 -0
  345. data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream.h +209 -0
  346. data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh +44 -0
  347. data/ext/protoc/protobuf/src/google/protobuf/io/package_info.h +54 -0
  348. data/ext/protoc/protobuf/src/google/protobuf/io/printer.cc +198 -0
  349. data/ext/protoc/protobuf/src/google/protobuf/io/printer.h +136 -0
  350. data/ext/protoc/protobuf/src/google/protobuf/io/printer_unittest.cc +285 -0
  351. data/ext/protoc/protobuf/src/google/protobuf/io/strtod.cc +113 -0
  352. data/ext/protoc/protobuf/src/google/protobuf/io/strtod.h +50 -0
  353. data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer.cc +1127 -0
  354. data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer.h +402 -0
  355. data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer_unittest.cc +999 -0
  356. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream.cc +57 -0
  357. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream.h +248 -0
  358. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc +473 -0
  359. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h +358 -0
  360. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc +405 -0
  361. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h +354 -0
  362. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc +965 -0
  363. data/ext/protoc/protobuf/src/google/protobuf/lite_unittest.cc +350 -0
  364. data/ext/protoc/protobuf/src/google/protobuf/message.cc +358 -0
  365. data/ext/protoc/protobuf/src/google/protobuf/message.h +866 -0
  366. data/ext/protoc/protobuf/src/google/protobuf/message_lite.cc +335 -0
  367. data/ext/protoc/protobuf/src/google/protobuf/message_lite.h +247 -0
  368. data/ext/protoc/protobuf/src/google/protobuf/message_unittest.cc +427 -0
  369. data/ext/protoc/protobuf/src/google/protobuf/package_info.h +64 -0
  370. data/ext/protoc/protobuf/src/google/protobuf/reflection_ops.cc +269 -0
  371. data/ext/protoc/protobuf/src/google/protobuf/reflection_ops.h +81 -0
  372. data/ext/protoc/protobuf/src/google/protobuf/reflection_ops_unittest.cc +475 -0
  373. data/ext/protoc/protobuf/src/google/protobuf/repeated_field.cc +87 -0
  374. data/ext/protoc/protobuf/src/google/protobuf/repeated_field.h +1603 -0
  375. data/ext/protoc/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc +195 -0
  376. data/ext/protoc/protobuf/src/google/protobuf/repeated_field_unittest.cc +1442 -0
  377. data/ext/protoc/protobuf/src/google/protobuf/service.cc +46 -0
  378. data/ext/protoc/protobuf/src/google/protobuf/service.h +291 -0
  379. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops.h +227 -0
  380. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h +325 -0
  381. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h +151 -0
  382. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h +146 -0
  383. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h +122 -0
  384. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h +137 -0
  385. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h +225 -0
  386. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h +313 -0
  387. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h +73 -0
  388. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_solaris.h +188 -0
  389. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h +219 -0
  390. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc +137 -0
  391. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h +293 -0
  392. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc +112 -0
  393. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h +150 -0
  394. data/ext/protoc/protobuf/src/google/protobuf/stubs/common.cc +395 -0
  395. data/ext/protoc/protobuf/src/google/protobuf/stubs/common.h +1226 -0
  396. data/ext/protoc/protobuf/src/google/protobuf/stubs/common_unittest.cc +357 -0
  397. data/ext/protoc/protobuf/src/google/protobuf/stubs/hash.h +232 -0
  398. data/ext/protoc/protobuf/src/google/protobuf/stubs/map_util.h +771 -0
  399. data/ext/protoc/protobuf/src/google/protobuf/stubs/once.cc +99 -0
  400. data/ext/protoc/protobuf/src/google/protobuf/stubs/once.h +166 -0
  401. data/ext/protoc/protobuf/src/google/protobuf/stubs/once_unittest.cc +253 -0
  402. data/ext/protoc/protobuf/src/google/protobuf/stubs/platform_macros.h +103 -0
  403. data/ext/protoc/protobuf/src/google/protobuf/stubs/shared_ptr.h +470 -0
  404. data/ext/protoc/protobuf/src/google/protobuf/stubs/stl_util.h +121 -0
  405. data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf.cc +175 -0
  406. data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf.h +76 -0
  407. data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf_unittest.cc +152 -0
  408. data/ext/protoc/protobuf/src/google/protobuf/stubs/structurally_valid.cc +536 -0
  409. data/ext/protoc/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc +40 -0
  410. data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil.cc +1279 -0
  411. data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil.h +562 -0
  412. data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil_unittest.cc +73 -0
  413. data/ext/protoc/protobuf/src/google/protobuf/stubs/substitute.cc +134 -0
  414. data/ext/protoc/protobuf/src/google/protobuf/stubs/substitute.h +170 -0
  415. data/ext/protoc/protobuf/src/google/protobuf/stubs/template_util.h +138 -0
  416. data/ext/protoc/protobuf/src/google/protobuf/stubs/template_util_unittest.cc +130 -0
  417. data/ext/protoc/protobuf/src/google/protobuf/stubs/type_traits.h +336 -0
  418. data/ext/protoc/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc +628 -0
  419. data/ext/protoc/protobuf/src/google/protobuf/test_util.cc +3345 -0
  420. data/ext/protoc/protobuf/src/google/protobuf/test_util.h +215 -0
  421. data/ext/protoc/protobuf/src/google/protobuf/test_util_lite.cc +1585 -0
  422. data/ext/protoc/protobuf/src/google/protobuf/test_util_lite.h +101 -0
  423. data/ext/protoc/protobuf/src/google/protobuf/testdata/bad_utf8_string +1 -0
  424. data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_message +0 -0
  425. data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_message_oneof_implemented +0 -0
  426. data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_packed_fields_message +0 -0
  427. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt +134 -0
  428. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_oneof_implemented.txt +129 -0
  429. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy.txt +134 -0
  430. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy_oneof.txt +129 -0
  431. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt +134 -0
  432. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data_pointy.txt +134 -0
  433. data/ext/protoc/protobuf/src/google/protobuf/testing/file.cc +194 -0
  434. data/ext/protoc/protobuf/src/google/protobuf/testing/file.h +97 -0
  435. data/ext/protoc/protobuf/src/google/protobuf/testing/googletest.cc +255 -0
  436. data/ext/protoc/protobuf/src/google/protobuf/testing/googletest.h +102 -0
  437. data/ext/protoc/protobuf/src/google/protobuf/testing/zcgunzip.cc +73 -0
  438. data/ext/protoc/protobuf/src/google/protobuf/testing/zcgzip.cc +79 -0
  439. data/ext/protoc/protobuf/src/google/protobuf/text_format.cc +1746 -0
  440. data/ext/protoc/protobuf/src/google/protobuf/text_format.h +473 -0
  441. data/ext/protoc/protobuf/src/google/protobuf/text_format_unittest.cc +1479 -0
  442. data/ext/protoc/protobuf/src/google/protobuf/unittest.proto +861 -0
  443. data/ext/protoc/protobuf/src/google/protobuf/unittest_custom_options.proto +393 -0
  444. data/ext/protoc/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto +50 -0
  445. data/ext/protoc/protobuf/src/google/protobuf/unittest_empty.proto +37 -0
  446. data/ext/protoc/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto +1046 -0
  447. data/ext/protoc/protobuf/src/google/protobuf/unittest_import.proto +64 -0
  448. data/ext/protoc/protobuf/src/google/protobuf/unittest_import_lite.proto +51 -0
  449. data/ext/protoc/protobuf/src/google/protobuf/unittest_import_public.proto +40 -0
  450. data/ext/protoc/protobuf/src/google/protobuf/unittest_import_public_lite.proto +42 -0
  451. data/ext/protoc/protobuf/src/google/protobuf/unittest_lite.proto +384 -0
  452. data/ext/protoc/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto +43 -0
  453. data/ext/protoc/protobuf/src/google/protobuf/unittest_mset.proto +83 -0
  454. data/ext/protoc/protobuf/src/google/protobuf/unittest_no_generic_services.proto +53 -0
  455. data/ext/protoc/protobuf/src/google/protobuf/unittest_optimize_for.proto +66 -0
  456. data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set.cc +265 -0
  457. data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set.h +318 -0
  458. data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set_unittest.cc +599 -0
  459. data/ext/protoc/protobuf/src/google/protobuf/wire_format.cc +1101 -0
  460. data/ext/protoc/protobuf/src/google/protobuf/wire_format.h +336 -0
  461. data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite.cc +471 -0
  462. data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite.h +661 -0
  463. data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite_inl.h +860 -0
  464. data/ext/protoc/protobuf/src/google/protobuf/wire_format_unittest.cc +1120 -0
  465. data/ext/protoc/protobuf/src/solaris/libstdc++.la +51 -0
  466. data/ext/protoc/protobuf/vsprojects/config.h +29 -0
  467. data/ext/protoc/protobuf/vsprojects/convert2008to2005.sh +20 -0
  468. data/ext/protoc/protobuf/vsprojects/extract_includes.bat +50 -0
  469. data/ext/protoc/protobuf/vsprojects/libprotobuf-lite.vcproj +302 -0
  470. data/ext/protoc/protobuf/vsprojects/libprotobuf.vcproj +470 -0
  471. data/ext/protoc/protobuf/vsprojects/libprotoc.vcproj +466 -0
  472. data/ext/protoc/protobuf/vsprojects/lite-test.vcproj +305 -0
  473. data/ext/protoc/protobuf/vsprojects/protobuf.sln +92 -0
  474. data/ext/protoc/protobuf/vsprojects/protoc.vcproj +192 -0
  475. data/ext/protoc/protobuf/vsprojects/readme.txt +114 -0
  476. data/ext/protoc/protobuf/vsprojects/test_plugin.vcproj +209 -0
  477. data/ext/protoc/protobuf/vsprojects/tests.vcproj +681 -0
  478. data/lib/protoc/version.rb +1 -1
  479. metadata +480 -3
@@ -0,0 +1,73 @@
1
+ // Protocol Buffers - Google's data interchange format
2
+ // Copyright 2009 Google Inc. All rights reserved.
3
+ // https://developers.google.com/protocol-buffers/
4
+ //
5
+ // Redistribution and use in source and binary forms, with or without
6
+ // modification, are permitted provided that the following conditions are
7
+ // met:
8
+ //
9
+ // * Redistributions of source code must retain the above copyright
10
+ // notice, this list of conditions and the following disclaimer.
11
+ // * Redistributions in binary form must reproduce the above
12
+ // copyright notice, this list of conditions and the following disclaimer
13
+ // in the documentation and/or other materials provided with the
14
+ // distribution.
15
+ // * Neither the name of Google Inc. nor the names of its
16
+ // contributors may be used to endorse or promote products derived from
17
+ // this software without specific prior written permission.
18
+ //
19
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ // Author: brianolson@google.com (Brian Olson)
32
+ // Based on original Protocol Buffers design by
33
+ // Sanjay Ghemawat, Jeff Dean, and others.
34
+ //
35
+ // Test program to verify that GzipInputStream is compatible with command line
36
+ // gunzip or java.util.zip.GzipInputStream
37
+ //
38
+ // Reads gzip stream on standard input and writes decompressed data to standard
39
+ // output.
40
+
41
+ #include "config.h"
42
+
43
+ #include <assert.h>
44
+ #include <stdio.h>
45
+ #include <stdlib.h>
46
+ #include <fcntl.h>
47
+
48
+ #include <google/protobuf/io/gzip_stream.h>
49
+ #include <google/protobuf/io/zero_copy_stream_impl.h>
50
+
51
+ using google::protobuf::io::FileInputStream;
52
+ using google::protobuf::io::GzipInputStream;
53
+
54
+ int main(int argc, const char** argv) {
55
+ FileInputStream fin(STDIN_FILENO);
56
+ GzipInputStream in(&fin);
57
+
58
+ while (true) {
59
+ const void* inptr;
60
+ int inlen;
61
+ bool ok;
62
+ ok = in.Next(&inptr, &inlen);
63
+ if (!ok) {
64
+ break;
65
+ }
66
+ if (inlen > 0) {
67
+ int err = write(STDOUT_FILENO, inptr, inlen);
68
+ assert(err == inlen);
69
+ }
70
+ }
71
+
72
+ return 0;
73
+ }
@@ -0,0 +1,79 @@
1
+ // Protocol Buffers - Google's data interchange format
2
+ // Copyright 2009 Google Inc. All rights reserved.
3
+ // https://developers.google.com/protocol-buffers/
4
+ //
5
+ // Redistribution and use in source and binary forms, with or without
6
+ // modification, are permitted provided that the following conditions are
7
+ // met:
8
+ //
9
+ // * Redistributions of source code must retain the above copyright
10
+ // notice, this list of conditions and the following disclaimer.
11
+ // * Redistributions in binary form must reproduce the above
12
+ // copyright notice, this list of conditions and the following disclaimer
13
+ // in the documentation and/or other materials provided with the
14
+ // distribution.
15
+ // * Neither the name of Google Inc. nor the names of its
16
+ // contributors may be used to endorse or promote products derived from
17
+ // this software without specific prior written permission.
18
+ //
19
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ // Author: brianolson@google.com (Brian Olson)
32
+ // Based on original Protocol Buffers design by
33
+ // Sanjay Ghemawat, Jeff Dean, and others.
34
+ //
35
+ // Test program to verify that GzipOutputStream is compatible with command line
36
+ // gzip or java.util.zip.GzipOutputStream
37
+ //
38
+ // Reads data on standard input and writes compressed gzip stream to standard
39
+ // output.
40
+
41
+ #include "config.h"
42
+
43
+ #include <stdio.h>
44
+ #include <stdlib.h>
45
+ #include <fcntl.h>
46
+
47
+ #include <google/protobuf/io/gzip_stream.h>
48
+ #include <google/protobuf/io/zero_copy_stream_impl.h>
49
+
50
+ using google::protobuf::io::FileOutputStream;
51
+ using google::protobuf::io::GzipOutputStream;
52
+
53
+ int main(int argc, const char** argv) {
54
+ FileOutputStream fout(STDOUT_FILENO);
55
+ GzipOutputStream out(&fout);
56
+ int readlen;
57
+
58
+ while (true) {
59
+ void* outptr;
60
+ int outlen;
61
+ bool ok;
62
+ do {
63
+ ok = out.Next(&outptr, &outlen);
64
+ if (!ok) {
65
+ break;
66
+ }
67
+ } while (outlen <= 0);
68
+ readlen = read(STDIN_FILENO, outptr, outlen);
69
+ if (readlen <= 0) {
70
+ out.BackUp(outlen);
71
+ break;
72
+ }
73
+ if (readlen < outlen) {
74
+ out.BackUp(outlen - readlen);
75
+ }
76
+ }
77
+
78
+ return 0;
79
+ }
@@ -0,0 +1,1746 @@
1
+ // Protocol Buffers - Google's data interchange format
2
+ // Copyright 2008 Google Inc. All rights reserved.
3
+ // https://developers.google.com/protocol-buffers/
4
+ //
5
+ // Redistribution and use in source and binary forms, with or without
6
+ // modification, are permitted provided that the following conditions are
7
+ // met:
8
+ //
9
+ // * Redistributions of source code must retain the above copyright
10
+ // notice, this list of conditions and the following disclaimer.
11
+ // * Redistributions in binary form must reproduce the above
12
+ // copyright notice, this list of conditions and the following disclaimer
13
+ // in the documentation and/or other materials provided with the
14
+ // distribution.
15
+ // * Neither the name of Google Inc. nor the names of its
16
+ // contributors may be used to endorse or promote products derived from
17
+ // this software without specific prior written permission.
18
+ //
19
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ // Author: jschorr@google.com (Joseph Schorr)
32
+ // Based on original Protocol Buffers design by
33
+ // Sanjay Ghemawat, Jeff Dean, and others.
34
+
35
+ #include <algorithm>
36
+ #include <float.h>
37
+ #include <math.h>
38
+ #include <stdio.h>
39
+ #include <stack>
40
+ #include <limits>
41
+ #include <vector>
42
+
43
+ #include <google/protobuf/text_format.h>
44
+
45
+ #include <google/protobuf/descriptor.h>
46
+ #include <google/protobuf/wire_format_lite.h>
47
+ #include <google/protobuf/io/coded_stream.h>
48
+ #include <google/protobuf/io/zero_copy_stream.h>
49
+ #include <google/protobuf/io/zero_copy_stream_impl.h>
50
+ #include <google/protobuf/unknown_field_set.h>
51
+ #include <google/protobuf/descriptor.pb.h>
52
+ #include <google/protobuf/io/tokenizer.h>
53
+ #include <google/protobuf/stubs/strutil.h>
54
+ #include <google/protobuf/stubs/map_util.h>
55
+ #include <google/protobuf/stubs/stl_util.h>
56
+
57
+ namespace google {
58
+ namespace protobuf {
59
+
60
+ namespace {
61
+
62
+ inline bool IsHexNumber(const string& str) {
63
+ return (str.length() >= 2 && str[0] == '0' &&
64
+ (str[1] == 'x' || str[1] == 'X'));
65
+ }
66
+
67
+ inline bool IsOctNumber(const string& str) {
68
+ return (str.length() >= 2 && str[0] == '0' &&
69
+ (str[1] >= '0' && str[1] < '8'));
70
+ }
71
+
72
+ } // namespace
73
+
74
+ string Message::DebugString() const {
75
+ string debug_string;
76
+
77
+ TextFormat::PrintToString(*this, &debug_string);
78
+
79
+ return debug_string;
80
+ }
81
+
82
+ string Message::ShortDebugString() const {
83
+ string debug_string;
84
+
85
+ TextFormat::Printer printer;
86
+ printer.SetSingleLineMode(true);
87
+
88
+ printer.PrintToString(*this, &debug_string);
89
+ // Single line mode currently might have an extra space at the end.
90
+ if (debug_string.size() > 0 &&
91
+ debug_string[debug_string.size() - 1] == ' ') {
92
+ debug_string.resize(debug_string.size() - 1);
93
+ }
94
+
95
+ return debug_string;
96
+ }
97
+
98
+ string Message::Utf8DebugString() const {
99
+ string debug_string;
100
+
101
+ TextFormat::Printer printer;
102
+ printer.SetUseUtf8StringEscaping(true);
103
+
104
+ printer.PrintToString(*this, &debug_string);
105
+
106
+ return debug_string;
107
+ }
108
+
109
+ void Message::PrintDebugString() const {
110
+ printf("%s", DebugString().c_str());
111
+ }
112
+
113
+
114
+ // ===========================================================================
115
+ // Implementation of the parse information tree class.
116
+ TextFormat::ParseInfoTree::ParseInfoTree() { }
117
+
118
+ TextFormat::ParseInfoTree::~ParseInfoTree() {
119
+ // Remove any nested information trees, as they are owned by this tree.
120
+ for (NestedMap::iterator it = nested_.begin(); it != nested_.end(); ++it) {
121
+ STLDeleteElements(&(it->second));
122
+ }
123
+ }
124
+
125
+ void TextFormat::ParseInfoTree::RecordLocation(
126
+ const FieldDescriptor* field,
127
+ TextFormat::ParseLocation location) {
128
+ locations_[field].push_back(location);
129
+ }
130
+
131
+ TextFormat::ParseInfoTree* TextFormat::ParseInfoTree::CreateNested(
132
+ const FieldDescriptor* field) {
133
+ // Owned by us in the map.
134
+ TextFormat::ParseInfoTree* instance = new TextFormat::ParseInfoTree();
135
+ vector<TextFormat::ParseInfoTree*>* trees = &nested_[field];
136
+ GOOGLE_CHECK(trees);
137
+ trees->push_back(instance);
138
+ return instance;
139
+ }
140
+
141
+ void CheckFieldIndex(const FieldDescriptor* field, int index) {
142
+ if (field == NULL) { return; }
143
+
144
+ if (field->is_repeated() && index == -1) {
145
+ GOOGLE_LOG(DFATAL) << "Index must be in range of repeated field values. "
146
+ << "Field: " << field->name();
147
+ } else if (!field->is_repeated() && index != -1) {
148
+ GOOGLE_LOG(DFATAL) << "Index must be -1 for singular fields."
149
+ << "Field: " << field->name();
150
+ }
151
+ }
152
+
153
+ TextFormat::ParseLocation TextFormat::ParseInfoTree::GetLocation(
154
+ const FieldDescriptor* field, int index) const {
155
+ CheckFieldIndex(field, index);
156
+ if (index == -1) { index = 0; }
157
+
158
+ const vector<TextFormat::ParseLocation>* locations =
159
+ FindOrNull(locations_, field);
160
+ if (locations == NULL || index >= locations->size()) {
161
+ return TextFormat::ParseLocation();
162
+ }
163
+
164
+ return (*locations)[index];
165
+ }
166
+
167
+ TextFormat::ParseInfoTree* TextFormat::ParseInfoTree::GetTreeForNested(
168
+ const FieldDescriptor* field, int index) const {
169
+ CheckFieldIndex(field, index);
170
+ if (index == -1) { index = 0; }
171
+
172
+ const vector<TextFormat::ParseInfoTree*>* trees = FindOrNull(nested_, field);
173
+ if (trees == NULL || index >= trees->size()) {
174
+ return NULL;
175
+ }
176
+
177
+ return (*trees)[index];
178
+ }
179
+
180
+
181
+ // ===========================================================================
182
+ // Internal class for parsing an ASCII representation of a Protocol Message.
183
+ // This class makes use of the Protocol Message compiler's tokenizer found
184
+ // in //google/protobuf/io/tokenizer.h. Note that class's Parse
185
+ // method is *not* thread-safe and should only be used in a single thread at
186
+ // a time.
187
+
188
+ // Makes code slightly more readable. The meaning of "DO(foo)" is
189
+ // "Execute foo and fail if it fails.", where failure is indicated by
190
+ // returning false. Borrowed from parser.cc (Thanks Kenton!).
191
+ #define DO(STATEMENT) if (STATEMENT) {} else return false
192
+
193
+ class TextFormat::Parser::ParserImpl {
194
+ public:
195
+
196
+ // Determines if repeated values for non-repeated fields and
197
+ // oneofs are permitted, e.g., the string "foo: 1 foo: 2" for a
198
+ // required/optional field named "foo", or "baz: 1 qux: 2"
199
+ // where "baz" and "qux" are members of the same oneof.
200
+ enum SingularOverwritePolicy {
201
+ ALLOW_SINGULAR_OVERWRITES = 0, // the last value is retained
202
+ FORBID_SINGULAR_OVERWRITES = 1, // an error is issued
203
+ };
204
+
205
+ ParserImpl(const Descriptor* root_message_type,
206
+ io::ZeroCopyInputStream* input_stream,
207
+ io::ErrorCollector* error_collector,
208
+ TextFormat::Finder* finder,
209
+ ParseInfoTree* parse_info_tree,
210
+ SingularOverwritePolicy singular_overwrite_policy,
211
+ bool allow_case_insensitive_field,
212
+ bool allow_unknown_field,
213
+ bool allow_unknown_enum,
214
+ bool allow_field_number,
215
+ bool allow_relaxed_whitespace)
216
+ : error_collector_(error_collector),
217
+ finder_(finder),
218
+ parse_info_tree_(parse_info_tree),
219
+ tokenizer_error_collector_(this),
220
+ tokenizer_(input_stream, &tokenizer_error_collector_),
221
+ root_message_type_(root_message_type),
222
+ singular_overwrite_policy_(singular_overwrite_policy),
223
+ allow_case_insensitive_field_(allow_case_insensitive_field),
224
+ allow_unknown_field_(allow_unknown_field),
225
+ allow_unknown_enum_(allow_unknown_enum),
226
+ allow_field_number_(allow_field_number),
227
+ had_errors_(false) {
228
+ // For backwards-compatibility with proto1, we need to allow the 'f' suffix
229
+ // for floats.
230
+ tokenizer_.set_allow_f_after_float(true);
231
+
232
+ // '#' starts a comment.
233
+ tokenizer_.set_comment_style(io::Tokenizer::SH_COMMENT_STYLE);
234
+
235
+ if (allow_relaxed_whitespace) {
236
+ tokenizer_.set_require_space_after_number(false);
237
+ tokenizer_.set_allow_multiline_strings(true);
238
+ }
239
+
240
+ // Consume the starting token.
241
+ tokenizer_.Next();
242
+ }
243
+ ~ParserImpl() { }
244
+
245
+ // Parses the ASCII representation specified in input and saves the
246
+ // information into the output pointer (a Message). Returns
247
+ // false if an error occurs (an error will also be logged to
248
+ // GOOGLE_LOG(ERROR)).
249
+ bool Parse(Message* output) {
250
+ // Consume fields until we cannot do so anymore.
251
+ while (true) {
252
+ if (LookingAtType(io::Tokenizer::TYPE_END)) {
253
+ return !had_errors_;
254
+ }
255
+
256
+ DO(ConsumeField(output));
257
+ }
258
+ }
259
+
260
+ bool ParseField(const FieldDescriptor* field, Message* output) {
261
+ bool suc;
262
+ if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
263
+ suc = ConsumeFieldMessage(output, output->GetReflection(), field);
264
+ } else {
265
+ suc = ConsumeFieldValue(output, output->GetReflection(), field);
266
+ }
267
+ return suc && LookingAtType(io::Tokenizer::TYPE_END);
268
+ }
269
+
270
+ void ReportError(int line, int col, const string& message) {
271
+ had_errors_ = true;
272
+ if (error_collector_ == NULL) {
273
+ if (line >= 0) {
274
+ GOOGLE_LOG(ERROR) << "Error parsing text-format "
275
+ << root_message_type_->full_name()
276
+ << ": " << (line + 1) << ":"
277
+ << (col + 1) << ": " << message;
278
+ } else {
279
+ GOOGLE_LOG(ERROR) << "Error parsing text-format "
280
+ << root_message_type_->full_name()
281
+ << ": " << message;
282
+ }
283
+ } else {
284
+ error_collector_->AddError(line, col, message);
285
+ }
286
+ }
287
+
288
+ void ReportWarning(int line, int col, const string& message) {
289
+ if (error_collector_ == NULL) {
290
+ if (line >= 0) {
291
+ GOOGLE_LOG(WARNING) << "Warning parsing text-format "
292
+ << root_message_type_->full_name()
293
+ << ": " << (line + 1) << ":"
294
+ << (col + 1) << ": " << message;
295
+ } else {
296
+ GOOGLE_LOG(WARNING) << "Warning parsing text-format "
297
+ << root_message_type_->full_name()
298
+ << ": " << message;
299
+ }
300
+ } else {
301
+ error_collector_->AddWarning(line, col, message);
302
+ }
303
+ }
304
+
305
+ private:
306
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParserImpl);
307
+
308
+ // Reports an error with the given message with information indicating
309
+ // the position (as derived from the current token).
310
+ void ReportError(const string& message) {
311
+ ReportError(tokenizer_.current().line, tokenizer_.current().column,
312
+ message);
313
+ }
314
+
315
+ // Reports a warning with the given message with information indicating
316
+ // the position (as derived from the current token).
317
+ void ReportWarning(const string& message) {
318
+ ReportWarning(tokenizer_.current().line, tokenizer_.current().column,
319
+ message);
320
+ }
321
+
322
+ // Consumes the specified message with the given starting delimeter.
323
+ // This method checks to see that the end delimeter at the conclusion of
324
+ // the consumption matches the starting delimeter passed in here.
325
+ bool ConsumeMessage(Message* message, const string delimeter) {
326
+ while (!LookingAt(">") && !LookingAt("}")) {
327
+ DO(ConsumeField(message));
328
+ }
329
+
330
+ // Confirm that we have a valid ending delimeter.
331
+ DO(Consume(delimeter));
332
+
333
+ return true;
334
+ }
335
+
336
+
337
+ // Consumes the current field (as returned by the tokenizer) on the
338
+ // passed in message.
339
+ bool ConsumeField(Message* message) {
340
+ const Reflection* reflection = message->GetReflection();
341
+ const Descriptor* descriptor = message->GetDescriptor();
342
+
343
+ string field_name;
344
+
345
+ const FieldDescriptor* field = NULL;
346
+ int start_line = tokenizer_.current().line;
347
+ int start_column = tokenizer_.current().column;
348
+
349
+ if (TryConsume("[")) {
350
+ // Extension.
351
+ DO(ConsumeIdentifier(&field_name));
352
+ while (TryConsume(".")) {
353
+ string part;
354
+ DO(ConsumeIdentifier(&part));
355
+ field_name += ".";
356
+ field_name += part;
357
+ }
358
+ DO(Consume("]"));
359
+
360
+ field = (finder_ != NULL
361
+ ? finder_->FindExtension(message, field_name)
362
+ : reflection->FindKnownExtensionByName(field_name));
363
+
364
+ if (field == NULL) {
365
+ if (!allow_unknown_field_) {
366
+ ReportError("Extension \"" + field_name + "\" is not defined or "
367
+ "is not an extension of \"" +
368
+ descriptor->full_name() + "\".");
369
+ return false;
370
+ } else {
371
+ ReportWarning("Extension \"" + field_name + "\" is not defined or "
372
+ "is not an extension of \"" +
373
+ descriptor->full_name() + "\".");
374
+ }
375
+ }
376
+ } else {
377
+ DO(ConsumeIdentifier(&field_name));
378
+
379
+ int32 field_number;
380
+ if (allow_field_number_ && safe_strto32(field_name, &field_number)) {
381
+ if (descriptor->IsExtensionNumber(field_number)) {
382
+ field = reflection->FindKnownExtensionByNumber(field_number);
383
+ } else {
384
+ field = descriptor->FindFieldByNumber(field_number);
385
+ }
386
+ } else {
387
+ field = descriptor->FindFieldByName(field_name);
388
+ // Group names are expected to be capitalized as they appear in the
389
+ // .proto file, which actually matches their type names, not their
390
+ // field names.
391
+ if (field == NULL) {
392
+ string lower_field_name = field_name;
393
+ LowerString(&lower_field_name);
394
+ field = descriptor->FindFieldByName(lower_field_name);
395
+ // If the case-insensitive match worked but the field is NOT a group,
396
+ if (field != NULL && field->type() != FieldDescriptor::TYPE_GROUP) {
397
+ field = NULL;
398
+ }
399
+ }
400
+ // Again, special-case group names as described above.
401
+ if (field != NULL && field->type() == FieldDescriptor::TYPE_GROUP
402
+ && field->message_type()->name() != field_name) {
403
+ field = NULL;
404
+ }
405
+
406
+ if (field == NULL && allow_case_insensitive_field_) {
407
+ string lower_field_name = field_name;
408
+ LowerString(&lower_field_name);
409
+ field = descriptor->FindFieldByLowercaseName(lower_field_name);
410
+ }
411
+ }
412
+
413
+ if (field == NULL) {
414
+ if (!allow_unknown_field_) {
415
+ ReportError("Message type \"" + descriptor->full_name() +
416
+ "\" has no field named \"" + field_name + "\".");
417
+ return false;
418
+ } else {
419
+ ReportWarning("Message type \"" + descriptor->full_name() +
420
+ "\" has no field named \"" + field_name + "\".");
421
+ }
422
+ }
423
+ }
424
+
425
+ // Skips unknown field.
426
+ if (field == NULL) {
427
+ GOOGLE_CHECK(allow_unknown_field_);
428
+ // Try to guess the type of this field.
429
+ // If this field is not a message, there should be a ":" between the
430
+ // field name and the field value and also the field value should not
431
+ // start with "{" or "<" which indicates the begining of a message body.
432
+ // If there is no ":" or there is a "{" or "<" after ":", this field has
433
+ // to be a message or the input is ill-formed.
434
+ if (TryConsume(":") && !LookingAt("{") && !LookingAt("<")) {
435
+ return SkipFieldValue();
436
+ } else {
437
+ return SkipFieldMessage();
438
+ }
439
+ }
440
+
441
+ if (singular_overwrite_policy_ == FORBID_SINGULAR_OVERWRITES) {
442
+ // Fail if the field is not repeated and it has already been specified.
443
+ if (!field->is_repeated() && reflection->HasField(*message, field)) {
444
+ ReportError("Non-repeated field \"" + field_name +
445
+ "\" is specified multiple times.");
446
+ return false;
447
+ }
448
+ // Fail if the field is a member of a oneof and another member has already
449
+ // been specified.
450
+ const OneofDescriptor* oneof = field->containing_oneof();
451
+ if (oneof != NULL && reflection->HasOneof(*message, oneof)) {
452
+ const FieldDescriptor* other_field =
453
+ reflection->GetOneofFieldDescriptor(*message, oneof);
454
+ ReportError("Field \"" + field_name + "\" is specified along with "
455
+ "field \"" + other_field->name() + "\", another member "
456
+ "of oneof \"" + oneof->name() + "\".");
457
+ return false;
458
+ }
459
+ }
460
+
461
+ // Perform special handling for embedded message types.
462
+ if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
463
+ // ':' is optional here.
464
+ TryConsume(":");
465
+ } else {
466
+ // ':' is required here.
467
+ DO(Consume(":"));
468
+ }
469
+
470
+ if (field->is_repeated() && TryConsume("[")) {
471
+ // Short repeated format, e.g. "foo: [1, 2, 3]"
472
+ while (true) {
473
+ if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
474
+ // Perform special handling for embedded message types.
475
+ DO(ConsumeFieldMessage(message, reflection, field));
476
+ } else {
477
+ DO(ConsumeFieldValue(message, reflection, field));
478
+ }
479
+ if (TryConsume("]")) {
480
+ break;
481
+ }
482
+ DO(Consume(","));
483
+ }
484
+ } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
485
+ DO(ConsumeFieldMessage(message, reflection, field));
486
+ } else {
487
+ DO(ConsumeFieldValue(message, reflection, field));
488
+ }
489
+
490
+ // For historical reasons, fields may optionally be separated by commas or
491
+ // semicolons.
492
+ TryConsume(";") || TryConsume(",");
493
+
494
+ if (field->options().deprecated()) {
495
+ ReportWarning("text format contains deprecated field \""
496
+ + field_name + "\"");
497
+ }
498
+
499
+ // If a parse info tree exists, add the location for the parsed
500
+ // field.
501
+ if (parse_info_tree_ != NULL) {
502
+ RecordLocation(parse_info_tree_, field,
503
+ ParseLocation(start_line, start_column));
504
+ }
505
+
506
+ return true;
507
+ }
508
+
509
+ // Skips the next field including the field's name and value.
510
+ bool SkipField() {
511
+ string field_name;
512
+ if (TryConsume("[")) {
513
+ // Extension name.
514
+ DO(ConsumeIdentifier(&field_name));
515
+ while (TryConsume(".")) {
516
+ string part;
517
+ DO(ConsumeIdentifier(&part));
518
+ field_name += ".";
519
+ field_name += part;
520
+ }
521
+ DO(Consume("]"));
522
+ } else {
523
+ DO(ConsumeIdentifier(&field_name));
524
+ }
525
+
526
+ // Try to guess the type of this field.
527
+ // If this field is not a message, there should be a ":" between the
528
+ // field name and the field value and also the field value should not
529
+ // start with "{" or "<" which indicates the begining of a message body.
530
+ // If there is no ":" or there is a "{" or "<" after ":", this field has
531
+ // to be a message or the input is ill-formed.
532
+ if (TryConsume(":") && !LookingAt("{") && !LookingAt("<")) {
533
+ DO(SkipFieldValue());
534
+ } else {
535
+ DO(SkipFieldMessage());
536
+ }
537
+ // For historical reasons, fields may optionally be separated by commas or
538
+ // semicolons.
539
+ TryConsume(";") || TryConsume(",");
540
+ return true;
541
+ }
542
+
543
+ bool ConsumeFieldMessage(Message* message,
544
+ const Reflection* reflection,
545
+ const FieldDescriptor* field) {
546
+
547
+ // If the parse information tree is not NULL, create a nested one
548
+ // for the nested message.
549
+ ParseInfoTree* parent = parse_info_tree_;
550
+ if (parent != NULL) {
551
+ parse_info_tree_ = CreateNested(parent, field);
552
+ }
553
+
554
+ string delimeter;
555
+ if (TryConsume("<")) {
556
+ delimeter = ">";
557
+ } else {
558
+ DO(Consume("{"));
559
+ delimeter = "}";
560
+ }
561
+
562
+ if (field->is_repeated()) {
563
+ DO(ConsumeMessage(reflection->AddMessage(message, field), delimeter));
564
+ } else {
565
+ DO(ConsumeMessage(reflection->MutableMessage(message, field),
566
+ delimeter));
567
+ }
568
+
569
+ // Reset the parse information tree.
570
+ parse_info_tree_ = parent;
571
+ return true;
572
+ }
573
+
574
+ // Skips the whole body of a message including the begining delimeter and
575
+ // the ending delimeter.
576
+ bool SkipFieldMessage() {
577
+ string delimeter;
578
+ if (TryConsume("<")) {
579
+ delimeter = ">";
580
+ } else {
581
+ DO(Consume("{"));
582
+ delimeter = "}";
583
+ }
584
+ while (!LookingAt(">") && !LookingAt("}")) {
585
+ DO(SkipField());
586
+ }
587
+ DO(Consume(delimeter));
588
+ return true;
589
+ }
590
+
591
+ bool ConsumeFieldValue(Message* message,
592
+ const Reflection* reflection,
593
+ const FieldDescriptor* field) {
594
+
595
+ // Define an easy to use macro for setting fields. This macro checks
596
+ // to see if the field is repeated (in which case we need to use the Add
597
+ // methods or not (in which case we need to use the Set methods).
598
+ #define SET_FIELD(CPPTYPE, VALUE) \
599
+ if (field->is_repeated()) { \
600
+ reflection->Add##CPPTYPE(message, field, VALUE); \
601
+ } else { \
602
+ reflection->Set##CPPTYPE(message, field, VALUE); \
603
+ } \
604
+
605
+ switch(field->cpp_type()) {
606
+ case FieldDescriptor::CPPTYPE_INT32: {
607
+ int64 value;
608
+ DO(ConsumeSignedInteger(&value, kint32max));
609
+ SET_FIELD(Int32, static_cast<int32>(value));
610
+ break;
611
+ }
612
+
613
+ case FieldDescriptor::CPPTYPE_UINT32: {
614
+ uint64 value;
615
+ DO(ConsumeUnsignedInteger(&value, kuint32max));
616
+ SET_FIELD(UInt32, static_cast<uint32>(value));
617
+ break;
618
+ }
619
+
620
+ case FieldDescriptor::CPPTYPE_INT64: {
621
+ int64 value;
622
+ DO(ConsumeSignedInteger(&value, kint64max));
623
+ SET_FIELD(Int64, value);
624
+ break;
625
+ }
626
+
627
+ case FieldDescriptor::CPPTYPE_UINT64: {
628
+ uint64 value;
629
+ DO(ConsumeUnsignedInteger(&value, kuint64max));
630
+ SET_FIELD(UInt64, value);
631
+ break;
632
+ }
633
+
634
+ case FieldDescriptor::CPPTYPE_FLOAT: {
635
+ double value;
636
+ DO(ConsumeDouble(&value));
637
+ SET_FIELD(Float, static_cast<float>(value));
638
+ break;
639
+ }
640
+
641
+ case FieldDescriptor::CPPTYPE_DOUBLE: {
642
+ double value;
643
+ DO(ConsumeDouble(&value));
644
+ SET_FIELD(Double, value);
645
+ break;
646
+ }
647
+
648
+ case FieldDescriptor::CPPTYPE_STRING: {
649
+ string value;
650
+ DO(ConsumeString(&value));
651
+ SET_FIELD(String, value);
652
+ break;
653
+ }
654
+
655
+ case FieldDescriptor::CPPTYPE_BOOL: {
656
+ if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) {
657
+ uint64 value;
658
+ DO(ConsumeUnsignedInteger(&value, 1));
659
+ SET_FIELD(Bool, value);
660
+ } else {
661
+ string value;
662
+ DO(ConsumeIdentifier(&value));
663
+ if (value == "true" || value == "True" || value == "t") {
664
+ SET_FIELD(Bool, true);
665
+ } else if (value == "false" || value == "False" || value == "f") {
666
+ SET_FIELD(Bool, false);
667
+ } else {
668
+ ReportError("Invalid value for boolean field \"" + field->name()
669
+ + "\". Value: \"" + value + "\".");
670
+ return false;
671
+ }
672
+ }
673
+ break;
674
+ }
675
+
676
+ case FieldDescriptor::CPPTYPE_ENUM: {
677
+ string value;
678
+ const EnumDescriptor* enum_type = field->enum_type();
679
+ const EnumValueDescriptor* enum_value = NULL;
680
+
681
+ if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) {
682
+ DO(ConsumeIdentifier(&value));
683
+ // Find the enumeration value.
684
+ enum_value = enum_type->FindValueByName(value);
685
+
686
+ } else if (LookingAt("-") ||
687
+ LookingAtType(io::Tokenizer::TYPE_INTEGER)) {
688
+ int64 int_value;
689
+ DO(ConsumeSignedInteger(&int_value, kint32max));
690
+ value = SimpleItoa(int_value); // for error reporting
691
+ enum_value = enum_type->FindValueByNumber(int_value);
692
+ } else {
693
+ ReportError("Expected integer or identifier.");
694
+ return false;
695
+ }
696
+
697
+ if (enum_value == NULL) {
698
+ if (!allow_unknown_enum_) {
699
+ ReportError("Unknown enumeration value of \"" + value + "\" for "
700
+ "field \"" + field->name() + "\".");
701
+ return false;
702
+ } else {
703
+ ReportWarning("Unknown enumeration value of \"" + value + "\" for "
704
+ "field \"" + field->name() + "\".");
705
+ return true;
706
+ }
707
+ }
708
+
709
+ SET_FIELD(Enum, enum_value);
710
+ break;
711
+ }
712
+
713
+ case FieldDescriptor::CPPTYPE_MESSAGE: {
714
+ // We should never get here. Put here instead of a default
715
+ // so that if new types are added, we get a nice compiler warning.
716
+ GOOGLE_LOG(FATAL) << "Reached an unintended state: CPPTYPE_MESSAGE";
717
+ break;
718
+ }
719
+ }
720
+ #undef SET_FIELD
721
+ return true;
722
+ }
723
+
724
+ bool SkipFieldValue() {
725
+ if (LookingAtType(io::Tokenizer::TYPE_STRING)) {
726
+ while (LookingAtType(io::Tokenizer::TYPE_STRING)) {
727
+ tokenizer_.Next();
728
+ }
729
+ return true;
730
+ }
731
+ // Possible field values other than string:
732
+ // 12345 => TYPE_INTEGER
733
+ // -12345 => TYPE_SYMBOL + TYPE_INTEGER
734
+ // 1.2345 => TYPE_FLOAT
735
+ // -1.2345 => TYPE_SYMBOL + TYPE_FLOAT
736
+ // inf => TYPE_IDENTIFIER
737
+ // -inf => TYPE_SYMBOL + TYPE_IDENTIFIER
738
+ // TYPE_INTEGER => TYPE_IDENTIFIER
739
+ // Divides them into two group, one with TYPE_SYMBOL
740
+ // and the other without:
741
+ // Group one:
742
+ // 12345 => TYPE_INTEGER
743
+ // 1.2345 => TYPE_FLOAT
744
+ // inf => TYPE_IDENTIFIER
745
+ // TYPE_INTEGER => TYPE_IDENTIFIER
746
+ // Group two:
747
+ // -12345 => TYPE_SYMBOL + TYPE_INTEGER
748
+ // -1.2345 => TYPE_SYMBOL + TYPE_FLOAT
749
+ // -inf => TYPE_SYMBOL + TYPE_IDENTIFIER
750
+ // As we can see, the field value consists of an optional '-' and one of
751
+ // TYPE_INTEGER, TYPE_FLOAT and TYPE_IDENTIFIER.
752
+ bool has_minus = TryConsume("-");
753
+ if (!LookingAtType(io::Tokenizer::TYPE_INTEGER) &&
754
+ !LookingAtType(io::Tokenizer::TYPE_FLOAT) &&
755
+ !LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) {
756
+ return false;
757
+ }
758
+ // Combination of '-' and TYPE_IDENTIFIER may result in an invalid field
759
+ // value while other combinations all generate valid values.
760
+ // We check if the value of this combination is valid here.
761
+ // TYPE_IDENTIFIER after a '-' should be one of the float values listed
762
+ // below:
763
+ // inf, inff, infinity, nan
764
+ if (has_minus && LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) {
765
+ string text = tokenizer_.current().text;
766
+ LowerString(&text);
767
+ if (text != "inf" &&
768
+ text != "infinity" &&
769
+ text != "nan") {
770
+ ReportError("Invalid float number: " + text);
771
+ return false;
772
+ }
773
+ }
774
+ tokenizer_.Next();
775
+ return true;
776
+ }
777
+
778
+ // Returns true if the current token's text is equal to that specified.
779
+ bool LookingAt(const string& text) {
780
+ return tokenizer_.current().text == text;
781
+ }
782
+
783
+ // Returns true if the current token's type is equal to that specified.
784
+ bool LookingAtType(io::Tokenizer::TokenType token_type) {
785
+ return tokenizer_.current().type == token_type;
786
+ }
787
+
788
+ // Consumes an identifier and saves its value in the identifier parameter.
789
+ // Returns false if the token is not of type IDENTFIER.
790
+ bool ConsumeIdentifier(string* identifier) {
791
+ if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) {
792
+ *identifier = tokenizer_.current().text;
793
+ tokenizer_.Next();
794
+ return true;
795
+ }
796
+
797
+ // If allow_field_numer_ or allow_unknown_field_ is true, we should able
798
+ // to parse integer identifiers.
799
+ if ((allow_field_number_ || allow_unknown_field_)
800
+ && LookingAtType(io::Tokenizer::TYPE_INTEGER)) {
801
+ *identifier = tokenizer_.current().text;
802
+ tokenizer_.Next();
803
+ return true;
804
+ }
805
+
806
+ ReportError("Expected identifier.");
807
+ return false;
808
+ }
809
+
810
+ // Consumes a string and saves its value in the text parameter.
811
+ // Returns false if the token is not of type STRING.
812
+ bool ConsumeString(string* text) {
813
+ if (!LookingAtType(io::Tokenizer::TYPE_STRING)) {
814
+ ReportError("Expected string.");
815
+ return false;
816
+ }
817
+
818
+ text->clear();
819
+ while (LookingAtType(io::Tokenizer::TYPE_STRING)) {
820
+ io::Tokenizer::ParseStringAppend(tokenizer_.current().text, text);
821
+
822
+ tokenizer_.Next();
823
+ }
824
+
825
+ return true;
826
+ }
827
+
828
+ // Consumes a uint64 and saves its value in the value parameter.
829
+ // Returns false if the token is not of type INTEGER.
830
+ bool ConsumeUnsignedInteger(uint64* value, uint64 max_value) {
831
+ if (!LookingAtType(io::Tokenizer::TYPE_INTEGER)) {
832
+ ReportError("Expected integer.");
833
+ return false;
834
+ }
835
+
836
+ if (!io::Tokenizer::ParseInteger(tokenizer_.current().text,
837
+ max_value, value)) {
838
+ ReportError("Integer out of range.");
839
+ return false;
840
+ }
841
+
842
+ tokenizer_.Next();
843
+ return true;
844
+ }
845
+
846
+ // Consumes an int64 and saves its value in the value parameter.
847
+ // Note that since the tokenizer does not support negative numbers,
848
+ // we actually may consume an additional token (for the minus sign) in this
849
+ // method. Returns false if the token is not an integer
850
+ // (signed or otherwise).
851
+ bool ConsumeSignedInteger(int64* value, uint64 max_value) {
852
+ bool negative = false;
853
+
854
+ if (TryConsume("-")) {
855
+ negative = true;
856
+ // Two's complement always allows one more negative integer than
857
+ // positive.
858
+ ++max_value;
859
+ }
860
+
861
+ uint64 unsigned_value;
862
+
863
+ DO(ConsumeUnsignedInteger(&unsigned_value, max_value));
864
+
865
+ *value = static_cast<int64>(unsigned_value);
866
+
867
+ if (negative) {
868
+ *value = -*value;
869
+ }
870
+
871
+ return true;
872
+ }
873
+
874
+ // Consumes a uint64 and saves its value in the value parameter.
875
+ // Accepts decimal numbers only, rejects hex or oct numbers.
876
+ bool ConsumeUnsignedDecimalInteger(uint64* value, uint64 max_value) {
877
+ if (!LookingAtType(io::Tokenizer::TYPE_INTEGER)) {
878
+ ReportError("Expected integer.");
879
+ return false;
880
+ }
881
+
882
+ const string& text = tokenizer_.current().text;
883
+ if (IsHexNumber(text) || IsOctNumber(text)) {
884
+ ReportError("Expect a decimal number.");
885
+ return false;
886
+ }
887
+
888
+ if (!io::Tokenizer::ParseInteger(text, max_value, value)) {
889
+ ReportError("Integer out of range.");
890
+ return false;
891
+ }
892
+
893
+ tokenizer_.Next();
894
+ return true;
895
+ }
896
+
897
+ // Consumes a double and saves its value in the value parameter.
898
+ // Note that since the tokenizer does not support negative numbers,
899
+ // we actually may consume an additional token (for the minus sign) in this
900
+ // method. Returns false if the token is not a double
901
+ // (signed or otherwise).
902
+ bool ConsumeDouble(double* value) {
903
+ bool negative = false;
904
+
905
+ if (TryConsume("-")) {
906
+ negative = true;
907
+ }
908
+
909
+ // A double can actually be an integer, according to the tokenizer.
910
+ // Therefore, we must check both cases here.
911
+ if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) {
912
+ // We have found an integer value for the double.
913
+ uint64 integer_value;
914
+ DO(ConsumeUnsignedDecimalInteger(&integer_value, kuint64max));
915
+
916
+ *value = static_cast<double>(integer_value);
917
+ } else if (LookingAtType(io::Tokenizer::TYPE_FLOAT)) {
918
+ // We have found a float value for the double.
919
+ *value = io::Tokenizer::ParseFloat(tokenizer_.current().text);
920
+
921
+ // Mark the current token as consumed.
922
+ tokenizer_.Next();
923
+ } else if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) {
924
+ string text = tokenizer_.current().text;
925
+ LowerString(&text);
926
+ if (text == "inf" ||
927
+ text == "infinity") {
928
+ *value = std::numeric_limits<double>::infinity();
929
+ tokenizer_.Next();
930
+ } else if (text == "nan") {
931
+ *value = std::numeric_limits<double>::quiet_NaN();
932
+ tokenizer_.Next();
933
+ } else {
934
+ ReportError("Expected double.");
935
+ return false;
936
+ }
937
+ } else {
938
+ ReportError("Expected double.");
939
+ return false;
940
+ }
941
+
942
+ if (negative) {
943
+ *value = -*value;
944
+ }
945
+
946
+ return true;
947
+ }
948
+
949
+ // Consumes a token and confirms that it matches that specified in the
950
+ // value parameter. Returns false if the token found does not match that
951
+ // which was specified.
952
+ bool Consume(const string& value) {
953
+ const string& current_value = tokenizer_.current().text;
954
+
955
+ if (current_value != value) {
956
+ ReportError("Expected \"" + value + "\", found \"" + current_value
957
+ + "\".");
958
+ return false;
959
+ }
960
+
961
+ tokenizer_.Next();
962
+
963
+ return true;
964
+ }
965
+
966
+ // Attempts to consume the supplied value. Returns false if a the
967
+ // token found does not match the value specified.
968
+ bool TryConsume(const string& value) {
969
+ if (tokenizer_.current().text == value) {
970
+ tokenizer_.Next();
971
+ return true;
972
+ } else {
973
+ return false;
974
+ }
975
+ }
976
+
977
+ // An internal instance of the Tokenizer's error collector, used to
978
+ // collect any base-level parse errors and feed them to the ParserImpl.
979
+ class ParserErrorCollector : public io::ErrorCollector {
980
+ public:
981
+ explicit ParserErrorCollector(TextFormat::Parser::ParserImpl* parser) :
982
+ parser_(parser) { }
983
+
984
+ virtual ~ParserErrorCollector() { }
985
+
986
+ virtual void AddError(int line, int column, const string& message) {
987
+ parser_->ReportError(line, column, message);
988
+ }
989
+
990
+ virtual void AddWarning(int line, int column, const string& message) {
991
+ parser_->ReportWarning(line, column, message);
992
+ }
993
+
994
+ private:
995
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParserErrorCollector);
996
+ TextFormat::Parser::ParserImpl* parser_;
997
+ };
998
+
999
+ io::ErrorCollector* error_collector_;
1000
+ TextFormat::Finder* finder_;
1001
+ ParseInfoTree* parse_info_tree_;
1002
+ ParserErrorCollector tokenizer_error_collector_;
1003
+ io::Tokenizer tokenizer_;
1004
+ const Descriptor* root_message_type_;
1005
+ SingularOverwritePolicy singular_overwrite_policy_;
1006
+ const bool allow_case_insensitive_field_;
1007
+ const bool allow_unknown_field_;
1008
+ const bool allow_unknown_enum_;
1009
+ const bool allow_field_number_;
1010
+ bool had_errors_;
1011
+ };
1012
+
1013
+ #undef DO
1014
+
1015
+ // ===========================================================================
1016
+ // Internal class for writing text to the io::ZeroCopyOutputStream. Adapted
1017
+ // from the Printer found in //google/protobuf/io/printer.h
1018
+ class TextFormat::Printer::TextGenerator {
1019
+ public:
1020
+ explicit TextGenerator(io::ZeroCopyOutputStream* output,
1021
+ int initial_indent_level)
1022
+ : output_(output),
1023
+ buffer_(NULL),
1024
+ buffer_size_(0),
1025
+ at_start_of_line_(true),
1026
+ failed_(false),
1027
+ indent_(""),
1028
+ initial_indent_level_(initial_indent_level) {
1029
+ indent_.resize(initial_indent_level_ * 2, ' ');
1030
+ }
1031
+
1032
+ ~TextGenerator() {
1033
+ // Only BackUp() if we're sure we've successfully called Next() at least
1034
+ // once.
1035
+ if (!failed_ && buffer_size_ > 0) {
1036
+ output_->BackUp(buffer_size_);
1037
+ }
1038
+ }
1039
+
1040
+ // Indent text by two spaces. After calling Indent(), two spaces will be
1041
+ // inserted at the beginning of each line of text. Indent() may be called
1042
+ // multiple times to produce deeper indents.
1043
+ void Indent() {
1044
+ indent_ += " ";
1045
+ }
1046
+
1047
+ // Reduces the current indent level by two spaces, or crashes if the indent
1048
+ // level is zero.
1049
+ void Outdent() {
1050
+ if (indent_.empty() ||
1051
+ indent_.size() < initial_indent_level_ * 2) {
1052
+ GOOGLE_LOG(DFATAL) << " Outdent() without matching Indent().";
1053
+ return;
1054
+ }
1055
+
1056
+ indent_.resize(indent_.size() - 2);
1057
+ }
1058
+
1059
+ // Print text to the output stream.
1060
+ void Print(const string& str) {
1061
+ Print(str.data(), str.size());
1062
+ }
1063
+
1064
+ // Print text to the output stream.
1065
+ void Print(const char* text) {
1066
+ Print(text, strlen(text));
1067
+ }
1068
+
1069
+ // Print text to the output stream.
1070
+ void Print(const char* text, int size) {
1071
+ int pos = 0; // The number of bytes we've written so far.
1072
+
1073
+ for (int i = 0; i < size; i++) {
1074
+ if (text[i] == '\n') {
1075
+ // Saw newline. If there is more text, we may need to insert an indent
1076
+ // here. So, write what we have so far, including the '\n'.
1077
+ Write(text + pos, i - pos + 1);
1078
+ pos = i + 1;
1079
+
1080
+ // Setting this true will cause the next Write() to insert an indent
1081
+ // first.
1082
+ at_start_of_line_ = true;
1083
+ }
1084
+ }
1085
+
1086
+ // Write the rest.
1087
+ Write(text + pos, size - pos);
1088
+ }
1089
+
1090
+ // True if any write to the underlying stream failed. (We don't just
1091
+ // crash in this case because this is an I/O failure, not a programming
1092
+ // error.)
1093
+ bool failed() const { return failed_; }
1094
+
1095
+ private:
1096
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextGenerator);
1097
+
1098
+ void Write(const char* data, int size) {
1099
+ if (failed_) return;
1100
+ if (size == 0) return;
1101
+
1102
+ if (at_start_of_line_) {
1103
+ // Insert an indent.
1104
+ at_start_of_line_ = false;
1105
+ Write(indent_.data(), indent_.size());
1106
+ if (failed_) return;
1107
+ }
1108
+
1109
+ while (size > buffer_size_) {
1110
+ // Data exceeds space in the buffer. Copy what we can and request a
1111
+ // new buffer.
1112
+ memcpy(buffer_, data, buffer_size_);
1113
+ data += buffer_size_;
1114
+ size -= buffer_size_;
1115
+ void* void_buffer;
1116
+ failed_ = !output_->Next(&void_buffer, &buffer_size_);
1117
+ if (failed_) return;
1118
+ buffer_ = reinterpret_cast<char*>(void_buffer);
1119
+ }
1120
+
1121
+ // Buffer is big enough to receive the data; copy it.
1122
+ memcpy(buffer_, data, size);
1123
+ buffer_ += size;
1124
+ buffer_size_ -= size;
1125
+ }
1126
+
1127
+ io::ZeroCopyOutputStream* const output_;
1128
+ char* buffer_;
1129
+ int buffer_size_;
1130
+ bool at_start_of_line_;
1131
+ bool failed_;
1132
+
1133
+ string indent_;
1134
+ int initial_indent_level_;
1135
+ };
1136
+
1137
+ // ===========================================================================
1138
+
1139
+ TextFormat::Finder::~Finder() {
1140
+ }
1141
+
1142
+ TextFormat::Parser::Parser()
1143
+ : error_collector_(NULL),
1144
+ finder_(NULL),
1145
+ parse_info_tree_(NULL),
1146
+ allow_partial_(false),
1147
+ allow_case_insensitive_field_(false),
1148
+ allow_unknown_field_(false),
1149
+ allow_unknown_enum_(false),
1150
+ allow_field_number_(false),
1151
+ allow_relaxed_whitespace_(false),
1152
+ allow_singular_overwrites_(false) {
1153
+ }
1154
+
1155
+ TextFormat::Parser::~Parser() {}
1156
+
1157
+ bool TextFormat::Parser::Parse(io::ZeroCopyInputStream* input,
1158
+ Message* output) {
1159
+ output->Clear();
1160
+
1161
+ ParserImpl::SingularOverwritePolicy overwrites_policy =
1162
+ allow_singular_overwrites_
1163
+ ? ParserImpl::ALLOW_SINGULAR_OVERWRITES
1164
+ : ParserImpl::FORBID_SINGULAR_OVERWRITES;
1165
+
1166
+ ParserImpl parser(output->GetDescriptor(), input, error_collector_,
1167
+ finder_, parse_info_tree_,
1168
+ overwrites_policy,
1169
+ allow_case_insensitive_field_, allow_unknown_field_,
1170
+ allow_unknown_enum_, allow_field_number_,
1171
+ allow_relaxed_whitespace_);
1172
+ return MergeUsingImpl(input, output, &parser);
1173
+ }
1174
+
1175
+ bool TextFormat::Parser::ParseFromString(const string& input,
1176
+ Message* output) {
1177
+ io::ArrayInputStream input_stream(input.data(), input.size());
1178
+ return Parse(&input_stream, output);
1179
+ }
1180
+
1181
+ bool TextFormat::Parser::Merge(io::ZeroCopyInputStream* input,
1182
+ Message* output) {
1183
+ ParserImpl parser(output->GetDescriptor(), input, error_collector_,
1184
+ finder_, parse_info_tree_,
1185
+ ParserImpl::ALLOW_SINGULAR_OVERWRITES,
1186
+ allow_case_insensitive_field_, allow_unknown_field_,
1187
+ allow_unknown_enum_, allow_field_number_,
1188
+ allow_relaxed_whitespace_);
1189
+ return MergeUsingImpl(input, output, &parser);
1190
+ }
1191
+
1192
+ bool TextFormat::Parser::MergeFromString(const string& input,
1193
+ Message* output) {
1194
+ io::ArrayInputStream input_stream(input.data(), input.size());
1195
+ return Merge(&input_stream, output);
1196
+ }
1197
+
1198
+ bool TextFormat::Parser::MergeUsingImpl(io::ZeroCopyInputStream* /* input */,
1199
+ Message* output,
1200
+ ParserImpl* parser_impl) {
1201
+ if (!parser_impl->Parse(output)) return false;
1202
+ if (!allow_partial_ && !output->IsInitialized()) {
1203
+ vector<string> missing_fields;
1204
+ output->FindInitializationErrors(&missing_fields);
1205
+ parser_impl->ReportError(-1, 0, "Message missing required fields: " +
1206
+ Join(missing_fields, ", "));
1207
+ return false;
1208
+ }
1209
+ return true;
1210
+ }
1211
+
1212
+ bool TextFormat::Parser::ParseFieldValueFromString(
1213
+ const string& input,
1214
+ const FieldDescriptor* field,
1215
+ Message* output) {
1216
+ io::ArrayInputStream input_stream(input.data(), input.size());
1217
+ ParserImpl parser(output->GetDescriptor(), &input_stream, error_collector_,
1218
+ finder_, parse_info_tree_,
1219
+ ParserImpl::ALLOW_SINGULAR_OVERWRITES,
1220
+ allow_case_insensitive_field_, allow_unknown_field_,
1221
+ allow_unknown_enum_, allow_field_number_,
1222
+ allow_relaxed_whitespace_);
1223
+ return parser.ParseField(field, output);
1224
+ }
1225
+
1226
+ /* static */ bool TextFormat::Parse(io::ZeroCopyInputStream* input,
1227
+ Message* output) {
1228
+ return Parser().Parse(input, output);
1229
+ }
1230
+
1231
+ /* static */ bool TextFormat::Merge(io::ZeroCopyInputStream* input,
1232
+ Message* output) {
1233
+ return Parser().Merge(input, output);
1234
+ }
1235
+
1236
+ /* static */ bool TextFormat::ParseFromString(const string& input,
1237
+ Message* output) {
1238
+ return Parser().ParseFromString(input, output);
1239
+ }
1240
+
1241
+ /* static */ bool TextFormat::MergeFromString(const string& input,
1242
+ Message* output) {
1243
+ return Parser().MergeFromString(input, output);
1244
+ }
1245
+
1246
+ // ===========================================================================
1247
+
1248
+ // The default implementation for FieldValuePrinter. The base class just
1249
+ // does simple formatting. That way, deriving classes could decide to fallback
1250
+ // to that behavior.
1251
+ TextFormat::FieldValuePrinter::FieldValuePrinter() {}
1252
+ TextFormat::FieldValuePrinter::~FieldValuePrinter() {}
1253
+ string TextFormat::FieldValuePrinter::PrintBool(bool val) const {
1254
+ return val ? "true" : "false";
1255
+ }
1256
+ string TextFormat::FieldValuePrinter::PrintInt32(int32 val) const {
1257
+ return SimpleItoa(val);
1258
+ }
1259
+ string TextFormat::FieldValuePrinter::PrintUInt32(uint32 val) const {
1260
+ return SimpleItoa(val);
1261
+ }
1262
+ string TextFormat::FieldValuePrinter::PrintInt64(int64 val) const {
1263
+ return SimpleItoa(val);
1264
+ }
1265
+ string TextFormat::FieldValuePrinter::PrintUInt64(uint64 val) const {
1266
+ return SimpleItoa(val);
1267
+ }
1268
+ string TextFormat::FieldValuePrinter::PrintFloat(float val) const {
1269
+ return SimpleFtoa(val);
1270
+ }
1271
+ string TextFormat::FieldValuePrinter::PrintDouble(double val) const {
1272
+ return SimpleDtoa(val);
1273
+ }
1274
+ string TextFormat::FieldValuePrinter::PrintString(const string& val) const {
1275
+ return StrCat("\"", CEscape(val), "\"");
1276
+ }
1277
+ string TextFormat::FieldValuePrinter::PrintBytes(const string& val) const {
1278
+ return PrintString(val);
1279
+ }
1280
+ string TextFormat::FieldValuePrinter::PrintEnum(int32 val,
1281
+ const string& name) const {
1282
+ return name;
1283
+ }
1284
+ string TextFormat::FieldValuePrinter::PrintFieldName(
1285
+ const Message& message,
1286
+ const Reflection* reflection,
1287
+ const FieldDescriptor* field) const {
1288
+ if (field->is_extension()) {
1289
+ // We special-case MessageSet elements for compatibility with proto1.
1290
+ if (field->containing_type()->options().message_set_wire_format()
1291
+ && field->type() == FieldDescriptor::TYPE_MESSAGE
1292
+ && field->is_optional()
1293
+ && field->extension_scope() == field->message_type()) {
1294
+ return StrCat("[", field->message_type()->full_name(), "]");
1295
+ } else {
1296
+ return StrCat("[", field->full_name(), "]");
1297
+ }
1298
+ } else if (field->type() == FieldDescriptor::TYPE_GROUP) {
1299
+ // Groups must be serialized with their original capitalization.
1300
+ return field->message_type()->name();
1301
+ } else {
1302
+ return field->name();
1303
+ }
1304
+ }
1305
+ string TextFormat::FieldValuePrinter::PrintMessageStart(
1306
+ const Message& message,
1307
+ int field_index,
1308
+ int field_count,
1309
+ bool single_line_mode) const {
1310
+ return single_line_mode ? " { " : " {\n";
1311
+ }
1312
+ string TextFormat::FieldValuePrinter::PrintMessageEnd(
1313
+ const Message& message,
1314
+ int field_index,
1315
+ int field_count,
1316
+ bool single_line_mode) const {
1317
+ return single_line_mode ? "} " : "}\n";
1318
+ }
1319
+
1320
+ namespace {
1321
+ // Our own specialization: for UTF8 escaped strings.
1322
+ class FieldValuePrinterUtf8Escaping : public TextFormat::FieldValuePrinter {
1323
+ public:
1324
+ virtual string PrintString(const string& val) const {
1325
+ return StrCat("\"", strings::Utf8SafeCEscape(val), "\"");
1326
+ }
1327
+ virtual string PrintBytes(const string& val) const {
1328
+ return TextFormat::FieldValuePrinter::PrintString(val);
1329
+ }
1330
+ };
1331
+
1332
+ } // namespace
1333
+
1334
+ TextFormat::Printer::Printer()
1335
+ : initial_indent_level_(0),
1336
+ single_line_mode_(false),
1337
+ use_field_number_(false),
1338
+ use_short_repeated_primitives_(false),
1339
+ hide_unknown_fields_(false),
1340
+ print_message_fields_in_index_order_(false) {
1341
+ SetUseUtf8StringEscaping(false);
1342
+ }
1343
+
1344
+ TextFormat::Printer::~Printer() {
1345
+ STLDeleteValues(&custom_printers_);
1346
+ }
1347
+
1348
+ void TextFormat::Printer::SetUseUtf8StringEscaping(bool as_utf8) {
1349
+ SetDefaultFieldValuePrinter(as_utf8
1350
+ ? new FieldValuePrinterUtf8Escaping()
1351
+ : new FieldValuePrinter());
1352
+ }
1353
+
1354
+ void TextFormat::Printer::SetDefaultFieldValuePrinter(
1355
+ const FieldValuePrinter* printer) {
1356
+ default_field_value_printer_.reset(printer);
1357
+ }
1358
+
1359
+ bool TextFormat::Printer::RegisterFieldValuePrinter(
1360
+ const FieldDescriptor* field,
1361
+ const FieldValuePrinter* printer) {
1362
+ return field != NULL
1363
+ && printer != NULL
1364
+ && custom_printers_.insert(make_pair(field, printer)).second;
1365
+ }
1366
+
1367
+ bool TextFormat::Printer::PrintToString(const Message& message,
1368
+ string* output) const {
1369
+ GOOGLE_DCHECK(output) << "output specified is NULL";
1370
+
1371
+ output->clear();
1372
+ io::StringOutputStream output_stream(output);
1373
+
1374
+ return Print(message, &output_stream);
1375
+ }
1376
+
1377
+ bool TextFormat::Printer::PrintUnknownFieldsToString(
1378
+ const UnknownFieldSet& unknown_fields,
1379
+ string* output) const {
1380
+ GOOGLE_DCHECK(output) << "output specified is NULL";
1381
+
1382
+ output->clear();
1383
+ io::StringOutputStream output_stream(output);
1384
+ return PrintUnknownFields(unknown_fields, &output_stream);
1385
+ }
1386
+
1387
+ bool TextFormat::Printer::Print(const Message& message,
1388
+ io::ZeroCopyOutputStream* output) const {
1389
+ TextGenerator generator(output, initial_indent_level_);
1390
+
1391
+ Print(message, generator);
1392
+
1393
+ // Output false if the generator failed internally.
1394
+ return !generator.failed();
1395
+ }
1396
+
1397
+ bool TextFormat::Printer::PrintUnknownFields(
1398
+ const UnknownFieldSet& unknown_fields,
1399
+ io::ZeroCopyOutputStream* output) const {
1400
+ TextGenerator generator(output, initial_indent_level_);
1401
+
1402
+ PrintUnknownFields(unknown_fields, generator);
1403
+
1404
+ // Output false if the generator failed internally.
1405
+ return !generator.failed();
1406
+ }
1407
+
1408
+ namespace {
1409
+ // Comparison functor for sorting FieldDescriptors by field index.
1410
+ struct FieldIndexSorter {
1411
+ bool operator()(const FieldDescriptor* left,
1412
+ const FieldDescriptor* right) const {
1413
+ return left->index() < right->index();
1414
+ }
1415
+ };
1416
+ } // namespace
1417
+
1418
+ void TextFormat::Printer::Print(const Message& message,
1419
+ TextGenerator& generator) const {
1420
+ const Reflection* reflection = message.GetReflection();
1421
+ vector<const FieldDescriptor*> fields;
1422
+ reflection->ListFields(message, &fields);
1423
+ if (print_message_fields_in_index_order_) {
1424
+ sort(fields.begin(), fields.end(), FieldIndexSorter());
1425
+ }
1426
+ for (int i = 0; i < fields.size(); i++) {
1427
+ PrintField(message, reflection, fields[i], generator);
1428
+ }
1429
+ if (!hide_unknown_fields_) {
1430
+ PrintUnknownFields(reflection->GetUnknownFields(message), generator);
1431
+ }
1432
+ }
1433
+
1434
+ void TextFormat::Printer::PrintFieldValueToString(
1435
+ const Message& message,
1436
+ const FieldDescriptor* field,
1437
+ int index,
1438
+ string* output) const {
1439
+
1440
+ GOOGLE_DCHECK(output) << "output specified is NULL";
1441
+
1442
+ output->clear();
1443
+ io::StringOutputStream output_stream(output);
1444
+ TextGenerator generator(&output_stream, initial_indent_level_);
1445
+
1446
+ PrintFieldValue(message, message.GetReflection(), field, index, generator);
1447
+ }
1448
+
1449
+ void TextFormat::Printer::PrintField(const Message& message,
1450
+ const Reflection* reflection,
1451
+ const FieldDescriptor* field,
1452
+ TextGenerator& generator) const {
1453
+ if (use_short_repeated_primitives_ &&
1454
+ field->is_repeated() &&
1455
+ field->cpp_type() != FieldDescriptor::CPPTYPE_STRING &&
1456
+ field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {
1457
+ PrintShortRepeatedField(message, reflection, field, generator);
1458
+ return;
1459
+ }
1460
+
1461
+ int count = 0;
1462
+
1463
+ if (field->is_repeated()) {
1464
+ count = reflection->FieldSize(message, field);
1465
+ } else if (reflection->HasField(message, field)) {
1466
+ count = 1;
1467
+ }
1468
+
1469
+ for (int j = 0; j < count; ++j) {
1470
+ const int field_index = field->is_repeated() ? j : -1;
1471
+
1472
+ PrintFieldName(message, reflection, field, generator);
1473
+
1474
+ if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
1475
+ const FieldValuePrinter* printer = FindWithDefault(
1476
+ custom_printers_, field, default_field_value_printer_.get());
1477
+ const Message& sub_message =
1478
+ field->is_repeated()
1479
+ ? reflection->GetRepeatedMessage(message, field, j)
1480
+ : reflection->GetMessage(message, field);
1481
+ generator.Print(
1482
+ printer->PrintMessageStart(
1483
+ sub_message, field_index, count, single_line_mode_));
1484
+ generator.Indent();
1485
+ Print(sub_message, generator);
1486
+ generator.Outdent();
1487
+ generator.Print(
1488
+ printer->PrintMessageEnd(
1489
+ sub_message, field_index, count, single_line_mode_));
1490
+ } else {
1491
+ generator.Print(": ");
1492
+ // Write the field value.
1493
+ PrintFieldValue(message, reflection, field, field_index, generator);
1494
+ if (single_line_mode_) {
1495
+ generator.Print(" ");
1496
+ } else {
1497
+ generator.Print("\n");
1498
+ }
1499
+ }
1500
+ }
1501
+ }
1502
+
1503
+ void TextFormat::Printer::PrintShortRepeatedField(
1504
+ const Message& message,
1505
+ const Reflection* reflection,
1506
+ const FieldDescriptor* field,
1507
+ TextGenerator& generator) const {
1508
+ // Print primitive repeated field in short form.
1509
+ PrintFieldName(message, reflection, field, generator);
1510
+
1511
+ int size = reflection->FieldSize(message, field);
1512
+ generator.Print(": [");
1513
+ for (int i = 0; i < size; i++) {
1514
+ if (i > 0) generator.Print(", ");
1515
+ PrintFieldValue(message, reflection, field, i, generator);
1516
+ }
1517
+ if (single_line_mode_) {
1518
+ generator.Print("] ");
1519
+ } else {
1520
+ generator.Print("]\n");
1521
+ }
1522
+ }
1523
+
1524
+ void TextFormat::Printer::PrintFieldName(const Message& message,
1525
+ const Reflection* reflection,
1526
+ const FieldDescriptor* field,
1527
+ TextGenerator& generator) const {
1528
+ // if use_field_number_ is true, prints field number instead
1529
+ // of field name.
1530
+ if (use_field_number_) {
1531
+ generator.Print(SimpleItoa(field->number()));
1532
+ return;
1533
+ }
1534
+
1535
+ const FieldValuePrinter* printer = FindWithDefault(
1536
+ custom_printers_, field, default_field_value_printer_.get());
1537
+ generator.Print(printer->PrintFieldName(message, reflection, field));
1538
+ }
1539
+
1540
+ void TextFormat::Printer::PrintFieldValue(
1541
+ const Message& message,
1542
+ const Reflection* reflection,
1543
+ const FieldDescriptor* field,
1544
+ int index,
1545
+ TextGenerator& generator) const {
1546
+ GOOGLE_DCHECK(field->is_repeated() || (index == -1))
1547
+ << "Index must be -1 for non-repeated fields";
1548
+
1549
+ const FieldValuePrinter* printer
1550
+ = FindWithDefault(custom_printers_, field,
1551
+ default_field_value_printer_.get());
1552
+
1553
+ switch (field->cpp_type()) {
1554
+ #define OUTPUT_FIELD(CPPTYPE, METHOD) \
1555
+ case FieldDescriptor::CPPTYPE_##CPPTYPE: \
1556
+ generator.Print(printer->Print##METHOD(field->is_repeated() \
1557
+ ? reflection->GetRepeated##METHOD(message, field, index) \
1558
+ : reflection->Get##METHOD(message, field))); \
1559
+ break
1560
+
1561
+ OUTPUT_FIELD( INT32, Int32);
1562
+ OUTPUT_FIELD( INT64, Int64);
1563
+ OUTPUT_FIELD(UINT32, UInt32);
1564
+ OUTPUT_FIELD(UINT64, UInt64);
1565
+ OUTPUT_FIELD( FLOAT, Float);
1566
+ OUTPUT_FIELD(DOUBLE, Double);
1567
+ OUTPUT_FIELD( BOOL, Bool);
1568
+ #undef OUTPUT_FIELD
1569
+
1570
+ case FieldDescriptor::CPPTYPE_STRING: {
1571
+ string scratch;
1572
+ const string& value = field->is_repeated()
1573
+ ? reflection->GetRepeatedStringReference(
1574
+ message, field, index, &scratch)
1575
+ : reflection->GetStringReference(message, field, &scratch);
1576
+ if (field->type() == FieldDescriptor::TYPE_STRING) {
1577
+ generator.Print(printer->PrintString(value));
1578
+ } else {
1579
+ GOOGLE_DCHECK_EQ(field->type(), FieldDescriptor::TYPE_BYTES);
1580
+ generator.Print(printer->PrintBytes(value));
1581
+ }
1582
+ break;
1583
+ }
1584
+
1585
+ case FieldDescriptor::CPPTYPE_ENUM: {
1586
+ const EnumValueDescriptor *enum_val = field->is_repeated()
1587
+ ? reflection->GetRepeatedEnum(message, field, index)
1588
+ : reflection->GetEnum(message, field);
1589
+ generator.Print(printer->PrintEnum(enum_val->number(), enum_val->name()));
1590
+ break;
1591
+ }
1592
+
1593
+ case FieldDescriptor::CPPTYPE_MESSAGE:
1594
+ Print(field->is_repeated()
1595
+ ? reflection->GetRepeatedMessage(message, field, index)
1596
+ : reflection->GetMessage(message, field),
1597
+ generator);
1598
+ break;
1599
+ }
1600
+ }
1601
+
1602
+ /* static */ bool TextFormat::Print(const Message& message,
1603
+ io::ZeroCopyOutputStream* output) {
1604
+ return Printer().Print(message, output);
1605
+ }
1606
+
1607
+ /* static */ bool TextFormat::PrintUnknownFields(
1608
+ const UnknownFieldSet& unknown_fields,
1609
+ io::ZeroCopyOutputStream* output) {
1610
+ return Printer().PrintUnknownFields(unknown_fields, output);
1611
+ }
1612
+
1613
+ /* static */ bool TextFormat::PrintToString(
1614
+ const Message& message, string* output) {
1615
+ return Printer().PrintToString(message, output);
1616
+ }
1617
+
1618
+ /* static */ bool TextFormat::PrintUnknownFieldsToString(
1619
+ const UnknownFieldSet& unknown_fields, string* output) {
1620
+ return Printer().PrintUnknownFieldsToString(unknown_fields, output);
1621
+ }
1622
+
1623
+ /* static */ void TextFormat::PrintFieldValueToString(
1624
+ const Message& message,
1625
+ const FieldDescriptor* field,
1626
+ int index,
1627
+ string* output) {
1628
+ return Printer().PrintFieldValueToString(message, field, index, output);
1629
+ }
1630
+
1631
+ /* static */ bool TextFormat::ParseFieldValueFromString(
1632
+ const string& input,
1633
+ const FieldDescriptor* field,
1634
+ Message* message) {
1635
+ return Parser().ParseFieldValueFromString(input, field, message);
1636
+ }
1637
+
1638
+ // Prints an integer as hex with a fixed number of digits dependent on the
1639
+ // integer type.
1640
+ template<typename IntType>
1641
+ static string PaddedHex(IntType value) {
1642
+ string result;
1643
+ result.reserve(sizeof(value) * 2);
1644
+ for (int i = sizeof(value) * 2 - 1; i >= 0; i--) {
1645
+ result.push_back(int_to_hex_digit(value >> (i*4) & 0x0F));
1646
+ }
1647
+ return result;
1648
+ }
1649
+
1650
+ void TextFormat::Printer::PrintUnknownFields(
1651
+ const UnknownFieldSet& unknown_fields, TextGenerator& generator) const {
1652
+ for (int i = 0; i < unknown_fields.field_count(); i++) {
1653
+ const UnknownField& field = unknown_fields.field(i);
1654
+ string field_number = SimpleItoa(field.number());
1655
+
1656
+ switch (field.type()) {
1657
+ case UnknownField::TYPE_VARINT:
1658
+ generator.Print(field_number);
1659
+ generator.Print(": ");
1660
+ generator.Print(SimpleItoa(field.varint()));
1661
+ if (single_line_mode_) {
1662
+ generator.Print(" ");
1663
+ } else {
1664
+ generator.Print("\n");
1665
+ }
1666
+ break;
1667
+ case UnknownField::TYPE_FIXED32: {
1668
+ generator.Print(field_number);
1669
+ generator.Print(": 0x");
1670
+ char buffer[kFastToBufferSize];
1671
+ generator.Print(FastHex32ToBuffer(field.fixed32(), buffer));
1672
+ if (single_line_mode_) {
1673
+ generator.Print(" ");
1674
+ } else {
1675
+ generator.Print("\n");
1676
+ }
1677
+ break;
1678
+ }
1679
+ case UnknownField::TYPE_FIXED64: {
1680
+ generator.Print(field_number);
1681
+ generator.Print(": 0x");
1682
+ char buffer[kFastToBufferSize];
1683
+ generator.Print(FastHex64ToBuffer(field.fixed64(), buffer));
1684
+ if (single_line_mode_) {
1685
+ generator.Print(" ");
1686
+ } else {
1687
+ generator.Print("\n");
1688
+ }
1689
+ break;
1690
+ }
1691
+ case UnknownField::TYPE_LENGTH_DELIMITED: {
1692
+ generator.Print(field_number);
1693
+ const string& value = field.length_delimited();
1694
+ UnknownFieldSet embedded_unknown_fields;
1695
+ if (!value.empty() && embedded_unknown_fields.ParseFromString(value)) {
1696
+ // This field is parseable as a Message.
1697
+ // So it is probably an embedded message.
1698
+ if (single_line_mode_) {
1699
+ generator.Print(" { ");
1700
+ } else {
1701
+ generator.Print(" {\n");
1702
+ generator.Indent();
1703
+ }
1704
+ PrintUnknownFields(embedded_unknown_fields, generator);
1705
+ if (single_line_mode_) {
1706
+ generator.Print("} ");
1707
+ } else {
1708
+ generator.Outdent();
1709
+ generator.Print("}\n");
1710
+ }
1711
+ } else {
1712
+ // This field is not parseable as a Message.
1713
+ // So it is probably just a plain string.
1714
+ generator.Print(": \"");
1715
+ generator.Print(CEscape(value));
1716
+ generator.Print("\"");
1717
+ if (single_line_mode_) {
1718
+ generator.Print(" ");
1719
+ } else {
1720
+ generator.Print("\n");
1721
+ }
1722
+ }
1723
+ break;
1724
+ }
1725
+ case UnknownField::TYPE_GROUP:
1726
+ generator.Print(field_number);
1727
+ if (single_line_mode_) {
1728
+ generator.Print(" { ");
1729
+ } else {
1730
+ generator.Print(" {\n");
1731
+ generator.Indent();
1732
+ }
1733
+ PrintUnknownFields(field.group(), generator);
1734
+ if (single_line_mode_) {
1735
+ generator.Print("} ");
1736
+ } else {
1737
+ generator.Outdent();
1738
+ generator.Print("}\n");
1739
+ }
1740
+ break;
1741
+ }
1742
+ }
1743
+ }
1744
+
1745
+ } // namespace protobuf
1746
+ } // namespace google