protoc 2.6.1.1 → 2.6.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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