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.
- data/.gitignore +4 -0
- data/Rakefile +7 -7
- data/bin/rpc_server +2 -188
- data/bin/rprotoc +44 -38
- data/examples/addressbook.pb.rb +2 -2
- data/ext/Makefile +11 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/code_generator.h +142 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/command_line_interface.h +318 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum.h +99 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum_field.h +103 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_extension.h +85 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_field.h +167 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_file.h +98 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_helpers.h +159 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message.h +170 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message_field.h +102 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +103 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_string_field.h +104 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h +2721 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/importer.h +303 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum.h +84 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum_field.h +121 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_extension.h +77 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_field.h +108 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_file.h +101 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_generator.h +72 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_helpers.h +213 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message.h +109 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message_field.h +134 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_primitive_field.h +121 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_service.h +113 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_string_field.h +120 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/mock_code_generator.h +113 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/package_info.h +64 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/parser.h +434 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.h +73 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.pb.h +790 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/python/python_generator.h +156 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/subprocess.h +108 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/zip_writer.h +93 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.h +1367 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.pb.h +5223 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/descriptor_database.h +366 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/dynamic_message.h +136 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/extension_set.h +904 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_reflection.h +424 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_util.h +82 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream.h +1102 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream_inl.h +64 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/gzip_stream.h +207 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/package_info.h +54 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/printer.h +136 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/tokenizer.h +313 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream.h +238 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl.h +357 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl_lite.h +340 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/message.h +692 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/message_lite.h +239 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/package_info.h +64 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/reflection_ops.h +80 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/repeated_field.h +1295 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/service.h +291 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/common.h +1211 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/hash.h +220 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/map-util.h +119 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/once.h +123 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/stl_util-inl.h +121 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/strutil.h +457 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/substitute.h +170 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/test_util.h +174 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/test_util_lite.h +101 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/testing/file.h +83 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/testing/googletest.h +98 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/text_format.h +285 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest.pb.h +11915 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_custom_options.pb.h +2895 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_embed_optimize_for.pb.h +211 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_empty.pb.h +56 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import.pb.h +188 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import_lite.pb.h +151 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite.pb.h +4752 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite_imports_nonlite.pb.h +150 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_mset.pb.h +816 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_no_generic_services.pb.h +197 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_optimize_for.pb.h +403 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unknown_field_set.h +268 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/wire_format.h +304 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite.h +620 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite_inl.h +774 -0
- data/ext/ruby_generator/RubyGenerator.cpp +435 -0
- data/ext/ruby_generator/RubyGenerator.h +180 -0
- data/ext/ruby_generator/extconf.rb +24 -0
- data/lib/protobuf.rb +55 -33
- data/lib/protobuf/cli.rb +176 -0
- data/lib/protobuf/common/logger.rb +11 -11
- data/lib/protobuf/{message/enum.rb → enum.rb} +0 -10
- data/lib/protobuf/evented.rb +22 -0
- data/lib/protobuf/field.rb +57 -0
- data/lib/protobuf/field/base_field.rb +210 -0
- data/lib/protobuf/field/bool_field.rb +24 -0
- data/lib/protobuf/field/bytes_field.rb +38 -0
- data/lib/protobuf/field/double_field.rb +19 -0
- data/lib/protobuf/field/enum_field.rb +58 -0
- data/lib/protobuf/field/extension_fields.rb +24 -0
- data/lib/protobuf/field/field_array.rb +55 -0
- data/lib/protobuf/field/fixed32_field.rb +19 -0
- data/lib/protobuf/field/fixed64_field.rb +22 -0
- data/lib/protobuf/field/float_field.rb +29 -0
- data/lib/protobuf/field/int32_field.rb +10 -0
- data/lib/protobuf/field/int64_field.rb +10 -0
- data/lib/protobuf/field/integer_field.rb +19 -0
- data/lib/protobuf/field/message_field.rb +51 -0
- data/lib/protobuf/field/sfixed32_field.rb +21 -0
- data/lib/protobuf/field/sfixed64_field.rb +24 -0
- data/lib/protobuf/field/signed_integer_field.rb +23 -0
- data/lib/protobuf/field/sint32_field.rb +10 -0
- data/lib/protobuf/field/sint64_field.rb +10 -0
- data/lib/protobuf/field/string_field.rb +14 -0
- data/lib/protobuf/field/uint32_field.rb +10 -0
- data/lib/protobuf/field/uint64_field.rb +10 -0
- data/lib/protobuf/field/varint_field.rb +63 -0
- data/lib/protobuf/message.rb +376 -0
- data/lib/protobuf/message/message.rb +1 -475
- data/lib/protobuf/rpc/buffer.rb +1 -1
- data/lib/protobuf/rpc/client.rb +26 -26
- data/lib/protobuf/rpc/connector.rb +15 -14
- data/lib/protobuf/rpc/connectors/eventmachine.rb +13 -13
- data/lib/protobuf/rpc/rpc.pb.rb +39 -28
- data/lib/protobuf/rpc/server.rb +7 -28
- data/lib/protobuf/rpc/servers/evented_runner.rb +15 -15
- data/lib/protobuf/rpc/servers/socket/server.rb +2 -1
- data/lib/protobuf/rpc/servers/socket_runner.rb +5 -6
- data/lib/protobuf/rpc/servers/zmq_runner.rb +4 -5
- data/lib/protobuf/socket.rb +22 -0
- data/lib/protobuf/version.rb +2 -1
- data/lib/protobuf/zmq.rb +21 -0
- data/proto/rpc.pb.rb +48 -0
- data/protobuf.gemspec +14 -6
- data/spec/benchmark/tasks.rb +42 -23
- data/spec/functional/evented_server_spec.rb +2 -0
- data/spec/functional/socket_server_spec.rb +22 -26
- data/spec/functional/zmq_server_spec.rb +22 -26
- data/spec/lib/protobuf/cli_spec.rb +182 -0
- data/spec/{unit → lib/protobuf}/common/logger_spec.rb +0 -0
- data/spec/{unit → lib/protobuf/message}/enum_spec.rb +0 -0
- data/spec/{unit → lib/protobuf/message}/message_spec.rb +0 -0
- data/spec/{unit → lib/protobuf}/rpc/client_spec.rb +6 -4
- data/spec/lib/protobuf/rpc/connector_spec.rb +41 -0
- data/spec/{unit → lib/protobuf}/rpc/connectors/base_spec.rb +18 -18
- data/spec/{unit → lib/protobuf}/rpc/connectors/common_spec.rb +20 -20
- data/spec/{unit → lib/protobuf}/rpc/connectors/socket_spec.rb +9 -8
- data/spec/{unit → lib/protobuf}/rpc/connectors/zmq_spec.rb +1 -1
- data/spec/{unit → lib/protobuf}/rpc/servers/evented_server_spec.rb +4 -4
- data/spec/{unit → lib/protobuf}/rpc/servers/socket_server_spec.rb +11 -23
- data/spec/{unit → lib/protobuf}/rpc/servers/zmq/broker_spec.rb +5 -0
- data/spec/{unit → lib/protobuf}/rpc/servers/zmq/server_spec.rb +5 -0
- data/spec/{unit → lib/protobuf}/rpc/servers/zmq/util_spec.rb +5 -0
- data/spec/{unit → lib/protobuf}/rpc/servers/zmq/worker_spec.rb +5 -0
- data/spec/{unit → lib/protobuf}/rpc/service_spec.rb +0 -0
- data/spec/proto/test.pb.rb +48 -25
- data/spec/spec_helper.rb +9 -15
- data/spec/support/all.rb +7 -0
- data/spec/{helper → support}/server.rb +5 -7
- data/spec/{helper → support}/silent_constants.rb +4 -0
- data/spec/support/test_app_file.rb +2 -0
- data/spec/{helper → support}/tolerance_matcher.rb +0 -0
- data/test/proto/types.pb.rb +1 -1
- data/test/test_addressbook.rb +1 -1
- data/test/test_enum_value.rb +1 -1
- data/test/test_standard_message.rb +1 -1
- metadata +243 -107
- data/lib/protobuf/common/util.rb +0 -59
- data/lib/protobuf/compiler/compiler.rb +0 -52
- data/lib/protobuf/compiler/nodes.rb +0 -323
- data/lib/protobuf/compiler/proto.y +0 -216
- data/lib/protobuf/compiler/proto2.ebnf +0 -79
- data/lib/protobuf/compiler/proto_parser.rb +0 -1425
- data/lib/protobuf/compiler/template/rpc_service_implementation.erb +0 -42
- data/lib/protobuf/compiler/visitors.rb +0 -282
- data/lib/protobuf/descriptor/descriptor.proto +0 -286
- data/lib/protobuf/descriptor/descriptor.rb +0 -55
- data/lib/protobuf/descriptor/descriptor_builder.rb +0 -143
- data/lib/protobuf/descriptor/descriptor_proto.rb +0 -138
- data/lib/protobuf/descriptor/enum_descriptor.rb +0 -33
- data/lib/protobuf/descriptor/field_descriptor.rb +0 -49
- data/lib/protobuf/descriptor/file_descriptor.rb +0 -37
- data/lib/protobuf/message/field.rb +0 -684
- data/lib/protobuf/message/protoable.rb +0 -38
- data/spec/helper/all.rb +0 -7
- data/spec/unit/common/util_spec.rb +0 -17
- data/spec/unit/rpc/connector_spec.rb +0 -31
- data/spec/unit/rpc/connectors/eventmachine_client_spec.rb +0 -32
- data/spec/unit/rpc/connectors/eventmachine_spec.rb +0 -0
- data/test/check_unbuild.rb +0 -30
- data/test/test_compiler.rb +0 -325
- 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__
|