protobuf 1.4.2 → 2.0.0.rc1

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 (198) hide show
  1. data/.gitignore +4 -0
  2. data/Rakefile +7 -7
  3. data/bin/rpc_server +2 -188
  4. data/bin/rprotoc +44 -38
  5. data/examples/addressbook.pb.rb +2 -2
  6. data/ext/Makefile +11 -0
  7. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/code_generator.h +142 -0
  8. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/command_line_interface.h +318 -0
  9. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum.h +99 -0
  10. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum_field.h +103 -0
  11. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_extension.h +85 -0
  12. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_field.h +167 -0
  13. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_file.h +98 -0
  14. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
  15. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_helpers.h +159 -0
  16. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message.h +170 -0
  17. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message_field.h +102 -0
  18. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +103 -0
  19. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
  20. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_string_field.h +104 -0
  21. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h +2721 -0
  22. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/importer.h +303 -0
  23. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum.h +84 -0
  24. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum_field.h +121 -0
  25. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_extension.h +77 -0
  26. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_field.h +108 -0
  27. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_file.h +101 -0
  28. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_generator.h +72 -0
  29. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_helpers.h +213 -0
  30. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message.h +109 -0
  31. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message_field.h +134 -0
  32. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_primitive_field.h +121 -0
  33. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_service.h +113 -0
  34. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_string_field.h +120 -0
  35. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/mock_code_generator.h +113 -0
  36. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/package_info.h +64 -0
  37. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/parser.h +434 -0
  38. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.h +73 -0
  39. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.pb.h +790 -0
  40. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/python/python_generator.h +156 -0
  41. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/subprocess.h +108 -0
  42. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/zip_writer.h +93 -0
  43. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.h +1367 -0
  44. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.pb.h +5223 -0
  45. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor_database.h +366 -0
  46. data/ext/protobuf-2.4.1/src/google/protobuf/dynamic_message.h +136 -0
  47. data/ext/protobuf-2.4.1/src/google/protobuf/extension_set.h +904 -0
  48. data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_reflection.h +424 -0
  49. data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_util.h +82 -0
  50. data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream.h +1102 -0
  51. data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream_inl.h +64 -0
  52. data/ext/protobuf-2.4.1/src/google/protobuf/io/gzip_stream.h +207 -0
  53. data/ext/protobuf-2.4.1/src/google/protobuf/io/package_info.h +54 -0
  54. data/ext/protobuf-2.4.1/src/google/protobuf/io/printer.h +136 -0
  55. data/ext/protobuf-2.4.1/src/google/protobuf/io/tokenizer.h +313 -0
  56. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream.h +238 -0
  57. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl.h +357 -0
  58. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl_lite.h +340 -0
  59. data/ext/protobuf-2.4.1/src/google/protobuf/message.h +692 -0
  60. data/ext/protobuf-2.4.1/src/google/protobuf/message_lite.h +239 -0
  61. data/ext/protobuf-2.4.1/src/google/protobuf/package_info.h +64 -0
  62. data/ext/protobuf-2.4.1/src/google/protobuf/reflection_ops.h +80 -0
  63. data/ext/protobuf-2.4.1/src/google/protobuf/repeated_field.h +1295 -0
  64. data/ext/protobuf-2.4.1/src/google/protobuf/service.h +291 -0
  65. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/common.h +1211 -0
  66. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/hash.h +220 -0
  67. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/map-util.h +119 -0
  68. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/once.h +123 -0
  69. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/stl_util-inl.h +121 -0
  70. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/strutil.h +457 -0
  71. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/substitute.h +170 -0
  72. data/ext/protobuf-2.4.1/src/google/protobuf/test_util.h +174 -0
  73. data/ext/protobuf-2.4.1/src/google/protobuf/test_util_lite.h +101 -0
  74. data/ext/protobuf-2.4.1/src/google/protobuf/testing/file.h +83 -0
  75. data/ext/protobuf-2.4.1/src/google/protobuf/testing/googletest.h +98 -0
  76. data/ext/protobuf-2.4.1/src/google/protobuf/text_format.h +285 -0
  77. data/ext/protobuf-2.4.1/src/google/protobuf/unittest.pb.h +11915 -0
  78. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_custom_options.pb.h +2895 -0
  79. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_embed_optimize_for.pb.h +211 -0
  80. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_empty.pb.h +56 -0
  81. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import.pb.h +188 -0
  82. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import_lite.pb.h +151 -0
  83. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite.pb.h +4752 -0
  84. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite_imports_nonlite.pb.h +150 -0
  85. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_mset.pb.h +816 -0
  86. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_no_generic_services.pb.h +197 -0
  87. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_optimize_for.pb.h +403 -0
  88. data/ext/protobuf-2.4.1/src/google/protobuf/unknown_field_set.h +268 -0
  89. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format.h +304 -0
  90. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite.h +620 -0
  91. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite_inl.h +774 -0
  92. data/ext/ruby_generator/RubyGenerator.cpp +435 -0
  93. data/ext/ruby_generator/RubyGenerator.h +180 -0
  94. data/ext/ruby_generator/extconf.rb +24 -0
  95. data/lib/protobuf.rb +55 -33
  96. data/lib/protobuf/cli.rb +176 -0
  97. data/lib/protobuf/common/logger.rb +11 -11
  98. data/lib/protobuf/{message/enum.rb → enum.rb} +0 -10
  99. data/lib/protobuf/evented.rb +22 -0
  100. data/lib/protobuf/field.rb +57 -0
  101. data/lib/protobuf/field/base_field.rb +210 -0
  102. data/lib/protobuf/field/bool_field.rb +24 -0
  103. data/lib/protobuf/field/bytes_field.rb +38 -0
  104. data/lib/protobuf/field/double_field.rb +19 -0
  105. data/lib/protobuf/field/enum_field.rb +58 -0
  106. data/lib/protobuf/field/extension_fields.rb +24 -0
  107. data/lib/protobuf/field/field_array.rb +55 -0
  108. data/lib/protobuf/field/fixed32_field.rb +19 -0
  109. data/lib/protobuf/field/fixed64_field.rb +22 -0
  110. data/lib/protobuf/field/float_field.rb +29 -0
  111. data/lib/protobuf/field/int32_field.rb +10 -0
  112. data/lib/protobuf/field/int64_field.rb +10 -0
  113. data/lib/protobuf/field/integer_field.rb +19 -0
  114. data/lib/protobuf/field/message_field.rb +51 -0
  115. data/lib/protobuf/field/sfixed32_field.rb +21 -0
  116. data/lib/protobuf/field/sfixed64_field.rb +24 -0
  117. data/lib/protobuf/field/signed_integer_field.rb +23 -0
  118. data/lib/protobuf/field/sint32_field.rb +10 -0
  119. data/lib/protobuf/field/sint64_field.rb +10 -0
  120. data/lib/protobuf/field/string_field.rb +14 -0
  121. data/lib/protobuf/field/uint32_field.rb +10 -0
  122. data/lib/protobuf/field/uint64_field.rb +10 -0
  123. data/lib/protobuf/field/varint_field.rb +63 -0
  124. data/lib/protobuf/message.rb +376 -0
  125. data/lib/protobuf/message/message.rb +1 -475
  126. data/lib/protobuf/rpc/buffer.rb +1 -1
  127. data/lib/protobuf/rpc/client.rb +26 -26
  128. data/lib/protobuf/rpc/connector.rb +15 -14
  129. data/lib/protobuf/rpc/connectors/eventmachine.rb +13 -13
  130. data/lib/protobuf/rpc/rpc.pb.rb +39 -28
  131. data/lib/protobuf/rpc/server.rb +7 -28
  132. data/lib/protobuf/rpc/servers/evented_runner.rb +15 -15
  133. data/lib/protobuf/rpc/servers/socket/server.rb +2 -1
  134. data/lib/protobuf/rpc/servers/socket_runner.rb +5 -6
  135. data/lib/protobuf/rpc/servers/zmq_runner.rb +4 -5
  136. data/lib/protobuf/socket.rb +22 -0
  137. data/lib/protobuf/version.rb +2 -1
  138. data/lib/protobuf/zmq.rb +21 -0
  139. data/proto/rpc.pb.rb +48 -0
  140. data/protobuf.gemspec +14 -6
  141. data/spec/benchmark/tasks.rb +42 -23
  142. data/spec/functional/evented_server_spec.rb +2 -0
  143. data/spec/functional/socket_server_spec.rb +22 -26
  144. data/spec/functional/zmq_server_spec.rb +22 -26
  145. data/spec/lib/protobuf/cli_spec.rb +182 -0
  146. data/spec/{unit → lib/protobuf}/common/logger_spec.rb +0 -0
  147. data/spec/{unit → lib/protobuf/message}/enum_spec.rb +0 -0
  148. data/spec/{unit → lib/protobuf/message}/message_spec.rb +0 -0
  149. data/spec/{unit → lib/protobuf}/rpc/client_spec.rb +6 -4
  150. data/spec/lib/protobuf/rpc/connector_spec.rb +41 -0
  151. data/spec/{unit → lib/protobuf}/rpc/connectors/base_spec.rb +18 -18
  152. data/spec/{unit → lib/protobuf}/rpc/connectors/common_spec.rb +20 -20
  153. data/spec/{unit → lib/protobuf}/rpc/connectors/socket_spec.rb +9 -8
  154. data/spec/{unit → lib/protobuf}/rpc/connectors/zmq_spec.rb +1 -1
  155. data/spec/{unit → lib/protobuf}/rpc/servers/evented_server_spec.rb +4 -4
  156. data/spec/{unit → lib/protobuf}/rpc/servers/socket_server_spec.rb +11 -23
  157. data/spec/{unit → lib/protobuf}/rpc/servers/zmq/broker_spec.rb +5 -0
  158. data/spec/{unit → lib/protobuf}/rpc/servers/zmq/server_spec.rb +5 -0
  159. data/spec/{unit → lib/protobuf}/rpc/servers/zmq/util_spec.rb +5 -0
  160. data/spec/{unit → lib/protobuf}/rpc/servers/zmq/worker_spec.rb +5 -0
  161. data/spec/{unit → lib/protobuf}/rpc/service_spec.rb +0 -0
  162. data/spec/proto/test.pb.rb +48 -25
  163. data/spec/spec_helper.rb +9 -15
  164. data/spec/support/all.rb +7 -0
  165. data/spec/{helper → support}/server.rb +5 -7
  166. data/spec/{helper → support}/silent_constants.rb +4 -0
  167. data/spec/support/test_app_file.rb +2 -0
  168. data/spec/{helper → support}/tolerance_matcher.rb +0 -0
  169. data/test/proto/types.pb.rb +1 -1
  170. data/test/test_addressbook.rb +1 -1
  171. data/test/test_enum_value.rb +1 -1
  172. data/test/test_standard_message.rb +1 -1
  173. metadata +243 -107
  174. data/lib/protobuf/common/util.rb +0 -59
  175. data/lib/protobuf/compiler/compiler.rb +0 -52
  176. data/lib/protobuf/compiler/nodes.rb +0 -323
  177. data/lib/protobuf/compiler/proto.y +0 -216
  178. data/lib/protobuf/compiler/proto2.ebnf +0 -79
  179. data/lib/protobuf/compiler/proto_parser.rb +0 -1425
  180. data/lib/protobuf/compiler/template/rpc_service_implementation.erb +0 -42
  181. data/lib/protobuf/compiler/visitors.rb +0 -282
  182. data/lib/protobuf/descriptor/descriptor.proto +0 -286
  183. data/lib/protobuf/descriptor/descriptor.rb +0 -55
  184. data/lib/protobuf/descriptor/descriptor_builder.rb +0 -143
  185. data/lib/protobuf/descriptor/descriptor_proto.rb +0 -138
  186. data/lib/protobuf/descriptor/enum_descriptor.rb +0 -33
  187. data/lib/protobuf/descriptor/field_descriptor.rb +0 -49
  188. data/lib/protobuf/descriptor/file_descriptor.rb +0 -37
  189. data/lib/protobuf/message/field.rb +0 -684
  190. data/lib/protobuf/message/protoable.rb +0 -38
  191. data/spec/helper/all.rb +0 -7
  192. data/spec/unit/common/util_spec.rb +0 -17
  193. data/spec/unit/rpc/connector_spec.rb +0 -31
  194. data/spec/unit/rpc/connectors/eventmachine_client_spec.rb +0 -32
  195. data/spec/unit/rpc/connectors/eventmachine_spec.rb +0 -0
  196. data/test/check_unbuild.rb +0 -30
  197. data/test/test_compiler.rb +0 -325
  198. data/test/test_descriptor.rb +0 -122
@@ -0,0 +1,313 @@
1
+ // Protocol Buffers - Google's data interchange format
2
+ // Copyright 2008 Google Inc. All rights reserved.
3
+ // http://code.google.com/p/protobuf/
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: kenton@google.com (Kenton Varda)
32
+ // Based on original Protocol Buffers design by
33
+ // Sanjay Ghemawat, Jeff Dean, and others.
34
+ //
35
+ // Class for parsing tokenized text from a ZeroCopyInputStream.
36
+
37
+ #ifndef GOOGLE_PROTOBUF_IO_TOKENIZER_H__
38
+ #define GOOGLE_PROTOBUF_IO_TOKENIZER_H__
39
+
40
+ #include <string>
41
+ #include <google/protobuf/stubs/common.h>
42
+
43
+ namespace google {
44
+ namespace protobuf {
45
+ namespace io {
46
+
47
+ class ZeroCopyInputStream; // zero_copy_stream.h
48
+
49
+ // Defined in this file.
50
+ class ErrorCollector;
51
+ class Tokenizer;
52
+
53
+ // Abstract interface for an object which collects the errors that occur
54
+ // during parsing. A typical implementation might simply print the errors
55
+ // to stdout.
56
+ class LIBPROTOBUF_EXPORT ErrorCollector {
57
+ public:
58
+ inline ErrorCollector() {}
59
+ virtual ~ErrorCollector();
60
+
61
+ // Indicates that there was an error in the input at the given line and
62
+ // column numbers. The numbers are zero-based, so you may want to add
63
+ // 1 to each before printing them.
64
+ virtual void AddError(int line, int column, const string& message) = 0;
65
+
66
+ // Indicates that there was a warning in the input at the given line and
67
+ // column numbers. The numbers are zero-based, so you may want to add
68
+ // 1 to each before printing them.
69
+ virtual void AddWarning(int line, int column, const string& message) { }
70
+
71
+ private:
72
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector);
73
+ };
74
+
75
+ // This class converts a stream of raw text into a stream of tokens for
76
+ // the protocol definition parser to parse. The tokens recognized are
77
+ // similar to those that make up the C language; see the TokenType enum for
78
+ // precise descriptions. Whitespace and comments are skipped. By default,
79
+ // C- and C++-style comments are recognized, but other styles can be used by
80
+ // calling set_comment_style().
81
+ class LIBPROTOBUF_EXPORT Tokenizer {
82
+ public:
83
+ // Construct a Tokenizer that reads and tokenizes text from the given
84
+ // input stream and writes errors to the given error_collector.
85
+ // The caller keeps ownership of input and error_collector.
86
+ Tokenizer(ZeroCopyInputStream* input, ErrorCollector* error_collector);
87
+ ~Tokenizer();
88
+
89
+ enum TokenType {
90
+ TYPE_START, // Next() has not yet been called.
91
+ TYPE_END, // End of input reached. "text" is empty.
92
+
93
+ TYPE_IDENTIFIER, // A sequence of letters, digits, and underscores, not
94
+ // starting with a digit. It is an error for a number
95
+ // to be followed by an identifier with no space in
96
+ // between.
97
+ TYPE_INTEGER, // A sequence of digits representing an integer. Normally
98
+ // the digits are decimal, but a prefix of "0x" indicates
99
+ // a hex number and a leading zero indicates octal, just
100
+ // like with C numeric literals. A leading negative sign
101
+ // is NOT included in the token; it's up to the parser to
102
+ // interpret the unary minus operator on its own.
103
+ TYPE_FLOAT, // A floating point literal, with a fractional part and/or
104
+ // an exponent. Always in decimal. Again, never
105
+ // negative.
106
+ TYPE_STRING, // A quoted sequence of escaped characters. Either single
107
+ // or double quotes can be used, but they must match.
108
+ // A string literal cannot cross a line break.
109
+ TYPE_SYMBOL, // Any other printable character, like '!' or '+'.
110
+ // Symbols are always a single character, so "!+$%" is
111
+ // four tokens.
112
+ };
113
+
114
+ // Structure representing a token read from the token stream.
115
+ struct Token {
116
+ TokenType type;
117
+ string text; // The exact text of the token as it appeared in
118
+ // the input. e.g. tokens of TYPE_STRING will still
119
+ // be escaped and in quotes.
120
+
121
+ // "line" and "column" specify the position of the first character of
122
+ // the token within the input stream. They are zero-based.
123
+ int line;
124
+ int column;
125
+ int end_column;
126
+ };
127
+
128
+ // Get the current token. This is updated when Next() is called. Before
129
+ // the first call to Next(), current() has type TYPE_START and no contents.
130
+ const Token& current();
131
+
132
+ // Return the previous token -- i.e. what current() returned before the
133
+ // previous call to Next().
134
+ const Token& previous();
135
+
136
+ // Advance to the next token. Returns false if the end of the input is
137
+ // reached.
138
+ bool Next();
139
+
140
+ // Parse helpers ---------------------------------------------------
141
+
142
+ // Parses a TYPE_FLOAT token. This never fails, so long as the text actually
143
+ // comes from a TYPE_FLOAT token parsed by Tokenizer. If it doesn't, the
144
+ // result is undefined (possibly an assert failure).
145
+ static double ParseFloat(const string& text);
146
+
147
+ // Parses a TYPE_STRING token. This never fails, so long as the text actually
148
+ // comes from a TYPE_STRING token parsed by Tokenizer. If it doesn't, the
149
+ // result is undefined (possibly an assert failure).
150
+ static void ParseString(const string& text, string* output);
151
+
152
+ // Identical to ParseString, but appends to output.
153
+ static void ParseStringAppend(const string& text, string* output);
154
+
155
+ // Parses a TYPE_INTEGER token. Returns false if the result would be
156
+ // greater than max_value. Otherwise, returns true and sets *output to the
157
+ // result. If the text is not from a Token of type TYPE_INTEGER originally
158
+ // parsed by a Tokenizer, the result is undefined (possibly an assert
159
+ // failure).
160
+ static bool ParseInteger(const string& text, uint64 max_value,
161
+ uint64* output);
162
+
163
+ // Options ---------------------------------------------------------
164
+
165
+ // Set true to allow floats to be suffixed with the letter 'f'. Tokens
166
+ // which would otherwise be integers but which have the 'f' suffix will be
167
+ // forced to be interpreted as floats. For all other purposes, the 'f' is
168
+ // ignored.
169
+ void set_allow_f_after_float(bool value) { allow_f_after_float_ = value; }
170
+
171
+ // Valid values for set_comment_style().
172
+ enum CommentStyle {
173
+ // Line comments begin with "//", block comments are delimited by "/*" and
174
+ // "*/".
175
+ CPP_COMMENT_STYLE,
176
+ // Line comments begin with "#". No way to write block comments.
177
+ SH_COMMENT_STYLE
178
+ };
179
+
180
+ // Sets the comment style.
181
+ void set_comment_style(CommentStyle style) { comment_style_ = style; }
182
+
183
+ // -----------------------------------------------------------------
184
+ private:
185
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Tokenizer);
186
+
187
+ Token current_; // Returned by current().
188
+ Token previous_; // Returned by previous().
189
+
190
+ ZeroCopyInputStream* input_;
191
+ ErrorCollector* error_collector_;
192
+
193
+ char current_char_; // == buffer_[buffer_pos_], updated by NextChar().
194
+ const char* buffer_; // Current buffer returned from input_.
195
+ int buffer_size_; // Size of buffer_.
196
+ int buffer_pos_; // Current position within the buffer.
197
+ bool read_error_; // Did we previously encounter a read error?
198
+
199
+ // Line and column number of current_char_ within the whole input stream.
200
+ int line_;
201
+ int column_;
202
+
203
+ // Position in buffer_ where StartToken() was called. If the token
204
+ // started in the previous buffer, this is zero, and current_.text already
205
+ // contains the part of the token from the previous buffer. If not
206
+ // currently parsing a token, this is -1.
207
+ int token_start_;
208
+
209
+ // Options.
210
+ bool allow_f_after_float_;
211
+ CommentStyle comment_style_;
212
+
213
+ // Since we count columns we need to interpret tabs somehow. We'll take
214
+ // the standard 8-character definition for lack of any way to do better.
215
+ static const int kTabWidth = 8;
216
+
217
+ // -----------------------------------------------------------------
218
+ // Helper methods.
219
+
220
+ // Consume this character and advance to the next one.
221
+ void NextChar();
222
+
223
+ // Read a new buffer from the input.
224
+ void Refresh();
225
+
226
+ // Called when the current character is the first character of a new
227
+ // token (not including whitespace or comments).
228
+ inline void StartToken();
229
+ // Called when the current character is the first character after the
230
+ // end of the last token. After this returns, current_.text will
231
+ // contain all text consumed since StartToken() was called.
232
+ inline void EndToken();
233
+
234
+ // Convenience method to add an error at the current line and column.
235
+ void AddError(const string& message) {
236
+ error_collector_->AddError(line_, column_, message);
237
+ }
238
+
239
+ // -----------------------------------------------------------------
240
+ // The following four methods are used to consume tokens of specific
241
+ // types. They are actually used to consume all characters *after*
242
+ // the first, since the calling function consumes the first character
243
+ // in order to decide what kind of token is being read.
244
+
245
+ // Read and consume a string, ending when the given delimiter is
246
+ // consumed.
247
+ void ConsumeString(char delimiter);
248
+
249
+ // Read and consume a number, returning TYPE_FLOAT or TYPE_INTEGER
250
+ // depending on what was read. This needs to know if the first
251
+ // character was a zero in order to correctly recognize hex and octal
252
+ // numbers.
253
+ // It also needs to know if the first characted was a . to parse floating
254
+ // point correctly.
255
+ TokenType ConsumeNumber(bool started_with_zero, bool started_with_dot);
256
+
257
+ // Consume the rest of a line.
258
+ void ConsumeLineComment();
259
+ // Consume until "*/".
260
+ void ConsumeBlockComment();
261
+
262
+ // -----------------------------------------------------------------
263
+ // These helper methods make the parsing code more readable. The
264
+ // "character classes" refered to are defined at the top of the .cc file.
265
+ // Basically it is a C++ class with one method:
266
+ // static bool InClass(char c);
267
+ // The method returns true if c is a member of this "class", like "Letter"
268
+ // or "Digit".
269
+
270
+ // Returns true if the current character is of the given character
271
+ // class, but does not consume anything.
272
+ template<typename CharacterClass>
273
+ inline bool LookingAt();
274
+
275
+ // If the current character is in the given class, consume it and return
276
+ // true. Otherwise return false.
277
+ // e.g. TryConsumeOne<Letter>()
278
+ template<typename CharacterClass>
279
+ inline bool TryConsumeOne();
280
+
281
+ // Like above, but try to consume the specific character indicated.
282
+ inline bool TryConsume(char c);
283
+
284
+ // Consume zero or more of the given character class.
285
+ template<typename CharacterClass>
286
+ inline void ConsumeZeroOrMore();
287
+
288
+ // Consume one or more of the given character class or log the given
289
+ // error message.
290
+ // e.g. ConsumeOneOrMore<Digit>("Expected digits.");
291
+ template<typename CharacterClass>
292
+ inline void ConsumeOneOrMore(const char* error);
293
+ };
294
+
295
+ // inline methods ====================================================
296
+ inline const Tokenizer::Token& Tokenizer::current() {
297
+ return current_;
298
+ }
299
+
300
+ inline const Tokenizer::Token& Tokenizer::previous() {
301
+ return previous_;
302
+ }
303
+
304
+ inline void Tokenizer::ParseString(const string& text, string* output) {
305
+ output->clear();
306
+ ParseStringAppend(text, output);
307
+ }
308
+
309
+ } // namespace io
310
+ } // namespace protobuf
311
+
312
+ } // namespace google
313
+ #endif // GOOGLE_PROTOBUF_IO_TOKENIZER_H__
@@ -0,0 +1,238 @@
1
+ // Protocol Buffers - Google's data interchange format
2
+ // Copyright 2008 Google Inc. All rights reserved.
3
+ // http://code.google.com/p/protobuf/
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: kenton@google.com (Kenton Varda)
32
+ // Based on original Protocol Buffers design by
33
+ // Sanjay Ghemawat, Jeff Dean, and others.
34
+ //
35
+ // This file contains the ZeroCopyInputStream and ZeroCopyOutputStream
36
+ // interfaces, which represent abstract I/O streams to and from which
37
+ // protocol buffers can be read and written. For a few simple
38
+ // implementations of these interfaces, see zero_copy_stream_impl.h.
39
+ //
40
+ // These interfaces are different from classic I/O streams in that they
41
+ // try to minimize the amount of data copying that needs to be done.
42
+ // To accomplish this, responsibility for allocating buffers is moved to
43
+ // the stream object, rather than being the responsibility of the caller.
44
+ // So, the stream can return a buffer which actually points directly into
45
+ // the final data structure where the bytes are to be stored, and the caller
46
+ // can interact directly with that buffer, eliminating an intermediate copy
47
+ // operation.
48
+ //
49
+ // As an example, consider the common case in which you are reading bytes
50
+ // from an array that is already in memory (or perhaps an mmap()ed file).
51
+ // With classic I/O streams, you would do something like:
52
+ // char buffer[BUFFER_SIZE];
53
+ // input->Read(buffer, BUFFER_SIZE);
54
+ // DoSomething(buffer, BUFFER_SIZE);
55
+ // Then, the stream basically just calls memcpy() to copy the data from
56
+ // the array into your buffer. With a ZeroCopyInputStream, you would do
57
+ // this instead:
58
+ // const void* buffer;
59
+ // int size;
60
+ // input->Next(&buffer, &size);
61
+ // DoSomething(buffer, size);
62
+ // Here, no copy is performed. The input stream returns a pointer directly
63
+ // into the backing array, and the caller ends up reading directly from it.
64
+ //
65
+ // If you want to be able to read the old-fashion way, you can create
66
+ // a CodedInputStream or CodedOutputStream wrapping these objects and use
67
+ // their ReadRaw()/WriteRaw() methods. These will, of course, add a copy
68
+ // step, but Coded*Stream will handle buffering so at least it will be
69
+ // reasonably efficient.
70
+ //
71
+ // ZeroCopyInputStream example:
72
+ // // Read in a file and print its contents to stdout.
73
+ // int fd = open("myfile", O_RDONLY);
74
+ // ZeroCopyInputStream* input = new FileInputStream(fd);
75
+ //
76
+ // const void* buffer;
77
+ // int size;
78
+ // while (input->Next(&buffer, &size)) {
79
+ // cout.write(buffer, size);
80
+ // }
81
+ //
82
+ // delete input;
83
+ // close(fd);
84
+ //
85
+ // ZeroCopyOutputStream example:
86
+ // // Copy the contents of "infile" to "outfile", using plain read() for
87
+ // // "infile" but a ZeroCopyOutputStream for "outfile".
88
+ // int infd = open("infile", O_RDONLY);
89
+ // int outfd = open("outfile", O_WRONLY);
90
+ // ZeroCopyOutputStream* output = new FileOutputStream(outfd);
91
+ //
92
+ // void* buffer;
93
+ // int size;
94
+ // while (output->Next(&buffer, &size)) {
95
+ // int bytes = read(infd, buffer, size);
96
+ // if (bytes < size) {
97
+ // // Reached EOF.
98
+ // output->BackUp(size - bytes);
99
+ // break;
100
+ // }
101
+ // }
102
+ //
103
+ // delete output;
104
+ // close(infd);
105
+ // close(outfd);
106
+
107
+ #ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__
108
+ #define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__
109
+
110
+ #include <string>
111
+ #include <google/protobuf/stubs/common.h>
112
+
113
+ namespace google {
114
+
115
+ namespace protobuf {
116
+ namespace io {
117
+
118
+ // Defined in this file.
119
+ class ZeroCopyInputStream;
120
+ class ZeroCopyOutputStream;
121
+
122
+ // Abstract interface similar to an input stream but designed to minimize
123
+ // copying.
124
+ class LIBPROTOBUF_EXPORT ZeroCopyInputStream {
125
+ public:
126
+ inline ZeroCopyInputStream() {}
127
+ virtual ~ZeroCopyInputStream();
128
+
129
+ // Obtains a chunk of data from the stream.
130
+ //
131
+ // Preconditions:
132
+ // * "size" and "data" are not NULL.
133
+ //
134
+ // Postconditions:
135
+ // * If the returned value is false, there is no more data to return or
136
+ // an error occurred. All errors are permanent.
137
+ // * Otherwise, "size" points to the actual number of bytes read and "data"
138
+ // points to a pointer to a buffer containing these bytes.
139
+ // * Ownership of this buffer remains with the stream, and the buffer
140
+ // remains valid only until some other method of the stream is called
141
+ // or the stream is destroyed.
142
+ // * It is legal for the returned buffer to have zero size, as long
143
+ // as repeatedly calling Next() eventually yields a buffer with non-zero
144
+ // size.
145
+ virtual bool Next(const void** data, int* size) = 0;
146
+
147
+ // Backs up a number of bytes, so that the next call to Next() returns
148
+ // data again that was already returned by the last call to Next(). This
149
+ // is useful when writing procedures that are only supposed to read up
150
+ // to a certain point in the input, then return. If Next() returns a
151
+ // buffer that goes beyond what you wanted to read, you can use BackUp()
152
+ // to return to the point where you intended to finish.
153
+ //
154
+ // Preconditions:
155
+ // * The last method called must have been Next().
156
+ // * count must be less than or equal to the size of the last buffer
157
+ // returned by Next().
158
+ //
159
+ // Postconditions:
160
+ // * The last "count" bytes of the last buffer returned by Next() will be
161
+ // pushed back into the stream. Subsequent calls to Next() will return
162
+ // the same data again before producing new data.
163
+ virtual void BackUp(int count) = 0;
164
+
165
+ // Skips a number of bytes. Returns false if the end of the stream is
166
+ // reached or some input error occurred. In the end-of-stream case, the
167
+ // stream is advanced to the end of the stream (so ByteCount() will return
168
+ // the total size of the stream).
169
+ virtual bool Skip(int count) = 0;
170
+
171
+ // Returns the total number of bytes read since this object was created.
172
+ virtual int64 ByteCount() const = 0;
173
+
174
+
175
+ private:
176
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ZeroCopyInputStream);
177
+ };
178
+
179
+ // Abstract interface similar to an output stream but designed to minimize
180
+ // copying.
181
+ class LIBPROTOBUF_EXPORT ZeroCopyOutputStream {
182
+ public:
183
+ inline ZeroCopyOutputStream() {}
184
+ virtual ~ZeroCopyOutputStream();
185
+
186
+ // Obtains a buffer into which data can be written. Any data written
187
+ // into this buffer will eventually (maybe instantly, maybe later on)
188
+ // be written to the output.
189
+ //
190
+ // Preconditions:
191
+ // * "size" and "data" are not NULL.
192
+ //
193
+ // Postconditions:
194
+ // * If the returned value is false, an error occurred. All errors are
195
+ // permanent.
196
+ // * Otherwise, "size" points to the actual number of bytes in the buffer
197
+ // and "data" points to the buffer.
198
+ // * Ownership of this buffer remains with the stream, and the buffer
199
+ // remains valid only until some other method of the stream is called
200
+ // or the stream is destroyed.
201
+ // * Any data which the caller stores in this buffer will eventually be
202
+ // written to the output (unless BackUp() is called).
203
+ // * It is legal for the returned buffer to have zero size, as long
204
+ // as repeatedly calling Next() eventually yields a buffer with non-zero
205
+ // size.
206
+ virtual bool Next(void** data, int* size) = 0;
207
+
208
+ // Backs up a number of bytes, so that the end of the last buffer returned
209
+ // by Next() is not actually written. This is needed when you finish
210
+ // writing all the data you want to write, but the last buffer was bigger
211
+ // than you needed. You don't want to write a bunch of garbage after the
212
+ // end of your data, so you use BackUp() to back up.
213
+ //
214
+ // Preconditions:
215
+ // * The last method called must have been Next().
216
+ // * count must be less than or equal to the size of the last buffer
217
+ // returned by Next().
218
+ // * The caller must not have written anything to the last "count" bytes
219
+ // of that buffer.
220
+ //
221
+ // Postconditions:
222
+ // * The last "count" bytes of the last buffer returned by Next() will be
223
+ // ignored.
224
+ virtual void BackUp(int count) = 0;
225
+
226
+ // Returns the total number of bytes written since this object was created.
227
+ virtual int64 ByteCount() const = 0;
228
+
229
+
230
+ private:
231
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ZeroCopyOutputStream);
232
+ };
233
+
234
+ } // namespace io
235
+ } // namespace protobuf
236
+
237
+ } // namespace google
238
+ #endif // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__